diff -r 000000000000 -r 8466d47a6819 emailservices/emailclientapi/src/emailmailboxcache.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailclientapi/src/emailmailboxcache.cpp Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,209 @@ +/* +* Copyright (c) 2009 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: This file implements class CEmailMailboxCache. +* +*/ + +#include "emailmailboxcache.h" +#include "emailapiutils.h" + +static const TInt KCacheGranularity = 2; + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CEmailMailboxCache* CEmailMailboxCache::NewL() + { + CEmailMailboxCache* cache = new ( ELeave ) CEmailMailboxCache(); + return cache; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CEmailMailboxCache::~CEmailMailboxCache() + { + iEntries.Close(); + } + +// --------------------------------------------------------------------------- +// Start of cache transaction with clenanup support +// --------------------------------------------------------------------------- +// +void CEmailMailboxCache::StartCachingPushL() + { + TCleanupItem item( &CEmailMailboxCache::CleanupOp, this ); + CleanupStack::PushL( item ); + iState = ECaching; + iEntries.Reset(); + } + +// --------------------------------------------------------------------------- +// End of cache transaction +// --------------------------------------------------------------------------- +// +void CEmailMailboxCache::EndCachingPop() + { + iState = EComplete; + CleanupStack::Pop(); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CEmailMailboxCache::IsCached() const + { + return iState == EComplete; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CEmailMailboxCache::AddMailboxL( + CPluginData& aPluginData, + const TMailboxId& aMailboxId ) + { + if ( iState != ECaching ) + { + User::Leave( KErrNotReady ); + } + if ( FindById( aMailboxId ) == KErrNotFound ) + { + TCacheEntry entry( &aPluginData, aMailboxId ); + iEntries.AppendL( entry ); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CPluginData* CEmailMailboxCache::PluginDataL( const TMailboxId& aMailboxId ) const + { + CPluginData* pdata = NULL; + const TInt index( FindById( aMailboxId ) ); + if ( index != KErrNotFound ) + { + const TCacheEntry& entry = iEntries[ index ]; + pdata = entry.iPluginData; + } + return pdata; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CPluginData* CEmailMailboxCache::PluginDataL( const TUid& aPluginId ) const + { + CPluginData* pdata = NULL; + const TInt index( FindByPluginIdL( aPluginId ) ); + if ( index != KErrNotFound ) + { + const TCacheEntry& entry = iEntries[ index ]; + pdata = entry.iPluginData; + } + return pdata; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CEmailMailboxCache::GetIdsL( REmailMailboxIdArray& aIdArray ) const + { + if ( iState != EComplete ) + { + // cache not up to date + User::Leave( KErrNotReady ); + } + for ( TInt i=0; i < iEntries.Count(); i++ ) + { + TMailboxId id = iEntries[i].iMailboxId; + aIdArray.AppendL( id ); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CEmailMailboxCache::FindById( const TMailboxId& aMailboxId ) const + { + TIdentityRelation rel( CEmailMailboxCache::Equals ); + + // don't care about plugin data because this is seach key only and + // mailbox id is used for search + TCacheEntry entry( NULL, aMailboxId ); + return iEntries.Find( entry, rel ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CEmailMailboxCache::FindByPluginIdL( const TUid& aPluginId ) const + { + TIdentityRelation rel( CEmailMailboxCache::PluginEquals ); + CPluginData* key = new ( ELeave ) CPluginData( aPluginId ); + TCacheEntry entry( key, TMailboxId() ); + TInt index = iEntries.Find( entry, rel ); + delete key; + return index; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CEmailMailboxCache::Equals( const TCacheEntry& a1, const TCacheEntry& a2 ) + { + return ( a1.iMailboxId == a2.iMailboxId ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CEmailMailboxCache::PluginEquals( const TCacheEntry& a1, const TCacheEntry& a2 ) + { + return ( a1.iPluginData->Uid() == a2.iPluginData->Uid() ); + } + +// --------------------------------------------------------------------------- +// Cleanup +// --------------------------------------------------------------------------- +// +void CEmailMailboxCache::CleanupOp( TAny* aAny ) + { + CEmailMailboxCache* cache = reinterpret_cast( aAny ); + cache->iEntries.Reset(); + cache->iState = EEmpty; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CEmailMailboxCache::CEmailMailboxCache() : + iState( EEmpty ), + iEntries( KCacheGranularity ) + { + } + +// End of file.