您需要处理来自 XMPP 连接的 VCard 事件和响应:
private void vcardToolStripMenuItem_Click(object sender, EventArgs e)
{
RosterNode node = rosterControl.SelectedItem();
if (node != null)
{
frmVcard f = new frmVcard(node.RosterItem.Jid, XmppCon);
f.Show();
}
}
以上来自 AGSMMPP 下载的 miniclient 解决方案示例。请注意,当用户为用户请求 VCARD 时会发生这种情况。但是,您可以随时发起该请求。
private void VcardResult(object sender, IQ iq, object data)
{
if (InvokeRequired)
{
// Windows Forms are not Thread Safe, we need to invoke this :(
// We're not in the UI thread, so we need to call BeginInvoke
BeginInvoke(new IqCB(VcardResult), new object[] { sender, iq, data });
return;
}
if (iq.Type == IqType.result)
{
Vcard vcard = iq.Vcard;
if (vcard!=null)
{
txtFullname.Text = vcard.Fullname;
txtNickname.Text = vcard.Nickname;
txtBirthday.Text = vcard.Birthday.ToString();
txtDescription.Text = vcard.Description;
Photo photo = vcard.Photo;
if (photo != null)
picPhoto.Image = vcard.Photo.Image;
}
}
}
当有人从 XMPP 请求 VCARD 信息并且 IQ 类型与正确的数据匹配时,就会发生这种情况。然后,您可以从中拉出照片vcard.Photo
。
您可以通过以下方式触发拉动:
VcardIq viq = new VcardIq(IqType.get, new Jid(jid.Bare));
con.IqGrabber.SendIq(viq, new IqCB(VcardResult), null);
第一行是对 XMPP 服务器的请求,VCARD 表单使用它来请求用户信息。
那里的第二行设置了另一个抓取器(各种回调),表单用来等待信息到达,然后解析出必要的信息。在这种情况下,抓取器采用新形式,因此主应用程序不必担心解析该信息。
您可以通过将 AGSCMPP zip 文件解压缩到本地驱动器并查看 Samples\VS2008\miniclient 文件夹来查看整个源代码。