uiservicetabsettings/src/cvimpstsettingscenrep.cpp
author Simon Howkins <simonh@symbian.org>
Mon, 29 Nov 2010 11:18:43 +0000
branchRCL_3
changeset 37 7506649dda4d
parent 0 5e5d6b214f4f
permissions -rw-r--r--
Corrected path to files being exported - not in the same dir as bld.inf

/*
* Copyright (c) 2008 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:  vimpstsettings store implementation.
*
*/


// INCLUDE FILES

#include 	<e32std.h>
#include    <centralrepository.h>

#include    "cvimpstsettingscenrep.h"
#include	"cvimpstsettings.h"
#include	"cvimpstsettingskeyvaluepair.h"
#include    "cvimpstsettingskeyvaluepairs.h"
#include	"vimpstsettingsstorecenrepuids.h"
#include    "vimpstsettingsstoredefinitions.h"
#include    "rvimpstsettingsreleasearray.h"


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

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

// -----------------------------------------------------------------------------
// CVIMPSTSettingsCenRep::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CVIMPSTSettingsCenRep::ConstructL( )
    {
    iRepository = CRepository::NewL( KCRUidIMStore ); 
    }


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

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

// -----------------------------------------------------------------------------
// CVIMPSTSettingsCenRep::~CVIMPSTSettingsCenRep
// Destructor
// -----------------------------------------------------------------------------
//
CVIMPSTSettingsCenRep::~CVIMPSTSettingsCenRep()
    {   
    delete iRepository;
    }



// -----------------------------------------------------------------------------
// CVIMPSTSettingsCenRep::StoreNewSAPL()
// Stores new SAP in central repository
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CVIMPSTSettingsCenRep::UpdateOldSettingsL( TUint32& aServiceId, CVIMPSTSettings* aSettings )
    {  

    // no documentation for StartTransaction() return values, leave if any error
    User::LeaveIfError( iRepository->StartTransaction( CRepository::EReadWriteTransaction ) );

    iRepository->CleanupCancelTransactionPushL();	

    const RPointerArray< CVIMPSTSettingsKeyValuePair >& pairs( aSettings->KeyValuePairs().Pairs() );


    //First delete old key-value pairs 	
    RArray<TUint32> foundPairs;
    CleanupClosePushL( foundPairs );
    iRepository->FindL( EKeyValuePairBase + aServiceId, KSAPPairsMask, foundPairs );
    TInt oldCount( foundPairs.Count() );
    for( TInt i( 0 ); i < oldCount; ++i )
        {
        User::LeaveIfError( iRepository->Delete( foundPairs[i] ) );
        }

    TInt count( pairs.Count() );
    RVIMPSTSettingsReleaseArray tempArray;
    CleanupClosePushL( tempArray );
    for( TInt i( 0 );i < count; ++i )
        {
        //HBufC ownership transfers here
        HBufC* valuePairFlat = pairs[i]->KeyValuePairFlatLC();
        User::LeaveIfError( iRepository->Create( EKeyValuePairBase + i + aServiceId,
                *valuePairFlat ) );
        // CRepository->Create() is not copying the pointed data during transaction
        // so these must be stored until the transaction has completed
        tempArray.AppendL( valuePairFlat );
        CleanupStack::Pop( valuePairFlat );
        }

    TUint32 err( KErrNone );
    //passed err will be silently consumed because the value is of no use to client
    User::LeaveIfError( iRepository->CommitTransaction( err ) );	
    CleanupStack::PopAndDestroy( 3 ); //temparray, foundpairs, transaction
	
    }

// -----------------------------------------------------------------------------
// CVIMPSTSettingsCenRep::GetSAPL()
// Gets SAP from central repository
// (other items were commented in a header).
// -----------------------------------------------------------------------------

void CVIMPSTSettingsCenRep::GetSettingsL( TUint32& aServiceId, CVIMPSTSettings* aSettings )
	{
	TRAPD( err, DoGetSettingsL( aServiceId, aSettings ) );
	if( err )
		{
		User::Leave( err );
		}
	}

// -----------------------------------------------------------------------------
// CVIMPSTSettingsCenRep::DoGetSAPL()
// Does the actual get operation
// (other items were commented in a header).
// -----------------------------------------------------------------------------

void CVIMPSTSettingsCenRep::DoGetSettingsL( TUint32& aServiceId, CVIMPSTSettings* aSettings )
	{
	TBool transaction( StartOwnTransaction( CRepository::EReadTransaction ) );
	if( transaction )
	    {
	    iRepository->CleanupCancelTransactionPushL();
	    }

	HBufC* tmpBuffer = HBufC::NewLC( NCentralRepositoryConstants::KMaxUnicodeStringLength );
	TPtr tmpPtr( tmpBuffer->Des() );

	RPointerArray< CVIMPSTSettingsKeyValuePair >& pairs( aSettings->KeyValuePairs().Pairs() );
	pairs.ResetAndDestroy();

	RArray<TUint32> foundPairs;
	CleanupClosePushL( foundPairs );
	iRepository->FindL( EKeyValuePairBase + aServiceId, KSAPPairsMask, foundPairs );
	TInt count( foundPairs.Count() );

	for( TInt i( 0 );i < count; ++i )
	    {
	    TPtr valuePairFlatPtr( tmpBuffer->Des() );

	    User::LeaveIfError(
	            iRepository->Get( foundPairs[ i ],
	                    valuePairFlatPtr ) );

	    // parse the key-value pair descriptor

	    CVIMPSTSettingsKeyValuePair* pair = CVIMPSTSettingsKeyValuePair::NewLC( valuePairFlatPtr );

	    pairs.AppendL( pair );

	    CleanupStack::Pop( pair );
	    }

	if( transaction )
	    {
	    TUint32 err( KErrNone );
	    User::LeaveIfError( iRepository->CommitTransaction( err ) );
	    CleanupStack::PopAndDestroy(); // transaction
	    }
	CleanupStack::PopAndDestroy( 2 ); // foundPairs, tmpBuffer	
	}


// -----------------------------------------------------------------------------
// CVIMPSTSettingsCenRep::StartOwnTransaction()
// Starts new transaction if there is no ongoing transaction
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TBool CVIMPSTSettingsCenRep::StartOwnTransaction( TInt aMode )
    {
     /*currently the API TransactionState() has been removed from 9.2
     * the API TransactionState was added for the synchronization purpose
     * from meco point of view, as of now we are no where, same key value is not updated across processes or exe's
     * this can be considered as a temporary fix and more analysis has to done on this
     * to provide a complete fix.
     */
    //TInt transaction( iRepository->TransactionState() );

    // if( !transaction )
    //  {
    iRepository->StartTransaction( static_cast<CRepository::TTransactionMode>( aMode ) );
    return ETrue;
    //  }
    //return EFalse;
    }

// -----------------------------------------------------------------------------
// CVIMPSTSettingsCenRep::Repository()
// Starts new transaction if there is no ongoing transaction
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
CRepository* CVIMPSTSettingsCenRep::Repository( )const
    {
    return iRepository;
    }

//  End of File