summaryrefslogtreecommitdiff
path: root/protocols/MRA/MraMPop.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/MRA/MraMPop.cpp')
-rw-r--r--protocols/MRA/MraMPop.cpp308
1 files changed, 124 insertions, 184 deletions
diff --git a/protocols/MRA/MraMPop.cpp b/protocols/MRA/MraMPop.cpp
index ad510184e8..55bc9dda4e 100644
--- a/protocols/MRA/MraMPop.cpp
+++ b/protocols/MRA/MraMPop.cpp
@@ -1,238 +1,178 @@
#include "Mra.h"
#include "MraMPop.h"
-
-
-
// MPOP_SESSION
-typedef struct
+struct MRA_MPOP_SESSION_QUEUE : public FIFO_MT
{
- FIFO_MT ffmtQueueToQuery;
- BOOL bKeyValid;
- LPSTR lpszMPOPKey;
- SIZE_T dwMPOPKeySize;
-} MRA_MPOP_SESSION_QUEUE;
+ BOOL bKeyValid;
+ LPSTR lpszMPOPKey;
+ size_t dwMPOPKeySize;
+};
-
-typedef struct
+struct MRA_MPOP_SESSION_QUEUE_ITEM : public FIFO_MT_ITEM
{
- FIFO_MT_ITEM ffmtiFifoItem;
- LPSTR lpszUrl;
- SIZE_T dwUrlSize;
-} MRA_MPOP_SESSION_QUEUE_ITEM;
-
-
-
-void MraMPopSessionQueueClear (HANDLE hMPopSessionQueue);
-
-
+ LPSTR lpszUrl;
+ size_t dwUrlSize;
+};
+void MraMPopSessionQueueClear(HANDLE hMPopSessionQueue);
DWORD MraMPopSessionQueueInitialize(HANDLE *phMPopSessionQueue)
{
- DWORD dwRetErrorCode;
+ if (!phMPopSessionQueue)
+ return ERROR_ALREADY_INITIALIZED;
- if (phMPopSessionQueue)
- {
- MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue;
-
- pmpsqMPopSessionQueue=(MRA_MPOP_SESSION_QUEUE*)MEMALLOC(sizeof(MRA_MPOP_SESSION_QUEUE));
- if (pmpsqMPopSessionQueue)
- {
- pmpsqMPopSessionQueue->bKeyValid=FALSE;
- pmpsqMPopSessionQueue->lpszMPOPKey=NULL;
- pmpsqMPopSessionQueue->dwMPOPKeySize=0;
- FifoMTInitialize(&pmpsqMPopSessionQueue->ffmtQueueToQuery,0);
-
- (*phMPopSessionQueue)=(HANDLE)pmpsqMPopSessionQueue;
- dwRetErrorCode=NO_ERROR;
- }else{
- dwRetErrorCode=GetLastError();
- }
- }else{
- dwRetErrorCode=ERROR_ALREADY_INITIALIZED;
- }
-return(dwRetErrorCode);
+ MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue = (MRA_MPOP_SESSION_QUEUE*)mir_calloc(sizeof(MRA_MPOP_SESSION_QUEUE));
+ if (!pmpsqMPopSessionQueue)
+ return GetLastError();
+
+ pmpsqMPopSessionQueue->bKeyValid = FALSE;
+ pmpsqMPopSessionQueue->lpszMPOPKey = NULL;
+ pmpsqMPopSessionQueue->dwMPOPKeySize = 0;
+ FifoMTInitialize(pmpsqMPopSessionQueue, 0);
+ *phMPopSessionQueue = (HANDLE)pmpsqMPopSessionQueue;
+ return NO_ERROR;
}
-
void MraMPopSessionQueueClear(HANDLE hMPopSessionQueue)
{
- if (hMPopSessionQueue)
- {
- MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue=(MRA_MPOP_SESSION_QUEUE*)hMPopSessionQueue;
- MRA_MPOP_SESSION_QUEUE_ITEM *pmpsqi;
+ if (hMPopSessionQueue) {
+ MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue = (MRA_MPOP_SESSION_QUEUE*)hMPopSessionQueue;
+ pmpsqMPopSessionQueue->bKeyValid = FALSE;
+ mir_free(pmpsqMPopSessionQueue->lpszMPOPKey);
+ pmpsqMPopSessionQueue->dwMPOPKeySize = 0;
- pmpsqMPopSessionQueue->bKeyValid=FALSE;
- MEMFREE(pmpsqMPopSessionQueue->lpszMPOPKey);
- pmpsqMPopSessionQueue->dwMPOPKeySize=0;
- while(FifoMTItemPop(&pmpsqMPopSessionQueue->ffmtQueueToQuery,NULL,(LPVOID*)&pmpsqi)==NO_ERROR) MEMFREE(pmpsqi);
+ MRA_MPOP_SESSION_QUEUE_ITEM *pmpsqi;
+ while( !FifoMTItemPop(pmpsqMPopSessionQueue, NULL, (LPVOID*)&pmpsqi))
+ mir_free(pmpsqi);
}
}
-
-void MraMPopSessionQueueFlush(HANDLE hMPopSessionQueue)
+void CMraProto::MraMPopSessionQueueFlush(HANDLE hMPopSessionQueue)
{
- if (hMPopSessionQueue)
- {
- MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue=(MRA_MPOP_SESSION_QUEUE*)hMPopSessionQueue;
-
- while(FifoMTGetCount(&pmpsqMPopSessionQueue->ffmtQueueToQuery))
- {
- MraMPopSessionQueueSetNewMPopKey(hMPopSessionQueue,NULL,0);
+ if (hMPopSessionQueue) {
+ MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue = (MRA_MPOP_SESSION_QUEUE*)hMPopSessionQueue;
+ while( FifoMTGetCount(pmpsqMPopSessionQueue)) {
+ MraMPopSessionQueueSetNewMPopKey(hMPopSessionQueue, NULL, 0);
MraMPopSessionQueueStart(hMPopSessionQueue);
}
}
}
-
void MraMPopSessionQueueDestroy(HANDLE hMPopSessionQueue)
{
- if (hMPopSessionQueue)
- {
- MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue=(MRA_MPOP_SESSION_QUEUE*)hMPopSessionQueue;
+ if (hMPopSessionQueue) {
+ MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue = (MRA_MPOP_SESSION_QUEUE*)hMPopSessionQueue;
MraMPopSessionQueueClear(hMPopSessionQueue);
- FifoMTDestroy(&pmpsqMPopSessionQueue->ffmtQueueToQuery);
- MEMFREE(pmpsqMPopSessionQueue);
+ FifoMTDestroy(pmpsqMPopSessionQueue);
+ mir_free(pmpsqMPopSessionQueue);
}
}
-
-DWORD MraMPopSessionQueueAddUrl(HANDLE hMPopSessionQueue,LPSTR lpszUrl,SIZE_T dwUrlSize)
+DWORD CMraProto::MraMPopSessionQueueAddUrl(HANDLE hMPopSessionQueue, LPSTR lpszUrl, size_t dwUrlSize)
{
- DWORD dwRetErrorCode;
+ if (!hMPopSessionQueue || !lpszUrl || !dwUrlSize)
+ return ERROR_INVALID_HANDLE;
+
+ MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue = (MRA_MPOP_SESSION_QUEUE*)hMPopSessionQueue;
+ MRA_MPOP_SESSION_QUEUE_ITEM *pmpsqi = (MRA_MPOP_SESSION_QUEUE_ITEM*)mir_calloc((sizeof(MRA_MPOP_SESSION_QUEUE_ITEM)+dwUrlSize+sizeof(size_t)));
+ if (!pmpsqi)
+ return GetLastError();
+
+ pmpsqi->dwUrlSize = dwUrlSize;
+ pmpsqi->lpszUrl = (LPSTR)(pmpsqi+1);
+ memmove(pmpsqi->lpszUrl, lpszUrl, dwUrlSize);
+ FifoMTItemPush(pmpsqMPopSessionQueue, pmpsqi, (LPVOID)pmpsqi);
+ if (pmpsqMPopSessionQueue->bKeyValid)
+ return MraMPopSessionQueueStart(hMPopSessionQueue);
+
+ if (m_bLoggedIn)
+ MraSendCMD(MRIM_CS_GET_MPOP_SESSION, NULL, 0);
+ else
+ MraMPopSessionQueueFlush(hMPopSessionQueue);
+
+ return NO_ERROR;
+}
- if (hMPopSessionQueue && lpszUrl && dwUrlSize)
- {
- MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue=(MRA_MPOP_SESSION_QUEUE*)hMPopSessionQueue;
- MRA_MPOP_SESSION_QUEUE_ITEM *pmpsqi=(MRA_MPOP_SESSION_QUEUE_ITEM*)MEMALLOC((sizeof(MRA_MPOP_SESSION_QUEUE_ITEM)+dwUrlSize+sizeof(SIZE_T)));
-
- if (pmpsqi)
- {
- pmpsqi->dwUrlSize=dwUrlSize;
- pmpsqi->lpszUrl=(LPSTR)(pmpsqi+1);
- memmove(pmpsqi->lpszUrl,lpszUrl,dwUrlSize);
- FifoMTItemPush(&pmpsqMPopSessionQueue->ffmtQueueToQuery,&pmpsqi->ffmtiFifoItem,(LPVOID)pmpsqi);
- if (pmpsqMPopSessionQueue->bKeyValid)
- {
- dwRetErrorCode=MraMPopSessionQueueStart(hMPopSessionQueue);
- }else{
- if (masMraSettings.bLoggedIn)
- {
- MraSendCMD(MRIM_CS_GET_MPOP_SESSION,NULL,0);
- }else{
- MraMPopSessionQueueFlush(hMPopSessionQueue);
- }
- dwRetErrorCode=NO_ERROR;
- }
- }else{
- dwRetErrorCode=GetLastError();
- }
- }else{
- dwRetErrorCode=ERROR_INVALID_HANDLE;
+DWORD CMraProto::MraMPopSessionQueueAddUrlAndEMail(HANDLE hMPopSessionQueue, LPSTR lpszUrl, size_t dwUrlSize, LPSTR lpszEMail, size_t dwEMailSize)
+{
+ if (!hMPopSessionQueue || !lpszUrl || !dwUrlSize || !lpszEMail || !dwEMailSize)
+ return ERROR_INVALID_HANDLE;
+
+ char szUrl[BUFF_SIZE_URL], szEMail[MAX_EMAIL_LEN];
+ LPSTR lpszUser, lpszDomain;
+
+ BuffToLowerCase(szEMail, lpszEMail, dwEMailSize);
+ lpszDomain = (LPSTR)MemoryFindByte(0, szEMail, dwEMailSize, '@');
+ if (lpszDomain)
+ if (lpszUser = (LPSTR)MemoryFindByte((lpszDomain-szEMail), szEMail, dwEMailSize, '.')) {
+ *lpszUser = 0;
+ lpszUser = szEMail;
+ *lpszDomain = 0;
+ lpszDomain++;
+
+ dwUrlSize = mir_snprintf(szUrl, SIZEOF(szUrl), "%s/%s/%s", lpszUrl, lpszDomain, lpszUser);
+ return MraMPopSessionQueueAddUrl(hMPopSessionQueue, szUrl, dwUrlSize);
}
-return(dwRetErrorCode);
+ return ERROR_INVALID_DATA;
}
-
-DWORD MraMPopSessionQueueAddUrlAndEMail(HANDLE hMPopSessionQueue,LPSTR lpszUrl,SIZE_T dwUrlSize,LPSTR lpszEMail,SIZE_T dwEMailSize)
+DWORD CMraProto::MraMPopSessionQueueStart(HANDLE hMPopSessionQueue)
{
DWORD dwRetErrorCode;
- if (hMPopSessionQueue && lpszUrl && dwUrlSize && lpszEMail && dwEMailSize)
- {
- char szUrl[BUFF_SIZE_URL],szEMail[MAX_EMAIL_LEN];
- LPSTR lpszUser,lpszDomain;
-
- dwRetErrorCode=ERROR_INVALID_DATA;
- BuffToLowerCase(szEMail,lpszEMail,dwEMailSize);
- lpszDomain=(LPSTR)MemoryFindByte(0,szEMail,dwEMailSize,'@');
- if (lpszDomain)
- if (lpszUser=(LPSTR)MemoryFindByte((lpszDomain-szEMail),szEMail,dwEMailSize,'.'))
- {
- (*lpszUser)=0;
- lpszUser=szEMail;
- (*lpszDomain)=0;
- lpszDomain++;
-
- dwUrlSize=mir_snprintf(szUrl,SIZEOF(szUrl),"%s/%s/%s",lpszUrl,lpszDomain,lpszUser);
- dwRetErrorCode=MraMPopSessionQueueAddUrl(hMPopSessionQueue,szUrl,dwUrlSize);
+ if (!hMPopSessionQueue)
+ return ERROR_INVALID_HANDLE;
+
+ MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue = (MRA_MPOP_SESSION_QUEUE*)hMPopSessionQueue;
+ MRA_MPOP_SESSION_QUEUE_ITEM *pmpsqi;
+
+ dwRetErrorCode = NO_ERROR;
+ if (pmpsqMPopSessionQueue->bKeyValid == TRUE)
+ if ( FifoMTItemPop(pmpsqMPopSessionQueue, NULL, (LPVOID*)&pmpsqi) == NO_ERROR) {
+ char szUrl[BUFF_SIZE_URL], szEMail[MAX_EMAIL_LEN];
+ size_t dwUrlSize, dwEMailSize;
+
+ if (mraGetStaticStringA(NULL, "e-mail", szEMail, SIZEOF(szEMail), &dwEMailSize)) {
+ pmpsqMPopSessionQueue->bKeyValid = FALSE;
+ BuffToLowerCase(szEMail, szEMail, dwEMailSize);
+ dwUrlSize = mir_snprintf(szUrl, SIZEOF(szUrl), MRA_MPOP_AUTH_URL, szEMail, pmpsqMPopSessionQueue->lpszMPOPKey, pmpsqi->lpszUrl);
+
+ CallService(MS_UTILS_OPENURL, TRUE, (LPARAM)szUrl);
+ DebugPrint(L"Opening URL: ");DebugPrintCRLFA(szUrl);
}
- }else{
- dwRetErrorCode=ERROR_INVALID_HANDLE;
+ mir_free(pmpsqi);
}
-return(dwRetErrorCode);
+ return NO_ERROR;
}
-DWORD MraMPopSessionQueueStart(HANDLE hMPopSessionQueue)
+DWORD MraMPopSessionQueueSetNewMPopKey(HANDLE hMPopSessionQueue, LPSTR lpszKey, size_t dwKeySize)
{
- DWORD dwRetErrorCode;
+ if (!hMPopSessionQueue)
+ return ERROR_INVALID_HANDLE;
- if (hMPopSessionQueue)
- {
- MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue=(MRA_MPOP_SESSION_QUEUE*)hMPopSessionQueue;
- MRA_MPOP_SESSION_QUEUE_ITEM *pmpsqi;
+ if (lpszKey == NULL) dwKeySize = 0;
- dwRetErrorCode=NO_ERROR;
- if (pmpsqMPopSessionQueue->bKeyValid==TRUE)
- if (FifoMTItemPop(&pmpsqMPopSessionQueue->ffmtQueueToQuery,NULL,(LPVOID*)&pmpsqi)==NO_ERROR)
- {
- char szUrl[BUFF_SIZE_URL],szEMail[MAX_EMAIL_LEN];
- SIZE_T dwUrlSize,dwEMailSize;
-
- if (DB_Mra_GetStaticStringA(NULL,"e-mail",szEMail,SIZEOF(szEMail),&dwEMailSize))
- {
- pmpsqMPopSessionQueue->bKeyValid=FALSE;
- BuffToLowerCase(szEMail,szEMail,dwEMailSize);
- dwUrlSize=mir_snprintf(szUrl,SIZEOF(szUrl),MRA_MPOP_AUTH_URL,szEMail,pmpsqMPopSessionQueue->lpszMPOPKey,pmpsqi->lpszUrl);
-
- CallService(MS_UTILS_OPENURL,TRUE,(LPARAM)szUrl);
- DebugPrint(L"Opening URL: ");DebugPrintCRLFA(szUrl);
- //MraSendCMD(MRIM_CS_GET_MPOP_SESSION,NULL,0);
- }
- MEMFREE(pmpsqi);
- }
- }else{
- dwRetErrorCode=ERROR_INVALID_HANDLE;
+ MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue = (MRA_MPOP_SESSION_QUEUE*)hMPopSessionQueue;
+ if (pmpsqMPopSessionQueue->dwMPOPKeySize<dwKeySize || dwKeySize == 0) {
+ mir_free(pmpsqMPopSessionQueue->lpszMPOPKey);
+ pmpsqMPopSessionQueue->lpszMPOPKey = (LPSTR)mir_calloc(dwKeySize+sizeof(size_t));
}
-return(dwRetErrorCode);
-}
+ if (pmpsqMPopSessionQueue->lpszMPOPKey) {
+ pmpsqMPopSessionQueue->bKeyValid = TRUE;
+ pmpsqMPopSessionQueue->dwMPOPKeySize = dwKeySize;
+ memmove(pmpsqMPopSessionQueue->lpszMPOPKey, lpszKey, dwKeySize);
+ (*(pmpsqMPopSessionQueue->lpszMPOPKey+dwKeySize)) = 0;
-DWORD MraMPopSessionQueueSetNewMPopKey(HANDLE hMPopSessionQueue,LPSTR lpszKey,SIZE_T dwKeySize)
-{
- DWORD dwRetErrorCode;
-
- if (hMPopSessionQueue)
- {
- MRA_MPOP_SESSION_QUEUE *pmpsqMPopSessionQueue=(MRA_MPOP_SESSION_QUEUE*)hMPopSessionQueue;
-
- if (lpszKey==NULL) dwKeySize=0;
- if (pmpsqMPopSessionQueue->dwMPOPKeySize<dwKeySize || dwKeySize==0)
- {
- MEMFREE(pmpsqMPopSessionQueue->lpszMPOPKey);
- pmpsqMPopSessionQueue->lpszMPOPKey=(LPSTR)MEMALLOC(dwKeySize+sizeof(SIZE_T));
- }
-
- if (pmpsqMPopSessionQueue->lpszMPOPKey)
- {
- pmpsqMPopSessionQueue->bKeyValid=TRUE;
- pmpsqMPopSessionQueue->dwMPOPKeySize=dwKeySize;
- memmove(pmpsqMPopSessionQueue->lpszMPOPKey,lpszKey,dwKeySize);
- (*(pmpsqMPopSessionQueue->lpszMPOPKey+dwKeySize))=0;
-
- DebugPrint(L"New MPOP session key: ");DebugPrintCRLFA(pmpsqMPopSessionQueue->lpszMPOPKey);
- dwRetErrorCode=NO_ERROR;
- }else{
- pmpsqMPopSessionQueue->bKeyValid=FALSE;
- pmpsqMPopSessionQueue->lpszMPOPKey=NULL;
- pmpsqMPopSessionQueue->dwMPOPKeySize=0;
- dwRetErrorCode=GetLastError();
- }
- }else{
- dwRetErrorCode=ERROR_INVALID_HANDLE;
+ DebugPrint(L"New MPOP session key: ");DebugPrintCRLFA(pmpsqMPopSessionQueue->lpszMPOPKey);
+ return NO_ERROR;
}
-return(dwRetErrorCode);
+
+ pmpsqMPopSessionQueue->bKeyValid = FALSE;
+ pmpsqMPopSessionQueue->lpszMPOPKey = NULL;
+ pmpsqMPopSessionQueue->dwMPOPKeySize = 0;
+ return GetLastError();
}