diff -r dcf0eedfc1a3 -r d189ee25cf9d ipsservices/ipssosplugin/src/ipsplgsosbaseplugin.cpp --- a/ipsservices/ipssosplugin/src/ipsplgsosbaseplugin.cpp Thu Aug 19 09:38:05 2010 +0300 +++ b/ipsservices/ipssosplugin/src/ipsplgsosbaseplugin.cpp Tue Aug 31 15:04:17 2010 +0300 @@ -17,28 +17,56 @@ #include "emailtrace.h" #include "ipsplgheaders.h" -#include "FreestyleEmailUiConstants.h" + +// FreestyleEmailUiConstants include removed -#define FREESTYLE_EMAIL_UI_SID 0x2001E277 +// +#include "ipsplgsosbaseplugin.hrh" +#include "ipsplgmailstoreroperation.h" +#include "ipsplgmessagepartstoreroperation.h" +#include "BasePlugin.h" +// +#include "ipssosextendedsettingsmanager.h" +#include "ipssettingkeys.h" +// +// + +#define FREESTYLE_EMAIL_UI_SID 0x200255BA const TInt KOpGranularity = 2; -_LIT( KMimeTextCalRequest, "text/calendar; method=REQUEST;" ); -_LIT( KMimeTextCalResponse, "text/calendar; method=RESPONSE;" ); -_LIT( KMimeTextCalCancel, "text/calendar; method=CANCEL;" ); -_LIT8( KMethod, "method" ); -_LIT8( KRequest, "REQUEST" ); -_LIT8( KResponse, "RESPONSE" ); -_LIT8( KCancel, "CANCEL" ); -_LIT( KLineFeed, "\r\n"); +// remove unused literals #ifdef __WINS__ _LIT( KEmulatorIMEI, "123456789012345" ); #endif // __WINS__ +// +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +void CIpsPlgSosBasePlugin::ActiveFolderChanged( + const TFSMailMsgId& aActiveMailboxId, + const TFSMailMsgId& aActiveFolderId) + { + TRAP_IGNORE( HandleActiveFolderChangeL(aActiveMailboxId,aActiveFolderId) ); + } + + // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- -// +CEmailExtension* CIpsPlgSosBasePlugin::ExtensionL( const TUid& aInterfaceUid ) + { + if(aInterfaceUid != KEmailMailboxStateExtensionUid) + { + User::Leave(KErrNotSupported); + } + + return iStateExtension; + } +// +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +// iSettingsApi removed CIpsPlgSosBasePlugin::CIpsPlgSosBasePlugin( const TUint aFSPluginId ) : iFSPluginId( aFSPluginId ), iSession( NULL ), @@ -50,7 +78,6 @@ iCachedEmailMessage( NULL ), iMruList( NULL ), iSearch( NULL ), - iSettingsApi( NULL ), iEventHandler( NULL ), iSessionOk( ETrue ), iBrandingId( NULL ), @@ -61,31 +88,10 @@ // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- -// +// iSettingsApi, iWait removed 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(); - } - iOperations.ResetAndDestroy(); iActivitytimers.ResetAndDestroy(); iOperations.Close(); @@ -96,12 +102,12 @@ { iEventHandler->UnRegisterPropertyObserver( iSyncStateHandler ); } + delete iStateExtension; delete iEventHandler; delete iCachedEntry; delete iCachedEmailMessage; delete iMsgMapper; delete iSearch; - delete iSettingsApi; delete iSyncStateHandler; delete iSession; delete iBrandingId; @@ -112,14 +118,14 @@ void CIpsPlgSosBasePlugin::BaseConstructL() { FUNC_LOG; + iStateExtension = CIpsStateExtension::NewL(*this); iEventHandler = CIpsPlgEventHandler::NewL( *this ); iSession = CMsvSession::OpenAsyncL( *iEventHandler ); iMsgMapper = CIpsPlgMsgMapper::NewL( *iSession, *this ); iSmtpService = CIpsPlgSmtpService::NewL( *iSession, *this ); iMruList = CIpsPlgMruList::NewL( ); iSearch = CIpsPlgSearch::NewL( *iSession, *this ); - iSettingsApi = CIpsSetDataApi::NewL( *iSession ); - iSettingsApi->GetIMEIFromThePhoneL( iIMEI ); + // iSettingsApi removed iSyncStateHandler = CIpsPlgSyncStateHandler::NewL( *iSession, *this, iOperations ); iEventHandler->RegisterPropertyObserverL( iSyncStateHandler ); @@ -133,6 +139,8 @@ { iIsUnderUiProcess = EFalse; } + +#ifndef RD_101_EMAIL RAlwaysOnlineClientSession aosession; TInt err = aosession.Connect(); if ( err == KErrNone ) @@ -143,6 +151,7 @@ dummyBuf ) ); } aosession.Close(); +#endif } // ---------------------------------------------------------------------------- @@ -180,11 +189,8 @@ { DeleteAndRemoveOperation( i, aCompletionCode ); } - } - // make draft deletion synchronous so that empty drafts are not left after application close. - if ( iWait.IsStarted() ) - { - iWait.AsyncStop(); + +// iWait removed } } @@ -204,8 +210,12 @@ if ( tEntry.Connected() ) { status = EFSMailBoxOnline; - } - else + } + else if ( ConnOpRunning( aMailBoxId ) ) + { + status = EFSMailBoxOnline; + } + else { status = EFSMailBoxOffline; } @@ -301,7 +311,17 @@ result->SetName( tEntry.iDetails ); result->SetSettingsUid( TUid::Uid( IPS_SET_ECOM_IMPLEMENTATION_UID ) ); - iSettingsApi->GetMailboxAddressL( tEntry, address ); +// + CEmailAccounts* acc = CEmailAccounts::NewLC(); + TSmtpAccount smtpAcc; + acc->GetSmtpAccountL( tEntry.iRelatedId , smtpAcc ); + CImSmtpSettings* smtpSet = new (ELeave) CImSmtpSettings(); + CleanupStack::PushL( smtpSet ); + acc->LoadSmtpSettingsL( smtpAcc, *smtpSet ); + address = smtpSet->EmailAddress().AllocL(); + CleanupStack::PopAndDestroy( 2, acc ); +// + CleanupStack::PushL( address ); // << address CFSMailAddress* fsAddress = CFSMailAddress::NewLC(); // << fsAddress fsAddress->SetEmailAddress( *address ); @@ -328,25 +348,17 @@ { User::Leave( KErrNotReady ); } - - // Create connection to Always Online - RAlwaysOnlineClientSession aosess; - User::LeaveIfError( aosess.Connect() ); - + +// RAlwaysOnlineClientSession - related code removed // Prepare the parameters to be forwarded to AO-server TPckg param = aMailBoxId.Id(); - // Send message to server and close it - TRAP_IGNORE( aosess.RelayCommandL( EServerAPIEmailAgentRemove, param ) ); - aosess.Close(); - // delete MRU list from cen rep iMruList->ClearDataL( aMailBoxId ); iSyncStateHandler->NotifyMailboxRemove( aMailBoxId.Id() ); - CancelAllOnlineOperations( aMailBoxId ); - +// CancelAllOnlineOperations function call removed iSession->GetEntry( aMailBoxId.Id(), service, tEntry ); if ( tEntry.Connected() ) { @@ -368,7 +380,7 @@ } else { - iSettingsApi->RemoveAccountL( tEntry, *iSession ); +// iSettingsApi removed TFSProgress progress = { TFSProgress::EFSStatus_Waiting, 0, 0, KErrNone }; progress.iProgressStatus = TFSProgress::EFSStatus_RequestComplete; progress.iError = KErrNone; @@ -388,32 +400,12 @@ { User::Leave( KErrNotReady ); } - - TMsvEntry tEntry; - TMsvId serviceId; - TInt status = iSession->GetEntry( aMailBoxId.Id(), serviceId, tEntry ); - - if ( status == KErrNone ) - { - HBufC* address( NULL ); - iSettingsApi->GetMailboxAddressL( tEntry, address ); - CleanupStack::PushL( address ); - TPtrC ptr = address->Des(); - TInt index = ptr.Locate('@') + 1; - if( index > 0 && ptr.Length() > 0 ) - { - if( iBrandingId ) - { - delete iBrandingId; - iBrandingId = NULL; - } - ptr.Set( ptr.Right( ptr.Length() - index ) ); - iBrandingId = HBufC::NewL( ptr.Length() ); - iBrandingId->Des().Copy( ptr ); - } - CleanupStack::PopAndDestroy( address ); - } - + CMsvEntry* mboxEntry = iSession->GetEntryL( aMailBoxId.Id() ); + CleanupStack::PushL( mboxEntry ); + +// iSettingsApi removed, iBrandingId removed + CleanupStack::PopAndDestroy( mboxEntry ); + return *iBrandingId; } @@ -427,6 +419,7 @@ const TFSMailMsgId& aDestinationFolderId ) { FUNC_LOG; + // Pop3 has no implementation for this virtual if( aDestinationFolderId.Id() == KMsvDraftEntryId ) { MoveMessagesToDraftL( @@ -525,16 +518,13 @@ } if( sel->Count() ) { - CIpsPlgOperationWait* wait = CIpsPlgOperationWait::NewLC(); + // remove activeschedulerwait + TMsvLocalOperationProgress progress; if( !aSourceFolderId.IsNullId() ) { CMsvEntry* cEntry = iSession->GetEntryL( aSourceFolderId.Id() ); CleanupStack::PushL( cEntry ); - cEntry->MoveL( - *sel, - aDestinationFolderId.Id(),//KMsvDraftEntryIdValue - wait->iStatus ); - + cEntry->MoveL( *sel, aDestinationFolderId.Id(), progress ); CleanupStack::PopAndDestroy( cEntry ); } else @@ -543,13 +533,10 @@ // because it's equal to destination. TMsvId parent = msgEntry->Entry().Parent(); msgEntry->SetEntryL( parent ); - msgEntry->CopyL( - *sel, - aDestinationFolderId.Id(),//KMsvDraftEntryIdValue - wait->iStatus ); + msgEntry->CopyL( *sel, aDestinationFolderId.Id(), progress ); } - wait->Start(); - CleanupStack::PopAndDestroy( wait ); // wait + User::LeaveIfError( progress.iError ); + // } CleanupStack::PopAndDestroy( 2, sel ); // msgEntry, sel } @@ -618,9 +605,9 @@ User::Leave( KErrNotReady ); } iSession->GetEntry( aMailBoxId.Id(), service, tEntry ); - - TInt state = iSettingsApi->GetLastSyncStatusL( tEntry ); - +// + TInt state(0); +// switch( state ) { case ESyncFinishedSuccessfully: @@ -655,24 +642,24 @@ iOperations[i]->BaseOperation(); if ( baseOp && baseOp->FSMailboxId() == aMailBoxId && ( baseOp->IpsOpType() == EIpsOpTypePop3SyncOp - || baseOp->IpsOpType() == EIpsOpTypePop3PopulateOp || baseOp->IpsOpType() == EIpsOpTypeImap4SyncOp || baseOp->IpsOpType() == EIpsOpTypeImap4PopulateOp ) ) { DeleteAndRemoveOperation( i, KErrCancel ); } } -/** + +#ifndef RD_101_EMAIL RAlwaysOnlineClientSession aosession; err = aosession.Connect(); if ( err == KErrNone ) { TPckgBuf buf(aMailBoxId.Id()); - TRAP( err, aosession.RelayCommandL( + TRAP( err, aosession.RelayCommandL( EServerAPIEmailCancelAllAndDoNotDisconnect, buf ) ); } aosession.Close(); - */ +#endif return err; } @@ -838,68 +825,185 @@ // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- CFSMailMessage* CIpsPlgSosBasePlugin::CreateMessageToSendL( - const TFSMailMsgId& aMailBoxId ) + const TFSMailMsgId& /*aMailBoxId*/ ) { - FUNC_LOG; - CFSMailMessage* msg = iSmtpService->CreateNewSmtpMessageL( aMailBoxId ); - return msg; + // not used any more + User::Leave(KErrFSMailPluginNotSupported); + return NULL; // prevents compiler warning } +// +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +void CIpsPlgSosBasePlugin::CreateMessageToSendL( const TFSMailMsgId& aMailBoxId, + MFSMailRequestObserver& aOperationObserver, + const TInt aRequestId ) + { + FUNC_LOG; + // asynchronous message creation is started here to enable canceling of the operation + TMsvPartList partList( KMsvMessagePartBody ); + + CIpsPlgSingleOpWatcher* watcher = CIpsPlgSingleOpWatcher::NewLC(*this); + + // removed mboxEntry from parameters + changed iSmtpService to pointer + + CIpsPlgCreateMessageOperation* op = CIpsPlgCreateMessageOperation::NewL( + *iSmtpService, + *iSession, + watcher->iStatus, + partList, + aMailBoxId, + aOperationObserver, + aRequestId ); + // + watcher->SetOperation( op ); + + iOperations.AppendL( watcher ); + CleanupStack::Pop( watcher ); + } +// + // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- CFSMailMessage* CIpsPlgSosBasePlugin::CreateForwardMessageL( + const TFSMailMsgId& /*aMailBoxId*/, + const TFSMailMsgId& /*aOriginalMessageId*/, + const TDesC& /*aHeaderDescriptor*/ ) + { + // not used any more + User::Leave(KErrFSMailPluginNotSupported); + return NULL; // prevents compiler warning + } + +// +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +void CIpsPlgSosBasePlugin::CreateForwardMessageL( const TFSMailMsgId& aMailBoxId, const TFSMailMsgId& aOriginalMessageId, - const TDesC& aHeaderDescriptor ) + MFSMailRequestObserver& aOperationObserver, + const TInt aRequestId, + const TDesC& /*aHeaderDescriptor*/ ) { FUNC_LOG; - CFSMailMessage* msg = iSmtpService->CreateForwardSmtpMessageL( - aMailBoxId, aOriginalMessageId ); + // asynchronous message creation is started here to enable canceling of the operation - if ( aHeaderDescriptor != KNullDesC ) + // 1. part of function checs that body text and all + // attachments are fetched + TMsvEntry orgMsg; + TMsvId service; + User::LeaveIfError( iSession->GetEntry( + aOriginalMessageId.Id(), service, orgMsg ) ); + + if ( orgMsg.Id() == KMsvNullIndexEntryIdValue ) + { + User::Leave(KErrNotFound); + } + + if ( ( orgMsg.Parent() == KMsvSentEntryIdValue ) && + ( orgMsg.iMtm == KSenduiMtmSmtpUid ) ) { - // Ignoring trap as it is better to provide something in case of the - // below fix method fails than nothing. - TRAP_IGNORE( FixReplyForwardHeaderL( - msg, - aMailBoxId, - aOriginalMessageId, - aHeaderDescriptor ) ); + iSmtpService->ChangeServiceIdL( orgMsg ); } - - return msg; + + TMsvPartList partList( KMsvMessagePartBody | KMsvMessagePartAttachments ); + + CIpsPlgSingleOpWatcher* watcher = CIpsPlgSingleOpWatcher::NewLC(*this); + + // changed iSmtpService to pointer + CIpsPlgCreateForwardMessageOperation* op = CIpsPlgCreateForwardMessageOperation::NewL( + *iSmtpService, + *iSession, + watcher->iStatus, + partList, + aMailBoxId, + orgMsg.Id(), + aOperationObserver, + aRequestId ); + // + watcher->SetOperation( op ); + + iOperations.AppendL( watcher ); + CleanupStack::Pop( watcher ); + } +// + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +CFSMailMessage* CIpsPlgSosBasePlugin::CreateReplyMessageL( + const TFSMailMsgId& /*aMailBoxId*/, + const TFSMailMsgId& /*aOriginalMessageId*/, + const TBool /*aReplyToAll*/, + const TDesC& /*aHeaderDescriptor*/ ) + { + // not used any more + User::Leave(KErrFSMailPluginNotSupported); + return NULL; // prevents compiler warning } -// ---------------------------------------------------------------------------- +// // ---------------------------------------------------------------------------- -CFSMailMessage* CIpsPlgSosBasePlugin::CreateReplyMessageL( +// ---------------------------------------------------------------------------- +void CIpsPlgSosBasePlugin::CreateReplyMessageL( const TFSMailMsgId& aMailBoxId, const TFSMailMsgId& aOriginalMessageId, const TBool aReplyToAll, - const TDesC& aHeaderDescriptor ) + MFSMailRequestObserver& aOperationObserver, + const TInt aRequestId, + const TDesC& /* aHeaderDescriptor */ ) { FUNC_LOG; - CFSMailMessage* msg = iSmtpService->CreateReplySmtpMessageL( - aMailBoxId, aOriginalMessageId, aReplyToAll ); - - if ( aHeaderDescriptor != KNullDesC ) + // asynchronous message creation is started here to enable canceling of the operation + + // find orginal message header and check that body is fetched + TMsvEntry orgMsg; + TMsvId service; + User::LeaveIfError( + iSession->GetEntry( aOriginalMessageId.Id(), service, orgMsg ) ); + + if ( orgMsg.Id() == KMsvNullIndexEntryIdValue ) + { + User::Leave(KErrNotFound); + } + + if ( ( orgMsg.Parent() == KMsvSentEntryIdValue ) && + ( orgMsg.iMtm == KSenduiMtmSmtpUid ) ) { - // Ignoring trap as it is better to provide something in case of the - // below fix method fails than nothing. - TRAP_IGNORE( FixReplyForwardHeaderL( - msg, - aMailBoxId, - aOriginalMessageId, - aHeaderDescriptor ) ); + iSmtpService->ChangeServiceIdL( orgMsg ); + } + + // partList flags control e.g. what kind of recipient set is created + TMsvPartList partList = KMsvMessagePartBody | KMsvMessagePartDescription + | KMsvMessagePartOriginator; + if( aReplyToAll ) + { + partList |= KMsvMessagePartRecipient; } + + CIpsPlgSingleOpWatcher* watcher = CIpsPlgSingleOpWatcher::NewLC(*this); + + // changed iSmtpService to pointer + CIpsPlgCreateReplyMessageOperation* op = CIpsPlgCreateReplyMessageOperation::NewL( + *iSmtpService, + *iSession, + watcher->iStatus, + partList, + aMailBoxId, + orgMsg.Id(), + aOperationObserver, + aRequestId ); + // + watcher->SetOperation( op ); - return msg; + iOperations.AppendL( watcher ); + CleanupStack::Pop( watcher ); } +// // ---------------------------------------------------------------------------- -// ---------------------------------------------------------------------------- -// -void CIpsPlgSosBasePlugin::StoreMessageL( +// ---------------------------------------------------------------------------- +// +void CIpsPlgSosBasePlugin::StoreMessageL( const TFSMailMsgId& aMailBoxId, CFSMailMessage& aMessage ) { @@ -924,14 +1028,12 @@ if ( incoming ) { - // It`s commented because when it`s used heavile cause -16 error - // For example when user want to mark as read/unread many messages - // Synchronous method solves this issue - iMsgMapper->UpdateMessageFlagsL(msgId.Id(), aMessage); - /*CIpsPlgSingleOpWatcher* opW = CIpsPlgSingleOpWatcher::NewLC( *this ); - CMsvOperation* op = iMsgMapper->UpdateMessageFlagsAsyncL( + // Cmail change to synchronous call (UpdateMessageFlagsL) ignored, + // because it causes emulator & HW to freeze on 10.1 + CIpsPlgSingleOpWatcher* opW = CIpsPlgSingleOpWatcher::NewLC( *this ); + CMsvOperation* op = iMsgMapper->UpdateMessageFlagsAsyncL( msgId.Id(), aMessage, opW->iStatus ); - + if ( op ) { opW->SetOperation( op ); @@ -941,7 +1043,7 @@ else { CleanupStack::PopAndDestroy( opW ); - }*/ + } } else { @@ -949,6 +1051,37 @@ } } +// +/** + * + * @param aMailBoxId Mailbox id. + * @param aOperationObserver Operation observer. + * @param aRequestId The request id. + */ +void CIpsPlgSosBasePlugin::StoreMessagesL( + const TFSMailMsgId& /*aMailBox*/, + RPointerArray &messages, + MFSMailRequestObserver& aOperationObserver, + const TInt aRequestId ) + + { + CIpsPlgSingleOpWatcher* watcher = CIpsPlgSingleOpWatcher::NewL(*this); + CleanupStack::PushL(watcher); + CIpsPlgMailStorerOperation* op = + CIpsPlgMailStorerOperation::NewLC( + *iSession, + watcher->iStatus, + *this, + messages, + aOperationObserver, + aRequestId ); + + watcher->SetOperation(op); + iOperations.AppendL(watcher); + CleanupStack::Pop( 2, watcher ); + } +// + // ---------------------------------------------------------------------------- // CIpsPlgSosBasePlugin::GetMessagesL() // ---------------------------------------------------------------------------- @@ -1007,275 +1140,64 @@ // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- CFSMailMessagePart* CIpsPlgSosBasePlugin::NewChildPartFromFileL( + const TFSMailMsgId& /*aMailBoxId*/, + const TFSMailMsgId& /*aParentFolderId*/, + const TFSMailMsgId& /*aMessageId*/, + const TFSMailMsgId& /*aParentPartId*/, + const TDesC& /*aContentType*/, + const TDesC& /*aFilePath*/ ) + { + // not used any more + User::Leave(KErrFSMailPluginNotSupported); + return NULL; // prevents compiler warning + } + +// +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +void CIpsPlgSosBasePlugin::NewChildPartFromFileL( const TFSMailMsgId& aMailBoxId, const TFSMailMsgId& /* aParentFolderId */, const TFSMailMsgId& aMessageId, const TFSMailMsgId& /* aParentPartId */, const TDesC& aContentType, - const TDesC& aFilePath ) + const TDesC& aFilePath, + MFSMailRequestObserver& aOperationObserver, + const TInt aRequestId ) { FUNC_LOG; - CFSMailMessagePart* result ( NULL ); - CMsvEntry* cEntry( NULL ); - CImEmailMessage* message( NULL ); - RFile file; - TInt fileSize( 0 ); - TBool parentToMultipartAlternative( EFalse ); - - // Read attachment size - User::LeaveIfError( file.Open( iSession->FileSession(), aFilePath, EFileShareReadersOnly ) ); - - //in rare case that file has disappeared while sending - //we just won't get the size for it - file.Size( fileSize ); - file.Close(); - - // Take ownership of message entry objects since thanks to - // "clever" use of active scheduler waits we can re-enter - // this function leading to crashes if somebody clears the cache - // while this iteration still needs them - TakeMessageEntryLC( aMessageId.Id(), cEntry, message ); - - // Operation waiter needed to implement synchronous operation - // on the top of async API - CIpsPlgOperationWait* waiter = CIpsPlgOperationWait::NewL(); - CleanupStack::PushL( waiter ); - - // Initialize CMsvAttachment instance for the attachment creation - CMsvAttachment* info = CMsvAttachment::NewL( CMsvAttachment::EMsvFile ); - CleanupStack::PushL( info ); - info->SetAttachmentNameL( aFilePath ); - info->SetSize( fileSize ); - - // Start attachment creation - message->AttachmentManager().AddAttachmentL( - aFilePath, info, waiter->iStatus ); - CleanupStack::Pop( info ); // attachment manager takes ownership - - waiter->Start(); - CleanupStack::PopAndDestroy( waiter ); - - // Return message entry objects back to cache - CleanupStack::Pop( 2 ); // cEntry, message - ReturnMessageEntry( cEntry, message ); - - // Dig out the entry ID of the new attachment (unbelievable that - // there seems to be no better way to do this) - message->GetAttachmentsListL( cEntry->Entry().Id( ), - CImEmailMessage::EAllAttachments, CImEmailMessage::EThisMessageOnly ); - TKeyArrayFix key( 0, ECmpTInt32 ); - CMsvEntrySelection* attachmentIds = message->Selection().CopyLC(); - attachmentIds->Sort( key ); - if ( !attachmentIds->Count() ) - { - User::Leave( KErrGeneral ); - } - TMsvId newAttachmentId = (*attachmentIds)[ attachmentIds->Count()-1 ]; - CleanupStack::PopAndDestroy( attachmentIds ); - - CMsvEntry* cAtta = iSession->GetEntryL( newAttachmentId ); - CleanupStack::PushL( cAtta ); + CIpsPlgSingleOpWatcher* watcher = CIpsPlgSingleOpWatcher::NewLC(*this); + + CIpsPlgNewChildPartFromFileOperation* op = CIpsPlgNewChildPartFromFileOperation::NewL( + *iSession, + watcher->iStatus, + aMailBoxId, + aMessageId, + aContentType, + aFilePath, + aOperationObserver, + aRequestId, + iMsgMapper); + watcher->SetOperation( op ); - // Set filename to iDetails - TMsvEntry tEntry = cAtta->Entry(); - tEntry.iDetails.Set( aFilePath ); - cAtta->ChangeL( tEntry ); - - if( cAtta->HasStoreL() ) - { - CMsvStore* store = cAtta->EditStoreL(); - CleanupStack::PushL( store ); - CImMimeHeader* mimeHeader = CImMimeHeader::NewLC(); - - if( store->IsPresentL( KUidMsgFileMimeHeader ) ) - { - mimeHeader->RestoreL( *store ); - CDesC8Array& array = mimeHeader->ContentTypeParams(); - array.AppendL( KMethod ); - parentToMultipartAlternative = ETrue; - - if( aContentType.Find( KMimeTextCalRequest ) != KErrNotFound ) - { - array.AppendL( KRequest ); - } - else if( aContentType.Find( KMimeTextCalResponse ) != KErrNotFound ) - { - array.AppendL( KResponse ); - } - else if( aContentType.Find( KMimeTextCalCancel ) != KErrNotFound ) - { - array.AppendL( KCancel ); - } - else - { - parentToMultipartAlternative = EFalse; - } - mimeHeader->StoreWithoutCommitL( *store ); - store->CommitL(); - } - - CleanupStack::PopAndDestroy( 2, store ); - } - - if( parentToMultipartAlternative && - aFilePath.Find( _L(".ics")) != KErrNotFound ) - { - TMsvEntry tAttaEntry = cAtta->Entry(); - TMsvId id = tAttaEntry.Parent(); - CMsvEntry* cParent = iSession->GetEntryL( id ); - CleanupStack::PushL( cParent ); - - TMsvEmailEntry tEntry = cParent->Entry(); - tEntry.SetMessageFolderType( EFolderTypeAlternative ); - cParent->ChangeL( tEntry ); - - CleanupStack::PopAndDestroy( cParent ); - } - CleanupStack::PopAndDestroy( cAtta ); - - // Delete the message entries to get all the changes to disk and - // possible store locks released - CleanCachedMessageEntries(); - - // Create the FS message part object - result = iMsgMapper->GetMessagePartL( newAttachmentId, aMailBoxId, - aMessageId ); - - return result; + iOperations.AppendL( watcher ); + CleanupStack::Pop( watcher ); } +// // ---------------------------------------------------------------------------- -// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- CFSMailMessagePart* CIpsPlgSosBasePlugin::NewChildPartFromFileL( - const TFSMailMsgId& aMailBoxId, - const TFSMailMsgId& /* aParentFolderId */, - const TFSMailMsgId& aMessageId, - const TFSMailMsgId& /* aParentPartId */, - const TDesC& aContentType, - RFile& aFile ) + const TFSMailMsgId& /*aMailBoxId*/, + const TFSMailMsgId& /*aParentFolderId*/, + const TFSMailMsgId& /*aMessageId*/, + const TFSMailMsgId& /*aParentPartId*/, + const TDesC& /*aContentType*/, + RFile& /*aFile*/ ) { - FUNC_LOG; - - // Initialize helper variables - CFSMailMessagePart* result ( NULL ); - CMsvEntry* cEntry( NULL ); - CImEmailMessage* message( NULL ); - TInt fileSize( 0 ); - TBuf fileName; - - // Take ownership of message entry objects since thanks to - // "clever" use of active scheduler waits we can re-enter - // this function leading to crashes if somebody clears the cache - // while this iteration still needs them - TakeMessageEntryLC( aMessageId.Id(), cEntry, message ); - - // Operation waiter needed to implement synchronous operation - // on the top of async API - CIpsPlgOperationWait* waiter = CIpsPlgOperationWait::NewL(); - CleanupStack::PushL( waiter ); - - // Initialize CMsvAttachment instance for the attachment creation - CMsvAttachment* info = CMsvAttachment::NewL( CMsvAttachment::EMsvFile ); - CleanupStack::PushL( info ); - - // Read attachment size - User::LeaveIfError( aFile.Size( fileSize ) ); - info->SetSize( fileSize ); - - // Read attachment filename - User::LeaveIfError( aFile.FullName( fileName ) ); - info->SetAttachmentNameL( fileName ); - - message->AttachmentManager().AddAttachmentL( aFile, info, waiter->iStatus ); - CleanupStack::Pop( info ); // attachment manager takes ownership - - waiter->Start(); - CleanupStack::PopAndDestroy( waiter ); - - // Return message entry objects back to cache - CleanupStack::Pop( 2 ); // cEntry, message - ReturnMessageEntry( cEntry, message ); - - // Dig out the entry ID of the new attachment - message->GetAttachmentsListL( cEntry->Entry().Id( ), - CImEmailMessage::EAllAttachments, CImEmailMessage::EThisMessageOnly ); - TKeyArrayFix key( 0, ECmpTInt32 ); - CMsvEntrySelection* attachmentIds = message->Selection().CopyLC(); - attachmentIds->Sort( key ); - if ( !attachmentIds->Count() ) - { - User::Leave( KErrGeneral ); - } - TMsvId newAttachmentId = (*attachmentIds)[ attachmentIds->Count()-1 ]; - CleanupStack::PopAndDestroy( attachmentIds ); - - // Meeting request related handling - TBool parentToMultipartAlternative( EFalse ); - CMsvEntry* cAtta = iSession->GetEntryL( newAttachmentId ); - CleanupStack::PushL( cAtta ); - - // Set filename to iDetails - TMsvEntry tEntry = cAtta->Entry(); - tEntry.iDetails.Set( fileName ); - cAtta->ChangeL( tEntry ); - - if( cAtta->HasStoreL() ) - { - CMsvStore* store = cAtta->EditStoreL(); - CleanupStack::PushL( store ); - CImMimeHeader* mimeHeader = CImMimeHeader::NewLC(); - - if( store->IsPresentL( KUidMsgFileMimeHeader ) ) - { - mimeHeader->RestoreL( *store ); - CDesC8Array& array = mimeHeader->ContentTypeParams(); - array.AppendL( KMethod ); - parentToMultipartAlternative = ETrue; - - if( aContentType.Find( KMimeTextCalRequest ) != KErrNotFound ) - { - array.AppendL( KRequest ); - } - else if( aContentType.Find( KMimeTextCalResponse ) != KErrNotFound ) - { - array.AppendL( KResponse ); - } - else if( aContentType.Find( KMimeTextCalCancel ) != KErrNotFound ) - { - array.AppendL( KCancel ); - } - else - { - parentToMultipartAlternative = EFalse; - } - mimeHeader->StoreWithoutCommitL( *store ); - store->CommitL(); - } - CleanupStack::PopAndDestroy( 2, store ); - } - if( parentToMultipartAlternative && fileName.Find( _L(".ics")) != KErrNotFound ) - { - TMsvEntry tAttaEntry = cAtta->Entry(); - TMsvId id = tAttaEntry.Parent(); - CMsvEntry* cParent = iSession->GetEntryL( id ); - CleanupStack::PushL( cParent ); - - TMsvEmailEntry tEntry = cParent->Entry(); - tEntry.SetMessageFolderType( EFolderTypeAlternative ); - cParent->ChangeL( tEntry ); - - CleanupStack::PopAndDestroy( cParent ); - } - CleanupStack::PopAndDestroy( cAtta ); - - // Delete the message entries to get all the changes to disk and - // possible store locks released - CleanCachedMessageEntries(); - - // Create the FS message part object and return it - result = iMsgMapper->GetMessagePartL( newAttachmentId, aMailBoxId, - aMessageId ); - return result; + // not used any more + User::Leave(KErrFSMailPluginNotSupported); + return NULL; // prevents compiler warning } // ---------------------------------------------------------------------------- @@ -1297,56 +1219,48 @@ // ---------------------------------------------------------------------------- // void CIpsPlgSosBasePlugin::RemoveChildPartL( + const TFSMailMsgId& /*aMailBoxId*/, + const TFSMailMsgId& /*aParentFolderId*/, + const TFSMailMsgId& /*aMessageId*/, + const TFSMailMsgId& /*aParentPartId*/, + const TFSMailMsgId& /*aPartId*/) + { + // not used any more + User::Leave(KErrFSMailPluginNotSupported); + } + +// +// ---------------------------------------------------------------------------- +// Supports currently deletion of attachments and multipart structures +// which are represented as folders in Symbian store) +// ---------------------------------------------------------------------------- +// +void CIpsPlgSosBasePlugin::RemoveChildPartL( const TFSMailMsgId& /* aMailBoxId */, const TFSMailMsgId& /* aParentFolderId */, const TFSMailMsgId& aMessageId, const TFSMailMsgId& /* aParentPartId */, - const TFSMailMsgId& aPartId) - { + const TFSMailMsgId& aPartId, + MFSMailRequestObserver& aOperationObserver, + const TInt aRequestId ) + { FUNC_LOG; - TInt status( KErrNone ); - CMsvEntry* cEntry( NULL ); - TMsvEntry tEntry; - TMsvId serviceId; - status = iSession->GetEntry( aPartId.Id(), serviceId, tEntry ); - - if ( ( status == KErrNone ) && - ( tEntry.iType == KUidMsvAttachmentEntry ) ) - { - CImEmailMessage* message( NULL ); - - // We trust that the message ID really refers to a message - - // Take ownership of message entry objects since thanks to - // "clever" use of active scheduler waits we can re-enter - // this function leading to crashes if somebody clears the cache - // while this iteration still needs them - TakeMessageEntryLC( aMessageId.Id(), cEntry, message ); + CIpsPlgSingleOpWatcher* watcher = CIpsPlgSingleOpWatcher::NewLC(*this); + + CIpsPlgRemoveChildPartOperation* op = CIpsPlgRemoveChildPartOperation::NewL( + *iSession, + watcher->iStatus, + aMessageId, + aPartId, + aOperationObserver, + aRequestId); + watcher->SetOperation( op ); - MMsvAttachmentManager& attachmentMgr( message->AttachmentManager() ); - - CIpsPlgOperationWait* waiter = CIpsPlgOperationWait::NewL(); - CleanupStack::PushL( waiter ); - - attachmentMgr.RemoveAttachmentL( - (TMsvAttachmentId) aPartId.Id(), waiter->iStatus ); + iOperations.AppendL( watcher ); + CleanupStack::Pop( watcher ); - waiter->Start(); - CleanupStack::PopAndDestroy( waiter ); - - // Return message entry objects to cache - CleanupStack::Pop( 2 ); // cEntry, message - ReturnMessageEntry( cEntry, message ); - } - else if ( ( status == KErrNone ) && - ( tEntry.iType == KUidMsvFolderEntry ) ) - { - cEntry = iSession->GetEntryL( tEntry.Parent() ); - CleanupStack::PushL( cEntry ); - cEntry->DeleteL( tEntry.Id() ); - CleanupStack::PopAndDestroy( cEntry ); - } - } + } +// // ---------------------------------------------------------------------------- // The implementation supoorts the atachment and body parts at the moment. @@ -1369,8 +1283,9 @@ // The implementation bypass CImEmailMessage and its email's attachment // manager. Instead, it calls Symbian framework classes directly by // accessing the attachment entry. -// ---------------------------------------------------------------------------- -TInt CIpsPlgSosBasePlugin::GetMessagePartFileL( +// Qmail change: returns file handle for read/write +// ---------------------------------------------------------------------------- +TInt CIpsPlgSosBasePlugin::GetMessagePartFileL( const TFSMailMsgId& /* aMailBoxId */, const TFSMailMsgId& /* aParentFolderId */, const TFSMailMsgId& /* aMessageId */, @@ -1385,7 +1300,12 @@ TBool hasStore = cEntry->HasStoreL(); if ( hasStore ) { - store = cEntry->ReadStoreL(); +// + // We need to open store for edit to support multipart/alternative + // structure: we must have a possibility to modify text/html message part + //store = cEntry->ReadStoreL(); + store = cEntry->EditStoreL(); +// } if ( !store || !hasStore ) @@ -1398,7 +1318,12 @@ // It is assumed that the attachment file is always in the index 0 if ( attachmentMgr.AttachmentCount() ) { - aFileHandle = attachmentMgr.GetAttachmentFileL( 0 ); +// + // We need to open store for edit to support multipart/alternative + // structure: we must have a possibility to modify text/html message part + //aFileHandle = attachmentMgr.GetAttachmentFileL( 0 ); + aFileHandle = attachmentMgr.GetAttachmentFileForWriteL( 0 ); +// } else { @@ -1420,6 +1345,7 @@ const TDesC& aFilePath) { FUNC_LOG; + // CMsvEntry* cEntry = iSession->GetEntryL( aMessagePartId.Id() ); CleanupStack::PushL( cEntry ); CMsvStore* store = NULL; @@ -1452,6 +1378,7 @@ } CleanupStack::PopAndDestroy( store ); CleanupStack::PopAndDestroy( cEntry ); + // } // ---------------------------------------------------------------------------- @@ -1510,112 +1437,51 @@ const TDesC& aBuffer, const TFSMailMsgId& /* aMailBoxId */, const TFSMailMsgId& /* aParentFolderId */, - const TFSMailMsgId& aMessageId, + const TFSMailMsgId& /* aMessageId */, const TFSMailMsgId& aMessagePartId ) { FUNC_LOG; - CMsvEntry* cEntry( NULL ); - CImEmailMessage* message( NULL ); - - // Take ownership of message entry objects since thanks to - // "clever" use of active scheduler waits we can re-enter - // this function leading to crashes if somebody clears the cache - // while this iteration still needs them - TakeMessageEntryLC( aMessageId.Id(), cEntry, message ); + +// Rewritten in Qmail: CIpsPlgOperationWait is no longer used + // Notice that SetContentL sets only the content of text/plain message part: + // text/html part can be modified directly using GetMessagePartFileL + CMsvEntry* cEntry( NULL ); + CMsvStore* store = NULL; - if ( message ) - { - - message->GetBodyTextEntryIdL( - cEntry->Entry().Id(), CImEmailMessage::EThisMessageOnly ); - if ( message->Selection().Count() > 0 ) - { - TMsvId dummy; - TMsvEmailEntry newEmailMsg; - iSession->GetEntry( aMessageId.Id(), dummy, newEmailMsg ); - TMsvId parent = newEmailMsg.Parent(); - - if ( message->Selection()[0] == aMessagePartId.Id() || - newEmailMsg.ICalendar() ) - { - CIpsPlgOperationWait* wait = CIpsPlgOperationWait::NewLC( ); - CParaFormatLayer* globalParaLayer = CParaFormatLayer::NewL(); - CleanupStack::PushL(globalParaLayer); - CCharFormatLayer* globalCharLayer = CCharFormatLayer::NewL(); - CleanupStack::PushL(globalCharLayer); - CRichText* text = CRichText::NewL( globalParaLayer, globalCharLayer ); - CleanupStack::PushL( text ); - // insert text - text->InsertL(0, aBuffer ); - // synchronously - message->StoreBodyTextL( - cEntry->Entry().Id(), *text ,wait->iStatus ); - wait->Start(); - CleanupStack::PopAndDestroy( 4, wait ); - } - } - } - - // Return message entry objects to cache - CleanupStack::Pop( 2 ); // cEntry, message - ReturnMessageEntry( cEntry, message ); + // following code should fill text/plain content + cEntry = iSession->GetEntryL( aMessagePartId.Id() ); + CleanupStack::PushL( cEntry ); + TBool hasStore = cEntry->HasStoreL(); + if ( hasStore ) { + store = cEntry->EditStoreL(); + CleanupStack::PushL(store); + CParaFormatLayer* globalParaLayer = CParaFormatLayer::NewL(); + CleanupStack::PushL(globalParaLayer); + CCharFormatLayer* globalCharLayer = CCharFormatLayer::NewL(); + CleanupStack::PushL(globalCharLayer); + CRichText* text = CRichText::NewL( globalParaLayer, globalCharLayer ); + CleanupStack::PushL( text ); + // insert text + text->InsertL(0, aBuffer ); + store->StoreBodyTextL(*text); + store->CommitL(); + CleanupStack::PopAndDestroy( 4, store ); + } + CleanupStack::PopAndDestroy(cEntry); +// } // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- void CIpsPlgSosBasePlugin::RemovePartContentL( - const TFSMailMsgId& /* aMailBoxId */, - const TFSMailMsgId& /* aParentFolderId */, - const TFSMailMsgId& /* aMessageId */, - const RArray& aPartIds ) + const TFSMailMsgId& /*aMailBoxId*/, + const TFSMailMsgId& /*aParentFolderId*/, + const TFSMailMsgId& /*aMessageId*/, + const RArray& /*aPartIds*/ ) { - TInt count( aPartIds.Count() ); - - for( TInt i(0); i < count; i++ ) - { - CMsvEntry* cEntry = iSession->GetEntryL( aPartIds[i].Id() ); - CleanupStack::PushL( cEntry ); - CMsvStore* store = NULL; - TBool hasStore = cEntry->HasStoreL(); - if ( hasStore ) - { - store = cEntry->EditStoreL(); - } - - if ( !store || !hasStore ) - { - User::Leave( KErrNotFound ); - } - CleanupStack::PushL( store ); - MMsvAttachmentManager& attachmentMgr = store->AttachmentManagerL(); - - // It is assumed that the attachment file is always in the index 0 - if ( attachmentMgr.AttachmentCount() ) - { - // delete attachment file - CIpsPlgOperationWait* waiter = CIpsPlgOperationWait::NewLC(); - attachmentMgr.RemoveAttachmentL( 0, waiter->iStatus ); - waiter->Start(); - CleanupStack::PopAndDestroy( waiter ); - store->CommitL(); - - // clear complete flag - TMsvEntry tEntry( cEntry->Entry() ); - tEntry.SetComplete( EFalse ); - - waiter = CIpsPlgOperationWait::NewLC(); - CMsvOperation* ops = cEntry->ChangeL( tEntry, waiter->iStatus ); - CleanupStack::PushL( ops ); - waiter->Start(); - CleanupStack::PopAndDestroy( 2, waiter ); - } - else - { - User::Leave( KErrNotFound ); - } - CleanupStack::PopAndDestroy( store ); - CleanupStack::PopAndDestroy( cEntry ); - } + // + User::Leave( KErrFSMailPluginNotSupported ); + // } // ---------------------------------------------------------------------------- @@ -1639,8 +1505,29 @@ { } +// // ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +void CIpsPlgSosBasePlugin::StoreMessagePartsL( + RPointerArray& aMessageParts, + MFSMailRequestObserver& aOperationObserver, + const TInt aRequestId ) + { + CIpsPlgSingleOpWatcher* watcher = CIpsPlgSingleOpWatcher::NewL(*this); + CleanupStack::PushL(watcher); + CIpsPlgMessagePartStorerOperation* op = + CIpsPlgMessagePartStorerOperation::NewLC(*iSession, + watcher->iStatus, *this, aMessageParts, + aOperationObserver, aRequestId); + + watcher->SetOperation(op); + iOperations.AppendL(watcher); + CleanupStack::Pop( 2, watcher ); + } +// + // ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- void CIpsPlgSosBasePlugin::UnregisterRequestObserver( TInt /* aRequestId */) { } @@ -1652,8 +1539,10 @@ FUNC_LOG; CIpsPlgSingleOpWatcher* watcher = CIpsPlgSingleOpWatcher::NewL(*this); CleanupStack::PushL(watcher); +// CIpsPlgSmtpOperation* op = CIpsPlgSmtpOperation::NewLC( - *iSession, CActive::EPriorityStandard, watcher->iStatus, ETrue ); + *iSession, watcher->iStatus ); +// op->SetEventHandler(iEventHandler); watcher->SetOperation(op); CleanupStack::Pop( op ); // op added as member of watcher @@ -1662,24 +1551,54 @@ CleanupStack::Pop( watcher ); } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +void CIpsPlgSosBasePlugin::SendMessageL( CFSMailMessage& /*aMessage*/ ) + { + FUNC_LOG; + // + User::Leave( KErrFSMailPluginNotSupported ); + // + } + +// // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- -void CIpsPlgSosBasePlugin::SendMessageL( CFSMailMessage& aMessage ) +void CIpsPlgSosBasePlugin::SendMessageL( + CFSMailMessage& aMessage, + MFSMailRequestObserver& aOperationObserver, + const TInt aRequestId ) { FUNC_LOG; + // Not activated yet // is EFSMsgFlag_CalendarMsg enabled, // then move send to back ground process - if ( aMessage.GetFlags() & EFSMsgFlag_CalendarMsg ) - { - iEventHandler->SetNewPropertyEvent( - aMessage.GetMessageId().Id(), - KIPSSosSmtpEmptyOutboxNow, KErrNone ); - } - else - { - SendL( aMessage.GetMessageId() ); - } + //if ( aMessage.GetFlags() & EFSMsgFlag_CalendarMsg ) + // { + // iEventHandler->SetNewPropertyEvent( + // aMessage.GetMessageId().Id(), + // KIPSSosSmtpEmptyOutboxNow, KErrNone ); + // } + //else + // { + CIpsPlgSingleOpWatcher* watcher = + CIpsPlgSingleOpWatcher::NewLC(*this); + + // priority parameter has been removed + CIpsPlgSmtpOperation* op = CIpsPlgSmtpOperation::NewL( + *iSession, + watcher->iStatus, + &aOperationObserver, + aRequestId ); + watcher->SetOperation(op); // ownership is transferred + op->StartSendL( aMessage.GetMessageId().Id() ); + iOperations.AppendL(watcher); + CleanupStack::Pop( watcher ); + // } + // } +// // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- @@ -1774,7 +1693,7 @@ void CIpsPlgSosBasePlugin::DeleteMessagesByUidL( const TFSMailMsgId& /*aMailBoxId*/, const TFSMailMsgId& /*aFolderId*/, - const RArray& aMessages ) + const RArray& aMessages ) { FUNC_LOG; CMsvEntrySelection* sel=new(ELeave) CMsvEntrySelection; @@ -1783,97 +1702,71 @@ TInt count = aMessages.Count(); TMsvEntry tEntry; TMsvId service; - - TMsvEntry parentEntry; - // simulation of canceling deletion operation - if ( !count ) - { - if ( iMsvOpDeleteMessage ) - { - iMsvOpDeleteMessage->Cancel(); - } - - if ( iWaitDeleteMessage ) - { - iWaitDeleteMessage->Cancel(); - } - - delete iMsvOpDeleteMessage; - iMsvOpDeleteMessage = NULL; - delete iWaitDeleteMessage; - iWaitDeleteMessage = NULL; - delete icEntry; - icEntry = NULL; - } - else + for(TInt i=0; iGetEntry( 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 ); + iSession->GetEntry( aMessages[i].Id(), service, tEntry ); + //make sure that only messages get deleted. + if( tEntry.iType == KUidMsvMessageEntry ) + { + // + sel->AppendL( tEntry.Id() ); + // } } + + CIpsPlgSingleOpWatcher* watcher = CIpsPlgSingleOpWatcher::NewL( *this ); + CleanupStack::PushL( watcher ); + // + CMsvOperation* op = CIpsPlgDeleteOperation::NewL( *iSession, + watcher->iStatus, sel ); + // + watcher->SetOperation( op ); + iOperations.AppendL( watcher ); + CleanupStack::Pop( watcher ); + // + CleanupStack::Pop( sel ); + // + } + +// +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +void CIpsPlgSosBasePlugin::DeleteMessagesByUidL( + const TFSMailMsgId& /*aMailBoxId*/, + const TFSMailMsgId& /*aFolderId*/, + const RArray& aMessages, + MFSMailRequestObserver& aOperationObserver, + const TInt aRequestId) + { + FUNC_LOG; + CMsvEntrySelection* sel=new(ELeave) CMsvEntrySelection; + CleanupStack::PushL(sel); + + TInt count = aMessages.Count(); + TMsvEntry tEntry; + TMsvId service; - CleanupStack::PopAndDestroy( sel ); + for(TInt i=0; iGetEntry( aMessages[i].Id(), service, tEntry ); + //make sure that only messages get deleted. + if( tEntry.iType == KUidMsvMessageEntry ) + { + sel->AppendL( tEntry.Id() ); + } + } + + CIpsPlgSingleOpWatcher* watcher = CIpsPlgSingleOpWatcher::NewL( *this ); + CleanupStack::PushL( watcher ); + CMsvOperation* op = CIpsPlgDeleteOperation::NewL( *iSession, + watcher->iStatus, sel, aOperationObserver, aRequestId ); + watcher->SetOperation( op ); + iOperations.AppendL( watcher ); + CleanupStack::Pop( watcher ); + CleanupStack::Pop( sel ); } +// // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- @@ -1882,10 +1775,9 @@ MFSMailEventObserver& aObserver) { FUNC_LOG; - TUint32 key = iSettingsApi->CreateCenRepKeyL( // faulty CS warning - aMailboxId.Id(), - MtmId(), - CIpsSetDataStorer::EIpsSetDataLastModifiedH ); +// + TUint32 key(0); +// iEventHandler->SubscribeMailboxEventsL( aMailboxId, aObserver, key ); } @@ -1915,13 +1807,15 @@ { FUNC_LOG; TInt error = KErrNone; - error = iSettingsApi->HandleMailboxCreation( MtmId(), *iSession ); +// iSettingsApi not available in Qmail + /*error = iSettingsApi->HandleMailboxCreation( MtmId(), *iSession ); if ( error == KErrNotSupported ) { // this means that wizard data is not meaned for this plugin (instance) // just return KErrNone at the moment return KErrNone; - } + }*/ +// return error; } @@ -1955,45 +1849,35 @@ // ---------------------------------------------------------------------------- // method sets authentication popup data // ---------------------------------------------------------------------------- -void CIpsPlgSosBasePlugin::SetCredentialsL( const TFSMailMsgId& aMailBoxId, - const TDesC& /*aUsername*/, const TDesC& aPassword ) +// +void CIpsPlgSosBasePlugin::SetCredentialsL( const TFSMailMsgId& /*aMailBoxId*/, + const TDesC& /*aUsername*/, const TDesC& /*aPassword*/ ) { - FUNC_LOG; - TBool cancelled = EFalse; - - if ( aPassword.Length() > 0 ) - { - //Set new password and signal (possible) ongoing connect operation - CIpsSetDataApi* api = CIpsSetDataApi::NewL( *iSession ); - CleanupStack::PushL( api ); - - CMsvEntry* cEntry = iSession->GetEntryL( aMailBoxId.Id() ); - CleanupStack::PushL( cEntry ); - - RProcess process; - // only email server can set outgoing password - if ( process.SecureId() == FREESTYLE_FSSERVER_SID ) - { - if ( !iEventHandler->IncomingPass() ) - { - CMsvEntry* cTmp = iSession->GetEntryL( cEntry->Entry().iRelatedId ); - CleanupStack::PopAndDestroy( 1, cEntry ); - CleanupStack::PushL( cTmp ); - cEntry = cTmp; - } - } - - api->SetNewPasswordL( *cEntry, aPassword ); - - CleanupStack::PopAndDestroy( 2, api );//cEntry, api - - //now signal through eventhandler that credientials have been set - } - else - { - cancelled = ETrue; - } - iEventHandler->SignalCredientialsSetL( aMailBoxId.Id(), cancelled ); +// not used; should be removed +// FUNC_LOG; +// TBool cancelled = EFalse; +// +// if ( aPassword.Length() > 0 ) +// { +// //Set new password and signal (possible) ongoing connect operation +// //CIpsSetDataApi* api = CIpsSetDataApi::NewL( *iSession ); +// //CleanupStack::PushL( api ); +// +// //CMsvEntry* cEntry = iSession->GetEntryL( aMailBoxId.Id() ); +// //CleanupStack::PushL( cEntry ); +// +// //api->SetNewPasswordL( *cEntry, aPassword ); +// +// //CleanupStack::PopAndDestroy( 2, api );//cEntry, api +// +// //now signal through eventhandler that credientials have been set +// } +// else +// { +// cancelled = ETrue; +// } +// iEventHandler->SignalCredientialsSetL( aMailBoxId.Id(), cancelled ); +// } // ---------------------------------------------------------------------------- @@ -2189,18 +2073,18 @@ { FUNC_LOG; CIpsPlgSingleOpWatcher* opWatcher = iOperations[aOpArrayIndex]; - + +// removed; does nothing // The operations matches, handle it in protocol plugin...if needed. - TRAP_IGNORE( HandleOpCompletedL( *opWatcher, aCompleteCode ) ); - + //TRAP_IGNORE( HandleOpCompletedL( *opWatcher, aCompleteCode ) ); +// const CIpsPlgBaseOperation* op = opWatcher->BaseOperation(); TMsvId service = KErrNotFound; TUint pluginId = PluginId(); if ( op && ( op->IpsOpType() == EIpsOpTypeImap4SyncOp || op->IpsOpType() == EIpsOpTypePop3SyncOp || - op->IpsOpType() == EIpsOpTypeImap4PopulateOp || - op->IpsOpType() == EIpsOpTypePop3PopulateOp ) ) + op->IpsOpType() == EIpsOpTypeImap4PopulateOp ) ) { service = op->Service(); } @@ -2253,37 +2137,14 @@ textBodyPart->FetchedContentSize() ); TPtr bPtr( body->Des() ); origMsgTextBodyPart->GetContentToBufferL( bPtr, 0 ); - 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 ); + HBufC* content = HBufC::NewLC( + hPtr.Length() + bPtr.Length() ); + TPtr cPtr( content->Des() ); 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 ); } @@ -2295,38 +2156,17 @@ // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -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, const TInt aRequestId, - TBool aRemoveAccountAlso ) + TBool /*aRemoveAccountAlso*/ ) { FUNC_LOG; TMsvId service = aMailBoxId.Id(); TMsvEntry tEntry; TMsvId serv; iSession->GetEntry( service, serv, tEntry ); - - CancelSyncL( aMailBoxId ); if ( tEntry.Connected() ) { @@ -2340,10 +2180,14 @@ sel->AppendL( service ); - CIpsPlgBaseOperation* op = CIpsPlgDisconnectOp::NewL( *iSession, - watcher->iStatus, service, ActivityTimerL( aMailBoxId ), - aMailBoxId, aObserver, aRequestId, - aRemoveAccountAlso ); + CIpsPlgBaseOperation* op = CIpsPlgDisconnectOp::NewL( + *iSession, + watcher->iStatus, + service, + ActivityTimerL( aMailBoxId ), + aMailBoxId, + &aObserver, + aRequestId ); watcher->SetOperation( op ); CleanupStack::PopAndDestroy( sel ); @@ -2384,8 +2228,9 @@ FUNC_LOG; CIpsPlgSingleOpWatcher* watcher = CIpsPlgSingleOpWatcher::NewL(*this); CleanupStack::PushL(watcher); - CIpsPlgSmtpOperation* op = CIpsPlgSmtpOperation::NewLC( - *iSession, CActive::EPriorityStandard, watcher->iStatus, ETrue ); +// + CIpsPlgSmtpOperation* op = CIpsPlgSmtpOperation::NewLC( *iSession, watcher->iStatus ); +// op->SetEventHandler(iEventHandler); watcher->SetOperation(op); op->EmptyOutboxFromPendingMessagesL( aMailBoxId.Id() ); @@ -2571,15 +2416,15 @@ // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- -void CIpsPlgSosBasePlugin::SetMailboxName( - const TFSMailMsgId& aMailboxId, - const TDesC& aMailboxName ) +void CIpsPlgSosBasePlugin::SetMailboxName( + const TFSMailMsgId& aMailboxId, + const TDesC& /*aMailboxName*/ ) { FUNC_LOG; TMsvEntry tEntry; TMsvId service; iSession->GetEntry( aMailboxId.Id(), service, tEntry ); - TRAP_IGNORE( iSettingsApi->SetMailboxNameL( tEntry, aMailboxName ) ); +// iSettingsApi removed } // --------------------------------------------------------------------------- @@ -2620,24 +2465,71 @@ } } } -// --------------------------------------------------------------------------- -// finds and returns extension + +// new function // --------------------------------------------------------------------------- -// -CEmailExtension* CIpsPlgSosBasePlugin::ExtensionL( const TUid& aInterfaceUid ) +// --------------------------------------------------------------------------- +TBool CIpsPlgSosBasePlugin::HasOperations( const TFSMailMsgId& aMailboxId ) { FUNC_LOG; - - // search for settings extension - CEmailExtension* extension = CExtendableEmail::ExtensionL( aInterfaceUid ); - - // if not found create settings extension - if ( extension == NULL && aInterfaceUid == KEmailSettingExtensionUid) + TBool ret( EFalse ); + for ( TInt i = 0; i < iOperations.Count(); i++ ) { - extension = new (ELeave) CEmailSettingsExtensionImpl(iSession); - CleanupStack::PushL( extension ); - iExtensions.AddL( extension ); - CleanupStack::Pop(); + if( iOperations[i]->BaseOperation() && + iOperations[i]->BaseOperation()->FSMailboxId() == aMailboxId ) + { + ret = ETrue; + } } - return extension; + return ret; } +// +// +// --------------------------------------------------------------------------- +// CIpsPlgImap4Plugin::HandleActiveFolderChangeL +// --------------------------------------------------------------------------- +// +void CIpsPlgSosBasePlugin::HandleActiveFolderChangeL( + const TFSMailMsgId& aActiveMailboxId, + const TFSMailMsgId& aActiveFolderId) + { + TMsvId service; + TMsvEntry folder; + iSession->GetEntry( aActiveFolderId.Id(), service, folder ); + + + //currently, no actions unless this is inbox + //also, if id is '0', it means inbox before first sync...it doesn't really exist yet + if( folder.iDetails.CompareF( KIpsPlgInbox ) == 0 || folder.Id() == 0 || + ( folder.iMtm == KSenduiMtmPop3Uid ) && + ( folder.iType == KUidMsvServiceEntry ) && + ( folder.iServiceId == aActiveFolderId.Id() ) ) + { + //folder is inbox + if ( iSyncStateHandler->GetMailboxIpsState( aActiveMailboxId.Id() ) + == KIpsSosEmailSyncStarted ) + { + //we won't do anything if sync is already started + return; + } + + //check are we in polling mode + NmIpsSosExtendedSettingsManager* eMgr= + new NmIpsSosExtendedSettingsManager(aActiveMailboxId.Id()); + + QVariant value; + bool ok = eMgr->readSetting(IpsServices::ReceptionActiveProfile, value); + delete eMgr; + + if ( ok ) + { + TInt profile = value.toInt(); + if ( profile != IpsServices::EmailSyncProfileManualFetch ) + { + // let's sync + GoOnlineL(aActiveMailboxId); + } + } + } + } +//