如何使用agsXmpp检索某人的头像/照片

时间:2011-06-19 14:48:07

标签: hash photo avatar agsxmpp

这是我到目前为止所做的:

void xmppConnection_OnReadXml(object sender, string xml)
    {
        if (xml.Contains(XmlTags.PhotoOpen))
        {
            int startIndex = xml.IndexOf(XmlTags.PhotoOpen) + XmlTags.PhotoOpen.Length;
            int length = xml.IndexOf(XmlTags.PhotoClose) - startIndex;
            string photoHash = xml.Substring(startIndex, length);
        }
    }

我想我无法撤消哈希,但我想获得一个人的头像/照片。我如何实现这一目标?

2 个答案:

答案 0 :(得分:4)

您需要处理来自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();
        }
    }

以上内容来自AGSXMPP下载的微型解决方案示例。请注意,当用户为用户请求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表单用于请求用户信息。

那里的第二行设置另一个抓取器(各种回调),表单用来等待信息到达,然后解析出必要的信息。在这种情况下,抓取器采用新的形式,因此主应用程序不必担心解析该信息。

您可以通过将AGSXMPP zip文件解压缩到本地驱动器并查看Samples \ VS2008 \ miniclient文件夹来查看整个源代码。

答案 1 :(得分:0)

您可以点击链接:http://forum.ag-software.de/thread/192-How-to-save-vcard-data