Привет
openfire+LDAP+miranda
Если я у контакта удаляю аватар(в AD), то в миранде он остается. Сама про себя миранда говорит, что все ок, аватар есть. Другим рассылает presence с хешем. При обновлении своего или другого(такого же, с удаленным аватаром) с сервера показывает старый аватар.
При этом в логе видно, что в пришедшем с сервера VCARD аватар пустой:
<PHOTO>
<TYPE>image/jpeg</TYPE>
<BINVAL></BINVAL>
</PHOTO>
Если у контакта никогда не было аватара, то все ок - у него его и нет.
Долго я трассировал это дело и нашел подходящее место.
trunk/protocols/JabberG/src/jabber_iqid.cpp:
В методе CJabberProto::OnIqResultGetVcard заводим локальный флаг hasPhoto = false -
вотпотом
вызываем метод OnIqResultGetVcardPhoto и передаем ему ссылку на hasPhoto, если метод находит фотку в VCard, то hasPhoto он устанавливает в TRUE, в противном случае - не меняет.
И... все, этот флаг больше не обрабатывается в теле функции.
При этом я смотрю все остальные hasXXXX обрабатываются - если FALSE, то соответсвующие значения удаляются из базы.
Есть мнение, что тут недоработка.
Поэтому я вот
в это место вставил такой код:
if (!hasPhoto) {
debugLogA("Has no avatar");
delSetting(hContact, "AvatarHash");
if (ptrT(getTStringA(hContact, "AvatarSaved")) != NULL) {
delSetting(hContact, "AvatarSaved");
ProtoBroadcastAck(hContact, ACKTYPE_AVATAR, ACKRESULT_SUCCESS, NULL, NULL);
}
}
В моих тестах после этого удаление аватаров на сервере стало приводить к их удалению в мирандах.
Вполне может быть, что я не то нашел и неправильно исправил, требуется помощь знатоков.
Но явно где-то есть упущение.
ghazan, загляни!