omadm/omadmextensions/adapters/fota/inc/nsmldmfotaadapterdb.h
changeset 0 3ce708148e4d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/omadm/omadmextensions/adapters/fota/inc/nsmldmfotaadapterdb.h	Thu Dec 17 08:40:12 2009 +0200
@@ -0,0 +1,458 @@
+/*
+* 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:    Fota adapter's DB header file
+*
+*/
+
+
+
+
+
+#ifndef __NSMLDMFOTAADAPTERDB_H
+#define __NSMLDMFOTAADAPTERDB_H
+
+// INCLUDE FILES
+
+#include <e32std.h>
+#include <e32base.h>
+#include <d32dbms.h>
+#include <f32file.h>
+#include <SyncMLDef.h>
+#include <fotaengine.h>
+#include <fotaConst.h>
+
+// CONSTANTS
+
+// null final result value
+const TInt KNSmlFotaNullResult = 0;
+
+// Database name & location
+const TInt KNSmlFotaAdapterDbDrive = EDriveC;
+_LIT( KNSmlFotaAdapterDbName, "c:nsmldmfotaadapter.db" );
+
+// Table and column names
+_LIT( KNSmlTableFwMgmtObject,       "FwMgmtObject" );
+_LIT( KNSmlFwMgmtObjectId,          "PkgId" );
+_LIT( KNSmlFwMgmtObjectName,        "PkgName" );
+_LIT( KNSmlFwMgmtObjectVersion,     "PkgVersion" );
+_LIT( KNSmlFwMgmtObjectUrl,         "PkgURL" );
+_LIT( KNSmlFwMgmtObjectMgmtUri,     "MgmtURI" );
+_LIT( KNSmlFwMgmtObjectProfileId,   "ProfileId" );
+_LIT( KNSmlFwMgmtObjectServerId,    "ServerId" );
+_LIT( KNSmlFwMgmtObjectResult,      "FinalResult" );
+_LIT( KNSmlFwMgmtObjectCorrelator,  "Correlator" );
+
+// SQL statements
+_LIT( KNSmlCreateFwMgmtObjectTable, "CREATE TABLE FwMgmtObject ( PkgId \
+COUNTER NOT NULL, PkgName CHAR(%d), PkgVersion CHAR(%d), PkgURL LONG VARCHAR, \
+MgmtURI CHAR(%d), ProfileId INTEGER, ServerId CHAR(%d), FinalResult INTEGER, \
+Correlator CHAR(%d) )" );
+
+_LIT( KNSmlGetFwMgmtObject, "SELECT * FROM FwMgmtObject WHERE PkgId = %d" );
+
+_LIT( KNSmlGetUnfinishedFwMgmtObjects, "SELECT * FROM FwMgmtObject \
+WHERE FinalResult = %d" );
+
+_LIT( KNSmlGetUnfinishedFwMgmtObjectByServerId, "SELECT * FROM FwMgmtObject \
+WHERE FinalResult = %d AND ServerId = '%S' AND NOT (MgmtURI = '')" );
+
+_LIT( KNSmlDeleteFwMgmtObject,"DELETE FROM FwMgmtObject WHERE PkgId = %d");
+
+// Max. lengths of string fields in FwMgmtObject
+const TInt KNSmlMaxMgmtUriLength = 60;
+const TInt KNSmlMaxServerIdLength = 150;
+const TInt KNSmlMaxCorrelatorLength = 150;
+
+// Estimate of url size used in max row size (OOD checks)
+const TInt KNSmlPkgURLLengthEstimate = 350;
+
+// space needed for above integers in buffer
+const TInt KNSmlFwMgmtObjectIntLength = 4;
+
+// space needed for an integer in buffer
+const TInt KNSmlFwMgmtObjectIntegerLength = 10;
+
+// Size of empty Fota database in bytes (+ additional treshold)
+const TInt KNSmlFotaAdapterEmptyDbSize = 350;
+
+// Estimated maximum size of FwMgmtObject table row (+ additional treshold)
+const TInt KNSmlMaxFwMgmtObjectRowSize = KFotaMaxPkgNameLength + 
+                                         KFotaMaxPkgVersionLength + 
+                                         KNSmlPkgURLLengthEstimate + 
+                                         KNSmlMaxMgmtUriLength + 
+                                         KNSmlMaxServerIdLength + 
+                                         KNSmlMaxCorrelatorLength + 115;
+
+// TYPEDEFS
+typedef TInt TNSmlDmFwObjectId;
+typedef RArray<TNSmlDmFwObjectId> RNSmlDmFwObjectArray;
+
+
+
+// CLASS DECLARATION
+
+/**
+*  CNSmlDmFotaAdapterDb provides an interface for accessing Fota database.
+*  
+*  @lib nsmldmfotaadapter.lib
+*  
+*/
+class CNSmlDmFotaAdapterDb : public CBase
+    {
+
+public:
+        
+    /**
+    * Two-phased constructor.
+    * @return A pointer to the newly created instance.
+    */
+    static CNSmlDmFotaAdapterDb* NewL();    
+
+    /**
+    * Two-phased constructor. Pushes the pointer onto the CleanupStack.
+    * @return A pointer to the newly created instance.
+    */
+    static CNSmlDmFotaAdapterDb* NewLC();
+
+    /**
+    * Destructor.
+    */
+    virtual ~CNSmlDmFotaAdapterDb();
+
+    /**
+    * Adds a new row (i.e. firmware object) to the FwMgmtObject table.
+    * The values in each column are left NULL, except FinalResult to 
+    * KNSmlFotaNullResult. 
+    * Leaves with KErrDiskFull, if OOD check fails.
+    * @return The id of the new fw object in Fota database.
+    */
+    TNSmlDmFwObjectId AddFwObjectL();
+    
+    /**
+    * Deletes a firmware object from FwMgmtObject table.
+    * @param aId The identifier of the object to be deleted.
+    * @return KErrNone if the object was successfully deleted, KErrNotFound if 
+    * the object was not found from database.
+    */
+    TInt DeleteFwObjectL( const TNSmlDmFwObjectId aId );
+    
+    /**
+    * Finds all the firmware objects that have null final result and sets
+    * the ids of those objetcs to aArray.
+    * @param aArray that on return contains the ids.
+    */
+    void GetEmptyFinalResultsL( RNSmlDmFwObjectArray& aArray );
+    
+    /**
+    * Finds all the firmware objects that have null final result, server id 
+    * equals to given server id and mgmt uri is not empty. Sets the ids of 
+    * those objetcs to aArray.
+    * @param aArray Array that on return contains the ids.
+    * @param aServerId The id of the server whose empty final result values 
+    * are listed.
+    */
+    void GetEmptyFinalResultsL( RNSmlDmFwObjectArray& aArray, 
+                                const TDesC8& aServerId );
+    
+    /**
+    * Fetches the PkgName field of a firmware object from database.
+    * @param aId The identifier of the object, whose data should be fetched.
+    * @return The value in PkgName field of the object, if object was found.
+    * NULL otherwise.
+    */
+    HBufC8* PkgNameL( const TNSmlDmFwObjectId aId );
+    
+    /**
+    * Fetches the PkgVersion field of a firmware object from database.
+    * @param aId The identifier of the object, whose data should be fetched.
+    * @return The value in PkgVersion field of the object, if object was found.
+    * NULL otherwise.
+    */
+    HBufC8* PkgVersionL( const TNSmlDmFwObjectId aId );
+    
+    /**
+    * Fetches the PkgURL field of a firmware object from database.
+    * @param aId The identifier of the object, whose data should be fetched.
+    * @return The value in PkgURL field of the object, if object was found.
+    * NULL otherwise.
+    */
+    HBufC8* PkgUrlL( const TNSmlDmFwObjectId aId );
+    
+    /**
+    * Fetches the MgmtURI field of a firmware object from database.
+    * @param aId The identifier of the object, whose data should be fetched.
+    * @return The value in MgmtURI field of the object, if object was found.
+    * NULL otherwise.
+    */
+    HBufC8* MgmtUriL( const TNSmlDmFwObjectId aId );
+    
+    /**
+    * Fetches the ProfileId field of a firmware object from database.
+    * @param aId The identifier of the object, whose data should be fetched.
+    * @return The value in ProfileId field of the object, if object was found.
+    * KErrNotFound otherwise.
+    */
+    TSmlProfileId ProfileIdL( const TNSmlDmFwObjectId aId );
+    
+    /**
+    * Fetches the ServerId field of a firmware object from database.
+    * @param aId The identifier of the object, whose data should be fetched.
+    * @return The value in ServerId field of the object, if object was found.
+    * NULL otherwise.
+    */
+    HBufC8* ServerIdL( const TNSmlDmFwObjectId aId );
+    
+    /**
+    * Fetches the FinalResult field of a firmware object from database.
+    * @param aId The identifier of the object, whose data should be fetched.
+    * @return The value in FinalResult field of the object, if object was 
+    * found. KErrNotFound otherwise.
+    */
+    TInt FinalResultL( const TNSmlDmFwObjectId aId );
+    
+    /**
+    * Fetches the Correlator field of a firmware object from database.
+    * @param aId The identifier of the object, whose data should be fetched.
+    * @return The value in Correlator field of the object, if object was 
+    * found. NULL otherwise.
+    */
+    HBufC8* CorrelatorL( const TNSmlDmFwObjectId aId );
+    
+    /**
+    * Sets the value of PkgName field of a firmware object.
+    * @param aName The new value for the field.
+    * @param aId The identifier of the object, whose data should be updated.
+    * @return KErrNone, if the update was successful. KErrNotFound, if the 
+    * object was not found. KErrOverflow, if given name is too large for the 
+    * database.
+    */
+    TInt SetPkgNameL( const TDesC8& aName, const TNSmlDmFwObjectId aId );
+    
+    /**
+    * Sets the value of PkgVersion field of a firmware object.
+    * @param aVersion The new value for the field.
+    * @param aId The identifier of the object, whose data should be updated.
+    * @return KErrNone, if the update was successful. KErrNotFound, if the 
+    * object was not found. KErrOverflow, if given version is too large 
+    * for the database.
+    */
+    TInt SetPkgVersionL( const TDesC8& aVersion, const TNSmlDmFwObjectId aId );
+    
+    /**
+    * Sets the value of PkgURL field of a firmware object.
+    * @param aUrl The new value for the field.
+    * @param aId The identifier of the object, whose data should be updated.
+    * @return KErrNone, if the update was successful. KErrNotFound, if the 
+    * object was not found. KErrOverflow, if given url is too large for the 
+    * database.
+    */
+    TInt SetPkgUrlL( const TDesC8& aUrl, const TNSmlDmFwObjectId aId );
+    
+    /**
+    * Sets the value of MgmtURI field of a firmware object.
+    * @param aUri The new value for the field.
+    * @param aId The identifier of the object, whose data should be updated.
+    * @return KErrNone, if the update was successful. KErrNotFound, if the 
+    * object was not found. KErrOverflow, if given uri is too large for the 
+    * database.
+    */
+    TInt SetMgmtUriL( const TDesC8& aUri, const TNSmlDmFwObjectId aId );
+    
+    /**
+    * Sets the values of ProfileId and ServerId fields of a firmware object.
+    * @param aProfile The new value for the ProfileId.
+    * @param aServerId The new value for the ServerId.
+    * @param aId The identifier of the object, whose data should be updated.
+    * @return KErrNone, if the update was successful. KErrNotFound, if the 
+    * object was not found. KErrOverflow, if given server id is too large 
+    * for the database.
+    */
+    TInt SetServerInfoL( const TSmlProfileId aProfile, 
+                         const TDesC8& aServerId,
+                         const TNSmlDmFwObjectId aId );
+    
+    /**
+    * Sets the value of FinalResult field of a firmware object.
+    * @param aResult The new value for the field.
+    * @param aId The identifier of the object, whose data should be updated.
+    * @return KErrNone, if the update was successful. KErrNotFound, if the 
+    * object was not found.
+    */
+    TInt SetFinalResultL( const TInt aResult, const TNSmlDmFwObjectId aId );
+    
+    /**
+    * Sets the value of Correlator field of a firmware object.
+    * @param aCorrelator The new value for the field.
+    * @param aId The identifier of the object, whose data should be updated.
+    * @return KErrNone, if the update was successful. KErrNotFound, if the 
+    * object was not found. KErrOverflow, if given correlator is too large 
+    * for the database.
+    */
+    TInt SetCorrelatorL( const TDesC8& aCorrelator, 
+                         const TNSmlDmFwObjectId aId );
+
+private:
+
+    /**
+    * Creates Fota database.
+    * @param aFullName Name and path of database.
+    */
+    void CreateDatabaseL( const TDesC& aFullName );
+
+    /**
+    * Sets new value to a text field in a firmware object. This method is used 
+    * by the public descriptor setters.
+    * @param aColumn The name of the field to be updated.
+    * @param aValue The new value for the field.
+    * @param aObject The identifier of the object, whose data should be 
+    * updated.
+    * @return KErrNone, if the update was successful. KErrNotFound, if the 
+    * object was not found.
+    */
+    TInt SetStrValueL( const TDesC& aColumn, 
+                       const TDesC8& aValue, 
+                       const TNSmlDmFwObjectId aObject );
+
+    /**
+    * Writes using Db streams the new value to a long text field in a 
+    * firmware object. This method is used by the public descriptor 
+    * setters (PkgURL).
+    * @param aColumn The name of the field to be updated.
+    * @param aValue The new value for the field.
+    * @param aObject The identifier of the object, whose data should 
+    * be updated.
+    * @return KErrNone, if the update was successful. KErrNotFound, if 
+    * the object was not found.
+    */
+    TInt SetLongStrValueL( const TDesC& aColumn,
+                           const TDesC8& aValue, 
+                           const TNSmlDmFwObjectId aObject );
+
+    /**
+    * Sets new value to a integer field in a firmware object. This method 
+    * is used by the public integer setters.
+    * @param aColumn The name of the field to be updated.
+    * @param aValue The new value for the field.
+    * @param aObject The identifier of the object, whose data should be 
+    * updated.
+    * @return KErrNone, if the update was successful. KErrNotFound, if the 
+    * object was not found.
+    */
+    TInt SetIntValueL( const TDesC& aColumn,
+                       const TInt aValue, 
+                       const TNSmlDmFwObjectId aObject );
+
+    /**
+    * Fetches the value in a text field of a firmware object. This method is 
+    * used by the public descriptor getters.
+    * @param aColumn The name of the field where the data should be fetched.
+    * @param aObject The identifier of the object, whose data should be 
+    * fetched.
+    * @return The value in the field, if object was found. NULL otherwise.
+    */
+    HBufC8* StrValueL( const TDesC& aColumn, const TNSmlDmFwObjectId aObject );
+
+    /**
+    * Fetches the value in a long text field of a firmware object using Db 
+    * streams. This method is used by the public descriptor getters (PkgURL).
+    * @param aColumn The name of the field where the data should be fetched.
+    * @param aObject The identifier of the object, whose data should be 
+    * fetched.
+    * @return The value in the field, if object was found. NULL otherwise.
+    */
+    HBufC8* LongStrValueL( const TDesC& aColumn, 
+                           const TNSmlDmFwObjectId aObject );
+
+    /**
+    * Fetches the value in a integer field of a firmware object. This method 
+    * is used by the public integer getters.
+    * @param aColumn The name of the field where the data should be fetched.
+    * @param aObject The identifier of the object, whose data should be 
+    * fetched.
+    * @return The value in the field, if object was found. KErrNotFound 
+    * otherwise.
+    */
+    TInt IntValueL( const TDesC& aColumn, const TNSmlDmFwObjectId aObject );
+
+    /**
+    * Prepares iView with read-only access rights to a single firmware object.
+    * @param aObject The identifier of the object, whose data is about 
+    * to be read.
+    */
+    void FetchRowL( const TNSmlDmFwObjectId aObject );
+    
+    /**
+    * Prepares iView with update access rights to a single firmware object. 
+    * @param aObject The identifier of the object, whose data is about to 
+    * be updated.
+    * @return KErrNone, if there were no errors and iView was successfully
+    * prepared. 
+    * KErrNotFound, if the firmware object was not found.
+    */
+    TInt UpdateRowL( const TNSmlDmFwObjectId aObject );
+    
+    /**
+    * Makes an SQL query string for getting a row from FwMgmtObject table.
+    * @param aId The identifier of the object, which is used in the SQL query.
+    * @return A string containing the formatted SQL query.
+    */
+    HBufC* FwMgmtObjectRowSqlLC( TNSmlDmFwObjectId aId ) const;
+
+    /**
+    * Closes the view and then prepares it with the given values.
+    * @param aSql SQL statement defining the view, which is prepared by 
+    * this method.
+    * @param aAccess Permitted operations for the view.
+    */
+    void PrepareViewL( const TDesC& aSql, RDbRowSet::TAccess aAccess );
+
+    /**
+    * Commits update and compacts the database.
+    */
+    void CommitAndCompact();
+
+    /**
+    * Converts a 8-bit descriptor to a 16-bit descriptor, which is allocated 
+    * from heap and pushed onto the CleanupStack.
+    * @param aDes Descriptor to be converted.
+    * @return A pointer to the newly allocated copy.
+    */
+    HBufC* ConvertTo16BitLC( const TDesC8& aDes ) const;
+
+    /**
+    * Second phase construction.
+    */
+    void ConstructL();
+
+    /**
+    * Constructor.
+    */
+    CNSmlDmFotaAdapterDb();
+
+private:
+
+    RDbNamedDatabase iDatabase;
+    RFs iFsSession;
+    RDbs iRdbSession;
+
+    RDbTable iFwObjectTable;
+    CDbColSet* iColSet;
+    RDbView iView;
+
+    };
+
+
+#endif // __NSMLDMFOTAADAPTERDB_H   
+            
+// End of File