ThreadData* CMsnProto::MSN_GetP2PThreadByContact(const char *wlid) { mir_cslock lck(m_csThreads); for (int i = 0; i < m_arThreads.getCount(); i++) { ThreadData &T = m_arThreads[i]; if (T.mType != SERVER_P2P_DIRECT || !T.mJoinedIdentContactsWLID.getCount()) continue; if (_stricmp(T.mJoinedIdentContactsWLID[0], wlid) == 0) return &T; } char *szEmail = NULL; parseWLID(NEWSTR_ALLOCA(wlid), NULL, &szEmail, NULL); ThreadData *result = NULL; for (int i = 0; i < m_arThreads.getCount(); i++) { ThreadData &T = m_arThreads[i]; if (T.mJoinedContactsWLID.getCount() && !T.mInitialContactWLID && _stricmp(T.mJoinedContactsWLID[0], szEmail) == 0) { if (T.mType == SERVER_P2P_DIRECT) return &T; if (T.mType == SERVER_SWITCHBOARD) result = &T; } } return result; }
filetransfer* CMsnProto::p2p_getSessionByCallID(const char* CallID, const char* wlid) { if (CallID == NULL) return NULL; EnterCriticalSection(&sessionLock); filetransfer* ft = NULL; char* szEmail = NULL; for (int i=0; i < sessionList.getCount(); i++) { filetransfer* FT = &sessionList[i]; if (FT->p2p_callID && !_stricmp(FT->p2p_callID, CallID)) { if (_stricmp(FT->p2p_dest, wlid)) { if (!szEmail) parseWLID(NEWSTR_ALLOCA(wlid), NULL, &szEmail, NULL); if (_stricmp(FT->p2p_dest, szEmail)) continue; } ft = FT; break; } } LeaveCriticalSection(&sessionLock); if (ft == NULL) MSN_DebugLog("Ignoring unknown session call id %s", CallID); return ft; }
ThreadData* CMsnProto::MSN_GetThreadByContact(const char* wlid, TInfoType type) { mir_cslock lck(m_csThreads); if (type == SERVER_P2P_DIRECT) { for (int i = 0; i < m_arThreads.getCount(); i++) { ThreadData &T = m_arThreads[i]; if (T.mType != SERVER_P2P_DIRECT || !T.mJoinedIdentContactsWLID.getCount() || T.s == NULL) continue; if (_stricmp(T.mJoinedIdentContactsWLID[0], wlid) == 0) return &T; } } char *szEmail = NULL; parseWLID(NEWSTR_ALLOCA(wlid), NULL, &szEmail, NULL); for (int i = 0; i < m_arThreads.getCount(); i++) { ThreadData &T = m_arThreads[i]; if (T.mType != type || !T.mJoinedContactsWLID.getCount() || T.mInitialContactWLID || T.s == NULL) continue; if (_stricmp(T.mJoinedContactsWLID[0], szEmail) == 0 && T.mChatID[0] == 0) return &T; } return NULL; }
MsnPlace* CMsnProto::Lists_GetPlace(const char* wlid) { EnterCriticalSection(&csLists); char *szEmail, *szInst; parseWLID(NEWSTR_ALLOCA(wlid), NULL, &szEmail, &szInst); if (szInst == NULL) szInst = (char*)sttVoidUid; MsnPlace* pl = NULL; MsnContact* p = contList.find((MsnContact*)&szEmail); if (p) pl = p->places.find((MsnPlace*)&szInst); LeaveCriticalSection(&csLists); return pl; }
MsnPlace* CMsnProto::Lists_GetPlace(const char* wlid) { mir_cslock lck(m_csLists); char *szEmail, *szInst; parseWLID(NEWSTR_ALLOCA(wlid), NULL, &szEmail, &szInst); if (szInst == NULL) szInst = (char*)sttVoidUid; MsnContact* p = m_arContacts.find((MsnContact*)&szEmail); if (p == NULL) return NULL; return p->places.find((MsnPlace*)&szInst); }
void CMsnProto::p2p_startSessions(const char* wlid) { mir_cslock lck(m_csSessions); char* szEmail; parseWLID(NEWSTR_ALLOCA(wlid), NULL, &szEmail, NULL); for (int i = 0; i < m_arSessions.getCount(); i++) { filetransfer* FT = &m_arSessions[i]; if (!FT->bAccepted && !_stricmp(FT->p2p_dest, szEmail)) { if (FT->p2p_appID == MSN_APPID_FILE && (FT->std.flags & PFTS_SENDING)) p2p_invite(FT->p2p_type, FT, wlid); else if (FT->p2p_appID != MSN_APPID_FILE && !(FT->std.flags & PFTS_SENDING)) p2p_invite(FT->p2p_type, FT, wlid); } } }
ThreadData* CMsnProto::MSN_GetUnconnectedThread(const char* wlid, TInfoType type) { mir_cslock lck(m_csThreads); char* szEmail = (char*)wlid; if (type == SERVER_SWITCHBOARD && strchr(wlid, ';')) parseWLID(NEWSTR_ALLOCA(wlid), NULL, &szEmail, NULL); for (int i = 0; i < m_arThreads.getCount(); i++) { ThreadData &T = m_arThreads[i]; if (T.mType == type && T.mInitialContactWLID && _stricmp(T.mInitialContactWLID, szEmail) == 0) return &T; } return NULL; }
void CMsnProto::p2p_startSessions(const char* wlid) { EnterCriticalSection(&sessionLock); char* szEmail; parseWLID(NEWSTR_ALLOCA(wlid), NULL, &szEmail, NULL); for (int i=0; i < sessionList.getCount(); i++) { filetransfer* FT = &sessionList[i]; if (!FT->bAccepted && !_stricmp(FT->p2p_dest, szEmail)) { if (FT->p2p_appID == MSN_APPID_FILE && (FT->std.flags & PFTS_SENDING)) p2p_invite(FT->p2p_type, FT, wlid); else if (FT->p2p_appID != MSN_APPID_FILE && !(FT->std.flags & PFTS_SENDING)) p2p_invite(FT->p2p_type, FT, wlid); } } LeaveCriticalSection(&sessionLock); }
filetransfer* CMsnProto::p2p_getSessionByCallID(const char* CallID, const char* wlid) { if (CallID == NULL) return NULL; mir_cslock lck(m_csSessions); char* szEmail = NULL; for (int i = 0; i < m_arSessions.getCount(); i++) { filetransfer* FT = &m_arSessions[i]; if (FT->p2p_callID && !_stricmp(FT->p2p_callID, CallID)) { if (_stricmp(FT->p2p_dest, wlid)) { if (!szEmail) parseWLID(NEWSTR_ALLOCA(wlid), NULL, &szEmail, NULL); if (_stricmp(FT->p2p_dest, szEmail)) continue; } return FT; } } return NULL; }
int CMsnProto::MSN_ChatInit(GCThreadData *info, const char *pszID, const char *pszTopic) { char *szNet, *szEmail; _tcsncpy(info->mChatID, _A2T(pszID), _countof(info->mChatID)); parseWLID(NEWSTR_ALLOCA(pszID), &szNet, &szEmail, NULL); info->netId = atoi(szNet); strncpy(info->szEmail, szEmail, sizeof(info->szEmail)); TCHAR szName[512]; InterlockedIncrement(&m_chatID); if (*pszTopic) _tcsncpy(szName, _A2T(pszTopic), _countof(szName)); else mir_sntprintf(szName, _T("%s %s%d"), m_tszUserName, TranslateT("Chat #"), m_chatID); GCSESSION gcw = { sizeof(gcw) }; gcw.iType = GCW_CHATROOM; gcw.pszModule = m_szModuleName; gcw.ptszName = szName; gcw.ptszID = info->mChatID; CallServiceSync(MS_GC_NEWSESSION, 0, (LPARAM)&gcw); GCDEST gcd = { m_szModuleName, info->mChatID, GC_EVENT_ADDGROUP }; GCEVENT gce = { sizeof(gce), &gcd }; for (int j = 0; j < _countof(m_ptszRoles); j++) { gce.ptszStatus = m_ptszRoles[j]; CallServiceSync(MS_GC_EVENT, 0, (LPARAM)&gce); } gcd.iType = GC_EVENT_CONTROL; CallServiceSync(MS_GC_EVENT, SESSION_INITDONE, (LPARAM)&gce); CallServiceSync(MS_GC_EVENT, SESSION_ONLINE, (LPARAM)&gce); CallServiceSync(MS_GC_EVENT, WINDOW_VISIBLE, (LPARAM)&gce); mir_free((TCHAR*)gce.ptszUID); return 0; }
void CMsnProto::MSN_ChatStart(ezxml_t xmli) { if (!mir_strcmp(xmli->txt, "thread")) return; // If Chat ID already exists, don'T create a new one const char *pszID = ezxml_txt(ezxml_child(xmli, "id")); GCThreadData* info = MSN_GetThreadByChatId(_A2T(pszID)); if (info == NULL) { info = new GCThreadData; { mir_cslock lck(m_csThreads); m_arGCThreads.insert(info); } MSN_ChatInit(info, pszID, ezxml_txt(ezxml_get(xmli, "properties", 0, "topic", -1))); MSN_StartStopTyping(info, false); } else { GCDEST gcd = { m_szModuleName, info->mChatID, GC_EVENT_CONTROL }; GCEVENT gce = { sizeof(gce), &gcd }; CallServiceSync(MS_GC_EVENT, SESSION_ONLINE, (LPARAM)&gce); } const char *pszCreator = ezxml_txt(ezxml_get(xmli, "properties", 0, "creator", -1)); for (ezxml_t memb = ezxml_get(xmli, "members", 0, "member", -1); memb != NULL; memb = ezxml_next(memb)) { const char *mri = ezxml_txt(ezxml_child(memb, "mri")); const char *role = ezxml_txt(ezxml_child(memb, "role")); GCUserItem *gcu = NULL; for (int j = 0; j < info->mJoinedContacts.getCount(); j++) { if (!mir_strcmp(info->mJoinedContacts[j]->WLID, mri)) { gcu = info->mJoinedContacts[j]; break; } } if (!gcu) { gcu = new GCUserItem; info->mJoinedContacts.insert(gcu); strncpy(gcu->WLID, mri, sizeof(gcu->WLID)); } mir_tstrcpy(gcu->role, _A2T(role)); if (pszCreator && !mir_strcmp(mri, pszCreator)) info->mCreator = gcu; char* szEmail, *szNet; parseWLID(NEWSTR_ALLOCA(mri), &szNet, &szEmail, NULL); if (!mir_strcmpi(szEmail, GetMyUsername(atoi(szNet)))) info->mMe = gcu; gcu->btag = 1; } // Remove contacts not on list (not tagged) for (int j = 0; j < info->mJoinedContacts.getCount(); j++) { if (!info->mJoinedContacts[j]->btag) { info->mJoinedContacts.remove(j); j--; } else info->mJoinedContacts[j]->btag = 0; } }
void CMsnProto::MSN_GCProcessThreadActivity(ezxml_t xmli, const TCHAR *mChatID) { if (!mir_strcmp(xmli->name, "topicupdate")) { ezxml_t initiator = ezxml_child(xmli, "initiator"); GCDEST gcd = { m_szModuleName, mChatID, GC_EVENT_TOPIC}; GCEVENT gce = { sizeof(gce), &gcd }; gce.dwFlags = GCEF_ADDTOLOG; gce.time = MsnTSToUnixtime(ezxml_txt(ezxml_child(xmli, "eventtime"))); gce.ptszUID = initiator?mir_a2t(initiator->txt):NULL; MCONTACT hContInitiator = MSN_HContactFromEmail(initiator->txt); gce.ptszNick = GetContactNameT(hContInitiator); gce.ptszText = mir_a2t(ezxml_txt(ezxml_child(xmli, "value"))); CallServiceSync(MS_GC_EVENT, 0, (LPARAM)&gce); mir_free((TCHAR*)gce.ptszUID); mir_free((TCHAR*)gce.ptszText); } else if (ezxml_t target = ezxml_child(xmli, "target")) { MCONTACT hContInitiator = NULL; GCDEST gcd = { m_szModuleName, mChatID, 0}; GCEVENT gce = { sizeof(gce), &gcd }; gce.dwFlags = GCEF_ADDTOLOG; if (!mir_strcmp(xmli->name, "deletemember")) { gcd.iType = GC_EVENT_PART; if (ezxml_t initiator = ezxml_child(xmli, "initiator")) { if (mir_strcmp(initiator->txt, target->txt)) { hContInitiator = MSN_HContactFromEmail(initiator->txt); gce.ptszStatus = GetContactNameT(hContInitiator); gcd.iType = GC_EVENT_KICK; } } } else if (!mir_strcmp(xmli->name, "addmember")) { gcd.iType = GC_EVENT_JOIN; } else if (!mir_strcmp(xmli->name, "roleupdate")) { gcd.iType = GC_EVENT_ADDSTATUS; if (ezxml_t initiator = ezxml_child(xmli, "initiator")) { hContInitiator = MSN_HContactFromEmail(initiator->txt); gce.ptszText= GetContactNameT(hContInitiator); } gce.ptszStatus = _T("admin"); } if (gcd.iType) { gce.time = MsnTSToUnixtime(ezxml_txt(ezxml_child(xmli, "eventtime"))); const char *pszTarget = NULL; while (target) { switch (gcd.iType) { case GC_EVENT_JOIN: gce.ptszStatus = MSN_GCGetRole(MSN_GetThreadByChatId(mChatID), target->txt); // ..fall through.. // case GC_EVENT_KICK: case GC_EVENT_PART: pszTarget = target->txt; break; case GC_EVENT_ADDSTATUS: case GC_EVENT_REMOVESTATUS: gcd.iType = mir_strcmp(ezxml_txt(ezxml_child(target, "role")), "admin") == 0 ? GC_EVENT_ADDSTATUS : GC_EVENT_REMOVESTATUS; pszTarget = ezxml_txt(ezxml_child(target, "id")); break; } char *szEmail, *szNet; parseWLID(NEWSTR_ALLOCA(pszTarget), &szNet, &szEmail, NULL); gce.bIsMe = !mir_strcmpi(szEmail, GetMyUsername(atoi(szNet))); gce.ptszUID = mir_a2t(pszTarget); MCONTACT hContTarget = MSN_HContactFromEmail(pszTarget); gce.ptszNick = GetContactNameT(hContTarget); CallServiceSync(MS_GC_EVENT, 0, (LPARAM)&gce); mir_free((TCHAR*)gce.ptszUID); if ((gcd.iType == GC_EVENT_PART || gcd.iType == GC_EVENT_KICK) && gce.bIsMe) { GCDEST gcd2 = { m_szModuleName, mChatID, GC_EVENT_CONTROL }; GCEVENT gce2 = { sizeof(gce2), &gcd2 }; CallServiceSync(MS_GC_EVENT, SESSION_OFFLINE, (LPARAM)&gce2); break; } target = ezxml_next(target); } } } }