diff -r 000000000000 -r 96612d01cf9f videofeeds/livetvutils/inc/CIptvEpgDatabase.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videofeeds/livetvutils/inc/CIptvEpgDatabase.h Mon Jan 18 20:21:12 2010 +0200 @@ -0,0 +1,765 @@ +/* +* Copyright (c) 2005-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 CIptvEpgDatabase class* +*/ + + + + +#ifndef __CIPTVEPGDATABASE_H__ +#define __CIPTVEPGDATABASE_H__ + +// INCLUDES +#include +#include // CDesCArrayFlat (cannot be forward declarated) +#include // RDbStoreDatabase +#include // RFs +#include // For MBackupObserver && CBaBackupSessionWrapper + +// CONSTANTS +const TInt KCustomSqlLength = 256; +const TInt KIptvEpgProgramMaxLength = 255; +const TInt KIptvEpgChannelNameMaxLength = 255; +const TInt KIptvEpgLogoPathMaxLength = 255; +const TInt KIptvEpgUriMaxLength = 255; +const TInt KIptvEpgDescrMaxLength = 255; +// Channel table +_LIT( KIptvEpgChannelTable, "Channel" ); +_LIT( KIptvEpgChannelDbKeyCol, "Key" ); + +_LIT( KIptvEpgChannelIdCol, "ChannelId" ); +_LIT( KIptvEpgChannelServProviderIdCol, "ServiceProviderId" ); +_LIT( KIptvEpgChannelNameCol, "ChannelName" ); +_LIT( KIptvEpgChannelLogoPathCol, "ChannelLogoPath" ); +_LIT( KIptvEpgChannelDescriptionCol, "ChannelDescription" ); +_LIT( KIptvEpgChannelURICol, "ChannelURI" ); +_LIT( KIptvEpgChannelSDPCol, "ChannelSDP" ); +_LIT( KIptvEpgChannelOrderCol, "ChannelOrder" ); + +// Program table +_LIT( KIptvEpgProgramTable, "ProgramEvent" ); +_LIT( KIptvEpgProgramDbKeyCol, "Key" ); +_LIT( KIptvEpgProgramIdCol, "ProgramId" ); +_LIT( KIptvEpgProgramChannelId, "ProgramChannelId" ); +_LIT( KIptvEpgProgramServProviderIdCol, "ServiceProviderId" ); +_LIT( KIptvEpgProgramStartTimeCol, "ProgramStartTime" ); +_LIT( KIptvEpgProgramEndTimeCol, "ProgramEndTime" ); +_LIT( KIptvEpgProgramURICol, "ProgramURI" ); +_LIT( KIptvEpgProgramGenreCol, "ProgramGenre" ); +_LIT( KIptvEpgProgramNameCol, "ProgramName" ); +_LIT( KIptvEpgProgramDescriptionCol, "ProgramDescription" ); +_LIT( KIptvEpgProgramLanguageCol, "ProgramLanguage" ); +_LIT( KIptvEpgProgramParentalRatingCol, "ProgramParentalRating" ); + +// Schedule table +_LIT( KIptvEpgScheduleTable, "Schedule" ); +_LIT( KIptvEpgScheduleTableKeyCol, "ScheduleKey" ); +_LIT( KIptvEpgScheduleServiceProviderIdCol, "ScheduleServiceProviderId" ); +_LIT( KIptvEpgScheduleChannelIdCol, "ScheduleChannelId" ); +_LIT( KIptvEpgScheduleProgramIdCol, "ScheduleProgramId" ); +_LIT( KIptvEpgScheduleStartTimeCol, "ScheduleStartTime" ); +_LIT( KIptvEpgScheduleEndTimeCol, "ScheduleEndTime" ); + +// LatestEpgAvailable table +_LIT( KIptvEpgLatestEpgAvailableTable, "LatestEpgAvailable" ); +_LIT( KIptvEpgLatestEpgAvailableTableKeyCol, "LatestEpgAvailableKey" ); +_LIT( KIptvEpgLatestEpgAvailableServiceProviderIdCol, "LatestEpgAvailableServiceProviderId" ); +_LIT( KIptvEpgLatestEpgAvailableStartTimeCol, "LatestEpgAvailableStartTime" ); + +// Last modified table +_LIT( KIptvEpgLastModifiedTable, "LastModifiedMetadata" ); +_LIT( KIptvEpgLastModifiedTableKeyCol, "LastModifiedMetadataKey" ); +_LIT( KIptvEpgLastModifiedTableServiceIdCol,"LastModifiedMetadataServiceId" ); +_LIT( KIptvEpgLastModifiedTableETagCol, "LastModifiedMetadataETag" ); +_LIT( KIptvEpgLastModifiedTableTimeCol, "LastModifiedMetadataTime" ); + +// FORWARD DECLARATIONS +// CLASS DECLARATION + +class CIptvEpgChannel; +class CIptvEpgProgram; +class CIptvEpgSchedule; +class CIptvEpgScheduleSearch; +class CIptvEpgLatestEpgAvailable; +class CIptvEpgProgramWithSchedule; + +/** + * Class: CIptvEpgDatabase + * + * Description: An instance of class CIptvEpgDatabase provides Epg + * database access: creating & manipulating Epg database + * files and database entries (channels, and programs). + * + * Database definition: + * + * The Epg database contains one table as follows: + * + * Table name: Channel + * Column: Type: Length (bytes): Desc: + * ------ ----- ----------- ----- + * Key EDbColUint32 + * ChannelId EDbColInt64 + * ServiceProviderId EDbColUint32 + * ChannelName EDbColText + * ChannelLogoPath EDbColText + * ChannelDescription EDbColText + * ChannelURI EDbColText + * ChannelSDP EDbColLongText + * ChannelOrder EDbColUint32 + * + * + * There is also index for Channel table with name "ChannelIndex". + * It consists of Key column. + * + * Index provides quick find. + * + * + * Database definition: + * + * The Epg database contains one table as follows: + * + * Table name: ProgramEvent + * Column: Type: Length (bytes): Desc: + * ------ ----- ----------- ----- + * Key EDbColUint32 + * ProgramId EDbColInt64 + * ProgramChannelId EDbColInt64 + * ServiceProviderId EDbColUint32 + * ProgramStartTime EDbColDateTime + * ProgramEndTime EDbColDateTime + * ProgramURI EDbColText + * ProgramSDP EDbColLongText + * ProgramGenre EDbColText + * ProgramName EDbColText + * ProgramDescription EDbColText + * ProgramLanguage EDbColText + * ProgramParentalRating EDbColText + * + * + * There is also index for Program table with name "ProgramIndex". + * It consists of Key column. + * + * Index provides quick find. + * + * Database definition: + * The epg database contains one table as follows: + * Table name: Last modified + * Table name: ChannelProgram + * Column: Type: Length (bytes): Desc: + * ------ ----- ----------- ----- + * ServiceId EDbColUint32 + * LastModifedDateTime EDbColText + * ETag EDbColText + * + * Database definition: + * + * The Epg database contains one table as follows: + * + * Table name: ChannelProgram + * Column: Type: Length (bytes): Desc: + * ------ ----- ----------- ----- + * ChannelKey EDbColUint32 4 + * ProgramKey EDbColUint32 4 + * + * + */ +class CIptvEpgDatabase : public CBase, public MBackupObserver + { + public: + /** + * Enumeration for the database class internal state. + */ + enum TIptvEpgDatabaseInternalState + { + EReady = 0, // This class is ready to be used + EBackup // Database backup is ongoing -> no interaction allowed + }; + + public: // Constructors and destructor + + /** + * Two-phased constructor. + * @param + */ + IMPORT_C static CIptvEpgDatabase* NewL( const TFileName& aDbFile ); + + /** + * Destructor. + */ + virtual ~CIptvEpgDatabase(); + + public: // From MBackupObserver + /** + * Method to get called when file that this class has registered + * to observe for backup is to be affected with backup operation. + * This method is also called when it's allowed to re-open the + * file for read/write. + * @param aFileName Name of the file that needs to be closed + * or can be re-opened + * @param aFlags Flags identifying the operation to be happen + * @return None + */ + void ChangeFileLockL( const TDesC& aFileName, TFileLockFlags aFlags ); + + public: // Public API for database operations + + /** + * Get channels. + * + * @param aServiceProviderId Service provider id. + * @param aResultArray Array of channels. + */ + IMPORT_C void GetChannelsL( const TUint32 aServiceProviderId, + RPointerArray* + aResultArray ); + + /** + * Get programs. + * + * @param aServiceProviderId Service provider id. + * @param aChannelKey Channel id. + * aResultArray. + * @param aResultArray Array where found results are put. + */ + IMPORT_C void GetProgramsByChannelIdL( + const TUint32 aServiceProviderId, + const TInt64 aChannelKey, + RPointerArray* + aResultArray ); + + /** + * Get next program by channel. + * + * @param aServiceProviderId Service provider id. + * @param aChannelKey Channel id. + * @param aRefTime reference time + * @return CIptvEpgSchedule* the found schedule + */ + IMPORT_C CIptvEpgSchedule* GetNextProgramL( + const TUint32 aServiceProviderId, + const TInt64 aChannelKey, + const TTime& aRefTime ); + + /** + * Get schedules (for search) by service id. + * + * @param aServiceProviderId Service provider id. + * aResultArray. + * @param aResultArray Array where found results are put. + * @return None + */ + IMPORT_C void GetSchedulesByServiceIdL( + const TUint32 aServiceProviderId, + RPointerArray* aResultArray ); + + /** + * Get programs. + * + * @param aServiceProviderId Service provider id. + * @param aChannelKey Channel id. + * aResultArray. + * @param aResultArray Array where found results are put. + * @return None + */ + IMPORT_C void GetSchedulesByChannelIdL( + const TUint32 aServiceProviderId, + const TInt64 aChannelKey, + RPointerArray* aResultArray ); + /** + * Get the programs for that channel and day + * + * @param aServiceProviderId Service provider id. + * @param aChannelKey Channel id. + * @param aStartTime start of the day + * @param aResultArray Array where found results are put. + * @return None + * + */ + IMPORT_C void GetSchedulesByChannelAndDayL( + const TUint32 aServiceProviderId, + const TInt64 aChannelKey, + const TTime& aStartTime, + RPointerArray* aResultArray ); + + + /** + * Get the program that covers the given start time + * in its time duration + * + * @param aServiceProviderId Service provider id. + * @param aChannelKey Channel id. + * @param aStartTime + * @return CIptvEpgSchedule* the found schedule + * + */ + + + IMPORT_C CIptvEpgSchedule* GetProgramByTimeL( + const TUint32 aServiceProviderId, + const TInt64 aChannelKey, + const TTime& aStartTime + ); + /** + * Get channel specified by id + * @param aService Service provider id + * @param aChannel Channel id + * @return CIptvEpgChannel or NULL if not found + */ + IMPORT_C CIptvEpgChannel* GetChannelL( TInt aService, + TInt64 aChannel ); + /** + * Get latest schedule time in db + * @param aService Service provider id + * @param aLatestScheduleTime, returns this + * @return Latest schedule time in database. + */ + IMPORT_C TTime GetLatestScheduleTimeL( const TUint32 aServiceId ); + + /** + * Inserts or updates given channel to the database. + * Each channel must have unique id inside one serivice providers + * list of channels. Therefore is aChannel.iChannelId is found from + * database and that database entry has aChannel.iServiceProviderId + * existing data is update. Otherwise aChannel is added to the + * database. + * @param aChannel Object containing data to be inserted or + * updated to the database + * @param aChannelKey On return contains unique database id of + * inserted or updated database entry + */ + IMPORT_C void InsertOrUpdateChannelL( const CIptvEpgChannel& aChannel, + TUint32& aChannelKey ); + + /** + * Delete channel from the database. This causes all programs which + * has aChannelId in the program table to be deleted as well. + * @param aServiceProviderId Service provider id. + * @param aChannelId Channel id of the channel to be deleted + * @return None + */ + IMPORT_C void DeleteChannelL( const TUint32 aServiceProviderId, + const TInt64 aChannelId ); + + /** + * Inserts or updates given program to the database. + * Each program must have unique program id inside a channel. This + * function tries to find an entry from database which has + * aProgram.iProgramId and aProgram.iChannelId. If one is found from + * the database, then database is updated, otherwise new entry is + * made. + * @param aProgram Class containing the program data to be + * added or updated + * @param aProgramKey On return contains unique database id of + * inserted or updated database entry + */ + IMPORT_C void InsertOrUpdateProgramL( const CIptvEpgProgram& aProgram, + TUint32& aProgramKey ); + + IMPORT_C void InsertOrUpdateScheduleL( + const CIptvEpgSchedule& aSchedule ); + /** + * Inserts or updates given latestEpgAvailable info to the database. + * @param aLatestEpgAvailable + * @param aInsert boolean to decide insert or update + */ + IMPORT_C void InsertOrUpdateLatestEpgAvailableL + ( CIptvEpgLatestEpgAvailable& aLatestEpgAvailable ); + + /** + * Delete program from the database. + * @param aServiceProviderId Service provider id. + * @param aProgramId Id of the program to be deleted from + * program table + * @return None + */ + IMPORT_C void DeleteProgramL( const TUint32 aServiceProviderId, + const TInt64 aProgramId ); + + /** + * Update channel order. + * + * @param aServiceId Service provider id. + * @param aChannelId Channel id. + * @param aOrder New order number. + */ + IMPORT_C void UpdateChannelOrderL( const TUint32 aServiceId, + const TInt64 aChannelId, + const TUint32 aOrder ); + + /** + * Update channel icon path. + * + * @param aServiceId Service provider id. + * @param aChannelId Channel id. + * @param aIconPath New icon path + */ + IMPORT_C void UpdateChannelIconPathL( const TUint32 aServiceId, + const TInt64 aChannelId, + const TDesC& aIconPath ); + /** + * Gets the schedules by program id + * + * @param aServiceId Service provider id. + * @param aChannelKey Channel id. + * @param aProgId program id + * @param aResultArray + */ + IMPORT_C void GetSchedulesByProgIdL( + const TUint32 aServiceProviderId, + const TInt64 aChannelKey, + const TInt64 aProgId, + RPointerArray* aResultArray ); + + /** + * Clear service specific EPG data from database. + * @param aServiceId Service id. + */ + IMPORT_C void ClearServiceEPGDataL( const TUint32 aServiceId ); + + + /** + * Add new channel to database. + * + * @param aChannel Reference to CIptvMulticastChannel + * object. + * @param aChannelKey New channel key value is inserted to + * aChannelKey. + */ + IMPORT_C void AddChannelL( const CIptvEpgChannel& aChannel, + TUint32& aChannelKey ); + + IMPORT_C void AddChannelsL( const RPointerArray& aChannels, + TUint32& aChannelKey ); + + /** + * Add new program to database. + * + * @param aProgram Reference to CIptvMulticastProgram + * object. + * @param aProgramKey New program key value + */ + IMPORT_C void AddProgramL( const CIptvEpgProgram& aProgram, + TUint32& aProgramKey ); + + IMPORT_C void AddProgramsL( const RPointerArray& aPrograms ); + + + IMPORT_C void AddProgramWithScheduleL( CIptvEpgProgramWithSchedule& aProgramWithSchedule, + TUint32& aProgramKey ); + + IMPORT_C void AddProgramsWithSchedulesL( + const RPointerArray& aProgramsWithSchedules ); + + /** + * Add schedule + * @param aSchedule Schedule information to be added to the database + * @return None + */ + IMPORT_C void AddScheduleL( const CIptvEpgSchedule& aSchedule ); + + IMPORT_C void AddSchedulesL( const RPointerArray& aSchedules ); + + /** + * Get single program entry. + * @param aServiceProviderId Service id. + * @param aChannelId Channel id. + * @param aProgramId Program id. + * @return Found program entry or NULL if not found. NULL also returned + * if iLocalState == EBackup. Ownership is + * transferred to the caller. + */ + IMPORT_C CIptvEpgSchedule* GetProgramL( const TUint32 aServiceProviderId, + const TInt64 aChannelId, + const TInt64 aProgramId ); + /* + * Getter method for ETag and last modified date and time for the given service + * @param aServiceId Service that we are looking for + * last modified data + * @param aETag On return contains the retrieved + * etag value from the db + * @param aLastModifiedDateTime On return contains the retrieved + * last modified value from db + * @return None + */ + IMPORT_C void GetLastModifiedDataL( const TUint32 aServiceId, + TDes& aETag, + TDes& aLastModifiedDateTime ); + + /** + * Setter method for last modified data to the database + * @param aServiceId Id of the service we are assigning the + * last modified data values + * @param aETag ETag value to be stored to the db + * @param aLastModifiedDateTime Last modified data to be stored to the db. + * This value can be something like: + * "Sun, 23 Jan 2007 08:20:37 GMT" + * @return None + */ + IMPORT_C void SetLastModifiedDataL( const TUint32 aServiceId, + const TDesC& aETag, + const TDesC& aLastModifiedDateTime ); + + private: + /** + * Constructor + * @param aDbFile Filename of the database to be used + */ + CIptvEpgDatabase( const TFileName& aDbFile ); + + /** + * Symbian second phase constructor. All code that might leave + * during construction is placed in here. + * @param None + * @return None + */ + void ConstructL(); + + /** + * Removes all rows from channel table in the epg database + * using given service id. + * @param aServiceId Service id. + * @return None + */ + void ClearChannelTableL( const TUint32 aServiceId ); + + + /** + * Removes all service specific rows from program table in + * the epg database. + * @param aServiceId Service id. + * @return None + */ + void ClearProgramTableL( const TUint32 aServiceId ); + + /** + * Removes all service specific rows from schedule table in + * the epg database. + * @param aServiceId Service id. + * @return None + */ + void ClearScheduleTableL( const TUint32 aServiceId ); + + + /** + * Removes all service specific rows from latest epg table in + * the epg database. + * @param aServiceId Service id. + * @return None + */ + void ClearLatestEpgTableL( const TUint32 aServiceId ); + + /** + * Removes all service specific rows from last modified table. + * @param aServiceId Service id which rows are to be removed + * @return None + */ + void ClearLastModifiedTableL( const TUint32 aServiceId ); + + /** + * Add LatestEpgAvailable + * @param aLatestEpgAvailable LatestEpgAvailable for a service information + * to be added to the database + * @return None + */ + void AddLatestEpgAvailableL( CIptvEpgLatestEpgAvailable& aLatestEpgAvailable ); + + /** + * Create channel table + */ + void CreateChannelTableL( RDbNamedDatabase& aDatabase ) const; + + /** + * Create program table + */ + void CreateProgramTableL( RDbNamedDatabase& aDatabase) const; + + /** + * Create last modified table. This table consist of service id, ETag value + * and last modified date (ETag and last modified are optional values) + * @param aDatabase Reference to the database where the table is + * created. + * @return None + */ + void CreateLastModifiedTableL( RDbNamedDatabase& aDatabase ) const; + + /** + * Create ChannelProgram table + */ + void CreateChannelProgramTableL( RDbNamedDatabase& aDatabase ) const; + + /** + * Create Schedule table + */ + void CreateScheduleTableL( RDbNamedDatabase& aDatabase ) const; + + /** + * Create LatestEpgAvailable table + */ + void CreateLatestEpgAvailableTableL( RDbNamedDatabase& aDatabase ) const; + + /** + * Gets each and every row from view and parses the data to result + * array. If aResultArray is NULL, this function leaves with + * KErrArgument. + * @param aSqlStatement SQL statement to be used for database. + * @param aResultArray Array where parsed database stuff is + * put into. + * @return None + */ + void FetchProgramsFromTableL( const TDesC& aSqlStatement, + RPointerArray* aResultArray ); + + + /** + * Gets program names and program ids from program table. + * If aResultArray is NULL, this function leaves with + * KErrArgument. + * @param aSqlStatement SQL statement to be used for database. + * @param aResultArray Array where parsed database stuff is + * put into. + * @return None + */ + void FetchProgramNamesFromTableL( const TDesC& aSqlStatement, + RPointerArray* aResultArray ); + /** + * Gets each and every row from view and parses the data to result + * array. If aResultArray is NULL, this function leaves with + * KErrArgument. + * @param aSqlStatement SQL statement to be used for database. + * @param aResultArray Array where parsed database stuff is + * put into. + * @return None + */ + void FetchSchedulesFromTableL( const TDesC& aSqlStatement, + RPointerArray* aResultArray ); + + + /** + * Gets rows from schedule table using given sql statement and puts + * results to aResultArray. If aResultArray is NULL, this function + * leaves with KErrArgument. + * @param aSqlStatement SQL statement to be used for database. + * @param aResultArray Array where parsed database stuff is + * put into. + * @return None + */ + void FetchSearchSchedulesFromTableL( + const TDesC& aSqlStatement, + RPointerArray* aResultArray ); + + /** + * Get channels. The actual workhorse. Called from public + * channel-getting methods. + * + * @param aQuery Contains SQL that is supposed to return the channels + * @param aResultArray Array of channels. + */ + void DoGetChannelsL( const TDesC& aQuery, + RPointerArray* + aResultArray ); + + /** + * + * Create new database if DB file is not found. + */ + void CreateDbL(); + + /** + * Creates session to iptv database + */ + void CreateMulticastDbSessionL(); + + /** + * Closes the session to iptv database + */ + void CloseMulticastDbSession(); + + /** + * Update channel order numbers so that they are consistent. + * @param aServiceProviderId Service id. + */ + void UpdateChannelOrdersL( const TUint32 aServiceProviderId ); + + /** + * Method for deleting all schedule data for given channel. + * @param aChannel Specifies the channel whose schedules will be + * thrown away. + * @return None + */ + void RemoveScheduledDataFromChannelL( const CIptvEpgChannel& aChannel ); + + /** + * Get program names and program ids using service id. + * @param aServiceProviderId Service ID. + * @param aResultArray Array where results are put. + */ + void GetProgramNamesByServiceIdL( const TUint32 aServiceProviderId, + RPointerArray* + aResultArray ); + + private: + + /** + * Initialise database + */ + void InitDbL(); + + /** + * Construct SQL-query strings + */ + void MakeSqlStrings(); + + /** + * Method to check iStatus state to see if we are having backup + * in progress. If that's the case then we'll put CActiveSchedulerWait + * on and wait until backup has been finished. Otherwise this method + * does nothing. + * @param None + * @return None + */ + void CheckBackupStatus(); + + private: + + /** File server session is connected in construction and closed in + destruction */ + RFs iFsSession; + + /** File name of the database which to handle */ + TFileName iDbFile; + + /** Multicast DB session */ + RDbs iMulticastDbSession; + + /** Multicast database */ + RDbNamedDatabase iMulticastDb; + + /** Channel SQL-query string */ + TBuf iSqlChannel; + + /* Program SQL-query string */ + TBuf iSqlProgram; + + /* Backup session to observer starting/ending backup operation */ + CBaBackupSessionWrapper* iBackupWrapper; + + /* Current state of this object */ + TIptvEpgDatabaseInternalState iLocalState; + + CActiveSchedulerWait* iActiveWait; + }; + +#endif // __CIPTVEPGDATABASE_H__ + +// End of File