--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wmdrm/wmdrmengine/wmdrmserver/server/src/slotdatacache.cpp Thu Dec 17 08:52:27 2009 +0200
@@ -0,0 +1,187 @@
+/*
+* Copyright (c) 2007 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: WMDRM Server implementation
+*
+*/
+
+
+#include "wmdrmserver.h"
+#include "slotdata.h"
+#include "slotdatacache.h"
+#include "wmdrmkeystorage.h"
+#include "wmdrmdb.h"
+
+#define _LOGGING_FILE L"wmdrmserver.txt"
+
+#include "flogger.h"
+#include "logfn.h"
+
+
+CSlotDataCache* CSlotDataCache::NewL( CWmDrmServer* aServer )
+ {
+ CSlotDataCache* self = new (ELeave) CSlotDataCache( aServer );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+void CSlotDataCache::ConstructL()
+ {
+ LOGFN( "CSlotDataCache::ConstructL" );
+#ifndef __WINSCW__
+ iKeyStorage = CWmDrmKeyStorage::NewL();
+ if ( !iKeyStorage )
+ {
+ User::Leave( KErrNotSupported );
+ }
+#endif // __WINSCW__
+ iMaxCachedSlots = KDefaultMaxCachedSlots;
+ }
+
+CSlotDataCache::CSlotDataCache(
+ CWmDrmServer* aServer):
+ iServer( aServer )
+ {
+ }
+
+CSlotDataCache::~CSlotDataCache()
+ {
+ iSlotCache.ResetAndDestroy();
+ iSlotCache.Close();
+ delete iKeyStorage;
+ }
+
+CSlotData* CSlotDataCache::GetSlotDataL(
+ const TDesC8& aStore,
+ const TDesC8& aNamespace,
+ const TDesC8& aHashKey,
+ const TDesC8& aUniqueKey )
+ {
+ CSlotData* r = NULL;
+ TInt i = 0;
+
+ LOGFN( "CSlotDataCache::GetSlotDataL" );
+ LOG( aNamespace );
+ LOG( aHashKey );
+ LOG( aUniqueKey );
+ for ( i = 0; r == NULL && i < iSlotCache.Count(); i++ )
+ {
+ CSlotData* data = iSlotCache[i];
+ if ( /*iSlotCache[i]->iStore == aStore &&*/
+ iSlotCache[i]->iNamespace == aNamespace &&
+ iSlotCache[i]->iHashKey == aHashKey &&
+ iSlotCache[i]->iUniqueKey == aUniqueKey )
+ {
+ r = iSlotCache[i];
+ Claim( r );
+ }
+ }
+ if ( r == NULL )
+ {
+ Cleanup();
+ r = CSlotData::NewL( iServer,
+ aStore,
+ aNamespace,
+ aHashKey,
+ aUniqueKey );
+ CleanupStack::PushL( r );
+ iSlotCache.AppendL( r );
+ Claim( r );
+ CleanupStack::Pop( r );
+ }
+ return r;
+ }
+
+void CSlotDataCache::Claim( CSlotData* aSlot )
+ {
+ LOGFN( "CSlotDataCache::ClaimL" );
+ aSlot->iReferences++;
+ }
+
+TInt CSlotDataCache::Delete( CSlotData* aSlot )
+ {
+ TInt r = KErrNone;
+ LOGFNR( "CSlotDataCache::Delete", r );
+ aSlot->CloseFile();
+ TRAP( r, iServer->Db()->DeleteRecordL( aSlot->iStore,
+ aSlot->iNamespace,
+ aSlot->iHashKey,
+ aSlot->iUniqueKey ) );
+ return r;
+ }
+
+void CSlotDataCache::Release( CSlotData* aSlot )
+ {
+ TInt i = 0;
+
+ LOGFN( "CSlotDataCache::ReleaseL" );
+ while ( i < iSlotCache.Count() && iSlotCache[i] != aSlot )
+ {
+ i++;
+ }
+ if ( i < iSlotCache.Count() )
+ {
+ iSlotCache[i]->iReferences--;
+ }
+ }
+
+void CSlotDataCache::Cleanup()
+ {
+ TInt i = 0;
+ TInt minReferencesCount = 0;
+ TInt minReferencesIndex = 0;
+
+ LOGFN( "CSlotDataCache::CleanupL" );
+ LOG3( "Used: %d, max: %d", iSlotCache.Count(), iMaxCachedSlots );
+
+ if ( iSlotCache.Count() >= iMaxCachedSlots )
+ {
+ minReferencesCount = iSlotCache[minReferencesIndex]->iReferences;
+
+ while ( iSlotCache.Count() >= iMaxCachedSlots && i < iMaxCachedSlots )
+ {
+ if ( iSlotCache[i]->iReferences == 0 )
+ {
+ LOG2( "Releasing %d", i );
+ delete iSlotCache[i];
+ iSlotCache.Remove( i );
+ }
+ else if ( iSlotCache[i]->iReferences < minReferencesCount )
+ {
+ minReferencesCount = iSlotCache[i]->iReferences;
+ minReferencesIndex = i;
+ }
+ i++;
+ }
+
+ if ( iSlotCache.Count() >= iMaxCachedSlots )
+ {
+ LOG2( "Force Releasing %d", minReferencesIndex );
+ delete iSlotCache[minReferencesIndex];
+ iSlotCache.Remove( minReferencesIndex );
+ }
+ }
+ }
+
+void CSlotDataCache::FlushL()
+ {
+ TInt i;
+
+ LOGFN( "CSlotDataCache::FlushL" );
+ for ( i = 0; i < iSlotCache.Count(); i++ )
+ {
+ iSlotCache[i]->FlushL();
+ }
+ }