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); } } }
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); }
HANDLE __cdecl CMsnProto::SendFile(HANDLE hContact, const PROTOCHAR* szDescription, PROTOCHAR** ppszFiles) { if (!msnLoggedIn) return 0; if (getWord(hContact, "Status", ID_STATUS_OFFLINE) == ID_STATUS_OFFLINE) return 0; MsnContact *cont = Lists_Get(hContact); if (!cont || _stricmp(cont->email, MyOptions.szEmail) == 0) return 0; if ((cont->cap1 & 0xf0000000) == 0 && cont->netId != NETID_MSN) return 0; filetransfer* sft = new filetransfer(this); sft->std.ptszFiles = ppszFiles; sft->std.hContact = hContact; sft->std.flags |= PFTS_SENDING; int count = 0; while (ppszFiles[count] != NULL) { struct _stati64 statbuf; if (_tstati64(ppszFiles[count++], &statbuf) == 0 && (statbuf.st_mode & _S_IFDIR) == 0) { sft->std.totalBytes += statbuf.st_size; ++sft->std.totalFiles; } } if (sft->openNext() == -1) { delete sft; return 0; } if (cont->cap1 & 0xf0000000) p2p_invite(MSN_APPID_FILE, sft, NULL); else { sft->p2p_dest = mir_strdup(cont->email); msnftp_invite(sft); } SendBroadcast(hContact, ACKTYPE_FILE, ACKRESULT_SENTREQUEST, sft, 0); return sft; }
void CMsnProto::p2p_clearDormantSessions(void) { mir_cslockfull lck(m_csSessions); time_t ts = time(NULL); for (int i = 0; i < m_arSessions.getCount(); i++) { filetransfer* FT = &m_arSessions[i]; if (!FT->p2p_sessionid && !MSN_GetUnconnectedThread(FT->p2p_dest, SERVER_P2P_DIRECT)) p2p_invite(FT->p2p_type, FT, NULL); else if (FT->p2p_waitack && (ts - FT->ts) > 120) { FT->bCanceled = true; p2p_sendCancel(FT); lck.unlock(); p2p_unregisterSession(FT); lck.lock(); i = 0; } } }
void CMsnProto::p2p_clearDormantSessions(void) { EnterCriticalSection(&sessionLock); time_t ts = time(NULL); for (int i=0; i < sessionList.getCount(); i++) { filetransfer* FT = &sessionList[i]; if (!FT->p2p_sessionid && !MSN_GetUnconnectedThread(FT->p2p_dest, SERVER_P2P_DIRECT)) p2p_invite(FT->p2p_type, FT, NULL); else if (FT->p2p_waitack && (ts - FT->ts) > 120) { FT->bCanceled = true; p2p_sendCancel(FT); LeaveCriticalSection(&sessionLock); p2p_unregisterSession(FT); EnterCriticalSection(&sessionLock); i = 0; } } LeaveCriticalSection(&sessionLock); }
INT_PTR CMsnProto::GetAvatarInfo(WPARAM wParam, LPARAM lParam) { PROTO_AVATAR_INFORMATION *pai = (PROTO_AVATAR_INFORMATION*)lParam; TCHAR filename[MAX_PATH]; MsnContact *cont = NULL; if (pai->hContact) { cont = Lists_Get(pai->hContact); if (cont == NULL) return GAIR_NOAVATAR; /* if ((cont->cap1 & 0xf0000000) == 0) return GAIR_NOAVATAR; */ } if (pai->hContact == NULL || _stricmp(cont->email, MyOptions.szEmail) == 0) { MSN_GetAvatarFileName(NULL, filename, _countof(filename), NULL); pai->format = ProtoGetAvatarFormat(filename); if (pai->format != PA_FORMAT_UNKNOWN) mir_tstrcpy(pai->filename, filename); return pai->format == PA_FORMAT_UNKNOWN ? GAIR_NOAVATAR : GAIR_SUCCESS; } char *szContext; DBVARIANT dbv; if (getString(pai->hContact, pai->hContact ? "PictContext" : "PictObject", &dbv) == 0) { szContext = (char*)NEWSTR_ALLOCA(dbv.pszVal); db_free(&dbv); } else return GAIR_NOAVATAR; MSN_GetAvatarFileName(pai->hContact, filename, _countof(filename), NULL); pai->format = ProtoGetAvatarFormat(filename); if (pai->format != PA_FORMAT_UNKNOWN) { bool needupdate = true; if (getString(pai->hContact, "PictSavedContext", &dbv) == 0) { needupdate = mir_strcmp(dbv.pszVal, szContext) != 0; db_free(&dbv); } if (needupdate) { setString(pai->hContact, "PictSavedContext", szContext); // Store also avatar hash char* szAvatarHash = MSN_GetAvatarHash(szContext); if (szAvatarHash != NULL) { setString(pai->hContact, "AvatarSavedHash", szAvatarHash); mir_free(szAvatarHash); } } mir_tstrcpy(pai->filename, filename); return GAIR_SUCCESS; } if ((wParam & GAIF_FORCE) != 0 && pai->hContact != NULL) { if (avsPresent < 0) avsPresent = ServiceExists(MS_AV_SETMYAVATAR) != 0; if (!avsPresent) return GAIR_NOAVATAR; WORD wStatus = getWord(pai->hContact, "Status", ID_STATUS_OFFLINE); if (wStatus == ID_STATUS_OFFLINE) { delSetting(pai->hContact, "AvatarHash"); PROTO_AVATAR_INFORMATION *fakeAI = new PROTO_AVATAR_INFORMATION; *fakeAI = *pai; ForkThread(&CMsnProto::sttFakeAvatarAck, fakeAI); } else if (!getString(pai->hContact, "AvatarUrl", &dbv)) { pushAvatarRequest(pai->hContact, dbv.pszVal); db_free(&dbv); } #ifdef OBSOLETE else if (p2p_getAvatarSession(pai->hContact) == NULL) { filetransfer* ft = new filetransfer(this); ft->std.hContact = pai->hContact; ft->p2p_object = mir_strdup(szContext); MSN_GetAvatarFileName(pai->hContact, filename, _countof(filename), _T("unk")); ft->std.tszCurrentFile = mir_tstrdup(filename); p2p_invite(MSN_APPID_AVATAR, ft, NULL); } #endif return GAIR_WAITFOR; } return GAIR_NOAVATAR; }