--- /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 <s32std.h>
+
+#include <nsmldebug.h>
+#include "nsmldshostconstants.h"
+#include "NSmlAdapterLog.h"
+#include "Nsmldsdataproviderarray.h"
+#include "Nsmldsasyncrequesthandler.h"
+
+#ifdef __HOST_SERVER_MTEST__
+#include "../../stif/DSHostServerTest/inc/fakedataprovider.h"
+#else
+#include <SmlDataProvider.h>
+#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<TNSmlDSDataProviderElement>::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