diff -r 000000000000 -r b497e44ab2fc syncmlfw/ds/hostserver/dshostserverbase/src/Nsmldsdataproviderarray.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/syncmlfw/ds/hostserver/dshostserverbase/src/Nsmldsdataproviderarray.cpp Thu Dec 17 09:07:52 2009 +0200 @@ -0,0 +1,258 @@ +/* +* Copyright (c) 2005 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: array for storing dataproviders and datastores. +* +*/ + + +// INCLUDE FILES +#include + +#include +#include "nsmldshostconstants.h" +#include "NSmlAdapterLog.h" +#include "Nsmldsdataproviderarray.h" +#include "Nsmldsasyncrequesthandler.h" + +#ifdef __HOST_SERVER_MTEST__ +#include "../../stif/DSHostServerTest/inc/fakedataprovider.h" +#else +#include +#endif + +// ======================================= MEMBER FUNCTIONS ======================================= + +// ------------------------------------------------------------------------------------------------ +// RNSmlDSDataProviderArray::RNSmlDSDataProviderArray() +// ------------------------------------------------------------------------------------------------ +RNSmlDSDataProviderArray::RNSmlDSDataProviderArray() + { + } + +// ------------------------------------------------------------------------------------------------ +// RNSmlDSDataProviderArray::ResetAndDestroy +// ------------------------------------------------------------------------------------------------ +void RNSmlDSDataProviderArray::ResetAndDestroy() + { + for ( TInt i = 0; i < Count(); i++ ) + { + TNSmlDSDataProviderElement* DPI = ( *this )[i]; + RDataStoreElementArray* DSA = DPI->iDataStores; + + for ( TInt j = 0; j < DSA->Count(); j++ ) + { + TNSmlDSDataStoreElement* DSI = ( *DSA )[j]; + delete Destroy( DSI ); + } + DSA->Close(); + delete DSA; + DPI->iDataStores = NULL; + delete DPI->iDataprovider; + } + RPointerArray::ResetAndDestroy(); + } + +// ------------------------------------------------------------------------------------------------ +// RNSmlDSDataProviderArray::DataProvider +// ------------------------------------------------------------------------------------------------ +CSmlDataProvider* RNSmlDSDataProviderArray::DataProvider( TSmlDataProviderId aId ) + { + TNSmlDSDataProviderElement* findDPI = DataProviderElement( aId ); + if ( findDPI ) + { + return findDPI->iDataprovider; + } + return NULL; + } + +// ------------------------------------------------------------------------------------------------ +// RNSmlDSDataProviderArray::DataProviderElement +// ------------------------------------------------------------------------------------------------ +TNSmlDSDataProviderElement* RNSmlDSDataProviderArray::DataProviderElement( TSmlDataProviderId aId ) + { + for ( TInt i = 0; i < Count(); i++ ) + { + TNSmlDSDataProviderElement* test = ( *this )[i]; + if ( test->iDataprovider->Identifier() == aId ) + { + return test; + } + } + return NULL; + } + +// ------------------------------------------------------------------------------------------------ +// RNSmlDSDataProviderArray::DataStore +// ------------------------------------------------------------------------------------------------ +CSmlDataStore* RNSmlDSDataProviderArray::DataStore( TSmlDataProviderId aId, + const TDesC& aStoreName ) + { + TNSmlDSDataProviderElement* findDPI = DataProviderElement( aId ); + + TNSmlDSDataStoreElement* findDSI = DataStoreElement( findDPI, aStoreName ); + if ( findDSI ) + { + return findDSI->iDataStore; + } + + return NULL; + } + +// ------------------------------------------------------------------------------------------------ +// RNSmlDSDataProviderArray::DataStoreElement +// ------------------------------------------------------------------------------------------------ +TNSmlDSDataStoreElement* RNSmlDSDataProviderArray::DataStoreElement( + const TNSmlDSDataProviderElement* aItem, const TDesC& aStoreName ) + { + if ( !aItem ) + { + return NULL; + } + + RDataStoreElementArray* DSA = aItem->iDataStores; + for ( TInt i = 0 ; i < DSA->Count(); i++ ) + { + TNSmlDSDataStoreElement* test = ( *DSA )[i]; + if ( test->StoreName() == aStoreName ) + { + return test; + } + } + return NULL; + } + +// ------------------------------------------------------------------------------------------------ +// RNSmlDSDataProviderArray::InsertL +// ------------------------------------------------------------------------------------------------ +TInt RNSmlDSDataProviderArray::InsertL( CSmlDataProvider* aDataprovider ) + { + if ( !aDataprovider ) + { + User::Leave( KErrArgument ); + } + + TInt ret( KErrAlreadyExists ); + + TNSmlDSDataProviderElement* findDPI = DataProviderElement( aDataprovider->Identifier() ); + if ( !findDPI ) + { + findDPI = new ( ELeave ) TNSmlDSDataProviderElement(); + CleanupStack::PushL( findDPI ); + findDPI->iDataStores = new ( ELeave ) RDataStoreElementArray(); + CleanupStack::PushL( findDPI->iDataStores ); + + findDPI->iDataprovider = aDataprovider; + AppendL ( findDPI ); + CleanupStack::Pop( 2 ); //findDPI->iDataStores, findDPI + + ret = KErrNone; + } + + return ret; + } + +// ------------------------------------------------------------------------------------------------ +// RNSmlDSDataProviderArray::InsertL +// ------------------------------------------------------------------------------------------------ +TNSmlDSDataStoreElement* RNSmlDSDataProviderArray::InsertL( + TNSmlDSDataProviderElement* aDataproviderItem, + CSmlDataStore* aDataStore, + HBufC* aDataStoreName ) + { + if ( !aDataproviderItem ) + { + User::Leave( KErrArgument ); + } + if ( !aDataStore ) return NULL; + + TNSmlDSDataStoreElement* findDSI = DataStoreElement( aDataproviderItem, *aDataStoreName ); + if ( findDSI ) + { + User::Leave( KErrAlreadyExists ); + } + + // Appending new TNSmlDSDataStoreElement to array + findDSI = new ( ELeave ) TNSmlDSDataStoreElement( aDataStoreName ); + CleanupStack::PushL( findDSI ); + aDataproviderItem->iDataStores->AppendL( findDSI ); + findDSI->iDataStore = aDataStore; + CleanupStack::Pop( findDSI ); + + return findDSI; + } + +// ------------------------------------------------------------------------------------------------ +// RNSmlDSDataProviderArray::Remove +// ------------------------------------------------------------------------------------------------ +CNSmlDSAsyncRequestHandler* RNSmlDSDataProviderArray::Remove( + TNSmlDSDataProviderElement* aDataproviderItem, + TNSmlDSDataStoreElement* aDataStoreItem ) + { + if ( !aDataproviderItem || !aDataStoreItem ) + { + return NULL; + } + + if ( !aDataproviderItem->iDataStores ) + { + return NULL; + } + + TInt ind ( aDataproviderItem->iDataStores->Find( aDataStoreItem ) ); + if ( ind != KErrNotFound ) + { + aDataproviderItem->iDataStores->Remove( ind ); + } + + return Destroy( aDataStoreItem ); + } + +// ------------------------------------------------------------------------------------------------ +// RNSmlDSDataProviderArray::Destroy +// frees the memory reserver for aDataStoreItem except iDSAO, which is returned. +// ------------------------------------------------------------------------------------------------ +CNSmlDSAsyncRequestHandler* RNSmlDSDataProviderArray::Destroy( + TNSmlDSDataStoreElement*& aDataStoreItem ) + { + delete aDataStoreItem->iDataStore; + aDataStoreItem->iDataStore = NULL; + + if ( aDataStoreItem->iBatchItemUids ) + { + aDataStoreItem->iBatchItemUids->Close(); + delete aDataStoreItem->iBatchItemUids; + aDataStoreItem->iBatchItemUids = NULL; + } + + delete aDataStoreItem->iStoreName; + aDataStoreItem->iStoreName = NULL; + + delete aDataStoreItem->iDSFormat; + aDataStoreItem->iDSFormat = NULL; + + delete aDataStoreItem->iAdpLog; + aDataStoreItem->iAdpLog = NULL; + + CNSmlDSAsyncRequestHandler* dsao = aDataStoreItem->iDSAO; + if ( dsao ) + { + dsao->iDSItem = NULL; + } + + delete aDataStoreItem; + aDataStoreItem = NULL; + return dsao; + } + +// End of File