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; }
INT_PTR __cdecl CJabberProto::OnMenuRosterAdd(WPARAM hContact, LPARAM) { if (!hContact) return 0; // we do not add ourself to the roster. (buggy situation - should not happen) ptrT roomID(getTStringA(hContact, "ChatRoomID")); if (roomID == NULL) return 0; if (ListGetItemPtr(LIST_ROSTER, roomID) == NULL) { ptrT group(db_get_tsa(hContact, "CList", "Group")); ptrT nick(getTStringA(hContact, "Nick")); AddContactToRoster(roomID, nick, group); if (m_options.AddRoster2Bookmarks == TRUE) { JABBER_LIST_ITEM *item = ListGetItemPtr(LIST_BOOKMARK, roomID); if (item == NULL) { item = new JABBER_LIST_ITEM(); item->jid = mir_tstrdup(roomID); item->name = mir_tstrdup(nick); item->nick = getTStringA(hContact, "MyNick"); AddEditBookmark(item); delete item; } } } return 0; }
JabberCapsBits CJabberProto::GetTotalJidCapabilites(const TCHAR *jid) { if (jid == NULL) return JABBER_RESOURCE_CAPS_NONE; TCHAR szBareJid[JABBER_MAX_JID_LEN]; JabberStripJid(jid, szBareJid, SIZEOF(szBareJid)); JABBER_LIST_ITEM *item = ListGetItemPtr(LIST_ROSTER, szBareJid); if (item == NULL) item = ListGetItemPtr(LIST_VCARD_TEMP, szBareJid); JabberCapsBits jcbToReturn = JABBER_RESOURCE_CAPS_NONE; // get bare jid info only if where is no resources if (!item || (item && !item->arResources.getCount())) { jcbToReturn = GetResourceCapabilites(szBareJid, FALSE); if (jcbToReturn & JABBER_RESOURCE_CAPS_ERROR) jcbToReturn = JABBER_RESOURCE_CAPS_NONE; } if (item) { for (int i = 0; i < item->arResources.getCount(); i++) { TCHAR szFullJid[JABBER_MAX_JID_LEN]; mir_sntprintf(szFullJid, JABBER_MAX_JID_LEN, _T("%s/%s"), szBareJid, item->arResources[i]->m_tszResourceName); JabberCapsBits jcb = GetResourceCapabilites(szFullJid, FALSE); if (!(jcb & JABBER_RESOURCE_CAPS_ERROR)) jcbToReturn |= jcb; } } return jcbToReturn; }
INT_PTR __cdecl CJabberProto::OnMenuHandleDirectPresence(WPARAM hContact, LPARAM, LPARAM res) { if (!m_bJabberOnline || !hContact) return 0; TCHAR *jid, text[1024]; ptrT tszJid(getTStringA(hContact, "jid")); if (tszJid == NULL) { ptrT roomid(getTStringA(hContact, "ChatRoomID")); if (roomid == NULL) return 0; JABBER_LIST_ITEM *item = ListGetItemPtr(LIST_CHATROOM, roomid); if (item == NULL) return 0; mir_sntprintf(text, _T("%s/%s"), item->jid, item->nick); jid = text; } else jid = tszJid; CMString szValue; if (EnterString(szValue, TranslateT("Status Message"), ESF_MULTILINE)) SendPresenceTo(res, jid, NULL, szValue); return 0; }
void CJabberProto::ListRemoveResource(JABBER_LIST list, const TCHAR *jid) { mir_cslockfull lck(m_csLists); JABBER_LIST_ITEM *LI = ListGetItemPtr(list, jid); if (LI == NULL) return; const TCHAR *p = _tcschr(jid, '@'); const TCHAR *q = _tcschr((p == NULL) ? jid : p, '/'); if (q == NULL) return; pResourceStatus r( LI->findResource(q+1)); if (r == NULL) return; // Found last seen resource ID to be removed if (LI->m_pLastSeenResource == r) LI->m_pLastSeenResource = NULL; // update manually selected resource ID if (LI->resourceMode == RSMODE_MANUAL && LI->m_pManualResource == r) { LI->resourceMode = RSMODE_LASTSEEN; LI->m_pManualResource = NULL; } // Update MirVer due to possible resource changes UpdateMirVer(LI); LI->arResources.remove(r); r->Release(); lck.unlock(); MenuUpdateSrmmIcon(LI); }
void __cdecl CJabberProto::OnRenameGroup(DBCONTACTWRITESETTING *cws, HANDLE hContact) { JABBER_LIST_ITEM *item = ListGetItemPtr(LIST_ROSTER, ptrT(getTStringA(hContact, "jid"))); if (item == NULL) return; ptrT tszNick(db_get_tsa(hContact, "CList", "MyHandle")); if (tszNick == NULL) tszNick = getTStringA(hContact, "Nick"); if (tszNick == NULL) tszNick = JabberNickFromJID(item->jid); if (tszNick == NULL) return; if (cws->value.type == DBVT_DELETED) { if (item->group != NULL) { debugLogA("Group set to nothing"); AddContactToRoster(item->jid, tszNick, NULL); } } else { TCHAR *p = sttSettingToTchar(cws); if (cws->value.pszVal != NULL && lstrcmp(p, item->group)) { debugLogA("Group set to %S", p); if (p) AddContactToRoster(item->jid, tszNick, p); } mir_free(p); } }
INT_PTR __cdecl CJabberProto::OnMenuHandleResource(WPARAM hContact, LPARAM, LPARAM res) { if (!m_bJabberOnline || !hContact) return 0; ptrT tszJid(getTStringA(hContact, "jid")); if (tszJid == NULL) return 0; JABBER_LIST_ITEM *LI = ListGetItemPtr(LIST_ROSTER, tszJid); if (LI == NULL) return 0; if (res == MENUITEM_LASTSEEN) { LI->m_pManualResource = NULL; LI->resourceMode = RSMODE_LASTSEEN; } else if (res == MENUITEM_SERVER) { LI->m_pManualResource = NULL; LI->resourceMode = RSMODE_SERVER; } else if (res >= MENUITEM_RESOURCES) { LI->m_pManualResource = LI->arResources[res - MENUITEM_RESOURCES]; LI->resourceMode = RSMODE_MANUAL; } UpdateMirVer(LI); MenuUpdateSrmmIcon(LI); return 0; }
BOOL CJabberProto::OnIbbRecvdData( const TCHAR *data, const TCHAR *sid, const TCHAR *seq ) { JABBER_LIST_ITEM *item = ListGetItemPtr( LIST_FTRECV, sid ); if ( !item ) return FALSE; WORD wSeq = (WORD)_ttoi(seq); if ( wSeq != item->jibb->wPacketId ) { if ( item->jibb->hEvent ) SetEvent( item->jibb->hEvent ); return FALSE; } item->jibb->wPacketId++; int length = 0; char *decodedData = JabberBase64DecodeT( data, &length ); if ( !decodedData ) return FALSE; (this->*item->jibb->pfnRecv)( NULL, item->ft, decodedData, length ); item->jibb->dwTransferredSize += (DWORD)length; mir_free( decodedData ); return TRUE; }
void __cdecl CJabberProto::OnRenameContact( DBCONTACTWRITESETTING* cws, HANDLE hContact ) { DBVARIANT jid; if ( JGetStringT( hContact, "jid", &jid )) return; JABBER_LIST_ITEM* item = ListGetItemPtr( LIST_ROSTER, jid.ptszVal ); JFreeVariant( &jid ); if ( item == NULL ) return; if ( cws->value.type == DBVT_DELETED ) { TCHAR* nick = ( TCHAR* )JCallService( MS_CLIST_GETCONTACTDISPLAYNAME, ( WPARAM )hContact, GCDNF_NOMYHANDLE | GCDNF_TCHAR ); AddContactToRoster( item->jid, nick, item->group ); mir_free(nick); return; } TCHAR* newNick = sttSettingToTchar( cws ); if ( newNick ) { if ( lstrcmp( item->nick, newNick )) { Log( "Renaming contact " TCHAR_STR_PARAM ": " TCHAR_STR_PARAM " -> " TCHAR_STR_PARAM, item->jid, item->nick, newNick ); AddContactToRoster( item->jid, newNick, item->group ); } mir_free( newNick ); } }
int CJabberProto::OnContactDeleted(WPARAM wParam, LPARAM) { if (!m_bJabberOnline) // should never happen return 0; HANDLE hContact = (HANDLE)wParam; ptrT jid(getTStringA(hContact, isChatRoom(hContact) ? "ChatRoomID" : "jid")); if (jid == NULL) return 0; if (ListGetItemPtr(LIST_ROSTER, jid)) { if (!_tcschr(jid, _T('@'))) { TCHAR szStrippedJid[JABBER_MAX_JID_LEN]; JabberStripJid(m_ThreadInfo->fullJID, szStrippedJid, SIZEOF(szStrippedJid)); TCHAR *szDog = _tcschr(szStrippedJid, _T('@')); if (szDog && _tcsicmp(szDog + 1, jid)) m_ThreadInfo->send(XmlNodeIq(_T("set"), SerialNext(), jid) << XQUERY(JABBER_FEAT_REGISTER) << XCHILD(_T("remove"))); } // Remove from roster, server also handles the presence unsubscription process. m_ThreadInfo->send(XmlNodeIq(_T("set"), SerialNext()) << XQUERY(JABBER_FEAT_IQ_ROSTER) << XCHILD(_T("item")) << XATTR(_T("jid"), jid) << XATTR(_T("subscription"), _T("remove"))); } return 0; }
void CJabberProto::ListRemove(JABBER_LIST list, const TCHAR *jid) { mir_cslock lck(m_csLists); JABBER_LIST_ITEM *LI = ListGetItemPtr(list, jid); if (LI != NULL) { m_lstRoster.remove(LI); delete LI; } }
JABBER_LIST_ITEM *CJabberProto::ListAdd(JABBER_LIST list, const TCHAR *jid) { bool bUseResource = false; mir_cslockfull lck(m_csLists); JABBER_LIST_ITEM *item = ListGetItemPtr(list, jid); if (item != NULL) return item; TCHAR *s = mir_tstrdup(jid); TCHAR *q = NULL; // strip resource name if any //fyr if (!((list== LIST_ROSTER) && ListGetItemPtr(LIST_CHATROOM, jid))) { // but only if it is not chat room contact if (list != LIST_VCARD_TEMP) { TCHAR *p; if ((p = _tcschr(s, '@')) != NULL) if ((q = _tcschr(p, '/')) != NULL) *q = '\0'; } } else bUseResource = true; if (!bUseResource && list == LIST_ROSTER) { //if it is a chat room keep resource and made it resource sensitive if (ChatRoomHContactFromJID(s)) { if (q != NULL) *q='/'; bUseResource = true; } } item = new JABBER_LIST_ITEM(); item->list = list; item->jid = s; item->resourceMode = RSMODE_LASTSEEN; item->bUseResource = bUseResource; m_lstRoster.insert(item); lck.unlock(); MenuUpdateSrmmIcon(item); return item; }
INT_PTR __cdecl CJabberProto::JabberGetAvatarInfo(WPARAM wParam, LPARAM lParam) { if (!m_options.EnableAvatars) return GAIR_NOAVATAR; PROTO_AVATAR_INFORMATIONT* AI = (PROTO_AVATAR_INFORMATIONT*)lParam; ptrA szHashValue( getStringA(AI->hContact, "AvatarHash")); if (szHashValue == NULL) { debugLogA("No avatar"); return GAIR_NOAVATAR; } TCHAR tszFileName[MAX_PATH]; GetAvatarFileName(AI->hContact, tszFileName, SIZEOF(tszFileName)); _tcsncpy(AI->filename, tszFileName, SIZEOF(AI->filename)); AI->format = (AI->hContact == NULL) ? PA_FORMAT_PNG : getByte(AI->hContact, "AvatarType", 0); if (::_taccess(AI->filename, 0) == 0) { ptrA szSavedHash( getStringA(AI->hContact, "AvatarSaved")); if (szSavedHash != NULL && !strcmp(szSavedHash, szHashValue)) { debugLogA("Avatar is Ok: %s == %s", szSavedHash, szHashValue); return GAIR_SUCCESS; } } if ((wParam & GAIF_FORCE) != 0 && AI->hContact != NULL && m_bJabberOnline) { ptrT tszJid( getTStringA(AI->hContact, "jid")); if (tszJid != NULL) { JABBER_LIST_ITEM *item = ListGetItemPtr(LIST_ROSTER, tszJid); if (item != NULL) { BOOL isXVcard = getByte(AI->hContact, "AvatarXVcard", 0); TCHAR szJid[JABBER_MAX_JID_LEN]; szJid[0] = 0; if (item->arResources.getCount() != NULL && !isXVcard) if (TCHAR *bestResName = ListGetBestClientResourceNamePtr(tszJid)) mir_sntprintf(szJid, SIZEOF(szJid), _T("%s/%s"), tszJid, bestResName); if (szJid[0] == 0) _tcsncpy_s(szJid, SIZEOF(szJid), tszJid, _TRUNCATE); debugLogA("Rereading %s for %S", isXVcard ? JABBER_FEAT_VCARD_TEMP : JABBER_FEAT_AVATAR, szJid); m_ThreadInfo->send((isXVcard) ? XmlNodeIq( AddIQ(&CJabberProto::OnIqResultGetVCardAvatar, JABBER_IQ_TYPE_GET, szJid)) << XCHILDNS(_T("vCard"), JABBER_FEAT_VCARD_TEMP) : XmlNodeIq( AddIQ(&CJabberProto::OnIqResultGetClientAvatar, JABBER_IQ_TYPE_GET, szJid)) << XQUERY(JABBER_FEAT_AVATAR)); return GAIR_WAITFOR; } } } debugLogA("No avatar"); return GAIR_NOAVATAR; }
pResourceStatus CJabberProto::ListFindResource(JABBER_LIST list, const TCHAR *jid) { mir_cslock lck(m_csLists); JABBER_LIST_ITEM *LI = ListGetItemPtr(list, jid); if (LI == NULL) return NULL; const TCHAR *p = _tcschr(jid, '@'); const TCHAR *q = _tcschr((p == NULL) ? jid : p, '/'); return (q == NULL) ? NULL : LI->findResource(q+1); }
INT_PTR __cdecl CJabberProto::OnLeaveChat(WPARAM hContact, LPARAM) { ptrT jid(getTStringA(hContact, "ChatRoomID")); if (jid != NULL) { if (getWord(hContact, "Status", 0) != ID_STATUS_OFFLINE) { JABBER_LIST_ITEM *item = ListGetItemPtr(LIST_CHATROOM, jid); if (item != NULL) GcQuit(item, 200, NULL); } } return 0; }
int CJabberProto::OnProcessSrmmIconClick(WPARAM hContact, LPARAM lParam) { StatusIconClickData *sicd = (StatusIconClickData *)lParam; if (mir_strcmp(sicd->szModule, m_szModuleName)) return 0; if (!hContact) return 0; JABBER_LIST_ITEM *LI = ListGetItemPtr(LIST_ROSTER, ptrT(getTStringA(hContact, "jid"))); if (LI == NULL) return 0; HMENU hMenu = CreatePopupMenu(); TCHAR buf[256]; mir_sntprintf(buf, TranslateT("Last active (%s)"), LI->m_pLastSeenResource ? LI->m_pLastSeenResource->m_tszResourceName : TranslateT("No activity yet, use server's choice")); AppendMenu(hMenu, MF_STRING, MENUITEM_LASTSEEN, buf); AppendMenu(hMenu, MF_STRING, MENUITEM_SERVER, TranslateT("Highest priority (server's choice)")); AppendMenu(hMenu, MF_SEPARATOR, 0, NULL); for (int i = 0; i < LI->arResources.getCount(); i++) AppendMenu(hMenu, MF_STRING, MENUITEM_RESOURCES + i, LI->arResources[i]->m_tszResourceName); if (LI->resourceMode == RSMODE_LASTSEEN) CheckMenuItem(hMenu, MENUITEM_LASTSEEN, MF_BYCOMMAND | MF_CHECKED); else if (LI->resourceMode == RSMODE_SERVER) CheckMenuItem(hMenu, MENUITEM_SERVER, MF_BYCOMMAND | MF_CHECKED); else if (LI->m_pManualResource) CheckMenuItem(hMenu, MENUITEM_RESOURCES + LI->arResources.indexOf(LI->m_pManualResource), MF_BYCOMMAND | MF_CHECKED); int res = TrackPopupMenu(hMenu, TPM_RETURNCMD, sicd->clickLocation.x, sicd->clickLocation.y, 0, WindowList_Find(hDialogsList, hContact), NULL); if (res == MENUITEM_LASTSEEN) { LI->m_pManualResource = NULL; LI->resourceMode = RSMODE_LASTSEEN; } else if (res == MENUITEM_SERVER) { LI->m_pManualResource = NULL; LI->resourceMode = RSMODE_SERVER; } else if (res >= MENUITEM_RESOURCES) { LI->m_pManualResource = LI->arResources[res - MENUITEM_RESOURCES]; LI->resourceMode = RSMODE_MANUAL; } UpdateMirVer(LI); MenuUpdateSrmmIcon(LI); return 0; }
JABBER_LIST_ITEM *CJabberProto::ListAdd( JABBER_LIST list, const TCHAR* jid ) { JABBER_LIST_ITEM* item; BOOL bUseResource=FALSE; EnterCriticalSection( &m_csLists ); if (( item = ListGetItemPtr( list, jid )) != NULL ) { LeaveCriticalSection( &m_csLists ); return item; } TCHAR *s = mir_tstrdup( jid ); TCHAR *q = NULL; // strip resource name if any //fyr if ( !((list== LIST_ROSTER ) && ListExist(LIST_CHATROOM, jid))) { // but only if it is not chat room contact if ( list != LIST_VCARD_TEMP ) { TCHAR *p; if (( p = _tcschr( s, '@' )) != NULL ) if (( q = _tcschr( p, '/' )) != NULL ) *q = '\0'; } } else { bUseResource=TRUE; } if ( !bUseResource && list== LIST_ROSTER ) { //if it is a chat room keep resource and made it resource sensitive if ( ChatRoomHContactFromJID( s ) ) { if (q != NULL) *q='/'; bUseResource=TRUE; } } item = ( JABBER_LIST_ITEM* )mir_alloc( sizeof( JABBER_LIST_ITEM )); ZeroMemory( item, sizeof( JABBER_LIST_ITEM )); item->list = list; item->jid = s; item->itemResource.status = ID_STATUS_OFFLINE; item->resource = NULL; item->resourceMode = RSMODE_LASTSEEN; item->lastSeenResource = -1; item->manualResource = -1; item->bUseResource = bUseResource; m_lstRoster.insert( item ); LeaveCriticalSection( &m_csLists ); MenuUpdateSrmmIcon(item); return item; }
INT_PTR __cdecl CJabberProto::JabberGCGetToolTipText(WPARAM wParam, LPARAM lParam) { if (!wParam || !lParam) return 0; //room global tooltip not supported yet JABBER_LIST_ITEM *item = ListGetItemPtr(LIST_CHATROOM, (TCHAR*)wParam); if (item == NULL) return 0; //no room found pResourceStatus info( item->findResource((TCHAR*)lParam)); if (info == NULL) return 0; //no info found // ok process info output will be: // JID: real@jid/resource or // Nick: Nickname // Status: StatusText // Role: Moderator // Affiliation: Affiliation TCHAR outBuf[2048]; outBuf[0]=0; bool bIsTipper = db_get_b(NULL, "Tab_SRMsg", "adv_TipperTooltip", 0) && ServiceExists("mToolTip/HideTip"); //JID: if (_tcschr(info->m_tszResourceName, _T('@')) != NULL) appendString(bIsTipper, LPGENT("JID:"), info->m_tszResourceName, outBuf, SIZEOF(outBuf)); else if (lParam) //or simple nick appendString(bIsTipper, LPGENT("Nick:"), (TCHAR*)lParam, outBuf, SIZEOF(outBuf)); // status if (info->m_iStatus >= ID_STATUS_OFFLINE && info->m_iStatus <= ID_STATUS_IDLE ) appendString(bIsTipper, LPGENT("Status:"), pcli->pfnGetStatusModeDescription(info->m_iStatus, 0), outBuf, SIZEOF(outBuf)); // status text if (info->m_tszStatusMessage) appendString(bIsTipper, LPGENT("Status text:"), info->m_tszStatusMessage, outBuf, SIZEOF(outBuf)); // Role appendString(bIsTipper, LPGENT("Role:"), TranslateTS(JabberEnum2RoleStr[info->m_role]), outBuf, SIZEOF(outBuf)); // Affiliation appendString(bIsTipper, LPGENT("Affiliation:"), TranslateTS(JabberEnum2AffilationStr[info->m_affiliation]), outBuf, SIZEOF(outBuf)); // real jid if (info->m_tszRealJid) appendString(bIsTipper, LPGENT("Real JID:"), info->m_tszRealJid, outBuf, SIZEOF(outBuf)); return (outBuf[0] == 0 ? NULL : (INT_PTR) mir_tstrdup(outBuf)); }
int CJabberProto::OnProcessSrmmEvent(WPARAM, LPARAM lParam) { MessageWindowEventData *event = (MessageWindowEventData *)lParam; if (event->uType == MSG_WINDOW_EVT_OPEN) { if (!hDialogsList) hDialogsList = WindowList_Create(); WindowList_Add(hDialogsList, event->hwndWindow, event->hContact); ptrT jid(getTStringA(event->hContact, "jid")); if (jid != NULL) { JABBER_LIST_ITEM *pItem = ListGetItemPtr(LIST_ROSTER, jid); if (pItem && (m_ThreadInfo->jabberServerCaps & JABBER_CAPS_ARCHIVE_AUTO) && m_options.EnableMsgArchive) RetrieveMessageArchive(event->hContact, pItem); } } else if (event->uType == MSG_WINDOW_EVT_CLOSING) { if (hDialogsList) WindowList_Remove(hDialogsList, event->hwndWindow); DBVARIANT dbv; BOOL bSupportTyping = FALSE; if (!db_get(event->hContact, "SRMsg", "SupportTyping", &dbv)) { bSupportTyping = dbv.bVal == 1; db_free(&dbv); } else if (!db_get(NULL, "SRMsg", "DefaultTyping", &dbv)) { bSupportTyping = dbv.bVal == 1; db_free(&dbv); } if (!bSupportTyping || !m_bJabberOnline) return 0; TCHAR jid[JABBER_MAX_JID_LEN]; if (GetClientJID(event->hContact, jid, _countof(jid))) { pResourceStatus r(ResourceInfoFromJID(jid)); if (r && r->m_bMessageSessionActive) { r->m_bMessageSessionActive = FALSE; if (GetResourceCapabilites(jid, TRUE) & JABBER_CAPS_CHATSTATES) m_ThreadInfo->send( XmlNode(_T("message")) << XATTR(_T("to"), jid) << XATTR(_T("type"), _T("chat")) << XATTRID(SerialNext()) << XCHILDNS(_T("gone"), JABBER_FEAT_CHATSTATES)); } } } return 0; }
LPTSTR CJabberProto::GetResourceList(LPCTSTR jid) { if (jid == NULL) return NULL; mir_cslock lck(m_csLists); JABBER_LIST_ITEM *item = NULL; if ((item = ListGetItemPtr(LIST_VCARD_TEMP, jid)) == NULL) item = ListGetItemPtr(LIST_ROSTER, jid); if (item == NULL) return NULL; if (!item->arResources.getCount()) return NULL; CMString res; for (int i=0; i < item->arResources.getCount(); i++) { res.Append(item->arResources[i]->m_tszResourceName); res.AppendChar(0); } res.AppendChar(0); return mir_tstrndup(res, res.GetLength()); }
BOOL CJabberProto::OnMessageGroupchat(HXML node, ThreadData*, CJabberMessageInfo* pInfo) { JABBER_LIST_ITEM *chatItem = ListGetItemPtr(LIST_CHATROOM, pInfo->GetFrom()); if (chatItem) // process GC message GroupchatProcessMessage(node); // got message from unknown conference... let's leave it :) else { // TCHAR *conference = NEWTSTR_ALLOCA(from); // if (TCHAR *s = _tcschr(conference, _T('/'))) *s = 0; // XmlNode p("presence"); xmlAddAttr(p, "to", conference); xmlAddAttr(p, "type", "unavailable"); // info->send(p); } return TRUE; }
INT_PTR __cdecl CJabberProto::OnMenuTransportLogin(WPARAM hContact, LPARAM) { if (!getByte(hContact, "IsTransport", 0)) return 0; JABBER_LIST_ITEM *item = ListGetItemPtr(LIST_ROSTER, ptrT(getTStringA(hContact, "jid"))); if (item != NULL) { XmlNode p(_T("presence")); XmlAddAttr(p, _T("to"), item->jid); if (item->getTemp()->m_iStatus == ID_STATUS_ONLINE) XmlAddAttr(p, _T("type"), _T("unavailable")); m_ThreadInfo->send(p); } return 0; }
bool CJabberProto::ListAddResource(JABBER_LIST list, const TCHAR *jid, int status, const TCHAR *statusMessage, char priority, const TCHAR *nick) { mir_cslockfull lck(m_csLists); JABBER_LIST_ITEM *LI = ListGetItemPtr(list, jid); if (LI == NULL) return false; bool bIsNewResource = false; const TCHAR *p = _tcschr(jid, '@'); const TCHAR *q = _tcschr((p == NULL) ? jid : p, '/'); if (q) { const TCHAR *resource = q+1; if (*resource == 0) return 0; JABBER_RESOURCE_STATUS *r = LI->findResource(resource); if (r != NULL) { // Already exists, update status and statusMessage r->m_iStatus = status; r->m_tszStatusMessage = mir_tstrdup(statusMessage); r->m_iPriority = priority; } else { // Does not exist, add new resource bIsNewResource = true; r = new JABBER_RESOURCE_STATUS(); r->m_iStatus = status; r->m_affiliation = AFFILIATION_NONE; r->m_role = ROLE_NONE; r->m_tszResourceName = mir_tstrdup(resource); r->m_tszNick = mir_tstrdup(nick); if (statusMessage) r->m_tszStatusMessage = mir_tstrdup(statusMessage); r->m_iPriority = priority; LI->arResources.insert(r); } } // No resource, update the main statusMessage else { JABBER_RESOURCE_STATUS *r = LI->getTemp(); r->m_iStatus = status; r->m_tszStatusMessage = mir_tstrdup(statusMessage); } lck.unlock(); MenuUpdateSrmmIcon(LI); return bIsNewResource; }
INT_PTR __cdecl CJabberProto::OnLeaveChat( WPARAM wParam, LPARAM ) { DBVARIANT jid; HANDLE hContact = ( HANDLE )wParam; if ( JGetStringT( hContact, "ChatRoomID", &jid )) return 0; if ( JGetWord( hContact, "Status", 0 ) != ID_STATUS_OFFLINE ) { JABBER_LIST_ITEM* item = ListGetItemPtr( LIST_CHATROOM, jid.ptszVal ); if ( item != NULL ) GcQuit( item, 0, NULL ); } JFreeVariant( &jid ); return 0; }
void CJabberProto::IqResultStreamActivate( HXML iqNode ) { int id = JabberGetPacketID( iqNode ); TCHAR listJid[JABBER_MAX_JID_LEN]; mir_sntprintf(listJid, SIZEOF( listJid ), _T("ftproxy_%d"), id); JABBER_LIST_ITEM *item = ListGetItemPtr( LIST_FTIQID, listJid ); if ( !item ) return; if ( !lstrcmp( xmlGetAttrValue( iqNode, _T("type")), _T( "result" ))) item->jbt->bStreamActivated = TRUE; if ( item->jbt->hProxyEvent ) SetEvent( item->jbt->hProxyEvent ); }
TCHAR* CJabberProto::ListGetBestClientResourceNamePtr(const TCHAR *jid) { mir_cslock lck(m_csLists); JABBER_LIST_ITEM *LI = ListGetItemPtr(LIST_ROSTER, jid); if (LI == NULL) return NULL; pResourceStatus r( LI->getBestResource()); if (r != NULL) return r->m_tszResourceName; int status = ID_STATUS_OFFLINE; TCHAR *res = NULL; for (int i=0; i < LI->arResources.getCount(); i++) { r = LI->arResources[i]; bool foundBetter = false; switch (r->m_iStatus) { case ID_STATUS_FREECHAT: foundBetter = true; break; case ID_STATUS_ONLINE: if (status != ID_STATUS_FREECHAT) foundBetter = true; break; case ID_STATUS_DND: if (status != ID_STATUS_FREECHAT && status != ID_STATUS_ONLINE) foundBetter = true; break; case ID_STATUS_AWAY: if (status != ID_STATUS_FREECHAT && status != ID_STATUS_ONLINE && status != ID_STATUS_DND) foundBetter = true; break; case ID_STATUS_NA: if (status != ID_STATUS_FREECHAT && status != ID_STATUS_ONLINE && status != ID_STATUS_DND && status != ID_STATUS_AWAY) foundBetter = true; break; } if (foundBetter) { res = r->m_tszResourceName; status = r->m_iStatus; } } return res; }
void __cdecl CJabberProto::OnRenameContact(DBCONTACTWRITESETTING *cws, HANDLE hContact) { JABBER_LIST_ITEM *item = ListGetItemPtr(LIST_ROSTER, ptrT( getTStringA(hContact, "jid"))); if (item == NULL) return; if (cws->value.type == DBVT_DELETED) { TCHAR *nick = pcli->pfnGetContactDisplayName(hContact, GCDNF_NOMYHANDLE); AddContactToRoster(item->jid, nick, item->group); mir_free(nick); return; } ptrT newNick( sttSettingToTchar(cws)); if (newNick && lstrcmp(item->nick, newNick)) { debugLogA("Renaming contact %S: %S -> %S", item->jid, item->nick, newNick); AddContactToRoster(item->jid, newNick, item->group); } }
INT_PTR __cdecl CJabberProto::OnMenuBookmarkAdd(WPARAM hContact, LPARAM) { if (!hContact) return 0; // we do not add ourself to the roster. (buggy situation - should not happen) ptrT roomID(getTStringA(hContact, "ChatRoomID")); if (roomID == NULL) return 0; if (ListGetItemPtr(LIST_BOOKMARK, roomID) == NULL) { JABBER_LIST_ITEM *item = new JABBER_LIST_ITEM(); item->jid = mir_tstrdup(roomID); item->name = pcli->pfnGetContactDisplayName(hContact, 0); item->type = _T("conference"); item->nick = getTStringA(hContact, "MyNick"); AddEditBookmark(item); delete item; } return 0; }
void __cdecl CJabberProto::OnRenameGroup( DBCONTACTWRITESETTING* cws, HANDLE hContact ) { DBVARIANT jid, dbv; if ( JGetStringT( hContact, "jid", &jid )) return; JABBER_LIST_ITEM* item = ListGetItemPtr( LIST_ROSTER, jid.ptszVal ); JFreeVariant( &jid ); if ( item == NULL ) return; TCHAR* nick; if ( !DBGetContactSettingTString( hContact, "CList", "MyHandle", &dbv )) { nick = mir_tstrdup( dbv.ptszVal ); JFreeVariant( &dbv ); } else if ( !JGetStringT( hContact, "Nick", &dbv )) { nick = mir_tstrdup( dbv.ptszVal ); JFreeVariant( &dbv ); } else nick = JabberNickFromJID( item->jid ); if ( nick == NULL ) return; if ( cws->value.type == DBVT_DELETED ) { if ( item->group != NULL ) { Log( "Group set to nothing" ); AddContactToRoster( item->jid, nick, NULL ); } } else { TCHAR* p = sttSettingToTchar( cws ); if ( cws->value.pszVal != NULL && lstrcmp( p, item->group )) { Log( "Group set to " TCHAR_STR_PARAM, p ); if ( p ) AddContactToRoster( item->jid, nick, p ); } mir_free( p ); } mir_free( nick ); }
BOOL CJabberProto::OnIbbRecvdData(const TCHAR *data, const TCHAR *sid, const TCHAR *seq) { JABBER_LIST_ITEM *item = ListGetItemPtr(LIST_FTRECV, sid); if (item == NULL) return FALSE; WORD wSeq = (WORD)_ttoi(seq); if (wSeq != item->jibb->wPacketId) { if (item->jibb->hEvent) SetEvent(item->jibb->hEvent); return FALSE; } item->jibb->wPacketId++; unsigned length; ptrA decodedData((char*)mir_base64_decode( _T2A(data), &length)); if (decodedData == NULL) return FALSE; (this->*item->jibb->pfnRecv)(NULL, item->ft, decodedData, length); item->jibb->dwTransferredSize += (DWORD)length; return TRUE; }