--- /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 <bautils.h> // 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