diff -r 000000000000 -r 8466d47a6819 emailservices/emailstore/base_plugin/src/basepluginmisc.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/emailservices/emailstore/base_plugin/src/basepluginmisc.cpp Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,646 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Email interface implementation + utilities.
+*
+*/
+
+
+
+//
+#include "MsgStore.h"
+#include "MsgStoreSearchCriteria.h"
+#include "MFSMailBoxSearchObserver.h"
+//
+
+#include "BasePlugin.h"
+#include "BasePluginPanic.h"
+#include "baseplugincommonutils.h"
+#include "baseplugindelayedopsprivate.h"
+
+/**
+ * Base plugin has no particular id.
+ */
+EXPORT_C TUint CBasePlugin::GetPluginId()
+ {
+ return 0;
+ }
+
+
+/**
+ *
+ */
+EXPORT_C TFSMailBoxStatus CBasePlugin::GetMailBoxStatus(
+ const TFSMailMsgId& /*aMailBoxId*/ )
+ {
+ return EFSMailBoxOnline;
+ }
+
+
+/**
+ *
+ */
+EXPORT_C TBool CBasePlugin::MailboxHasCapabilityL(
+ TFSMailBoxCapabilities /*aCapability*/,
+ TFSMailMsgId /*aMailBoxId*/ )
+ {
+ return EFalse;
+ }
+
+
+/**
+ *
+ */
+EXPORT_C TInt CBasePlugin::WizardDataAvailableL()
+ {
+ return KErrNotSupported;
+ }
+
+
+/**
+ *
+ */
+EXPORT_C void CBasePlugin::AuthenticateL(
+ MFSMailRequestObserver& /*aOperationObserver*/,
+ TInt /*aRequestId*/ )
+ {
+
+ }
+
+
+/**
+ */
+EXPORT_C void CBasePlugin::SetCredentialsL(
+ const TFSMailMsgId& /* aMailBoxId */,
+ const TDesC& /* aUsername */,
+ const TDesC& /* aPassword */ )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+
+/**
+ *
+ */
+EXPORT_C TDesC& CBasePlugin::GetBrandingIdL( const TFSMailMsgId& aMailboxId )
+ {
+ CMailboxInfo& mailbox = GetMailboxInfoL( aMailboxId.Id() );
+ return *mailbox.iBrandingId;
+ }
+
+
+/**
+ *
+ */
+EXPORT_C TInt CBasePlugin::CancelSyncL( const TFSMailMsgId& /*aMailBoxId*/ )
+ {
+ return KErrNotSupported;
+ }
+
+
+#pragma mark -
+#pragma mark --- SEARCH ---
+
+
+/**
+ *
+ */
+class CSearchHandler : public CBase, public MMsgStoreSearchClient
+ {
+ public:
+ CSearchHandler(
+ MFSMailBoxSearchObserver& aFsObserver,
+ CBasePlugin& aBasePlugin,
+ const TFSMailMsgId& aMailBox )
+ : iFsObserver( aFsObserver ), iBasePlugin( aBasePlugin ), iMailBox( aMailBox )
+ {
+ };
+
+ ~CSearchHandler()
+ {
+ TRAP_IGNORE( iFsObserver.SearchCompletedL() );
+ };
+
+ public:
+ void MatchFound(
+ CMsgStorePropertyContainer*& aMessageSummary )
+ {
+ TRAP_IGNORE( MatchFoundL( aMessageSummary ) );
+ };
+
+ void MatchFoundL(
+ CMsgStorePropertyContainer*& aMessageSummary )
+ {
+ TFSMailMsgId msgId( iBasePlugin.GetPluginId(), aMessageSummary->Id() );
+
+ CFSMailMessage* fsMsg = CFSMailMessage::NewLC( msgId );
+
+ fsMsg->SetContentType( KNullDesC() );
+ fsMsg->SetContentDescription( KNullDesC() );
+ fsMsg->SetContentDisposition( KNullDesC() );
+ fsMsg->SetMailBoxId( iMailBox );
+
+ iBasePlugin.TranslateMsgStorePropsL( iMailBox, *aMessageSummary, *fsMsg );
+
+ CleanupStack::Pop( fsMsg );
+ iFsObserver.MatchFoundL( fsMsg );
+ };
+
+ void SearchCompleted()
+ {
+ delete this;
+ };
+
+ private:
+ MFSMailBoxSearchObserver& iFsObserver;
+ CBasePlugin& iBasePlugin;
+ TFSMailMsgId iMailBox;
+ };
+
+
+/**
+ *
+ */
+EXPORT_C void CBasePlugin::SearchL(
+ const TFSMailMsgId& aMailBoxId,
+ const RArray& aFolderIds,
+ const RPointerArray& aSearchStrings,
+ const TFSMailSortCriteria& aSortCriteria,
+ MFSMailBoxSearchObserver& aSearchObserver )
+
+ {
+ /**@ search result details?*/
+
+ RMsgStoreSearchCriteria criteria;
+ CleanupClosePushL( criteria );
+
+ criteria.iSortBy = static_cast( aSortCriteria.iField - 1 );
+ criteria.iSortOrder = static_cast( aSortCriteria.iOrder );
+
+ TInt count = aSearchStrings.Count();
+ for ( TInt i = 0; i < count; i++ )
+ {
+ criteria.AddSearchStringL( *(aSearchStrings[i]) );
+ }
+
+ count = aFolderIds.Count();
+ for ( TInt i = 0; i < count; i++ )
+ {
+ criteria.AddFolderId( aFolderIds[i].Id() );
+ }
+
+ criteria.AddResultPropertyL( KMsgStorePropertyReceivedAt );
+ criteria.AddResultPropertyL( KMsgStorePropertyFlags );
+ criteria.AddResultPropertyL( KMsgStorePropertySize );
+ criteria.AddResultPropertyL( KMsgStorePropertyFrom );
+ criteria.AddResultPropertyL( KMsgStorePropertySubject );
+
+ /**@ figure the lifecycle mgmnt of the handler.*/
+ CSearchHandler* searchHandler = new (ELeave) CSearchHandler( aSearchObserver, *this, aMailBoxId );
+ CleanupStack::PushL( searchHandler );
+
+ CMailboxInfo& mailBox = GetMailboxInfoL( aMailBoxId.Id() );
+ mailBox().SearchL( criteria, *searchHandler );
+
+ CleanupStack::Pop( searchHandler );
+ CleanupStack::PopAndDestroy( &criteria );
+ }
+
+
+/**
+ *
+ */
+EXPORT_C void CBasePlugin::CancelSearch(
+ const TFSMailMsgId& aMailBoxId )
+
+ {
+ TRAP_IGNORE( DoCancelSearchL( aMailBoxId ) );
+ }
+
+
+/**
+ *
+ */
+EXPORT_C void CBasePlugin::ClearSearchResultCache(
+ const TFSMailMsgId& aMailBoxId )
+
+ {
+ TRAP_IGNORE( DoClearSearchResultCacheL( aMailBoxId ) );
+ }
+
+
+#pragma mark --- "MFSMAILPLUGIN - SYNC PLUGIN CONTROL" ---
+
+
+/**
+ *
+ */
+EXPORT_C void CBasePlugin::GoOfflineL(
+ const TFSMailMsgId& /*aMailBoxId*/ )
+ {
+ }
+
+
+/**
+ *
+ */
+EXPORT_C void CBasePlugin::GoOnlineL(
+ const TFSMailMsgId& /*aMailBoxId*/ )
+ {
+ }
+
+
+/**
+ *
+ */
+EXPORT_C void CBasePlugin::RefreshNowL(
+ const TFSMailMsgId& /*aMailBoxId*/,
+ MFSMailRequestObserver& /*aOperationObserver*/,
+ TInt /*aRequestId*/ )
+ {
+
+ }
+
+
+#pragma mark -
+#pragma mark --- MRU SUPPORT ---
+
+
+/**
+ *
+ */
+EXPORT_C MDesCArray* CBasePlugin::GetMrusL(
+ const TFSMailMsgId& aMailBoxId )
+
+ {
+ CMailboxInfo& mailBox = GetMailboxInfoL( aMailBoxId.Id() );
+
+ RPointerArray addressArray;
+ CleanupResetAndDestroyClosePushL( addressArray );
+ mailBox().MruAddressesL( addressArray );
+
+ //defione consts to avoid codescanner errors
+ const TUint KDefaultGranularity = 8;
+
+ TInt granularity = addressArray.Count() > 0 ? 2 * addressArray.Count() : KDefaultGranularity;
+ CDesCArrayFlat* result = new (ELeave) CDesCArrayFlat( granularity );
+ CleanupStack::PushL( result );
+
+ TInt count = addressArray.Count();
+ for ( TInt i = 0; i < count; i++ )
+ {
+ result->AppendL( addressArray[i]->DisplayName() );
+ result->AppendL( addressArray[i]->EmailAddress() );
+ }
+
+ CleanupStack::Pop( result );
+ CleanupStack::PopAndDestroy( &addressArray );
+
+ return result;
+ }
+
+
+/**
+ *
+ */
+EXPORT_C void CBasePlugin::SetMrusL(
+ const TFSMailMsgId& aMailBoxId,
+ MDesCArray* aNewMruList )
+
+ {
+ CMailboxInfo& mailBox = GetMailboxInfoL( aMailBoxId.Id() );
+
+ __ASSERT_DEBUG(
+ 0 == ( aNewMruList->MdcaCount() % 2 ),
+ ::BasePluginPanic( ESetMrusInvalidAssert ) );
+
+ RPointerArray addressArray;
+ CleanupResetAndDestroyClosePushL( addressArray );
+
+ CMsgStoreAddress* address;
+ for ( TInt i = 0; i < aNewMruList->MdcaCount(); i+=2 )
+ {
+ TPtrC display = aNewMruList->MdcaPoint( i );
+ TPtrC email = aNewMruList->MdcaPoint( 1 + i );
+
+ address = CMsgStoreAddress::NewL( email, display );
+ CleanupStack::PushL( address );
+ addressArray.AppendL( address );
+ CleanupStack::Pop( address );
+ }
+
+ mailBox().AddMruAddressesL( addressArray );
+ CleanupStack::PopAndDestroy( &addressArray );
+ }
+
+
+#pragma mark --- "MFSMAILPLUGINAPI - STATUS INFO" ---
+
+
+/**
+ *
+ */
+EXPORT_C TFSProgress CBasePlugin::StatusL( TInt /*aRequestId*/ )
+ {
+ TFSProgress result = { TFSProgress::EFSStatus_Waiting, 0, 0, 0 };
+ return result;
+ }
+
+
+/**
+ * Concrete plugins need to call the base plugin's implementation.
+ * @param aRequestId
+ */
+EXPORT_C void CBasePlugin::CancelL( TInt aRequestId )
+ {
+ //find the fetch request and notify the observer.
+ TInt count = iReqs.Count();
+ for ( TInt i = 0; i < count; i++ )
+ {
+ if ( iReqs[i]->iRequestId == aRequestId )
+ {
+ CFetchRequester* request = iReqs[i];
+
+ TFSProgress progress;
+ progress.iProgressStatus = TFSProgress::EFSStatus_RequestCancelled;
+ progress.iCounter = progress.iMaxCount = 1;
+ progress.iError = KErrNone;
+ request->iObserver.RequestResponseL( progress, aRequestId );
+
+ iReqs.Remove( i );
+ delete request;
+ break;
+ }
+ }
+ }
+
+
+/**
+ *
+ */
+EXPORT_C const TFSProgress CBasePlugin::GetLastSyncStatusL(
+ const TFSMailMsgId& /*aMailBoxId*/ )
+
+ {
+ User::Leave( KErrNotSupported );
+
+ TFSProgress result = { TFSProgress::EFSStatus_Waiting, 0, 0, 0 };
+ return result;
+ }
+
+
+/**
+ *
+ */
+EXPORT_C TSSMailSyncState CBasePlugin::CurrentSyncState(
+ const TFSMailMsgId& /*aMailboxId*/ )
+ {
+ return Idle;
+ }
+
+
+/**
+ *
+ */
+EXPORT_C CMsgStoreAccount* CBasePlugin::GetAccountForMsgBoxL(
+ const TFSMailMsgId& aMailboxId )
+
+ {
+ CMsgStoreAccount* result = NULL;
+
+ RPointerArray< CMsgStoreAccount > accounts;
+ iMsgStore->AccountsL( accounts );
+ CleanupResetAndDestroyClosePushL( accounts );
+
+ TInt count = accounts.Count();
+ for ( TInt i = 0; i < count; i++ )
+ {
+ if ( accounts[i]->Owner() == GetPluginId() )
+ {
+ CMsgStoreMailBox* msbox = iMsgStore->OpenAccountL( *accounts[i] );
+ CleanupStack::PushL( msbox );
+
+ if ( msbox->Id() == aMailboxId.Id() )
+ {
+ CleanupStack::PopAndDestroy( msbox );
+ result = accounts[i];
+ accounts.Remove( i );
+ break;
+ }
+
+ CleanupStack::PopAndDestroy( msbox );
+ }
+ }
+
+ CleanupStack::PopAndDestroy( &accounts );
+
+ return result;
+ }
+
+/**
+ *
+ */
+void CBasePlugin::DoCancelSearchL(
+ const TFSMailMsgId& aMailBoxId )
+
+ {
+ CMailboxInfo& mailBox = GetMailboxInfoL( aMailBoxId.Id() );
+ mailBox().CancelSearch();
+ }
+
+void CBasePlugin::DoClearSearchResultCacheL(
+ const TFSMailMsgId& aMailBoxId )
+
+ {
+ CMailboxInfo& mailBox = GetMailboxInfoL( aMailBoxId.Id() );
+ mailBox().ClearSearchResultCache();
+ }
+
+/**
+ *
+ */
+EXPORT_C /*virtual*/ void CBasePlugin::SetMailboxName(
+ const TFSMailMsgId& /*aMailboxId*/,
+ const TDesC& /*aMailboxName*/ )
+ {
+ }
+
+/**
+ *
+ */
+/*protected*/ EXPORT_C void CBasePlugin::ResetCache()
+ {
+ __LOG_ENTER_SUPPRESS( "ResetCache" );
+
+ ResetBodyCache();
+
+ iCacheLine.iMsgChildren.ResetAndDestroy();
+ iCacheLine.iMsgChildren.Close();
+
+ delete iCacheLine.iMsg;
+ iCacheLine.iMsg = NULL;
+
+ __LOG_WRITE_INFO( "Reset the base plugin msg and msg parts cache." );
+ }
+
+/**
+ *
+ */
+/*protected*/ EXPORT_C void CBasePlugin::ResetBodyCache()
+ {
+ __LOG_ENTER_SUPPRESS( "ResetCache" );
+ iCacheLine.iBodyChildren.ResetAndDestroy();
+ iCacheLine.iBodyChildren.Close();
+
+ delete iCacheLine.iBody;
+ iCacheLine.iBody = NULL;
+
+ __LOG_WRITE_INFO( "Reset the base plugin body and body parts cache." );
+ }
+
+/**
+ *
+ */
+/*protected*/ EXPORT_C CMsgStoreMessage* CBasePlugin::GetCachedMsgL(
+ TMsgStoreId aMailBoxId,
+ TMsgStoreId aMsgId )
+ {
+ __LOG_ENTER_SUPPRESS( "GetCachedMsgL" );
+ CMsgStoreMessage* result = NULL;
+
+ if ( iCacheLine.iMsg )
+ {
+ if ( aMsgId == iCacheLine.iMsg->Id() )
+ {
+ __LOG_WRITE8_FORMAT1_INFO( "Using cached msg, id: 0x%X.", aMsgId );
+ result = iCacheLine.iMsg;
+ }
+ else
+ {
+ ResetCache();
+ }
+ }
+
+ if ( NULL == result )
+ {
+ CMailboxInfo& mailBox = GetMailboxInfoL( aMailBoxId );
+ iCacheLine.iMsg = mailBox().FetchMessageL( aMsgId, KMsgStoreInvalidId );
+ result = iCacheLine.iMsg;
+ }
+
+ return result;
+ }
+
+
+/**
+ *
+ */
+/*protected*/
+EXPORT_C CMsgStoreMessagePart* CBasePlugin::GetCachedBodyL(
+ TMsgStoreId aPartId )
+ {
+ __LOG_ENTER_SUPPRESS( "GetCachedBodyL" );
+ __ASSERT_DEBUG( NULL != iCacheLine.iMsg,
+ BasePluginPanic( EInvalidMsgStoreCacheState ) );
+
+ CMsgStoreMessagePart* result = NULL;
+
+ if ( iCacheLine.iBody && aPartId == iCacheLine.iBody->Id() )
+ {
+ __LOG_WRITE8_FORMAT1_INFO(
+ "Using cached body part, id: 0x%X.", aPartId );
+ result = iCacheLine.iBody;
+ }
+ else
+ {
+ ResetBodyCache();
+ iCacheLine.iBody = iCacheLine.iMsg->ChildPartL( aPartId, ETrue );
+ }
+
+ return result;
+ }
+
+/**
+ *
+ */
+/*protected*/
+EXPORT_C RPointerArray& CBasePlugin::GetCachedMsgChildrenL()
+ {
+ __LOG_ENTER_SUPPRESS( "GetCachedMsgChildrenL" );
+
+ __ASSERT_DEBUG( NULL != iCacheLine.iMsg,
+ BasePluginPanic( EInvalidMsgStoreCacheState ) );
+
+ if ( 0 == iCacheLine.iMsgChildren.Count() )
+ {
+ iCacheLine.iMsg->ChildPartsL( iCacheLine.iMsgChildren );
+ }
+ else
+ {
+ __LOG_WRITE8_FORMAT1_INFO( "Using cached msg children, count: %d.",
+ iCacheLine.iMsgChildren.Count() );
+ }
+
+ return iCacheLine.iMsgChildren;
+ }
+
+/**
+ *
+ */
+/*protected*/
+EXPORT_C RPointerArray& CBasePlugin::GetCachedBodyChildrenL()
+ {
+ __LOG_ENTER_SUPPRESS( "GetCachedBodyChildrenL" );
+
+ __ASSERT_DEBUG( NULL != iCacheLine.iBody,
+ BasePluginPanic( EInvalidMsgStoreCacheState ) );
+
+ if ( 0 == iCacheLine.iBodyChildren.Count() )
+ {
+ iCacheLine.iBody->ChildPartsL( iCacheLine.iBodyChildren );
+ }
+ else
+ {
+ __LOG_WRITE8_FORMAT1_INFO( "Using cached body children, count: %d.",
+ iCacheLine.iBodyChildren.Count() );
+ }
+
+ return iCacheLine.iBodyChildren;
+ }
+
+/**
+ *
+ */
+/*protected*/ EXPORT_C void CBasePlugin::InvalidateCacheIfNecessary(
+ TMsgStoreId aId,
+ TMsgStoreId aParentId,
+ TMsgStoreId aOtherId )
+ {
+ if ( iCacheLine.iMsg )
+ {
+ TMsgStoreId id = iCacheLine.iMsg->Id();
+ if ( aId == id || aParentId == id || aOtherId == id )
+ {
+ ResetCache();
+ }
+ }
+ }
+
+
+/**
+ *
+ */
+/*public*/ EXPORT_C MDelayedOpsManager& CBasePlugin::GetDelayedOpsManager()
+ {
+ return *iDelayedOpsManager;
+ }