ncdengine/provider/storage/src/ncddbstoragemanager.cpp
author Simon Howkins <simonh@symbian.org>
Mon, 22 Nov 2010 12:04:39 +0000
branchRCL_3
changeset 84 e6c5e34cd9b9
parent 0 ba25891c3a9e
permissions -rw-r--r--
Adjusted to avoid exports, etc, from a top-level bld.inf

/*
* 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:  
*
*/


#include "ncddbstoragemanager.h"

#include "ncdstoragebase.h"
#include "ncdstoragepanics.pan"

#include "catalogsdebug.h"

#include <f32file.h>
#include <bautils.h>

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
CNcdDbStorageManager* CNcdDbStorageManager::NewLC(
    RFs& aFs,
    const TDesC& aStorageUid,
    const TDesC& aStorageFolder,
    const TDesC& aStorageName )
    {
    CNcdDbStorageManager* manager = new (ELeave) CNcdDbStorageManager;
    CleanupStack::PushL( manager );
    manager->ConstructL( aFs, aStorageUid, aStorageFolder, aStorageName );
    return manager;
    }



// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
CNcdDbStorageManager::~CNcdDbStorageManager()
    {
    DLTRACEIN(("this-ptr: %X", this));        
    delete iStorage;
    delete iData;
    }


// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
CNcdDbStorageManager::CNcdDbStorageManager() :
    iLocallyOpenCount( 0 ),
    iForceOpen( EFalse )
    {
    DLTRACEIN(( "this-ptr: %X", this ));
    }


// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
void CNcdDbStorageManager::ConstructL( 
    RFs& aFs,
    const TDesC& aStorageUid, 
    const TDesC& aStorageFolder, const TDesC& aStorageName )
    {
    DLTRACEIN((""));    
    iStorage = CNcdStorageBase::NewL( aFs, aStorageUid, aStorageFolder, 
        aStorageName );

    DLTRACE(("CNcdStorageBase created"));
    iStorage->SetListener( this );

    User::LeaveIfError( iStorage->Open() );

    // Create data object
    iData = new (ELeave) CNcdDbStorageManagerData( this );

    DLTRACEOUT( ("") );
    }


// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
MNcdStorageItem* CNcdDbStorageManager::StorageItemL( const TDesC& aUid, 
    TInt aType )
    {
    return (MNcdStorageItem*)iStorage->StorageItemL( aUid, aType );
    }


// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
void CNcdDbStorageManager::StorageItemsL( 
    RPointerArray<MNcdStorageItem>& aItems )
    {
    iStorage->StorageItemsL( aItems );
    }


// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
void CNcdDbStorageManager::RemoveItemsL( 
    const RArray<RNcdDatabaseItems>& aDoNotRemoveItems )
    {
    iStorage->RemoveItemsL( aDoNotRemoveItems );
    }


// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
void CNcdDbStorageManager::Begin()
    {
    iForceOpen = ETrue;
    iData->StorageOpened();
    }

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
void CNcdDbStorageManager::CommitL()
    {
    DLTRACEIN((""));
    iForceOpen = EFalse;
    iData->StorageClosedL();
    }

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
void CNcdDbStorageManager::Rollback()
    {
    iForceOpen = EFalse;
    iData->Rollback();
    }

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
TBool CNcdDbStorageManager::ItemExistsInStorageL( 
    MNcdStorageItem& aStorageItem )
    {
    return ItemExistsInStorageL( aStorageItem.Uid(), aStorageItem.Type() );
    }


// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
TBool CNcdDbStorageManager::ItemExistsInStorageL( const TDesC& aUid, 
    TInt aType )
    {
    return iStorage->ItemExistsInStorageL( aUid, aType );
    }

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
MNcdDatabaseStorage::TNcdDatabaseSize CNcdDbStorageManager::Size() const
    {
    return iStorage->Size();
    }


// ---------------------------------------------------------------------------
// Compact
// ---------------------------------------------------------------------------
//
void CNcdDbStorageManager::Compact() 
    {
    DLTRACEIN((""));
    CommitCachedItems();
    iStorage->Compact();
    }


// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
void CNcdDbStorageManager::CacheOpened()
    {
    DLTRACEIN(("this: %x", this));
    iLocallyOpenCount++;
    iData->StorageOpened();
    }

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
void CNcdDbStorageManager::CacheReadyL()
    {
    DLTRACEIN(("this: %x", this));
    iLocallyOpenCount--;
    iData->StorageClosedL();

    DLTRACEOUT((""));
    }

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
TInt CNcdDbStorageManager::CommitCachedItems()
    {
    DLTRACEIN(("this: %x", this));
    iForceOpen = EFalse;

    TInt err = iStorage->Commit();

    if( err == KErrNone )
        {
        iLocallyOpenCount = 0;
        }
    DLTRACEOUT(("err: %d", err));
    return err;
    }


// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
void CNcdDbStorageManager::NotifyRollback()
    {
    iLocallyOpenCount--;
    iData->Rollback();
    }


// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
void CNcdDbStorageManager::RollbackItems()
    {
    iLocallyOpenCount = 0;
    iForceOpen = EFalse;

    iStorage->Rollback();

    }


// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
CNcdDbStorageManager::CNcdDbStorageManagerData::CNcdDbStorageManagerData( 
    CNcdDbStorageManager* aRoot ) :
    iRoot( aRoot ),
    iOpenStorages( 0 )
    {
    }

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
CNcdDbStorageManager::CNcdDbStorageManagerData::~CNcdDbStorageManagerData()
    {
    }


// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
void CNcdDbStorageManager::CNcdDbStorageManagerData::StorageOpened()
    {
    DLTRACEIN(("this: %x, open storages: %d", this, iOpenStorages + 1 ));
    iOpenStorages++;
    }


// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
void CNcdDbStorageManager::CNcdDbStorageManagerData::StorageClosedL()
    {
    DLTRACEIN(("OpenStorages: %d", iOpenStorages));
    if ( iOpenStorages != 0 ) 
        {
        iOpenStorages--;
        }
    else
        {
        DLTRACE(("All storages were already closed by tried to close one again"));
        }
        
    if( iOpenStorages == 0 )
        {
        DLTRACE(("Committing cached items"));
        TInt err = iRoot->CommitCachedItems();
        DLINFO(( "Commit error: %d", err ));
        User::LeaveIfError( err );
        }

    DLTRACEOUT((""));
    }


// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
TInt CNcdDbStorageManager::CNcdDbStorageManagerData::OpenStorages()
    {
    DLTRACEIN(( "this: %x, open storages: %d", this, iOpenStorages ));
    return iOpenStorages;
    }

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
void CNcdDbStorageManager::CNcdDbStorageManagerData::Rollback()
    {
    if( iOpenStorages > 0 )
        {
        iRoot->RollbackItems();
        iOpenStorages = 0;
        }
    }


// ---------------------------------------------------------------------------
// UID getter
// ---------------------------------------------------------------------------
//
const TDesC& CNcdDbStorageManager::Uid() const
    {
    return iStorage->Uid();
    }