diff -r 000000000000 -r 96612d01cf9f videofeeds/server/IptvServiceManager/inc/CIptvServiceManager.h --- /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 +#include // CDesCArrayFlat (cannot be forward declarated) +#include // RDbStoreDatabase +#include // 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 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