diff -r 826cea16efd9 -r 13a33d82ad98 videoscheduler/SchedulerServer/inc/CCseScheduleDB.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videoscheduler/SchedulerServer/inc/CCseScheduleDB.h Wed Sep 01 12:20:37 2010 +0100 @@ -0,0 +1,447 @@ +/* +* Copyright (c) 2006 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 CCseScheduleDB class* +*/ + + + +#ifndef _CCSESCHEDULEDB_H +#define _CCSESCHEDULEDB_H + +#include +#include // RDbStoreDatabase +#include // RFs +#include +#include + +// CONSTANTS +const int KCseCustomSqlLength = 256; +const int KCseDbCompactTimeout = 30000000; + +// Constant for filename definition +_LIT( KCseScheduleDBName, "CseSchedules.db" ); +// Database table +_LIT( KCseDatabaseTable, "CseDatabase" ); +_LIT( KCseDatabaseVersionCol, "DbVersion" ); +_LIT( KCseDatabaseReserved1Col, "DbReserved1" ); +_LIT( KCseDatabaseReserved2Col, "DbReserved2" ); + +// Program table +_LIT( KCseScheduleTable, "ScheduleEvent" ); +_LIT( KCseScheduleDbKeyCol, "Key" ); +_LIT( KCseScheduleNameCol, "Name" ); +_LIT( KCseScheduleStartTimeCol, "StartTime" ); +_LIT( KCseScheduleEndTimeCol, "EndTime" ); +_LIT( KCseScheduleApplicationUIDCol, "ApplicationUID" ); +_LIT( KCseSchedulePlugInUIDCol, "PlugInUID" ); +_LIT( KCseScheduleTypeCol, "Type" ); +_LIT( KCseScheduleApplicationSpecificCol, "ApplicationSpecificData" ); +_LIT( KCseScheduleRunCountCol, "ScheduleRunCount" ); +_LIT( KCseScheduleStateCol, "ScheduleState" ); +_LIT( KCseSchedulePluginTypeCol, "PluginType" ); +_LIT( KCseScheduleReserved1Col, "ScheduleReserved1" ); +_LIT( KCseScheduleReserved2Col, "ScheduleReserved2" ); + +class CCseScheduledProgram; + +/** +* Version of CleanupXxxxPushL() that can be used to 'ResetAndDestroy' +* the supplied object if the clean-up stack unwinds. +*/ +template +class CleanupResetAndDestroy + { + public: + inline static void PushL( T& aRef ); + private: + static void ResetAndDestroy( TAny *aPtr ); + }; + +template + inline void CleanupResetAndDestroyPushL( T& aRef ); + +template +inline void CleanupResetAndDestroy::PushL( T& aRef ) + { + CleanupStack::PushL( TCleanupItem( &ResetAndDestroy, &aRef ) ); + } + +template +void CleanupResetAndDestroy::ResetAndDestroy( TAny *aPtr ) + { + ( static_cast( aPtr ) )->ResetAndDestroy(); + } + +template +inline void CleanupResetAndDestroyPushL( T& aRef ) + { + CleanupResetAndDestroy::PushL( aRef ); + } + + +/** +* Schedule database. +*/ +class CCseScheduleDB : public CBase, + public MBackupObserver +{ + public: // Constructors and destructors + virtual ~CCseScheduleDB(); + + /** + * Two-phased constructor. + */ + IMPORT_C static CCseScheduleDB* NewL(); + + /** + * Enum for schedule state + */ + enum TCseScheduleState + { + ECseWaiting = 0, + ECseRunning + }; + + /** + * Enum for database access + */ + enum TCseDatabaseAccess + { + ECseDbOpen = 0, + ECseDbLocked + }; + + public: // Methods from MBackupObserver + void ChangeFileLockL(const TDesC &aFileName, TFileLockFlags aFlags); + + public: // New methods + /** + * Adds given schedule to database. Method will leave with + * KErrLocked -error code if Backup/Restore is going on. + * @param aData schedule to be added to database. + * @return None + */ + void AddScheduleL( CCseScheduledProgram& aData ); + + /** + * Removes schedule from database. Method will leave with + * KErrLocked -error code if Backup/Restore is going on. + * @param aData schedule to be removed from database. + * @return None + */ + void RemoveScheduleL( const TUint32 aDbIdentifier ); + + /** + * Finds start time of the schedule that is happening next from the database. + * Method will leave with KErrLocked -error code if Backup/Restore is going on. + * @return Start time of the next schedule. + */ + TTime GetNextScheduleTimeL(); + + /** + * Fills parameter array with schedules that have same starting time as + * paramter time. Method will leave with KErrLocked -error code if + * Backup/Restore is going on. + * @param aSchdeduleTime Start time of the schedules fetched. + * @param aNextScheduleArray Array containing schedules after call + * is completed. + * @return None + */ + void FillScheduleArrayByTimeL( const TTime& aScheduleTime, + RPointerArray& aNextScheduleArray ); + + /** + * Gets the given schedule from database. Method will leave with + * KErrLocked -error code if Backup/Restore is going on. + * @param aDbIdentifier Database identifier of the schedule fetched. + * @param aSchedule Pointer where schedule is stored when call + * is completed. + * @return None + */ + void GetScheduleByDbIdentifierL( const TUint32 aDbIdentifier, + CCseScheduledProgram* aSchedule ); + + /** + * Get application specific schedules from db. Method will leave with + * KErrLocked -error code if Backup/Restore is going on. + * @param aAppUid Application UID. + * @param aScheduleArray Array where to put scheduled events. + * @return None + */ + void GetApplicationSchedulesL( const TInt32 aAppUid, + RPointerArray& aArray ); + + /** + * Get overlapping schedules. Method will leave with + * KErrLocked -error code if Backup/Restore is going on. + * @param aType Schedule type (one from + * CCseScheduledProgram::TCseScheduleType) + * @param aStartTime Start time + * @param aEndTime End Time + * @param aResultArray On return, contains pointers to overlapping schedules + * empty if none found. + * @return None. + */ + void GetOverlappingSchedulesL( const TInt32 aType, + const TTime& aStartTime, + const TTime& aEndTime, + RPointerArray& aResultArray ); + + /** + * Increases runcount of given schedule in DB. Method will leave with + * KErrLocked -error code if Backup/Restore is going on. + * @param aDbIdentifier Database identifier of the schedule thats + * runcount is to be incremented + */ + void IncreaseRunCountL( const TUint32 aDbIdentifier ); + + /** + * Gets the runcount of give schedule. Method will leave with + * KErrLocked -error code if Backup/Restore is going on. + * @param aDbIdentifier DbIdentifier of the schedule whos runcount is fetched. + * @return Run count of the schedule. + */ + TInt32 GetRunCountL( const TUint32 aDbIdentifier ); + + /** + * Gets the state of give schedule. Method will leave with + * KErrLocked -error code if Backup/Restore is going on. + * @param aDbIdentifier DbIdentifier of the schedule whos state is fetched. + * @return Schedule state (one of the CCseScheduledDB::TCseScheduleState) + */ + TInt32 GetScheduleStateL( const TUint32 aDbIdentifier ); + + /** + * Sets the state of give schedule. Method will leave with + * KErrLocked -error code if Backup/Restore is going on. + * @param aDbIdentifier DbIdentifier of the schedule whos state is fetched. + * @param aState State to be set. + * @return None + */ + void SetScheduleStateL( const TUint32 aDbIdentifier, + const TInt32 aState ); + + /** + * Gets the startup schedules from the DB. When phone is set on, we try to run all + * schdeulus that were on run when the phone was set off (run count is bigger than 0). + * Method will leave with KErrLocked -error code if Backup/Restore is going on. + * @param aResultArray Array where schedules that were on run are stored. + * @return None + */ + void StartupSchedulesL( RPointerArray& aResultArray ); + + /** + * Get plugin specific schedules from db. Method will leave with + * KErrLocked -error code if Backup/Restore is going on. + * @param aPluginUid Application UID. + * @param aScheduleArray Array where to put scheduled events. + * @return None + */ + void GetSchedulesByPluginL( const TInt32 aPluginUid, + RPointerArray& aArray ); + + /** + * Get plugin specific schedules of specific type from db. Method will leave with + * KErrLocked -error code if Backup/Restore is going on. + * @param aType Schedule type + * @param aScheduleArray Array where to put scheduled events. + * @return None + */ + void GetSchedulesByTypeL( const TInt32 aType, + RPointerArray& aArray ); + + /** + * Get schedules in given timeframe. Method will leave with + * KErrLocked -error code if Backup/Restore is going on. + * @param aBeginning Start time of timeframe + * @param aEnd End Time of timeframe + * @param aResultArray On return, contains pointers to overlapping schedules + * empty if none found. + * @return None. + */ + void GetSchedulesByTimeframeL( const TTime& aStartTime, + const TTime& aEndTime, + RPointerArray& aResultArray ); + + /** + * Gets all the uid's of different plugins that are in DB. + * KErrLocked -error code if Backup/Restore is going on. + * @param aPlugins On return, contains all the different plugin uid's in + * db. Empty if none found. + */ + void GetPluginsL( RArray& aPlugins ); + + /** + * Get the next happening time of schedule from database based on plugin uid. + * KErrLocked -error code if Backup/Restore is going on. + * @param aPluginUid Plugin uid in which to base the search + * @return Next start time of the schedule of given plugin Uid. + */ + TTime GetNextScheduleTimeByPluginL( TInt32 aPluginUid ); + + /** + * Gets all the schedules that are going to happen at the given time based on plugin uid. + * KErrLocked -error code if Backup/Restore is going on. + * @param aScheduleTime Start time in which to base the search + * @param aPluginUid Plugin uid in which to base the search + * @param aNextScheduleArray On return, contains pointers to schedules. + */ + void GetSchedulesByTimeAndPluginL( + const TTime& aScheduleTime, + TInt32 aPluginUid, + RPointerArray& aNextScheduleArray ); + + + private: + /** + * C++ default constructor. + */ + CCseScheduleDB(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + private: // Methods + /** + * Checks the db version from db. If it is older than current one, destroy it + * and create new one. + * @return None + */ + void CheckDbVersionL(); + + /** + * Open DB or create new database if DB file is not found. + * @return None + */ + void OpenOrCreateDbL(); + + /** + * Create schedule table. + * @param aDatabase where to create schedule table. + * @return None + */ + void CreateScheduleTableL( RDbStoreDatabase& aDatabase ) const; + + /** + * Create database table. + * @param aDatabase where to create database table. + * @return None + */ + void CreateDatabaseTableL( RDbStoreDatabase& aDatabase ); + + /** + * Gets the database version number + * @param None + * @return None + */ + TInt GetDbVersionL( ); + + /** + * Set hardcoded database version to database. Used after creating new database. + * @param None + * @return None + */ + void SetDatabaseVersionL(); + + /** + * Removes existing database. + * @return None + */ + void RemoveDbL(); + + /** + * Static call back for CPeriodic. + * @param aThis Pointer to CCseScheduleDB so that we can + * direct call back to class. + * @return Always TFalse + */ + static TInt CompactCallback( TAny* aThis ); + + /** + * We want to compact database 30 seconds after last database operation. + * this resets 30 sec counter. + * @return None + */ + void ResetCompactTimer( ); + + /** + * Compacts database. + * @return None + */ + void CompactDb(); + + /** + * Closed Db file and sets iDbAccess to ECseDbLocked. + * @return None + */ + void CloseDbFile(); + + /** + * Closed Db file and sets iDbAccess to ECseDbOpen. + * @return None + */ + void OpenDbFileL(); + + /** + * Leaves with KErrLocked if iDbAccess is ECseDbLocked. + * @return None + */ + void LeaveIfDbLockedL() const; + + private: // Data + /** + * File server session is connected in construction and closed in + * destruction + */ + RFs iFsSession; + + /** + * File name of the database which to handle + */ + TFileName iDbFile; + + /** + * For database operations + */ + RDbStoreDatabase iScheduleDb; + + /** + * For creating and opening services database file. Own. + */ + CFileStore* iScheduleFileStore; + + /** + * Timer used in compacting database. Own. + */ + CPeriodic* iCompactTimer; + + /** + * SQL string for SQL calls + */ + TBuf iSqlSchedule; + + /** + * Status is database accessible + */ + TCseDatabaseAccess iDbAccess; + + /** + * Wrapper to get notification if backup/restore is + * about to happen. Own. + */ + CBaBackupSessionWrapper* iBackupWrapper; +}; +#endif _CCSESCHEDULEDB_H \ No newline at end of file