From 06eb3e487a3c9ce61407434fc390998573ef3887 Mon Sep 17 00:00:00 2001 From: "bienvenu%nventure.com" Date: Thu, 29 Apr 2004 19:58:24 +0000 Subject: [PATCH] fix occasional problems doing mapireadmail, add pr logging, make mapitest program display errors in hex sr=mscott 108275 --- mailnews/mapi/mapiDll/MapiDll.cpp | 5 +- mailnews/mapi/mapihook/build/msgMapi.idl | 17 ++- mailnews/mapi/mapihook/src/msgMapiHook.cpp | 22 ++-- mailnews/mapi/mapihook/src/msgMapiImp.cpp | 106 +++++++++++------- mailnews/mapi/old/tests/mapitest/mapiproc.cpp | 4 +- 5 files changed, 90 insertions(+), 64 deletions(-) diff --git a/mailnews/mapi/mapiDll/MapiDll.cpp b/mailnews/mapi/mapiDll/MapiDll.cpp index 1e6af3d2e2fb..bfd2dde5c048 100644 --- a/mailnews/mapi/mapiDll/MapiDll.cpp +++ b/mailnews/mapi/mapiDll/MapiDll.cpp @@ -210,7 +210,7 @@ ULONG FAR PASCAL MAPILogoff (LHANDLE aSession, ULONG aUIParam, return SUCCESS_SUCCESS; } -ULONG FAR PASCAL MAPISendMail (LHANDLE lhSession, ULONG ulUIParam, lpnsMapiMessage lpMessage, +ULONG FAR PASCAL MAPISendMail (LHANDLE lhSession, ULONG ulUIParam, nsMapiMessage *lpMessage, FLAGS flFlags, ULONG ulReserved ) { HRESULT hr = 0; @@ -338,8 +338,9 @@ ULONG FAR PASCAL MAPIFindNext(LHANDLE lhSession, ULONG ulUIParam, LPTSTR lpszMes } + ULONG FAR PASCAL MAPIReadMail(LHANDLE lhSession, ULONG ulUIParam, LPTSTR lpszMessageID, - FLAGS flFlags, ULONG ulReserved, lpnsMapiMessage *lppMessage) + FLAGS flFlags, ULONG ulReserved, nsMapiMessage **lppMessage) { nsIMapi *pNsMapi = NULL; diff --git a/mailnews/mapi/mapihook/build/msgMapi.idl b/mailnews/mapi/mapihook/build/msgMapi.idl index 4cd5a596055d..cff424b3ac33 100644 --- a/mailnews/mapi/mapihook/build/msgMapi.idl +++ b/mailnews/mapi/mapihook/build/msgMapi.idl @@ -59,8 +59,8 @@ typedef struct { unsigned long ulReserved; unsigned long ulRecipClass; /* MAPI_TO, MAPI_CC, MAPI_BCC, MAPI_ORIG */ - LPTSTR lpszName; /* Recipient name to display */ - LPTSTR lpszAddress; /* Recipient email address */ + LPSTR lpszName; /* Recipient name to display */ + LPSTR lpszAddress; /* Recipient email address */ unsigned long ulEIDSize_NotUsed; unsigned char * lpEntryID_NotUsed ; } nsMapiRecipDesc, * lpnsMapiRecipDesc; @@ -68,20 +68,19 @@ typedef struct typedef struct { unsigned long ulReserved; - LPTSTR lpszSubject; /* Message Subject */ - LPTSTR lpszNoteText; /* Message Text */ - LPTSTR lpszMessageType_NotUsed; - LPTSTR lpszDateReceived_notUsed; /* in YYYY/MM/DD HH:MM format */ - LPTSTR lpszConversationID_NotUsed; /* conversation thread ID */ + LPSTR lpszSubject; /* Message Subject */ + LPSTR lpszNoteText; /* Message Text */ + LPSTR lpszMessageType; + LPSTR lpszDateReceived; /* in YYYY/MM/DD HH:MM format */ + LPSTR lpszConversationID_NotUsed; /* conversation thread ID */ unsigned long flFlags; /* unread,return receipt */ lpnsMapiRecipDesc lpOriginator; /* Originator descriptor */ unsigned long nRecipCount; /* Number of recipients */ - [size_is (nRecipCount)] lpnsMapiRecipDesc lpRecips;/* Recipient descriptors */ + [size_is (nRecipCount)] lpnsMapiRecipDesc lpRecips;/* Recipient descriptors */ unsigned long nFileCount; /* # of file attachments */ [size_is (nFileCount)] lpnsMapiFileDesc lpFiles; /* Attachment descriptors */ } nsMapiMessage, * lpnsMapiMessage; - [ object, uuid(6EDCD38E-8861-11d5-A3DD-00B0D0F3BAA7), diff --git a/mailnews/mapi/mapihook/src/msgMapiHook.cpp b/mailnews/mapi/mapihook/src/msgMapiHook.cpp index 59cdb70a096f..7b1e92768a1e 100644 --- a/mailnews/mapi/mapihook/src/msgMapiHook.cpp +++ b/mailnews/mapi/mapihook/src/msgMapiHook.cpp @@ -424,8 +424,9 @@ nsresult nsMapiHook::PopulateCompFields(lpnsMapiMessage aMessage, if (aMessage->lpOriginator) { - PRUnichar * From = aMessage->lpOriginator->lpszAddress ; - aCompFields->SetFrom (nsDependentString(From)) ; + char * From = aMessage->lpOriginator->lpszAddress ; + nsAutoString FromStr; FromStr.AssignWithConversion(From); + aCompFields->SetFrom (FromStr) ; } nsAutoString To ; @@ -445,19 +446,19 @@ nsresult nsMapiHook::PopulateCompFields(lpnsMapiMessage aMessage, case MAPI_TO : if (!To.IsEmpty()) To += Comma ; - To += (PRUnichar *) aMessage->lpRecips[i].lpszAddress ; + To.AppendWithConversion(aMessage->lpRecips[i].lpszAddress) ; break ; case MAPI_CC : if (!Cc.IsEmpty()) Cc += Comma ; - Cc += (PRUnichar *) aMessage->lpRecips[i].lpszAddress ; + Cc.AppendWithConversion(aMessage->lpRecips[i].lpszAddress) ; break ; case MAPI_BCC : if (!Bcc.IsEmpty()) Bcc += Comma ; - Bcc += (PRUnichar *) aMessage->lpRecips[i].lpszAddress ; + Bcc.AppendWithConversion(aMessage->lpRecips[i].lpszAddress) ; break ; } } @@ -472,8 +473,10 @@ nsresult nsMapiHook::PopulateCompFields(lpnsMapiMessage aMessage, // set subject if (aMessage->lpszSubject) { - PRUnichar * Subject = aMessage->lpszSubject ; - aCompFields->SetSubject(nsDependentString(Subject)) ; + nsAutoString Subject; + + Subject.AssignWithConversion(aMessage->lpszSubject); + aCompFields->SetSubject(Subject) ; } // handle attachments as File URL @@ -483,8 +486,9 @@ nsresult nsMapiHook::PopulateCompFields(lpnsMapiMessage aMessage, // set body if (aMessage->lpszNoteText) { - PRUnichar * Body = aMessage->lpszNoteText ; - rv = aCompFields->SetBody(nsDependentString(Body)) ; + nsString Body; + Body.AssignWithConversion(aMessage->lpszNoteText); + rv = aCompFields->SetBody(Body) ; } #ifdef RAJIV_DEBUG diff --git a/mailnews/mapi/mapihook/src/msgMapiImp.cpp b/mailnews/mapi/mapihook/src/msgMapiImp.cpp index a7238e8fd1ea..cac6fa16ee35 100644 --- a/mailnews/mapi/mapihook/src/msgMapiImp.cpp +++ b/mailnews/mapi/mapihook/src/msgMapiImp.cpp @@ -37,6 +37,10 @@ * * ***** END LICENSE BLOCK ***** */ +#ifdef MOZ_LOGGING +// sorry, this has to be before the pre-compiled header +#define FORCE_PR_LOG /* Allow logging in the release build */ +#endif #include #include #include "msgMapi.h" @@ -68,10 +72,14 @@ #include "nsIFileStreams.h" #include "nsNetCID.h" +PRLogModuleInfo *MAPI; + CMapiImp::CMapiImp() : m_cRef(1) { m_Lock = PR_NewLock(); + if (!MAPI) + MAPI = PR_NewLogModule("MAPI"); } CMapiImp::~CMapiImp() @@ -160,6 +168,7 @@ STDMETHODIMP CMapiImp::Login(unsigned long aUIArg, LOGIN_PW_TYPE aLogin, LOGIN_P PRBool bNewSession = PR_FALSE; char *id_key = nsnull; + PR_LOG(MAPI, PR_LOG_DEBUG, ("CMapiImp::Login using flags %d\n", aFlags)); if (aFlags & MAPI_NEW_SESSION) bNewSession = PR_TRUE; @@ -169,6 +178,7 @@ STDMETHODIMP CMapiImp::Login(unsigned long aUIArg, LOGIN_PW_TYPE aLogin, LOGIN_P if (nsMapiHook::VerifyUserName(aLogin, &id_key) == PR_FALSE) { *aSessionId = MAPI_E_LOGIN_FAILURE; + NS_ASSERTION(PR_FALSE, "failed verifying user name"); return hr; } } @@ -228,7 +238,8 @@ STDMETHODIMP CMapiImp::SendMail( unsigned long aSession, lpnsMapiMessage aMessag // Assign the pointers in the aMessage struct to the array of Recips and Files // recieved here from MS COM. These are used in BlindSendMail and ShowCompWin fns - aMessage->lpRecips = aRecips ; + memcpy(aMessage->lpRecips, aRecips, aRecipCount * sizeof (nsMapiRecipDesc)); +// aMessage->lpRecips = aRecips ; aMessage->lpFiles = aFiles ; /** create nsIMsgCompFields obj and populate it **/ @@ -365,7 +376,10 @@ LONG CMapiImp::InitContext(unsigned long session, MsgMapiListContext **listConte nsCOMPtr inboxFolder; nsresult rv = GetDefaultInbox(getter_AddRefs(inboxFolder)); if (NS_FAILED(rv)) + { + NS_ASSERTION(PR_FALSE, "in init context, no inbox"); return(MAPI_E_NO_MESSAGES); + } *listContext = new MsgMapiListContext; if (!*listContext) @@ -376,6 +390,7 @@ LONG CMapiImp::InitContext(unsigned long session, MsgMapiListContext **listConte { pMapiConfig->SetMapiListContext(session, NULL); delete *listContext; + NS_ASSERTION(PR_FALSE, "in init context, unable to open db"); return MAPI_E_NO_MESSAGES; } else @@ -396,13 +411,22 @@ STDMETHODIMP CMapiImp::FindNext(unsigned long aSession, unsigned long ulUIParam, *lpszMessageID = '\0'; nsMAPIConfiguration * pMapiConfig = nsMAPIConfiguration::GetMAPIConfiguration() ; - if (!pMapiConfig) return NS_ERROR_FAILURE ; // get the singelton obj + if (!pMapiConfig) + { + NS_ASSERTION(PR_FALSE, "failed to get config in findnext"); + return NS_ERROR_FAILURE ; // get the singelton obj + } MsgMapiListContext *listContext; LONG ret = InitContext(aSession, &listContext); if (ret != SUCCESS_SUCCESS) + { + NS_ASSERTION(PR_FALSE, "init context failed"); return ret; + } + NS_ASSERTION(listContext, "initContext returned null context"); if (listContext) { +// NS_ASSERTION(PR_FALSE, "find next init context succeeded"); nsMsgKey nextKey = listContext->GetNext(); if (nextKey == nsMsgKey_None) { @@ -416,6 +440,7 @@ STDMETHODIMP CMapiImp::FindNext(unsigned long aSession, unsigned long ulUIParam, sprintf((char *) lpszMessageID, "%d", nextKey); } + PR_LOG(MAPI, PR_LOG_DEBUG, ("CMapiImp::FindNext returning key %s\n", (char *) lpszMessageID)); return(SUCCESS_SUCCESS); } @@ -424,14 +449,23 @@ STDMETHODIMP CMapiImp::ReadMail(unsigned long aSession, unsigned long ulUIParam, { PRInt32 irv; nsCAutoString keyString((char *) lpszMessageID); + PR_LOG(MAPI, PR_LOG_DEBUG, ("CMapiImp::ReadMail asking for key %s\n", (char *) lpszMessageID)); nsMsgKey msgKey = keyString.ToInteger(&irv); if (irv) + { + NS_ASSERTION(PR_FALSE, "invalid lpszMessageID"); return MAPI_E_INVALID_MESSAGE; + } MsgMapiListContext *listContext; LONG ret = InitContext(aSession, &listContext); if (ret != SUCCESS_SUCCESS) + { + NS_ASSERTION(PR_FALSE, "init context failed in ReadMail"); return ret; + } *lppMessage = listContext->GetMessage (msgKey, flFlags); + NS_ASSERTION(*lppMessage, "get message failed"); + return (*lppMessage) ? SUCCESS_SUCCESS : E_FAIL; } @@ -577,11 +611,11 @@ lpnsMapiMessage MsgMapiListContext::GetMessage (nsMsgKey key, unsigned long flFl if (msgHdr) { msgHdr->GetSubject (getter_Copies(subject)); - message->lpszSubject = (PRUnichar *) CoTaskMemAlloc(subject.Length() + 1); + message->lpszSubject = (char *) CoTaskMemAlloc(subject.Length() + 1); strcpy((char *) message->lpszSubject, subject.get()); PRUint32 date; (void) msgHdr->GetDateInSeconds(&date); - message->lpszDateReceived_notUsed = (PRUnichar *) ConvertDateToMapiFormat (date); + message->lpszDateReceived = ConvertDateToMapiFormat (date); // Pull out the flags info // anything to do with MAPI_SENT? Since we're only reading the Inbox, I guess not @@ -617,19 +651,19 @@ lpnsMapiMessage MsgMapiListContext::GetMessage (nsMsgKey key, unsigned long flFl memset(message->lpRecips, 0, (numToRecips + numCCRecips) * sizeof(MapiRecipDesc)); if (message->lpRecips) { - ConvertRecipientsToMapiFormat (parser, recipients, message->lpRecips, MAPI_TO); ConvertRecipientsToMapiFormat (parser, ccList, &message->lpRecips[numToRecips], MAPI_CC); - - message->nRecipCount = numToRecips + numCCRecips; } - + + PR_LOG(MAPI, PR_LOG_DEBUG, ("MsgMapiListContext::GetMessage flags=%x subject %s date %s sender %s\n", + flFlags, (char *) message->lpszSubject,(char *) message->lpszDateReceived, author.get()) ); + // Convert any body text that we have locally if (!(flFlags & MAPI_ENVELOPE_ONLY)) - message->lpszNoteText = (PRUnichar *) ConvertBodyToMapiFormat (msgHdr); + message->lpszNoteText = (char *) ConvertBodyToMapiFormat (msgHdr); } - if (! (flFlags & MAPI_PEEK)) + if (! (flFlags & (MAPI_PEEK | MAPI_ENVELOPE_ONLY))) m_db->MarkRead(key, PR_TRUE, nsnull); } return message; @@ -673,7 +707,7 @@ void MsgMapiListContext::ConvertRecipientsToMapiFormat (nsIMsgHeaderParser *pars { if (*walkNames) { - mapiRecips[i].lpszName = (PRUnichar *) CoTaskMemAlloc(strlen(walkNames) + 1); + mapiRecips[i].lpszName = (char *) CoTaskMemAlloc(strlen(walkNames) + 1); if (mapiRecips[i].lpszName ) strcpy((char *) mapiRecips[i].lpszName, walkNames); } @@ -684,7 +718,7 @@ void MsgMapiListContext::ConvertRecipientsToMapiFormat (nsIMsgHeaderParser *pars { if (*walkAddresses) { - mapiRecips[i].lpszAddress = (PRUnichar *) CoTaskMemAlloc(strlen(walkAddresses) + 1); + mapiRecips[i].lpszAddress = (char *) CoTaskMemAlloc(strlen(walkAddresses) + 1); if (mapiRecips[i].lpszAddress) strcpy((char *) mapiRecips[i].lpszAddress, walkAddresses); } @@ -769,6 +803,8 @@ char *MsgMapiListContext::ConvertBodyToMapiFormat (nsIMsgDBHdr *hdr) strcpy(body + bytesCopied, curLine.get()); bytesCopied += curLine.Length(); } + PR_LOG(MAPI, PR_LOG_DEBUG, ("ConvertBodyToMapiFormat size=%x allocated size %x body = %100.100s\n", + bytesCopied, msgSize + 1, (char *) body) ); body[bytesCopied] = '\0'; // rhp - fix last line garbage... return body; } @@ -780,29 +816,13 @@ char *MsgMapiListContext::ConvertBodyToMapiFormat (nsIMsgDBHdr *hdr) // MSGMAPI API implementation -extern "C" PRBool MSG_GetMapiMessageById (nsIMsgFolder *folder, nsMsgKey key, lpnsMapiMessage *message) -{ - PRBool success = FALSE; - MsgMapiListContext *context = new MsgMapiListContext(); - if (context) - { - if (NS_SUCCEEDED(context->OpenDatabase(folder))) - { - *message = context->GetMessage (key, 0); - success = TRUE; - } - delete context; - } - return success; -} - static void msg_FreeMAPIFile(lpMapiFileDesc f) { if (f) { - PR_Free(f->lpszPathName); - PR_Free(f->lpszFileName); + CoTaskMemFree(f->lpszPathName); + CoTaskMemFree(f->lpszFileName); } } @@ -810,9 +830,11 @@ static void msg_FreeMAPIRecipient(lpMapiRecipDesc rd) { if (rd) { - PR_Free(rd->lpszName); - PR_Free(rd->lpszAddress); - PR_Free(rd->lpEntryID); + if (rd->lpszName) + CoTaskMemFree(rd->lpszName); + if (rd->lpszAddress) + CoTaskMemFree(rd->lpszAddress); + // CoTaskMemFree(rd->lpEntryID); } } @@ -822,11 +844,11 @@ extern "C" void MSG_FreeMapiMessage (lpMapiMessage msg) if (msg) { - PR_Free(msg->lpszSubject); - PR_Free(msg->lpszNoteText); - PR_Free(msg->lpszMessageType); - PR_Free(msg->lpszDateReceived); - PR_Free(msg->lpszConversationID); + CoTaskMemFree(msg->lpszSubject); + CoTaskMemFree(msg->lpszNoteText); + CoTaskMemFree(msg->lpszMessageType); + CoTaskMemFree(msg->lpszDateReceived); + CoTaskMemFree(msg->lpszConversationID); if (msg->lpOriginator) msg_FreeMAPIRecipient(msg->lpOriginator); @@ -835,15 +857,15 @@ extern "C" void MSG_FreeMapiMessage (lpMapiMessage msg) if (&(msg->lpRecips[i]) != nsnull) msg_FreeMAPIRecipient(&(msg->lpRecips[i])); - PR_Free(msg->lpRecips); + CoTaskMemFree(msg->lpRecips); for (i=0; inFileCount; i++) if (&(msg->lpFiles[i]) != nsnull) msg_FreeMAPIFile(&(msg->lpFiles[i])); - PR_Free(msg->lpFiles); - - PR_Free(msg); + CoTaskMemFree(msg->lpFiles); + + CoTaskMemFree(msg); } } diff --git a/mailnews/mapi/old/tests/mapitest/mapiproc.cpp b/mailnews/mapi/old/tests/mapitest/mapiproc.cpp index a148969db395..13b71da803fa 100644 --- a/mailnews/mapi/old/tests/mapitest/mapiproc.cpp +++ b/mailnews/mapi/old/tests/mapitest/mapiproc.cpp @@ -524,7 +524,7 @@ DoMAPIReadMail(HWND hWnd) // Deal with error up front and return if need be... if (rc != SUCCESS_SUCCESS) { - wsprintf(msg, "FAILURE: Return code %d from MAPIReadMail\nError=[%s]", + wsprintf(msg, "FAILURE: Return code %x from MAPIReadMail\nError=[%s]", rc, GetMAPIError(rc)); ShowMessage(hWnd, msg); @@ -759,7 +759,7 @@ GetMessage(HWND hWnd, LPSTR id) // Deal with error up front and return if need be... if (rc != SUCCESS_SUCCESS) { - wsprintf(msg, "FAILURE: Return code %d from MAPIReadMail\nError=[%s]", + wsprintf(msg, "FAILURE: Return code %x from MAPIReadMail\nError=[%s]", rc, GetMAPIError(rc)); ShowMessage(hWnd, msg);