wmdrm/wmdrmengine/wmdrmserver/server/src/slotenumeratorcache.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:52:27 +0200
changeset 0 95b198f216e5
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* 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 "slotenumeratorcache.h"
#include "enumeratordata.h"
#include "wmdrmserver.h"

#define _LOGGING_FILE L"wmdrmserver.txt"

#include "flogger.h"
#include "logfn.h"

CSlotEnumeratorCache* CSlotEnumeratorCache::NewL( CWmDrmServer* aServer )
    {
    CSlotEnumeratorCache* self = new (ELeave) CSlotEnumeratorCache( aServer );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop();
    return self;
    }

void CSlotEnumeratorCache::ConstructL()
    {
    LOGFN( "CSlotEnumeratorCache::ConstructL" );
    iMaxCachedEnumerators = KDefaultMaxCachedEnumerators;
    }
    
CSlotEnumeratorCache::CSlotEnumeratorCache(
    CWmDrmServer* aServer):
    iServer( aServer )
    {
    LOGFN( "CSlotEnumeratorCache::CSlotEnumeratorCache" );
    }

CSlotEnumeratorCache::~CSlotEnumeratorCache()
    {
    LOGFN( "CSlotEnumeratorCache::~CSlotEnumeratorCache" );
    iEnumeratorCache.ResetAndDestroy();
    iEnumeratorCache.Close();
    }

CEnumeratorData* CSlotEnumeratorCache::GetEnumeratorDataL(
    const TDesC8& aStore,
    const TDesC8& aNamespace,
    const TDesC8& aHashKey )
    {
    CEnumeratorData* r = NULL;
    TInt i = 0;
    
    LOGFN( "CSlotEnumeratorCache::GetEnumeratorDataL" );
    LOG( aNamespace );
    LOG( aHashKey );
    for ( i = 0; r == NULL && i < iEnumeratorCache.Count(); i++ )
        {
        CEnumeratorData* data = iEnumeratorCache[i];
        if ( /*data->iStore == aStore &&*/
             data->iNamespace == aNamespace &&
             data->iHashKey == aHashKey )
            {
            r = iEnumeratorCache[i];
            Claim( r );
            }
        }
    if ( r == NULL )
        {
        Cleanup();
        r = CEnumeratorData::NewL( iServer, aStore, aNamespace, aHashKey );
        CleanupStack::PushL( r );
        iEnumeratorCache.AppendL( r );
        Claim( r );
        CleanupStack::Pop( r );
        }
    return r;
    }

void CSlotEnumeratorCache::Claim( CEnumeratorData* aData )
    {
    LOGFN( "CSlotEnumeratorCache::ClaimL" );
    aData->iReferences++;
    }

void CSlotEnumeratorCache::Release( CEnumeratorData* aData )
    {
    LOGFN( "CSlotEnumeratorCache::ReleaseL" );
    aData->iReferences--;
    }

TInt CSlotEnumeratorCache::AddEntryL(
    const TDesC8& /*aStore*/,
    const TDesC8& aNamespace,
    const TDesC8& aHashKey,
    const TDesC8& aUniqueKey )
    {
    TInt r = KErrNone;
    TInt i;
    CEnumeratorData* entry = NULL;
    HBufC8* fileName;
    
    LOGFNR( "CSlotEnumeratorCache::AddEntryL", r );
    LOG( aNamespace );
    LOG( aHashKey );
    LOG( aUniqueKey );
    for ( i = 0; entry == NULL && i < iEnumeratorCache.Count(); i++ )
        {
        CEnumeratorData* data = iEnumeratorCache[i];
        if ( /*data->iStore == aStore &&*/
             data->iNamespace == aNamespace &&
             data->iHashKey == aHashKey )
            {
            entry = iEnumeratorCache[i];
            }
        }
    if ( entry != NULL )
        {
        i = 0;
        while ( i < entry->iEntries.Count() && *entry->iEntries[i] != aUniqueKey )
            {
            i++;
            }
        if ( i == entry->iEntries.Count() )
            {
            fileName = aUniqueKey.AllocLC();
            entry->iEntries.AppendL( fileName );
            CleanupStack::Pop( fileName );
            }
        }
    return r;
    }

TInt CSlotEnumeratorCache::DeleteEntryL(
    const TDesC8& /*aStore*/,
    const TDesC8& aNamespace,
    const TDesC8& aHashKey,
    const TDesC8& aUniqueKey )
    {
    TInt r = KErrNone;
    TInt i;
    CEnumeratorData* entry = NULL;
    
    LOGFNR( "CSlotEnumeratorCache::DeleteEntryL", r );
    
    for ( i = 0; entry == NULL && i < iEnumeratorCache.Count(); i++ )
        {
        CEnumeratorData* data = iEnumeratorCache[i];
        if ( /*data->iStore == aStore &&*/
             data->iNamespace == aNamespace &&
             data->iHashKey == aHashKey )
            {
            entry = iEnumeratorCache[i];
            }
        }
    if ( entry != NULL )
        {
        i = 0;
        while ( i < entry->iEntries.Count() && *entry->iEntries[i] != aUniqueKey )
            {
            i++;
            }
        if ( i < entry->iEntries.Count() )
            {
            delete entry->iEntries[i];
            entry->iEntries.Remove( i );
            }
        }
    return r;
    }

void CSlotEnumeratorCache::Cleanup()
    {
    TInt i = 0;
    TInt minReferencesCount = 0;
    TInt minReferencesIndex = 0;
    
    LOGFN( "CSlotEnumeratorCache::CleanupL" );
    LOG3( "Used: %d, max: %d", iEnumeratorCache.Count(), iMaxCachedEnumerators );
    
    if ( iEnumeratorCache.Count() >= iMaxCachedEnumerators )
        {
        minReferencesCount = iEnumeratorCache[minReferencesIndex]->iReferences;
        
        while ( iEnumeratorCache.Count() >= iMaxCachedEnumerators && i < iMaxCachedEnumerators ) 
            {
            if ( iEnumeratorCache[i]->iReferences == 0 )
                {
                LOG2( "Releasing %d", i );
                delete iEnumeratorCache[i];
                iEnumeratorCache.Remove( i );
                }
            else if ( iEnumeratorCache[i]->iReferences < minReferencesCount )
                {
                minReferencesCount = iEnumeratorCache[i]->iReferences;
                minReferencesIndex = i;
                }
            i++;
            }
    
        if ( iEnumeratorCache.Count() >= iMaxCachedEnumerators ) 
            {
            LOG2( "Force Releasing %d", minReferencesIndex );
            delete iEnumeratorCache[minReferencesIndex];
            iEnumeratorCache.Remove( minReferencesIndex );
            }
        }
    }