syncmlfw/ds/hostserver/dshostserverbase/src/Nsmldsdataproviderarray.cpp
changeset 0 b497e44ab2fc
--- /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