omaprovisioning/provisioning/ProvisioningEngine/Src/CWPBindingContextManager.cpp
author hgs
Fri, 15 Oct 2010 11:46:45 +0530
changeset 73 ae69c2e8bc34
parent 0 b497e44ab2fc
permissions -rw-r--r--
201041

/*
* Copyright (c) 2002 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:  Multiple context manager.
*
*/


//  INCLUDE FILES
#include "CWPBindingContextManager.h"
#include <d32dbms.h>
#include <sysutil.h>
#include "MWPContextExtension.h"
#include "MWPContextExtensionArray.h"
#include "WPEngineDebug.h"
#include "ProvisioningDebug.h"


// CONSTANTS
/// Size of the database grows 16 bytes plus the actual data. Tested empirically.
const TInt KNewSaveDataSizeEstimate = 16;

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CWPBindingContextManager::CWPBindingContextManager
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CWPBindingContextManager::CWPBindingContextManager()
	{
	}

// -----------------------------------------------------------------------------
// CWPBindingContextManager::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CWPBindingContextManager::ConstructL()
	{
    CWPMultiContextManager::ConstructL();
	}

// -----------------------------------------------------------------------------
// CWPBindingContextManager::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CWPBindingContextManager* CWPBindingContextManager::NewL()
	{
	CWPBindingContextManager* self = NewLC();
	CleanupStack::Pop();
	
	return self;
	}

// -----------------------------------------------------------------------------
// CWPBindingContextManager::NewLC
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CWPBindingContextManager* CWPBindingContextManager::NewLC()
	{
	CWPBindingContextManager* self = new( ELeave ) CWPBindingContextManager;
	
	CleanupStack::PushL( self );
	self->ConstructL();
	
	return self;
	}

// Destructor
CWPBindingContextManager::~CWPBindingContextManager()
	{
	}

// -----------------------------------------------------------------------------
// CWPBindingContextManager::DeleteContextL
// -----------------------------------------------------------------------------
//
void CWPBindingContextManager::DeleteContextL( MWPContextExtensionArray& aArray, 
                                              TUint32 aUid )
	{
    CheckDatabaseL();

    // Make sure that all context data has been deleted
    while( DeleteContextDataL( aArray, aUid ) )
    	{
    	}

    // Delete the actual context
    CWPMultiContextManager::DeleteContextL( aArray, aUid );
    }

// -----------------------------------------------------------------------------
// CWPBindingContextManager::DeleteContextDataL
// -----------------------------------------------------------------------------
//
TBool CWPBindingContextManager::DeleteContextDataL( 
    MWPContextExtensionArray& aArray, TUint32 aUid )
	{
    CheckDatabaseL();

    // Call DeleteL() for all related adapter extensions
    RDbTable table;
    OpenLC( KDbTableData, table );
    CDbColSet* colset = table.ColSetL();
    TInt adapterIdCol( colset->ColNo( KDbColumnDataAdapterId ) );
    TInt saveDataCol( colset->ColNo( KDbColumnDataSaveData ) );
    delete colset;
    
    User::LeaveIfError( table.SetIndex( KDbIndexDataContextId ) );
    TBool found( table.SeekL( TDbSeekKey( TUint( aUid ) ) ) );
    if( found )
        {
        table.GetL();
        TUint32 adapterId( table.ColUint32( adapterIdCol ) );
        TPtrC8 saveData( table.ColDes8( saveDataCol ) );
        
        for( TInt i( 0 ); i < aArray.MwpceCount(); i++ )
            {
            if( aArray.MwpcePoint( i ).Uid() == adapterId )
                {
                DVA( "DeleteContextDataL: Deleting data using adapter %08x", 
                    adapterId );
                aArray.MwpcePoint( i ).DeleteL( saveData );
                DVA( "DeleteContextDataL: Deleted data using adapter %08x", 
                    adapterId );
                }
            }
        table.DeleteL();
        }

    CleanupStack::PopAndDestroy(); // table
    return found;
    }

// -----------------------------------------------------------------------------
// CWPBindingContextManager::ContextDataCountL
// -----------------------------------------------------------------------------
//
TInt CWPBindingContextManager::ContextDataCountL( TUint32 aUid )
	{
	FLOG( _L( "[Provisioning] CWPBindingContextManager::ContextDataCountL:" ) );
    CheckDatabaseL();

    // Call DeleteL() for all related adapter extensions
    RDbTable table;
    OpenLC( KDbTableData, table, RDbRowSet::EReadOnly );
    CDbColSet* colset = table.ColSetL();
    TInt contextId( colset->ColNo( KDbColumnDataContextId ) );
    delete colset;
    
    User::LeaveIfError( table.SetIndex( KDbIndexDataContextId ) );
    TInt found( 0 );	
    if(table.SeekL( TDbSeekKey( TUint( aUid ) ) ))
    {    	
    	while( table.AtRow() && 
        (table.GetL(), table.ColUint32( contextId ) == aUid ) )
        {
        found++;
        table.NextL();
        }
    }
    FTRACE(RDebug::Print(_L("[Provisioning] CWPBindingContextManager::ContextDataCountL count (%d)"), found));
    CleanupStack::PopAndDestroy(); // table
    return found;
    }

// -----------------------------------------------------------------------------
// CWPBindingContextManager::SaveL
// -----------------------------------------------------------------------------
//
void CWPBindingContextManager::SaveL( 
    MWPContextExtension& aExtension, TInt aItem )
	{
	FLOG( _L( "[Provisioning] CWPBindingContextManager::SaveL:" ) );
	
    CheckDatabaseL();

    // Grab save data only if a context is active
    if( CurrentContextL() != KWPMgrUidNoContext )
        {
        FLOG( _L( "[Provisioning] CWPBindingContextManager::SaveL: 1" ) );
        TPtrC8 saveData( aExtension.SaveDataL( aItem ) );
        if( saveData != KNullDesC8 )
            {
            if( SysUtil::FFSSpaceBelowCriticalLevelL( 
                NULL, KNewSaveDataSizeEstimate+saveData.Length() ) )
                {
                User::Leave( KErrDiskFull );
                }

            RDbTable table;
            OpenLC( KDbTableData, table );

            CDbColSet* colset = table.ColSetL();
            TInt contextIdCol( colset->ColNo( KDbColumnDataContextId ) );
            TInt adapterIdCol( colset->ColNo( KDbColumnDataAdapterId ) );
            TInt saveDataCol( colset->ColNo( KDbColumnDataSaveData ) );
            delete colset;

            DatabaseBeginLC();

            InsertBeginLC( table );
            table.SetColL( contextIdCol, CurrentContextL() );
            table.SetColL( adapterIdCol, aExtension.Uid() );
            table.SetColL( saveDataCol, saveData );
            InsertCommitLP( table );
            
            DatabaseCommitLP();
            CleanupStack::PopAndDestroy(); // table
            }
        }
    FLOG( _L( "[Provisioning] CWPBindingContextManager::SaveL: done" ) );
	}

//  End of File