diff -r 35b64624a9e7 -r 36f374c67aa8 messagingapp/msgappfw/plugins/msgplugin/src/ccsmsghandler.cpp --- a/messagingapp/msgappfw/plugins/msgplugin/src/ccsmsghandler.cpp Wed Jun 23 18:09:17 2010 +0300 +++ b/messagingapp/msgappfw/plugins/msgplugin/src/ccsmsghandler.cpp Tue Jul 06 14:12:40 2010 +0300 @@ -21,6 +21,7 @@ // USER INCLUDES #include "ccsmsghandler.h" #include "msgbiouids.h" +#include "ccsdefs.h" // SYSTEM INCLUDES #include @@ -68,7 +69,12 @@ CCsMsgHandler::~CCsMsgHandler() { PRINT ( _L("Enter CCsMsgHandler::~CCsMsgHandler") ); - + if(iIdle) + { + iIdle->Cancel(); + delete iIdle; + iIdle=NULL; + } if(iMsgPluginUtility) { delete iMsgPluginUtility; @@ -107,19 +113,6 @@ iSession = NULL; } - if ( iRootEntry ) - { - delete iRootEntry; - iRootEntry = NULL; - } - - if ( iMessages ) - { - iMessages->Reset(); - delete iMessages; - iMessages = NULL; - } - if(iMessageArray) { iMessageArray->Reset(); @@ -146,7 +139,7 @@ iMsgPluginUtility = CCsMsgPluginUtility::NewL(); - iConverstationEntryList = new(ELeave)RPointerArray(); + iConverstationEntryList = new(ELeave) RPointerArray(1); iMtmRegistry = CClientMtmRegistry::NewL( *iSession ); @@ -160,8 +153,6 @@ iMessageArray = new (ELeave)RArray (KMessageArrayGranularity); - iMessageCount = 0; - PRINT ( _L("End CCsMsgHandler::ConstructL") ); } @@ -201,12 +192,15 @@ entry.Parent() == KMsvSentEntryIdValue || entry.Parent() == KMsvGlobalOutBoxIndexEntryIdValue ) { + CleanupResetAndDestroyPushL(addressList); + iMsgPluginUtility->CreateContactL(iSession, entry, addressList); //process entry ExtractAddressesL(entry, ERead, addressList); - - addressList.ResetAndDestroy(); + + // Cleanup addressList + CleanupStack::PopAndDestroy(&addressList); } PRINT ( _L("Exit CCsMsgHandler::ProcessResultsL") ); @@ -348,6 +342,7 @@ if ( aParent == KMsvSentEntryIdValue || aParent == KMsvGlobalInBoxIndexEntryIdValue ) { + CleanupResetAndDestroyPushL(addressList); // currently server needs number, so getting it from header iMsgPluginUtility->CreateContactL(iSession, entry, addressList); @@ -356,7 +351,7 @@ // entry created in sent already exists, hence an update ExtractAddressesL(entry, EUpdate, addressList); - addressList.ResetAndDestroy(); + CleanupStack::PopAndDestroy(&addressList); } //for drafts and outbox, the entry changes multiple times, @@ -372,6 +367,7 @@ // as it is going to appear in sent items if( ECsSendStateSent != iMsgPluginUtility->GetSendState(entry) ) { + CleanupResetAndDestroyPushL(addressList); // currently server needs number, so getting it from header iMsgPluginUtility->CreateContactL(iSession, entry, addressList); @@ -382,7 +378,7 @@ iPrevEntry = entry; - addressList.ResetAndDestroy(); + CleanupStack::PopAndDestroy(&addressList); } }//end check changed entry } @@ -408,13 +404,11 @@ if (aContact.Length()>0) { - contact = aContact.AllocL(); - CleanupStack::PushL(contact); + contact = aContact.AllocLC(); } if (aDescription.Length()>0) { - sDescription = aDescription.AllocL(); - CleanupStack::PushL(sDescription); + sDescription = aDescription.AllocLC(); } //use utility to create conversation entry @@ -504,7 +498,7 @@ aEntry.iBioType != KUidMsgSubTypeMmsAudioMsg.iUid ) || aEntry.iMtm == KSenduiMtmBtUid ) { - tmpBuffer = aEntry.iDescription.AllocL(); + tmpBuffer = aEntry.iDescription.AllocLC(); description.Set( tmpBuffer->Des() ); } else if ( aEntry.iMtm == KSenduiMtmSmsUid ) @@ -514,7 +508,7 @@ CRichText& body = iSmsMtm->Body(); TInt smsLength = body.DocumentLength(); - tmpBuffer = HBufC::NewL(smsLength); + tmpBuffer = HBufC::NewLC(smsLength); TPtr ptr(tmpBuffer->Des()); body.Extract(ptr, 0); description.Set( tmpBuffer->Des() ); @@ -522,7 +516,7 @@ else if ( aEntry.iMtm == KSenduiMtmMmsUid || aEntry.iMtm == KSenduiMMSNotificationUid) { - tmpBuffer = aEntry.iDescription.AllocL(); + tmpBuffer = aEntry.iDescription.AllocLC(); description.Set( tmpBuffer->Des() ); iMmsMtm->SwitchCurrentEntryL( aEntry.Id() ); @@ -568,8 +562,12 @@ // Unknown ProcessEntryL(aEvent, KNullDesC, description, aEntry); } - - delete tmpBuffer; + + //Cleanup tmpBuffer + if ( tmpBuffer ) + { + CleanupStack::PopAndDestroy(); + } PRINT ( _L("Exit CCsMsgHandler::ExtractAddressesL") ); } @@ -589,108 +587,59 @@ // ----------------------------------------------------------------------------- // TInt CCsMsgHandler::UploadMsgL() -{ + { + //Release scheduler for scheduling. + User::After(1); + switch ( iState ) - { - case EReadInbox: { - iRootEntry = iSession->GetEntryL(KMsvGlobalInBoxIndexEntryId); - - // Set sort order - TMsvSelectionOrdering order; - order.SetSorting(EMsvSortById); - iRootEntry->SetSortTypeL(order); - - iMessages = iRootEntry->ChildrenL(); - iMessageCount = iRootEntry->Count(); - if(iMessageCount) + case EReadInbox: { - for(int i = 0; i < iMessageCount; i ++) - { - iMessageArray->Append(iMessages->At(i)); - } + UpdateMessageArrayL(KMsvGlobalInBoxIndexEntryId); + iState = EReadSent; + return 1; } - iState = EReadSent; - CleanupL(); - - return 1; - } - case EReadSent: - { - iRootEntry = iSession->GetEntryL(KMsvSentEntryId); - - // Set sort order - TMsvSelectionOrdering order; - order.SetSorting(EMsvSortById); - iRootEntry->SetSortTypeL(order); - - iMessages = iRootEntry->ChildrenL(); - iMessageCount = iRootEntry->Count(); - if(iMessageCount) { - for(int i = 0; i < iMessageCount; i++ ) - { - iMessageArray->Append(iMessages->At(i)); - } + UpdateMessageArrayL(KMsvSentEntryId); + iState = EReadOutbox; + return 1; } - iState = EReadOutbox; - CleanupL(); - - return 1; - } - case EReadOutbox: - { - iRootEntry = iSession->GetEntryL(KMsvGlobalOutBoxIndexEntryId); - - // Set sort order - TMsvSelectionOrdering order; - order.SetSorting(EMsvSortById); - iRootEntry->SetSortTypeL(order); - - iMessages = iRootEntry->ChildrenL(); - iMessageCount = iRootEntry->Count(); - - if(iMessageCount) { - for(int i = 0; i < iMessageCount; i ++) - { - iMessageArray->Append(iMessages->At(i)); - } - iMessageCount=0; + UpdateMessageArrayL(KMsvGlobalOutBoxIndexEntryId); + iState = ESortEntries; + return 1; } - iState = ESortEntries; - CleanupL(); - - return 1; - } case ESortEntries: - { - //Sort the elements in the array by descending order of TMsvId's + { + //Sort the elements in the array by descending order of TMsvId's TLinearOrder order(CompareOrder); iMessageArray->Sort(order); iState = EProcessEntries; return 1; - } - + } case EProcessEntries: - { + { //Process one entry at a time in sequence //Process the first element in the array on each call, till the end if(iMessageArray->Count()) - { - ProcessResultsL(iSession->GetEntryL(iMessageArray->operator[](0))->Entry()); + { + CMsvEntry* msvEntry= iSession-> + GetEntryL(iMessageArray->operator[](0)); + CleanupStack::PushL(msvEntry); + ProcessResultsL(msvEntry->Entry()); + CleanupStack::PopAndDestroy(msvEntry); iMessageArray->Remove(0); - } + } else - { + { + iMessageArray->Reset(); iMsgObserver->HandleCachingCompleted(); return 0; //DONE - } - + } iState = EProcessEntries; return 1; } @@ -722,36 +671,19 @@ iState = EReadInbox; TCallBack callback = TCallBack(UploadMsg, (TAny*) this); - iIdle = CIdle::NewL(CActive::EPriorityLow); + + if(iIdle) + { + delete iIdle; + iIdle = NULL; + } + iIdle = CIdle::NewL(CActive::EPriorityIdle); iIdle->Start(callback); PRINT ( _L("End CCsMsgHandler::Start") ); } // ----------------------------------------------------------------------------- -// CCsMsgHandler::CleanupL() -// Helper function for state machine cleanup -// ----------------------------------------------------------------------------- -// -void CCsMsgHandler::CleanupL() - { - if ( iRootEntry ) - { - delete iRootEntry; - iRootEntry = NULL; - } - - if ( iMessages ) - { - iMessages->Reset(); - delete iMessages; - iMessages = NULL; - } - - iMessageCount = 0; - } - -// ----------------------------------------------------------------------------- // CCsMsgHandler::IsMtmSupported() // // ----------------------------------------------------------------------------- @@ -835,5 +767,40 @@ } return (type); } +// ----------------------------------------------------------------------------- +// void CCsMsgHandler::UpdateMessageArrayL(const TMsvId& aFolderId) +// Update iMessageArray with the message ID before upload message to csserver. +// ----------------------------------------------------------------------------- +// +void CCsMsgHandler::UpdateMessageArrayL(const TMsvId& aFolderId) + { + CMsvEntry* msvEntry = iSession->GetEntryL(aFolderId); + CleanupStack::PushL(msvEntry); + // Set sort order + TMsvSelectionOrdering order; + order.SetSorting(EMsvSortById); + msvEntry->SetSortTypeL(order); + + CMsvEntrySelection* messages = msvEntry->ChildrenL(); + // Cleanup msvEntry + CleanupStack::PopAndDestroy(msvEntry); + CleanupStack::PushL(messages); + + TInt messageCount = messages->Count(); + + // In case of large number of message caching + // to avoid multiple reallocation alloc memory + // one shot. + if( messageCount > KMessageArrayGranularity) + iMessageArray->Reserve(messageCount); + + for(int i = 0; i < messageCount; i ++) + { + TMsvId msgId=messages->At(i); + iMessageArray->Append(msgId); + } + // Cleanup messages + CleanupStack::PopAndDestroy(messages); + } // End of file