videofeeds/livetvutils/src/CIptvSettingsDatabase.cpp
changeset 0 96612d01cf9f
--- /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