videofeeds/server/IptvServiceManager/inc/CIptvServiceManager.h
changeset 0 96612d01cf9f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videofeeds/server/IptvServiceManager/inc/CIptvServiceManager.h	Mon Jan 18 20:21:12 2010 +0200
@@ -0,0 +1,532 @@
+/*
+* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:    header file for CIptvServiceManager class*
+*/
+
+
+
+
+
+#ifndef CIPTVSERVICEMANAGER_H
+#define CIPTVSERVICEMANAGER_H
+
+//  INCLUDES
+#include <e32std.h>
+#include <badesca.h>    // CDesCArrayFlat (cannot be forward declarated)
+#include <d32dbms.h>    // RDbStoreDatabase
+#include <f32file.h>    // RFs
+#include "CIptvUtil.h"
+
+#include "CIptvSmEvent.h"
+#include "CIptvServiceManagementClient.h"
+
+#if defined(__SERIES60_30__) || defined(__SERIES60_31__) || defined(__SERIES60_32__)
+class CActiveSpaceHelper;
+#endif // defined(__SERIES60_30__) || defined(__SERIES60_31__) || defined(__SERIES60_32__)
+
+// CONSTANTS
+
+const TInt KIptvSmCustomSqlMaxLength = 256;
+const TUint8 KIptvSmServiceDbCompactingFrequency = 3;
+const TInt KIptvSmMaxServices = 500;
+
+_LIT( KIptvSmCDiskPrefix, "c:");
+_LIT( KIptvSmZDiskPrefix, "z:");
+
+_LIT( KIptvSmServicesDbFileName, "services.dat");
+_LIT( KIptvSmPasswordsDbFileName, "pwd.dat");
+_LIT( KIptvSmServicesXmlFile, "services.xml");
+_LIT( KIptvSmServicesUpdateXmlFile, "updateservices.xml");
+_LIT( KSmDbVersionFileName, "SmDbVersion.dat");
+
+_LIT( KIptvSmServicesTable, "Services");
+
+_LIT( KIptvSmServicesDbIdCol, "ID" );                                     /* 1st column     */
+_LIT( KIptvSmServicesDbNameCol, "Name" );                                 /* 2nd column     */
+_LIT( KIptvSmServicesDbAddressCol, "Address" );                           /* 3rd column     */
+_LIT( KIptvSmServicesDbIconPathCol, "IconPath" );                         /* 4th column     */
+_LIT( KIptvSmServicesDbEpgPluginUidCol, "EpgPluginUid" );                 /* 5th column     */
+_LIT( KIptvSmServicesDbVodPluginUidCol, "VodEpgPluginUid" );              /* 6th column     */
+_LIT( KIptvSmServicesDbIptvPluginUidCol, "IptvEpgPluginUid" );            /* 7th column     */
+_LIT( KIptvSmServicesDbTypeCol, "Type" );                                 /* 8th column     */
+_LIT( KIptvSmServicesDbIapListCol, "Iap" );                               /* 9th column     */
+_LIT( KIptvSmServicesDbDescCol, "Desc" );                                 /* 10th column    */
+_LIT( KIptvSmServicesDbDateCol, "Date" );                                 /* 11th column    */
+_LIT( KIptvSmServicesDbFlagsCol, "Flags" );                               /* 12th column    */
+_LIT( KIptvSmServicesDbApplicationUidCol, "ApplicationUid" );             /* 13th column    */
+_LIT( KIptvSmServicesDbDisplayOrderCol, "DisplayOrder" );                 /* 14th column    */
+_LIT( KIptvSmServicesDbProviderIdCol, "ProviderId" );                     /* 15th column    */
+_LIT( KIptvSmServicesDbAccountManagementUrlCol, "AccountManagementUrl" ); /* 16th column    */
+_LIT( KIptvSmServicesDbEpgUpdateTimeCol, "EpgUpdateTime" );               /* 17th column    */ //added in db version 2
+_LIT( KIptvSmServicesDbIapNameCol, "IapName" );                           /* 18th column    */ //added in db version 2
+_LIT( KIptvSmServicesDbSearchUrlCol, "SearchUrl" );                       /* 19th column    */ //added in db version 2
+_LIT( KIptvSmServicesDbScheduledDlNetworkCol, "ScheduledDlNetwork" );     /* 20th column    */ //added in db version 2
+_LIT( KIptvSmServicesDbScheduledDlTimeCol, "ScheduledDlTime" );           /* 21th column    */ //added in db version 2
+_LIT( KIptvSmServicesDbScheduledDlTypeCol, "ScheduledDlType" );           /* 22th column    */ //added in db version 2
+_LIT( KIptvSmServicesDbLastScheduledDlTime, "LastScheduledDlTime" );      /* 23th column    */ //added in db version 2
+_LIT( KIptvSmServicesDbGroupIdCol, "GroupID" );                           /* 24th column    */ //added in db version 3
+_LIT( KIptvSmServicesDbUseCategoryCol, "UseCatecory" );                   /* 25th column    */ //added in db version 3
+_LIT( KIptvSmServicesDbUploadProviderCol, "UploadProvider" );             /* 26th column    */ //added in db version 3
+_LIT( KIptvSmServicesDbIconUrlCol, "IconUrl" );                           /* 27th column    */ //added in db version 3
+_LIT( KIptvSmServicesDbRecordUrlCol, "RecordUrl" );                       /* 28th column    */ //added in db version 3
+
+_LIT(KIptvSmServicesDbIndexName,"ServicesIndex");  /* Name of the ID index        */
+
+_LIT(KIptvSmPasswordsTable, "Passwords");
+_LIT(KIptvSmPasswordsDbIdCol, "ID");             /* 1st column     */
+_LIT(KIptvSmPasswordsDbUserNameCol, "UserName"); /* 2nd column     */
+_LIT(KIptvSmPasswordsDbPasswordCol, "Password"); /* 3rd column     */
+
+_LIT(KIptvSmPasswordsDbIndexName,"PasswordsIndex");  /* Name of the ID index */
+
+// MACROS
+
+// DATA TYPES
+
+// FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+class CFileStore;
+class CIptvService;
+class MIptvServiceManagerObserver;
+class TIptvSmPassword;
+
+// CLASS DECLARATION
+
+/**
+ * Class:       CIptvServiceManager
+ *
+ * Description: An instance of class CIptvServiceManager provides services
+ *              database access. 
+ *
+ * Database definitions:
+ *
+ *              The Services database (services.dat) contains Services table:
+ *
+ *              Table name: Services\n
+ *
+ *                 Column:                     Type:          Length (bytes):                                In versions: \n
+ *                 ------                      -----          ---------------                                ------------ \n
+ *                 ID                          TUint32        4                                              vers 1, 2    \n
+ *                 Name                        EDbColText     KIptvSmServicesDbNameMaxLength*2               vers 1, 2    \n     
+ *                 Address                     EDbColText     KIptvSmServicesDbAddressMaxLength*2            vers 1, 2    \n
+ *                 IconPath                    EDbColText     KIptvSmServicesDbIconPathMaxLength*2           vers 1, 2    \n
+ *                 EpgPluginUid                TInt32         4                                              vers 1, 2    \n
+ *                 VodPluginUid                TInt32         4                                              vers 1, 2    \n
+ *                 IptvPluginUid               TInt32         4                                              vers 1, 2    \n
+ *                 Type                        TUint8         1                                              vers 1, 2    \n
+ *                 IAP List                    EDbColText8    KIptvSmServicesDbIapMaxLength                  vers 1, 2    \n
+ *                 User name                   EDbColText     KIptvSmServicesDbPasswordMaxLength*2           vers 1, 2    \n
+ *                 Password                    EDbColText     KIptvSmServicesDbPasswordMaxLength*2           vers 1, 2    \n
+ *                 Desc                        EDbColText     KIptvSmServicesDbDescMaxLength*2               vers 1, 2    \n
+ *                 Date                        TTime (TInt64) 8                                              vers 1, 2    \n
+ *                 Flags                       TUint32        4                                              vers 1, 2    \n
+ *                 ApplicationUid              TInt32         4                                              vers 1, 2    \n
+ *                 DisplayOrder                TUint32        4                                              vers 1, 2    \n
+ *                 ProviderId                  EDbColText     KIptvSmServicesDbProviderIdMaxLength           vers 1, 2    \n
+ *                 AccountManagementUrl        EDbColText     KIptvSmServicesDbAccountManagementUrlMaxLength vers 1, 2    \n
+ *                 EpgUpdateTime               TTime (TInt64) 8                                              vers 2       \n
+ *                 IapName                     EDbColText     KIptvSmServicesDbIapNameMaxLength              vers 2       \n
+ *                 SearchUrl                   EDbColText     KIptvSmServicesDbAddressMaxLength*2            vers 2       \n
+ *                 ScheduledDlNetwork          TUint32        4                                              vers 2       \n
+ *                 ScheduledDlTime             TUint32        4                                              vers 2       \n
+ *                 ScheduledDlType             TUint32        4                                              vers 2       \n
+ *                 LastScheduledDlTime         TTime (TInt64) 8                                              vers 2       \n
+ *                 RecordUrl                   EDbColText     KIptvSmServicesDbAddressMaxLength*2            vers 3       \n
+ *       
+ *              There is also index for Services table with name "ServicesIndex". It's\n
+ *              constructed from ID column.\n
+ *
+ *             The Passwords database (pwd.dat) contains Passwords table:\n
+ *
+ *              Table name: Passwords\n
+ *
+ *                 Column:              Type:          Length (bytes):                    Desc:  \n
+ *                 ------               -----          -----------                        -----  \n
+ *                 ID                   TUint32        4                                         \n
+ *                 User name            EDbColText     KIptvSmPasswordsDbPasswordMaxLength*2     \n     
+ *                 Password             EDbColText     KIptvSmPasswordsDbPasswordMaxLength*2     \n
+ *
+ */
+class CIptvServiceManager : public CBase
+    {
+    public:
+    
+        /**
+         * These flags are used in AddOrUpdateServiceL() -method in aModeFlags argument. 
+         */
+        enum TAddServiceModeFlags
+            {
+            /**
+            * If set, the mode is add, if not set the mode is update
+            */
+            EAddService = (1 << 0),
+            
+            /**
+            * Used when doing nested calls, used by CIptvServiceManager itself
+            */
+            EDontOpen   = (1 << 1)
+            };
+    
+    public:  // Constructors and destructor
+
+        /**
+         * NewL
+         * Get instance of a CIptvServiceManager object.
+         */
+        static CIptvServiceManager* NewL();
+
+        /**
+         * ~CIptvServiceManager
+         * Destroy the object.
+         */
+        ~CIptvServiceManager();
+        
+    public: // Public API for database operations
+
+        /**
+         * Removes Services and Passwords databases. Closes any open database,
+         * before deleting files.
+         */
+        void RemoveDbL();
+
+        /**
+         * Retrieve services from databases.
+         *
+         * @param  aSeachLimitFlags See flags from CIptvServiceManagementClient::TSearchLimitFlag type.
+         *                          If aSeachLimitFlags is 0, all services are returned. If aSeachLimitFlags != 0, then
+         *                          only services which have the corresponding feature matching are returned.
+         * @param  aOrder           The order in which the services are returned.
+         * @param  aVersion         database version. If 0, then the latest possible version is used.
+         * @return CIptvServices*   Pointer to class containing services found. 
+         *                          User is responsible for freeing the returned pointer.
+         */
+        CIptvServices *GetServicesL(TUint32 aSearchLimitFlags,
+                                    CIptvServiceManagementClient::TOrder aOrder,
+                                    TInt aVersion);
+
+        /**
+         * Gets services which IDs are on the range of aStartId and aEndId.\n
+         * Result might have gaps, ie every ID value might not contain service.\n
+         * This method is not meant for searching service records, instead one should \n
+         * use this when the service IDs are already known.\n
+         *
+         * @param  aStartId     The first ID to fetch.
+         * @param  aEndId       The last ID to fetch.
+         * @param  aDoOpenClose If ETrue, then the database is tried to open, and is closed at the end.
+         *                      If EFalse, then the database is not opened at start and not closed at end.
+         *                      This param can be used to remove unnecessary open/closes. 
+         * @return              Pointer to class containing services.
+         *                      User is responsible of freeing the returned pointer.
+         */
+        CIptvServices* GetServicesUsingIdL(TUint32 aStartId,
+                                           TUint32 aEndId,
+                                           TBool aDoOpenClose);
+
+        /**
+         * Gets service using ID.
+         *
+         * @param  aServiceId   Service ID in Services database.
+         * @param  aDoOpenClose If ETrue, then the database is tried to open, and is closed at the end.
+         *                      If EFalse, then the database is not opened at start and closed at end.
+         *                      This param can be used to remove unnecessary open/closes. 
+         * @return CIptvService* on success, NULL on fail.
+         */
+        CIptvService* GetServiceL(TUint32 aServiceId, TBool aDoOpenClose);
+
+        /**
+         * Gets services using provider ID.
+         *
+         * @param  aProviderId  Providerd ID in Services database.
+         * @param  aDoOpenClose If ETrue, then the database is tried to open, and is closed at the end.
+         *                      If EFalse, then the database is not opened at start and closed at end.
+         *                      This param can be used to remove unnecessary open/closes. 
+         * @return              CIptvServices* on success, NULL on fail.
+         */
+        CIptvServices* GetServicesL(const TDesC& aProviderId, TBool aDoOpenClose);
+
+        /**
+         * Deletes service from databases (Services DB and Passwords DB).
+         *
+         * @param aId The ID of the service to be deleted.
+         * @return    KErrNone or one of the system-wide error codes.
+         *            Returns KErrNone also if service with aId is not found.
+         */
+        TInt DeleteServiceL(TUint32 aId);
+
+        /**
+         * Registers observer. Ownership does not transfer.
+         * Observers must inherit MIptvServiceManagerObserver
+         * and implement virtual functions.
+         *
+         * @param aObserver Observer which will receive the events.
+         * @return          System-wide error code.
+         */
+        TInt RegisterObserver(MIptvServiceManagerObserver* aObserver);
+
+        /**
+         * DeRegisters observer. Ownership does not transfer.
+         *
+         * @param aObserver Observer to be removed from observers list.
+         */
+        void DeRegisterObserver(MIptvServiceManagerObserver* aObserver);
+
+        /**
+         * Add service to database, if there is already a service with same
+         * aService.iProviderId, then the existing service is updated with new values
+         * and the new record is not created.
+         *
+         * @param aService     A Service to be added to database.
+         * @param aDoOpenClose Used to optimize unnecessarry open/close calls.
+         *                     Normal user uses ETrue always.
+         */        
+        void AddServiceL(CIptvService& aService, TBool aDoOpenClose);
+
+#if defined(__SERIES60_30__) || defined(__SERIES60_31__) || defined(__SERIES60_32__)
+        /**
+         * This method is used to update Video Store service to
+         * active space database.
+         *
+         * @param aServive Service info.
+         */
+        void UpdateVideoStoreSpaceDbL( CIptvService& aServive );
+#endif // defined(__SERIES60_30__) || defined(__SERIES60_31__) || defined(__SERIES60_32__)
+
+        /**
+         * Update existing service in database. aService.iId is used as an identifier.
+         *
+         * @param aService New values to existing service in database.
+         */        
+        void UpdateServiceL(CIptvService& aService);
+
+        /**
+         * Closes Services and Passwords databases opened with OpenL.
+         * Public since cleanupstack calls this.
+         * It is safe to call this even if databases are already closed.
+         */
+        void Close();
+            
+    private:
+
+        /**
+         * Adds a new service to Services database or updates existing one.
+         *
+         * @param aService service to add, or update
+         * @param aMode see values from TAddServiceModeFlags.
+         */
+        void AddOrUpdateServiceL(CIptvService& aService, TUint32 aModeFlags);
+
+        /**
+         * Creates index for Services DB. ID column is used as key.
+         */
+        void CreateServicesDbIndexL();
+
+        /**
+         * Creates index for Passwords DB. ID column is used as key.
+         */        
+        void CreatePasswordsDbIndexL();
+
+        /**
+         * Opens and creates databases if not done already. Can be called
+         * even if already opened and created.
+         */
+        void OpenL();
+
+        /**
+         * Creates files if they are missing, executes provisioning if necessarry.
+         *
+         * @param aDoProvisioning If ETrue, then provisioning is done, if EFalse then it is
+         *                        not performed.
+         */
+        void CreateFilesL(TBool aDoProvisioning);
+
+        /**
+         * Opens Services database.
+         */
+        void OpenServicesDbL();
+
+        /**
+         * Opens Passwords database.
+         */
+        void OpenPasswordsDbL();
+
+        /**
+         * Creates and opens a new Services database. Creates a
+         * database file, table structure and an index constructed from ID column.
+         * The database will be open in exclusive (non-shareable) mode. The
+         * database must be closed, when not used any more. If the
+         * database exists, it is replaced.
+         * Leaves if the file cannot be created or database initialized.
+         * Leaves with system wide error codes.
+         */
+        void CreateServicesDbL();
+
+        /**
+         * Creates and opens a new Passwords database. Creates a
+         * database file and table structure. The database
+         * will be open in exclusive (non-shareable) mode. The
+         * database must be closed, when not used any more. If the
+         * database exists, it is replaced.
+         * Leaves if the file cannot be created or database initialized.
+         * Leaves with system wide error codes.
+         */
+        void CreatePasswordsDbL();
+
+        /**
+         * Perform the first phase of two phase construction.
+         */
+        CIptvServiceManager();
+
+        /**
+         * Perform the second phase construction of a CIptvServiceManager
+         * object
+         */
+        void ConstructL();
+
+        /**
+         * Sends event to all observers.
+         *
+         * @param aEvent     Event to send.
+         * @param aServiceId Service which caused the event.
+         * @param aService   Service data.
+         */
+        void InformObserversL( CIptvSmEvent::TEvent aEvent,
+                               TUint32 aServiceId,
+                               CIptvService* aService);
+
+        /**
+         * Get User name and password from Passwords DB.
+         *
+         * @param aId id of the service
+         * @param aPassword username & password which will be filled from database.
+         */      
+        void GetPasswordL( TUint32 aId, TIptvSmPassword& aPassword );
+
+    private:
+
+        void CreateServicesTableL();
+        void CreatePasswordsTableL();
+        void CreateServicesIndexL();
+        TBool IsServiceIncludedInSearch(TUint32 aSearchLimitFlags,
+                                        CIptvService& aIptvService) const;
+        TInt ExecuteSqlCmd(const TDesC& aSqlCmd, RDbStoreDatabase& aDb);
+        void ExecuteProvisioningL();
+        TBool IsServiceUpdateFoundL(TFileName& aServicesXmlFile);
+        void DoProvisioningL(const TDesC& aServicesXmlFile);
+        void CreateWritableRootDirL(TDriveNumber aDrive);
+
+        /**
+         * Reads SM DB version from SmDbVersion.dat. If version is found and it differs from
+         * SW version, then services.dat and pwd.dat files are deleted. ConvertDatabaseL is run
+         * if DB version is 1 and SW version is 2.
+         */
+        void CheckSmDbVersionL( void );
+        
+        /**
+         * Saves sw version to SmDbVersion.dat.
+         */ 
+        void SaveSmDbVersion( void );
+        
+        /**
+         * Converts SM DB to same version as SW.
+         * Currently supports 1 -> 2 conversion.
+         * @param aOldVersion Current DB version on the disk
+         */         
+        void ConvertDatabaseL( TInt aOldVersion );
+
+        void CompactDatabases();
+
+        /**
+         * Returns highest DisplayOrder value from services DB
+         * 
+         * @return highest DisplayOrder value from services DB or zero.
+         */
+        TUint32 MaxDisplayOrderL();
+
+    private:    // Data
+
+        RArray<MIptvServiceManagerObserver*> iObservers; 
+
+        /**
+        * For use of iServicesFileStore / iPasswordsFileStore
+        */
+        RFs iFsSession;
+    
+        /**
+        * For database operations
+        */
+        RDbStoreDatabase iServicesDb;
+        RDbStoreDatabase iPasswordsDb;
+    
+        /**
+        * For creating and opening services database file
+        */
+        CFileStore* iServicesFileStore;
+
+        /**
+        * For creating and opening passwords database file
+        */
+        CFileStore* iPasswordsFileStore;
+
+        /**
+        * Flag indicating iServicesDb open status
+        */
+        TBool iServicesDbOpen;
+
+        /**
+        * Flag indicating iPasswordsDb open status
+        */
+        TBool iPasswordsDbOpen;
+    
+        /**
+        * Services database filename
+        */
+        TFileName iServicesFile;
+
+        /**
+        * Passwords database filename
+        */
+        TFileName iPasswordsFile;
+
+        /**
+        * The first and every 3rd delete/update/add operation causes database compacting
+        */
+        TUint8 iCompactCounter;
+        
+        /**
+        * Private path
+        */
+        TFileName iPrivatePath;
+
+        /**
+        * Used to store search url temporarily in db operations.
+        */
+        HBufC* iSearchUrl;
+        
+        /**
+        * Used to store record url temporarily in db operations.
+        */
+        HBufC* iRecordUrl;
+
+#if defined(__SERIES60_30__) || defined(__SERIES60_31__) || defined(__SERIES60_32__)	
+        /**
+         * ActiveSpace Helper class.
+         * Own.
+         */
+		CActiveSpaceHelper* iActiveSpaceHelper;
+#endif // defined(__SERIES60_30__) || defined(__SERIES60_31__) || defined(__SERIES60_32__)
+
+    };
+
+#endif // CIPTVSERVICEMANAGER_H