BOOL CJabberProto::OnMessageError(HXML node, ThreadData*, CJabberMessageInfo* pInfo) { // we check if is message delivery failure int id = JabberGetPacketID(node); JABBER_LIST_ITEM *item = ListGetItemPtr(LIST_ROSTER, pInfo->GetFrom()); if (item == NULL) item = ListGetItemPtr(LIST_CHATROOM, pInfo->GetFrom()); if (item != NULL) { // yes, it is TCHAR *szErrText = JabberErrorMsg(pInfo->GetChildNode()); if (id != -1) { char *errText = mir_t2a(szErrText); ProtoBroadcastAck(pInfo->GetHContact(), ACKTYPE_MESSAGE, ACKRESULT_FAILED, (HANDLE)id, (LPARAM)errText); mir_free(errText); } else { TCHAR buf[512]; HXML bodyNode = xmlGetChild(node, "body"); if (bodyNode) mir_sntprintf(buf, SIZEOF(buf), _T("%s:\n%s\n%s"), pInfo->GetFrom(), xmlGetText(bodyNode), szErrText); else mir_sntprintf(buf, SIZEOF(buf), _T("%s:\n%s"), pInfo->GetFrom(), szErrText); MsgPopup(NULL, buf, TranslateT("Jabber Error")); } mir_free(szErrText); } return TRUE; }
void CJabberProto::OnIqResultDiscovery(HXML iqNode, CJabberIqInfo *pInfo) { if (!iqNode || !pInfo) return; HWND hwndList = (HWND)pInfo->GetUserData(); SendMessage(hwndList, CB_SHOWDROPDOWN, FALSE, 0); SendMessage(hwndList, CB_RESETCONTENT, 0, 0); if (pInfo->GetIqType() == JABBER_IQ_TYPE_RESULT) { HXML query = XmlGetChild(iqNode, "query"); if (query == NULL) { sttRoomListAppend(hwndList, RoomInfo::ROOM_FAIL, TranslateT("Jabber Error"), TranslateT("Failed to retrieve room list from server."), _T("")); } else { bool found = false; HXML item; for (int i = 1; item = XmlGetNthChild(query, _T("item"), i); i++) { const TCHAR *jid = XmlGetAttrValue(item, _T("jid")); TCHAR *name = NEWTSTR_ALLOCA(jid); if (name) { if (TCHAR *p = _tcschr(name, _T('@'))) *p = 0; } else name = _T(""); sttRoomListAppend(hwndList, ListGetItemPtr(LIST_BOOKMARK, jid) ? RoomInfo::ROOM_BOOKMARK : RoomInfo::ROOM_DEFAULT, XmlGetAttrValue(item, _T("name")), jid, name); found = true; } if (!found) { sttRoomListAppend(hwndList, RoomInfo::ROOM_FAIL, TranslateT("Jabber Error"), TranslateT("No rooms available on server."), _T("")); } } } else if (pInfo->GetIqType() == JABBER_IQ_TYPE_ERROR) { HXML errorNode = XmlGetChild(iqNode, "error"); TCHAR *str = JabberErrorMsg(errorNode); sttRoomListAppend(hwndList, RoomInfo::ROOM_FAIL, TranslateT("Jabber Error"), str, _T("")); mir_free(str); } else sttRoomListAppend(hwndList, RoomInfo::ROOM_FAIL, TranslateT("Jabber Error"), TranslateT("Room list request timed out."), _T("")); SendMessage(hwndList, CB_SHOWDROPDOWN, TRUE, 0); }
void JabberGroupchatProcessPresence( XmlNode *node, void *userdata ) { ThreadData* info; XmlNode *showNode, *statusNode, *errorNode, *itemNode, *n; TCHAR* from; int status, newRes; int i; BOOL roomCreated; if ( !node || !node->name || strcmp( node->name, "presence" )) return; if (( info=( ThreadData* ) userdata ) == NULL ) return; if (( from=JabberXmlGetAttrValue( node, "from" )) == NULL ) return; TCHAR* nick = _tcschr( from, '/' ); if ( nick == NULL || nick[1] == '\0' ) return; nick++; JABBER_LIST_ITEM* item = JabberListGetItemPtr( LIST_CHATROOM, from ); if ( item == NULL ) return; XmlNode* xNode = JabberXmlGetChildWithGivenAttrValue( node, "x", "xmlns", _T("http://jabber.org/protocol/muc#user")); TCHAR* type = JabberXmlGetAttrValue( node, "type" ); if ( type == NULL || !_tcscmp( type, _T("available"))) { TCHAR* room = JabberNickFromJID( from ); if ( room == NULL ) return; JabberGcLogCreate( item ); // Update status of room participant status = ID_STATUS_ONLINE; if (( showNode=JabberXmlGetChild( node, "show" )) != NULL ) { if ( showNode->text != NULL ) { if ( !_tcscmp( showNode->text , _T("away"))) status = ID_STATUS_AWAY; else if ( !_tcscmp( showNode->text , _T("xa"))) status = ID_STATUS_NA; else if ( !_tcscmp( showNode->text , _T("dnd"))) status = ID_STATUS_DND; else if ( !_tcscmp( showNode->text , _T("chat"))) status = ID_STATUS_FREECHAT; } } TCHAR* str; if (( statusNode=JabberXmlGetChild( node, "status" ))!=NULL && statusNode->text!=NULL ) str = statusNode->text; else str = NULL; newRes = ( JabberListAddResource( LIST_CHATROOM, from, status, str ) == 0 ) ? 0 : GC_EVENT_JOIN; roomCreated = FALSE; // Check additional MUC info for this user if ( xNode != NULL ) { if (( itemNode=JabberXmlGetChild( xNode, "item" )) != NULL ) { JABBER_RESOURCE_STATUS* r = item->resource; for ( i=0; i<item->resourceCount && _tcscmp( r->resourceName, nick ); i++, r++ ); if ( i < item->resourceCount ) { if (( str=JabberXmlGetAttrValue( itemNode, "affiliation" )) != NULL ) { if ( !_tcscmp( str, _T("owner"))) r->affiliation = AFFILIATION_OWNER; else if ( !_tcscmp( str, _T("admin"))) r->affiliation = AFFILIATION_ADMIN; else if ( !_tcscmp( str, _T("member"))) r->affiliation = AFFILIATION_MEMBER; else if ( !_tcscmp( str, _T("outcast"))) r->affiliation = AFFILIATION_OUTCAST; } if (( str=JabberXmlGetAttrValue( itemNode, "role" )) != NULL ) { JABBER_GC_ROLE newRole = r->role; if ( !_tcscmp( str, _T("moderator"))) newRole = ROLE_MODERATOR; else if ( !_tcscmp( str, _T("participant"))) newRole = ROLE_PARTICIPANT; else if ( !_tcscmp( str, _T("visitor"))) newRole = ROLE_VISITOR; else newRole = ROLE_NONE; if ( newRole != r->role && r->role != ROLE_NONE ) { JabberGcLogUpdateMemberStatus( item, nick, NULL, GC_EVENT_REMOVESTATUS, NULL ); newRes = GC_EVENT_ADDSTATUS; } r->role = newRole; } str = JabberXmlGetAttrValue( itemNode, "jid" ); } } if ( sttGetStatusCode( xNode ) == 201 ) roomCreated = TRUE; } // Update groupchat log window JabberGcLogUpdateMemberStatus( item, nick, str, newRes, NULL ); HANDLE hContact = JabberHContactFromJID( from ); if ( hContact != NULL ) JSetWord( hContact, "Status", status ); // Update room status //if ( item->status != ID_STATUS_ONLINE ) { // item->status = ID_STATUS_ONLINE; // JSetWord( hContact, "Status", ( WORD )ID_STATUS_ONLINE ); // JabberLog( "Room %s online", from ); //} // Check <created/> if ( roomCreated || (( n=JabberXmlGetChild( node, "created" ))!=NULL && ( str=JabberXmlGetAttrValue( n, "xmlns" ))!=NULL && !_tcscmp( str, _T("http://jabber.org/protocol/muc#owner"))) ) { // A new room just created by me // Request room config int iqId = JabberSerialNext(); JabberIqAdd( iqId, IQ_PROC_NONE, JabberIqResultGetMuc ); XmlNodeIq iq( "get", iqId, item->jid ); XmlNode* query = iq.addQuery( xmlnsOwner ); JabberSend( jabberThreadInfo->s, iq ); } mir_free( room ); } else if ( !lstrcmp( type, _T("unavailable"))) { TCHAR* str = 0; if ( xNode != NULL && item->nick != NULL ) { itemNode = JabberXmlGetChild( xNode, "item" ); XmlNode* reasonNode = JabberXmlGetChild( itemNode, "reason" ); str = JabberXmlGetAttrValue( itemNode, "jid" ); if ( !lstrcmp( nick, item->nick )) { int iStatus = sttGetStatusCode( xNode ); switch( iStatus ) { case 301: case 307: JabberGcQuit( item, iStatus, reasonNode ); break; case 303: sttRenameParticipantNick( item, nick, itemNode ); return; } } else { switch( sttGetStatusCode( xNode )) { case 303: sttRenameParticipantNick( item, nick, itemNode ); return; case 301: case 307: JabberListRemoveResource( LIST_CHATROOM, from ); JabberGcLogUpdateMemberStatus( item, nick, str, GC_EVENT_KICK, reasonNode ); return; } } } JabberListRemoveResource( LIST_CHATROOM, from ); JabberGcLogUpdateMemberStatus( item, nick, str, GC_EVENT_PART, NULL ); HANDLE hContact = JabberHContactFromJID( from ); if ( hContact != NULL ) JSetWord( hContact, "Status", ID_STATUS_OFFLINE ); } else if ( !lstrcmp( type, _T("error"))) { errorNode = JabberXmlGetChild( node, "error" ); TCHAR* str = JabberErrorMsg( errorNode ); MessagePopup( NULL, str, TranslateT( "Jabber Error Message" ), MB_OK|MB_SETFOREGROUND ); //JabberListRemoveResource( LIST_CHATROOM, from ); JabberListRemove( LIST_CHATROOM, from ); mir_free( str ); } }