summaryrefslogtreecommitdiff
path: root/protocols/MSN/src
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2017-06-05 14:14:54 +0300
committerGeorge Hazan <ghazan@miranda.im>2017-06-05 14:14:54 +0300
commit9a80a756aa3bee92b85e09466b234c4c26c744b4 (patch)
tree5e6de095198102dee23e6ea4ba1d96e00c385753 /protocols/MSN/src
parent0407b43e6cab29046775ecaf73b31f2a7ee3b95b (diff)
MSN
- fix for rare crash; - all pre-MSNP24 code removed
Diffstat (limited to 'protocols/MSN/src')
-rw-r--r--protocols/MSN/src/msn_auth.cpp200
-rw-r--r--protocols/MSN/src/msn_chat.cpp4
-rw-r--r--protocols/MSN/src/msn_commands.cpp1297
-rw-r--r--protocols/MSN/src/msn_contact.cpp46
-rw-r--r--protocols/MSN/src/msn_errors.cpp6
-rw-r--r--protocols/MSN/src/msn_ftold.cpp369
-rw-r--r--protocols/MSN/src/msn_lists.cpp24
-rw-r--r--protocols/MSN/src/msn_menu.cpp132
-rw-r--r--protocols/MSN/src/msn_misc.cpp228
-rw-r--r--protocols/MSN/src/msn_msgqueue.cpp183
-rw-r--r--protocols/MSN/src/msn_natdetect.cpp471
-rw-r--r--protocols/MSN/src/msn_opts.cpp33
-rw-r--r--protocols/MSN/src/msn_p2p.cpp2328
-rw-r--r--protocols/MSN/src/msn_p2ps.cpp275
-rw-r--r--protocols/MSN/src/msn_proto.cpp217
-rw-r--r--protocols/MSN/src/msn_proto.h159
-rw-r--r--protocols/MSN/src/msn_srv.cpp11
-rw-r--r--protocols/MSN/src/msn_svcs.cpp133
-rw-r--r--protocols/MSN/src/msn_switchboard.cpp26
-rw-r--r--protocols/MSN/src/msn_threads.cpp329
-rw-r--r--protocols/MSN/src/msn_ws.cpp60
-rw-r--r--protocols/MSN/src/stdafx.h100
-rw-r--r--protocols/MSN/src/version.h6
23 files changed, 258 insertions, 6379 deletions
diff --git a/protocols/MSN/src/msn_auth.cpp b/protocols/MSN/src/msn_auth.cpp
index 1ef0c8c3bc..a805672f17 100644
--- a/protocols/MSN/src/msn_auth.cpp
+++ b/protocols/MSN/src/msn_auth.cpp
@@ -146,7 +146,7 @@ static const char authPacket[] =
/////////////////////////////////////////////////////////////////////////////////////////
// Tokens, tokens, tokens.....
-GenericToken::GenericToken(const char *pszTokenName):
+GenericToken::GenericToken(const char *pszTokenName) :
m_pszTokenName(pszTokenName),
m_pszToken(NULL),
m_tExpires(0),
@@ -157,7 +157,6 @@ GenericToken::GenericToken(const char *pszTokenName):
GenericToken::~GenericToken()
{
mir_free(m_pszToken);
-// mir_free(m_pszRefreshToken);
}
bool GenericToken::Load()
@@ -190,11 +189,11 @@ void GenericToken::Save()
bool GenericToken::Expired(time_t t)
{
- return t+3600 >= m_tExpires;
+ return t + 3600 >= m_tExpires;
}
void GenericToken::SetToken(const char *pszToken, time_t tExpires)
-{
+{
replaceStr(m_pszToken, pszToken);
m_tExpires = tExpires;
Save();
@@ -219,7 +218,7 @@ void GenericToken::Clear()
m_proto->delSetting(szTokenName);
}
-OAuthToken::OAuthToken(const char *pszTokenName, const char *pszService, bool bPrependT):
+OAuthToken::OAuthToken(const char *pszTokenName, const char *pszService, bool bPrependT) :
GenericToken(pszTokenName),
m_pszService(pszService),
m_bPreprendT(bPrependT)
@@ -244,7 +243,7 @@ bool OAuthToken::Refresh(bool bForce)
return true;
}
-SkypeToken::SkypeToken(const char *pszTokenName):
+SkypeToken::SkypeToken(const char *pszTokenName) :
GenericToken(pszTokenName)
{
}
@@ -267,16 +266,17 @@ bool SkypeToken::Refresh(bool bForce)
CMStringA szPOST;
if (m_proto->MyOptions.netId == NETID_SKYPE) {
BYTE digest[16];
- char szPassword[100]={0};
+ char szPassword[100] = { 0 };
- int cbPasswd=mir_snprintf(szPassword, sizeof(szPassword), "%s\nskyper\n", m_proto->MyOptions.szEmail);
+ int cbPasswd = mir_snprintf(szPassword, sizeof(szPassword), "%s\nskyper\n", m_proto->MyOptions.szEmail);
if (db_get_static(NULL, m_proto->m_szModuleName, "Password", szPassword + cbPasswd, sizeof(szPassword) - cbPasswd - 1))
return false;
mir_md5_hash((BYTE*)szPassword, mir_strlen(szPassword), digest);
mir_base64_encodebuf(digest, sizeof(digest), szPassword, sizeof(szPassword));
nlhr.szUrl = "https://api.skype.com/login/skypetoken";
szPOST.Format("scopes=client&clientVersion=%s&username=%s&passwordHash=%s", msnProductVer, m_proto->MyOptions.szEmail, szPassword);
- } else {
+ }
+ else {
// Get skype_token
nlhr.szUrl = "https://api.skype.com/rps/skypetoken";
szPOST.Format("scopes=client&clientVersion=%s&access_token=%s&partner=999", msnProductVer, m_proto->authSkypeComToken.Token());
@@ -290,7 +290,7 @@ bool SkypeToken::Refresh(bool bForce)
m_proto->mHttpsTS = clock();
bool bRet = false;
- if (nlhrReply) {
+ if (nlhrReply) {
m_proto->hHttpsConnection = nlhrReply->nlc;
if (nlhrReply->resultCode == 200 && nlhrReply->pData) {
@@ -307,7 +307,8 @@ bool SkypeToken::Refresh(bool bForce)
}
}
Netlib_FreeHttpRequest(nlhrReply);
- } else m_proto->hHttpsConnection = NULL;
+ }
+ else m_proto->hHttpsConnection = NULL;
return bRet;
}
@@ -316,7 +317,7 @@ const char* SkypeToken::XSkypetoken()
Refresh();
if (m_pszToken) {
char *pszRet = strchr(m_pszToken, ' ');
- if (pszRet) return pszRet+1;
+ if (pszRet) return pszRet + 1;
}
return NULL;
}
@@ -401,7 +402,7 @@ int CMsnProto::MSN_GetPassportAuth(void)
ezxml_t xml_expires = ezxml_get(tokr, "wst:Lifetime", 0, "wsu:Expires", -1);
time_t expires;
- expires = xml_expires?IsoToUnixTime(ezxml_txt(xml_expires)):time(NULL)+86400;
+ expires = xml_expires ? IsoToUnixTime(ezxml_txt(xml_expires)) : time(NULL) + 86400;
if (mir_strcmp(addr, "http://Passport.NET/tb") == 0) {
@@ -652,10 +653,10 @@ CMStringA CMsnProto::HotmailLogin(const char* url)
}
/* 1 - Login successful
- 0 - Login failed
- -1 - Loading Skylogin library failed
- -2 - Functions cannot be loaded from Skylogin library
- -3 - Initializing Skylogin library failed
+ 0 - Login failed
+ -1 - Loading Skylogin library failed
+ -2 - Functions cannot be loaded from Skylogin library
+ -3 - Initializing Skylogin library failed
*/
int CMsnProto::MSN_SkypeAuth(const char *pszNonce, char *pszUIC)
{
@@ -670,8 +671,7 @@ int CMsnProto::MSN_SkypeAuth(const char *pszNonce, char *pszUIC)
SkyLogin_SetLogFunction(hLogin, debugLogSkyLoginA, this);
if (!db_get_static(NULL, m_szModuleName, "Password", szPassword, sizeof(szPassword))) {
if (SkyLogin_LoadCredentials(hLogin, MyOptions.szEmail) ||
- SkyLogin_PerformLogin(hLogin, MyOptions.szEmail, szPassword))
- {
+ SkyLogin_PerformLogin(hLogin, MyOptions.szEmail, szPassword)) {
if (SkyLogin_CreateUICString(hLogin, pszNonce, pszUIC))
iRet = 1;
}
@@ -684,7 +684,7 @@ int CMsnProto::MSN_SkypeAuth(const char *pszNonce, char *pszUIC)
}
/* 1 - Login successful
- 0 - Login failed
+ 0 - Login failed
*/
int CMsnProto::LoginSkypeOAuth(const char *pRefreshToken)
@@ -697,22 +697,21 @@ int CMsnProto::LoginSkypeOAuth(const char *pRefreshToken)
CMStringA szLoginToken;
SkyLogin_SetLogFunction(hLogin, debugLogSkyLoginA, this);
if (RefreshOAuth(pRefreshToken, "service::login.skype.com::MBI_SSL", &szLoginToken, nullptr, nullptr) &&
- SkyLogin_PerformLoginOAuth(hLogin, szLoginToken))
- {
+ SkyLogin_PerformLoginOAuth(hLogin, szLoginToken)) {
char szUIC[1024];
if (SkyLogin_GetCredentialsUIC(hLogin, szUIC)) {
char *pszPartner;
replaceStr(authUIC, szUIC);
iRet = 1;
- if (pszPartner = SkyLogin_GetUser(hLogin))
+ if (pszPartner = SkyLogin_GetUser(hLogin))
setString("SkypePartner", pszPartner);
}
}
else
iRet = 0;
SkyLogin_Exit(hLogin);
- }
+ }
return iRet;
}
@@ -729,10 +728,10 @@ static int CopyCookies(NETLIBHTTPREQUEST *nlhrReply, NETLIBHTTPHEADER *hdr)
for (i = 0; i < nlhrReply->headersCount; i++) {
if (mir_strcmpi(nlhrReply->headers[i].szName, "Set-Cookie"))
continue;
- if (p=strchr(nlhrReply->headers[i].szValue, ';')) *p=0;
+ if (p = strchr(nlhrReply->headers[i].szValue, ';')) *p = 0;
if (hdr) {
- if (*hdr->szValue) mir_strcat (hdr->szValue, "; ");
- mir_strcat (hdr->szValue, nlhrReply->headers[i].szValue);
+ if (*hdr->szValue) mir_strcat(hdr->szValue, "; ");
+ mir_strcat(hdr->szValue, nlhrReply->headers[i].szValue);
}
else nSize += (int)mir_strlen(nlhrReply->headers[i].szValue) + 2;
}
@@ -740,7 +739,7 @@ static int CopyCookies(NETLIBHTTPREQUEST *nlhrReply, NETLIBHTTPHEADER *hdr)
}
/*
- pszService:
+ pszService:
service::login.skype.com::MBI_SSL - For LoginSkypeOAuth
service::ssl.live.com::MBI_SSL - For ssl-compact-ticket
service::contacts.msn.com::MBI_SSL - Contact SOAP service -> authContactToken
@@ -772,7 +771,7 @@ bool CMsnProto::RefreshOAuth(const char *pszRefreshToken, const char *pszService
nlhr.headers[2].szName = "Cookie";
nlhr.headers[2].szValue = authCookies;
post.Format("client_id=00000000480BC46C&scope=%s&grant_type=refresh_token&refresh_token=%s", ptrA(mir_urlEncode(pszService)), pszRefreshToken);
-
+
nlhr.pData = (char*)(const char*)post;
nlhr.dataLength = (int)mir_strlen(nlhr.pData);
nlhr.szUrl = "https://login.live.com/oauth20_token.srf";
@@ -781,7 +780,7 @@ bool CMsnProto::RefreshOAuth(const char *pszRefreshToken, const char *pszService
mHttpsTS = clock();
NETLIBHTTPREQUEST *nlhrReply = Netlib_HttpTransaction(hNetlibUserHttps, &nlhr);
mHttpsTS = clock();
- if (nlhrReply) {
+ if (nlhrReply) {
hHttpsConnection = nlhrReply->nlc;
if (nlhrReply->resultCode == 200 && nlhrReply->pData) {
JSONROOT root(nlhrReply->pData);
@@ -793,7 +792,7 @@ bool CMsnProto::RefreshOAuth(const char *pszRefreshToken, const char *pszService
if (pszAccessToken->IsEmpty())
bRet = false;
}
-
+
if (pszOutRefreshToken) {
*pszOutRefreshToken = (*root)["refresh_token"].as_mstring();
if (pszOutRefreshToken->IsEmpty())
@@ -861,7 +860,8 @@ void CMsnProto::SaveAuthTokensDB(void)
setString("authRefreshToken", authRefreshToken);
}
-typedef struct {
+typedef struct
+{
/* Internal */
IEEmbed *pEmbed;
/* Input */
@@ -875,16 +875,15 @@ typedef struct {
LRESULT CALLBACK AuthWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
- switch (uMsg)
- {
- case WM_SIZE:
+ switch (uMsg) {
+ case WM_SIZE:
{
IEAUTH_PARAM *pAuth = (IEAUTH_PARAM*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
if (pAuth && pAuth->pEmbed) pAuth->pEmbed->ResizeBrowser();
return(0);
}
- case WM_CREATE:
+ case WM_CREATE:
{
IEAUTH_PARAM *pAuth = (IEAUTH_PARAM*)((LPCREATESTRUCT)lParam)->lpCreateParams;
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pAuth);
@@ -896,7 +895,7 @@ LRESULT CALLBACK AuthWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPar
return(0);
}
- case UM_DOCCOMPLETE:
+ case UM_DOCCOMPLETE:
{
if (!lParam) return 1;
IEAUTH_PARAM *pAuth = (IEAUTH_PARAM*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
@@ -929,7 +928,7 @@ LRESULT CALLBACK AuthWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPar
(pAuth->pszCookies = (char*)mir_alloc(cbCookie))) {
fpInternetGetCookieExA("https://login.live.com", NULL, pAuth->pszCookies, &cbCookie, INTERNET_COOKIE_HTTPONLY, NULL);
}
- else pAuth->pszCookies = mir_u2a(pAuth->pEmbed->getCookies());
+ else pAuth->pszCookies = mir_u2a(pAuth->pEmbed->getCookies());
PostMessage(hwnd, WM_CLOSE, 0, 0);
}
else if (wcsstr((WCHAR*)lParam, L"res=cancel") || wcsstr((WCHAR*)lParam, L"access_denied")) {
@@ -938,12 +937,12 @@ LRESULT CALLBACK AuthWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPar
return(0);
}
- case WM_CLOSE:
- DestroyWindow(hwnd);
- PostQuitMessage(0);
- break;
+ case WM_CLOSE:
+ DestroyWindow(hwnd);
+ PostQuitMessage(0);
+ break;
- case WM_DESTROY:
+ case WM_DESTROY:
{
IEAUTH_PARAM *pAuth = (IEAUTH_PARAM*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
if (pAuth && pAuth->pEmbed) delete pAuth->pEmbed;
@@ -960,28 +959,27 @@ void __cdecl CMsnProto::msn_IEAuthThread(void *pParam)
{
HWND hWnd;
MSG msg;
- WNDCLASSEX wc={0};
- static const wchar_t *ClassName = L"SkypeLoginWindow";
-
- CoInitialize(NULL);
-
- wc.cbSize = sizeof(WNDCLASSEX);
- wc.cbWndExtra = sizeof(void*);
- wc.hInstance = g_hInst;
- wc.lpfnWndProc = AuthWindowProc;
- wc.lpszClassName = ClassName;
- RegisterClassEx(&wc);
-
- if ((hWnd = CreateWindowEx(0, ClassName, L"MSN Login", WS_OVERLAPPEDWINDOW,
- CW_USEDEFAULT, CW_USEDEFAULT, 640, 480,
- HWND_DESKTOP, NULL, g_hInst, pParam))) {
- ShowWindow( hWnd, SW_SHOW );
- UpdateWindow( hWnd );
-
- while( GetMessage(&msg, NULL, 0, 0) )
- {
- TranslateMessage( &msg );
- DispatchMessage( &msg );
+ WNDCLASSEX wc = { 0 };
+ static const wchar_t *ClassName = L"SkypeLoginWindow";
+
+ CoInitialize(NULL);
+
+ wc.cbSize = sizeof(WNDCLASSEX);
+ wc.cbWndExtra = sizeof(void*);
+ wc.hInstance = g_hInst;
+ wc.lpfnWndProc = AuthWindowProc;
+ wc.lpszClassName = ClassName;
+ RegisterClassEx(&wc);
+
+ if ((hWnd = CreateWindowEx(0, ClassName, L"MSN Login", WS_OVERLAPPEDWINDOW,
+ CW_USEDEFAULT, CW_USEDEFAULT, 640, 480,
+ HWND_DESKTOP, NULL, g_hInst, pParam))) {
+ ShowWindow(hWnd, SW_SHOW);
+ UpdateWindow(hWnd);
+
+ while (GetMessage(&msg, NULL, 0, 0)) {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
}
}
@@ -994,22 +992,23 @@ bool CMsnProto::parseLoginPage(char *pszHTML, NETLIBHTTPREQUEST *nlhr, CMStringA
char *pPPFT, *pEnd;
/* Get PPFT */
- if ((pPPFT = strstr(pszHTML, "name=\"PPFT\"")) && (pPPFT = strstr(pPPFT, "value=\"")) && (pEnd=strchr(pPPFT+7, '"'))) {
- *pEnd=0;
- pPPFT+=7;
+ if ((pPPFT = strstr(pszHTML, "name=\"PPFT\"")) && (pPPFT = strstr(pPPFT, "value=\"")) && (pEnd = strchr(pPPFT + 7, '"'))) {
+ *pEnd = 0;
+ pPPFT += 7;
/* Get POST URL if available */
- if ((nlhr->szUrl = strstr(pszHTML, "urlPost:'")) && (pEnd=strchr(nlhr->szUrl+9, '\''))) {
- *pEnd=0;
+ if ((nlhr->szUrl = strstr(pszHTML, "urlPost:'")) && (pEnd = strchr(nlhr->szUrl + 9, '\''))) {
+ *pEnd = 0;
nlhr->szUrl += 9;
- } else nlhr->szUrl = POST_URL;
+ }
+ else nlhr->szUrl = POST_URL;
/* Create POST data */
char szPassword[100];
if (db_get_static(NULL, m_szModuleName, "Password", szPassword, sizeof(szPassword)))
return false;
szPassword[99] = 0;
- post->Format("PPFT=%s&login=%s&passwd=%s", ptrA(mir_urlEncode(pPPFT)),
+ post->Format("PPFT=%s&login=%s&passwd=%s", ptrA(mir_urlEncode(pPPFT)),
ptrA(mir_urlEncode(MyOptions.szEmail)), ptrA(mir_urlEncode(szPassword)));
/* Do the login and get the required tokens */
@@ -1026,54 +1025,54 @@ bool CMsnProto::parseLoginPage(char *pszHTML, NETLIBHTTPREQUEST *nlhr, CMStringA
int CMsnProto::MSN_RefreshOAuthTokens(bool bJustCheck)
{
time_t t;
- int i=authMethod==2?0:1, iRet;
- OAuthToken *tokens[] = {&authStrToken, &authContactToken, &authStorageToken, &authSSLToken, &authSkypeComToken};
+ int i = authMethod == 2 ? 0 : 1, iRet;
+ OAuthToken *tokens[] = { &authStrToken, &authContactToken, &authStorageToken, &authSSLToken, &authSkypeComToken };
time(&t);
if (bJustCheck) {
- for (;i<sizeof(tokens)/sizeof(tokens[0]);i++)
+ for (; i < sizeof(tokens) / sizeof(tokens[0]); i++)
if (tokens[i]->Expired(t)) return 1;
return 0;
}
- for (iRet=0;i<sizeof(tokens)/sizeof(tokens[0]);i++) {
+ for (iRet = 0; i < sizeof(tokens) / sizeof(tokens[0]); i++) {
if (tokens[i]->Expired())
- iRet=tokens[i]->Refresh(true)?1:-1;
+ iRet = tokens[i]->Refresh(true) ? 1 : -1;
}
return iRet;
}
-void CMsnProto::MSN_SendATH(ThreadData* info)
+void CMsnProto::MSN_SendATH(ThreadData *info)
{
- if (MyOptions.netId!=NETID_SKYPE) {
+ if (MyOptions.netId != NETID_SKYPE) {
/* MSN account login */
- switch (authMethod)
- {
- case 1:
+ switch (authMethod) {
+ case 1:
info->sendPacketPayload("ATH", "CON\\USER",
"<user><ssl-compact-ticket>t=%s</ssl-compact-ticket>"
"<uic>%s</uic>"
- "<id>%s</id><alias>%s</alias></user>\r\n",
- (const char*)authSSLToken ? ptrA(HtmlEncode(authSSLToken)) : "",
- authUIC,
+ "<id>%s</id><alias>%s</alias></user>\r\n",
+ (const char*)authSSLToken ? ptrA(HtmlEncode(authSSLToken)) : "",
+ authUIC,
GetMyUsername(NETID_MSN), GetMyUsername(NETID_SKYPE));
break;
- case 2:
+ case 2:
info->sendPacketPayload("ATH", "CON\\USER",
"<user><ssl-compact-ticket>%s</ssl-compact-ticket>"
"<uic>%s</uic>"
"<ssl-site-name>chatservice.live.com</ssl-site-name>"
- "</user>\r\n",
+ "</user>\r\n",
(const char*)authStrToken ? ptrA(HtmlEncode(authStrToken)) : "",
authUIC);
break;
}
- } else {
+ }
+ else {
info->sendPacketPayload("ATH", "CON\\USER",
- "<user><uic>%s</uic><id>%s</id></user>\r\n",
+ "<user><uic>%s</uic><id>%s</id></user>\r\n",
authUIC, MyOptions.szEmail);
}
}
@@ -1112,7 +1111,7 @@ int CMsnProto::MSN_AuthOAuth(void)
NETLIBHTTPREQUEST *nlhrReply = Netlib_HttpTransaction(hNetlibUserHttps, &nlhr);
mHttpsTS = clock();
- if (nlhrReply) {
+ if (nlhrReply) {
hHttpsConnection = nlhrReply->nlc;
if (nlhrReply->resultCode == 200 && nlhrReply->pData) {
@@ -1137,11 +1136,11 @@ int CMsnProto::MSN_AuthOAuth(void)
NETLIBHTTPREQUEST *nlhrReply2 = Netlib_HttpTransaction(hNetlibUserHttps, &nlhr);
mHttpsTS = clock();
if (nlhrReply2) {
- char *pszURL=NULL, *pAccessToken, *pEnd;
+ char *pszURL = NULL, *pAccessToken, *pEnd;
hHttpsConnection = nlhrReply2->nlc;
bPassportAuth = true;
-
+
if (nlhrReply2->resultCode == 302) {
/* Extract access_token from Location can be found */
for (int i = 0; i < nlhrReply2->headersCount; i++) {
@@ -1156,7 +1155,7 @@ int CMsnProto::MSN_AuthOAuth(void)
* window in order to let user login there. May also be used for 2-factor auth */
if (nlhrReply2->resultCode == 200 && nlhrReply2->pData) {
UINT uThreadId;
- IEAUTH_PARAM param = {NULL, this, &nlhr, nlhrReply2, NULL, NULL};
+ IEAUTH_PARAM param = { NULL, this, &nlhr, nlhrReply2, NULL, NULL };
bAskingForAuth = true;
WaitForSingleObject(ForkThreadEx(&CMsnProto::msn_IEAuthThread, &param, &uThreadId), INFINITE);
@@ -1273,11 +1272,12 @@ int CMsnProto::MSN_AuthOAuth(void)
}
else hHttpsConnection = NULL;
- if (retVal<=0) authSkypeComToken.Clear(); else {
+ if (retVal <= 0) authSkypeComToken.Clear(); else {
if (bPassportAuth) {
// Fast authentication with just 1 SOAP call supported :)
MSN_GetPassportAuth();
- } else {
+ }
+ else {
// Slow authentication required by fetching multiple tokens, i.e. 2-factor auth :(
if (authMethod == 2) authStrToken.Refresh();
authContactToken.Refresh();
@@ -1288,19 +1288,17 @@ int CMsnProto::MSN_AuthOAuth(void)
return retVal;
}
-int CMsnProto::GetMyNetID(void)
+int CMsnProto::GetMyNetID(void)
{
- return strchr(MyOptions.szEmail, '@')?NETID_MSN:NETID_SKYPE;
+ return strchr(MyOptions.szEmail, '@') ? NETID_MSN : NETID_SKYPE;
}
const char *CMsnProto::GetMyUsername(int netId)
{
static char szPartner[128];
- if (netId == NETID_SKYPE)
- {
- if (MyOptions.netId==NETID_MSN)
- {
+ if (netId == NETID_SKYPE) {
+ if (MyOptions.netId == NETID_MSN) {
if (db_get_static(NULL, m_szModuleName, "SkypePartner", szPartner, sizeof(szPartner)) == 0)
return szPartner;
}
diff --git a/protocols/MSN/src/msn_chat.cpp b/protocols/MSN/src/msn_chat.cpp
index e276f165a5..9653c829b4 100644
--- a/protocols/MSN/src/msn_chat.cpp
+++ b/protocols/MSN/src/msn_chat.cpp
@@ -421,10 +421,6 @@ INT_PTR CALLBACK DlgInviteToChat(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM l
GCThreadData *info = NULL;
if (param->id)
info = param->ppro->MSN_GetThreadByChatId(param->id);
- /*else if (param->hContact) {
- if (!param->ppro->MSN_IsMeByContact(param->hContact, tEmail))
- info = param->ppro->MSN_GetThreadByContact(tEmail);
- }*/
HWND hwndList = GetDlgItem(hwndDlg, IDC_CCLIST);
STRLIST *cont = new STRLIST;
diff --git a/protocols/MSN/src/msn_commands.cpp b/protocols/MSN/src/msn_commands.cpp
index bfbd1b0fe3..f8662107a3 100644
--- a/protocols/MSN/src/msn_commands.cpp
+++ b/protocols/MSN/src/msn_commands.cpp
@@ -23,55 +23,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "stdafx.h"
#include "msn_proto.h"
-#ifdef OBSOLETE
-void CMsnProto::MSN_SetMirVer(MCONTACT hContact, DWORD dwValue, bool always)
-{
- static const char* MirVerStr[] =
- {
- "MSN 4.x-5.x",
- "MSN 6.0",
- "MSN 6.1",
- "MSN 6.2",
- "MSN 7.0",
- "MSN 7.5",
- "WLM 8.0",
- "WLM 8.1",
- "WLM 8.5",
- "WLM 9.0 Beta",
- "WLM 2009",
- "WLM 2011",
- "WLM 2012",
- "WLM Unknown",
- };
-
- LPCSTR szVersion;
-
- if (dwValue == 0)
- szVersion = "Windows Phone";
- else if (dwValue & 0x1)
- szVersion = "MSN Mobile";
- else if (dwValue & 0x200)
- szVersion = "Webmessenger";
- else if (dwValue == 0x800800)
- szVersion = "Yahoo";
- else if (dwValue == 0x800)
- szVersion = "LCS";
- else if (dwValue == 0x50000000)
- szVersion = "Miranda IM 0.5.x (MSN v.0.5.x)";
- else if (dwValue == 0x30000024)
- szVersion = "Miranda IM 0.4.x (MSN v.0.4.x)";
- else if (always || getByte(hContact, "StdMirVer", 0)) {
- unsigned wlmId = min(dwValue >> 28 & 0xff, _countof(MirVerStr) - 1);
- szVersion = MirVerStr[wlmId];
- }
- else
- return;
-
- setString(hContact, "MirVer", szVersion);
- setByte(hContact, "StdMirVer", 1);
-}
-#endif
-
void CMsnProto::MSN_SetMirVer(MCONTACT hContact, MsnPlace *place)
{
static const char* MirVerStr[] =
@@ -416,31 +367,6 @@ void CMsnProto::MSN_ReceiveMessage(ThreadData* info, char* cmdString, char* para
sttNotificationMessage(msgBody, true);
else if (!_strnicmp(tContentType, "text/x-msmsgsoimnotification", 28))
sttNotificationMessage(msgBody, false);
-#ifdef OBSOLETE
- else if (!_strnicmp(tContentType, "text/x-msmsgsinvite", 19))
- MSN_InviteMessage(info, msgBody, email, nick);
- else if (!_strnicmp(tContentType, "application/x-msnmsgrp2p", 24)) {
- const char* dest = tHeader["P2P-Dest"];
- if (dest) {
- char *szEmail, *szInst;
- parseWLID(NEWSTR_ALLOCA(dest), NULL, &szEmail, &szInst);
-
- if (mir_strcmpi(szEmail, MyOptions.szEmail) == 0) {
- const char* src = tHeader["P2P-Src"];
- if (src == NULL) src = email;
-
- if (szInst == NULL)
- p2p_processMsg(info, msgBody, src);
- else if (mir_strcmpi(szInst, MyOptions.szMachineGuidP2P) == 0)
- p2p_processMsgV2(info, msgBody, src);
- }
- }
- }
- else if (!_strnicmp(tContentType, "text/x-mms-emoticon", 19))
- MSN_CustomSmiley(msgBody, email, nick, MSN_APPID_CUSTOMSMILEY);
- else if (!_strnicmp(tContentType, "text/x-mms-animemoticon", 23))
- MSN_CustomSmiley(msgBody, email, nick, MSN_APPID_CUSTOMANIMATEDSMILEY);
-#endif
mir_free(mChatID);
mir_free(newbody);
@@ -742,132 +668,24 @@ void CMsnProto::MSN_ProcessStatusMessage(ezxml_t xmli, const char* wlid)
unsigned cap2 = end && *end == ':' ? strtoul(end + 1, NULL, 10) : 0;
Lists_AddPlace(szEmail, id, cap1, cap2);
- } else if (!mir_strcmp(n, "PE")) {
+ }
+ else if (!mir_strcmp(n, "PE")) {
MsnPlace *place = Lists_GetPlace(szEmail, ezxml_attr(endp, "epid"));
- if (place)
- {
+ if (place) {
place->client = atoi(ezxml_txt(ezxml_child(endp, "TYP")));
mir_strncpy(place->szClientVer, ezxml_txt(ezxml_child(endp, "VER")), sizeof(place->szClientVer));
}
}
}
- {
- ptrW tszStatus(mir_utf8decodeW(szStatMsg));
- if (szInst) MSN_SetMirVer(hContact, Lists_GetPlace(szEmail, szInst));
- else {
- MsnContact *cont = Lists_Get(hContact);
- if (cont->places.getCount() > 0) MSN_SetMirVer(hContact, &cont->places[0]);
- }
- ProtoBroadcastAck(hContact, ACKTYPE_AWAYMSG, ACKRESULT_SUCCESS, NULL, tszStatus);
- }
-
-#ifdef OBSOLETE
- // Process current media info
- const char* szCrntMda = ezxml_txt(ezxml_child(xmli, "CurrentMedia"));
- if (!*szCrntMda) {
- delSetting(hContact, "ListeningTo");
- return;
- }
-
- // Get parts separeted by "\\0"
- char *parts[16];
- unsigned pCount;
-
- char* p = (char*)szCrntMda;
- for (pCount = 0; pCount < _countof(parts); ++pCount) {
- parts[pCount] = p;
-
- char* p1 = strstr(p, "\\0");
- if (p1 == NULL) break;
-
- *p1 = '\0';
- p = p1 + 2;
- }
-
- // Now let's mount the final string
- if (pCount <= 4) {
- delSetting(hContact, "ListeningTo");
- return;
- }
-
- // Check if there is any info in the string
- bool foundUsefullInfo = false;
- for (unsigned i = 4; i < pCount; i++) {
- if (parts[i][0] != '\0') {
- foundUsefullInfo = true;
- break;
- }
- }
- if (!foundUsefullInfo) {
- delSetting(hContact, "ListeningTo");
- return;
- }
-
- if (!ServiceExists(MS_LISTENINGTO_GETPARSEDTEXT) ||
- !ServiceExists(MS_LISTENINGTO_OVERRIDECONTACTOPTION) ||
- !CallService(MS_LISTENINGTO_OVERRIDECONTACTOPTION, 0, hContact))
- {
- // User contact options
- char *format = mir_strdup(parts[3]);
- char *unknown = NULL;
- if (ServiceExists(MS_LISTENINGTO_GETUNKNOWNTEXT))
- unknown = mir_utf8encodeW((wchar_t *)CallService(MS_LISTENINGTO_GETUNKNOWNTEXT, 0, 0));
-
- for (unsigned i = 4; i < pCount; i++) {
- char part[16];
- size_t lenPart = mir_snprintf(part, "{%d}", i - 4);
- if (parts[i][0] == '\0' && unknown != NULL)
- parts[i] = unknown;
- size_t lenPartsI = mir_strlen(parts[i]);
- for (p = strstr(format, part); p; p = strstr(p + lenPartsI, part)) {
- if (lenPart < lenPartsI) {
- int loc = p - format;
- format = (char *)mir_realloc(format, mir_strlen(format) + (lenPartsI - lenPart) + 1);
- p = format + loc;
- }
- memmove(p + lenPartsI, p + lenPart, mir_strlen(p + lenPart) + 1);
- memmove(p, parts[i], lenPartsI);
- }
- }
-
- setStringUtf(hContact, "ListeningTo", format);
- mir_free(unknown);
- mir_free(format);
- }
+ if (szInst)
+ MSN_SetMirVer(hContact, Lists_GetPlace(szEmail, szInst));
else {
- // Use user options
- LISTENINGTOINFO lti = { 0 };
- lti.cbSize = sizeof(LISTENINGTOINFO);
-
- lti.ptszTitle = mir_utf8decodeW(parts[4]);
- if (pCount > 5) lti.ptszArtist = mir_utf8decodeW(parts[5]);
- if (pCount > 6) lti.ptszAlbum = mir_utf8decodeW(parts[6]);
- if (pCount > 7) lti.ptszTrack = mir_utf8decodeW(parts[7]);
- if (pCount > 8) lti.ptszYear = mir_utf8decodeW(parts[8]);
- if (pCount > 9) lti.ptszGenre = mir_utf8decodeW(parts[9]);
- if (pCount > 10) lti.ptszLength = mir_utf8decodeW(parts[10]);
- if (pCount > 11) lti.ptszPlayer = mir_utf8decodeW(parts[11]);
- else lti.ptszPlayer = mir_utf8decodeW(parts[0]);
- if (pCount > 12) lti.ptszType = mir_utf8decodeW(parts[12]);
- else lti.ptszType = mir_utf8decodeW(parts[1]);
-
- wchar_t *cm = (wchar_t *)CallService(MS_LISTENINGTO_GETPARSEDTEXT, (WPARAM)L"%title% - %artist%", (LPARAM)&lti);
- setWString(hContact, "ListeningTo", cm);
-
- mir_free(cm);
-
- mir_free(lti.ptszArtist);
- mir_free(lti.ptszAlbum);
- mir_free(lti.ptszTitle);
- mir_free(lti.ptszTrack);
- mir_free(lti.ptszYear);
- mir_free(lti.ptszGenre);
- mir_free(lti.ptszLength);
- mir_free(lti.ptszPlayer);
- mir_free(lti.ptszType);
+ MsnContact *cont = Lists_Get(hContact);
+ if (cont->places.getCount() > 0)
+ MSN_SetMirVer(hContact, &cont->places[0]);
}
-#endif
+ ProtoBroadcastAck(hContact, ACKTYPE_AWAYMSG, ACKRESULT_SUCCESS, NULL, ptrW(mir_utf8decodeW(szStatMsg)));
}
void CMsnProto::MSN_ProcessNotificationMessage(char* buf, size_t len)
@@ -1055,11 +873,8 @@ LBL_InvalidCommand:
MSN_SendATH(info);
bSentBND = false;
- if (!hKeepAliveThreadEvt) ForkThread(&CMsnProto::msn_keepAliveThread, NULL);
-#ifdef OBSOLETE
- /* FIXME: Currently disabled, as P2P maybe not working anymore in MSNP24? */
- ForkThread(&CMsnProto::MSNConnDetectThread, NULL);
-#endif
+ if (!hKeepAliveThreadEvt)
+ ForkThread(&CMsnProto::msn_keepAliveThread, NULL);
}
break;
@@ -1398,1093 +1213,3 @@ LBL_InvalidCommand:
return 0;
}
-
-
-#ifdef OBSOLETE
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// Starts a file sending thread
-
-void MSN_ConnectionProc(HANDLE hNewConnection, DWORD /* dwRemoteIP */, void* extra)
-{
- CMsnProto *proto = (CMsnProto*)extra;
-
- proto->debugLogA("File transfer connection accepted");
-
- NETLIBCONNINFO connInfo = {};
- Netlib_GetConnectionInfo(hNewConnection, &connInfo);
-
- ThreadData* T = proto->MSN_GetThreadByPort(connInfo.wPort);
- if (T != NULL && T->s == NULL) {
- T->s = hNewConnection;
- ReleaseSemaphore(T->hWaitEvent, 1, NULL);
- }
- else {
- proto->debugLogA("There's no registered file transfers for incoming port #%u, connection closed", connInfo.wPort);
- Netlib_CloseHandle(hNewConnection);
- }
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// Processes various invitations
-
-void CMsnProto::MSN_InviteMessage(ThreadData* info, char* msgBody, char* email, char* nick)
-{
- MimeHeaders tFileInfo;
- tFileInfo.readFromBuffer(msgBody);
-
- const char* Appname = tFileInfo["Application-Name"];
- const char* AppGUID = tFileInfo["Application-GUID"];
- const char* Invcommand = tFileInfo["Invitation-Command"];
- const char* Invcookie = tFileInfo["Invitation-Cookie"];
- const char* Appfile = tFileInfo["Application-File"];
- const char* Appfilesize = tFileInfo["Application-FileSize"];
- const char* IPAddress = tFileInfo["IP-Address"];
- const char* IPAddressInt = tFileInfo["IP-Address-Internal"];
- const char* Port = tFileInfo["Port"];
- const char* PortXInt = tFileInfo["PortX-Internal"];
- const char* AuthCookie = tFileInfo["AuthCookie"];
- const char* SessionID = tFileInfo["Session-ID"];
- const char* SessionProtocol = tFileInfo["Session-Protocol"];
- // const char* Connectivity = tFileInfo["Connectivity"];
-
- if (AppGUID != NULL) {
- if (!mir_strcmp(AppGUID, "{02D3C01F-BF30-4825-A83A-DE7AF41648AA}")) {
- MSN_ShowPopup(info->getContactHandle(),
- TranslateT("Contact tried to open an audio conference (not currently supported)"), MSN_ALLOW_MSGBOX);
- return;
- }
- }
-
- if (Invcommand && (mir_strcmp(Invcommand, "CANCEL") == 0)) {
- delete info->mMsnFtp;
- info->mMsnFtp = NULL;
- }
-
- if (Appname != NULL && Appfile != NULL && Appfilesize != NULL) // receive first
- {
- filetransfer* ft = info->mMsnFtp = new filetransfer(this);
-
- ft->std.hContact = MSN_HContactFromEmail(email, nick, true, true);
- mir_free(ft->std.tszCurrentFile);
- ft->std.tszCurrentFile = mir_utf8decodeW(Appfile);
- ft->std.totalBytes = ft->std.currentFileSize = _atoi64(Appfilesize);
- ft->std.totalFiles = 1;
- ft->szInvcookie = mir_strdup(Invcookie);
- ft->p2p_dest = mir_strdup(email);
-
- wchar_t tComment[40];
- mir_snwprintf(tComment, TranslateT("%I64u bytes"), ft->std.currentFileSize);
-
- PROTORECVFILET pre = { 0 };
- pre.dwFlags = PRFF_UNICODE;
- pre.fileCount = 1;
- pre.timestamp = time(NULL);
- pre.descr.w = tComment;
- pre.files.w = &ft->std.tszCurrentFile;
- pre.lParam = (LPARAM)ft;
- ProtoChainRecvFile(ft->std.hContact, &pre);
- return;
- }
-
- // receive Second
- if (IPAddress != NULL && Port != NULL && AuthCookie != NULL) {
- ThreadData* newThread = new ThreadData;
-
- if (inet_addr(IPAddress) != MyConnection.extIP || !IPAddressInt)
- mir_snprintf(newThread->mServer, "%s:%s", IPAddress, Port);
- else
- mir_snprintf(newThread->mServer, "%s:%u", IPAddressInt, atol(PortXInt) ^ 0x3141);
-
- newThread->mType = SERVER_FILETRANS;
-
- if (info->mMsnFtp == NULL) {
- ThreadData* otherThread = MSN_GetOtherContactThread(info);
- if (otherThread) {
- info->mMsnFtp = otherThread->mMsnFtp;
- otherThread->mMsnFtp = NULL;
- }
- }
-
- newThread->mMsnFtp = info->mMsnFtp; info->mMsnFtp = NULL;
- mir_strcpy(newThread->mCookie, AuthCookie);
-
- newThread->startThread(&CMsnProto::MSNServerThread, this);
- return;
- }
-
- // send 1
- if (Invcommand != NULL && Invcookie != NULL && Port == NULL && AuthCookie == NULL && SessionID == NULL) {
- msnftp_startFileSend(info, Invcommand, Invcookie);
- return;
- }
-
- // netmeeting send 1
- if (Appname == NULL && SessionID != NULL && SessionProtocol != NULL) {
- if (!_stricmp(Invcommand, "ACCEPT")) {
- ShellExecuteA(NULL, "open", "conf.exe", NULL, NULL, SW_SHOW);
- Sleep(3000);
-
- info->sendPacketPayload("MSG", "N",
- "MIME-Version: 1.0\r\n"
- "Content-Type: text/x-msmsgsinvite; charset=UTF-8\r\n\r\n"
- "Invitation-Command: ACCEPT\r\n"
- "Invitation-Cookie: %s\r\n"
- "Session-ID: {1A879604-D1B8-11D7-9066-0003FF431510}\r\n"
- "Launch-Application: TRUE\r\n"
- "IP-Address: %s\r\n\r\n",
- Invcookie, MyConnection.GetMyExtIPStr());
- }
- return;
- }
-
- // netmeeting receive 1
- if (Appname != NULL && !_stricmp(Appname, "NetMeeting")) {
- wchar_t text[512], *tszEmail = mir_a2u(email);
- mir_snwprintf(text, TranslateT("Accept NetMeeting request from %s?"), tszEmail);
- mir_free(tszEmail);
-
- if (MessageBox(NULL, text, TranslateT("MSN Protocol"), MB_YESNO | MB_ICONQUESTION) == IDYES) {
- info->sendPacketPayload("MSG", "N",
- "MIME-Version: 1.0\r\n"
- "Content-Type: text/x-msmsgsinvite; charset=UTF-8\r\n\r\n"
- "Invitation-Command: ACCEPT\r\n"
- "Invitation-Cookie: %s\r\n"
- "Session-ID: {A2ED5ACF-F784-4B47-A7D4-997CD8F643CC}\r\n"
- "Session-Protocol: SM1\r\n"
- "Launch-Application: TRUE\r\n"
- "Request-Data: IP-Address:\r\n"
- "IP-Address: %s\r\n\r\n",
- Invcookie, MyConnection.GetMyExtIPStr());
- }
- else {
- info->sendPacketPayload("MSG", "N",
- "MIME-Version: 1.0\r\n"
- "Content-Type: text/x-msmsgsinvite; charset=UTF-8\r\n\r\n"
- "Invitation-Command: CANCEL\r\n"
- "Invitation-Cookie: %s\r\n"
- "Cancel-Code: REJECT\r\n\r\n",
- Invcookie);
- }
- return;
- }
-
- if (IPAddress != NULL && Port == NULL && SessionID != NULL && SessionProtocol == NULL) { // netmeeting receive 2
- char ipaddr[256];
- mir_snprintf(ipaddr, "callto://%s", IPAddress);
- ShellExecuteA(NULL, "open", ipaddr, NULL, NULL, SW_SHOW);
- }
-}
-
-void CMsnProto::MSN_ProcessRemove(char* buf, size_t len)
-{
- ezxml_t xmli = ezxml_parse_str(buf, len);
- ezxml_t dom = ezxml_child(xmli, "d");
- while (dom != NULL) {
- const char* szDom = ezxml_attr(dom, "n");
- ezxml_t cont = ezxml_child(dom, "c");
- while (cont != NULL) {
- const char* szCont = ezxml_attr(cont, "n");
- int listId = atol(ezxml_attr(cont, "l"));
-
- char szEmail[128];
- mir_snprintf(szEmail, "%s@%s", szCont, szDom);
- Lists_Remove(listId, szEmail);
-
- MsnContact* msc = Lists_Get(szEmail);
- if (msc == NULL || (msc->list & (LIST_RL | LIST_FL | LIST_LL)) == 0) {
- if (msc->hContact && _stricmp(szEmail, MyOptions.szEmail)) {
- db_delete_contact(msc->hContact);
- msc->hContact = NULL;
- }
- }
-
- cont = ezxml_next(cont);
- }
- dom = ezxml_next(dom);
- }
- ezxml_free(xmli);
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// Processes custom smiley messages
-
-void CMsnProto::MSN_CustomSmiley(const char* msgBody, char* email, char* nick, int iSmileyType)
-{
- MCONTACT hContact = MSN_HContactFromEmail(email, nick, true, true);
-
- char smileyList[500] = "";
-
- const char *tok1 = msgBody, *tok2;
- char *smlp = smileyList;
- char lastsml[50];
-
- unsigned iCount = 0;
- bool parseSmiley = true;
-
- for (;;) {
- tok2 = strchr(tok1, '\t');
- if (tok2 == NULL) break;
-
- size_t sz = tok2 - tok1;
- if (parseSmiley) {
- sz = min(sz, sizeof(lastsml)-1);
- memcpy(lastsml, tok1, sz);
- lastsml[sz] = 0;
-
- memcpy(smlp, tok1, sz); smlp += sz;
- *(smlp++) = '\n'; *smlp = 0;
- ++iCount;
- }
- else {
- filetransfer* ft = new filetransfer(this);
- ft->std.hContact = hContact;
-
- ft->p2p_object = (char*)mir_alloc(sz + 1);
- memcpy(ft->p2p_object, tok1, sz);
- ft->p2p_object[sz] = 0;
-
- size_t slen = mir_strlen(lastsml);
- ptrA buf(mir_base64_encode((PBYTE)lastsml, (unsigned)slen));
- ptrA smileyName(mir_urlEncode(buf));
-
- wchar_t path[MAX_PATH];
- MSN_GetCustomSmileyFileName(hContact, path, _countof(path), smileyName, iSmileyType);
- ft->std.tszCurrentFile = mir_wstrdup(path);
-
- if (p2p_IsDlFileOk(ft))
- delete ft;
- else {
- debugLogA("Custom Smiley p2p invite for object : %s", ft->p2p_object);
- p2p_invite(iSmileyType, ft, email);
- Sleep(3000);
- }
- }
- parseSmiley = !parseSmiley;
- tok1 = tok2 + 1;
- }
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// Process user addition
-
-void CMsnProto::MSN_ProcessAdd(char* buf, size_t len)
-{
- if (buf == NULL) return;
-
- ezxml_t xmli = ezxml_parse_str(buf, len);
- ezxml_t dom = ezxml_child(xmli, "d");
- while (dom != NULL) {
- const char* szDom = ezxml_attr(dom, "n");
- ezxml_t cont = ezxml_child(dom, "c");
- while (cont != NULL) {
- const char* szCont = ezxml_attr(cont, "n");
- const char* szNick = ezxml_attr(cont, "f");
- int listId = atol(ezxml_attr(cont, "l"));
- int netId = atol(ezxml_attr(cont, "t"));
-
- char szEmail[128];
- mir_snprintf(szEmail, "%s@%s", szCont, szDom);
-
- UrlDecode((char*)szNick);
-
- if (listId == LIST_FL) {
- MCONTACT hContact = MSN_HContactFromEmail(szEmail, szNick, true, false);
- MSN_SetContactDb(hContact, szEmail);
- }
-
- if (listId == LIST_RL)
- MSN_SharingFindMembership(true);
- else
- MSN_AddUser(NULL, szEmail, netId, listId);
-
- MsnContact* msc = Lists_Get(szEmail);
- if (msc == NULL) {
- Lists_Add(listId, netId, szEmail);
- msc = Lists_Get(szEmail);
- }
-
- if (listId == LIST_RL) {
- if ((msc->list & (LIST_AL | LIST_BL)) == 0) {
- MSN_AddAuthRequest(szEmail, szNick, msc->invite);
- msc->netId = netId;
- }
- else MSN_AddUser(NULL, szEmail, netId, LIST_PL + LIST_REMOVE);
- }
-
- cont = ezxml_next(cont);
- }
- dom = ezxml_next(dom);
- }
- ezxml_free(xmli);
-}
-
-void CMsnProto::MSN_ProcessPage(char* buf, unsigned len)
-{
- if (buf == NULL) return;
- ezxml_t xmlnot = ezxml_parse_str(buf, len);
-
- ezxml_t xmlbdy = ezxml_get(xmlnot, "MSG", 0, "BODY", -1);
- const char* szMsg = ezxml_txt(ezxml_child(xmlbdy, "TEXT"));
- const char* szTel = ezxml_attr(ezxml_child(xmlnot, "FROM"), "name");
-
- if (szTel && *szMsg) {
- PROTORECVEVENT pre = { 0 };
- pre.szMessage = (char*)szMsg;
- pre.flags = PREF_UTF /*+ ((isRtl) ? PREF_RTL : 0)*/;
- pre.timestamp = time(NULL);
- ProtoChainRecvMsg(MSN_HContactFromEmail(szTel, szTel, true, true), &pre);
- }
- ezxml_free(xmlnot);
-}
-
-
-void CMsnProto::MSN_InitSB(ThreadData* info, const char* szEmail)
-{
- MsnContact *cont = Lists_Get(szEmail);
-
- if (cont->netId == NETID_MSN)
- info->sendCaps();
-
- bool typing = false;
-
- for (int i = 3; --i;) {
- MsgQueueEntry E;
- while (MsgQueue_GetNext(szEmail, E)) {
- if (E.msgType == 'X') ;
- else if (E.msgType == 2571)
- typing = E.flags != 0;
- else if (E.msgSize == 0) {
- info->sendMessage(E.msgType, NULL, 1, E.message, E.flags);
- ProtoBroadcastAck(cont->hContact, ACKTYPE_MESSAGE, ACKRESULT_SUCCESS, (HANDLE)E.seq, 0);
- }
- else {
- if (E.msgType == 'D' && !info->mBridgeInit) { //&& strchr(data.flags, ':')) {
- info->mBridgeInit = true;
-
-// P2PV2_Header hdrdata(E.message);
-// P2PV2_Header tHdr;
-// tHdr.mID = hdrdata.mID;
-// p2p_sendMsg(info, E.wlid, 0, tHdr, NULL, 0);
- }
- info->sendRawMessage(E.msgType, E.message, E.msgSize);
- }
-
- mir_free(E.message);
- mir_free(E.wlid);
-
- if (E.ft != NULL)
- info->mMsnFtp = E.ft;
- }
- mir_free(info->mInitialContactWLID); info->mInitialContactWLID = NULL;
- }
-
- if (typing)
- MSN_StartStopTyping(info, true);
-
- if (getByte("EnableDeliveryPopup", 0))
- MSN_ShowPopup(cont->hContact, info->mCaller ?
- TranslateT("Chat session established by my request") :
- TranslateT("Chat session established by contact request"), 0);
-
- PROTO_AVATAR_INFORMATION ai = { 0 };
- ai.hContact = cont->hContact;
- GetAvatarInfo(GAIF_FORCE, (LPARAM)&ai);
-}
-
-int CMsnProto::MSN_HandleCommands(ThreadData* info, char* cmdString)
-{
- char* params = "";
- int trid = -1;
-
- if (cmdString[3]) {
- if (isdigit((BYTE)cmdString[4])) {
- trid = strtol(cmdString + 4, &params, 10);
- switch (*params) {
- case ' ': case '\0': case '\t': case '\n':
- while (*params == ' ' || *params == '\t')
- params++;
- break;
-
- default:
- params = cmdString + 4;
- }
- }
- else params = cmdString + 4;
- }
-
- switch((*(PDWORD)cmdString & 0x00FFFFFF) | 0x20000000) {
- case ' KCA': //********* ACK: section 8.7 Instant Messages
- ReleaseSemaphore(info->hWaitEvent, 1, NULL);
-
- if (info->mJoinedContactsWLID.getCount() > 0 && MyOptions.SlowSend)
- ProtoBroadcastAck(info->getContactHandle(), ACKTYPE_MESSAGE, ACKRESULT_SUCCESS, (HANDLE)trid, 0);
- break;
-
- case ' YQF': //********* FQY: Find Yahoo User
- char* tWords[1];
- if (sttDivideWords(params, 1, tWords) != 1)
- debugLogA("Invalid %.3s command, ignoring", cmdString);
- else {
- size_t len = atol(tWords[0]);
- MSN_ProcessYFind((char*)HReadBuffer(info, 0).surelyRead(len), len);
- }
- break;
-
- case ' LDA': //********* ADL: Add to the list
- {
- char* tWords[1];
- if (sttDivideWords(params, 1, tWords) != 1) {
-LBL_InvalidCommand:
- debugLogA("Invalid %.3s command, ignoring", cmdString);
- break;
- }
-
- if (mir_strcmp(tWords[0], "OK") != 0) {
- size_t len = atol(tWords[0]);
- MSN_ProcessAdd((char*)HReadBuffer(info, 0).surelyRead(len), len);
- }
- }
- break;
-
- case ' SBS':
- break;
-
- case ' SNA': //********* ANS: section 8.4 Getting Invited to a Switchboard Session
- break;
-
- case ' PRP':
- break;
-
- case ' PLB': //********* BLP: section 7.6 List Retrieval And Property Management
- break;
-
- case ' EYB': //********* BYE: section 8.5 Session Participant Changes
- {
- union {
- char* tWords[2];
- // modified for chat, orginally param2 = junk
- // param 2: quit due to idle = "1", normal quit = nothing
- struct { char *userEmail, *isIdle; } data;
- };
-
- sttDivideWords(params, 2, tWords);
- UrlDecode(data.userEmail);
-
- if (strchr(data.userEmail, ';')) {
- if (info->mJoinedContactsWLID.getCount() == 1)
- p2p_clearThreadSessions((MCONTACT)info->mJoinedContactsWLID[0], info->mType);
- info->contactLeft(data.userEmail);
- break;
- }
-
- MCONTACT hContact = MSN_HContactFromEmail(data.userEmail);
-
- if (getByte("EnableSessionPopup", 0))
- MSN_ShowPopup(hContact, TranslateT("Contact left channel"), 0);
-
- // modified for chat
- {
- GCDEST gcd = { m_szModuleName, info->mChatID, GC_EVENT_QUIT };
- GCEVENT gce = { &gcd };
- gce.dwFlags = GCEF_ADDTOLOG;
- gce.ptszNick = GetContactNameT(hContact);
- gce.ptszUID = mir_a2u(data.userEmail);
- gce.time = time(NULL);
- gce.bIsMe = FALSE;
- Chat_Event(&gce);
- mir_free((void*)gce.ptszUID);
- }
-
- int personleft = info->contactLeft(data.userEmail);
-
- int temp_status = getWord(hContact, "Status", ID_STATUS_OFFLINE);
- if (temp_status == ID_STATUS_INVISIBLE && MSN_GetThreadByContact(data.userEmail) == NULL)
- setWord(hContact, "Status", ID_STATUS_OFFLINE);
-
- // see if the session is quit due to idleness
- if (info->mChatID[0] && personleft == 1) {
- if (!mir_strcmp(data.isIdle, "1")) {
- GCDEST gcd = { m_szModuleName, info->mChatID, GC_EVENT_INFORMATION };
- GCEVENT gce = { &gcd };
- gce.dwFlags = GCEF_ADDTOLOG;
- gce.bIsMe = FALSE;
- gce.time = time(NULL);
- gce.ptszText = TranslateT("This conversation has been inactive, participants will be removed.");
- Chat_Event(&gce);
- gce.ptszText = TranslateT("To resume the conversation, please quit this session and start a new chat session.");
- Chat_Event(&gce);
- }
- else {
- if (!g_bTerminated && MessageBox(NULL,
- TranslateT("There is only 1 person left in the chat, do you want to switch back to standard message window?"),
- TranslateT("MSN Chat"), MB_YESNO | MB_ICONQUESTION) == IDYES) {
- // kill chat dlg and open srmm dialog
- MSN_KillChatSession(info->mChatID);
-
- // open up srmm dialog when quit while 1 person left
- MCONTACT hContact = info->getContactHandle();
- if (hContact) CallServiceSync(MS_MSG_SENDMESSAGE, hContact, 0);
- }
- }
- }
- // this is not in chat session, quit the session when everyone left
- else if (info->mJoinedContactsWLID.getCount() < 1)
- return 1;
-
- }
- break;
-
- case ' LAC': //********* CAL: section 8.3 Inviting Users to a Switchboard Session
- break;
-
- case ' GHC': //********* CHG: section 7.7 Client States
- {
- int oldStatus = m_iStatus;
- int newStatus = MSNStatusToMiranda(params);
- if (oldStatus <= ID_STATUS_OFFLINE) {
- isConnectSuccess = true;
- int count = -1;
- for (;;) {
- MsnContact *msc = Lists_GetNext(count);
- if (msc == NULL) break;
-
- if (msc->netId == NETID_MOB)
- setWord(msc->hContact, "Status", ID_STATUS_ONTHEPHONE);
- }
- }
- if (newStatus != ID_STATUS_IDLE) {
- m_iStatus = newStatus;
- ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)oldStatus, newStatus);
- debugLogA("Status change acknowledged: %s", params);
- MSN_RemoveEmptyGroups();
- }
- if (newStatus == ID_STATUS_OFFLINE) return 1;
- }
- break;
- case ' LHC': //********* CHL: Query from Server on MSNP7
- {
- char* authChallengeInfo;
- if (sttDivideWords(params, 1, &authChallengeInfo) != 1)
- goto LBL_InvalidCommand;
-
- char dgst[64];
- MSN_MakeDigest(authChallengeInfo, dgst);
- info->sendPacket("QRY", "%s 32\r\n%s", msnProductID, dgst);
- }
- break;
-
- case ' RVC': //********* CVR: MSNP8
- break;
-
- case ' NLF': //********* FLN: section 7.9 Notification Messages
- {
- union {
- char* tWords[2];
- struct { char *userEmail, *netId; } data;
- };
-
- int tArgs = sttDivideWords(params, 2, tWords);
- if (tArgs < 2)
- goto LBL_InvalidCommand;
-
- MCONTACT hContact = MSN_HContactFromEmail(data.userEmail);
- if (hContact != NULL) {
- setWord(hContact, "Status", MSN_GetThreadByContact(data.userEmail) ? ID_STATUS_INVISIBLE : ID_STATUS_OFFLINE);
- setDword(hContact, "IdleTS", 0);
- ForkThread(&CMsnProto::MsgQueue_AllClearThread, mir_strdup(data.userEmail));
- }
- }
- break;
-
- case ' NLI':
- case ' NLN': //********* ILN/NLN: section 7.9 Notification Messages
- {
- union {
- char* tWords[5];
- struct { char *userStatus, *wlid, *userNick, *objid, *cmdstring; } data;
- };
-
- int tArgs = sttDivideWords(params, 5, tWords);
- if (tArgs < 3)
- goto LBL_InvalidCommand;
-
- if (data.cmdstring) UrlDecode(data.cmdstring);
- MSN_ProcessNLN(data.userStatus, data.wlid, data.userNick, data.objid, data.cmdstring);
- }
- break;
- case ' ORI': //******** IRO: section 8.4 Getting Invited to a Switchboard Session
- {
- union {
- char* tWords[5];
- struct { char *strThisContact, *totalContacts, *userEmail, *userNick, *flags; } data;
- };
-
- int tNumTokens = sttDivideWords(params, 5, tWords);
- if (tNumTokens < 4)
- goto LBL_InvalidCommand;
-
- info->contactJoined(data.userEmail);
-
- if (!strchr(data.userEmail, ';')) {
- UrlDecode(data.userNick);
- MCONTACT hContact = MSN_HContactFromEmail(data.userEmail, data.userNick, true, true);
-
- if (tNumTokens == 5 && mir_strcmp(data.flags, "0:0")) {
- MsnContact *cont = Lists_Get(data.userEmail);
- if (cont) {
- char* end = NULL;
- cont->cap1 = strtoul(data.flags, &end, 10);
- cont->cap2 = end && *end == ':' ? strtoul(end + 1, NULL, 10) : 0;
- }
- }
-
- int temp_status = getWord(hContact, "Status", ID_STATUS_OFFLINE);
- if (temp_status == ID_STATUS_OFFLINE && Lists_IsInList(LIST_FL, data.userEmail))
- setWord(hContact, "Status", ID_STATUS_INVISIBLE);
-
- // only start the chat session after all the IRO messages has been recieved
- if (info->mJoinedContactsWLID.getCount() > 1 && !mir_strcmp(data.strThisContact, data.totalContacts))
- MSN_ChatStart(info);
- }
- }
- break;*/
-
- case ' IOJ': //******** JOI: section 8.5 Session Participant Changes
- {
- union {
- char* tWords[3];
- struct { char *userEmail, *userNick, *flags; } data;
- };
-
- int tNumTokens = sttDivideWords(params, 3, tWords);
- if (tNumTokens < 2)
- goto LBL_InvalidCommand;
-
- UrlDecode(data.userEmail);
-
- if (strchr(data.userEmail, ';')) {
- info->contactJoined(data.userEmail);
- break;
- }
-
- if (_stricmp(MyOptions.szEmail, data.userEmail) == 0) {
- if (!info->mCaller) {
- if (info->mJoinedContactsWLID.getCount() == 1) {
- MSN_InitSB(info, info->mJoinedContactsWLID[0]);
- }
- else {
- info->sendCaps();
- if (info->mInitialContactWLID && MsgQueue_CheckContact(info->mInitialContactWLID))
- msnNsThread->sendPacket("XFR", "SB");
- mir_free(info->mInitialContactWLID); info->mInitialContactWLID = NULL;
- }
- break;
- }
-
- const char* wlid;
- do {
- wlid = MsgQueue_GetNextRecipient();
- }
- while (wlid != NULL && MSN_GetUnconnectedThread(wlid) != NULL);
-
- //can happen if both parties send first message at the same time
- if (wlid == NULL) {
- debugLogA("USR (SB) internal: thread created for no reason");
- return 1;
- }
-
- if (mir_strcmp(wlid, "chat") == 0) {
- MsgQueueEntry E;
- MsgQueue_GetNext(wlid, E);
-
- for (int i = 0; i < E.cont->getCount(); ++i)
- info->sendPacket("CAL", (*E.cont)[i]);
-
- MSN_ChatStart(info);
-
- delete E.cont;
- mir_free(E.wlid);
- break;
- }
-
- char* szEmail;
- parseWLID(NEWSTR_ALLOCA(wlid), NULL, &szEmail, NULL);
-
- info->mInitialContactWLID = mir_strdup(szEmail);
- info->sendPacket("CAL", szEmail);
- break;
- }
-
- UrlDecode(data.userNick);
- stripBBCode(data.userNick);
- stripColorCode(data.userNick);
-
- MCONTACT hContact = MSN_HContactFromEmail(data.userEmail, data.userNick, true, true);
- if (tNumTokens == 3) {
- MsnContact *cont = Lists_Get(data.userEmail);
- if (cont) {
- char* end = NULL;
- cont->cap1 = strtoul(data.flags, &end, 10);
- cont->cap2 = end && *end == ':' ? strtoul(end + 1, NULL, 10) : 0;
- }
- }
-
- mir_utf8decode(data.userNick, NULL);
- debugLogA("New contact in channel %s %s", data.userEmail, data.userNick);
-
- if (info->contactJoined(data.userEmail) <= 1)
- MSN_InitSB(info, data.userEmail);
- else {
- bool chatCreated = info->mChatID[0] != 0;
-
- info->sendCaps();
-
- if (chatCreated) {
- GCDEST gcd = { m_szModuleName, info->mChatID, GC_EVENT_JOIN };
- GCEVENT gce = { &gcd };
- gce.dwFlags = GCEF_ADDTOLOG;
- gce.ptszNick = GetContactNameT(hContact);
- gce.ptszUID = mir_a2u(data.userEmail);
- gce.ptszStatus = TranslateT("Others");
- gce.time = time(NULL);
- gce.bIsMe = FALSE;
- Chat_Event(&gce);
- mir_free((void*)gce.ptszUID);
- }
- else MSN_ChatStart(info);
- }
- }
- break;*/
-
- case ' GSM': //********* MSG: sections 8.7 Instant Messages, 8.8 Receiving an Instant Message
- MSN_ReceiveMessage(info, cmdString, params);
- break;
-
- case ' MBU':
- MSN_ReceiveMessage(info, cmdString, params);
- break;
-
- case ' KAN': //********* NAK: section 8.7 Instant Messages
- if (info->mJoinedContactsWLID.getCount() > 0 && MyOptions.SlowSend)
- ProtoBroadcastAck(info->getContactHandle(),
- ACKTYPE_MESSAGE, ACKRESULT_FAILED,
- (HANDLE)trid, (LPARAM)Translate("Message delivery failed"));
- debugLogA("Message send failed (trid=%d)", trid);
- break;
-
- case ' TON': //********* NOT: notification message
- MSN_ProcessNotificationMessage((char*)HReadBuffer(info, 0).surelyRead(trid), trid);
- break;
-
- case ' GPI': //********* IPG: mobile page
- MSN_ProcessPage((char*)HReadBuffer(info, 0).surelyRead(trid), trid);
- break;
-
- case ' FCG': //********* GCF:
- HReadBuffer(info, 0).surelyRead(atol(params));
- break;
-
- case ' TUO': //********* OUT: sections 7.10 Connection Close, 8.6 Leaving a Switchboard Session
- if (!_stricmp(params, "OTH")) {
- ProtoBroadcastAck(NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_OTHERLOCATION);
- debugLogA("You have been disconnected from the MSN server because you logged on from another location using the same MSN passport.");
- }
-
- if (!_stricmp(params, "MIG")) // ignore it
- break;
-
- return 1;
-
- case ' YRQ': //********* QRY:
- break;
-
- case ' GNQ': //********* QNG: reply to PNG
- msnPingTimeout = trid;
- if (info->mType == SERVER_NOTIFICATION && hKeepAliveThreadEvt != NULL)
- SetEvent(hKeepAliveThreadEvt);
- break;
-
- case ' LMR': //********* RML: Remove from the list
- {
- char* tWords[1];
- if (sttDivideWords(params, 1, tWords) != 1)
- goto LBL_InvalidCommand;
-
- if (mir_strcmp(tWords[0], "OK") != 0) {
- size_t len = atol(tWords[0]);
- MSN_ProcessRemove((char*)HReadBuffer(info, 0).surelyRead(len), len);
- }
- }
- break;
-
- case ' GNR': //********* RNG: section 8.4 Getting Invited to a Switchboard Session
- //note: unusual message encoding: trid==sessionid
- {
- union {
- char* tWords[8];
- struct { char *newServer, *security, *authChallengeInfo, *callerEmail, *callerNick,
- *type, *srcUrl, *genGateway; } data;
- };
-
- if (sttDivideWords(params, 8, tWords) != 8)
- goto LBL_InvalidCommand;
-
- UrlDecode(data.newServer); UrlDecode(data.callerEmail);
- UrlDecode(data.callerNick);
- stripBBCode(data.callerNick);
- stripColorCode(data.callerNick);
-
- if (mir_strcmp(data.security, "CKI")) {
- debugLogA("Unknown security package in RNG command: %s", data.security);
- break;
- }
-
- ThreadData* newThread = new ThreadData;
- mir_strcpy(newThread->mServer, data.newServer);
- newThread->gatewayType = atol(data.genGateway) != 0;
- newThread->mType = SERVER_SWITCHBOARD;
- newThread->mInitialContactWLID = mir_strdup(data.callerEmail);
- MSN_HContactFromEmail(data.callerEmail, data.callerNick, true, true);
- mir_snprintf(newThread->mCookie, "%s %d", data.authChallengeInfo, trid);
-
- ReleaseSemaphore(newThread->hWaitEvent, MSN_PACKETS_COMBINE, NULL);
-
- debugLogA("Opening caller's switchboard server '%s'...", data.newServer);
- newThread->startThread(&CMsnProto::MSNServerThread, this);
- }
- break;
-
- case ' XBU': // UBX : MSNP11+ User Status Message
- {
- union {
- char* tWords[2];
- struct { char *wlid, *datalen; } data;
- };
-
- if (sttDivideWords(params, 2, tWords) != 2)
- goto LBL_InvalidCommand;
-
- int len = atol(data.datalen);
- if (len < 0 || len > 4000)
- goto LBL_InvalidCommand;
-
- ezxml_t xmli = ezxml_parse_str((char*)HReadBuffer(info, 0).surelyRead(len), len);
- if (xmli) {
- MSN_ProcessStatusMessage(xmli, data.wlid);
- ezxml_free(xmli);
- }
- }
- break;
-
- case ' NBU': // UBN : MSNP13+ File sharing, P2P Bootstrap, TURN setup.
- {
- union {
- char* tWords[3];
- struct { char *email, *typeId, *datalen; } data;
- };
-
- if (sttDivideWords(params, 3, tWords) != 3)
- goto LBL_InvalidCommand;
-
- int len = atol(data.datalen);
- if (len < 0 || len > 4000)
- goto LBL_InvalidCommand;
-
- HReadBuffer buf(info, 0);
- char* msgBody = (char*)buf.surelyRead(len);
-
- char *szEmail = data.email;
- if (strstr(data.email, sttVoidUid))
- parseWLID(NEWSTR_ALLOCA(data.email), NULL, &szEmail, NULL);
-
- switch (atol(data.typeId)) {
- case 1:
- // File sharing stuff
- // sttProcessFileSharing(msgBody, len, hContact);
- break;
-
- case 3:
- // P2P Bootstrap
- p2p_processSIP(info, msgBody, NULL, szEmail);
- break;
-
- case 4:
- case 8:
- ProtoBroadcastAck(NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_OTHERLOCATION);
- debugLogA("You have been disconnected from the MSN server because you logged on from another location using the same MSN passport.");
- break;
-
- case 6:
- MSN_SharingFindMembership(true);
- MSN_ABFind("ABFindContactsPaged", NULL, true);
- break;
-
- case 10:
- // TURN setup
- p2p_processSIP(info, msgBody, NULL, szEmail);
- break;
- }
- }
- break;
-
- case ' NUU': // UUN : MSNP13+ File sharing, P2P Bootstrap, TURN setup.
- break;
-
- case ' RSU': //********* USR: sections 7.3 Authentication, 8.2 Switchboard Connections and Authentication
- if (info->mType == SERVER_SWITCHBOARD) { //(section 8.2)
- union {
- char* tWords[3];
- struct { char *status, *userHandle, *friendlyName; } data;
- };
-
- if (sttDivideWords(params, 3, tWords) != 3)
- goto LBL_InvalidCommand;
-
- UrlDecode(data.userHandle); UrlDecode(data.friendlyName);
-
- if (mir_strcmp(data.status, "OK")) {
- debugLogA("Unknown status to USR command (SB): '%s'", data.status);
- break;
- }
-
- info->sendPacket("CAL", MyOptions.szEmail);
- }
- else { //dispatch or notification server (section 7.3)
- union {
- char* tWords[4];
- struct { char *security, *sequence, *authChallengeInfo, *nonce; } data;
- };
-
- if (sttDivideWords(params, 4, tWords) != 4)
- goto LBL_InvalidCommand;
-
- if (!mir_strcmp(data.security, "SSO")) {
- if (MSN_GetPassportAuth()) {
- m_iDesiredStatus = ID_STATUS_OFFLINE;
- return 1;
- }
-
- char* sec = GenerateLoginBlob(data.nonce);
- info->sendPacket("USR", "SSO S %s %s %s", authStrToken ? authStrToken : "", sec, MyOptions.szMachineGuid);
- mir_free(sec);
-
- ForkThread(&CMsnProto::msn_keepAliveThread, NULL);
- ForkThread(&CMsnProto::MSNConnDetectThread, NULL);
- }
- else if (!mir_strcmp(data.security, "OK")) {
- }
- else {
- debugLogA("Unknown security package '%s'", data.security);
-
- if (info->mType == SERVER_NOTIFICATION)
- ProtoBroadcastAck(NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_WRONGPROTOCOL);
- return 1;
- }
- }
- break;
-
- case ' SFR': // RFS: Refresh Contact List
- if (!MSN_RefreshContactList()) {
- MSN_ShowError("Cannot retrieve contact list");
- return 1;
- }
- break;
-
- case ' XUU': // UUX: MSNP11 addition
- {
- char* tWords[1];
- if (sttDivideWords(params, _countof(tWords), tWords) != _countof(tWords))
- goto LBL_InvalidCommand;
-
- int len = atol(tWords[0]);
- if (len < 0 || len > 4000)
- goto LBL_InvalidCommand;
-
- HReadBuffer(info, 0).surelyRead(len);
- }
- break;
-
- case ' REV': //******** VER: section 7.1 Protocol Versioning
- {
- char* protocol1;
- if (sttDivideWords(params, 1, &protocol1) != 1)
- goto LBL_InvalidCommand;
-
- if (MyOptions.szEmail[0] == 0) {
- MSN_ShowError("You must specify your e-mail in Options/Network/MSN");
- return 1;
- }
-
- OSVERSIONINFOEX osvi = {0};
- osvi.dwOSVersionInfoSize = sizeof(osvi);
- GetVersionEx((LPOSVERSIONINFO)&osvi);
-
- info->sendPacket("CVR","0x0409 %s %d.%d.%d i386 MSNMSGR %s msmsgs %s",
- osvi.dwPlatformId >= 2 ? "winnt" : "win", osvi.dwMajorVersion,
- osvi.dwMinorVersion, osvi.wServicePackMajor,
- msnProductVer, MyOptions.szEmail);
-
- info->sendPacket("USR", "SSO I %s", MyOptions.szEmail);
- }
- break;
- case ' RFX': //******** XFR: sections 7.4 Referral, 8.1 Referral to Switchboard
- {
- union {
- char* tWords[7];
- struct { char *type, *newServer, *security, *authChallengeInfo,
- *type2, *srcUrl, *genGateway; } data;
- };
-
- int numWords = sttDivideWords(params, 7, tWords);
- if (numWords < 3)
- goto LBL_InvalidCommand;
-
- if (!mir_strcmp(data.type, "NS")) { //notification server
- UrlDecode(data.newServer);
- ThreadData* newThread = new ThreadData;
- mir_strcpy(newThread->mServer, data.newServer);
- newThread->mType = SERVER_NOTIFICATION;
- newThread->mTrid = info->mTrid;
- newThread->mIsMainThread = true;
- usingGateway |= (*data.security == 'G');
- info->mIsMainThread = false;
-
- debugLogA("Switching to notification server '%s'...", data.newServer);
- newThread->startThread(&CMsnProto::MSNServerThread, this);
- return 1; //kill the old thread
- }
-
- if (!mir_strcmp(data.type, "SB")) { //switchboard server
- UrlDecode(data.newServer);
-
- if (numWords < 4)
- goto LBL_InvalidCommand;
-
- if (mir_strcmp(data.security, "CKI")) {
- debugLogA("Unknown XFR SB security package '%s'", data.security);
- break;
- }
-
- ThreadData* newThread = new ThreadData;
- mir_strcpy(newThread->mServer, data.newServer);
- newThread->gatewayType = data.genGateway && atol(data.genGateway) != 0;
- newThread->mType = SERVER_SWITCHBOARD;
- newThread->mCaller = 1;
- mir_strcpy(newThread->mCookie, data.authChallengeInfo);
-
- debugLogA("Opening switchboard server '%s'...", data.newServer);
- newThread->startThread(&CMsnProto::MSNServerThread, this);
- }
- else debugLogA("Unknown referral server: %s", data.type);
- }
- break;
-
- default:
- debugLogA("Unrecognised message: %s", cmdString);
- break;
- }
-
- return 0;
-}
-#endif \ No newline at end of file
diff --git a/protocols/MSN/src/msn_contact.cpp b/protocols/MSN/src/msn_contact.cpp
index 5e4aa5295d..6bd06b9d1c 100644
--- a/protocols/MSN/src/msn_contact.cpp
+++ b/protocols/MSN/src/msn_contact.cpp
@@ -108,28 +108,6 @@ void CMsnProto::MSN_SetContactDb(MCONTACT hContact, const char *szEmail)
void CMsnProto::AddDelUserContList(const char* email, const int list, const int netId, const bool del)
{
-#ifdef OBSOLETE
- char buf[512];
- size_t sz;
-
- if (list < LIST_RL) {
- const char* dom = strchr(email, '@');
- if (dom == NULL) {
- sz = mir_snprintf(buf,
- "<ml><t><c n=\"%s\" l=\"%d\"/></t></ml>",
- email, list);
- }
- else {
- *(char*)dom = 0;
- sz = mir_snprintf(buf,
- "<ml><d n=\"%s\"><c n=\"%s\" l=\"%d\" t=\"%d\"/></d></ml>",
- dom + 1, email, list, netId);
- *(char*)dom = '@';
- }
- msnNsThread->sendPacket(del ? "RML" : "ADL", "%d\r\n%s", sz, buf);
- }
-#endif
-
if (del)
Lists_Remove(list, email);
else
@@ -220,10 +198,6 @@ bool CMsnProto::MSN_AddUser(MCONTACT hContact, const char* email, int netId, int
MSN_SharingFindMembership(true);
AddDelUserContList(email, flags, netId, false);
}
- #ifdef OBSOLETE
- else if (netId == 1 && strstr(email, "@yahoo.com") != 0)
- MSN_FindYahooUser(email);
- #endif
db_free(&dbv);
}
@@ -239,10 +213,6 @@ bool CMsnProto::MSN_AddUser(MCONTACT hContact, const char* email, int netId, int
netId = Lists_GetNetId(email);
res = MSN_SharingAddDelMember(email, flags, netId, needRemove ? "DeleteMember" : "AddMember");
AddDelUserContList(email, flags, netId, needRemove);
- if ((flags & LIST_BL) && !needRemove) {
- ThreadData* thread = MSN_GetThreadByContact(email, SERVER_SWITCHBOARD);
- if (thread) thread->sendTerminate();
- }
if ((flags & LIST_PL) && needRemove)
MSN_AddUser(hContact, email, netId, LIST_RL);
@@ -251,22 +221,6 @@ bool CMsnProto::MSN_AddUser(MCONTACT hContact, const char* email, int netId, int
return res;
}
-#ifdef OBSOLETE
-void CMsnProto::MSN_FindYahooUser(const char* email)
-{
- const char *dom = strchr(email, '@');
- if (dom) {
- char buf[512];
- size_t sz;
-
- *(char*)dom = '\0';
- sz = mir_snprintf(buf, "<ml><d n=\"%s\"><c n=\"%s\"/></d></ml>", dom + 1, email);
- *(char*)dom = '@';
- msnNsThread->sendPacket("FQY", "%d\r\n%s", sz, buf);
- }
-}
-#endif
-
bool CMsnProto::MSN_RefreshContactList(void)
{
Lists_Wipe();
diff --git a/protocols/MSN/src/msn_errors.cpp b/protocols/MSN/src/msn_errors.cpp
index 0b4e16f06c..f1259425e5 100644
--- a/protocols/MSN/src/msn_errors.cpp
+++ b/protocols/MSN/src/msn_errors.cpp
@@ -106,10 +106,8 @@ int CMsnProto::MSN_HandleErrors(ThreadData* info, char* cmdString)
return 0;
case ERR_AUTHENTICATION_FAILED:
- if (info->mType != SERVER_SWITCHBOARD) {
- MSN_ShowError("Your username or password is incorrect");
- ProtoBroadcastAck(NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_WRONGPASSWORD);
- }
+ MSN_ShowError("Your username or password is incorrect");
+ ProtoBroadcastAck(NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_WRONGPASSWORD);
return 1;
default:
diff --git a/protocols/MSN/src/msn_ftold.cpp b/protocols/MSN/src/msn_ftold.cpp
deleted file mode 100644
index c6bc904b55..0000000000
--- a/protocols/MSN/src/msn_ftold.cpp
+++ /dev/null
@@ -1,369 +0,0 @@
-/*
-Plugin of Miranda IM for communicating with users of the MSN Messenger protocol.
-
-Copyright (c) 2012-2017 Miranda NG Team
-Copyright (c) 2006-2012 Boris Krasnovskiy.
-Copyright (c) 2003-2005 George Hazan.
-Copyright (c) 2002-2003 Richard Hughes (original version).
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "stdafx.h"
-#include "msn_proto.h"
-#ifdef OBSOLETE
-
-void CMsnProto::msnftp_sendAcceptReject(filetransfer *ft, bool acc)
-{
- ThreadData* thread = MSN_GetThreadByContact(ft->p2p_dest);
- if (thread == NULL) return;
-
- if (acc) {
- thread->sendPacket("MSG",
- "U %d\r\nMIME-Version: 1.0\r\n"
- "Content-Type: text/x-msmsgsinvite; charset=UTF-8\r\n\r\n"
- "Invitation-Command: ACCEPT\r\n"
- "Invitation-Cookie: %s\r\n"
- "Launch-Application: FALSE\r\n"
- "Request-Data: IP-Address:\r\n\r\n",
- 172 + 4 + mir_strlen(ft->szInvcookie), ft->szInvcookie);
- }
- else {
- thread->sendPacket("MSG",
- "U %d\r\nMIME-Version: 1.0\r\n"
- "Content-Type: text/x-msmsgsinvite; charset=UTF-8\r\n\r\n"
- "Invitation-Command: CANCEL\r\n"
- "Invitation-Cookie: %s\r\n"
- "Cancel-Code: REJECT\r\n\r\n",
- 172 - 33 + 4 + mir_strlen(ft->szInvcookie), ft->szInvcookie);
- }
-}
-
-void CMsnProto::msnftp_invite(filetransfer *ft)
-{
- bool isOffline;
- ThreadData* thread = MSN_StartSB(ft->p2p_dest, isOffline);
- if (isOffline) return;
- if (thread != NULL) thread->mMsnFtp = ft;
-
- wchar_t* pszFiles = wcsrchr(ft->std.ptszFiles[0], '\\');
- if (pszFiles)
- pszFiles++;
- else
- pszFiles = *ft->std.ptszFiles;
-
- char msg[1024];
- mir_snprintf(msg,
- "Content-Type: text/x-msmsgsinvite; charset=UTF-8\r\n\r\n"
- "Application-Name: File Transfer\r\n"
- "Application-GUID: {5D3E02AB-6190-11d3-BBBB-00C04F795683}\r\n"
- "Invitation-Command: INVITE\r\n"
- "Invitation-Cookie: %i\r\n"
- "Application-File: %s\r\n"
- "Application-FileSize: %I64u\r\n\r\n",
- MSN_GenRandom(), UTF8(pszFiles), ft->std.currentFileSize);
-
- if (thread == NULL)
- MsgQueue_Add(ft->p2p_dest, 'S', msg, -1, ft);
- else
- thread->sendMessage('S', NULL, NETID_MSN, msg, MSG_DISABLE_HDR);
-}
-
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// MSN File Transfer Protocol commands processing
-
-int CMsnProto::MSN_HandleMSNFTP(ThreadData *info, char *cmdString)
-{
- char* params = "";
- filetransfer* ft = info->mMsnFtp;
-
- if (cmdString[3])
- params = cmdString + 4;
-
- switch ((*(PDWORD)cmdString & 0x00FFFFFF) | 0x20000000) {
- case ' EYB': //********* BYE
- ft->complete();
- return 1;
-
- case ' LIF': //********* FIL
- char filesize[30];
- if (sscanf(params, "%s", filesize) < 1)
- goto LBL_InvalidCommand;
-
- info->mCaller = 1;
- info->send("TFR\r\n", 5);
- break;
-
- case ' RFT': //********* TFR
- {
- char *sendpacket = (char*)alloca(2048);
- filetransfer* ft = info->mMsnFtp;
-
- info->mCaller = 3;
-
- while (ft->std.currentFileProgress < ft->std.currentFileSize) {
- if (ft->bCanceled) {
- sendpacket[0] = 0x01;
- sendpacket[1] = 0x00;
- sendpacket[2] = 0x00;
- info->send(sendpacket, 3);
- return 0;
- }
-
- int wPlace = 0;
- sendpacket[wPlace++] = 0x00;
- unsigned __int64 packetLen = ft->std.currentFileSize - ft->std.currentFileProgress;
- if (packetLen > 2045) packetLen = 2045;
-
- sendpacket[wPlace++] = (char)(packetLen & 0x00ff);
- sendpacket[wPlace++] = (char)((packetLen & 0xff00) >> 8);
- _read(ft->fileId, &sendpacket[wPlace], packetLen);
-
- info->send(&sendpacket[0], packetLen + 3);
-
- ft->std.totalProgress += packetLen;
- ft->std.currentFileProgress += packetLen;
-
- ProtoBroadcastAck(ft->std.hContact, ACKTYPE_FILE, ACKRESULT_DATA, ft, (LPARAM)&ft->std);
- }
-
- ft->complete();
- }
- break;
-
- case ' RSU': //********* USR
- char email[130], authcookie[14];
- if (sscanf(params, "%129s %13s", email, authcookie) < 2) {
- debugLogA("Invalid USR OK command, ignoring");
- break;
- }
-
- char tCommand[30];
- size_t tCommandLen;
- tCommandLen = mir_snprintf(tCommand, "FIL %i\r\n", info->mMsnFtp->std.totalBytes);
- info->send(tCommand, tCommandLen);
- break;
-
- case ' REV': //********* VER
- char protocol1[7];
- if (sscanf(params, "%6s", protocol1) < 1) {
-LBL_InvalidCommand:
- debugLogA("Invalid %.3s command, ignoring", cmdString);
- break;
- }
-
- if (mir_strcmp(protocol1, "MSNFTP") != 0) {
- int tempInt;
- int tFieldCount = sscanf(params, "%d %6s", &tempInt, protocol1);
- if (tFieldCount != 2 || mir_strcmp(protocol1, "MSNFTP") != 0) {
- debugLogA("Another side requested the unknown protocol (%s), closing thread", params);
- return 1;
- }
- }
-
- if (info->mCaller == 0) { //receive
- char tCommand[MSN_MAX_EMAIL_LEN + 50];
- size_t tCommandLen;
- tCommandLen = mir_snprintf(tCommand, "USR %s %s\r\n", MyOptions.szEmail, info->mCookie);
- info->send(tCommand, tCommandLen);
- }
- else if (info->mCaller == 2) { //send
- static const char sttCommand[] = "VER MSNFTP\r\n";
- info->send(sttCommand, mir_strlen(sttCommand));
- }
- break;
-
- default: // receiving file
- HReadBuffer tBuf(info, int(cmdString - info->mData));
-
- for (;;) {
- if (ft->bCanceled) {
- info->send("CCL\r\n", 5);
- ft->close();
- return 1;
- }
-
- BYTE* p = tBuf.surelyRead(3);
- if (p == NULL) {
-LBL_Error:
- ft->close();
- MSN_ShowError("file transfer is canceled by remote host");
- return 1;
- }
-
- BYTE tIsTransitionFinished = *p++;
- WORD dataLen = *p++;
- dataLen |= (*p++ << 8);
-
- if (tIsTransitionFinished) {
-LBL_Success:
- static const char sttCommand[] = "BYE 16777989\r\n";
- info->send(sttCommand, mir_strlen(sttCommand));
- return 1;
- }
-
- p = tBuf.surelyRead(dataLen);
- if (p == NULL)
- goto LBL_Error;
-
- _write(ft->fileId, p, dataLen);
- ft->std.totalProgress += dataLen;
- ft->std.currentFileProgress += dataLen;
-
- ProtoBroadcastAck(ft->std.hContact, ACKTYPE_FILE, ACKRESULT_DATA, ft, (LPARAM)&ft->std);
-
- if (ft->std.currentFileProgress == ft->std.totalBytes) {
- ft->complete();
- goto LBL_Success;
- }
- }
- }
-
- return 0;
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// ft_startFileSend - sends a file using the old f/t protocol
-
-void __cdecl CMsnProto::msnftp_sendFileThread(void* arg)
-{
- ThreadData* info = (ThreadData*)arg;
-
- debugLogA("Waiting for an incoming connection to '%s'...", info->mServer);
-
- switch (WaitForSingleObject(info->hWaitEvent, 60000)) {
- case WAIT_TIMEOUT:
- case WAIT_FAILED:
- debugLogA("Incoming connection timed out, closing file transfer");
- return;
- }
-
- info->mBytesInData = 0;
-
- for (;;) {
- int recvResult = info->recv(info->mData + info->mBytesInData, 1000 - info->mBytesInData);
- if (recvResult == SOCKET_ERROR || !recvResult)
- break;
-
- info->mBytesInData += recvResult;
-
- //pull off each line for parsing
- if (info->mCaller == 3 && info->mType == SERVER_FILETRANS) {
- if (MSN_HandleMSNFTP(info, info->mData))
- break;
- }
- else // info->mType!=SERVER_FILETRANS
- {
- for (;;) {
- char* peol = strchr(info->mData, '\r');
- if (peol == NULL)
- break;
-
- if (info->mBytesInData < peol - info->mData + 2)
- break; //wait for full line end
-
- char msg[sizeof(info->mData)];
- memcpy(msg, info->mData, peol - info->mData); msg[peol - info->mData] = 0;
- if (*++peol != '\n')
- debugLogA("Dodgy line ending to command: ignoring");
- else
- peol++;
-
- info->mBytesInData -= peol - info->mData;
- memmove(info->mData, peol, info->mBytesInData);
-
- debugLogA("RECV:%s", msg);
-
- if (!isalnum(msg[0]) || !isalnum(msg[1]) || !isalnum(msg[2]) || (msg[3] && msg[3] != ' ')) {
- debugLogA("Invalid command name");
- continue;
- }
-
- if (MSN_HandleMSNFTP(info, msg))
- break;
- }
- }
-
- if (info->mBytesInData == info->mDataSize) {
- char *mData = (char*)mir_realloc(info->mData, (info->mDataSize*=2)+1);
- if (mData) info->mData = mData; else {
- debugLogA("sizeof(data) is too small: the longest line won't fit");
- break;
- }
- }
- }
-
- debugLogA("Closing file transfer thread");
-}
-
-void CMsnProto::msnftp_startFileSend(ThreadData* info, const char* Invcommand, const char* Invcookie)
-{
- if (_stricmp(Invcommand, "ACCEPT"))
- return;
-
- NETLIBBIND nlb = { 0 };
- HANDLE sb = NULL;
-
- filetransfer* ft = info->mMsnFtp; info->mMsnFtp = NULL;
- if (ft != NULL && MyConnection.extIP) {
- nlb.cbSize = sizeof(nlb);
- nlb.pfnNewConnectionV2 = MSN_ConnectionProc;
- nlb.pExtra = this;
-
- sb = (HANDLE)CallService(MS_NETLIB_BINDPORT, (WPARAM)m_hNetlibUser, (LPARAM)&nlb);
- if (sb == NULL)
- debugLogA("Unable to bind the port for incoming transfers");
- }
-
- char hostname[256] = "";
- gethostname(hostname, sizeof(hostname));
- PHOSTENT he = gethostbyname(hostname);
-
- const PIN_ADDR addr = (PIN_ADDR)he->h_addr_list[0];
- if (addr)
- mir_strcpy(hostname, inet_ntoa(*addr));
- else
- hostname[0] = 0;
-
- info->sendPacketPayload("MSG", "N",
- "MIME-Version: 1.0\r\n"
- "Content-Type: text/x-msmsgsinvite; charset=UTF-8\r\n\r\n"
- "Invitation-Command: %s\r\n"
- "Invitation-Cookie: %s\r\n"
- "IP-Address: %s\r\n"
- "IP-Address-Internal: %s\r\n"
- "Port: %i\r\n"
- "PortX: %i\r\n"
- "PortX-Internal: %i\r\n"
- "AuthCookie: %i\r\n"
- "Launch-Application: FALSE\r\n"
- "Request-Data: IP-Address:\r\n\r\n",
- sb && MyConnection.extIP ? "ACCEPT" : "CANCEL",
- Invcookie, MyConnection.GetMyExtIPStr(), hostname,
- nlb.wExPort, nlb.wExPort ^ 0x3141, nlb.wPort ^ 0x3141,
- MSN_GenRandom());
-
- if (sb) {
- ThreadData* newThread = new ThreadData;
- newThread->mType = SERVER_FILETRANS;
- newThread->mCaller = 2;
- newThread->mMsnFtp = ft;
- newThread->mIncomingBoundPort = sb;
- newThread->mIncomingPort = nlb.wPort;
- newThread->startThread(&CMsnProto::msnftp_sendFileThread, this);
- }
- else delete ft;
-}
-#endif
diff --git a/protocols/MSN/src/msn_lists.cpp b/protocols/MSN/src/msn_lists.cpp
index c73bfbc9d6..b59df57808 100644
--- a/protocols/MSN/src/msn_lists.cpp
+++ b/protocols/MSN/src/msn_lists.cpp
@@ -24,6 +24,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "msn_proto.h"
#include "m_smileyadd.h"
+const char sttVoidUid[] = "{00000000-0000-0000-0000-000000000000}";
+
void CMsnProto::Lists_Uninit(void)
{
Lists_Wipe();
@@ -140,28 +142,6 @@ int CMsnProto::Lists_GetNetId(const char* email)
return p ? p->netId : NETID_UNKNOWN;
}
-#ifdef OBSOLETE
-unsigned CMsnProto::p2p_getMsgId(const char* wlid, int inc)
-{
- mir_cslock lck(m_csLists);
- MsnPlace *p = Lists_GetPlace(wlid);
-
- unsigned res = p && p->p2pMsgId ? p->p2pMsgId : MSN_GenRandom();
- if (p)
- p->p2pMsgId = res + inc;
-
- return res;
-}
-
-unsigned CMsnProto::p2p_getPktNum(const char* wlid)
-{
- mir_cslock lck(m_csLists);
-
- MsnPlace *p = Lists_GetPlace(wlid);
- return p ? p->p2pPktNum++ : 0;
-}
-#endif
-
int CMsnProto::Lists_Add(int list, int netId, const char* email, MCONTACT hContact, const char* nick, const char* invite)
{
mir_cslock lck(m_csLists);
diff --git a/protocols/MSN/src/msn_menu.cpp b/protocols/MSN/src/msn_menu.cpp
index 30a6c28b25..9c37f90f5a 100644
--- a/protocols/MSN/src/msn_menu.cpp
+++ b/protocols/MSN/src/msn_menu.cpp
@@ -125,9 +125,6 @@ int CMsnProto::OnPrebuildContactMenu(WPARAM hContact, LPARAM)
Menu_ModifyItem(hOpenInboxMenuItem, isMe ? LPGENW("Open &Hotmail Inbox") : LPGENW("Send &Hotmail E-mail"));
Menu_ShowItem(hOpenInboxMenuItem, emailEnabled);
-#ifdef OBSOLETE
- Menu_ShowItem(hNetmeetingMenuItem, !noChat);
-#endif
Menu_ShowItem(hChatInviteMenuItem, !noChat);
}
@@ -143,124 +140,12 @@ int CMsnProto::OnContactDoubleClicked(WPARAM hContact, LPARAM)
return 0;
}
-#ifdef OBSOLETE
-// MsnSendNetMeeting - Netmeeting callback function
-INT_PTR CMsnProto::MsnSendNetMeeting(WPARAM wParam, LPARAM)
-{
- if (!msnLoggedIn) return 0;
-
- MCONTACT hContact = MCONTACT(wParam);
-
- char szEmail[MSN_MAX_EMAIL_LEN];
- if (MSN_IsMeByContact(hContact, szEmail)) return 0;
-
- ThreadData* thread = MSN_GetThreadByContact(szEmail);
-
- if (thread == NULL) {
- MessageBox(NULL, TranslateT("You must be talking to start Netmeeting"), TranslateT("MSN Protocol"), MB_OK | MB_ICONERROR);
- return 0;
- }
-
- char msg[1024];
-
- mir_snprintf(msg,
- "Content-Type: text/x-msmsgsinvite; charset=UTF-8\r\n\r\n"
- "Application-Name: NetMeeting\r\n"
- "Application-GUID: {44BBA842-CC51-11CF-AAFA-00AA00B6015C}\r\n"
- "Session-Protocol: SM1\r\n"
- "Invitation-Command: INVITE\r\n"
- "Invitation-Cookie: %i\r\n"
- "Session-ID: {1A879604-D1B8-11D7-9066-0003FF431510}\r\n\r\n",
- MSN_GenRandom());
-
- thread->sendMessage('N', NULL, 1, msg, MSG_DISABLE_HDR);
- return 0;
-}
-
-static INT_PTR MsnMenuSendNetMeeting(WPARAM wParam, LPARAM lParam)
-{
- CMsnProto* ppro = GetProtoInstanceByHContact(wParam);
- return (ppro) ? ppro->MsnSendNetMeeting(wParam, lParam) : 0;
-}
-
-// SetNicknameCommand - sets nick name
-static INT_PTR CALLBACK DlgProcSetNickname(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
-{
- switch (msg) {
- case WM_INITDIALOG:
- {
- TranslateDialogDefault(hwndDlg);
-
- SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam);
- CMsnProto* proto = (CMsnProto*)lParam;
-
- Window_SetIcon_IcoLib(hwndDlg, GetIconHandle("main"));
- SendDlgItemMessage(hwndDlg, IDC_NICKNAME, EM_LIMITTEXT, 129, 0);
-
- DBVARIANT dbv;
- if (!proto->getWString("Nick", &dbv)) {
- SetDlgItemText(hwndDlg, IDC_NICKNAME, dbv.ptszVal);
- db_free(&dbv);
- }
- return TRUE;
- }
- case WM_COMMAND:
- switch (wParam) {
- case IDOK:
- {
- CMsnProto *proto = (CMsnProto*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
- if (proto->msnLoggedIn) {
- wchar_t str[130];
- GetDlgItemText(hwndDlg, IDC_NICKNAME, str, _countof(str));
- proto->MSN_SendNickname(str);
- }
- }
-
- case IDCANCEL:
- DestroyWindow(hwndDlg);
- break;
- }
- break;
-
- case WM_CLOSE:
- DestroyWindow(hwndDlg);
- break;
-
- case WM_DESTROY:
- ReleaseIconEx("main");
- ReleaseIconEx("main", true);
- break;
- }
- return FALSE;
-}
-
-INT_PTR CMsnProto::SetNicknameUI(WPARAM, LPARAM)
-{
- HWND hwndSetNickname = CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_SETNICKNAME),
- NULL, DlgProcSetNickname, (LPARAM)this);
-
- SetForegroundWindow(hwndSetNickname);
- SetFocus(hwndSetNickname);
- ShowWindow(hwndSetNickname, SW_SHOW);
- return 0;
-}
-#endif
-
// Menus initialization
void CMsnProto::MsnInitMainMenu(void)
{
CMenuItem mi;
mi.root = Menu_GetProtocolRoot(this);
-#ifdef OBSOLETE
- mi.pszService = MS_SET_NICKNAME_UI;
- CreateProtoService(mi.pszService, &CMsnProto::SetNicknameUI);
- mi.position = 201001;
- mi.hIcolibItem = GetIconHandle(IDI_MSN);
- mi.name.a = LPGEN("Set &Nickname");
- menuItemsMain[0] = Menu_AddProtoMenuItem(&mi, m_szModuleName);
-#endif
-
mi.pszService = MSN_INVITE;
CreateProtoService(mi.pszService, &CMsnProto::MsnInviteCommand);
mi.position = 201002;
@@ -342,9 +227,6 @@ static int MSN_OnPrebuildContactMenu(WPARAM wParam, LPARAM lParam)
else {
Menu_ShowItem(hBlockMenuItem, false);
Menu_ShowItem(hLiveSpaceMenuItem, false);
-#ifdef OBSOLETE
- Menu_ShowItem(hNetmeetingMenuItem, false);
-#endif
Menu_ShowItem(hChatInviteMenuItem, false);
Menu_ShowItem(hOpenInboxMenuItem, false);
}
@@ -377,16 +259,6 @@ void MSN_InitContactMenu(void)
mi.name.a = LPGEN("View &Profile");
hLiveSpaceMenuItem = Menu_AddContactMenuItem(&mi);
-#ifdef OBSOLETE
- mir_strcpy(tDest, MSN_NETMEETING);
- hNetMeeting = CreateServiceFunction(servicefunction, MsnMenuSendNetMeeting);
- mi.flags = CMIF_NOTOFFLINE;
- mi.position = -500050002;
- mi.hIcolibItem = GetIconHandle(IDI_NETMEETING);
- mi.name.a = LPGEN("&Start Netmeeting");
- hNetmeetingMenuItem = Menu_AddContactMenuItem(&mi);
-#endif
-
SET_UID(mi,0x25a007c0, 0x8dc7, 0x4284, 0x8a, 0x5e, 0x2, 0x83, 0x17, 0x5d, 0x52, 0xea);
mir_strcpy(tDest, "/SendHotmail");
hSendHotMail = CreateServiceFunction(servicefunction, MsnMenuSendHotmail);
@@ -403,10 +275,6 @@ void MSN_RemoveContactMenus(void)
{
Menu_RemoveItem(hBlockMenuItem);
Menu_RemoveItem(hLiveSpaceMenuItem);
-#ifdef OBSOLETE
- Menu_RemoveItem(hNetmeetingMenuItem);
- DestroyServiceFunction(hNetMeeting);
-#endif
Menu_RemoveItem(hChatInviteMenuItem);
Menu_RemoveItem(hOpenInboxMenuItem);
diff --git a/protocols/MSN/src/msn_misc.cpp b/protocols/MSN/src/msn_misc.cpp
index c61f47c32a..044877456d 100644
--- a/protocols/MSN/src/msn_misc.cpp
+++ b/protocols/MSN/src/msn_misc.cpp
@@ -361,9 +361,7 @@ void CMsnProto::MSN_GoOffline(void)
MSN_EnableMenuItems(false);
MSN_FreeGroups();
-#ifdef OBSOLETE
- MsgQueue_Clear();
-#endif
+
clearCachedMsg();
if (!g_bTerminated) {
@@ -390,12 +388,9 @@ void CMsnProto::MSN_GoOffline(void)
}
}
}
-#ifdef OBSOLETE
-int ThreadData::sendMessage(int msgType, const char* email, int netId, const char* parMsg, int parFlags)
-#else
+
// MSN_SendMessage - formats and sends a MSG packet through the server
int ThreadData::sendMessage(int, const char *email, int netId, const char *parMsg, int parFlags)
-#endif
{
CMStringA buf;
@@ -441,11 +436,6 @@ int ThreadData::sendMessage(int, const char *email, int netId, const char *parMs
tFontColor = db_get_dw(NULL, "SRMsg", "Font0Col", 0);
}
else tFontStyle[0] = 0;
-
-#ifdef OBSOLETE
- if (parFlags & MSG_OFFLINE)
- off += mir_snprintf((buf + off), (_countof(buf) - off), "Dest-Agent: client\r\n");
-#endif
}
char *pszNick=proto->MyOptions.szEmail;
@@ -491,33 +481,9 @@ int ThreadData::sendMessage(int, const char *email, int netId, const char *parMs
netId == NETID_SKYPE?netId:proto->MyOptions.netId, proto->GetMyUsername(netId), proto->MyOptions.szMachineGuid,
parMsg);
-#ifdef OBSOLETE
- if (netId == NETID_YAHOO || netId == NETID_MOB || (parFlags & MSG_OFFLINE))
- seq = sendPacket("UUM", "%s %d %c %d\r\n%s%s", email, netId, msgType,
- mir_strlen(parMsg) + off, buf, parMsg);
- else
- seq = sendPacket("MSG", "%c %d\r\n%s%s", msgType,
- mir_strlen(parMsg) + off, buf, parMsg);
-#endif
-
return seq;
}
-#ifdef OBSOLETE
-void ThreadData::sendCaps(void)
-{
- char mversion[100], capMsg[1000];
- CallService(MS_SYSTEM_GETVERSIONTEXT, sizeof(mversion), (LPARAM)mversion);
-
- mir_snprintf(capMsg,
- "Content-Type: text/x-clientcaps\r\n\r\n"
- "Client-Name: Miranda NG %s (MSN v.%s)\r\n",
- mversion, __VERSION_STRING_DOTS);
-
- sendMessage('U', NULL, 1, capMsg, MSG_DISABLE_HDR);
-}
-#endif
-
void ThreadData::sendTerminate(void)
{
if (!termPending) {
@@ -575,89 +541,13 @@ static char * HtmlEncodeUTF8T(const wchar_t *src)
return HtmlEncode(UTF8(src));
}
-#ifdef OBSOLETE
-void CMsnProto::MSN_SendStatusMessage(const char* msg)
-#else
// MSN_SendStatusMessage - notify a server about the status message change
void CMsnProto::MSN_SendStatusMessage(const char*)
-#endif
{
if (!msnLoggedIn)
return;
MSN_SetServerStatus(m_iDesiredStatus);
- /* FIXME: Currently not implemented, should be set on status change anyway */
-
-#ifdef OBSOLETE
- char* msgEnc = HtmlEncode(msg ? msg : "");
-
- size_t sz;
- char szMsg[2048];
- if (msnCurrentMedia.cbSize == 0) {
- sz = mir_snprintf(szMsg, "<Data><PSM>%s</PSM><CurrentMedia></CurrentMedia><MachineGuid>%s</MachineGuid>"
- "<DDP></DDP><SignatureSound></SignatureSound><Scene></Scene><ColorScheme></ColorScheme></Data>",
- msgEnc, MyOptions.szMachineGuid);
- }
- else {
- char *szFormatEnc;
- if (ServiceExists(MS_LISTENINGTO_GETPARSEDTEXT)) {
- LISTENINGTOINFO lti = { 0 };
- lti.cbSize = sizeof(lti);
- if (msnCurrentMedia.ptszTitle != NULL) lti.ptszTitle = L"{0}";
- if (msnCurrentMedia.ptszArtist != NULL) lti.ptszArtist = L"{1}";
- if (msnCurrentMedia.ptszAlbum != NULL) lti.ptszAlbum = L"{2}";
- if (msnCurrentMedia.ptszTrack != NULL) lti.ptszTrack = L"{3}";
- if (msnCurrentMedia.ptszYear != NULL) lti.ptszYear = L"{4}";
- if (msnCurrentMedia.ptszGenre != NULL) lti.ptszGenre = L"{5}";
- if (msnCurrentMedia.ptszLength != NULL) lti.ptszLength = L"{6}";
- if (msnCurrentMedia.ptszPlayer != NULL) lti.ptszPlayer = L"{7}";
- if (msnCurrentMedia.ptszType != NULL) lti.ptszType = L"{8}";
-
- wchar_t *tmp = (wchar_t *)CallService(MS_LISTENINGTO_GETPARSEDTEXT, (WPARAM)L"%title% - %artist%", (LPARAM)&lti);
- szFormatEnc = HtmlEncodeUTF8T(tmp);
- mir_free(tmp);
- }
- else szFormatEnc = HtmlEncodeUTF8T(L"{0} - {1}");
-
- char *szArtist = HtmlEncodeUTF8T(msnCurrentMedia.ptszArtist),
- *szAlbum = HtmlEncodeUTF8T(msnCurrentMedia.ptszAlbum),
- *szTitle = HtmlEncodeUTF8T(msnCurrentMedia.ptszTitle),
- *szTrack = HtmlEncodeUTF8T(msnCurrentMedia.ptszTrack),
- *szYear = HtmlEncodeUTF8T(msnCurrentMedia.ptszYear),
- *szGenre = HtmlEncodeUTF8T(msnCurrentMedia.ptszGenre),
- *szLength = HtmlEncodeUTF8T(msnCurrentMedia.ptszLength),
- *szPlayer = HtmlEncodeUTF8T(msnCurrentMedia.ptszPlayer),
- *szType = HtmlEncodeUTF8T(msnCurrentMedia.ptszType);
-
- sz = mir_snprintf(szMsg, _countof(szMsg),
- "<Data>"
- "<PSM>%s</PSM>"
- "<CurrentMedia>%s\\0%s\\01\\0%s\\0%s\\0%s\\0%s\\0%s\\0%s\\0%s\\0%s\\0%s\\0%s\\0\\0</CurrentMedia>"
- "<MachineGuid>%s</MachineGuid><DDP></DDP><SignatureSound></SignatureSound><Scene></Scene><ColorScheme></ColorScheme>"
- "<DDP></DDP><SignatureSound></SignatureSound><Scene></Scene><ColorScheme></ColorScheme>"
- "</Data>",
- msgEnc, szPlayer, szType, szFormatEnc, szTitle, szArtist, szAlbum, szTrack, szYear, szGenre,
- szLength, szPlayer, szType, MyOptions.szMachineGuid);
-
- mir_free(szArtist);
- mir_free(szAlbum);
- mir_free(szTitle);
- mir_free(szTrack);
- mir_free(szYear);
- mir_free(szGenre);
- mir_free(szLength);
- mir_free(szPlayer);
- mir_free(szType);
- mir_free(szFormatEnc);
- }
- mir_free(msgEnc);
-
- if (msnPreviousUUX == NULL || mir_strcmp(msnPreviousUUX, szMsg)) {
- replaceStr(msnPreviousUUX, szMsg);
- msnNsThread->sendPacket("UUX", "%d\r\n%s", sz, szMsg);
- mStatusMsgTS = clock();
- }
-#endif
}
// MSN_SendPacket - sends a packet accordingly to the MSN protocol
@@ -746,22 +636,6 @@ void CMsnProto::MSN_SetServerStatus(int newStatus)
unsigned myFlagsExEx = capexex_SupportsMissedConversations | capexex_SupportsShortCircuit;
char szMsg[2048];
-#ifdef OBSOLETE
- if (m_iStatus < ID_STATUS_ONLINE) {
- int sz = mir_snprintf(szMsg,
- "<EndpointData><Capabilities>%u:%u</Capabilities></EndpointData>", myFlags, myFlagsEx);
- msnNsThread->sendPacket("UUX", "%d\r\n%s", sz, szMsg);
-
- msnNsThread->sendPacket("BLP", msnOtherContactsBlocked ? "BL" : "AL");
-
- DBVARIANT dbv;
- if (!getStringUtf("Nick", &dbv)) {
- if (dbv.pszVal[0])
- MSN_SetNicknameUtf(dbv.pszVal);
- db_free(&dbv);
- }
- }
-#endif
char *szPlace;
DBVARIANT dbv;
@@ -805,35 +679,9 @@ void CMsnProto::MSN_SetServerStatus(int newStatus)
MyOptions.szMachineGuid,
sz, szMsg);
-
- // TODO: Send, MSN_SendStatusMessage anpassen.
-#ifdef OBSOLETE
- int sz = mir_snprintf(szMsg,
- "<PrivateEndpointData>"
- "<EpName>%s</EpName>"
- "<Idle>%s</Idle>"
- "<ClientType>1</ClientType>"
- "<State>%s</State>"
- "</PrivateEndpointData>",
- szPlace, newStatus == ID_STATUS_IDLE ? "true" : "false", szStatusName);
- msnNsThread->sendPacket("UUX", "%d\r\n%s", sz, szMsg);
-#endif
mir_free(szPlace);
-
-#ifdef OBSOLETE
- if (newStatus != ID_STATUS_IDLE) {
- char** msgptr = GetStatusMsgLoc(newStatus);
- if (msgptr != NULL)
- MSN_SendStatusMessage(*msgptr);
- }
-
- msnNsThread->sendPacket("CHG", "%s %u:%u %s", szStatusName, myFlags, myFlagsEx, msnObject.pszVal ? msnObject.pszVal : "0");
-#endif
db_free(&msnObject);
}
-#ifdef OBSOLETE
- else msnNsThread->sendPacket("CHG", szStatusName);
-#endif
}
// MSN_FetchRecentMessages - fetches missed offline messages
@@ -1083,13 +931,8 @@ filetransfer::~filetransfer(void)
CloseHandle(hLockHandle);
CloseHandle(hResumeEvt);
- if (fileId != -1) {
+ if (fileId != -1)
_close(fileId);
-#ifdef OBSOLETE
- if (tType != SERVER_HTTP && p2p_appID != MSN_APPID_FILE && !(std.flags & PFTS_SENDING))
- proto->p2p_pictureTransferFailed(this);
-#endif
- }
if (!bCompleted && p2p_appID == MSN_APPID_FILE) {
std.ptszFiles = NULL;
@@ -1181,71 +1024,6 @@ int filetransfer::openNext(void)
return fileId;
}
-#ifdef OBSOLETE
-directconnection::directconnection(const char* CallID, const char* Wlid)
-{
- memset(this, 0, sizeof(directconnection));
-
- wlid = mir_strdup(Wlid);
- callId = mir_strdup(CallID);
- mNonce = (UUID*)mir_alloc(sizeof(UUID));
- UuidCreate(mNonce);
- ts = time(NULL);
-}
-
-directconnection::~directconnection()
-{
- mir_free(wlid);
- mir_free(callId);
- mir_free(mNonce);
- mir_free(xNonce);
-}
-
-
-char* directconnection::calcHashedNonce(UUID* nonce)
-{
- mir_sha1_ctx sha1ctx;
- BYTE sha[MIR_SHA1_HASH_SIZE];
-
- mir_sha1_init(&sha1ctx);
- mir_sha1_append(&sha1ctx, (BYTE*)nonce, sizeof(UUID));
- mir_sha1_finish(&sha1ctx, sha);
-
- char* p;
- UuidToStringA((UUID*)&sha, (BYTE**)&p);
- size_t len = mir_strlen(p) + 3;
- char* result = (char*)mir_alloc(len);
- mir_snprintf(result, len, "{%s}", p);
- _strupr(result);
- RpcStringFreeA((BYTE**)&p);
-
- return result;
-}
-
-char* directconnection::mNonceToText(void)
-{
- char* p;
- UuidToStringA(mNonce, (BYTE**)&p);
- size_t len = mir_strlen(p) + 3;
- char* result = (char*)mir_alloc(len);
- mir_snprintf(result, len, "{%s}", p);
- _strupr(result);
- RpcStringFreeA((BYTE**)&p);
-
- return result;
-}
-
-
-void directconnection::xNonceToBin(UUID* nonce)
-{
- size_t len = mir_strlen(xNonce);
- char *p = (char*)alloca(len);
- mir_strcpy(p, xNonce + 1);
- p[len - 2] = 0;
- UuidFromStringA((BYTE*)p, nonce);
-}
-#endif
-
/////////////////////////////////////////////////////////////////////////////////////////
// TWinErrorCode class
diff --git a/protocols/MSN/src/msn_msgqueue.cpp b/protocols/MSN/src/msn_msgqueue.cpp
deleted file mode 100644
index 281a215544..0000000000
--- a/protocols/MSN/src/msn_msgqueue.cpp
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
-Plugin of Miranda IM for communicating with users of the MSN Messenger protocol.
-
-Copyright (c) 2012-2017 Miranda NG Team
-Copyright (c) 2006-2012 Boris Krasnovskiy.
-Copyright (c) 2003-2005 George Hazan.
-Copyright (c) 2002-2003 Richard Hughes (original version).
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "stdafx.h"
-#include "msn_proto.h"
-
-#ifdef OBSOLETE
-//a few little functions to manage queuing send message requests until the
-//connection is established
-
-void CMsnProto::MsgQueue_Init(void)
-{
- msgQueueSeq = 1;
-}
-
-void CMsnProto::MsgQueue_Uninit(void)
-{
- MsgQueue_Clear();
-}
-
-int CMsnProto::MsgQueue_Add(const char* wlid, int msgType, const char* msg, int msgSize, filetransfer* ft, int flags, STRLIST *cnt)
-{
- mir_cslock lck(csMsgQueue);
-
- MsgQueueEntry* E = new MsgQueueEntry;
- lsMessageQueue.insert(E);
-
- int seq = msgQueueSeq++;
-
- E->wlid = mir_strdup(wlid);
- E->msgSize = msgSize;
- E->msgType = msgType;
- if (msgSize <= 0)
- E->message = mir_strdup(msg);
- else
- memcpy(E->message = (char*)mir_alloc(msgSize), msg, msgSize);
- E->ft = ft;
- E->cont = cnt;
- E->seq = seq;
- E->flags = flags;
- E->allocatedToThread = 0;
- E->ts = time(NULL);
- return seq;
-}
-
-// shall we create another session?
-const char* CMsnProto::MsgQueue_CheckContact(const char* wlid, time_t tsc)
-{
- time_t ts = time(NULL);
-
- mir_cslock lck(csMsgQueue);
-
- for (int i = 0; i < lsMessageQueue.getCount(); i++)
- if (_stricmp(lsMessageQueue[i].wlid, wlid) == 0 && (tsc == 0 || (ts - lsMessageQueue[i].ts) < tsc))
- return wlid;
-
- return NULL;
-}
-
-//for threads to determine who they should connect to
-const char* CMsnProto::MsgQueue_GetNextRecipient(void)
-{
- mir_cslock lck(csMsgQueue);
-
- for (int i = 0; i < lsMessageQueue.getCount(); i++) {
- MsgQueueEntry& E = lsMessageQueue[i];
- if (!E.allocatedToThread) {
- E.allocatedToThread = 1;
-
- const char *ret = E.wlid;
- while (++i < lsMessageQueue.getCount())
- if (_stricmp(lsMessageQueue[i].wlid, ret) == 0)
- lsMessageQueue[i].allocatedToThread = 1;
-
- return ret;
- }
- }
-
- return NULL;
-}
-
-//deletes from list. Must mir_free() return value
-bool CMsnProto::MsgQueue_GetNext(const char* wlid, MsgQueueEntry& retVal)
-{
- int i;
-
- mir_cslock lck(csMsgQueue);
- for (i = 0; i < lsMessageQueue.getCount(); i++)
- if (_stricmp(lsMessageQueue[i].wlid, wlid) == 0)
- break;
-
- bool res = i != lsMessageQueue.getCount();
- if (res) {
- retVal = lsMessageQueue[i];
- lsMessageQueue.remove(i);
- }
-
- return res;
-}
-
-int CMsnProto::MsgQueue_NumMsg(const char* wlid)
-{
- int res = 0;
- mir_cslock lck(csMsgQueue);
-
- for (int i = 0; i < lsMessageQueue.getCount(); i++)
- res += (_stricmp(lsMessageQueue[i].wlid, wlid) == 0);
-
- return res;
-}
-
-void CMsnProto::MsgQueue_Clear(const char* wlid, bool msg)
-{
- int i;
-
- mir_cslockfull lck(csMsgQueue);
- if (wlid == NULL) {
- for (i = 0; i < lsMessageQueue.getCount(); i++) {
- const MsgQueueEntry& E = lsMessageQueue[i];
- if (E.msgSize == 0) {
- MCONTACT hContact = MSN_HContactFromEmail(E.wlid);
- ProtoBroadcastAck(hContact, ACKTYPE_MESSAGE, ACKRESULT_FAILED,
- (HANDLE)E.seq, (LPARAM)Translate("Message delivery failed"));
- }
- mir_free(E.message);
- mir_free(E.wlid);
- if (E.cont) delete E.cont;
- }
- lsMessageQueue.destroy();
-
- msgQueueSeq = 1;
- }
- else {
- for (i = 0; i < lsMessageQueue.getCount(); i++) {
- time_t ts = time(NULL);
- const MsgQueueEntry& E = lsMessageQueue[i];
- if (_stricmp(lsMessageQueue[i].wlid, wlid) == 0 && (!msg || E.msgSize == 0)) {
- bool msgfnd = E.msgSize == 0 && E.ts < ts;
- int seq = E.seq;
-
- mir_free(E.message);
- mir_free(E.wlid);
- if (E.cont) delete E.cont;
- lsMessageQueue.remove(i);
-
- if (msgfnd) {
- lck.unlock();
- MCONTACT hContact = MSN_HContactFromEmail(wlid);
- ProtoBroadcastAck(hContact, ACKTYPE_MESSAGE, ACKRESULT_FAILED, (HANDLE)seq,
- (LPARAM)Translate("Message delivery failed"));
- i = 0;
- lck.lock();
- }
- }
- }
- }
-}
-
-void __cdecl CMsnProto::MsgQueue_AllClearThread(void* arg)
-{
- MsgQueue_Clear((char*)arg);
- mir_free(arg);
-}
-#endif
diff --git a/protocols/MSN/src/msn_natdetect.cpp b/protocols/MSN/src/msn_natdetect.cpp
deleted file mode 100644
index 35f518b51b..0000000000
--- a/protocols/MSN/src/msn_natdetect.cpp
+++ /dev/null
@@ -1,471 +0,0 @@
-/*
-Plugin of Miranda IM for communicating with users of the MSN Messenger protocol.
-
-Copyright (c) 2012-2017 Miranda NG Team
-Copyright (c) 2007-2012 Boris Krasnovskiy.
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "stdafx.h"
-#include "msn_proto.h"
-#include <netfw.h>
-#ifdef OBSOLETE
-
-#ifndef CLSID_NetFwMgr
-#define MDEF_CLSID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
- const CLSID name = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
-
- MDEF_CLSID(CLSID_NetFwMgr, 0x304ce942, 0x6e39, 0x40d8, 0x94, 0x3a, 0xb9, 0x13, 0xc4, 0x0c, 0x9c, 0xd4);
- MDEF_CLSID(IID_INetFwMgr, 0xf7898af5, 0xcac4, 0x4632, 0xa2, 0xec, 0xda ,0x06, 0xe5, 0x11, 0x1a, 0xf2);
-#endif
-
-
-MyConnectionType MyConnection;
-
-const char* conStr[] =
-{
- "Unknown-Connect",
- "Direct-Connect",
- "Unknown-NAT",
- "IP-Restrict-NAT",
- "Port-Restrict-NAT",
- "Symmetric-NAT",
- "Firewall",
- "ISALike"
-};
-
-
-void CMsnProto::DecryptEchoPacket(UDPProbePkt& pkt)
-{
- pkt.clientPort ^= 0x3141;
- pkt.discardPort ^= 0x3141;
- pkt.testPort ^= 0x3141;
- pkt.clientIP ^= 0x31413141;
- pkt.testIP ^= 0x31413141;
-
-
- IN_ADDR addr;
- debugLogA("Echo packet: version: 0x%x service code: 0x%x transaction ID: 0x%x",
- pkt.version, pkt.serviceCode, pkt.trId);
- addr.S_un.S_addr = pkt.clientIP;
- debugLogA("Echo packet: client port: %u client addr: %s",
- pkt.clientPort, inet_ntoa(addr));
- addr.S_un.S_addr = pkt.testIP;
- debugLogA("Echo packet: discard port: %u test port: %u test addr: %s",
- pkt.discardPort, pkt.testPort, inet_ntoa(addr));
-}
-
-
-static void DiscardExtraPackets(SOCKET s)
-{
- Sleep(3000);
-
- static const TIMEVAL tv = { 0, 0 };
- unsigned buf;
-
- for (;;) {
- if (g_bTerminated) break;
-
- fd_set fd;
- FD_ZERO(&fd);
- FD_SET(s, &fd);
-
- if (select(1, &fd, NULL, NULL, &tv) == 1)
- recv(s, (char*)&buf, sizeof(buf), 0);
- else
- break;
- }
-}
-
-
-void CMsnProto::MSNatDetect(void)
-{
- PHOSTENT host = gethostbyname("echo.edge.messenger.live.com");
- if (host == NULL) {
- debugLogA("P2PNAT could not find echo server \"echo.edge.messenger.live.com\"");
- return;
- }
-
- SOCKADDR_IN addr;
- addr.sin_family = AF_INET;
- addr.sin_port = _htons(7001);
- addr.sin_addr = *(PIN_ADDR)host->h_addr_list[0];
-
- debugLogA("P2PNAT Detected echo server IP %d.%d.%d.%d",
- addr.sin_addr.S_un.S_un_b.s_b1, addr.sin_addr.S_un.S_un_b.s_b2,
- addr.sin_addr.S_un.S_un_b.s_b3, addr.sin_addr.S_un.S_un_b.s_b4);
-
- SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
- if (connect(s, (SOCKADDR*)&addr, sizeof(addr)) == SOCKET_ERROR) {
- debugLogA("P2PNAT could not connect to echo server \"echo.edge.messenger.live.com\"");
- closesocket(s);
- return;
- }
-
- UDPProbePkt pkt = { 0 }, pkt2;
-
- // Detect My IP
- pkt.version = 2;
- pkt.serviceCode = 4;
- send(s, (char*)&pkt, sizeof(pkt), 0);
-
- SOCKADDR_IN myaddr;
- int szname = sizeof(myaddr);
- getsockname(s, (SOCKADDR*)&myaddr, &szname);
-
- MyConnection.intIP = myaddr.sin_addr.S_un.S_addr;
- debugLogA("P2PNAT Detected IP facing internet %d.%d.%d.%d",
- myaddr.sin_addr.S_un.S_un_b.s_b1, myaddr.sin_addr.S_un.S_un_b.s_b2,
- myaddr.sin_addr.S_un.S_un_b.s_b3, myaddr.sin_addr.S_un.S_un_b.s_b4);
-
- SOCKET s1 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
-
- pkt.version = 2;
- pkt.serviceCode = 1;
- pkt.clientPort = 0x3141;
- pkt.clientIP = 0x31413141;
-
- UDPProbePkt rpkt = { 0 };
-
- // NAT detection
- unsigned i;
- for (i = 0; i < 4; ++i) {
- if (g_bTerminated) break;
-
- // Send echo request to server 1
- debugLogA("P2PNAT Request 1 attempt %d sent", i);
- sendto(s1, (char*)&pkt, sizeof(pkt), 0, (SOCKADDR*)&addr, sizeof(addr));
-
- fd_set fd;
- FD_ZERO(&fd);
- FD_SET(s1, &fd);
- TIMEVAL tv = { 0, 200000 * (1 << i) };
-
- if (select(1, &fd, NULL, NULL, &tv) == 1) {
- debugLogA("P2PNAT Request 1 attempt %d response", i);
- recv(s1, (char*)&rpkt, sizeof(rpkt), 0);
- pkt2 = rpkt;
- DecryptEchoPacket(rpkt);
- break;
- }
- else debugLogA("P2PNAT Request 1 attempt %d timeout", i);
- }
-
- closesocket(s);
-
- // Server did not respond
- if (i >= 4) {
- MyConnection.udpConType = conFirewall;
- closesocket(s1);
- return;
- }
-
- MyConnection.extIP = rpkt.clientIP;
-
- // Check if NAT not found
- if (MyConnection.extIP == MyConnection.intIP) {
- if (msnExternalIP != NULL && inet_addr(msnExternalIP) != MyConnection.extIP)
- MyConnection.udpConType = conISALike;
- else
- MyConnection.udpConType = conDirect;
-
- closesocket(s1);
- return;
- }
-
- // Detect UPnP NAT
- NETLIBBIND nlb = { 0 };
- nlb.cbSize = sizeof(nlb);
- nlb.pfnNewConnectionV2 = MSN_ConnectionProc;
- nlb.pExtra = this;
-
- HANDLE sb = (HANDLE)CallService(MS_NETLIB_BINDPORT, (WPARAM)m_hNetlibUser, (LPARAM)&nlb);
- if (sb != NULL) {
- MyConnection.upnpNAT = htonl(nlb.dwExternalIP) == MyConnection.extIP;
- Sleep(100);
- Netlib_CloseHandle(sb);
- }
-
- DiscardExtraPackets(s1);
-
- // Start IP Restricted NAT detection
- UDPProbePkt rpkt2 = { 0 };
- pkt2.serviceCode = 3;
- SOCKADDR_IN addr2 = addr;
- addr2.sin_addr.S_un.S_addr = rpkt.testIP;
- addr2.sin_port = rpkt.discardPort;
- for (i = 0; i < 4; ++i) {
- if (g_bTerminated) break;
-
- debugLogA("P2PNAT Request 2 attempt %d sent", i);
- // Remove IP restriction for server 2
- sendto(s1, NULL, 0, 0, (SOCKADDR*)&addr2, sizeof(addr2));
- // Send echo request to server 1 for server 2
- sendto(s1, (char*)&pkt2, sizeof(pkt2), 0, (SOCKADDR*)&addr, sizeof(addr));
-
- fd_set fd;
- FD_ZERO(&fd);
- FD_SET(s1, &fd);
- TIMEVAL tv = { 0, 200000 * (1 << i) };
-
- if (select(1, &fd, NULL, NULL, &tv) == 1) {
- debugLogA("P2PNAT Request 2 attempt %d response", i);
- recv(s1, (char*)&rpkt2, sizeof(rpkt2), 0);
- DecryptEchoPacket(rpkt2);
- break;
- }
- else
- debugLogA("P2PNAT Request 2 attempt %d timeout", i);
- }
-
- // Response recieved so it's an IP Restricted NAT (Restricted Cone NAT)
- // (MSN does not detect Full Cone NAT and consider it as IP Restricted NAT)
- if (i < 4) {
- MyConnection.udpConType = conIPRestrictNAT;
- closesocket(s1);
- return;
- }
-
- DiscardExtraPackets(s1);
-
- // Symmetric NAT detection
- addr2.sin_port = rpkt.testPort;
- for (i = 0; i < 4; ++i) {
- if (g_bTerminated) break;
-
- debugLogA("P2PNAT Request 3 attempt %d sent", i);
- // Send echo request to server 1
- sendto(s1, (char*)&pkt, sizeof(pkt), 0, (SOCKADDR*)&addr2, sizeof(addr2));
-
- fd_set fd;
- FD_ZERO(&fd);
- FD_SET(s1, &fd);
- TIMEVAL tv = { 1 << i, 0 };
-
- if (select(1, &fd, NULL, NULL, &tv) == 1) {
- debugLogA("P2PNAT Request 3 attempt %d response", i);
- recv(s1, (char*)&rpkt2, sizeof(rpkt2), 0);
- DecryptEchoPacket(rpkt2);
- break;
- }
- else
- debugLogA("P2PNAT Request 3 attempt %d timeout", i);
- }
- if (i < 4) {
- // If ports different it's symmetric NAT
- MyConnection.udpConType = rpkt.clientPort == rpkt2.clientPort ?
-conPortRestrictNAT : conSymmetricNAT;
- }
- closesocket(s1);
-}
-
-
-static bool IsIcfEnabled(void)
-{
- HRESULT hr;
- VARIANT_BOOL fwEnabled = VARIANT_FALSE;
-
- INetFwProfile* fwProfile = NULL;
- INetFwMgr* fwMgr = NULL;
- INetFwPolicy* fwPolicy = NULL;
- INetFwAuthorizedApplication* fwApp = NULL;
- INetFwAuthorizedApplications* fwApps = NULL;
- BSTR fwBstrProcessImageFileName = NULL;
- wchar_t *wszFileName = NULL;
-
- hr = CoInitialize(NULL);
- if (FAILED(hr)) return false;
-
- // Create an instance of the firewall settings manager.
- hr = CoCreateInstance(CLSID_NetFwMgr, NULL, CLSCTX_INPROC_SERVER,
- IID_INetFwMgr, (void**)&fwMgr);
- if (FAILED(hr)) goto error;
-
- // Retrieve the local firewall policy.
- hr = fwMgr->get_LocalPolicy(&fwPolicy);
- if (FAILED(hr)) goto error;
-
- // Retrieve the firewall profile currently in effect.
- hr = fwPolicy->get_CurrentProfile(&fwProfile);
- if (FAILED(hr)) goto error;
-
- // Get the current state of the firewall.
- hr = fwProfile->get_FirewallEnabled(&fwEnabled);
- if (FAILED(hr)) goto error;
-
- if (fwEnabled == VARIANT_FALSE) goto error;
-
- // Retrieve the authorized application collection.
- hr = fwProfile->get_AuthorizedApplications(&fwApps);
- if (FAILED(hr)) goto error;
-
- wchar_t szFileName[MAX_PATH];
- GetModuleFileName(NULL, szFileName, _countof(szFileName));
-
- wszFileName = mir_wstrdup(szFileName);
-
- // Allocate a BSTR for the process image file name.
- fwBstrProcessImageFileName = SysAllocString(wszFileName);
- if (FAILED(hr)) goto error;
-
- // Attempt to retrieve the authorized application.
- hr = fwApps->Item(fwBstrProcessImageFileName, &fwApp);
- if (SUCCEEDED(hr)) {
- // Find out if the authorized application is enabled.
- fwApp->get_Enabled(&fwEnabled);
- fwEnabled = ~fwEnabled;
- }
-
-error:
- // Free the BSTR.
- SysFreeString(fwBstrProcessImageFileName);
- mir_free(wszFileName);
-
- // Release the authorized application instance.
- if (fwApp != NULL) fwApp->Release();
-
- // Release the authorized application collection.
- if (fwApps != NULL) fwApps->Release();
-
- // Release the firewall profile.
- if (fwProfile != NULL) fwProfile->Release();
-
- // Release the local firewall policy.
- if (fwPolicy != NULL) fwPolicy->Release();
-
- // Release the firewall settings manager.
- if (fwMgr != NULL) fwMgr->Release();
-
- CoUninitialize();
-
- return fwEnabled != VARIANT_FALSE;
-}
-
-void CMsnProto::MSNConnDetectThread(void*)
-{
- char parBuf[512] = "";
-
- memset(&MyConnection, 0, sizeof(MyConnection));
-
- MyConnection.icf = IsIcfEnabled();
- bool portsMapped = getByte("NLSpecifyIncomingPorts", 0) != 0;
-
- unsigned gethst = getByte("AutoGetHost", 1);
- switch (gethst) {
- case 0:
- debugLogA("P2PNAT User overwrote IP connection is guessed by user settings only");
-
- // User specified host by himself so check if it matches MSN information
- // if it does, move to connection type autodetection,
- // if it does not, guess connection type from available info
- db_get_static(NULL, m_szModuleName, "YourHost", parBuf, sizeof(parBuf));
- if (msnExternalIP == NULL || mir_strcmp(msnExternalIP, parBuf) != 0) {
- MyConnection.extIP = inet_addr(parBuf);
- if (MyConnection.extIP == INADDR_NONE) {
- PHOSTENT myhost = gethostbyname(parBuf);
- if (myhost != NULL)
- MyConnection.extIP = ((PIN_ADDR)myhost->h_addr)->S_un.S_addr;
- else
- setByte("AutoGetHost", 1);
- }
- if (MyConnection.extIP != INADDR_NONE) {
- MyConnection.intIP = MyConnection.extIP;
- MyConnection.udpConType = MyConnection.extIP ? (ConEnum)portsMapped : conUnknown;
- MyConnection.CalculateWeight();
- return;
- }
- else
- MyConnection.extIP = 0;
- }
- break;
-
- case 1:
- if (msnExternalIP != NULL)
- MyConnection.extIP = inet_addr(msnExternalIP);
- else {
- gethostname(parBuf, sizeof(parBuf));
- PHOSTENT myhost = gethostbyname(parBuf);
- if (myhost != NULL)
- MyConnection.extIP = ((PIN_ADDR)myhost->h_addr)->S_un.S_addr;
- }
- MyConnection.intIP = MyConnection.extIP;
- break;
-
- case 2:
- MyConnection.udpConType = conUnknown;
- MyConnection.CalculateWeight();
- return;
- }
-
- if (getByte("NLSpecifyOutgoingPorts", 0)) {
- // User specified outgoing ports so the connection must be firewalled
- // do not autodetect and guess connection type from available info
- MyConnection.intIP = MyConnection.extIP;
- MyConnection.udpConType = (ConEnum)portsMapped;
- MyConnection.upnpNAT = false;
- MyConnection.CalculateWeight();
- return;
- }
-
- MSNatDetect();
-
- // If user mapped incoming ports consider direct connection
- if (portsMapped) {
- debugLogA("P2PNAT User manually mapped ports for incoming connection");
- switch (MyConnection.udpConType) {
- case conUnknown:
- case conFirewall:
- case conISALike:
- MyConnection.udpConType = conDirect;
- break;
-
- case conUnknownNAT:
- case conPortRestrictNAT:
- case conIPRestrictNAT:
- case conSymmetricNAT:
- MyConnection.upnpNAT = true;
- break;
- }
- }
-
- debugLogA("P2PNAT Connection %s found UPnP: %d ICF: %d", conStr[MyConnection.udpConType],
- MyConnection.upnpNAT, MyConnection.icf);
-
- MyConnection.CalculateWeight();
-}
-
-void MyConnectionType::SetUdpCon(const char* str)
-{
- for (unsigned i = 0; i < sizeof(conStr) / sizeof(char*); ++i) {
- if (mir_strcmp(conStr[i], str) == 0) {
- udpConType = (ConEnum)i;
- break;
- }
- }
-}
-
-void MyConnectionType::CalculateWeight(void)
-{
- if (icf) weight = 0;
- else if (udpConType == conDirect) weight = 6;
- else if (udpConType >= conIPRestrictNAT && udpConType <= conSymmetricNAT)
- weight = upnpNAT ? 5 : 2;
- else if (udpConType == conUnknownNAT)
- weight = upnpNAT ? 4 : 1;
- else if (udpConType == conUnknown) weight = 1;
- else if (udpConType == conFirewall) weight = 2;
- else if (udpConType == conISALike) weight = 3;
-}
-#endif
diff --git a/protocols/MSN/src/msn_opts.cpp b/protocols/MSN/src/msn_opts.cpp
index e672669625..a78ba0f48d 100644
--- a/protocols/MSN/src/msn_opts.cpp
+++ b/protocols/MSN/src/msn_opts.cpp
@@ -248,30 +248,6 @@ LBL_Continue:
proto->setString("Password", password);
}
-#ifdef OBSOLETE
- GetDlgItemText(hwndDlg, IDC_HANDLE2, screenStr, _countof(screenStr));
- if (!proto->getWString("Nick", &dbv)) {
- if (mir_wstrcmp(dbv.ptszVal, screenStr))
- proto->MSN_SendNickname(screenStr);
- db_free(&dbv);
- }
- else proto->MSN_SendNickname(screenStr);
-
- BYTE mblsnd = IsDlgButtonChecked(hwndDlg, IDC_MOBILESEND) == BST_CHECKED;
- if (mblsnd != proto->getByte("MobileAllowed", 0)) {
- proto->msnNsThread->sendPacket("PRP", "MOB %c", mblsnd ? 'Y' : 'N');
- proto->MSN_SetServerStatus(proto->m_iStatus);
- }
-
- unsigned tValue = IsDlgButtonChecked(hwndDlg, IDC_DISABLE_ANOTHER_CONTACTS);
- if (tValue != proto->msnOtherContactsBlocked && proto->msnLoggedIn) {
- proto->msnOtherContactsBlocked = tValue;
- proto->msnNsThread->sendPacket("BLP", tValue ? "BL" : "AL");
- proto->MSN_ABUpdateAttr(NULL, "MSN.IM.BLP", tValue ? "0" : "1");
- break;
- }
-#endif
-
proto->setByte("SendFontInfo", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_SENDFONTINFO));
proto->setByte("RunMailerOnHotmail", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_RUN_APP_ON_HOTMAIL));
proto->setByte("ManageServer", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_MANAGEGROUPS));
@@ -404,10 +380,6 @@ static INT_PTR CALLBACK DlgProcMsnConnOpts(HWND hwndDlg, UINT msg, WPARAM wParam
}
}
-#ifdef OBSOLETE
- unsigned gethst2 = proto->getByte("AutoGetHost", 1);
-
-#endif
unsigned gethst = SendDlgItemMessage(hwndDlg, IDC_HOSTOPT, CB_GETCURSEL, 0, 0);
if (gethst < 2) gethst = !gethst;
proto->setByte("AutoGetHost", (BYTE)gethst);
@@ -418,11 +390,6 @@ static INT_PTR CALLBACK DlgProcMsnConnOpts(HWND hwndDlg, UINT msg, WPARAM wParam
}
else proto->delSetting("YourHost");
-#ifdef OBSOLETE
- if (gethst != gethst2)
- proto->ForkThread(&CMsnProto::MSNConnDetectThread, NULL);
-#endif
-
proto->LoadOptions();
return TRUE;
}
diff --git a/protocols/MSN/src/msn_p2p.cpp b/protocols/MSN/src/msn_p2p.cpp
deleted file mode 100644
index 2c81a6ecc0..0000000000
--- a/protocols/MSN/src/msn_p2p.cpp
+++ /dev/null
@@ -1,2328 +0,0 @@
-/*
-Plugin of Miranda IM for communicating with users of the MSN Messenger protocol.
-
-Copyright (c) 2012-2017 Miranda NG Team
-Copyright (c) 2006-2012 Boris Krasnovskiy.
-Copyright (c) 2003-2005 George Hazan.
-Copyright (c) 2002-2003 Richard Hughes (original version).
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "stdafx.h"
-#include "msn_proto.h"
-#include "m_smileyadd.h"
-
-static const char sttP2Pheader[] =
- "Content-Type: application/x-msnmsgrp2p\r\n"
- "P2P-Dest: %s\r\n\r\n";
-
-static const char sttP2PheaderV2[] =
- "Content-Type: application/x-msnmsgrp2p\r\n"
- "P2P-Dest: %s\r\n"
- "P2P-Src: %s;%s\r\n\r\n";
-
-const char sttVoidUid[] = "{00000000-0000-0000-0000-000000000000}";
-#ifdef OBSOLETE
-static const char szUbnCall[] = "{F13B5C79-0126-458F-A29D-747C79C56530}";
-
-static const char p2pV2Caps[] = { 0x01, 0x0C, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0F, 0x01, 0x00, 0x00 };
-
-void P2P_Header::logHeader(CMsnProto *ppro)
-{
- ppro->debugLogA("--- Printing message header");
- ppro->debugLogA(" SessionID = %08X", mSessionID);
- ppro->debugLogA(" MessageID = %08X", mID);
-#ifndef __GNUC__
- ppro->debugLogA(" Offset of data = %I64u", mOffset);
- ppro->debugLogA(" Total amount of data = %I64u", mTotalSize);
-#else
- ppro->debugLogA(" Offset of data = %llu", mOffset);
- ppro->debugLogA(" Total amount of data = %llu", hdrdata->mTotalSize);
-#endif
- ppro->debugLogA(" Data in packet = %lu bytes", mPacketLen);
- ppro->debugLogA(" Flags = %08X", mFlags);
- ppro->debugLogA(" Acknowledged session ID: %08X", mAckSessionID);
- ppro->debugLogA(" Acknowledged message ID: %08X", mAckUniqueID);
-#ifndef __GNUC__
- ppro->debugLogA(" Acknowledged data size: %I64u", mAckDataSize);
-#else
- ppro->debugLogA(" Acknowledged data size: %llu", mAckDataSize);
-#endif
- ppro->debugLogA("------------------------");
-}
-
-void P2PV2_Header::logHeader(CMsnProto *ppro)
-{
- ppro->debugLogA("--- Printing message header");
- ppro->debugLogA(" SessionID = %08X", mSessionID);
- ppro->debugLogA(" MessageID = %08X", mID);
-#ifndef __GNUC__
- ppro->debugLogA(" Remaining amount of data = %I64u", mRemSize);
-#else
- ppro->debugLogA(" Remaining amount of data = %llu", mTotalSize);
-#endif
- ppro->debugLogA(" Data in packet = %lu bytes", mPacketLen);
- ppro->debugLogA(" Packet Number = %lu", mPacketNum);
- ppro->debugLogA(" Operation Code = %08X", mOpCode);
- ppro->debugLogA(" TF Code = %08X", mTFCode);
- ppro->debugLogA(" Acknowledged message ID: %08X", mAckUniqueID);
- ppro->debugLogA("------------------------");
-}
-
-bool CMsnProto::p2p_createListener(filetransfer* ft, directconnection *dc, MimeHeaders& chdrs)
-{
- if (MyConnection.extIP == 0) return false;
-
- NETLIBBIND nlb = { 0 };
- nlb.cbSize = sizeof(nlb);
- nlb.pfnNewConnectionV2 = MSN_ConnectionProc;
- nlb.pExtra = this;
- HANDLE sb = (HANDLE)CallService(MS_NETLIB_BINDPORT, (WPARAM)m_hNetlibUser, (LPARAM)&nlb);
- if (sb == NULL) {
- debugLogA("Unable to bind the port for incoming transfers");
- return false;
- }
-
- ThreadData* newThread = new ThreadData;
- newThread->mType = SERVER_P2P_DIRECT;
- newThread->mCaller = 3;
- newThread->mIncomingBoundPort = sb;
- newThread->mIncomingPort = nlb.wPort;
- strncpy(newThread->mCookie, dc->callId, sizeof(newThread->mCookie));
- newThread->mInitialContactWLID = mir_strdup(ft->p2p_dest);
-
- newThread->startThread(&CMsnProto::p2p_filePassiveThread, this);
-
- char szIpv4[256] = "";
- char szIpv6[256] = "";
- const char *szExtIp = MyConnection.GetMyExtIPStr();
-
- bool ipInt = false;
- int i4 = 0, i6 = 0;
-
- NETLIBIPLIST* ihaddr = (NETLIBIPLIST*)CallService(MS_NETLIB_GETMYIP, 1, 0);
- for (unsigned i = 0; i < ihaddr->cbNum; ++i) {
- if (strchr(ihaddr->szIp[i], ':')) {
- if (i6++ != 0) mir_strcat(szIpv6, " ");
- mir_strcat(szIpv6, ihaddr->szIp[i]);
- }
- else {
- if (i4++ != 0) mir_strcat(szIpv4, " ");
- ipInt |= (mir_strcmp(ihaddr->szIp[i], szExtIp) == 0);
- mir_strcat(szIpv4, ihaddr->szIp[i]);
- }
- }
- mir_free(ihaddr);
-
- chdrs.addString("Bridge", "TCPv1");
- chdrs.addBool("Listening", true);
-
- if (dc->useHashedNonce)
- chdrs.addString("Hashed-Nonce", dc->mNonceToHash(), 2);
- else
- chdrs.addString("Nonce", dc->mNonceToText(), 2);
-
- bool bUbnCall = !ft->p2p_sessionid;
-
- if (!ipInt) {
- chdrs.addString("IPv4External-Addrs", mir_strdup(MyConnection.GetMyExtIPStr()), bUbnCall ? 6 : 2);
- chdrs.addLong("IPv4External-Port", nlb.wExPort, bUbnCall ? 4 : 0);
- }
- chdrs.addString("IPv4Internal-Addrs", mir_strdup(szIpv4), bUbnCall ? 6 : 2);
- chdrs.addLong("IPv4Internal-Port", nlb.wPort, bUbnCall ? 4 : 0);
- if (szIpv6[0]) {
- chdrs.addString("IPv6-Addrs", mir_strdup(szIpv6), 2);
- chdrs.addLong("IPv6-Port", nlb.wPort);
- }
- chdrs.addULong("SessionID", ft->p2p_sessionid);
- chdrs.addString("SChannelState", "0");
- chdrs.addString("Capabilities-Flags", "1");
-
- return true;
-}
-
-bool p2p_IsDlFileOk(filetransfer* ft)
-{
- mir_sha1_ctx sha1ctx;
- BYTE sha[MIR_SHA1_HASH_SIZE];
- mir_sha1_init(&sha1ctx);
-
- bool res = false;
-
- int fileId = _wopen(ft->std.tszCurrentFile, O_RDONLY | _O_BINARY, _S_IREAD);
- if (fileId != -1) {
- BYTE buf[4096];
- int bytes;
-
- while ((bytes = _read(fileId, buf, sizeof(buf))) > 0)
- mir_sha1_append(&sha1ctx, buf, bytes);
-
- _close(fileId);
- mir_sha1_finish(&sha1ctx, sha);
-
- char *szSha = arrayToHex(sha, MIR_SHA1_HASH_SIZE);
- char *szAvatarHash = MSN_GetAvatarHash(ft->p2p_object);
-
- res = szAvatarHash != NULL && _stricmp(szAvatarHash, szSha) == 0;
-
- mir_free(szSha);
- mir_free(szAvatarHash);
- }
- return res;
-}
-
-
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// sttSavePicture2disk - final handler for avatars downloading
-
-void CMsnProto::p2p_pictureTransferFailed(filetransfer* ft)
-{
- switch (ft->p2p_type) {
- case MSN_APPID_AVATAR:
- case MSN_APPID_AVATAR2:
- {
- PROTO_AVATAR_INFORMATION ai = { 0 };
- ai.hContact = ft->std.hContact;
- delSetting(ft->std.hContact, "AvatarHash");
- ProtoBroadcastAck(ai.hContact, ACKTYPE_AVATAR, ACKRESULT_FAILED, &ai, 0);
- }
- break;
- }
- _wremove(ft->std.tszCurrentFile);
-}
-
-void CMsnProto::p2p_savePicture2disk(filetransfer* ft)
-{
- ft->close();
-
- if (p2p_IsDlFileOk(ft)) {
- int fileId = _wopen(ft->std.tszCurrentFile, O_RDONLY | _O_BINARY, _S_IREAD);
- if (fileId == -1) {
- p2p_pictureTransferFailed(ft);
- return;
- }
-
- const wchar_t* ext;
- int format;
- BYTE buf[6];
-
- int bytes = _read(fileId, buf, sizeof(buf));
- _close(fileId);
- if (bytes > 4)
- format = ProtoGetBufferFormat(buf, &ext);
- else {
- p2p_pictureTransferFailed(ft);
- return;
- }
-
- switch (ft->p2p_type) {
- case MSN_APPID_AVATAR:
- case MSN_APPID_AVATAR2:
- {
- PROTO_AVATAR_INFORMATION ai = { 0 };
- ai.format = format;
- ai.hContact = ft->std.hContact;
- MSN_GetAvatarFileName(ai.hContact, ai.filename, _countof(ai.filename), ext);
-
- _wrename(ft->std.tszCurrentFile, ai.filename);
-
- // Store also avatar hash
- char *szAvatarHash = MSN_GetAvatarHash(ft->p2p_object);
- setString(ft->std.hContact, "AvatarSavedHash", szAvatarHash);
- mir_free(szAvatarHash);
-
- setString(ft->std.hContact, "PictSavedContext", ft->p2p_object);
- ProtoBroadcastAck(ai.hContact, ACKTYPE_AVATAR, ACKRESULT_SUCCESS, &ai, 0);
-
- debugLogA("Avatar for contact %08x saved to file '%s'", ai.hContact, T2Utf(ai.filename));
- }
- break;
-
- case MSN_APPID_CUSTOMSMILEY:
- case MSN_APPID_CUSTOMANIMATEDSMILEY:
- {
- SMADD_CONT cont;
- cont.cbSize = sizeof(SMADD_CONT);
- cont.hContact = ft->std.hContact;
- cont.type = 1;
-
- wchar_t* pathcpy = mir_wstrdup(ft->std.tszCurrentFile);
- mir_wstrcpy(wcsrchr(pathcpy, '.') + 1, ext);
- _wrename(ft->std.tszCurrentFile, pathcpy);
-
- cont.path = pathcpy;
-
- CallService(MS_SMILEYADD_LOADCONTACTSMILEYS, 0, (LPARAM)&cont);
- mir_free(pathcpy);
- }
- break;
- }
- }
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// p2p_sendAck - sends MSN P2P acknowledgement to the received message
-
-static const char sttVoidSession[] = "ACHTUNG!!! an attempt made to send a message via the empty session";
-
-void CMsnProto::p2p_sendMsg(const char *wlid, unsigned appId, P2PB_Header& hdrdata, char* msgbody, size_t msgsz)
-{
- ThreadData* info = MSN_GetP2PThreadByContact(wlid);
- if (info == NULL) {
- bool isOffline;
- info = MSN_StartSB(wlid, isOffline);
- }
- p2p_sendMsg(info, wlid, appId, hdrdata, msgbody, msgsz);
-}
-
-void CMsnProto::p2p_sendMsg(ThreadData* info, const char *wlid, unsigned appId, P2PB_Header& hdrdata, char* msgbody, size_t msgsz)
-{
- unsigned msgType;
-
- if (info == NULL) msgType = 0;
- else if (info->mType == SERVER_P2P_DIRECT) msgType = 1;
- else msgType = 2;
-
- unsigned fportion = msgType == 1 ? 1352 : 1202;
- if (hdrdata.isV2Hdr()) fportion += 4;
-
- char* buf = (char*)alloca(sizeof(sttP2PheaderV2) + MSN_MAX_EMAIL_LEN +
- 120 + fportion);
-
- size_t offset = 0;
- do {
- size_t portion = msgsz - offset;
- if (portion > fportion) portion = fportion;
-
- char* p = buf;
-
- // add message header
- p += msgType == 1 ? sizeof(unsigned) :
- sprintf(p, hdrdata.isV2Hdr() ? sttP2PheaderV2 : sttP2Pheader, wlid, MyOptions.szEmail, MyOptions.szMachineGuidP2P); //!!!!!!!!!!!
-
- if (hdrdata.isV2Hdr()) {
- P2PV2_Header *ph = (P2PV2_Header*)&hdrdata;
- if (offset == 0) {
- if (!info || !info->mBridgeInit) {
- if (info && ph->mSessionID) {
- P2PV2_Header tHdr;
- tHdr.mID = ph->mID;
- p2p_sendMsg(info, wlid, 0, tHdr, NULL, 0);
- }
- else {
- ph->mOpCode |= ph->mAckUniqueID && msgType != 1 ? 1 : 3;
- ph->mCap = p2pV2Caps;
- if (info) info->mBridgeInit = true;
- }
- }
- }
- else {
- ph->mOpCode = 0;
- ph->mCap = NULL;
- }
- }
-
- if (msgsz) {
- if (hdrdata.isV2Hdr()) {
- P2PV2_Header *ph = (P2PV2_Header*)&hdrdata;
- ph->mPacketLen = (unsigned)portion;
- ph->mRemSize = msgsz - offset - portion;
- ph->mTFCode = offset ? ph->mTFCode & 0xfe : ph->mTFCode | 0x01;
-
- if (offset == 0)
- ph->mPacketNum = p2p_getPktNum(wlid);
- }
- else {
- P2P_Header *ph = (P2P_Header*)&hdrdata;
- ph->mPacketLen = (unsigned)portion;
- ph->mOffset = offset;
- ph->mTotalSize = msgsz;
- }
- }
-
- // add message body
- p = hdrdata.createMsg(p, wlid, this);
- hdrdata.logHeader(this);
-
- if (msgsz)
- memcpy(p, msgbody + offset, portion); p += portion;
-
- // add message footer
- if (msgType != 1) {
- *(unsigned*)p = _htonl(appId);
- p += 4;
- }
-
- char* szEmail;
- switch (msgType) {
- case 0:
- parseWLID(NEWSTR_ALLOCA(wlid), NULL, &szEmail, NULL);
- MsgQueue_Add(szEmail, 'D', buf, p - buf);
- break;
-
- case 1:
- *(unsigned*)buf = (unsigned)(p - buf - sizeof(unsigned));
- info->send(buf, p - buf);
- break;
-
- case 2:
- info->sendRawMessage('D', buf, p - buf);
- break;
- }
- offset += portion;
- } while (offset < msgsz);
-}
-
-
-void CMsnProto::p2p_sendAck(const char *wlid, P2PB_Header* hdr)
-{
- if (hdr == NULL) return;
-
- if (!hdr->isV2Hdr()) {
- P2P_Header *hdrdata = (P2P_Header*)hdr;
- P2P_Header tHdr;
-
- tHdr.mSessionID = hdrdata->mSessionID;
- tHdr.mAckDataSize = hdrdata->mTotalSize;
- tHdr.mFlags = 2;
- tHdr.mAckSessionID = hdrdata->mID;
- tHdr.mAckUniqueID = hdrdata->mAckSessionID;
-
- p2p_sendMsg(wlid, 0, tHdr, NULL, 0);
- }
- else {
- P2PV2_Header *hdrdata = (P2PV2_Header*)hdr;
- P2PV2_Header tHdr;
-
- tHdr.mAckUniqueID = hdrdata->mID;
-
- p2p_sendMsg(wlid, 0, tHdr, NULL, 0);
- }
-}
-
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// p2p_sendEndSession - sends MSN P2P file transfer end packet
-
-void CMsnProto::p2p_sendAbortSession(filetransfer* ft)
-{
- if (ft == NULL) {
- debugLogA(sttVoidSession);
- return;
- }
-
- if (ft->p2p_isV2) return;
-
- P2P_Header tHdr;
-
- tHdr.mSessionID = ft->p2p_sessionid;
- tHdr.mAckSessionID = ft->p2p_sendmsgid;
- tHdr.mID = p2p_getMsgId(ft->p2p_dest, 1);
-
- if (ft->std.flags & PFTS_SENDING) {
- tHdr.mFlags = 0x40;
- tHdr.mAckSessionID = tHdr.mID - 2;
- }
- else {
- tHdr.mAckUniqueID = 0x8200000f;
- tHdr.mFlags = 0x80;
- tHdr.mAckDataSize = ft->std.currentFileSize;
- }
-
- p2p_sendMsg(ft->p2p_dest, 0, tHdr, NULL, 0);
- ft->ts = time(NULL);
-}
-
-void CMsnProto::p2p_sendRedirect(filetransfer* ft)
-{
- if (ft == NULL) {
- debugLogA(sttVoidSession);
- return;
- }
-
- if (ft->p2p_isV2) return;
-
- P2P_Header tHdr;
-
- tHdr.mSessionID = ft->p2p_sessionid;
- tHdr.mFlags = 0x01;
- tHdr.mAckSessionID = ft->p2p_sendmsgid;
- tHdr.mAckDataSize = ft->std.currentFileProgress;
-
- p2p_sendMsg(ft->p2p_dest, 0, tHdr, NULL, 0);
-
- ft->tTypeReq = MSN_GetP2PThreadByContact(ft->p2p_dest) ? SERVER_P2P_DIRECT : SERVER_SWITCHBOARD;
- ft->ts = time(NULL);
- ft->p2p_waitack = true;
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// p2p_sendSlp - send MSN P2P SLP packet
-
-void CMsnProto::p2p_sendSlp(int iKind, filetransfer *ft, MimeHeaders &pHeaders,
- MimeHeaders &pContent, const char *wlid)
-{
- if (ft == NULL) {
- debugLogA(sttVoidSession);
- return;
- }
-
- if (wlid == NULL) wlid = ft->p2p_dest;
-
- size_t cbContLen = pContent.getLength();
- pHeaders.addULong("Content-Length", (unsigned)cbContLen + 1);
-
- char* buf = (char*)alloca(pHeaders.getLength() + cbContLen + 512);
- char* p = buf;
-
- switch (iKind) {
- case -3: p += sprintf(p, "ACK MSNMSGR:%s MSNSLP/1.0", wlid); break; //!!!!!!!!!!!!!!!!!!
- case -2: p += sprintf(p, "INVITE MSNMSGR:%s MSNSLP/1.0", wlid); break; //!!!!!!!!!!!!!!!!!!
- case -1: p += sprintf(p, "BYE MSNMSGR:%s MSNSLP/1.0", wlid); break; //!!!!!!!!!!!!!!!!!!
- case 200: p += sprintf(p, "MSNSLP/1.0 200 OK"); break; //!!!!!!!!!!!!!!!!!!
- case 481: p += sprintf(p, "MSNSLP/1.0 481 No Such Call"); break; //!!!!!!!!!!!!!!!!!!
- case 500: p += sprintf(p, "MSNSLP/1.0 500 Internal Error"); break; //!!!!!!!!!!!!!!!!!!
- case 603: p += sprintf(p, "MSNSLP/1.0 603 DECLINE"); break; //!!!!!!!!!!!!!!!!!!
- case 1603: p += sprintf(p, "MSNSLP/1.0 603 Decline"); break; //!!!!!!!!!!!!!!!!!!
- default: return;
- }
-
- if (iKind < 0) {
- mir_free(ft->p2p_branch);
- ft->p2p_branch = getNewUuid();
- }
-
- if (ft->p2p_isV2) {
- p += sprintf(p,
- "\r\nTo: <msnmsgr:%s>\r\n"
- "From: <msnmsgr:%s;%s>\r\n"
- "Via: MSNSLP/1.0/TLP ;branch=%s\r\n",
- wlid, MyOptions.szEmail, MyOptions.szMachineGuidP2P, ft->p2p_branch); //!!!!!!!!!!!!!!!!!!
- }
- else {
- p += sprintf(p,
- "\r\nTo: <msnmsgr:%s>\r\n"
- "From: <msnmsgr:%s>\r\n"
- "Via: MSNSLP/1.0/TLP ;branch=%s\r\n",
- wlid, MyOptions.szEmail, ft->p2p_branch); //!!!!!!!!!!!!!!!!!!
- }
-
- p = pHeaders.writeToBuffer(p);
- p = pContent.writeToBuffer(p);
-
- unsigned short status = getWord(ft->std.hContact, "Status", ID_STATUS_OFFLINE);
- if (!(myFlags & cap_SupportsP2PBootstrap) || ft->p2p_sessionid ||
- MSN_GetThreadByContact(wlid, SERVER_P2P_DIRECT) ||
- status == ID_STATUS_OFFLINE || status == ID_STATUS_INVISIBLE ||
- m_iStatus == ID_STATUS_INVISIBLE) {
- if (!ft->p2p_isV2) {
- P2P_Header tHdr;
- tHdr.mAckSessionID = ft->p2p_acksessid;
-
- p2p_sendMsg(wlid, 0, tHdr, buf, p - buf + 1);
- ft->p2p_waitack = true;
-
- switch (iKind) {
- case -1: case 500: case 603:
- ft->p2p_byemsgid = tHdr.mID;
- break;
- }
-
- }
- else {
- P2PV2_Header tHdr;
- tHdr.mTFCode = 0x01;
-
- p2p_sendMsg(wlid, 0, tHdr, buf, p - buf + 1);
- }
- }
- else
- msnNsThread->sendPacket("UUN", "%s 3 %d\r\n%s", wlid, p - buf, buf);
-
- ft->ts = time(NULL);
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// p2p_sendBye - closes P2P session
-
-void CMsnProto::p2p_sendBye(filetransfer* ft)
-{
- if (ft == NULL) {
- debugLogA(sttVoidSession);
- return;
- }
-
- MimeHeaders tHeaders(8);
- tHeaders.addString("CSeq", "0 ");
- tHeaders.addString("Call-ID", ft->p2p_callID);
- tHeaders.addLong("Max-Forwards", 0);
- tHeaders.addString("Content-Type", "application/x-msnmsgr-sessionclosebody");
-
- MimeHeaders chdrs(2);
- chdrs.addULong("SessionID", ft->p2p_sessionid);
- chdrs.addString("SChannelState", "0");
-
- p2p_sendSlp(-1, ft, tHeaders, chdrs);
-}
-
-void CMsnProto::p2p_sendCancel(filetransfer* ft)
-{
- p2p_sendBye(ft);
- p2p_sendAbortSession(ft);
-}
-
-void CMsnProto::p2p_sendNoCall(filetransfer* ft)
-{
- if (ft == NULL) {
- debugLogA(sttVoidSession);
- return;
- }
-
- MimeHeaders tHeaders(8);
- tHeaders.addString("CSeq", "0 ");
- tHeaders.addString("Call-ID", ft->p2p_callID);
- tHeaders.addLong("Max-Forwards", 0);
- tHeaders.addString("Content-Type", "application/x-msnmsgr-session-failure-respbody");
-
- MimeHeaders chdrs(2);
- chdrs.addULong("SessionID", ft->p2p_sessionid);
- chdrs.addString("SChannelState", "0");
-
- p2p_sendSlp(481, ft, tHeaders, chdrs);
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// p2p_sendStatus - send MSN P2P status and its description
-
-void CMsnProto::p2p_sendStatus(filetransfer* ft, long lStatus)
-{
- if (ft == NULL) {
- debugLogA(sttVoidSession);
- return;
- }
-
- MimeHeaders tHeaders(8);
- tHeaders.addString("CSeq", "1 ");
- tHeaders.addString("Call-ID", ft->p2p_callID);
- tHeaders.addLong("Max-Forwards", 0);
-
- MimeHeaders chdrs(2);
- chdrs.addULong("SessionID", ft->p2p_sessionid);
-
- if (lStatus != 1603) {
- tHeaders.addString("Content-Type", "application/x-msnmsgr-sessionreqbody");
-
- chdrs.addString("SChannelState", "0");
- }
- else
- tHeaders.addString("Content-Type", "application/x-msnmsgr-transrespbody");
-
- p2p_sendSlp(lStatus, ft, tHeaders, chdrs);
-}
-
-void CMsnProto::p2p_sendAvatarInit(filetransfer* ft)
-{
- unsigned body = 0;
-
- if (ft->p2p_isV2) {
- P2PV2_Header tHdr;
- tHdr.mSessionID = ft->p2p_sessionid;
- tHdr.mTFCode = 0x01;
- p2p_sendMsg(ft->p2p_dest, ft->p2p_appID, tHdr, (char*)&body, sizeof(body));
- }
- else {
- P2P_Header tHdr;
- tHdr.mSessionID = ft->p2p_sessionid;
- tHdr.mAckSessionID = ft->p2p_acksessid;
- p2p_sendMsg(ft->p2p_dest, ft->p2p_appID, tHdr, (char*)&body, sizeof(body));
-
- ft->ts = time(NULL);
- ft->p2p_waitack = true;
- }
-}
-
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// p2p_connectTo - connects to a remote P2P server
-
-static const char p2p_greeting[8] = { 4, 0, 0, 0, 'f', 'o', 'o', 0 };
-
-static void sttSendPacket(ThreadData* T, void* hdr, unsigned len)
-{
- T->send((char*)&len, sizeof(unsigned));
- T->send((char*)hdr, len);
-}
-
-bool CMsnProto::p2p_connectTo(ThreadData* info, directconnection *dc)
-{
- NETLIBOPENCONNECTION tConn = { 0 };
- tConn.cbSize = sizeof(tConn);
- tConn.szHost = info->mServer;
- tConn.flags = NLOCF_V2;
- tConn.timeout = 5;
-
- char* tPortDelim = strrchr(info->mServer, ':');
- if (tPortDelim != NULL) {
- *tPortDelim = '\0';
- tConn.wPort = (WORD)atol(tPortDelim + 1);
- }
-
- debugLogA("Connecting to %s:%d", tConn.szHost, tConn.wPort);
-
- info->s = (HANDLE)Netlib_OpenConnection(m_hNetlibUser, (LPARAM)&tConn);
- if (info->s == NULL) {
- TWinErrorCode err;
- debugLogA("Connection Failed (%d): %s", err.mErrorCode, err.getText());
- return false;
- }
- info->send(p2p_greeting, sizeof(p2p_greeting));
-
- bool isV2 = strchr(info->mInitialContactWLID, ';') != NULL;
-
- P2P_Header reply;
- if (!isV2) {
- reply.mFlags = 0x100;
-
- if (dc->useHashedNonce)
- memcpy(&reply.mAckSessionID, dc->mNonce, sizeof(UUID));
- else
- dc->xNonceToBin((UUID*)&reply.mAckSessionID);
-
- char buf[48];
- reply.createMsg(buf, info->mInitialContactWLID, this);
- sttSendPacket(info, buf, sizeof(buf));
- }
- else
- sttSendPacket(info, dc->mNonce, sizeof(UUID));
-
- long cbPacketLen;
- HReadBuffer buf(info, 0);
- BYTE* p;
- if ((p = buf.surelyRead(4)) == NULL) {
- debugLogA("Error reading data, closing filetransfer");
- return false;
- }
-
- cbPacketLen = *(long*)p;
- if ((p = buf.surelyRead(cbPacketLen)) == NULL)
- return false;
-
- bool cookieMatch;
-
- if (!isV2) {
- P2P_Header cookie((char*)p);
-
- if (dc->useHashedNonce) {
- char* hnonce = dc->calcHashedNonce((UUID*)&cookie.mAckSessionID);
- cookieMatch = mir_strcmp(hnonce, dc->xNonce) == 0;
- mir_free(hnonce);
- }
- else
- cookieMatch = memcmp(&cookie.mAckSessionID, &reply.mAckSessionID, sizeof(UUID)) == 0;
- }
- else {
- char* hnonce = dc->calcHashedNonce((UUID*)p);
- cookieMatch = mir_strcmp(hnonce, dc->xNonce) == 0;
- mir_free(hnonce);
- }
-
- if (!cookieMatch) {
- debugLogA("Invalid cookie received, exiting");
- return false;
- }
-
- return true;
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// p2p_listen - acts like a local P2P server
-
-bool CMsnProto::p2p_listen(ThreadData* info, directconnection *dc)
-{
- switch (WaitForSingleObject(info->hWaitEvent, 10000)) {
- case WAIT_TIMEOUT:
- case WAIT_FAILED:
- debugLogA("Incoming connection timed out, closing file transfer");
- MSN_StartP2PTransferByContact(info->mInitialContactWLID);
-LBL_Error:
- debugLogA("File listen failed");
- return false;
- }
-
- HReadBuffer buf(info, 0);
- BYTE* p;
-
- if ((p = buf.surelyRead(8)) == NULL)
- goto LBL_Error;
-
- if (memcmp(p, p2p_greeting, 8) != 0) {
- debugLogA("Invalid input data, exiting");
- return false;
- }
-
- if ((p = buf.surelyRead(4)) == NULL) {
- debugLogA("Error reading data, closing filetransfer");
- return false;
- }
-
- long cbPacketLen = *(long*)p;
- if ((p = buf.surelyRead(cbPacketLen)) == NULL)
- goto LBL_Error;
-
- bool cookieMatch;
- bool isV2 = strchr(info->mInitialContactWLID, ';') != NULL;
-
- if (!isV2) {
- P2P_Header cookie((char*)p);
-
- if (dc->useHashedNonce) {
- char* hnonce = dc->calcHashedNonce((UUID*)&cookie.mAckSessionID);
- cookieMatch = mir_strcmp(hnonce, dc->xNonce) == 0;
- mir_free(hnonce);
- memcpy(&cookie.mAckSessionID, dc->mNonce, sizeof(UUID));
- }
- else
- cookieMatch = memcmp(&cookie.mAckSessionID, dc->mNonce, sizeof(UUID)) == 0;
-
- if (!cookieMatch) {
- debugLogA("Invalid cookie received, exiting");
- return false;
- }
-
- char buf[48];
- cookie.createMsg(buf, info->mInitialContactWLID, this);
- sttSendPacket(info, buf, sizeof(buf));
- }
- else {
- char* hnonce = dc->calcHashedNonce((UUID*)p);
- cookieMatch = mir_strcmp(hnonce, dc->xNonce) == 0;
- mir_free(hnonce);
-
- if (!cookieMatch) {
- debugLogA("Invalid cookie received, exiting");
- goto LBL_Error;
- }
-
- sttSendPacket(info, dc->mNonce, sizeof(UUID));
- }
-
- return true;
-}
-
-LONG CMsnProto::p2p_sendPortion(filetransfer* ft, ThreadData* T, bool isV2)
-{
- LONG trid;
- char databuf[1500], *p = databuf;
-
- // Compute the amount of data to send
- unsigned fportion = T->mType == SERVER_P2P_DIRECT ? 1352 : 1202;
- if (isV2) fportion += 4;
-
- const unsigned __int64 dt = ft->std.currentFileSize - ft->std.currentFileProgress;
- const unsigned portion = dt > fportion ? fportion : dt;
-
- // Fill data size for direct transfer
-
- if (T->mType != SERVER_P2P_DIRECT)
- p += sprintf(p, isV2 ? sttP2PheaderV2 : sttP2Pheader, ft->p2p_dest, MyOptions.szEmail, MyOptions.szMachineGuidP2P); //!!!!!!!!!!!!!!!!!!
- else
- p += sizeof(unsigned);
-
- if (!isV2) {
- // Fill P2P header
- P2P_Header H;
-
- H.mSessionID = ft->p2p_sessionid;
- H.mID = ft->p2p_sendmsgid;
- H.mFlags = ft->p2p_appID == MSN_APPID_FILE ? 0x01000030 : 0x20;
- H.mTotalSize = ft->std.currentFileSize;
- H.mOffset = ft->std.currentFileProgress;
- H.mPacketLen = portion;
- H.mAckSessionID = ft->p2p_acksessid;
-
- p = H.createMsg(p, ft->p2p_dest, this);
- }
- else {
- P2PV2_Header H;
-
- H.mSessionID = ft->p2p_sessionid;
- H.mTFCode = (ft->p2p_appID == MSN_APPID_FILE ? 6 : 4) | (ft->std.currentFileProgress ? 0 : 1);
- H.mRemSize = ft->std.currentFileSize - ft->std.currentFileProgress - portion;
- H.mPacketLen = portion;
- H.mPacketNum = ft->p2p_sendmsgid;
-
- p = H.createMsg(p, ft->p2p_dest, this);
- H.logHeader(this);
- }
-
- if (T->mType == SERVER_P2P_DIRECT)
- *(unsigned*)databuf = portion + (p - databuf) - (unsigned)sizeof(unsigned);
-
- // Fill data (payload) for transfer
- if (ft->fileId == -1) return 0;
- _read(ft->fileId, p, portion);
- p += portion;
-
- if (T->mType == SERVER_P2P_DIRECT)
- trid = T->send(databuf, p - databuf);
- else {
- // Define packet footer for server transfer
- *(unsigned*)p = _htonl(ft->p2p_appID);
- p += sizeof(unsigned);
-
- trid = T->sendRawMessage('D', (char *)databuf, p - databuf);
- }
-
- if (trid != 0) {
- ft->std.totalProgress += portion;
- ft->std.currentFileProgress += portion;
- if (ft->p2p_appID == MSN_APPID_FILE && clock() >= ft->nNotify) {
- ProtoBroadcastAck(ft->std.hContact, ACKTYPE_FILE, ACKRESULT_DATA, ft, (LPARAM)&ft->std);
- ft->nNotify = clock() + 500;
- }
- }
- else
- debugLogA(" Error sending");
- ft->ts = time(NULL);
- ft->p2p_waitack = true;
-
- return trid;
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// p2p_sendFeedThread - sends a file via server
-
-void __cdecl CMsnProto::p2p_sendFeedThread(void* arg)
-{
- ThreadData* info = (ThreadData*)arg;
-
- bool isV2 = strchr(info->mInitialContactWLID, ';') != NULL;
-
- info->contactJoined(info->mInitialContactWLID);
- mir_free(info->mInitialContactWLID); info->mInitialContactWLID = NULL;
-
- debugLogA("File send thread started");
-
- switch (WaitForSingleObject(info->hWaitEvent, 6000)) {
- case WAIT_FAILED:
- debugLogA("File send wait failed");
- return;
- }
-
- HANDLE hLockHandle = NULL;
- ThreadData* T = NULL;
- TInfoType lastType = SERVER_NOTIFICATION;
-
- filetransfer *ft = p2p_getSessionByCallID(info->mCookie,
- info->mJoinedIdentContactsWLID.getCount() ? info->mJoinedIdentContactsWLID[0] : info->mJoinedContactsWLID[0]);
-
- if (ft != NULL && WaitForSingleObject(ft->hLockHandle, 2000) == WAIT_OBJECT_0) {
- hLockHandle = ft->hLockHandle;
-
- if (isV2)
- ft->p2p_sendmsgid = p2p_getPktNum(ft->p2p_dest);
- else {
- if (ft->p2p_sendmsgid == 0)
- ft->p2p_sendmsgid = p2p_getMsgId(ft->p2p_dest, 1);
- }
-
- T = MSN_GetP2PThreadByContact(ft->p2p_dest);
- if (T != NULL)
- ft->tType = lastType = T->mType;
-
- ReleaseMutex(hLockHandle);
- }
- else
- return;
-
- bool fault = false;
- while (WaitForSingleObject(hLockHandle, 2000) == WAIT_OBJECT_0 &&
- ft->std.currentFileProgress < ft->std.currentFileSize && !ft->bCanceled) {
- if (ft->tType != lastType)
- T = MSN_GetThreadByContact(ft->p2p_dest, ft->tType);
-
- if (ft->bCanceled) break;
- bool cfault = (T == NULL || p2p_sendPortion(ft, T, isV2) == 0);
-
- if (cfault) {
- if (fault) {
- debugLogA("File send failed");
- break;
- }
- else
- SleepEx(3000, TRUE); // Allow 3 sec for redirect request
- }
- fault = cfault;
-
- ReleaseMutex(hLockHandle);
-
- if (T != NULL && T->mType != SERVER_P2P_DIRECT)
- WaitForSingleObject(T->hWaitEvent, 5000);
- }
- ReleaseMutex(hLockHandle);
-
- if (ft->p2p_appID == MSN_APPID_FILE)
- ProtoBroadcastAck(ft->std.hContact, ACKTYPE_FILE, ACKRESULT_DATA, ft, (LPARAM)&ft->std);
-
- if (isV2) {
- if (!ft->bCanceled) {
- ft->bCompleted = true;
- p2p_sendBye(ft);
- }
- p2p_sessionComplete(ft);
- }
-
- debugLogA("File send thread completed");
-}
-
-
-void CMsnProto::p2p_sendFeedStart(filetransfer* ft)
-{
- if (ft->std.flags & PFTS_SENDING) {
- ThreadData* newThread = new ThreadData;
- newThread->mType = SERVER_FILETRANS;
- mir_strcpy(newThread->mCookie, ft->p2p_callID);
- newThread->mInitialContactWLID = mir_strdup(ft->p2p_dest);
- newThread->startThread(&CMsnProto::p2p_sendFeedThread, this);
- }
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// p2p_sendFileDirectly - sends a file via MSN P2P protocol
-
-void CMsnProto::p2p_sendRecvFileDirectly(ThreadData* info)
-{
- long cbPacketLen = 0;
- long state = 0;
-
- HReadBuffer buf(info, 0);
- char *wlid = info->mInitialContactWLID;
-
- info->contactJoined(wlid);
- info->mInitialContactWLID = NULL;
-
- MSN_StartP2PTransferByContact(wlid);
- p2p_redirectSessions(wlid);
- p2p_startSessions(wlid);
-
- bool isV2 = strchr(wlid, ';') != NULL;
-
- for (;;) {
- long len = state ? cbPacketLen : 4;
-
- BYTE* p = buf.surelyRead(len);
-
- if (p == NULL)
- break;
-
- if (state == 0)
- cbPacketLen = *(long*)p;
- else if (!isV2)
- p2p_processMsg(info, (char*)p, wlid);
- else
- p2p_processMsgV2(info, (char*)p, wlid);
-
- state = (state + 1) % 2;
- }
-
- info->contactLeft(wlid);
- p2p_redirectSessions(wlid);
- mir_free(wlid);
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// bunch of thread functions to cover all variants of P2P file transfers
-
-void __cdecl CMsnProto::p2p_fileActiveThread(void* arg)
-{
- ThreadData* info = (ThreadData*)arg;
-
- debugLogA("p2p_fileActiveThread() started: connecting to '%s'", info->mServer);
-
- directconnection *dc = p2p_getDCByCallID(info->mCookie, info->mInitialContactWLID);
- if (dc) {
- if (p2p_connectTo(info, dc))
- p2p_sendRecvFileDirectly(info);
- else {
- mir_free(info->mInitialContactWLID);
- info->mInitialContactWLID = NULL;
- }
-
- if (!MSN_GetThreadByContact(dc->wlid, SERVER_P2P_DIRECT) && !MSN_GetUnconnectedThread(dc->wlid, SERVER_P2P_DIRECT))
- p2p_unregisterDC(dc);
- }
-
- debugLogA("p2p_fileActiveThread() completed: connecting to '%s'", info->mServer);
-}
-
-void __cdecl CMsnProto::p2p_filePassiveThread(void* arg)
-{
- ThreadData* info = (ThreadData*)arg;
-
- debugLogA("p2p_filePassiveThread() started: listening");
-
- directconnection *dc = p2p_getDCByCallID(info->mCookie, info->mInitialContactWLID);
- if (dc) {
- if (p2p_listen(info, dc))
- p2p_sendRecvFileDirectly(info);
- else {
- mir_free(info->mInitialContactWLID); info->mInitialContactWLID = NULL;
- }
-
- if (!MSN_GetThreadByContact(dc->wlid, SERVER_P2P_DIRECT) && !MSN_GetUnconnectedThread(dc->wlid, SERVER_P2P_DIRECT))
- p2p_unregisterDC(dc);
- }
-
- debugLogA("p2p_filePassiveThread() completed");
-}
-
-
-void CMsnProto::p2p_InitFileTransfer(
- ThreadData* info,
- MimeHeaders& tFileInfo,
- MimeHeaders& tFileInfo2,
- const char* wlid)
-{
- if (info->mJoinedContactsWLID.getCount() == 0 && info->mJoinedIdentContactsWLID.getCount() == 0)
- return;
-
- const char *szCallID = tFileInfo["Call-ID"],
- *szBranch = tFileInfo["Via"];
-
- if (szBranch != NULL) {
- szBranch = strstr(szBranch, "branch=");
- if (szBranch != NULL)
- szBranch += 7;
- }
- if (szCallID == NULL || szBranch == NULL) {
- debugLogA("Ignoring invalid invitation: CallID='%s', szBranch='%s'", szCallID, szBranch);
- return;
- }
-
- const char *szSessionID = tFileInfo2["SessionID"],
- *szEufGuid = tFileInfo2["EUF-GUID"],
- *szContext = tFileInfo2["Context"],
- *szAppId = tFileInfo2["AppID"];
-
- if (szSessionID == NULL || szAppId == NULL || szEufGuid == NULL) {
- debugLogA("Ignoring invalid invitation: SessionID='%s', AppID=%s, Branch='%s',Context='%s'",
- szSessionID, szAppId, szEufGuid, szContext);
- return;
- }
-
- unsigned dwAppID = strtoul(szAppId, NULL, 10);
- unsigned dwSessionId = strtoul(szSessionID, NULL, 10);
-
- if (p2p_getSessionByID(dwSessionId))
- return;
-
- szContext = (char*)mir_base64_decode(szContext, 0);
-
- filetransfer* ft = new filetransfer(this);
- ft->p2p_acksessid = MSN_GenRandom();
- ft->p2p_sessionid = dwSessionId;
- ft->p2p_appID = dwAppID == MSN_APPID_AVATAR ? MSN_APPID_AVATAR2 : dwAppID;
- ft->p2p_type = dwAppID;
- ft->p2p_ackID = dwAppID == MSN_APPID_FILE ? 2000 : 1000;
- replaceStr(ft->p2p_callID, szCallID);
- replaceStr(ft->p2p_branch, szBranch);
- ft->p2p_dest = mir_strdup(wlid);
- ft->p2p_isV2 = strchr(wlid, ';') != NULL;
- ft->std.hContact = MSN_HContactFromEmail(wlid);
-
- p2p_registerSession(ft);
-
- switch (dwAppID) {
- case MSN_APPID_AVATAR:
- case MSN_APPID_AVATAR2:
- if (!_stricmp(szEufGuid, "{A4268EEC-FEC5-49E5-95C3-F126696BDBF6}")) {
- DBVARIANT dbv;
- bool pictmatch = !getString("PictObject", &dbv);
- if (pictmatch) {
- UrlDecode(dbv.pszVal);
-
- ezxml_t xmlcon = ezxml_parse_str((char*)szContext, mir_strlen(szContext));
- ezxml_t xmldb = ezxml_parse_str(dbv.pszVal, mir_strlen(dbv.pszVal));
-
- const char *szCtBuf = ezxml_attr(xmlcon, "SHA1C");
- if (szCtBuf) {
- const char *szPtBuf = ezxml_attr(xmldb, "SHA1C");
- pictmatch = szPtBuf && mir_strcmp(szCtBuf, szPtBuf) == 0;
- }
- else {
- const char *szCtBuf = ezxml_attr(xmlcon, "SHA1D");
- const char *szPtBuf = ezxml_attr(xmldb, "SHA1D");
- pictmatch = szCtBuf && szPtBuf && mir_strcmp(szCtBuf, szPtBuf) == 0;
- }
-
- ezxml_free(xmlcon);
- ezxml_free(xmldb);
- db_free(&dbv);
- }
- if (pictmatch) {
- wchar_t szFileName[MAX_PATH];
- MSN_GetAvatarFileName(NULL, szFileName, _countof(szFileName), NULL);
- ft->fileId = _wopen(szFileName, O_RDONLY | _O_BINARY, _S_IREAD);
- if (ft->fileId == -1) {
- p2p_sendStatus(ft, 603);
- MSN_ShowError("Your avatar not set correctly. Avatar should be set in View/Change My Details | Avatar");
- debugLogA("Unable to open avatar file '%s', error %d", szFileName, errno);
- p2p_unregisterSession(ft);
- }
- else {
- mir_free(ft->std.tszCurrentFile);
- ft->std.tszCurrentFile = mir_wstrdup(szFileName);
- // debugLogA("My avatar file opened for %s as %08p::%d", szEmail, ft, ft->fileId);
- ft->std.totalBytes = ft->std.currentFileSize = _filelengthi64(ft->fileId);
- ft->std.flags |= PFTS_SENDING;
-
- //---- send 200 OK Message
- p2p_sendStatus(ft, 200);
- p2p_sendFeedStart(ft);
-
- if (ft->p2p_isV2) {
- p2p_sendAvatarInit(ft);
- MSN_StartP2PTransferByContact(ft->p2p_dest);
- }
- }
- }
- else {
- p2p_sendStatus(ft, 603);
- debugLogA("Requested avatar does not match current avatar");
- p2p_unregisterSession(ft);
- }
- }
- break;
-
- case MSN_APPID_FILE:
- if (!_stricmp(szEufGuid, "{5D3E02AB-6190-11D3-BBBB-00C04F795683}")) {
- wchar_t* wszFileName = ((HFileContext*)szContext)->wszFileName;
- for (wchar_t* p = wszFileName; *p != 0; p++) {
- switch (*p) {
- case ':': case '?': case '/': case '\\': case '*':
- *p = '_';
- }
- }
-
- mir_free(ft->std.tszCurrentFile);
- ft->std.tszCurrentFile = mir_wstrdup(wszFileName);
-
- ft->std.totalBytes = ft->std.currentFileSize = ((HFileContext*)szContext)->dwSize;
- ft->std.totalFiles = 1;
-
- wchar_t tComment[40];
- mir_snwprintf(tComment, TranslateT("%I64u bytes"), ft->std.currentFileSize);
-
- PROTORECVFILET pre = { 0 };
- pre.dwFlags = PRFF_UNICODE;
- pre.fileCount = 1;
- pre.timestamp = time(NULL);
- pre.descr.w = tComment;
- pre.files.w = &ft->std.tszCurrentFile;
- pre.lParam = (LPARAM)ft;
- ProtoChainRecvFile(ft->std.hContact, &pre);
- }
- break;
-
- case MSN_APPID_WEBCAM:
- if (!_stricmp(szEufGuid, "{4BD96FC0-AB17-4425-A14A-439185962DC8}")) {
- MSN_ShowPopup(ft->std.hContact,
- TranslateT("Contact tried to send its webcam data (not currently supported)"),
- MSN_ALLOW_MSGBOX | MSN_SHOW_ERROR);
- }
- if (!_stricmp(szEufGuid, "{1C9AA97E-9C05-4583-A3BD-908A196F1E92}")) {
- MSN_ShowPopup(ft->std.hContact,
- TranslateT("Contact tried to view your webcam data (not currently supported)"),
- MSN_ALLOW_MSGBOX | MSN_SHOW_ERROR);
- }
- p2p_sendStatus(ft, 603);
- p2p_unregisterSession(ft);
- break;
-
- case MSN_APPID_MEDIA_SHARING:
- // MSN_ShowPopup(ft->std.hContact,
- // TranslateT("Contact tried to share media with us (not currently supported)"),
- // MSN_ALLOW_MSGBOX | MSN_SHOW_ERROR);
- p2p_sendStatus(ft, 603);
- p2p_unregisterSession(ft);
- break;
-
- default:
- p2p_sendStatus(ft, 603);
- p2p_unregisterSession(ft);
- debugLogA("Invalid or unknown data transfer request (AppID/EUF-GUID: %ld/%s)", dwAppID, szEufGuid);
- break;
- }
-
- mir_free((void*)szContext);
-}
-
-void CMsnProto::p2p_InitDirectTransfer(MimeHeaders& tFileInfo, MimeHeaders& tFileInfo2, const char* wlid)
-{
- const char *szCallID = tFileInfo["Call-ID"],
- *szBranch = tFileInfo["Via"],
- *szConnType = tFileInfo2["Conn-Type"],
- *szUPnPNat = tFileInfo2["UPnPNat"],
- *szNetID = tFileInfo2["NetID"],
- *szICF = tFileInfo2["ICF"],
- *szHashedNonce = tFileInfo2["Hashed-Nonce"];
-
- if (szBranch != NULL) {
- szBranch = strstr(szBranch, "branch=");
- if (szBranch != NULL)
- szBranch += 7;
- }
- if (szCallID == NULL || szBranch == NULL) {
- debugLogA("Ignoring invalid invitation: CallID='%s', Branch='%s'", szCallID, szBranch);
- return;
- }
-
- if (szConnType == NULL || szUPnPNat == NULL || szICF == NULL || szNetID == NULL) {
- debugLogA("Ignoring invalid invitation: ConnType='%s', UPnPNat='%s', ICF='%s', NetID='%s'",
- szConnType, szUPnPNat, szICF, szNetID);
- return;
- }
-
- filetransfer ftl(this), *ft = p2p_getSessionByCallID(szCallID, wlid);
- if (!ft || !ft->p2p_sessionid) {
- ft = &ftl;
- replaceStr(ft->p2p_dest, wlid);
- replaceStr(ft->p2p_callID, szCallID);
- replaceStr(ft->p2p_branch, szBranch);
- ft->p2p_isV2 = strchr(wlid, ';') != NULL;
- ft->std.hContact = MSN_HContactFromEmail(wlid);
- }
- else {
- replaceStr(ft->p2p_callID, szCallID);
- replaceStr(ft->p2p_branch, szBranch);
- ft->p2p_acksessid = MSN_GenRandom();
- /*
- if (p2p_isAvatarOnly(ft->std.hContact))
- {
- p2p_sendStatus(ft, 1603);
- return;
- }
- else
- ProtoBroadcastAck(ft->std.hContact, ACKTYPE_FILE, ACKRESULT_INITIALISING, ft, 0);
- */
- }
-
- directconnection *dc = p2p_getDCByCallID(szCallID, wlid);
- if (dc) {
- if (MSN_GetThreadByContact(wlid, SERVER_P2P_DIRECT)) {
- p2p_sendStatus(ft, 1603);
- p2p_unregisterDC(dc);
- return;
- }
- p2p_unregisterDC(dc);
- }
-
- dc = new directconnection(szCallID, wlid);
- dc->useHashedNonce = szHashedNonce != NULL;
- if (dc->useHashedNonce)
- dc->xNonce = mir_strdup(szHashedNonce);
- p2p_registerDC(dc);
-
- MimeHeaders tResult(8);
- tResult.addString("CSeq", "1 ");
- tResult.addString("Call-ID", szCallID);
- tResult.addLong("Max-Forwards", 0);
-
- MyConnectionType conType = { 0 };
-
- conType.extIP = atol(szNetID);
- conType.SetUdpCon(szConnType);
- conType.upnpNAT = mir_strcmp(szUPnPNat, "true") == 0;
- conType.icf = mir_strcmp(szICF, "true") == 0;
- conType.CalculateWeight();
-
- MimeHeaders chdrs(12);
- bool listen = false;
-
- debugLogA("Connection weight, his: %d mine: %d", conType.weight, MyConnection.weight);
- if (conType.weight <= MyConnection.weight)
- listen = p2p_createListener(ft, dc, chdrs);
-
- if (!listen) {
- chdrs.addString("Bridge", "TCPv1");
- chdrs.addBool("Listening", false);
-
- if (dc->useHashedNonce)
- chdrs.addString("Hashed-Nonce", dc->mNonceToHash(), 2);
- else
- chdrs.addString("Nonce", sttVoidUid);
-
- chdrs.addULong("SessionID", ft->p2p_sessionid);
- chdrs.addString("SChannelState", "0");
- chdrs.addString("Capabilities-Flags", "1");
- }
-
- tResult.addString("Content-Type", "application/x-msnmsgr-transrespbody");
-
- if (!ft->p2p_isV2) p2p_getMsgId(ft->p2p_dest, -1);
- p2p_sendSlp(200, ft, tResult, chdrs);
-}
-
-
-void CMsnProto::p2p_startConnect(const char* wlid, const char* szCallID, const char* addr, const char* port, bool ipv6)
-{
- if (port == NULL) return;
-
- char *pPortTokBeg = (char*)port;
- for (;;) {
- char *pPortTokEnd = strchr(pPortTokBeg, ' ');
- if (pPortTokEnd != NULL) *pPortTokEnd = 0;
-
- char *pAddrTokBeg = (char*)addr;
- for (;;) {
- char *pAddrTokEnd = strchr(pAddrTokBeg, ' ');
- if (pAddrTokEnd != NULL) *pAddrTokEnd = 0;
-
- ThreadData* newThread = new ThreadData;
-
- newThread->mType = SERVER_P2P_DIRECT;
- newThread->mInitialContactWLID = mir_strdup(wlid);
- strncpy_s(newThread->mCookie, szCallID, _TRUNCATE);
- mir_snprintf(newThread->mServer, ipv6 ? "[%s]:%s" : "%s:%s", pAddrTokBeg, pPortTokBeg);
-
- newThread->startThread(&CMsnProto::p2p_fileActiveThread, this);
-
- if (pAddrTokEnd == NULL) break;
-
- *pAddrTokEnd = ' ';
- pAddrTokBeg = pAddrTokEnd + 1;
- }
-
- if (pPortTokEnd == NULL) break;
-
- *pPortTokEnd = ' ';
- pPortTokBeg = pPortTokEnd + 1;
- }
-}
-
-void CMsnProto::p2p_InitDirectTransfer2(MimeHeaders& tFileInfo, MimeHeaders& tFileInfo2, const char* wlid)
-{
- const char *szCallID = tFileInfo["Call-ID"],
- *szInternalAddress = tFileInfo2["IPv4Internal-Addrs"],
- *szInternalPort = tFileInfo2["IPv4Internal-Port"],
- *szExternalAddress = tFileInfo2["IPv4External-Addrs"],
- *szExternalPort = tFileInfo2["IPv4External-Port"],
- *szNonce = tFileInfo2["Nonce"],
- *szHashedNonce = tFileInfo2["Hashed-Nonce"],
- *szListening = tFileInfo2["Listening"],
- *szV6Address = tFileInfo2["IPv6-Addrs"],
- *szV6Port = tFileInfo2["IPv6-Port"];
-
- if ((szNonce == NULL && szHashedNonce == NULL) || szListening == NULL) {
- debugLogA("Ignoring invalid invitation: Listening='%s', Nonce=%s", szListening, szNonce);
- return;
- }
-
- directconnection* dc = p2p_getDCByCallID(szCallID, wlid);
- if (dc == NULL) {
- dc = new directconnection(szCallID, wlid);
- p2p_registerDC(dc);
- }
-
- dc->useHashedNonce = szHashedNonce != NULL;
- replaceStr(dc->xNonce, szHashedNonce ? szHashedNonce : szNonce);
-
- if (!mir_strcmp(szListening, "true") && mir_strcmp(dc->xNonce, sttVoidUid)) {
- p2p_startConnect(wlid, szCallID, szV6Address, szV6Port, true);
- p2p_startConnect(wlid, szCallID, szInternalAddress, szInternalPort, false);
- p2p_startConnect(wlid, szCallID, szExternalAddress, szExternalPort, false);
- }
-}
-
-void CMsnProto::p2p_AcceptTransfer(MimeHeaders& tFileInfo, MimeHeaders& tFileInfo2, const char* wlid)
-{
- const char *szCallID = tFileInfo["Call-ID"];
- const char* szOldContentType = tFileInfo["Content-Type"];
- const char *szBranch = tFileInfo["Via"];
-
- if (szBranch != NULL) {
- szBranch = strstr(szBranch, "branch=");
- if (szBranch != NULL)
- szBranch += 7;
- }
-
- filetransfer ftl(this), *ft = p2p_getSessionByCallID(szCallID, wlid);
-
- if (!ft || !ft->p2p_sessionid) {
- ft = &ftl;
- replaceStr(ft->p2p_branch, szBranch);
- replaceStr(ft->p2p_callID, szCallID);
- replaceStr(ft->p2p_dest, wlid);
- ft->p2p_isV2 = strchr(wlid, ';') != NULL;
- ft->std.hContact = MSN_HContactFromEmail(wlid);
- }
- else {
- if (!(ft->std.flags & PFTS_SENDING)) {
- replaceStr(ft->p2p_branch, szBranch);
- replaceStr(ft->p2p_callID, szCallID);
- }
- }
-
- if (szCallID == NULL || szBranch == NULL || szOldContentType == NULL) {
- debugLogA("Ignoring invalid invitation: CallID='%s', szBranch='%s'", szCallID, szBranch);
-LBL_Close:
- p2p_sendStatus(ft, 500);
- return;
- }
-
- MimeHeaders tResult(8);
- tResult.addString("CSeq", "0 ");
- tResult.addString("Call-ID", ft->p2p_callID);
- tResult.addLong("Max-Forwards", 0);
-
- MimeHeaders chdrs(12);
-
- if (!mir_strcmp(szOldContentType, "application/x-msnmsgr-sessionreqbody")) {
- if (ft == &ftl) {
- p2p_sendCancel(ft);
- return;
- }
-
- if (!ft->bAccepted) {
- replaceStr(ft->p2p_dest, wlid);
- ft->bAccepted = true;
- }
- else
- return;
-
- if (ft->p2p_type != MSN_APPID_FILE) {
- if (ft->fileId == -1) ft->create();
- return;
- }
-
- p2p_sendFeedStart(ft);
-
- ThreadData* T = MSN_GetP2PThreadByContact(ft->p2p_dest);
- if (T != NULL && T->mType == SERVER_P2P_DIRECT) {
- MSN_StartP2PTransferByContact(ft->p2p_dest);
- return;
- }
-
- if (usingGateway)
- MSN_StartP2PTransferByContact(ft->p2p_dest);
-
- directconnection* dc = new directconnection(szCallID, wlid);
- p2p_registerDC(dc);
-
- tResult.addString("Content-Type", "application/x-msnmsgr-transreqbody");
-
- chdrs.addString("Bridges", "TCPv1");
- chdrs.addLong("NetID", MyConnection.extIP);
- chdrs.addString("Conn-Type", MyConnection.GetMyUdpConStr());
- chdrs.addBool("UPnPNat", MyConnection.upnpNAT);
- chdrs.addBool("ICF", MyConnection.icf);
- chdrs.addString("IPv6-global", GetGlobalIp(), 2);
- chdrs.addString("Hashed-Nonce", dc->mNonceToHash(), 2);
- }
- else if (!mir_strcmp(szOldContentType, "application/x-msnmsgr-transrespbody")) {
- const char *szListening = tFileInfo2["Listening"],
- *szNonce = tFileInfo2["Nonce"],
- *szHashedNonce = tFileInfo2["Hashed-Nonce"],
- *szExternalAddress = tFileInfo2["IPv4External-Addrs"],
- *szExternalPort = tFileInfo2["IPv4External-Port"],
- *szInternalAddress = tFileInfo2["IPv4Internal-Addrs"],
- *szInternalPort = tFileInfo2["IPv4Internal-Port"],
- *szV6Address = tFileInfo2["IPv6-Addrs"],
- *szV6Port = tFileInfo2["IPv6-Port"];
-
- if ((szNonce == NULL && szHashedNonce == NULL) || szListening == NULL) {
- debugLogA("Invalid data packet, exiting...");
- goto LBL_Close;
- }
-
- directconnection* dc = p2p_getDCByCallID(szCallID, wlid);
- if (dc == NULL) return;
-
- if (!dc->bAccepted)
- dc->bAccepted = true;
- else
- return;
-
- dc->useHashedNonce = szHashedNonce != NULL;
- replaceStr(dc->xNonce, szHashedNonce ? szHashedNonce : szNonce);
-
- // another side reported that it will be a server.
- if (!mir_strcmp(szListening, "true") && (szNonce == NULL || mir_strcmp(szNonce, sttVoidUid))) {
- p2p_startConnect(ft->p2p_dest, szCallID, szV6Address, szV6Port, true);
- p2p_startConnect(ft->p2p_dest, szCallID, szInternalAddress, szInternalPort, false);
- p2p_startConnect(ft->p2p_dest, szCallID, szExternalAddress, szExternalPort, false);
- return;
- }
-
- // no, send a file via server
- if (!p2p_createListener(ft, dc, chdrs)) {
- p2p_unregisterDC(dc);
- if (ft != &ftl)
- MSN_StartP2PTransferByContact(ft->p2p_dest);
- else
- p2p_startSessions(ft->p2p_dest);
- return;
- }
-
- tResult.addString("Content-Type", "application/x-msnmsgr-transrespbody");
- }
- else if (!mir_strcmp(szOldContentType, "application/x-msnmsgr-transreqbody")) {
- const char *szHashedNonce = tFileInfo2["Hashed-Nonce"];
- const char *szNonce = tFileInfo2["Nonce"];
-
- directconnection* dc = p2p_getDCByCallID(szCallID, wlid);
- if (dc == NULL) {
- dc = new directconnection(szCallID, wlid);
- p2p_registerDC(dc);
- }
-
- dc->useHashedNonce = szHashedNonce != NULL;
- replaceStr(dc->xNonce, szHashedNonce ? szHashedNonce : szNonce);
-
- // no, send a file via server
- if (!p2p_createListener(ft, dc, chdrs)) {
- p2p_unregisterDC(dc);
- MSN_StartP2PTransferByContact(ft->p2p_dest);
- return;
- }
-
- tResult.addString("Content-Type", "application/x-msnmsgr-transrespbody");
- }
- else
- return;
-
- if (!ft->p2p_isV2) p2p_getMsgId(ft->p2p_dest, -1);
- p2p_sendSlp(-2, ft, tResult, chdrs);
-}
-
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// p2p_processSIP - processes all MSN SIP commands
-
-void CMsnProto::p2p_processSIP(ThreadData* info, char* msgbody, P2PB_Header* hdrdata, const char* wlid)
-{
- int iMsgType = 0;
- if (!memcmp(msgbody, "INVITE MSNMSGR:", 15))
- iMsgType = 1;
- else if (!memcmp(msgbody, "MSNSLP/1.0 200 ", 15))
- iMsgType = 2;
- else if (!memcmp(msgbody, "BYE MSNMSGR:", 12))
- iMsgType = 3;
- else if (!memcmp(msgbody, "MSNSLP/1.0 603 ", 15))
- iMsgType = 4;
- else if (!memcmp(msgbody, "MSNSLP/1.0 481 ", 15))
- iMsgType = 4;
- else if (!memcmp(msgbody, "MSNSLP/1.0 500 ", 15))
- iMsgType = 4;
- else if (!memcmp(msgbody, "ACK MSNMSGR:", 12))
- iMsgType = 5;
-
- char* peol = strstr(msgbody, "\r\n");
- if (peol != NULL)
- msgbody = peol + 2;
-
- MimeHeaders tFileInfo, tFileInfo2;
- msgbody = tFileInfo.readFromBuffer(msgbody);
- msgbody = tFileInfo2.readFromBuffer(msgbody);
-
- const char* szContentType = tFileInfo["Content-Type"];
- if (szContentType == NULL) {
- debugLogA("Invalid or missing Content-Type field, exiting");
- return;
- }
-
- if (hdrdata && !hdrdata->isV2Hdr()) {
- if (iMsgType == 2 || (iMsgType == 1 && !mir_strcmp(szContentType, "application/x-msnmsgr-transreqbody")))
- p2p_getMsgId(wlid, 1);
- }
-
- switch (iMsgType) {
- case 1:
- if (!mir_strcmp(szContentType, "application/x-msnmsgr-sessionreqbody"))
- p2p_InitFileTransfer(info, tFileInfo, tFileInfo2, wlid);
- else if (!mir_strcmp(szContentType, "application/x-msnmsgr-transreqbody"))
- p2p_InitDirectTransfer(tFileInfo, tFileInfo2, wlid);
- else if (!mir_strcmp(szContentType, "application/x-msnmsgr-transrespbody"))
- p2p_InitDirectTransfer2(tFileInfo, tFileInfo2, wlid);
- break;
-
- case 2:
- p2p_AcceptTransfer(tFileInfo, tFileInfo2, wlid);
- break;
-
- case 3:
- if (!mir_strcmp(szContentType, "application/x-msnmsgr-sessionclosebody")) {
- filetransfer* ft = p2p_getSessionByCallID(tFileInfo["Call-ID"], wlid);
- if (ft != NULL) {
- if (ft->std.currentFileProgress < ft->std.currentFileSize) {
- ft->bCanceled = true;
- p2p_sendAbortSession(ft);
- }
- else {
- if (!(ft->std.flags & PFTS_SENDING))
- ft->bCompleted = true;
- }
-
- p2p_sessionComplete(ft);
- }
- }
- break;
-
- case 4:
- {
- const char* szCallID = tFileInfo["Call-ID"];
-
- // application/x-msnmsgr-session-failure-respbody
-
- directconnection *dc = p2p_getDCByCallID(szCallID, wlid);
- if (dc != NULL) {
- p2p_unregisterDC(dc);
- break;
- }
-
- filetransfer* ft = p2p_getSessionByCallID(szCallID, wlid);
- if (ft == NULL)
- break;
-
- ft->close();
- if (!(ft->std.flags & PFTS_SENDING)) _wremove(ft->std.tszCurrentFile);
-
- p2p_unregisterSession(ft);
- }
- break;
-
- case 5:
- if (!mir_strcmp(szContentType, "application/x-msnmsgr-turnsetup")) {
- // tFileInfo2["ServerAddress"];
- // tFileInfo2["SessionUsername"];
- // tFileInfo2["SessionPassword"];
- }
- else if (!mir_strcmp(szContentType, "application/x-msnmsgr-transudpswitch")) {
- // tFileInfo2["IPv6AddrsAndPorts"];
- // tFileInfo2["IPv4ExternalAddrsAndPorts"];
- // tFileInfo2["IPv4InternalAddrsAndPorts"];
- }
- break;
- }
-}
-
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// p2p_processMsg - processes all MSN P2P incoming messages
-void CMsnProto::p2p_processMsgV2(ThreadData* info, char* msgbody, const char* wlid)
-{
- P2PV2_Header hdrdata;
-
- char *msg = hdrdata.parseMsg(msgbody);
- hdrdata.logHeader(this);
-
- if (hdrdata.mSessionID == 0) {
- if (hdrdata.mPacketLen == 0) {
- if (hdrdata.mOpCode & 0x02)
- p2p_sendAck(wlid, &hdrdata);
- return;
- }
-
- if (hdrdata.mRemSize || hdrdata.mTFCode == 0) {
- char msgid[128];
- mir_snprintf(msgid, "%s_%08x", wlid, hdrdata.mPacketNum);
-
- int idx;
- if (hdrdata.mTFCode == 0x01) {
- const size_t portion = hdrdata.mPacketLen + (msg - msgbody);
- const size_t len = portion + hdrdata.mRemSize;
- idx = addCachedMsg(msgid, msgbody, 0, portion, len, false);
- }
- else {
- size_t len = hdrdata.mPacketLen + hdrdata.mRemSize;
- size_t offset = getCachedMsgSize(msgid); if (offset >= len) offset -= len;
- idx = addCachedMsg(msgid, msg, offset, hdrdata.mPacketLen, len, false);
- }
-
- if (hdrdata.mRemSize == 0) {
- size_t newsize;
- if (getCachedMsg(idx, msgbody, newsize)) {
- unsigned id = hdrdata.mID;
- msg = hdrdata.parseMsg(msgbody);
- hdrdata.mID = id;
-
- if (hdrdata.mOpCode & 0x02)
- p2p_sendAck(wlid, &hdrdata);
-
- if (hdrdata.mTFCode)
- p2p_processSIP(info, msg, &hdrdata, wlid);
- mir_free(msgbody);
- }
- else
- clearCachedMsg(idx);
- }
- }
- else {
- if (hdrdata.mOpCode & 0x02)
- p2p_sendAck(wlid, &hdrdata);
-
- p2p_processSIP(info, msg, &hdrdata, wlid);
- }
-
- return;
- }
-
- if (hdrdata.mOpCode & 0x02)
- p2p_sendAck(wlid, &hdrdata);
-
- filetransfer* ft = p2p_getSessionByID(hdrdata.mSessionID);
- if (ft == NULL) return;
-
- ft->ts = time(NULL);
-
- if (hdrdata.mTFCode >= 4 && hdrdata.mTFCode <= 7) {
- _write(ft->fileId, msg, hdrdata.mPacketLen);
-
- ft->std.totalProgress += hdrdata.mPacketLen;
- ft->std.currentFileProgress += hdrdata.mPacketLen;
-
- if (ft->p2p_appID == MSN_APPID_FILE && clock() >= ft->nNotify) {
- ProtoBroadcastAck(ft->std.hContact, ACKTYPE_FILE, ACKRESULT_DATA, ft, (LPARAM)&ft->std);
- ft->nNotify = clock() + 500;
-
- //---- send an ack: body was transferred correctly
- debugLogA("Transferred %I64u bytes remaining %I64u", ft->std.currentFileProgress, hdrdata.mRemSize);
- }
-
- if (hdrdata.mRemSize == 0) {
- if (ft->p2p_appID == MSN_APPID_FILE) {
- ProtoBroadcastAck(ft->std.hContact, ACKTYPE_FILE, ACKRESULT_DATA, ft, (LPARAM)&ft->std);
- ft->complete();
- }
- else {
- p2p_savePicture2disk(ft);
- if (!ft->p2p_isV2) p2p_sendBye(ft);
- }
- }
- }
-}
-
-void CMsnProto::p2p_processMsg(ThreadData* info, char* msgbody, const char* wlid)
-{
- P2P_Header hdrdata;
- msgbody = hdrdata.parseMsg(msgbody);
- hdrdata.logHeader(this);
-
- //---- if we got a message
- if (LOWORD(hdrdata.mFlags) == 0 && hdrdata.mSessionID == 0) {
- // MsnContact *cont = Lists_Get(wlid);
- // if (cont && cont->places.getCount())
- // return;
-
- if (hdrdata.mPacketLen < hdrdata.mTotalSize) {
- char msgid[128];
- mir_snprintf(msgid, "%s_%08x", wlid, hdrdata.mID);
- int idx = addCachedMsg(msgid, msgbody, (size_t)hdrdata.mOffset, hdrdata.mPacketLen,
- (size_t)hdrdata.mTotalSize, false);
-
- char* newbody;
- size_t newsize;
- if (getCachedMsg(idx, newbody, newsize)) {
- p2p_sendAck(wlid, &hdrdata);
- p2p_processSIP(info, newbody, &hdrdata, wlid);
- mir_free(newbody);
- }
- else {
- if (hdrdata.mOffset + hdrdata.mPacketLen >= hdrdata.mTotalSize)
- clearCachedMsg(idx);
- }
- }
- else {
- p2p_sendAck(wlid, &hdrdata);
- p2p_processSIP(info, msgbody, &hdrdata, wlid);
- }
-
- return;
- }
-
- filetransfer* ft = p2p_getSessionByID(hdrdata.mSessionID);
- if (ft == NULL)
- ft = p2p_getSessionByUniqueID(hdrdata.mAckUniqueID);
-
- if (ft == NULL) return;
-
- ft->ts = time(NULL);
-
- //---- receiving redirect -----------
- if (hdrdata.mFlags == 0x01) {
- if (WaitForSingleObject(ft->hLockHandle, INFINITE) == WAIT_OBJECT_0) {
- __int64 dp = (__int64)(ft->std.currentFileProgress - hdrdata.mAckDataSize);
- ft->std.totalProgress -= dp;
- ft->std.currentFileProgress -= dp;
- _lseeki64(ft->fileId, ft->std.currentFileProgress, SEEK_SET);
- ft->tType = info->mType;
- ReleaseMutex(ft->hLockHandle);
- }
- }
-
- //---- receiving ack -----------
- if (hdrdata.mFlags == 0x02) {
- ft->p2p_waitack = false;
-
- if (hdrdata.mAckSessionID == ft->p2p_sendmsgid) {
- if (ft->p2p_appID == MSN_APPID_FILE) {
- ft->bCompleted = true;
- p2p_sendBye(ft);
- }
- return;
- }
-
- if (hdrdata.mAckSessionID == ft->p2p_byemsgid) {
- p2p_sessionComplete(ft);
- return;
- }
-
- switch (ft->p2p_ackID) {
- case 1000:
- //---- send Data Preparation Message
- p2p_sendAvatarInit(ft);
- break;
-
- case 1001:
- //---- send Data Messages
- MSN_StartP2PTransferByContact(ft->p2p_dest);
- break;
- }
-
- ft->p2p_ackID++;
- return;
- }
-
- if (LOWORD(hdrdata.mFlags) == 0) {
- //---- accept the data preparation message ------
- // const unsigned* pLongs = (unsigned*)msgbody;
- if (hdrdata.mPacketLen == 4 && hdrdata.mTotalSize == 4) {
- p2p_sendAck(ft->p2p_dest, &hdrdata);
- return;
- }
- else
- hdrdata.mFlags = 0x20;
- }
-
- //---- receiving data -----------
- if (LOWORD(hdrdata.mFlags) == 0x20 || LOWORD(hdrdata.mFlags) == 0x30) {
- if (hdrdata.mOffset + hdrdata.mPacketLen > hdrdata.mTotalSize)
- hdrdata.mPacketLen = DWORD(hdrdata.mTotalSize - hdrdata.mOffset);
-
- if (ft->tTypeReq == 0 || ft->tTypeReq == info->mType) {
- ft->tType = info->mType;
- ft->p2p_sendmsgid = hdrdata.mID;
- }
-
- __int64 dsz = ft->std.currentFileSize - hdrdata.mOffset;
- if (dsz > hdrdata.mPacketLen) dsz = hdrdata.mPacketLen;
-
- if (ft->tType == info->mType) {
- if (dsz > 0 && ft->fileId >= 0) {
- if (ft->lstFilePtr != hdrdata.mOffset)
- _lseeki64(ft->fileId, hdrdata.mOffset, SEEK_SET);
- _write(ft->fileId, msgbody, (unsigned int)dsz);
-
- ft->lstFilePtr = hdrdata.mOffset + dsz;
-
- __int64 dp = ft->lstFilePtr - ft->std.currentFileProgress;
- if (dp > 0) {
- ft->std.totalProgress += dp;
- ft->std.currentFileProgress += dp;
-
- if (ft->p2p_appID == MSN_APPID_FILE && clock() >= ft->nNotify) {
- ProtoBroadcastAck(ft->std.hContact, ACKTYPE_FILE, ACKRESULT_DATA, ft, (LPARAM)&ft->std);
- ft->nNotify = clock() + 500;
- }
- }
-
- //---- send an ack: body was transferred correctly
- debugLogA("Transferred %I64u bytes out of %I64u", ft->std.currentFileProgress, hdrdata.mTotalSize);
- }
-
- if (ft->std.currentFileProgress >= hdrdata.mTotalSize) {
- ProtoBroadcastAck(ft->std.hContact, ACKTYPE_FILE, ACKRESULT_DATA, ft, (LPARAM)&ft->std);
- p2p_sendAck(ft->p2p_dest, &hdrdata);
- if (ft->p2p_appID == MSN_APPID_FILE) {
- ft->ts = time(NULL);
- ft->p2p_waitack = true;
- ft->complete();
- }
- else {
- p2p_savePicture2disk(ft);
- p2p_sendBye(ft);
- }
- }
- }
- }
-
- if (hdrdata.mFlags == 0x40 || hdrdata.mFlags == 0x80) {
- p2p_sendAbortSession(ft);
- p2p_unregisterSession(ft);
- }
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// p2p_invite - invite another side to transfer an avatar
-
-void CMsnProto::p2p_invite(unsigned iAppID, filetransfer* ft, const char *wlid)
-{
- const char* szAppID;
- switch (iAppID) {
- case MSN_APPID_FILE: szAppID = "{5D3E02AB-6190-11D3-BBBB-00C04F795683}"; break;
- case MSN_APPID_AVATAR: szAppID = "{A4268EEC-FEC5-49E5-95C3-F126696BDBF6}"; break;
- case MSN_APPID_CUSTOMSMILEY: szAppID = "{A4268EEC-FEC5-49E5-95C3-F126696BDBF6}"; break;
- case MSN_APPID_CUSTOMANIMATEDSMILEY: szAppID = "{A4268EEC-FEC5-49E5-95C3-F126696BDBF6}"; break;
- default: return;
- }
-
- ft->p2p_type = iAppID;
- ft->p2p_acksessid = MSN_GenRandom();
- mir_free(ft->p2p_callID);
- ft->p2p_callID = getNewUuid();
-
- MsnContact* cont = Lists_Get(ft->std.hContact);
- if (cont == NULL) return;
-
- if (ft->p2p_dest == NULL) {
- ft->p2p_isV2 = (cont->cap2 & capex_SupportsPeerToPeerV2) != 0 || (cont->cap1 >> 28) >= 10;
- ft->p2p_dest = mir_strdup(wlid ? wlid : cont->email);
- }
-
- char* pContext = NULL;
- size_t cbContext = 0;
-
- switch (iAppID) {
- case MSN_APPID_FILE:
- cbContext = sizeof(HFileContext);
- pContext = (char*)malloc(cbContext);
- {
- HFileContext* ctx = (HFileContext*)pContext;
- memset(pContext, 0, cbContext);
- if (ft->p2p_isV2) {
- cbContext -= 64;
- ctx->ver = 2;
- }
- else {
- ctx->ver = 3;
- ctx->id = 0xffffffff;
- }
- ctx->len = (unsigned)cbContext;
- ctx->type = MSN_TYPEID_FTNOPREVIEW;
- ctx->dwSize = ft->std.currentFileSize;
-
- wchar_t* pszFiles = wcsrchr(ft->std.tszCurrentFile, '\\');
- if (pszFiles)
- pszFiles++;
- else
- pszFiles = ft->std.tszCurrentFile;
-
- wchar_t *fname = mir_wstrdup(pszFiles);
- wcsncpy(ctx->wszFileName, fname, MAX_PATH);
- mir_free(fname);
-
- ft->p2p_appID = MSN_APPID_FILE;
- }
- break;
-
- default:
- ft->p2p_appID = MSN_APPID_AVATAR2;
-
- if (ft->p2p_object == NULL) {
- delete ft;
- return;
- }
-
- ezxml_t xmlo = ezxml_parse_str(NEWSTR_ALLOCA(ft->p2p_object), mir_strlen(ft->p2p_object));
- ezxml_t xmlr = ezxml_new("msnobj");
-
- const char* p;
- p = ezxml_attr(xmlo, "Creator");
- if (p != NULL)
- ezxml_set_attr(xmlr, "Creator", p);
- p = ezxml_attr(xmlo, "Size");
- if (p != NULL) {
- ezxml_set_attr(xmlr, "Size", p);
- ft->std.totalBytes = ft->std.currentFileSize = _atoi64(p);
- }
- p = ezxml_attr(xmlo, "Type");
- if (p != NULL)
- ezxml_set_attr(xmlr, "Type", p);
- p = ezxml_attr(xmlo, "Location");
- if (p != NULL)
- ezxml_set_attr(xmlr, "Location", p);
- p = ezxml_attr(xmlo, "Friendly");
- if (p != NULL)
- ezxml_set_attr(xmlr, "Friendly", p);
- p = ezxml_attr(xmlo, "SHA1D");
- if (p != NULL)
- ezxml_set_attr(xmlr, "SHA1D", p);
- p = ezxml_attr(xmlo, "SHA1C");
- if (p != NULL)
- ezxml_set_attr(xmlr, "SHA1C", p);
-
- pContext = ezxml_toxml(xmlr, false);
- cbContext = mir_strlen(pContext) + 1;
-
- ezxml_free(xmlr);
- ezxml_free(xmlo);
-
- break;
- }
-
- bool sessionExist = p2p_sessionRegistered(ft);
- if (!sessionExist) {
- p2p_registerSession(ft);
-
- unsigned short status = getWord(ft->std.hContact, "Status", ID_STATUS_OFFLINE);
- if ((myFlags & 0x4000000) && cont->places.getCount() <= 1 &&
- status != ID_STATUS_OFFLINE && status != ID_STATUS_INVISIBLE && m_iStatus != ID_STATUS_INVISIBLE) {
- if (ft->p2p_isV2) {
- if (cont->places.getCount() && cont->places[0].cap1 & cap_SupportsP2PBootstrap) {
- char wlid[128];
- mir_snprintf(wlid,
- mir_strcmp(cont->places[0].id, sttVoidUid) ? "%s;%s" : "%s",
- cont->email, cont->places[0].id);
-
- if (!MSN_GetThreadByContact(wlid, SERVER_P2P_DIRECT))
- p2p_inviteDc(ft, wlid);
- else
- p2p_invite(ft->p2p_type, ft, wlid);
-
- free(pContext);
- return;
- }
- }
- else {
- const char *wlid = cont->email;
- if (cont->cap1 & cap_SupportsP2PBootstrap) {
- if (!MSN_GetThreadByContact(wlid, SERVER_P2P_DIRECT))
- p2p_inviteDc(ft, wlid);
- else
- p2p_invite(ft->p2p_type, ft, wlid);
-
- free(pContext);
- return;
- }
- }
- }
- }
-
- if (!ft->bAccepted)
- ft->p2p_sessionid = MSN_GenRandom();
-
- ptrA szContextEnc(mir_base64_encode((PBYTE)pContext, (unsigned)cbContext));
-
- MimeHeaders chdrs(10);
- chdrs.addString("EUF-GUID", szAppID);
- chdrs.addULong("SessionID", ft->p2p_sessionid);
- chdrs.addULong("AppID", ft->p2p_appID);
- chdrs.addString("Context", szContextEnc);
-
- MimeHeaders tResult(8);
- tResult.addString("CSeq", "0 ");
- tResult.addString("Call-ID", ft->p2p_callID);
- tResult.addLong("Max-Forwards", 0);
- tResult.addString("Content-Type", "application/x-msnmsgr-sessionreqbody");
-
- if (iAppID != MSN_APPID_FILE)
- ft->p2p_waitack = true;
-
- if (ft->p2p_isV2 && ft->std.currentFileNumber == 0) {
- for (int i = 0; i < cont->places.getCount(); ++i) {
- char wlid[128];
- mir_snprintf(wlid,
- mir_strcmp(cont->places[i].id, sttVoidUid) ? "%s;%s" : "%s",
- cont->email, cont->places[i].id);
-
- p2p_sendSlp(-2, ft, tResult, chdrs, wlid);
- }
- }
- else p2p_sendSlp(-2, ft, tResult, chdrs, wlid);
-
- free(pContext);
-}
-
-
-void CMsnProto::p2p_inviteDc(filetransfer* ft, const char *wlid)
-{
- directconnection* dc = new directconnection(szUbnCall, wlid);
- p2p_registerDC(dc);
-
- MimeHeaders tResult(8);
- tResult.addString("CSeq", "0 ");
- tResult.addString("Call-ID", dc->callId);
- tResult.addLong("Max-Forwards", 0);
- tResult.addString("Content-Type", "application/x-msnmsgr-transreqbody");
-
- MimeHeaders chdrs(12);
-
- chdrs.addString("Bridges", "TCPv1 SBBridge");
- chdrs.addLong("NetID", MyConnection.extIP);
- chdrs.addString("Conn-Type", MyConnection.GetMyUdpConStr());
- chdrs.addBool("UPnPNat", MyConnection.upnpNAT);
- chdrs.addBool("ICF", MyConnection.icf);
- chdrs.addString("IPv6-global", GetGlobalIp(), 2);
- chdrs.addString("Hashed-Nonce", dc->mNonceToHash(), 2);
- chdrs.addString("SessionID", "0");
- chdrs.addString("SChannelState", "0");
- chdrs.addString("Capabilities-Flags", "1");
-
- p2p_sendSlp(-2, ft, tResult, chdrs, wlid);
-}
-
-/*
-void CMsnProto::p2p_sendSessionAck(filetransfer* ft)
-{
- MimeHeaders tResult(8);
- tResult.addString("CSeq", "0 ");
- tResult.addString("Call-ID", sttVoidUid);
- tResult.addLong("Max-Forwards", 0);
- tResult.addString("Content-Type", "application/x-msnmsgr-transdestaddrupdate");
-
- MimeHeaders chdrs(8);
-
- chdrs.addString("IPv4ExternalAddrsAndPorts", mir_strdup(MyConnection.GetMyExtIPStr()), 6);
- chdrs.addString("IPv4InternalAddrsAndPorts", mir_strdup(MyConnection.GetMyExtIPStr()), 6);
- chdrs.addString("SessionID", "0");
- chdrs.addString("SChannelState", "0");
- chdrs.addString("Capabilities-Flags", "1");
-
- p2p_sendSlp(-3, ft, tResult, chdrs);
-}
-*/
-
-void CMsnProto::p2p_sessionComplete(filetransfer* ft)
-{
- if (ft->p2p_appID != MSN_APPID_FILE)
- p2p_unregisterSession(ft);
- else if (ft->std.flags & PFTS_SENDING) {
- if (ft->openNext() == -1) {
- bool success = ft->std.currentFileNumber >= ft->std.totalFiles && ft->bCompleted;
- ProtoBroadcastAck(ft->std.hContact, ACKTYPE_FILE, success ? ACKRESULT_SUCCESS : ACKRESULT_FAILED, ft, 0);
- }
- else {
- ProtoBroadcastAck(ft->std.hContact, ACKTYPE_FILE, ACKRESULT_NEXTFILE, ft, 0);
- p2p_invite(ft->p2p_appID, ft, NULL);
- }
- }
- else {
- ProtoBroadcastAck(ft->std.hContact, ACKTYPE_FILE, ft->bCompleted ? ACKRESULT_SUCCESS : ACKRESULT_FAILED, ft, 0);
- p2p_unregisterSession(ft);
- }
-}
-
-char* P2PV2_Header::parseMsg(char *buf)
-{
- unsigned char hdrLen1 = *(unsigned char*)buf;
- mOpCode = *(unsigned char*)(buf + 1);
- mPacketLen = _htons(*(unsigned short*)(buf + 2));
- mID = _htonl(*(unsigned*)(buf + 4));
-
- char* buf1 = buf + hdrLen1;
-
- for (char *tlvp = buf + 8; tlvp < buf1 && *tlvp; tlvp += 2 + tlvp[1]) {
- switch (*tlvp) {
- case 1:
- mCap = tlvp;
- break;
- case 2:
- mAckUniqueID = _htonl(*(unsigned*)(tlvp + 4));
- break;
- case 3:
- break;
- }
- }
-
- if (mPacketLen == 0) return buf + hdrLen1;
-
- unsigned char hdrLen2 = *(unsigned char*)buf1;
- mTFCode = *(unsigned char*)(buf1 + 1);
- mPacketNum = _htons(*(unsigned short*)(buf1 + 2));
- mSessionID = _htonl(*(unsigned*)(buf1 + 4));
-
- char* buf2 = buf1 + hdrLen2;
-
- for (char *tlvp1 = buf1 + 8; tlvp1 < buf2 && *tlvp1; tlvp1 += 2 + tlvp1[1]) {
- switch (*tlvp1) {
- case 1:
- mRemSize = _htonl64(*(unsigned __int64*)(tlvp1 + 2));
- break;
- }
- }
-
- mPacketLen -= hdrLen2;
- return buf1 + hdrLen2;
-}
-
-char* P2PV2_Header::createMsg(char *buf, const char* wlid, CMsnProto *ppro)
-{
- unsigned char hdrLen1 = 8 + (mAckUniqueID ? 6 : 0) + (mCap ? 2 + mCap[1] : 0);
- unsigned char comp = hdrLen1 & 3;
- hdrLen1 += comp ? 4 - comp : 0;
-
- unsigned char hdrLen2 = mPacketLen ? (8 + (mRemSize ? 10 : 0)) : 0;
- comp = hdrLen2 & 3;
- hdrLen2 += comp ? 4 - comp : 0;
-
- mID = ppro->p2p_getMsgId(wlid, mPacketLen + hdrLen2);
-
- memset(buf, 0, hdrLen1 + hdrLen2);
-
- *(unsigned char*)(buf + 0) = hdrLen1;
- *(unsigned char*)(buf + 1) = mOpCode;
- *(unsigned short*)(buf + 2) = _htons(mPacketLen + hdrLen2);
- *(unsigned*)(buf + 4) = _htonl(mID);
-
- char *buf1 = buf + 8;
-
- if (mAckUniqueID) {
- *(unsigned char*)buf1 = 2;
- *(unsigned char*)(buf1 + 1) = 4;
- *(unsigned*)(buf1 + 2) = _htonl(mAckUniqueID);
- buf1 += 6;
- }
- if (mCap) {
- unsigned len = 2 + mCap[1];
- memcpy(buf1, mCap, len);
- buf1 += len;
- }
-
- buf1 = buf + hdrLen1;
-
- if (hdrLen2 == 0) return buf1;
-
- *(unsigned char*)(buf1 + 0) = hdrLen2;
- *(unsigned char*)(buf1 + 1) = mTFCode;
- *(unsigned short*)(buf1 + 2) = _htons(mPacketNum);
- *(unsigned*)(buf1 + 4) = _htonl(mSessionID);
-
- if (mRemSize) {
- *(unsigned char*)(buf1 + 8) = 1;
- *(unsigned char*)(buf1 + 9) = 8;
- *(unsigned __int64*)(buf1 + 10) = _htonl64(mRemSize);
- }
-
- return buf1 + hdrLen2;
-}
-
-char* P2P_Header::createMsg(char *buf, const char* wlid, CMsnProto *ppro)
-{
- if (!mID) mID = ppro->p2p_getMsgId(wlid, 1);
- memcpy(buf, &mSessionID, 48);
- return buf + 48;
-}
-#endif \ No newline at end of file
diff --git a/protocols/MSN/src/msn_p2ps.cpp b/protocols/MSN/src/msn_p2ps.cpp
deleted file mode 100644
index a42526dac1..0000000000
--- a/protocols/MSN/src/msn_p2ps.cpp
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
-Plugin of Miranda IM for communicating with users of the MSN Messenger protocol.
-
-Copyright (c) 2012-2017 Miranda NG Team
-Copyright (c) 2006-2012 Boris Krasnovskiy.
-Copyright (c) 2003-2005 George Hazan.
-Copyright (c) 2002-2003 Richard Hughes (original version).
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "stdafx.h"
-#include "msn_proto.h"
-#ifdef OBSOLETE
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// add file session to a list
-
-void CMsnProto::p2p_registerSession(filetransfer* ft)
-{
- mir_cslock lck(m_csSessions);
- m_arSessions.insert(ft);
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// remove file session from a list
-
-void CMsnProto::p2p_unregisterSession(filetransfer* ft)
-{
- mir_cslock lck(m_csSessions);
- m_arSessions.remove(ft);
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// get session by some parameter
-
-filetransfer* CMsnProto::p2p_getSessionByID(unsigned id)
-{
- if (id == 0)
- return NULL;
-
- mir_cslock lck(m_csSessions);
-
- for (int i = 0; i < m_arSessions.getCount(); i++) {
- filetransfer* FT = &m_arSessions[i];
- if (FT->p2p_sessionid == id)
- return FT;
- }
-
- return NULL;
-}
-
-filetransfer* CMsnProto::p2p_getSessionByUniqueID(unsigned id)
-{
- if (id == 0)
- return NULL;
-
- mir_cslock lck(m_csSessions);
-
- for (int i = 0; i < m_arSessions.getCount(); i++) {
- filetransfer* FT = &m_arSessions[i];
- if (FT->p2p_acksessid == id)
- return FT;
- }
-
- return NULL;
-}
-
-
-bool CMsnProto::p2p_sessionRegistered(filetransfer* ft)
-{
- if (ft != NULL && ft->p2p_appID == 0)
- return true;
-
- mir_cslock lck(m_csSessions);
- return m_arSessions.getIndex(ft) > -1;
-}
-
-filetransfer* CMsnProto::p2p_getThreadSession(MCONTACT hContact, TInfoType mType)
-{
- mir_cslock lck(m_csSessions);
-
- for (int i = 0; i < m_arSessions.getCount(); i++) {
- filetransfer* FT = &m_arSessions[i];
- if (FT->std.hContact == hContact && FT->tType == mType)
- return FT;
- }
-
- return NULL;
-}
-
-void CMsnProto::p2p_clearThreadSessions(MCONTACT hContact, TInfoType mType)
-{
- mir_cslock lck(m_csSessions);
-
- for (int i = 0; i < m_arSessions.getCount(); i++) {
- filetransfer* ft = &m_arSessions[i];
- if (ft->std.hContact == hContact && ft->tType == mType) {
- ft->bCanceled = true;
- ft->tType = SERVER_NOTIFICATION;
- p2p_sendCancel(ft);
- }
- }
-}
-
-filetransfer* CMsnProto::p2p_getAvatarSession(MCONTACT hContact)
-{
- mir_cslock lck(m_csSessions);
-
- for (int i = 0; i < m_arSessions.getCount(); i++) {
- filetransfer* FT = &m_arSessions[i];
- if (FT->std.hContact == hContact && !(FT->std.flags & PFTS_SENDING) && FT->p2p_type == MSN_APPID_AVATAR)
- return FT;
- }
-
- return NULL;
-}
-
-bool CMsnProto::p2p_isAvatarOnly(MCONTACT hContact)
-{
- mir_cslock lck(m_csSessions);
-
- bool result = true;
- for (int i = 0; i < m_arSessions.getCount(); i++) {
- filetransfer* FT = &m_arSessions[i];
- result &= FT->std.hContact != hContact || FT->p2p_type != MSN_APPID_FILE;
- }
-
- return result;
-}
-
-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_redirectSessions(const char *wlid)
-{
- mir_cslock lck(m_csSessions);
-
- ThreadData* T = MSN_GetP2PThreadByContact(wlid);
- for (int i = 0; i < m_arSessions.getCount(); i++) {
- filetransfer* FT = &m_arSessions[i];
- if (_stricmp(FT->p2p_dest, wlid) == 0 &&
- FT->std.currentFileProgress < FT->std.currentFileSize &&
- (T == NULL || (FT->tType != T->mType && FT->tType != 0))) {
- if (FT->p2p_isV2) {
- if ((FT->std.flags & PFTS_SENDING) && T)
- FT->tType = T->mType;
- }
- else {
- if (!(FT->std.flags & PFTS_SENDING))
- p2p_sendRedirect(FT);
- }
- }
- }
-}
-
-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_cancelAllSessions(void)
-{
- mir_cslock lck(m_csSessions);
-
- for (int i = 0; i < m_arSessions.getCount(); i++) {
- m_arSessions[i].bCanceled = true;
- p2p_sendCancel(&m_arSessions[i]);
- }
-}
-
-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;
-}
-
-
-void CMsnProto::p2p_registerDC(directconnection* dc)
-{
- mir_cslock lck(m_csSessions);
- m_arDirect.insert(dc);
-}
-
-void CMsnProto::p2p_unregisterDC(directconnection* dc)
-{
- mir_cslock lck(m_csSessions);
- m_arDirect.remove(dc);
-}
-
-directconnection* CMsnProto::p2p_getDCByCallID(const char* CallID, const char* wlid)
-{
- if (CallID == NULL)
- return NULL;
-
- mir_cslock lck(m_csSessions);
-
- for (int i = 0; i < m_arDirect.getCount(); i++) {
- directconnection* DC = &m_arDirect[i];
- if (DC->callId != NULL && !mir_strcmp(DC->callId, CallID) && !mir_strcmp(DC->wlid, wlid))
- return DC;
- }
-
- return NULL;
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// external functions
-
-void CMsnProto::P2pSessions_Uninit(void)
-{
- mir_cslock lck(m_csSessions);
- m_arSessions.destroy();
- m_arDirect.destroy();
-}
-#endif
diff --git a/protocols/MSN/src/msn_proto.cpp b/protocols/MSN/src/msn_proto.cpp
index 44cd861286..57e190da30 100644
--- a/protocols/MSN/src/msn_proto.cpp
+++ b/protocols/MSN/src/msn_proto.cpp
@@ -24,9 +24,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
static COLORREF crCols[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
int msn_httpGatewayInit(HNETLIBCONN hConn, NETLIBOPENCONNECTION *nloc, NETLIBHTTPREQUEST *nlhr);
-int msn_httpGatewayBegin(HNETLIBCONN hConn, NETLIBOPENCONNECTION *nloc);
int msn_httpGatewayWrapSend(HNETLIBCONN hConn, PBYTE buf, int len, int flags);
-PBYTE msn_httpGatewayUnwrapRecv(NETLIBHTTPREQUEST *nlhr, PBYTE buf, int len, int *outBufLen, void *(*NetlibRealloc)(void*, size_t));
+PBYTE msn_httpGatewayUnwrapRecv(NETLIBHTTPREQUEST *nlhr, PBYTE buf, int len, int *outBufLen, void *(*)(void*, size_t));
static int CompareLists(const MsnContact *p1, const MsnContact *p2)
{
@@ -39,10 +38,6 @@ CMsnProto::CMsnProto(const char* aProtoName, const wchar_t* aUserName) :
m_arGroups(10, CompareId),
m_arThreads(10, PtrKeySortT),
m_arGCThreads(10, PtrKeySortT),
-#ifdef OBSOLETE
- m_arSessions(10, PtrKeySortT),
- m_arDirect(10, PtrKeySortT),
-#endif
lsMessageQueue(1),
lsAvatarQueue(1),
msgCache(5, CompareId),
@@ -81,12 +76,6 @@ CMsnProto::CMsnProto(const char* aProtoName, const wchar_t* aUserName) :
CreateProtoService(PS_GETAVATARCAPS, &CMsnProto::GetAvatarCaps);
CreateProtoService(PS_SETMYNICKNAME, &CMsnProto::SetNickName);
-#ifdef OBSOLETE
- CreateProtoService(PS_GET_LISTENINGTO, &CMsnProto::GetCurrentMedia);
- CreateProtoService(PS_SET_LISTENINGTO, &CMsnProto::SetCurrentMedia);
-
- MsgQueue_Init();
-#endif
hMSNNudge = CreateProtoEvent("/Nudge");
CreateProtoService(PS_SEND_NUDGE, &CMsnProto::SendNudge);
@@ -168,11 +157,6 @@ CMsnProto::~CMsnProto()
Threads_Uninit();
AvatarQueue_Uninit();
Lists_Uninit();
-#ifdef OBSOLETE
- DestroyHookableEvent(hMSNNudge);
- P2pSessions_Uninit();
- MsgQueue_Uninit();
-#endif
CachedMsg_Uninit();
Netlib_CloseHandle(m_hNetlibUser);
@@ -416,12 +400,6 @@ void __cdecl CMsnProto::MsnSearchAckThread(void* arg)
case 1:
if (strstr(email, "@yahoo.com") == NULL)
ProtoBroadcastAck(NULL, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, arg, 0);
- #ifdef OBSOLETE
- else {
- msnSearchId = arg;
- MSN_FindYahooUser(email);
- }
- #endif
break;
default:
@@ -487,17 +465,6 @@ void __cdecl CMsnProto::MsnFileAckThread(void* arg)
ft->create();
-#ifdef OBSOLETE
- if (ft->tType != SERVER_HTTP) {
- if (ft->p2p_appID != 0) {
- if (fcrt)
- p2p_sendFeedStart(ft);
- p2p_sendStatus(ft, fcrt ? 200 : 603);
- }
- else msnftp_sendAcceptReject(ft, fcrt);
- }
-#endif
-
ProtoBroadcastAck(ft->std.hContact, ACKTYPE_FILE, ACKRESULT_INITIALISING, ft, 0);
if (ft->tType == SERVER_HTTP) {
@@ -564,11 +531,6 @@ HANDLE __cdecl CMsnProto::FileAllow(MCONTACT, HANDLE hTransfer, const wchar_t* s
{
filetransfer* ft = (filetransfer*)hTransfer;
-#ifdef OBSOLETE
- if (ft->tType != SERVER_HTTP && (!msnLoggedIn || !p2p_sessionRegistered(ft)))
- return 0;
-#endif
-
if ((ft->std.tszWorkingDir = mir_wstrdup(szPath)) == NULL) {
wchar_t szCurrDir[MAX_PATH];
GetCurrentDirectory(_countof(szCurrDir), szCurrDir);
@@ -590,31 +552,8 @@ int __cdecl CMsnProto::FileCancel(MCONTACT, HANDLE hTransfer)
{
filetransfer* ft = (filetransfer*)hTransfer;
- if (ft->tType == SERVER_HTTP) ft->bCanceled = true;
-#ifdef OBSOLETE
- else {
- if (!msnLoggedIn || !p2p_sessionRegistered(ft))
- return 0;
-
- if (!(ft->std.flags & PFTS_SENDING) && ft->fileId == -1) {
- if (ft->p2p_appID != 0)
- p2p_sendStatus(ft, 603);
- else
- msnftp_sendAcceptReject(ft, false);
- }
- else {
- ft->bCanceled = true;
- if (ft->p2p_appID != 0) {
- p2p_sendCancel(ft);
- if (!(ft->std.flags & PFTS_SENDING) && ft->p2p_isV2)
- p2p_sessionComplete(ft);
- }
- }
-
- ft->std.ptszFiles = NULL;
- ft->std.totalFiles = 0;
- }
-#endif
+ if (ft->tType == SERVER_HTTP)
+ ft->bCanceled = true;
return 0;
}
@@ -622,26 +561,8 @@ int __cdecl CMsnProto::FileCancel(MCONTACT, HANDLE hTransfer)
int __cdecl CMsnProto::FileDeny(MCONTACT, HANDLE hTransfer, const wchar_t* /*szReason*/)
{
filetransfer* ft = (filetransfer*)hTransfer;
-
- if (ft->tType == SERVER_HTTP) delete ft;
-#ifdef OBSOLETE
- else {
- if (!msnLoggedIn || !p2p_sessionRegistered(ft))
- return 1;
-
- if (!(ft->std.flags & PFTS_SENDING) && ft->fileId == -1) {
- if (ft->p2p_appID != 0)
- p2p_sendStatus(ft, 603);
- else
- msnftp_sendAcceptReject(ft, false);
- }
- else {
- ft->bCanceled = true;
- if (ft->p2p_appID != 0)
- p2p_sendCancel(ft);
- }
- }
-#endif
+ if (ft->tType == SERVER_HTTP)
+ delete ft;
return 0;
}
@@ -673,39 +594,6 @@ int __cdecl CMsnProto::FileResume(HANDLE hTransfer, int* action, const wchar_t**
}
SetEvent(ft->hResumeEvt);
}
-#ifdef OBSOLETE
- else {
- if (!msnLoggedIn || !p2p_sessionRegistered(ft))
- return 1;
-
- switch (*action) {
- case FILERESUME_SKIP:
- if (ft->p2p_appID != 0)
- p2p_sendStatus(ft, 603);
- else
- msnftp_sendAcceptReject(ft, false);
- break;
-
- case FILERESUME_RENAME:
- replaceStrW(ft->std.tszCurrentFile, *szFilename);
-
- default:
- bool fcrt = ft->create() != -1;
- if (ft->p2p_appID != 0) {
- if (fcrt)
- p2p_sendFeedStart(ft);
-
- p2p_sendStatus(ft, fcrt ? 200 : 603);
- }
- else
- msnftp_sendAcceptReject(ft, fcrt);
-
- ProtoBroadcastAck(ft->std.hContact, ACKTYPE_FILE, ACKRESULT_INITIALISING, ft, 0);
- break;
- }
- }
-#endif
-
return 0;
}
@@ -832,53 +720,7 @@ int CMsnProto::RecvContacts(MCONTACT hContact, PROTORECVEVENT* pre)
return 0;
}
-
-#ifdef OBSOLETE
-// MsnSendFile - initiates a file transfer
-HANDLE __cdecl CMsnProto::SendFile(MCONTACT hContact, const wchar_t*, wchar_t** 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 (_wstat64(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);
- }
-
- ProtoBroadcastAck(hContact, ACKTYPE_FILE, ACKRESULT_SENTREQUEST, sft, 0);
- return sft;
-}
-#endif
+/////////////////////////////////////////////////////////////////////////////////////////
struct TFakeAckParams
{
@@ -968,15 +810,9 @@ int __cdecl CMsnProto::SendMsg(MCONTACT hContact, int flags, const char* pszSrc)
ForkThread(&CMsnProto::MsnFakeAck, new TFakeAckParams(hContact, seq, errMsg, this));
}
else {
-#ifdef OBSOLETE
- const char msgType = MyOptions.SlowSend ? 'A' : 'N';
- bool isOffline;
- ThreadData *thread = MSN_StartSB(tEmail, isOffline);
-#else
- /* MSNP24 doesn't have a switchboard anymore */
+ // MSNP24 doesn't have a switchboard anymore
bool isOffline = true;
ThreadData *thread = NULL;
-#endif
if (thread == NULL) {
if (isOffline) {
@@ -990,15 +826,6 @@ int __cdecl CMsnProto::SendMsg(MCONTACT hContact, int flags, const char* pszSrc)
ForkThread(&CMsnProto::MsnFakeAck, new TFakeAckParams(hContact, seq, errMsg, this));
}
}
-#ifdef OBSOLETE
- else
- seq = MsgQueue_Add(tEmail, msgType, msg, 0, 0, rtlFlag);
- }
- else {
- seq = thread->sendMessage(msgType, tEmail, netId, msg, rtlFlag);
- if (!MyOptions.SlowSend)
- ForkThread(&CMsnProto::MsnFakeAck, new TFakeAckParams(hContact, seq, NULL, this));
-#endif
}
}
break;
@@ -1087,11 +914,6 @@ int __cdecl CMsnProto::SetStatus(int iNewStatus)
return 0;
}
-#ifdef OBSOLETE
- m_arSessions.destroy();
- m_arDirect.destroy();
-#endif
-
usingGateway = false;
int oldMode = m_iStatus;
@@ -1120,33 +942,8 @@ int __cdecl CMsnProto::UserIsTyping(MCONTACT hContact, int type)
if (MSN_IsMeByContact(hContact, tEmail)) return 0;
bool typing = type == PROTOTYPE_SELFTYPING_ON;
-
int netId = Lists_GetNetId(tEmail);
-#ifdef OBSOLETE
- switch (netId) {
- case NETID_UNKNOWN:
- case NETID_MSN:
- case NETID_LCS:
- bool isOffline;
- {
- ThreadData* thread = MSN_StartSB(tEmail, isOffline);
- if (thread == NULL) {
- if (isOffline)
- return 0;
- MsgQueue_Add(tEmail, 2571, NULL, 0, NULL, typing);
- }
- else MSN_StartStopTyping(thread, typing);
- }
- break;
- case NETID_YAHOO:
- if (typing) MSN_SendTyping(msnNsThread, tEmail, netId);
- break;
-
- default:
- break;
- }
-#endif
if (getWord(hContact, "Status", ID_STATUS_OFFLINE) != ID_STATUS_OFFLINE)
MSN_SendTyping(msnNsThread, tEmail, netId, typing);
diff --git a/protocols/MSN/src/msn_proto.h b/protocols/MSN/src/msn_proto.h
index 3db4644cbd..d0576b7908 100644
--- a/protocols/MSN/src/msn_proto.h
+++ b/protocols/MSN/src/msn_proto.h
@@ -54,9 +54,6 @@ struct CMsnProto : public PROTO<CMsnProto>
virtual int __cdecl RecvMsg(MCONTACT hContact, PROTORECVEVENT*);
virtual int __cdecl RecvContacts(MCONTACT hContact, PROTORECVEVENT*);
-#ifdef OBSOLETE
- virtual HANDLE __cdecl SendFile(MCONTACT hContact, const wchar_t* szDescription, wchar_t** ppszFiles);
-#endif
virtual int __cdecl SendMsg(MCONTACT hContact, int flags, const char* msg);
virtual int __cdecl SendContacts(MCONTACT hContact, int flags, int nContacts, MCONTACT *hContactsList);
@@ -74,15 +71,12 @@ struct CMsnProto : public PROTO<CMsnProto>
INT_PTR __cdecl SvcCreateAccMgrUI(WPARAM wParam, LPARAM lParam);
INT_PTR __cdecl GetAvatarInfo(WPARAM wParam, LPARAM lParam);
- INT_PTR __cdecl GetMyAwayMsg(WPARAM wParam,LPARAM lParam);
+ INT_PTR __cdecl GetMyAwayMsg(WPARAM wParam, LPARAM lParam);
INT_PTR __cdecl GetAvatar(WPARAM wParam, LPARAM lParam);
INT_PTR __cdecl SetAvatar(WPARAM wParam, LPARAM lParam);
INT_PTR __cdecl GetAvatarCaps(WPARAM wParam, LPARAM lParam);
- INT_PTR __cdecl GetCurrentMedia(WPARAM wParam, LPARAM lParam);
- INT_PTR __cdecl SetCurrentMedia(WPARAM wParam, LPARAM lParam);
-
INT_PTR __cdecl SetNickName(WPARAM wParam, LPARAM lParam);
INT_PTR __cdecl SendNudge(WPARAM wParam, LPARAM lParam);
@@ -91,15 +85,15 @@ struct CMsnProto : public PROTO<CMsnProto>
INT_PTR __cdecl OnLeaveChat(WPARAM wParam, LPARAM lParam);
//====| Events |======================================================================
- int __cdecl OnContactDeleted(WPARAM wParam,LPARAM lParam);
+ int __cdecl OnContactDeleted(WPARAM wParam, LPARAM lParam);
int __cdecl OnIdleChanged(WPARAM wParam, LPARAM lParam);
int __cdecl OnGroupChange(WPARAM wParam, LPARAM lParam);
int __cdecl OnModulesLoaded(WPARAM wParam, LPARAM lParam);
- int __cdecl OnOptionsInit(WPARAM wParam,LPARAM lParam);
- int __cdecl OnPrebuildContactMenu(WPARAM wParam,LPARAM lParam);
- int __cdecl OnPreShutdown(WPARAM wParam,LPARAM lParam);
- int __cdecl OnContactDoubleClicked(WPARAM wParam,LPARAM lParam);
- int __cdecl OnDbSettingChanged(WPARAM wParam,LPARAM lParam);
+ int __cdecl OnOptionsInit(WPARAM wParam, LPARAM lParam);
+ int __cdecl OnPrebuildContactMenu(WPARAM wParam, LPARAM lParam);
+ int __cdecl OnPreShutdown(WPARAM wParam, LPARAM lParam);
+ int __cdecl OnContactDoubleClicked(WPARAM wParam, LPARAM lParam);
+ int __cdecl OnDbSettingChanged(WPARAM wParam, LPARAM lParam);
int __cdecl OnWindowPopup(WPARAM wParam, LPARAM lParam);
//====| Data |========================================================================
@@ -128,10 +122,6 @@ struct CMsnProto : public PROTO<CMsnProto>
LIST<GCThreadData> m_arGCThreads;
mir_cs m_csSessions;
-#ifdef OBSOLETE
- OBJLIST<filetransfer> m_arSessions;
- OBJLIST<directconnection> m_arDirect;
-#endif
mir_cs csMsgQueue;
int msgQueueSeq;
@@ -158,7 +148,7 @@ struct CMsnProto : public PROTO<CMsnProto>
bool usingGateway;
char* msnExternalIP;
- char* msnRegistration;
+ char* msnRegistration;
char* msnPreviousUUX;
char* msnLastStatusMsg;
@@ -203,26 +193,17 @@ struct CMsnProto : public PROTO<CMsnProto>
void MSN_SetServerStatus(int newStatus);
void MSN_FetchRecentMessages(time_t since = 0);
void MSN_StartStopTyping(GCThreadData* info, bool start);
- void MSN_SendTyping(ThreadData* info, const char* email, int netId, bool bTyping );
+ void MSN_SendTyping(ThreadData* info, const char* email, int netId, bool bTyping);
- void MSN_InitSB(ThreadData* info, const char* szEmail);
void MSN_ReceiveMessage(ThreadData* info, char* cmdString, char* params);
int MSN_HandleCommands(ThreadData* info, char* cmdString);
int MSN_HandleErrors(ThreadData* info, char* cmdString);
void MSN_ProcessNotificationMessage(char* buf, size_t bufLen);
void MSN_ProcessStatusMessage(ezxml_t xmli, const char* wlid);
void MSN_ProcessNLN(const char *userStatus, const char *wlid, char *userNick, const char *objid, char *cmdstring);
- void MSN_ProcessPage(char* buf, unsigned len);
- void MSN_ProcessRemove(char* buf, size_t len);
- void MSN_ProcessAdd(char* buf, size_t len);
void MSN_ProcessYFind(char* buf, size_t len);
- void MSN_ProcessURIObject(MCONTACT hContact, ezxml_t xmli);
- void MSN_CustomSmiley(const char* msgBody, char* email, char* nick, int iSmileyType);
- void MSN_InviteMessage(ThreadData* info, char* msgBody, char* email, char* nick);
-#ifdef OBSOLETE
- void MSN_SetMirVer(MCONTACT hContact, DWORD dwValue, bool always);
-#endif
- void MSN_SetMirVer(MCONTACT hContact, MsnPlace *place);
+ void MSN_ProcessURIObject(MCONTACT hContact, ezxml_t xmli);
+ void MSN_SetMirVer(MCONTACT hContact, MsnPlace *place);
void LoadOptions(void);
@@ -230,10 +211,6 @@ struct CMsnProto : public PROTO<CMsnProto>
void MSN_ShowPopup(const wchar_t* nickname, const wchar_t* msg, int flags, const char* url);
void MSN_ShowPopup(const MCONTACT hContact, const wchar_t* msg, int flags);
void MSN_ShowError(const char* msgtext, ...);
-
-#ifdef OBSOLETE
- void MSN_SetNicknameUtf(const char* nickname);
-#endif
void MSN_SendNicknameUtf(const char* nickname);
typedef struct { wchar_t *szName; const char *szMimeType; unsigned char *data; size_t dataSize; } StoreAvatarData;
@@ -263,8 +240,6 @@ struct CMsnProto : public PROTO<CMsnProto>
INT_PTR __cdecl MsnSendHotmail(WPARAM wParam, LPARAM);
INT_PTR __cdecl MsnEditProfile(WPARAM, LPARAM);
INT_PTR __cdecl MsnInviteCommand(WPARAM wParam, LPARAM lParam);
- INT_PTR __cdecl MsnSendNetMeeting(WPARAM wParam, LPARAM lParam);
- INT_PTR __cdecl SetNicknameUI(WPARAM wParam, LPARAM lParam);
INT_PTR __cdecl MsnViewProfile(WPARAM wParam, LPARAM lParam);
INT_PTR __cdecl MsnSetupAlerts(WPARAM wParam, LPARAM lParam);
@@ -284,8 +259,8 @@ struct CMsnProto : public PROTO<CMsnProto>
void __cdecl MsnGetAwayMsgThread(void* arg);
- void __cdecl p2p_sendFeedThread(void* arg );
- void __cdecl p2p_fileActiveThread(void* arg );
+ void __cdecl p2p_sendFeedThread(void* arg);
+ void __cdecl p2p_fileActiveThread(void* arg);
void __cdecl p2p_filePassiveThread(void* arg);
void __cdecl MsgQueue_AllClearThread(void* arg);
@@ -295,18 +270,9 @@ struct CMsnProto : public PROTO<CMsnProto>
void Threads_Uninit(void);
void MSN_CloseConnections(void);
- int MSN_GetChatThreads(ThreadData** parResult);
- int MSN_GetActiveThreads(ThreadData**);
ThreadData* MSN_GetThreadByConnection(HANDLE hConn);
- ThreadData* MSN_GetThreadByContact(const char* wlid, TInfoType type = SERVER_SWITCHBOARD);
- GCThreadData*MSN_GetThreadByChatId(const wchar_t* chatId);
- ThreadData* MSN_GetP2PThreadByContact(const char *wlid);
- void MSN_StartP2PTransferByContact(const char* wlid);
- ThreadData* MSN_GetThreadByPort(WORD wPort);
- ThreadData* MSN_GetUnconnectedThread(const char* wlid, TInfoType type = SERVER_SWITCHBOARD);
- ThreadData* MSN_GetOtherContactThread(ThreadData* thread);
-
- ThreadData* MSN_StartSB(const char* uid, bool& isOffline);
+ GCThreadData* MSN_GetThreadByChatId(const wchar_t* chatId);
+
void __cdecl ThreadStub(void* arg);
/////////////////////////////////////////////////////////////////////////////////////////
@@ -327,90 +293,12 @@ struct CMsnProto : public PROTO<CMsnProto>
OBJLIST<chunkedmsg> msgCache;
- int addCachedMsg(const char* id, const char* msg, const size_t offset,
- const size_t portion, const size_t totsz, const bool bychunk);
+ int addCachedMsg(const char* id, const char* msg, const size_t offset, const size_t portion, const size_t totsz, const bool bychunk);
size_t getCachedMsgSize(const char* id);
- bool getCachedMsg(const int idx, char*& msg, size_t& size);
- bool getCachedMsg(const char* id, char*& msg, size_t& size);
- void clearCachedMsg(int idx = -1);
- void CachedMsg_Uninit(void);
-
- /////////////////////////////////////////////////////////////////////////////////////////
- // MSN P2P session support
-
-#ifdef OBSOLETE
- void p2p_clearDormantSessions(void);
- void p2p_cancelAllSessions(void);
- void p2p_redirectSessions(const char* wlid);
- void p2p_startSessions(const char* wlid);
- void p2p_clearThreadSessions(MCONTACT hContact, TInfoType mType);
-
- void p2p_invite(unsigned iAppID, filetransfer* ft, const char *wlid);
- void p2p_inviteDc(filetransfer* ft, const char *wlid);
- void p2p_processMsg(ThreadData* info, char* msgbody, const char* wlid);
- void p2p_processMsgV2(ThreadData* info, char* msgbody, const char* wlid);
- void p2p_processSIP(ThreadData* info, char* msgbody, P2PB_Header* hdr, const char* wlid);
-
- void p2p_AcceptTransfer(MimeHeaders& tFileInfo, MimeHeaders& tFileInfo2, const char* wlid);
- void p2p_InitDirectTransfer(MimeHeaders& tFileInfo, MimeHeaders& tFileInfo2, const char* wlid);
- void p2p_InitDirectTransfer2(MimeHeaders& tFileInfo, MimeHeaders& tFileInfo2, const char* wlid);
- void p2p_InitFileTransfer(ThreadData* info, MimeHeaders& tFileInfo, MimeHeaders& tFileInfo2, const char* wlid);
- void p2p_pictureTransferFailed(filetransfer* ft);
- void p2p_savePicture2disk(filetransfer* ft);
-
- bool p2p_createListener(filetransfer* ft, directconnection *dc, MimeHeaders& chdrs);
- void p2p_startConnect(const char* wlid, const char* szCallID, const char* addr, const char* port, bool ipv6);
-
- void p2p_sendAbortSession(filetransfer* ft);
- void p2p_sendAck(const char *wlid, P2PB_Header* hdrdata);
- void p2p_sendAvatarInit(filetransfer* ft);
- void p2p_sendBye(filetransfer* ft);
- void p2p_sendCancel(filetransfer* ft);
- void p2p_sendMsg(const char *wlid, unsigned appId, P2PB_Header& hdrdata, char* msgbody, size_t msgsz);
- void p2p_sendMsg(ThreadData* info, const char *wlid, unsigned appId, P2PB_Header& hdrdata, char* msgbody, size_t msgsz);
- void p2p_sendNoCall(filetransfer* ft);
- void p2p_sendSlp(int iKind, filetransfer *ft, MimeHeaders &pHeaders, MimeHeaders &pContent, const char *wlid = NULL);
- void p2p_sendRedirect(filetransfer* ft);
- void p2p_sendStatus(filetransfer* ft, long lStatus);
-
- void p2p_sendFeedStart(filetransfer* ft);
- LONG p2p_sendPortion(filetransfer* ft, ThreadData* T, bool isV2);
- void p2p_sendRecvFileDirectly(ThreadData* info);
- bool p2p_connectTo(ThreadData* info, directconnection *dc);
- bool p2p_listen(ThreadData* info, directconnection *dc);
-
- void p2p_registerSession(filetransfer* ft);
- void p2p_unregisterSession(filetransfer* ft);
- void p2p_sessionComplete(filetransfer* ft);
-
- void P2pSessions_Uninit(void);
-
- filetransfer* p2p_getAvatarSession(MCONTACT hContact);
- filetransfer* p2p_getThreadSession(MCONTACT hContact, TInfoType mType);
- filetransfer* p2p_getSessionByID(unsigned id);
- filetransfer* p2p_getSessionByUniqueID(unsigned id);
- filetransfer* p2p_getSessionByCallID(const char* CallID, const char* wlid);
-
- bool p2p_sessionRegistered(filetransfer* ft);
- bool p2p_isAvatarOnly(MCONTACT hContact);
- unsigned p2p_getMsgId(const char* wlid, int inc);
- unsigned p2p_getPktNum(const char* wlid);
-
- void p2p_registerDC(directconnection* ft);
- void p2p_unregisterDC(directconnection* dc);
- directconnection* p2p_getDCByCallID(const char* CallID, const char* wlid);
-
- /////////////////////////////////////////////////////////////////////////////////////////
- // MSN MSNFTP file transfer
-
- void msnftp_invite(filetransfer *ft);
- void msnftp_sendAcceptReject(filetransfer *ft, bool acc);
- void msnftp_startFileSend(ThreadData* info, const char* Invcommand, const char* Invcookie);
-
- int MSN_HandleMSNFTP(ThreadData *info, char *cmdString);
-
- void __cdecl msnftp_sendFileThread(void* arg);
-#endif
+ bool getCachedMsg(const int idx, char*& msg, size_t& size);
+ bool getCachedMsg(const char* id, char*& msg, size_t& size);
+ void clearCachedMsg(int idx = -1);
+ void CachedMsg_Uninit(void);
/////////////////////////////////////////////////////////////////////////////////////////
// MSN Chat support
@@ -455,11 +343,10 @@ struct CMsnProto : public PROTO<CMsnProto>
void MSN_CreateContList(void);
void MSN_CleanupLists(void);
- void MSN_FindYahooUser(const char* email);
bool MSN_RefreshContactList(void);
bool MSN_IsMyContact(MCONTACT hContact);
- bool MSN_IsMeByContact(MCONTACT hContact, char* szEmail = NULL);
+ bool MSN_IsMeByContact(MCONTACT hContact, char* szEmail = NULL);
bool MSN_AddUser(MCONTACT hContact, const char* email, int netId, int flags, const char *msg = NULL);
void MSN_AddAuthRequest(const char *email, const char *nick, const char *reason);
void MSN_SetContactDb(MCONTACT hContact, const char *szEmail);
@@ -560,13 +447,13 @@ struct CMsnProto : public PROTO<CMsnProto>
bool MSN_ABAddRemoveContact(const char* szCntId, int netId, bool add, bool allowRecurse = true);
unsigned MSN_ABContactAdd(const char* szEmail, const char* szNick, int netId, const char* szInvite, bool search, bool retry = false, bool allowRecurse = true);
void MSN_ABUpdateDynamicItem(bool allowRecurse = true);
- bool MSN_ABRefreshClist(unsigned int nTry=0);
+ bool MSN_ABRefreshClist(unsigned int nTry = 0);
ezxml_t abSoapHdr(const char* service, const char* scenario, ezxml_t& tbdy, char*& httphdr);
char* GetABHost(const char* service, bool isSharing);
void SetAbParam(MCONTACT hContact, const char *name, const char *par);
void UpdateABHost(const char* service, const char* url);
- void UpdateABCacheKey(ezxml_t bdy, bool isSharing);
+ void UpdateABCacheKey(ezxml_t bdy, bool isSharing);
ezxml_t getSoapResponse(ezxml_t bdy, const char* service);
ezxml_t getSoapFault(ezxml_t bdy, bool err);
diff --git a/protocols/MSN/src/msn_srv.cpp b/protocols/MSN/src/msn_srv.cpp
index 9f26f83ff9..db92c812bb 100644
--- a/protocols/MSN/src/msn_srv.cpp
+++ b/protocols/MSN/src/msn_srv.cpp
@@ -284,20 +284,9 @@ void CMsnProto::MSN_SendNicknameUtf(const char* nickname)
else
delSetting("Nick");
-#ifdef OBSOLETE
- MSN_SetNicknameUtf(nickname[0] ? nickname : MyOptions.szEmail);
-#endif
-
ForkThread(&CMsnProto::msn_storeProfileThread, (void*)1);
}
-#ifdef OBSOLETE
-void CMsnProto::MSN_SetNicknameUtf(const char* nickname)
-{
- msnNsThread->sendPacket("PRP", "MFN %s", ptrA(mir_urlEncode(nickname)));
-}
-#endif
-
/////////////////////////////////////////////////////////////////////////////////////////
// msn_storeAvatarThread - update our own avatar on the server
diff --git a/protocols/MSN/src/msn_svcs.cpp b/protocols/MSN/src/msn_svcs.cpp
index b0be81b0f1..aa745fa24a 100644
--- a/protocols/MSN/src/msn_svcs.cpp
+++ b/protocols/MSN/src/msn_svcs.cpp
@@ -133,19 +133,6 @@ INT_PTR CMsnProto::GetAvatarInfo(WPARAM wParam, LPARAM lParam)
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), L"unk");
- ft->std.tszCurrentFile = mir_wstrdup(filename);
-
- p2p_invite(MSN_APPID_AVATAR, ft, NULL);
- }
-#endif
-
return GAIR_WAITFOR;
}
return GAIR_NOAVATAR;
@@ -251,129 +238,9 @@ INT_PTR CMsnProto::SendNudge(WPARAM hContact, LPARAM)
if (MSN_IsMeByContact(hContact, tEmail)) return 0;
int netId = Lists_GetNetId(tEmail);
-
-#ifdef OBSOLETE
- static const char nudgemsg[] =
- "Content-Type: text/x-msnmsgr-datacast\r\n\r\n"
- "ID: 1\r\n\r\n";
-
- switch (netId) {
- case NETID_UNKNOWN:
- hContact = MSN_GetChatInernalHandle(hContact);
-
- case NETID_MSN:
- case NETID_LCS:
- {
- bool isOffline;
- ThreadData* thread = MSN_StartSB(tEmail, isOffline);
- if (thread == NULL) {
- if (isOffline) return 0;
- MsgQueue_Add(tEmail, 'N', nudgemsg, -1);
- }
- else {
- int tNnetId = netId == NETID_UNKNOWN ? NETID_MSN : netId;
- thread->sendMessage('N', tEmail, tNnetId, nudgemsg, MSG_DISABLE_HDR);
- }
- }
- break;
-
- case NETID_YAHOO:
- msnNsThread->sendMessage('3', tEmail, netId, nudgemsg, MSG_DISABLE_HDR);
- break;
-
- default:
- break;
- }
-#else
msnNsThread->sendMessage('3', tEmail, netId, "", MSG_NUDGE);
-#endif
- return 0;
-}
-
-#ifdef OBSOLETE
-/////////////////////////////////////////////////////////////////////////////////////////
-// GetCurrentMedia - get current media
-
-INT_PTR CMsnProto::GetCurrentMedia(WPARAM, LPARAM lParam)
-{
- LISTENINGTOINFO *cm = (LISTENINGTOINFO *)lParam;
-
- if (cm == NULL || cm->cbSize != sizeof(LISTENINGTOINFO))
- return -1;
-
- cm->ptszArtist = mir_wstrdup(msnCurrentMedia.ptszArtist);
- cm->ptszAlbum = mir_wstrdup(msnCurrentMedia.ptszAlbum);
- cm->ptszTitle = mir_wstrdup(msnCurrentMedia.ptszTitle);
- cm->ptszTrack = mir_wstrdup(msnCurrentMedia.ptszTrack);
- cm->ptszYear = mir_wstrdup(msnCurrentMedia.ptszYear);
- cm->ptszGenre = mir_wstrdup(msnCurrentMedia.ptszGenre);
- cm->ptszLength = mir_wstrdup(msnCurrentMedia.ptszLength);
- cm->ptszPlayer = mir_wstrdup(msnCurrentMedia.ptszPlayer);
- cm->ptszType = mir_wstrdup(msnCurrentMedia.ptszType);
- cm->dwFlags = msnCurrentMedia.dwFlags;
-
- return 0;
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-// SetCurrentMedia - set current media
-
-INT_PTR CMsnProto::SetCurrentMedia(WPARAM, LPARAM lParam)
-{
- // Clear old info
- mir_free(msnCurrentMedia.ptszArtist);
- mir_free(msnCurrentMedia.ptszAlbum);
- mir_free(msnCurrentMedia.ptszTitle);
- mir_free(msnCurrentMedia.ptszTrack);
- mir_free(msnCurrentMedia.ptszYear);
- mir_free(msnCurrentMedia.ptszGenre);
- mir_free(msnCurrentMedia.ptszLength);
- mir_free(msnCurrentMedia.ptszPlayer);
- mir_free(msnCurrentMedia.ptszType);
- memset(&msnCurrentMedia, 0, sizeof(msnCurrentMedia));
-
- // Copy new info
- LISTENINGTOINFO *cm = (LISTENINGTOINFO *)lParam;
- if (cm != NULL && cm->cbSize == sizeof(LISTENINGTOINFO) && (cm->ptszArtist != NULL || cm->ptszTitle != NULL)) {
- bool unicode = (cm->dwFlags & LTI_UNICODE) != 0;
-
- msnCurrentMedia.cbSize = sizeof(msnCurrentMedia); // Marks that there is info set
- msnCurrentMedia.dwFlags = LTI_TCHAR;
-
- overrideStr(msnCurrentMedia.ptszType, cm->ptszType, unicode, L"Music");
- overrideStr(msnCurrentMedia.ptszArtist, cm->ptszArtist, unicode);
- overrideStr(msnCurrentMedia.ptszAlbum, cm->ptszAlbum, unicode);
- overrideStr(msnCurrentMedia.ptszTitle, cm->ptszTitle, unicode, L"No Title");
- overrideStr(msnCurrentMedia.ptszTrack, cm->ptszTrack, unicode);
- overrideStr(msnCurrentMedia.ptszYear, cm->ptszYear, unicode);
- overrideStr(msnCurrentMedia.ptszGenre, cm->ptszGenre, unicode);
- overrideStr(msnCurrentMedia.ptszLength, cm->ptszLength, unicode);
- overrideStr(msnCurrentMedia.ptszPlayer, cm->ptszPlayer, unicode);
- }
-
- // Set user text
- if (msnCurrentMedia.cbSize == 0)
- delSetting("ListeningTo");
- else {
- wchar_t *text;
- if (ServiceExists(MS_LISTENINGTO_GETPARSEDTEXT))
- text = (wchar_t *)CallService(MS_LISTENINGTO_GETPARSEDTEXT, (WPARAM)L"%title% - %artist%", (LPARAM)&msnCurrentMedia);
- else {
- text = (wchar_t *)mir_alloc(128 * sizeof(wchar_t));
- mir_snwprintf(text, 128, L"%s - %s", (msnCurrentMedia.ptszTitle ? msnCurrentMedia.ptszTitle : L""),
- (msnCurrentMedia.ptszArtist ? msnCurrentMedia.ptszArtist : L""));
- }
- setWString("ListeningTo", text);
- mir_free(text);
- }
-
- // Send it
- char** msgptr = GetStatusMsgLoc(m_iDesiredStatus);
- MSN_SendStatusMessage(msgptr ? *msgptr : NULL);
-
return 0;
}
-#endif
/////////////////////////////////////////////////////////////////////////////////////////
// MsnContactDeleted - called when a contact is deleted from list
diff --git a/protocols/MSN/src/msn_switchboard.cpp b/protocols/MSN/src/msn_switchboard.cpp
index f6e6664edd..fec422f88f 100644
--- a/protocols/MSN/src/msn_switchboard.cpp
+++ b/protocols/MSN/src/msn_switchboard.cpp
@@ -22,32 +22,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "stdafx.h"
#include "msn_proto.h"
-#ifdef OBSOLETE
-
-int ThreadData::contactJoined(const char* email)
-{
- for (int i = 0; i < mJoinedContactsWLID.getCount(); i++)
- if (_stricmp(mJoinedContactsWLID[i], email) == 0)
- return mJoinedContactsWLID.getCount();
-
- if (strchr(email, ';'))
- mJoinedIdentContactsWLID.insertn(email);
- else
- mJoinedContactsWLID.insertn(email);
-
- return mJoinedContactsWLID.getCount();
-}
-
-int ThreadData::contactLeft(const char* email)
-{
- if (strchr(email, ';'))
- mJoinedIdentContactsWLID.remove(email);
- else
- mJoinedContactsWLID.remove(email);
-
- return mJoinedContactsWLID.getCount();
-}
-#endif
MCONTACT ThreadData::getContactHandle(void)
{
diff --git a/protocols/MSN/src/msn_threads.cpp b/protocols/MSN/src/msn_threads.cpp
index a7a65ec54e..27a6a4d64a 100644
--- a/protocols/MSN/src/msn_threads.cpp
+++ b/protocols/MSN/src/msn_threads.cpp
@@ -42,23 +42,28 @@ void __cdecl CMsnProto::msn_keepAliveThread(void*)
msnPingTimeout = 45;
else {
msnPingTimeout = 20;
- keepFlag = keepFlag && (lastMsgId?msnNsThread->sendPacketPayload("PNG", "CON", "\bLast-Msg-Id: %I64u\r\n\r\n", lastMsgId):
- (msnRegistration?msnNsThread->sendPacketPayload("PNG", "CON", "\b\r\n"):
- msnNsThread->sendPacket("PNG", "CON 0")));
+
+ if (msnNsThread) {
+ if (lastMsgId)
+ keepFlag = msnNsThread->sendPacketPayload("PNG", "CON", "\bLast-Msg-Id: %I64u\r\n\r\n", lastMsgId);
+ else if (msnRegistration)
+ keepFlag = msnNsThread->sendPacketPayload("PNG", "CON", "\b\r\n");
+ else
+ keepFlag = msnNsThread->sendPacket("PNG", "CON 0");
+ }
}
-#ifdef OBSOLETE
- p2p_clearDormantSessions();
-#endif
+
if (hHttpsConnection && (clock() - mHttpsTS) > 60 * CLOCKS_PER_SEC) {
HNETLIBCONN hConn = hHttpsConnection;
hHttpsConnection = NULL;
Netlib_Shutdown(hConn);
}
+
if (mStatusMsgTS && (clock() - mStatusMsgTS) > 60 * CLOCKS_PER_SEC) {
mStatusMsgTS = 0;
ForkThread(&CMsnProto::msn_storeProfileThread, NULL);
}
- if (MyOptions.netId!=NETID_SKYPE && MSN_RefreshOAuthTokens(true))
+ if (keepFlag && MyOptions.netId != NETID_SKYPE && MSN_RefreshOAuthTokens(true))
ForkThread(&CMsnProto::msn_refreshOAuthThread, msnNsThread);
break;
@@ -94,13 +99,13 @@ void __cdecl CMsnProto::msn_refreshOAuthThread(void *param)
static bool ReallocInfoBuffer(ThreadData *info, size_t mDataSize)
{
- char *mData = (char*)mir_realloc(info->mData, mDataSize+1);
+ char *mData = (char*)mir_realloc(info->mData, mDataSize + 1);
if (mData == NULL)
return false;
info->mData = mData;
info->mDataSize = mDataSize;
- ZeroMemory(&mData[info->mBytesInData], info->mDataSize-info->mBytesInData+1);
+ ZeroMemory(&mData[info->mBytesInData], info->mDataSize - info->mBytesInData + 1);
return true;
}
@@ -168,10 +173,6 @@ void __cdecl CMsnProto::MSNServerThread(void* arg)
case SERVER_NOTIFICATION:
goto LBL_Exit;
break;
-
- case SERVER_SWITCHBOARD:
- if (info->mCaller) msnNsThread->sendPacket("XFR", "SB");
- break;
}
return;
}
@@ -181,19 +182,12 @@ void __cdecl CMsnProto::MSNServerThread(void* arg)
debugLogA("Connected with handle=%08X", info->s);
- if (info->mType == SERVER_NOTIFICATION)
+ if (info->mType == SERVER_NOTIFICATION)
info->sendPacketPayload("CNT", "CON", "<connect>%s%s%s<ver>2</ver><agent><os>winnt</os><osVer>5.2</osVer><proc>x86</proc><lcid>en-us</lcid></agent></connect>\r\n",
- *info->mState?"<xfr><state>":"", *info->mState?info->mState:"", *info->mState?"</state></xfr>":"");
- else if (info->mType == SERVER_SWITCHBOARD) {
- info->sendPacket(info->mCaller ? "USR" : "ANS", "%s;%s %s", MyOptions.szEmail, MyOptions.szMachineGuid, info->mCookie);
- }
- else if (info->mType == SERVER_FILETRANS && info->mCaller == 0) {
- info->send("VER MSNFTP\r\n", 12);
- }
+ *info->mState ? "<xfr><state>" : "", *info->mState ? info->mState : "", *info->mState ? "</state></xfr>" : "");
- if (info->mIsMainThread) {
+ if (info->mIsMainThread)
msnNsThread = info;
- }
debugLogA("Entering main recv loop");
info->mBytesInData = 0;
@@ -211,62 +205,46 @@ void __cdecl CMsnProto::MSNServerThread(void* arg)
info->mBytesInData += recvResult;
-#ifdef OBSOLETE
- if (info->mCaller == 1 && info->mType == SERVER_FILETRANS) {
- if (MSN_HandleMSNFTP(info, info->mData))
+ for (;;) {
+ char* peol = strchr(info->mData, '\r');
+ if (peol == NULL)
break;
- }
- else
-#endif
- {
- for (;;) {
- char* peol = strchr(info->mData, '\r');
- if (peol == NULL)
- break;
-
- int msgLen = (int)(peol - info->mData);
- if (info->mBytesInData < msgLen + 2)
- break; //wait for full line end
-
- char msg[1024];
- strncpy_s(msg, info->mData, msgLen);
-
- if (*++peol != '\n')
- debugLogA("Dodgy line ending to command: ignoring");
- else
- peol++;
-
- info->mBytesInData -= peol - info->mData;
- memmove(info->mData, peol, info->mBytesInData);
- debugLogA("RECV: %s", msg);
-
- if (!isalnum(msg[0]) || !isalnum(msg[1]) || !isalnum(msg[2]) || (msg[3] && msg[3] != ' ')) {
- debugLogA("Invalid command name");
- continue;
- }
- if (info->mType != SERVER_FILETRANS) {
- int handlerResult;
- if (isdigit(msg[0]) && isdigit(msg[1]) && isdigit(msg[2])) //all error messages
- handlerResult = MSN_HandleErrors(info, msg);
- else
- handlerResult = MSN_HandleCommands(info, msg);
+ int msgLen = (int)(peol - info->mData);
+ if (info->mBytesInData < msgLen + 2)
+ break; //wait for full line end
- if (handlerResult) {
- if (info->sessionClosed) goto LBL_Exit;
- info->sendTerminate();
- }
- }
-#ifdef OBSOLETE
- else
- if (MSN_HandleMSNFTP(info, msg))
- goto LBL_Exit;
-#endif
+ char msg[1024];
+ strncpy_s(msg, info->mData, msgLen);
+
+ if (*++peol != '\n')
+ debugLogA("Dodgy line ending to command: ignoring");
+ else
+ peol++;
+
+ info->mBytesInData -= peol - info->mData;
+ memmove(info->mData, peol, info->mBytesInData);
+ debugLogA("RECV: %s", msg);
+
+ if (!isalnum(msg[0]) || !isalnum(msg[1]) || !isalnum(msg[2]) || (msg[3] && msg[3] != ' ')) {
+ debugLogA("Invalid command name");
+ continue;
+ }
+
+ int handlerResult;
+ if (isdigit(msg[0]) && isdigit(msg[1]) && isdigit(msg[2])) //all error messages
+ handlerResult = MSN_HandleErrors(info, msg);
+ else
+ handlerResult = MSN_HandleCommands(info, msg);
+
+ if (handlerResult) {
+ if (info->sessionClosed) goto LBL_Exit;
+ info->sendTerminate();
}
}
if (info->mBytesInData == info->mDataSize) {
- if (!ReallocInfoBuffer(info, info->mDataSize*2)) {
+ if (!ReallocInfoBuffer(info, info->mDataSize * 2)) {
debugLogA("sizeof(data) is too small: the longest line won't fit");
break;
}
@@ -294,12 +272,8 @@ LBL_Exit:
if (info->s == NULL)
ProtoBroadcastAck(NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_NONETWORK);
- else {
-#ifdef OBSOLETE
- p2p_cancelAllSessions();
-#endif
+ else
MSN_CloseConnections();
- }
if (hHttpsConnection) {
Netlib_CloseHandle(hHttpsConnection);
@@ -325,7 +299,6 @@ void CMsnProto::MSN_CloseConnections(void)
switch (T.mType) {
case SERVER_NOTIFICATION:
- case SERVER_SWITCHBOARD:
if (T.s != NULL && !T.sessionClosed && !T.termPending) {
nls.hReadConns[0] = T.s;
int res = Netlib_SelectEx(&nls);
@@ -333,10 +306,6 @@ void CMsnProto::MSN_CloseConnections(void)
T.sendTerminate();
}
break;
-
- case SERVER_P2P_DIRECT:
- Netlib_Shutdown(T.s);
- break;
}
}
@@ -352,36 +321,6 @@ void CMsnProto::Threads_Uninit(void)
m_arThreads.destroy();
}
-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;
-}
-
GCThreadData* CMsnProto::MSN_GetThreadByChatId(const wchar_t* chatId)
{
if (mir_wstrlen(chatId) == 0)
@@ -397,122 +336,6 @@ GCThreadData* CMsnProto::MSN_GetThreadByChatId(const wchar_t* chatId)
return NULL;
}
-#ifdef OBSOLETE
-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;
-}
-
-
-void CMsnProto::MSN_StartP2PTransferByContact(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_FILETRANS && T.hWaitEvent != INVALID_HANDLE_VALUE) {
- if ((T.mInitialContactWLID && !_stricmp(T.mInitialContactWLID, wlid)) ||
- (T.mJoinedContactsWLID.getCount() && !_stricmp(T.mJoinedContactsWLID[0], wlid)) ||
- (T.mJoinedIdentContactsWLID.getCount() && !_stricmp(T.mJoinedIdentContactsWLID[0], wlid)))
- ReleaseSemaphore(T.hWaitEvent, 1, NULL);
- }
- }
-}
-
-ThreadData* CMsnProto::MSN_GetOtherContactThread(ThreadData* thread)
-{
- mir_cslock lck(m_csThreads);
-
- for (int i = 0; i < m_arThreads.getCount(); i++) {
- ThreadData &T = m_arThreads[i];
- if (T.mJoinedContactsWLID.getCount() == 0 || T.s == NULL)
- continue;
-
- if (&T != thread && _stricmp(T.mJoinedContactsWLID[0], thread->mJoinedContactsWLID[0]) == 0)
- return &T;
- }
-
- return NULL;
-}
-
-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;
-}
-
-
-ThreadData* CMsnProto::MSN_StartSB(const char* wlid, bool& isOffline)
-{
- isOffline = false;
- ThreadData *thread = MSN_GetThreadByContact(wlid);
- if (thread == NULL) {
- MCONTACT hContact = MSN_HContactFromEmail(wlid);
- WORD wStatus = getWord(hContact, "Status", ID_STATUS_OFFLINE);
- if (wStatus != ID_STATUS_OFFLINE) {
- if (MSN_GetUnconnectedThread(wlid) == NULL && MsgQueue_CheckContact(wlid, 5) == NULL)
- msnNsThread->sendPacket("XFR", "SB");
- }
- else isOffline = true;
- }
- return thread;
-}
-
-
-int CMsnProto::MSN_GetActiveThreads(ThreadData** parResult)
-{
- int tCount = 0;
- mir_cslock lck(m_csThreads);
-
- for (int i = 0; i < m_arThreads.getCount(); i++) {
- ThreadData &T = m_arThreads[i];
- if (T.mType == SERVER_SWITCHBOARD && T.mJoinedContactsWLID.getCount() != 0 && T.mJoinedContactsWLID.getCount())
- parResult[tCount++] = &T;
- }
-
- return tCount;
-}
-#endif
-
ThreadData* CMsnProto::MSN_GetThreadByConnection(HANDLE s)
{
mir_cslock lck(m_csThreads);
@@ -526,21 +349,6 @@ ThreadData* CMsnProto::MSN_GetThreadByConnection(HANDLE s)
return NULL;
}
-#ifdef OBSOLETE
-ThreadData* CMsnProto::MSN_GetThreadByPort(WORD wPort)
-{
- mir_cslock lck(m_csThreads);
-
- for (int i = 0; i < m_arThreads.getCount(); i++) {
- ThreadData &T = m_arThreads[i];
- if (T.mIncomingPort == wPort)
- return &T;
- }
-
- return NULL;
-}
-#endif
-
/////////////////////////////////////////////////////////////////////////////////////////
// class ThreadData members
@@ -550,7 +358,7 @@ ThreadData::ThreadData()
mGatewayTimeout = 2;
resetTimeout();
hWaitEvent = CreateSemaphore(NULL, 0, MSN_PACKETS_COMBINE, NULL);
- mData = (char*)mir_calloc((mDataSize=8192)+1);
+ mData = (char*)mir_calloc((mDataSize = 8192) + 1);
}
ThreadData::~ThreadData()
@@ -575,36 +383,10 @@ ThreadData::~ThreadData()
if (mTimerId != 0)
KillTimer(NULL, mTimerId);
-#ifdef OBSOLETE
- if (mType == SERVER_SWITCHBOARD) {
- for (int i = 0; i < mJoinedContactsWLID.getCount(); ++i) {
- const char* wlid = mJoinedContactsWLID[i];
- MCONTACT hContact = proto->MSN_HContactFromEmail(wlid);
- int temp_status = proto->getWord(hContact, "Status", ID_STATUS_OFFLINE);
- if (temp_status == ID_STATUS_INVISIBLE && proto->MSN_GetThreadByContact(wlid) == NULL)
- proto->setWord(hContact, "Status", ID_STATUS_OFFLINE);
- }
- }
-#endif
-
mJoinedContactsWLID.destroy();
mJoinedIdentContactsWLID.destroy();
mir_free(mInitialContactWLID); mInitialContactWLID = NULL;
-
-#ifdef OBSOLETE
- const char* wlid = NEWSTR_ALLOCA(mInitialContactWLID);
-
- if (proto && mType == SERVER_P2P_DIRECT)
- proto->p2p_clearDormantSessions();
-
- if (wlid != NULL && mType == SERVER_SWITCHBOARD &&
- proto->MSN_GetThreadByContact(wlid) == NULL &&
- proto->MSN_GetUnconnectedThread(wlid) == NULL) {
- proto->MsgQueue_Clear(wlid, true);
- }
-#endif
-
mir_free(mData);
}
@@ -727,7 +509,7 @@ BYTE* HReadBuffer::surelyRead(size_t parBytes)
if (parBytes > owner->mDataSize) {
size_t mDataSize = owner->mDataSize;
- while (parBytes > mDataSize) mDataSize*=2;
+ while (parBytes > mDataSize) mDataSize *= 2;
if (!ReallocInfoBuffer(owner, mDataSize)) {
owner->proto->debugLogA("HReadBuffer::surelyRead: not enough memory, %d %d %d", parBytes, owner->mDataSize, startOffset);
return NULL;
@@ -736,7 +518,7 @@ BYTE* HReadBuffer::surelyRead(size_t parBytes)
}
}
- while ((startOffset + parBytes) > totalDataSize) {
+ while ((startOffset + parBytes) > totalDataSize) {
int recvResult = owner->recv((char*)buffer + totalDataSize, owner->mDataSize - totalDataSize);
if (recvResult <= 0)
@@ -754,7 +536,7 @@ BYTE* HReadBuffer::surelyRead(size_t parBytes)
// class GCThreadData members
GCThreadData::GCThreadData() :
-mJoinedContacts(10, PtrKeySortT)
+ mJoinedContacts(10, PtrKeySortT)
{
memset(&mCreator, 0, sizeof(GCThreadData) - sizeof(mJoinedContacts));
}
@@ -762,4 +544,3 @@ mJoinedContacts(10, PtrKeySortT)
GCThreadData::~GCThreadData()
{
}
-
diff --git a/protocols/MSN/src/msn_ws.cpp b/protocols/MSN/src/msn_ws.cpp
index c82c660e8f..87920c1723 100644
--- a/protocols/MSN/src/msn_ws.cpp
+++ b/protocols/MSN/src/msn_ws.cpp
@@ -29,7 +29,7 @@ int ThreadData::send(const char data[], size_t datalen)
{
resetTimeout();
- if (proto->usingGateway && !(mType == SERVER_FILETRANS || mType == SERVER_P2P_DIRECT)) {
+ if (proto->usingGateway) {
mGatewayTimeout = 2;
Netlib_SetPollingTimeout(s, mGatewayTimeout);
}
@@ -52,59 +52,21 @@ void ThreadData::resetTimeout(bool term)
bool ThreadData::isTimeout(void)
{
- bool res = false;
+ if (mWaitPeriod >= clock())
+ return false;
- if (mWaitPeriod >= clock()) return false;
-
- if (mIsMainThread) {
+ bool res = false;
+ if (mIsMainThread)
res = !proto->usingGateway;
- }
- else if (mJoinedContactsWLID.getCount() <= 1 || mChatID[0] == 0) {
-#ifdef OBSOLETE
- MCONTACT hContact = getContactHandle();
-#endif
- if (mJoinedContactsWLID.getCount() == 0 || termPending)
- res = true;
-#ifdef OBSOLETE
- else if (proto->p2p_getThreadSession(hContact, mType) != NULL)
- res = false;
- else if (mType == SERVER_SWITCHBOARD) {
- res = MSN_MsgWndExist(hContact);
- if (res) {
- WORD status = proto->getWord(hContact, "Status", ID_STATUS_OFFLINE);
- if ((status == ID_STATUS_OFFLINE || status == ID_STATUS_INVISIBLE || proto->m_iStatus == ID_STATUS_INVISIBLE))
- res = false;
- }
- }
-#endif
- else
- res = true;
- }
+ else if (mJoinedContactsWLID.getCount() <= 1 || mChatID[0] == 0)
+ res = true;
if (res) {
- bool sbsess = mType == SERVER_SWITCHBOARD;
-
- proto->debugLogA("Dropping the idle %s due to inactivity", sbsess ? "switchboard" : "p2p");
- if (!sbsess || termPending) return true;
-
-#ifdef OBSOLETE
- if (proto->getByte("EnableSessionPopup", 0)) {
- MCONTACT hContact = NULL;
- if (mJoinedContactsWLID.getCount())
- hContact = proto->MSN_HContactFromEmail(mJoinedContactsWLID[0]);
- else if (mInitialContactWLID)
- hContact = proto->MSN_HContactFromEmail(mInitialContactWLID);
-
- if (hContact)
- proto->MSN_ShowPopup(hContact, TranslateT("Chat session dropped due to inactivity"), 0);
- }
-
- sendTerminate();
- resetTimeout(true);
-#endif
+ proto->debugLogA("Dropping the idle p2p due to inactivity");
+ if (termPending)
+ return true;
}
- else
- resetTimeout();
+ else resetTimeout();
return false;
}
diff --git a/protocols/MSN/src/stdafx.h b/protocols/MSN/src/stdafx.h
index 449d947bb3..37d0bae992 100644
--- a/protocols/MSN/src/stdafx.h
+++ b/protocols/MSN/src/stdafx.h
@@ -180,68 +180,63 @@ const char MSN_DEFAULT_LOGIN_SERVER[] = "s.gateway.messenger.live.com";
const char MSN_DEFAULT_GATEWAY[] = "geo.gateway.messenger.live.com";
const char MSN_USER_AGENT[] = NETLIB_USER_AGENT;
-#define MSN_BLOCK "/BlockCommand"
-#define MSN_INVITE "/InviteCommand"
-#define MSN_NETMEETING "/NetMeeting"
-#define MSN_VIEW_PROFILE "/ViewProfile"
+#define MSN_BLOCK "/BlockCommand"
+#define MSN_INVITE "/InviteCommand"
+#define MSN_VIEW_PROFILE "/ViewProfile"
-#define MS_GOTO_INBOX "/GotoInbox"
-#define MS_EDIT_PROFILE "/EditProfile"
-#define MS_EDIT_ALERTS "/EditAlerts"
-#define MS_SET_NICKNAME_UI "/SetNicknameUI"
-
-extern const char sttVoidUid[];
+#define MS_GOTO_INBOX "/GotoInbox"
+#define MS_EDIT_PROFILE "/EditProfile"
+#define MS_EDIT_ALERTS "/EditAlerts"
+#define MS_SET_NICKNAME_UI "/SetNicknameUI"
/////////////////////////////////////////////////////////////////////////////////////////
// MSN plugin functions
struct CMsnProto;
-#define MSN_ALLOW_MSGBOX 1
-#define MSN_ALLOW_ENTER 2
-#define MSN_HOTMAIL_POPUP 4
-#define MSN_SHOW_ERROR 8
-#define MSN_ALERT_POPUP 16
+#define MSN_ALLOW_MSGBOX 1
+#define MSN_ALLOW_ENTER 2
+#define MSN_HOTMAIL_POPUP 4
+#define MSN_SHOW_ERROR 8
+#define MSN_ALERT_POPUP 16
-void HtmlDecode(char* str);
-char* HtmlEncode(const char* str);
-bool txtParseParam (const char* szData, const char* presearch, const char* start, const char* finish, char* param, const int size);
-void stripBBCode(char* src);
-void stripColorCode(char* src);
-void stripHTML(char* str);
-void parseWLID(char* wlid, char** net, char** email, char** inst);
+void HtmlDecode(char* str);
+char* HtmlEncode(const char* str);
+bool txtParseParam (const char* szData, const char* presearch, const char* start, const char* finish, char* param, const int size);
+void stripBBCode(char* src);
+void stripColorCode(char* src);
+void stripHTML(char* str);
+void parseWLID(char* wlid, char** net, char** email, char** inst);
-char* GetGlobalIp(void);
+char* GetGlobalIp(void);
template <class chartype> void UrlDecode(chartype* str);
-void __cdecl MSN_ConnectionProc(HANDLE hNewConnection, DWORD dwRemoteIP, void*);
-
-char* MSN_GetAvatarHash(char* szContext, char** pszUrl = NULL);
-bool MSN_MsgWndExist(MCONTACT hContact);
+char* MSN_GetAvatarHash(char* szContext, char** pszUrl = NULL);
+bool MSN_MsgWndExist(MCONTACT hContact);
-#define MSN_SendNickname(a) MSN_SendNicknameUtf(UTF8(a))
+#define MSN_SendNickname(a) MSN_SendNicknameUtf(UTF8(a))
-unsigned MSN_GenRandom(void);
+unsigned MSN_GenRandom(void);
-void MSN_InitContactMenu(void);
-void MSN_RemoveContactMenus(void);
+void MSN_InitContactMenu(void);
+void MSN_RemoveContactMenus(void);
-HANDLE GetIconHandle(int iconId);
-HICON LoadIconEx(const char* name, bool big = false);
-void ReleaseIconEx(const char* name, bool big = false);
+HANDLE GetIconHandle(int iconId);
+HICON LoadIconEx(const char* name, bool big = false);
+void ReleaseIconEx(const char* name, bool big = false);
-void MsnInitIcons(void);
+void MsnInitIcons(void);
-int sttDivideWords(char* parBuffer, int parMinItems, char** parDest);
+int sttDivideWords(char* parBuffer, int parMinItems, char** parDest);
void MSN_MakeDigest(const char* chl, char* dgst);
char* getNewUuid(void);
-time_t IsoToUnixTime(const char *stamp);
-time_t MsnTSToUnixtime(const char *pszTS);
+time_t IsoToUnixTime(const char *stamp);
+time_t MsnTSToUnixtime(const char *pszTS);
wchar_t* EscapeChatTags(const wchar_t* pszText);
-void overrideStr(wchar_t*& dest, const wchar_t* src, bool unicode, const wchar_t* def = NULL);
+void overrideStr(wchar_t*& dest, const wchar_t* src, bool unicode, const wchar_t* def = NULL);
char* arrayToHex(BYTE* data, size_t datasz);
@@ -263,14 +258,14 @@ inline unsigned __int64 _htonl64(unsigned __int64 s)
/////////////////////////////////////////////////////////////////////////////////////////
// Popup interface
-typedef struct _tag_PopupData
+struct PopupData
{
unsigned flags;
char* url;
wchar_t* title;
wchar_t* text;
CMsnProto* proto;
-} PopupData;
+};
struct STRLIST : public LIST<char>
{
@@ -368,14 +363,9 @@ struct HReadBuffer
enum TInfoType
{
SERVER_NOTIFICATION,
- SERVER_SWITCHBOARD,
- SERVER_FILETRANS,
- SERVER_P2P_DIRECT,
SERVER_HTTP
};
-
-
struct filetransfer
{
filetransfer(CMsnProto* prt);
@@ -570,13 +560,13 @@ struct ThreadData
TInfoType mType; // thread type
MsnThreadFunc mFunc; // thread entry point
char mServer[80]; // server name
- char mState[128]; // state on XFR
+ char mState[128]; // state on XFR
HNETLIBCONN s; // NetLib connection for the thread
HANDLE mIncomingBoundPort; // Netlib listen for the thread
HANDLE hWaitEvent;
WORD mIncomingPort;
- wchar_t mChatID[10];
+ wchar_t mChatID[10];
bool mIsMainThread;
clock_t mWaitPeriod;
@@ -603,7 +593,7 @@ struct ThreadData
//----| internal data buffer |--------------------------------------------------------
int mBytesInData; // bytes available in data buffer
- char *mData; // data buffer for connection
+ char *mData; // data buffer for connection
size_t mDataSize;
//----| methods |---------------------------------------------------------------------
@@ -619,18 +609,14 @@ struct ThreadData
bool isTimeout(void);
void sendTerminate(void);
- void sendCaps(void);
int sendMessage(int msgType, const char* email, int netId, const char* msg, int parFlags);
int sendRawMessage(int msgType, const char* data, int datLen);
int sendPacket(const char* cmd, const char* fmt, ...);
- int sendPacketPayload(const char* cmd, const char *param, const char* fmt, ...);
+ int sendPacketPayload(const char* cmd, const char *param, const char* fmt, ...);
- int contactJoined(const char* email);
- int contactLeft(const char* email);
MCONTACT getContactHandle(void);
};
-
/////////////////////////////////////////////////////////////////////////////////////////
// MSN P2P session support
@@ -709,12 +695,10 @@ public:
const char *Token();
__forceinline operator char*() const { return m_pszToken; }
void SetToken(const char *pszToken, time_t tExpires);
- //__forceinline const char *RefreshToken() { return m_pszRefreshToken; }
protected:
const char *m_pszTokenName;
char *m_pszToken;
- //char *m_pszRefreshToken;
time_t m_tExpires;
CMsnProto* m_proto;
};
@@ -723,7 +707,7 @@ class OAuthToken : public GenericToken {
public:
OAuthToken(const char *pszTokenName, const char *pszService, bool bPreprendT = false);
- bool Refresh(bool bForce = false);
+ virtual bool Refresh(bool bForce = false) override;
private:
const char *m_pszService;
@@ -733,7 +717,7 @@ private:
class SkypeToken : public GenericToken {
public:
SkypeToken(const char *pszTokenName);
- bool Refresh(bool bForce = false);
+ virtual bool Refresh(bool bForce = false) override;
const char *XSkypetoken();
};
diff --git a/protocols/MSN/src/version.h b/protocols/MSN/src/version.h
index 597dbd6529..c4276023ca 100644
--- a/protocols/MSN/src/version.h
+++ b/protocols/MSN/src/version.h
@@ -19,9 +19,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#define __MAJOR_VERSION 0
-#define __MINOR_VERSION 12
-#define __RELEASE_NUM 1
-#define __BUILD_NUM 5
+#define __MINOR_VERSION 14
+#define __RELEASE_NUM 0
+#define __BUILD_NUM 1
#include <stdver.h>