diff -r 000000000000 -r 96612d01cf9f videofeeds/livetvutils/src/CIptvSettingsDatabase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videofeeds/livetvutils/src/CIptvSettingsDatabase.cpp Mon Jan 18 20:21:12 2010 +0200 @@ -0,0 +1,431 @@ +/* +* 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: Offers interface to IPTV Settings database* +*/ + + + + +// INCLUDE FILES +#include // file helpers +#include "IptvLiveLogger.h" +#include "CIptvSettingsDatabase.h" + +// CONSTANTS + +// Column numbers +const TInt KIptvParentalControlColNo = 1; +const TInt KIptvRecordingTimeColNo = 2; +const TInt KIptvReminderTimeColNo = 3; +const TInt KIptvLastUsedServiceColNo = 4; +const TInt KIptvLastUsedChannelColNo = 5; +const TInt KIptvIsLastUsedColNo = 6; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CIptvSettingsDatabase::CIptvSettingsDatabase +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +CIptvSettingsDatabase::CIptvSettingsDatabase( const TFileName& aDbFile ) : + iDbFile( aDbFile ) + { + } + +// ----------------------------------------------------------------------------- +// CIptvSettingsDatabase::ConstructL +// Second phase construction. Leaves, if RFs session cannot be created. +// ----------------------------------------------------------------------------- +void CIptvSettingsDatabase::ConstructL() + { + LIVE_TV_TRACE1(_L("CIptvSettingsDatabase::ConstructL()")); + User::LeaveIfError( iFsSession.Connect() ); + CreateDbL(); + TRAPD( error, CreateDbSessionL() ); + if ( error != KErrNone ) + { + LIVE_TV_TRACE2(_L("CIptvSettingsDatabase:: Could not open session to db (%d)"), error); + + if ( error != KErrNoMemory && + error != KErrLocked && + error != KErrDisMounted && + error != KErrDiskFull && + error != KErrNotReady ) + { + // Delete and recreate database file. Cannot recover other way. + LIVE_TV_TRACE1(_L("CIptvSettingsDatabase:: fatal error occured while opening db, recreating db")); + + iFsSession.Delete( iDbFile ); //ignore error + + TRAP( error, CreateDbL() ); + if ( error != KErrNone ) + { + LIVE_TV_TRACE2(_L("CIptvSettingsDatabase:: couldnt recreate db (%d), leaving."), error); + User::Leave( error ); + } + + TRAP( error, CreateDbSessionL() ); + if ( error != KErrNone ) + { + LIVE_TV_TRACE2(_L("CIptvSettingsDatabase:: couldnt open session to db (%d), leaving."), error); + User::Leave( error ); + } + + } + else + { + LIVE_TV_TRACE1(_L("CIptvSettingsDatabase:: temporary error occured while opening db, leaving db intact, leaving.")); + User::Leave( error ); + } + } + } + +// ----------------------------------------------------------------------------- +// CIptvSettingsDatabase::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +EXPORT_C CIptvSettingsDatabase* CIptvSettingsDatabase::NewL( + const TFileName& aDbFile ) + { + LIVE_TV_TRACE1(_L("CIptvSettingsDatabase::NewL()")); + CIptvSettingsDatabase* self = new ( ELeave ) CIptvSettingsDatabase( aDbFile ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CIptvSettingsDatabase::~CIptvSettingsDatabase() +// Destructor +// ----------------------------------------------------------------------------- +EXPORT_C CIptvSettingsDatabase::~CIptvSettingsDatabase() + { + LIVE_TV_TRACE1(_L("CIptvSettingsDatabase::~CIptvSettingsDatabase in")); + iFsSession.Close(); + iDb.Close(); + iDbSession.Close(); + LIVE_TV_TRACE1(_L("CIptvSettingsDatabase::~CIptvSettingsDatabase out")); + } + +// --------------------------------------------------------------------------- +// CIptvSettingsDatabase::CreateDbL() +// +// Create a new database. +// --------------------------------------------------------------------------- +void CIptvSettingsDatabase::CreateDbL() + { + LIVE_TV_TRACE1(_L("CIptvSettingsDatabase::CreateDbL()")); + if ( !BaflUtils::FileExists( iFsSession, iDbFile ) ) + { + LIVE_TV_TRACE1( _L("Database file wasn't found, creating new")); + RDbNamedDatabase database; + CleanupClosePushL( database ); + User::LeaveIfError( database.Create( iFsSession, iDbFile ) ); + CreateTableL( database ); + SetDefaultValuesL( database ); + CleanupStack::PopAndDestroy( &database ); + } + } + +// --------------------------------------------------------------------------- +// CIptvSettingsDatabase::CreateDbSessionL() +// +// Open a new database session and the database +// --------------------------------------------------------------------------- +void CIptvSettingsDatabase::CreateDbSessionL() + { + LIVE_TV_TRACE1(_L("CIptvSettingsDatabase::CreateDbSessionL()")); + User::LeaveIfError( iDbSession.Connect() ); + User::LeaveIfError( iDb.Open( iDbSession, iDbFile ) ); + User::LeaveIfError( iDb.Compact() ); + } + +// --------------------------------------------------------------------------- +// CIptvSettingsDatabase::CreateTableL() +// +// Creates table. Leaves, if the table cannot be created. +// --------------------------------------------------------------------------- +void CIptvSettingsDatabase::CreateTableL( RDbNamedDatabase& aDatabase ) const + { + LIVE_TV_TRACE1( _L("CIptvSettingsDatabase::CreateTableL in" ) ); + TDbCol column; + CDbColSet* columns = CDbColSet::NewLC(); + + // create columns and add them to the column set + column = TDbCol( KIptvParentalControlCol, EDbColInt32 ); + columns->AddL( column ); + + column = TDbCol( KIptvRecordingTimeCol, EDbColInt32 ); + columns->AddL( column ); + + column = TDbCol( KIptvReminderTimeCol, EDbColInt32 ); + columns->AddL( column ); + + // last used service+channel can be here in creating db + column = TDbCol( KIptvLastUsedServiceCol, EDbColUint32 ); + columns->AddL( column ); + + column = TDbCol( KIptvLastUsedChannelCol, EDbColInt64 ); + columns->AddL( column ); + + column = TDbCol( KIptvIsLastUsedCol, EDbColInt32 ); + columns->AddL( column ); + + // create table + User::LeaveIfError( aDatabase.CreateTable( KIptvSettingsTable, *columns ) ); + + CleanupStack::PopAndDestroy( columns ); + LIVE_TV_TRACE1( _L("CIptvSettingsDatabase::CreateTableL out" ) ); + } + +// ----------------------------------------------------------------------------- +// CIptvSettingsDatabase::SaveSettingsL +// Writes settings to the database. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CIptvSettingsDatabase::SaveSettingsL( + const TIptvLiveUISettings& aSettings ) + { + RDbView view; + CleanupClosePushL( view ); + + User::LeaveIfError( view.Prepare( iDb, TDbQuery( KIptvQuerySettingsSql ), + TDbWindow::EUnlimited ) ); + User::LeaveIfError( view.EvaluateAll() ); + + view.FirstL(); + if ( view.AtRow() ) + { + view.UpdateL(); + // write given settings to the database + view.SetColL( KIptvParentalControlColNo, aSettings.iParentalControl ); + view.SetColL( KIptvRecordingTimeColNo, aSettings.iRecordingTimeReserve ); + view.SetColL( KIptvReminderTimeColNo, aSettings.iReminderTime ); + + view.PutL(); + } + CleanupStack::PopAndDestroy( &view ); // closes the view + } + +// ----------------------------------------------------------------------------- +// CIptvSettingsDatabase::ReadSettingsL +// Reads settings from the database. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CIptvSettingsDatabase::ReadSettingsL( TIptvLiveUISettings& aSettings ) + { + RDbView view; + CleanupClosePushL( view ); + + User::LeaveIfError( view.Prepare( iDb, TDbQuery( KIptvQuerySettingsSql ), + TDbWindow::EUnlimited ) ); + User::LeaveIfError( view.EvaluateAll() ); + + view.NextL(); + if ( view.AtRow() ) + { + view.GetL(); + // write settings to the settings structure + aSettings.iParentalControl = view.ColInt( KIptvParentalControlColNo ); + aSettings.iRecordingTimeReserve = view.ColInt( KIptvRecordingTimeColNo ); + aSettings.iReminderTime = view.ColInt( KIptvReminderTimeColNo ); + } + CleanupStack::PopAndDestroy( &view ); // closes the view + } + +// ----------------------------------------------------------------------------- +// CIptvSettingsDatabase::SetDefaultValuesL +// Sets default values to the database. +// ----------------------------------------------------------------------------- +// +void CIptvSettingsDatabase::SetDefaultValuesL( + RDbNamedDatabase& aDatabase ) const + { + LIVE_TV_TRACE1( _L("CIptvSettingsDatabase::SetDefaultValuesL in" ) ); + RDbView view; + CleanupClosePushL( view ); + + User::LeaveIfError( view.Prepare( aDatabase, + TDbQuery( KIptvQuerySettingsSql ), TDbWindow::EUnlimited ) ); + User::LeaveIfError( view.EvaluateAll() ); + + view.InsertL(); + // default values, settings + view.SetColL( KIptvParentalControlColNo, KIptvDefaultParentalControl ); + view.SetColL( KIptvRecordingTimeColNo, KIptvDefaultRecordingTimeReserve ); + view.SetColL( KIptvReminderTimeColNo, KIptvDefaultReminderTime ); + + view.SetColL( KIptvLastUsedServiceColNo, KIptvDefaultLastUsedServiceId ); + view.SetColL( KIptvLastUsedChannelColNo, KIptvDefaultLastUsedChannelId ); + view.SetColL( KIptvIsLastUsedColNo, KIptvDefaultIsLastUsed ); + + view.PutL(); + + CleanupStack::PopAndDestroy( &view ); // closes the view + LIVE_TV_TRACE1( _L("CIptvSettingsDatabase::SetDefaultValuesL out" ) ); + } + +// ----------------------------------------------------------------------------- +// CIptvSettingsDatabase::SaveLastUsageL +// Writes last usage to the database, separated from actual settings. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CIptvSettingsDatabase::SaveLastUsageL( + const TIptvLiveUISettings& aSettings ) + { + LIVE_TV_TRACE1( _L("CIptvSettingsDatabase::SaveLastUsageL in" ) ); + RDbView view; + CleanupClosePushL( view ); + + User::LeaveIfError( view.Prepare( iDb, TDbQuery( KIptvQuerySettingsSql ), + TDbWindow::EUnlimited ) ); + User::LeaveIfError( view.EvaluateAll() ); + + // Reset value, which is for checking Active Space UI at first + view.FirstL(); + while ( view.AtRow() ) + { + view.GetL(); + view.UpdateL(); + view.SetColL( KIptvIsLastUsedColNo, KIptvDefaultIsLastUsed ); + view.PutL(); + view.NextL(); + } + + TBool found( EFalse ); + view.FirstL(); + while ( view.AtRow() && !found ) + { + view.GetL(); + if ( aSettings.iLastUsedServiceId == + view.ColUint32( KIptvLastUsedServiceColNo ) ) + { + // Write ch id to the database + view.UpdateL(); + view.SetColL( KIptvLastUsedChannelColNo, + aSettings.iLastUsedChannelId ); + // Set this for the Active Space UI row + view.SetColL( KIptvIsLastUsedColNo, 1 ); + view.PutL(); + found = ETrue; + } + view.NextL(); + } + + // New service id, add new + if ( !found ) + { + view.InsertL(); + view.SetColL( KIptvLastUsedServiceColNo, aSettings.iLastUsedServiceId ); + view.SetColL( KIptvLastUsedChannelColNo, aSettings.iLastUsedChannelId ); + view.SetColL( KIptvIsLastUsedColNo, 1 ); + view.PutL(); + } + + CleanupStack::PopAndDestroy( &view ); // closes the view + + LIVE_TV_TRACE1( _L("CIptvSettingsDatabase::SaveLastUsageL out" ) ); + } + +// ----------------------------------------------------------------------------- +// CIptvSettingsDatabase::ReadLastUsageByServiceL +// Reads last watched channel by given service from the database. Separated +// from actual settings. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CIptvSettingsDatabase::ReadLastUsageByServiceL( + const TUint32 aServiceId, TIptvLiveUISettings& aSettings ) + { + LIVE_TV_TRACE1( _L("CIptvSettingsDatabase::ReadLastUsageByServiceL in" ) ); + RDbView view; + CleanupClosePushL( view ); + + User::LeaveIfError( view.Prepare( iDb, TDbQuery( KIptvQuerySettingsSql ), + TDbWindow::EUnlimited ) ); + User::LeaveIfError( view.EvaluateAll() ); + + TBool found( EFalse ); + view.FirstL(); + while ( view.AtRow() && !found ) + { + view.GetL(); + // Service found, get ch id + if ( aServiceId == view.ColUint32( KIptvLastUsedServiceColNo ) ) + { + // write last usage values to the settings structure + aSettings.iLastUsedChannelId = + view.ColInt64( KIptvLastUsedChannelColNo ); + found = ETrue; + } + view.NextL(); + } + CleanupStack::PopAndDestroy( &view ); // closes the view + + // Last usage not found, leave so that values will be zero + if ( !found ) + { + User::Leave( KErrNotFound ); + } + + LIVE_TV_TRACE1( _L("CIptvSettingsDatabase::ReadLastUsageByServiceL out" ) ); + } + +// ----------------------------------------------------------------------------- +// CIptvSettingsDatabase::ReadLastUsageL +// Reads the actual last watched channel and service from the database. +// Separated from actual settings. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CIptvSettingsDatabase::ReadLastUsageL( + TIptvLiveUISettings& aSettings ) + { + LIVE_TV_TRACE1( _L("CIptvSettingsDatabase::ReadLastUsageL in" ) ); + RDbView view; + CleanupClosePushL( view ); + + User::LeaveIfError( view.Prepare( iDb, TDbQuery( KIptvQuerySettingsSql ), + TDbWindow::EUnlimited ) ); + User::LeaveIfError( view.EvaluateAll() ); + + TBool found( EFalse ); + view.FirstL(); + while ( view.AtRow() && !found ) + { + view.GetL(); + // Space UI value found + if ( view.ColInt32( KIptvIsLastUsedColNo ) == 1 ) + { + // write last usage values to the settings structure + aSettings.iLastUsedServiceId = + view.ColUint32( KIptvLastUsedServiceColNo ); + aSettings.iLastUsedChannelId = + view.ColInt64( KIptvLastUsedChannelColNo ); + found = ETrue; + } + view.NextL(); + } + CleanupStack::PopAndDestroy( &view ); // closes the view + + // Last usage not found, leave so that values will be zero + if ( !found ) + { + User::Leave( KErrNotFound ); + } + + LIVE_TV_TRACE1( _L("CIptvSettingsDatabase::ReadLastUsageL out" ) ); + } + +// End of File