--- /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