diff -r b13141f05c3d -r b5fbb9b25d57 ipsservices/ipssosplugin/src/ipsplgsosbaseplugin.cpp --- a/ipsservices/ipssosplugin/src/ipsplgsosbaseplugin.cpp Tue Apr 27 16:20:14 2010 +0300 +++ b/ipsservices/ipssosplugin/src/ipsplgsosbaseplugin.cpp Tue May 11 15:57:15 2010 +0300 @@ -30,6 +30,7 @@ _LIT8( KRequest, "REQUEST" ); _LIT8( KResponse, "RESPONSE" ); _LIT8( KCancel, "CANCEL" ); +_LIT( KLineFeed, "\r\n"); #ifdef __WINS__ _LIT( KEmulatorIMEI, "123456789012345" ); @@ -64,6 +65,22 @@ CIpsPlgSosBasePlugin::~CIpsPlgSosBasePlugin() { FUNC_LOG; + if ( iMsvOpDeleteMessage ) + { + iMsvOpDeleteMessage->Cancel(); + } + + if ( iWaitDeleteMessage ) + { + iWaitDeleteMessage->Cancel(); + } + + delete iMsvOpDeleteMessage; + iMsvOpDeleteMessage = NULL; + delete iWaitDeleteMessage; + iWaitDeleteMessage = NULL; + delete icEntry; + icEntry = NULL; if ( iWait.IsStarted() ) { iWait.AsyncStop(); @@ -1743,7 +1760,7 @@ void CIpsPlgSosBasePlugin::DeleteMessagesByUidL( const TFSMailMsgId& /*aMailBoxId*/, const TFSMailMsgId& /*aFolderId*/, - const RArray& aMessages ) + const RArray& aMessages ) { FUNC_LOG; CMsvEntrySelection* sel=new(ELeave) CMsvEntrySelection; @@ -1754,49 +1771,93 @@ TMsvId service; TMsvEntry parentEntry; - - for(TInt i=0; iGetEntry( aMessages[i].Id(), service, tEntry ); - - //make sure that only messages get deleted. - if( tEntry.iType == KUidMsvMessageEntry ) + if ( iMsvOpDeleteMessage ) { - iSession->GetEntry( tEntry.Parent( ), service, parentEntry ); - - CMsvEntry *cEntry = CMsvEntry::NewL( - *iSession, tEntry.Id(), TMsvSelectionOrdering() ); - CleanupStack::PushL( cEntry ); - CIpsPlgOperationWait* wait = CIpsPlgOperationWait::NewLC( ); - // Sets bit 32 of iMtmData1, used when msg deleted in Offline - // and status hasn't updated to server (client entry still exists) - tEntry.SetLocallyDeleted( ETrue ); - CMsvOperation* msvOp = cEntry->ChangeL( tEntry, wait->iStatus ); - CleanupStack::PushL(msvOp); - wait->Start(); - sel->AppendL( tEntry.Id() ); - CleanupStack::PopAndDestroy( 3, cEntry ); + iMsvOpDeleteMessage->Cancel(); + } + + if ( iWaitDeleteMessage ) + { + iWaitDeleteMessage->Cancel(); } - } - - CIpsPlgSingleOpWatcher* watcher = CIpsPlgSingleOpWatcher::NewL( *this ); - CleanupStack::PushL( watcher ); - CMsvOperation* op = CIpsPlgDeleteRemote::NewL( *iSession, - watcher->iStatus, *sel ); - watcher->SetOperation( op ); - - // make draft deletion synchronous so that empty drafts are not left after application close - if ( parentEntry.Id() == KMsvDraftEntryIdValue && count == 1 ) - { - iWait.Start(); - CleanupStack::PopAndDestroy( watcher ); + + delete iMsvOpDeleteMessage; + iMsvOpDeleteMessage = NULL; + delete iWaitDeleteMessage; + iWaitDeleteMessage = NULL; + delete icEntry; + icEntry = NULL; } else { - iOperations.AppendL( watcher ); - CleanupStack::Pop( watcher ); + for( TInt i = 0; i < count; i++ ) + { + iSession->GetEntry( aMessages[i].Id(), service, tEntry ); + + //make sure that only messages get deleted. + if( tEntry.iType == KUidMsvMessageEntry ) + { + if(iMsvOpDeleteMessage) + { + iMsvOpDeleteMessage->Cancel(); + delete iMsvOpDeleteMessage; + iMsvOpDeleteMessage = NULL; + } + + if ( iWaitDeleteMessage ) + { + iWaitDeleteMessage->Cancel(); + delete iWaitDeleteMessage; + iWaitDeleteMessage = NULL; + } + + delete icEntry; + icEntry = NULL; + + iSession->GetEntry( tEntry.Parent( ), service, parentEntry ); + + icEntry = CMsvEntry::NewL( + *iSession, tEntry.Id(), TMsvSelectionOrdering() ); + + + // priority slightly increased not to pause the function longer than needed + iWaitDeleteMessage = CIpsPlgOperationWait::NewL( CActive::EPriorityStandard+1 ); + // Sets bit 32 of iMtmData1, used when msg deleted in Offline + // and status hasn't updated to server (client entry still exists) + tEntry.SetLocallyDeleted( ETrue ); + + iMsvOpDeleteMessage = icEntry->ChangeL( tEntry, + iWaitDeleteMessage->iStatus ); + + iWaitDeleteMessage->Start(); + + sel->AppendL( tEntry.Id() ); + } + } + + CIpsPlgSingleOpWatcher* watcher = CIpsPlgSingleOpWatcher::NewLC( *this ); + + CMsvOperation* op = CIpsPlgDeleteRemote::NewL( *iSession, + watcher->iStatus, *sel ); + watcher->SetOperation( op ); + + // make draft deletion synchronous so that empty drafts are not left after application close + if ( parentEntry.Id() == KMsvDraftEntryIdValue && count == 1 ) + { + iWait.Start(); + CleanupStack::PopAndDestroy( watcher ); + } + else + { + iOperations.AppendL( watcher ); + CleanupStack::Pop( watcher ); + } } - + CleanupStack::PopAndDestroy( sel ); } @@ -2177,14 +2238,37 @@ textBodyPart->FetchedContentSize() ); TPtr bPtr( body->Des() ); origMsgTextBodyPart->GetContentToBufferL( bPtr, 0 ); - HBufC* content = HBufC::NewLC( - hPtr.Length() + bPtr.Length() ); - TPtr cPtr( content->Des() ); + TInt contentLength = hPtr.Length() + bPtr.Length() + + KLineFeed().Length(); + HBufC* signatureText = NULL; + // if signature resolving leaves, ignore it, i.e., + // continue without signature adding + TRAP_IGNORE( signatureText = + ResolveSignatureTextL( aMailBoxId ) ); + if ( signatureText ) + { + CleanupStack::PushL( signatureText ); + contentLength += signatureText->Length() + + KLineFeed().Length(); + } + HBufC* content = HBufC::NewLC( contentLength ); + TPtr cPtr( content->Des() ); + if ( signatureText ) + { + cPtr.Append( *signatureText ); + // extra empty line between signature and original txt + cPtr.Append( KLineFeed ); + } + cPtr.Append( KLineFeed ); cPtr.Append( hPtr ); cPtr.Append( bPtr ); textBodyPart->SetContent( cPtr ); textBodyPart->SaveL(); CleanupStack::PopAndDestroy( content ); + if ( signatureText ) + { + CleanupStack::PopAndDestroy( signatureText ); + } CleanupStack::PopAndDestroy( body ); CleanupStack::PopAndDestroy( origMsgTextBodyPart ); } @@ -2196,6 +2280,25 @@ // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- +HBufC* CIpsPlgSosBasePlugin::ResolveSignatureTextL( + const TFSMailMsgId& aMailBoxId ) + { + FUNC_LOG; + HBufC* signatureText = NULL; + + if ( iSettingsApi && iSession ) + { + TMsvEntry entry; + TMsvId serv; + iSession->GetEntry( aMailBoxId.Id(), serv, entry ); + signatureText = iSettingsApi->SignatureTextL( entry ); + } + + return signatureText; + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- void CIpsPlgSosBasePlugin::DisconnectL( const TFSMailMsgId& aMailBoxId, MFSMailRequestObserver& aObserver,