Как получить чей-то аватар / фото с 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 ответа
Вам нужно обработать события VCard и ответы от XMPP-соединения:
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;
}
}
}
Это то, что происходит, когда кто-то запрашивает информацию VCARD из XMPP, а тип IQ совпадает с правильными данными. Затем вы можете вытянуть фото из vcard.Photo
,
Вы запускаете тягу с помощью:
VcardIq viq = new VcardIq(IqType.get, new Jid(jid.Bare));
con.IqGrabber.SendIq(viq, new IqCB(VcardResult), null);
Первая строка - это запрос к XMPP-серверу, который форма VCARD использует для запроса информации о пользователе.
Во второй строке указывается другой граббер (своего рода обратный вызов), который используется формой для ожидания поступления информации, а затем для анализа необходимой информации. В этом случае граббер находится в новой форме, так что основному приложению не нужно беспокоиться о разборе этой информации.
Вы можете просмотреть весь исходный код, распаковав zip-файл AGSXMPP на свой локальный диск и просмотрев папку Samples\VS2008\miniclient.
Вы можете нажать на ссылку:http://forum.ag-software.de/thread/192-How-to-save-vcard-data