sysstatemgmt/systemstarter/dscstoresrc/dscstore.cpp
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstarter/dscstoresrc/dscstore.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,418 @@
+// Copyright (c) 2006-2009 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:
+//
+
+#include <dscstore.h>
+#include <dscitem.h>
+
+#ifdef DSCSTORE_SQL
+	#include "dscdatabase_sql.h"	// SQL version
+#else
+	#include "dscdatabase.h"	// DBMS version
+#endif
+
+//Create a RDscStore object
+EXPORT_C RDscStore::RDscStore() : iDscDatabase(NULL), iSpare(NULL)
+	{
+	}
+		
+
+/** Opens a connection with the DSC database. This function will create a secure DSC database 
+including DSC and DscItem tables if any do not already exist.
+If the connection is already open this method will return without error.
+This should be the first function called on a RDscStore object after it is created.
+The connection is terminated by calling the Close() member function
+@leave With one of the system-wide error codes
+@capability ReadDeviceData and WriteDeviceData
+@see RDbNamedDatabase
+@publishedPartner
+@released
+*/
+EXPORT_C   void RDscStore::OpenL()
+	{
+	if(!iDscDatabase)
+		{
+		iDscDatabase = CDscDatabase::NewL();
+		}
+	}
+
+
+/** Close the connection with the DSC database
+@publishedPartner
+@released
+@see RDbNamedDatabase
+@see RDbView
+@see RDbs
+*/
+EXPORT_C   void RDscStore::Close()
+	{
+	delete iDscDatabase;
+	iDscDatabase = NULL; 
+	}
+
+	
+/** Check if a database connection is opened
+@return ETrue if this instance is connected to DSC database, else EFalse
+@publishedPartner
+@released
+*/	
+EXPORT_C	TBool RDscStore::IsOpened() const
+	{
+	return (iDscDatabase != NULL);
+	}
+
+
+/**
+Create a new DSC in the DSC database
+@param aDscId the Id of the DSC to be added to the database
+@param aDescription the description of the DSC being added
+@leave	KErrArgument - invalid parameter passed
+@leave	KErrAlreadyExists - the DSC already exists
+@leave	KErrNotReady - the RDscStore is not connected to the DSC database
+@leave	KErrPermissionDenied - the caller does not have enough rights to do the operation
+@leave	KErrLocked - the database is opened for enumeration or is locked by other client
+@capability WriteDeviceData
+@see RDbNamedDatabase
+@publishedPartner
+@released
+*/
+EXPORT_C  void RDscStore::CreateDscL(const TUid& aDscId, const TDesC& aDescription)
+	{
+	CheckDbIsOpenL();
+	iDscDatabase->CreateDscL(aDscId, aDescription); //lint !e613 Suppress warning: possible use of null pointer
+	}
+
+	
+/**
+Create a new DSC in the DSC database using the default DSC Id KDefaultSymbianDsc
+@see RDscStore::CreateDscL(const TUid& aDscId, const TDesC& aDescription)
+@publishedPartner
+@released
+*/
+EXPORT_C  void RDscStore::CreateDscL()
+	{
+	CreateDscL(TUid::Uid(KDefaultSymbianDsc), KNullDesC);
+	}
+
+	
+/**
+Delete a DSC and all associated DSC items from the DSC database
+@param aDscId the ID of the DSC to be deleted
+@leave KErrNotReady - the RDscStore is not connected to the DSC database
+@leave KErrPermissionDenied - the caller does not have enough rights to do the operation
+@leave	KErrLocked - the database is opened for enumeration or is locked by other client
+@leave KErrNotFound - the DSC does not exist in the database
+@capability ReadDeviceData and WriteDeviceData
+@see RDbNamedDatabase
+@publishedPartner
+@released
+*/
+EXPORT_C  void RDscStore::DeleteDscL(const TUid& aDscId)
+	{
+	CheckDbIsOpenL();
+	iDscDatabase->DeleteDscL(aDscId); //lint !e613 Suppress warning: possible use of null pointer
+	}
+		
+
+/**
+Check the existance of a DSC in the DSC database
+@param aDscId the ID of the DSC being checked
+@return ETrue if the aDscId exists, else EFalse
+@leave	KErrNotReady - the RDscStore is not connected to the DSC database
+@leave	KErrPermissionDenied - the caller does not have enough rights to do the operation
+@leave	KErrLocked - the database is opened for enumeration or is locked by other client
+@capability ReadDeviceData
+@see RDbNamedDatabase
+@publishedPartner
+@released
+*/
+EXPORT_C  TBool RDscStore::DscExistsL(const TUid& aDscId) const
+	{
+	CheckDbIsOpenL();
+	return iDscDatabase->DscExistsL(aDscId); //lint !e613 Suppress warning: possible use of null pointer
+	}
+
+	
+/**
+Check the existance of DSC in the DSC database using the default dscId KDefaultSymbianDsc
+@see RDscStore::DscExistsL(const TUid& aDscId)
+@publishedPartner
+@released
+*/
+EXPORT_C  TBool RDscStore::DscExistsL() const
+	{
+	return DscExistsL(TUid::Uid(KDefaultSymbianDsc));
+	}
+
+	
+/** Accessor function returning the description of aDscId
+@param aDscId the ID of the DSC being checked
+@param aDescription the description returned from the DSC database
+@leave KErrNotReady - the RDscStore is not connected to the DSC database
+@leave KErrPermissionDenied - the caller does not have enough rights to do the operation
+@leave	KErrLocked - the database is opened for enumeration or is locked by other client
+@leave KErrNotFound - DSC or item does not exist
+@leave KErrOverflow - if the length of aDescription is too short. Call MaxStringLength( TInt& aStringLength ) 
+to interrogate the server for the maximum permissible length.
+@capability ReadDeviceData
+@see RDbNamedDatabase
+@publishedPartner
+@released
+*/	
+EXPORT_C void RDscStore::GetDscDescriptionL(const TUid &aDscId, TDes& aDescription) const
+	{		
+	CheckDbIsOpenL();
+	iDscDatabase->GetDscDescriptionL(aDscId, aDescription); //lint !e613 Suppress warning: possible use of null pointer
+	}
+
+	
+/**
+Check the existance of a DSC item in a DSC list.
+Uses DscId and ItemId within aItem to determine the item.
+If ItemId is not set, will check existance using DscId and Filename+Arguments.
+No wildcards can be used in filename or arguments, only exact matching.
+
+@param aItem the item to be checked in the DSC database
+@return ETrue if the item exists, else EFalse
+@leave KErrNotReady - the RDscStore is not connected to the DSC database
+@leave KErrPermissionDenied - the caller does not have enough rights to do the operation
+@leave	KErrLocked - the database is opened for enumeration or is locked by other client
+@capability ReadDeviceData
+@see RDbNamedDatabase
+@publishedPartner
+@released
+*/
+EXPORT_C  TBool RDscStore::ItemExistsL(const CDscItem& aItem) const
+	{
+	CheckDbIsOpenL();
+	return iDscDatabase->ItemExistsL(aItem); //lint !e613 Suppress warning: possible use of null pointer
+	}	
+	
+/**
+Add an item to a DSC list. 
+@param	aItem the item to be added to the database. At least DscId and Filename has to be set
+		before calling this function. ItemId will be assigned by the database.
+@param	aPos the position in the DSC to add the item - either EFirst or ELast
+@leave	KErrNotReady - the RDscStore is not connected to the DSC database
+@leave	KErrPermissionDenied - the caller does not have enough rights to do the operation
+@leave	KErrLocked - the database is opened for enumeration or is locked by other client
+@leave	KErrNotFound - the DSC does not exist
+@leave	KErrArgument - aItem is invalid
+@leave	KErrAlreadyExists - an item with the same fileName and args already exists in the DSC
+@capability ReadDeviceData and WriteDeviceData
+@see RDbNamedDatabase
+@publishedPartner
+@released
+*/
+EXPORT_C void RDscStore::AddItemL(CDscItem& aItem, TDscPosition aPos)
+	{
+	CheckDbIsOpenL();
+	iDscDatabase->AddItemL(aItem, aPos); //lint !e613 Suppress warning: possible use of null pointer
+	}
+
+	
+/**
+Append an item to the end of a DSC
+@see RDscStore::AddItemL(CDscItem& aItem,TDscPosition aPos)
+@publishedPartner
+@released
+*/
+EXPORT_C void RDscStore::AddItemL(CDscItem& aItem )
+	{
+	AddItemL(aItem, ELast);
+	}
+
+	
+/**
+Open a DSC for enumeration. This function must be called before the items in the table
+can be enumerated using EnumReadNextL(). Only one DSC can be opened for enumeration at a time.
+
+This function will create a read-lock on the database and push it onto the CleanupStack. 
+Call CleanupStack::PopAndDestroy() to close the enumaration and release the database lock.
+No updates to the database is possible until the read-lock is released.
+
+Usage example:
+@code
+	RDscStore client;
+	client.OpenL();
+	CleanupClosePushL(client);
+	client.EnumOpenLC();
+	while(CDscItem* item = client.EnumReadNextL())
+		{
+		//Do something...
+	 	delete item;
+	 	item = NULL;
+	 	}
+	CleanupStack::PopAndDestroy(); //client.EnumClose()
+	CleanupStack::PopAndDestroy(); //client.Close()
+@endcode
+
+@param aDscId the ID of the DSC to be opened for enumeration
+@leave	KErrNotReady - the RDscStore is not connected to the DSC database
+@leave	KErrPermissionDenied - the caller does not have enough rights to do the operation
+@leave	KErrLocked - the database is already opened for enumeration or is locked by other client
+@leave	KErrNotFound - the DSC does not exist in the DSC database
+@capability ReadDeviceData
+@see RDbNamedDatabase
+@publishedPartner
+@released
+*/
+EXPORT_C  void RDscStore::EnumOpenLC(const TUid& aDscId)
+	{
+	CheckDbIsOpenL();
+	iDscDatabase->EnumOpenLC(aDscId); //lint !e613 Suppress warning: possible use of null pointer
+	}
+	
+
+/**
+Open the default DSC for enumeration using default dscId KDefaultSymbianDsc
+@see RDscStore::EnumOpenLC(const TUid& aDscId)
+@publishedPartner
+@released
+*/
+EXPORT_C  void RDscStore::EnumOpenLC()
+	{
+	EnumOpenLC(TUid::Uid(KDefaultSymbianDsc));
+	}
+
+		
+/**
+Read the next item in the DSC opened for enumeration. An enumeration must have been
+opened by a call to EnumOpenLC(). The caller takes ownership of the returned object.
+
+@return the next available item in the DSC or NULL if there are no more items.
+@leave	one of the system-wide error codes, including:
+		KErrNotReady - the RDscStore is not connected to the DSC database or EnumOpenL() has not been called
+@capability ReadDeviceData
+@see RDbNamedDatabase
+@publishedPartner
+@released
+*/
+EXPORT_C CDscItem* RDscStore::EnumReadNextL()
+	{
+	CheckDbIsOpenL();
+	return iDscDatabase->EnumReadNextL(); //lint !e613 Suppress warning: possible use of null pointer
+	}
+
+
+/**
+Close an open enumeration.
+
+@capability None
+@see EnumOpenLC()
+@publishedPartner
+@released
+*/	
+EXPORT_C  void RDscStore::EnumClose()
+	{
+	if(iDscDatabase)
+		iDscDatabase->EnumClose();
+	}
+
+
+/**
+Read an item from the DSC. 
+Uses DscId and ItemId within aItem to determine the item.
+If ItemId is not set, will check existance using DscId and Filename+Arguments.
+No wildcards can be used in filename or arguments, only exact matching.
+
+@param aItem item to be retrieved
+@leave	KErrNotReady - the RDscStore is not connected to the DSC database
+@leave	KErrPermissionDenied - the caller does not have enough rights to do the operation
+@leave	KErrLocked - the database is opened for enumeration or is locked by other client
+@leave	KErrNotFound - DSC or item does not exist
+@capability ReadDeviceData
+@see RDbNamedDatabase
+@publishedPartner
+@released
+*/ 
+EXPORT_C void RDscStore::ReadItemL(CDscItem& aItem)
+	{
+	CheckDbIsOpenL();
+	iDscDatabase->ReadItemL(aItem); //lint !e613 Suppress warning: possible use of null pointer
+	}
+
+	
+/**
+Update an item in the DSC. 
+Uses DscId and ItemId within aItem to determine the item.
+If ItemId is not set, will check existance using DscId and Filename+Arguments.
+No wildcards can be used in filename or arguments, only exact matching.
+
+ItemId, Filename, ArgList and DscId cannot be updated.
+
+@param aItem item to be updated
+@leave	KErrNotReady - the RDscStore is not connected to the DSC database
+@leave	KErrPermissionDenied - the caller does not have enough rights to do the operation
+@leave	KErrLocked - the database is opened for enumeration or is locked by other client
+@leave	KErrNotFound - DSC or item does not exist
+@leave	KErrArgument - aItem contains invalid settings
+@capability ReadDeviceData and WriteDeviceData
+@see RDbNamedDatabase
+@publishedPartner
+@released
+*/ 			
+EXPORT_C void RDscStore::UpdateItemL(const CDscItem& aItem)
+	{
+	CheckDbIsOpenL();
+	iDscDatabase->UpdateItemL(aItem); //lint !e613 Suppress warning: possible use of null pointer
+	}
+
+	
+/**
+Delete a DSC item matching specified DscId and ItemId, or specified DscId and Filename and ArgList.
+If ItemId is not set, will check existance using DscId and Filename+ArgList.
+No wildcards can be used in Filename or ArgList, only exact matching.
+
+@param aItem item to be deleted
+@leave KErrNotReady - the RDscStore is not connected to the DSC database
+@leave KErrPermissionDenied - the caller does not have enough rights to do the operation
+@leave KErrLocked - the database is opened for enumeration or is locked by other client
+@leave KErrNotFound - DSC or item does not exist
+@capability ReadDeviceData and WriteDeviceData
+@see RDbNamedDatabase
+@publishedPartner
+@released
+*/ 		
+EXPORT_C void RDscStore::DeleteItemL(const CDscItem& aItem)
+	{
+	CheckDbIsOpenL();
+	iDscDatabase->DeleteItemL(aItem); //lint !e613 Suppress warning: possible use of null pointer
+	}
+
+/**
+Interrogate the DscDatabase to discover the maximum supported length of a string.
+@param aStringLength The result is supplied via this integer.
+@capability None
+@publishedPartner
+@released
+*/
+EXPORT_C void RDscStore::GetMaxStringLength( TInt& aStringLength ) const
+	{
+	aStringLength = CDscDatabase::MaxStringLength();
+	}
+
+
+//
+// PRIVATE METHODS
+//
+
+/** check the database is already open */
+void RDscStore::CheckDbIsOpenL() const
+	{
+	if (!iDscDatabase)
+		{
+		User::Leave(KErrNotReady);
+		}
+	}