syncmlfw/ds/settings/src/NSmlRoamTable.cpp
changeset 0 b497e44ab2fc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/ds/settings/src/NSmlRoamTable.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,333 @@
+/*
+* Copyright (c) 2004 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 bearers
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <sysutil.h>
+
+#include "nsmlroam.h"
+
+
+// --------------------------------
+// CNSmlRoamTable::NewLC( RDbNamedDatabase& aDatabase )
+// Creates new instance of the CNSmlRoamTable
+// --------------------------------
+//
+EXPORT_C CNSmlRoamTable* CNSmlRoamTable::NewLC( RDbNamedDatabase& aDatabase )
+	{
+	CNSmlRoamTable* self = new ( ELeave ) CNSmlRoamTable( aDatabase );
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+// --------------------------------
+// CNSmlRoamTable::NewL( RDbNamedDatabase& aDatabase )
+// Creates new instance of the CNSmlRoamTable
+// --------------------------------
+//
+EXPORT_C CNSmlRoamTable* CNSmlRoamTable::NewL(RDbNamedDatabase& aDatabase)
+	{
+	CNSmlRoamTable* self = NewLC( aDatabase );
+	CleanupStack::Pop();
+	return self;
+	}
+
+// --------------------------------
+// CNSmlRoamTable::ConstructL()
+// Second constructor
+// --------------------------------
+//
+void CNSmlRoamTable::ConstructL()
+	{
+	RDbTable dbTable;
+	CleanupClosePushL( dbTable );
+
+	TInt result = dbTable.Open(iDatabase, KTable);
+
+	if (result != KErrNone)
+		{
+		User::LeaveIfError( iDatabase.Execute( KSQLCreateTable ) );		
+		User::LeaveIfError( iDatabase.Execute( KSQLCreateIndex ) );
+		User::LeaveIfError( dbTable.Open(iDatabase, KTable) );
+		}
+
+	iColSet = dbTable.ColSetL();
+
+	CleanupStack::PopAndDestroy(); //dbTable
+
+	}
+
+// --------------------------------
+// CNSmlRoamTable::CNSmlRoamTable(RDbNamedDatabase& aDatabase)
+// Constructor
+// --------------------------------
+//
+CNSmlRoamTable::CNSmlRoamTable(RDbNamedDatabase& aDatabase)
+: iDatabase(aDatabase)
+	{
+	}
+
+// --------------------------------
+// CNSmlRoamTable::~CNSmlRoamTable()
+// Destructor
+// --------------------------------
+//
+EXPORT_C CNSmlRoamTable::~CNSmlRoamTable()
+	{
+	delete iColSet;
+	}
+
+// --------------------------------
+// CNSmlRoamTable::PutItemsL( TInt aProfileId, CNSmlIAPArray* aItems )
+// Put items from array to table for profile id
+// --------------------------------
+//
+EXPORT_C void CNSmlRoamTable::PutItemsL( TInt aProfileId, CNSmlIAPArray* aItems )
+	{
+	TInt count(0);
+	
+	RDbView view;
+	CleanupClosePushL( view );
+
+	CNSmlRoamItem item;
+
+	User::LeaveIfNull( aItems );
+
+	if (! IsNewItemL(view, aProfileId))
+		{
+		count = view.CountL();
+		
+		if ( count > aItems->Count() )
+			{
+			RemoveAllByIdL(aProfileId);
+			}
+		}
+
+	for (TInt i = 0; i < aItems->Count(); i++)
+		{
+		item.iProfileId= aProfileId;
+		item.iPriority = i;
+		item.iIAPId = aItems->At(i);
+		HandleItemL( item );
+		}
+	
+	CleanupStack::PopAndDestroy(); //view
+	}
+
+// --------------------------------
+// CNSmlRoamTable::GetItemsForIdL( TInt aProfileId )
+// Return array of IAPs for profile id
+// --------------------------------
+//
+EXPORT_C CNSmlIAPArray* CNSmlRoamTable::GetItemsForIdL( TInt aProfileId )
+	{
+	RDbView view;
+	CleanupClosePushL( view );
+	
+	CNSmlIAPArray* array = new (ELeave) CArrayFixFlat<TUint32>(4);
+	CleanupStack::PushL( array );
+	
+	IsNewItemL(view, aProfileId);
+	
+	view.FirstL();
+		
+	while (view.AtRow())
+		{
+		view.GetL();
+		array->AppendL( view.ColUint32( iColSet->ColNo( KColIapId ) ));
+		view.NextL();
+		}
+	
+	CleanupStack::Pop(); //array
+	CleanupStack::PopAndDestroy(); //view
+	return array;
+	}
+
+// --------------------------------
+// CNSmlRoamTable::GetItemIAPL( TInt aProfileId, TInt aPriority )
+// Return IAP for profile id and priority
+// --------------------------------
+//
+EXPORT_C TUint32 CNSmlRoamTable::GetItemIAPL( TInt aProfileId, TInt aPriority )
+	{
+	RDbView view;
+	CleanupClosePushL(view);
+
+	TUint32 uint(0);
+	TBuf<KNSmlMaxSQLLength> sqlBuf;
+	sqlBuf.Format( KSQLSelectUint, aProfileId, aPriority );
+
+	view.Prepare(iDatabase, TDbQuery( sqlBuf ));
+	view.EvaluateAll();
+
+	if ( view.IsEmptyL() )
+		{		
+		User::Leave( KErrNotFound );
+		}
+	
+	view.FirstL();
+	view.GetL();
+
+	uint = view.ColUint( iColSet->ColNo( KColIapId ));
+	
+	CleanupStack::PopAndDestroy(); //view
+
+	return uint;
+	}
+
+// --------------------------------
+// CNSmlRoamTable::RemoveAllByIdL( TInt aProfileId )
+// Removes all IAPs for profile id
+// --------------------------------
+//
+EXPORT_C void CNSmlRoamTable::RemoveAllByIdL( TInt aProfileId )
+	{
+	TBuf<KNSmlMaxSQLLength> sqlBuf;
+	sqlBuf.Format(KSQLDeleteForId, aProfileId);
+
+	TInt res( iDatabase.Execute( sqlBuf ) ); 
+	User::LeaveIfError( res );
+#ifdef __MODULETEST
+	test.iDeleted = res;
+#endif
+	}
+
+// --------------------------------
+// CNSmlRoamTable::AddItemL( CNSmlRoamItem& aItem )
+// Adds item to IAP table
+// --------------------------------
+//
+void CNSmlRoamTable::AddItemL( CNSmlRoamItem& aItem )
+	{
+
+	RFs fs;
+	User::LeaveIfError( fs.Connect() );
+	CleanupClosePushL(fs);
+	
+	if (SysUtil::FFSSpaceBelowCriticalLevelL(&fs, 12))
+		{
+		User::Leave( KErrDiskFull );
+		}
+
+	CleanupStack::PopAndDestroy(); //fs
+
+	TBuf<KNSmlMaxSQLLength> sqlBuf;
+	sqlBuf.Format( KSQLInsertQuery, aItem.iProfileId, aItem.iIAPId, aItem.iPriority );
+
+	RDbView view;
+	CleanupClosePushL( view );
+
+	view.Prepare(iDatabase, TDbQuery(KSQLMatchQuery2), RDbView::EInsertOnly);
+	view.InsertL();
+	view.SetColL( iColSet->ColNo( KColProfileId ), aItem.iProfileId );
+	view.SetColL( iColSet->ColNo( KColPriority ), aItem.iPriority );
+	view.SetColL( iColSet->ColNo( KColIapId ), aItem.iIAPId );
+	view.PutL();
+
+	CleanupStack::PopAndDestroy(); //view
+
+#ifdef __MODULETEST
+	test.iAdded++;
+#endif
+	}
+
+// --------------------------------
+// CNSmlRoamTable::UpdateItemL(RDbView& aView, CNSmlRoamItem& aItem )
+// Updates item in the IAP table
+// --------------------------------
+//
+void CNSmlRoamTable::UpdateItemL(RDbView& aView, CNSmlRoamItem& aItem )
+	{
+	
+	aView.FirstL();
+	aView.UpdateL();
+	
+	aView.SetColL( iColSet->ColNo( KColProfileId ), aItem.iProfileId );
+	aView.SetColL( iColSet->ColNo( KColPriority ), aItem.iPriority );
+	aView.SetColL( iColSet->ColNo( KColIapId ), aItem.iIAPId );
+
+	aView.PutL();
+
+#ifdef __MODULETEST	
+	test.iUpdated++;
+#endif
+	}
+
+// --------------------------------
+// CNSmlRoamTable::HandleItemL( CNSmlRoamItem& aItem )
+// Handles item addition or update
+// --------------------------------
+//
+void CNSmlRoamTable::HandleItemL( CNSmlRoamItem& aItem )
+	{
+	RDbView view;
+	CleanupClosePushL( view);
+	
+	if (IsNewItemL(view, aItem))
+		{
+		CleanupStack::PopAndDestroy(); //view
+		AddItemL(aItem);
+		}
+	else
+		{
+		UpdateItemL(view, aItem);		
+		CleanupStack::PopAndDestroy(); //aView
+		}
+	
+	}
+
+// --------------------------------
+// CNSmlRoamTable::IsNewItemL( RDbView& aView, TInt aProfileId)
+// Checks if whether profile has IAPs
+// --------------------------------
+//
+TBool CNSmlRoamTable::IsNewItemL( RDbView& aView, TInt aProfileId)
+	{
+	TBuf<KNSmlMaxSQLLength> sqlBuf;
+	sqlBuf.Format(KSQLMultiQuery, aProfileId);
+
+	aView.Prepare(iDatabase, TDbQuery( sqlBuf ));
+	aView.EvaluateAll();
+	return aView.IsEmptyL();
+	}
+
+// --------------------------------
+// CNSmlRoamTable::IsNewItemL( RDbView& aView, CNSmlRoamItem& aItem)
+// Checks if whether IAP is new for profile id and priority
+// --------------------------------
+//
+TBool CNSmlRoamTable::IsNewItemL( RDbView& aView, CNSmlRoamItem& aItem)
+	{
+	TBuf<KNSmlMaxSQLLength> sqlBuf;
+	sqlBuf.Format( KSQLSelectUint, aItem.iProfileId, aItem.iPriority );
+
+	aView.Prepare(iDatabase, TDbQuery( sqlBuf ));
+	aView.EvaluateAll();
+	return aView.IsEmptyL();
+	}
+
+#ifdef __MODULETEST
+EXPORT_C CTestClass* CNSmlRoamTable::Test()
+	{
+	return &test;
+	}
+#endif
+
+
+//  End of File