videofeeds/livetvutils/src/CIptvSettingsDatabase.cpp
changeset 0 96612d01cf9f
equal deleted inserted replaced
-1:000000000000 0:96612d01cf9f
       
     1 /*
       
     2 * Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of the License "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:    Offers interface to IPTV Settings database*
       
    15 */
       
    16 
       
    17 
       
    18 
       
    19 
       
    20 // INCLUDE FILES
       
    21 #include <bautils.h>    // file helpers
       
    22 #include "IptvLiveLogger.h"
       
    23 #include "CIptvSettingsDatabase.h"
       
    24 
       
    25 // CONSTANTS
       
    26 
       
    27 // Column numbers
       
    28 const TInt KIptvParentalControlColNo = 1;
       
    29 const TInt KIptvRecordingTimeColNo = 2;
       
    30 const TInt KIptvReminderTimeColNo = 3;
       
    31 const TInt KIptvLastUsedServiceColNo = 4;
       
    32 const TInt KIptvLastUsedChannelColNo = 5;
       
    33 const TInt KIptvIsLastUsedColNo = 6;
       
    34 
       
    35 // ============================ MEMBER FUNCTIONS ===============================
       
    36 
       
    37 // -----------------------------------------------------------------------------
       
    38 // CIptvSettingsDatabase::CIptvSettingsDatabase
       
    39 // C++ default constructor can NOT contain any code, that
       
    40 // might leave.
       
    41 // -----------------------------------------------------------------------------
       
    42 CIptvSettingsDatabase::CIptvSettingsDatabase( const TFileName& aDbFile ) : 
       
    43 	iDbFile( aDbFile )
       
    44     {
       
    45     }
       
    46 
       
    47 // -----------------------------------------------------------------------------
       
    48 // CIptvSettingsDatabase::ConstructL
       
    49 // Second phase construction. Leaves, if RFs session cannot be created.
       
    50 // -----------------------------------------------------------------------------
       
    51 void CIptvSettingsDatabase::ConstructL()
       
    52 	{
       
    53 	LIVE_TV_TRACE1(_L("CIptvSettingsDatabase::ConstructL()"));
       
    54     User::LeaveIfError( iFsSession.Connect() );
       
    55     CreateDbL();
       
    56 	TRAPD( error, CreateDbSessionL() );
       
    57 	if ( error != KErrNone )
       
    58         {
       
    59         LIVE_TV_TRACE2(_L("CIptvSettingsDatabase:: Could not open session to db (%d)"), error);
       
    60 
       
    61         if ( error != KErrNoMemory && 
       
    62              error != KErrLocked && 
       
    63              error != KErrDisMounted &&
       
    64              error != KErrDiskFull &&
       
    65              error != KErrNotReady )
       
    66             {
       
    67             // Delete and recreate database file. Cannot recover other way. 
       
    68             LIVE_TV_TRACE1(_L("CIptvSettingsDatabase:: fatal error occured while opening db, recreating db"));
       
    69             
       
    70             iFsSession.Delete( iDbFile ); //ignore error
       
    71             
       
    72             TRAP( error, CreateDbL() );
       
    73             if ( error != KErrNone )
       
    74                 {
       
    75                 LIVE_TV_TRACE2(_L("CIptvSettingsDatabase:: couldnt recreate db (%d), leaving."), error);
       
    76                 User::Leave( error );
       
    77                 }
       
    78                 
       
    79             TRAP( error, CreateDbSessionL() );
       
    80             if ( error != KErrNone )
       
    81                 {
       
    82                 LIVE_TV_TRACE2(_L("CIptvSettingsDatabase:: couldnt open session to db (%d), leaving."), error);
       
    83                 User::Leave( error );
       
    84                 }
       
    85                 
       
    86             }
       
    87         else
       
    88             {
       
    89             LIVE_TV_TRACE1(_L("CIptvSettingsDatabase:: temporary error occured while opening db, leaving db intact, leaving."));
       
    90             User::Leave( error );
       
    91             }
       
    92         }
       
    93 	}
       
    94 
       
    95 // -----------------------------------------------------------------------------
       
    96 // CIptvSettingsDatabase::NewL
       
    97 // Two-phased constructor.
       
    98 // -----------------------------------------------------------------------------
       
    99 EXPORT_C CIptvSettingsDatabase* CIptvSettingsDatabase::NewL( 
       
   100 									const TFileName& aDbFile )
       
   101     {
       
   102     LIVE_TV_TRACE1(_L("CIptvSettingsDatabase::NewL()"));
       
   103     CIptvSettingsDatabase* self = new ( ELeave ) CIptvSettingsDatabase( aDbFile );    
       
   104     CleanupStack::PushL( self );
       
   105     self->ConstructL();
       
   106     CleanupStack::Pop( self );    
       
   107     return self;
       
   108     }
       
   109     
       
   110 // -----------------------------------------------------------------------------
       
   111 // CIptvSettingsDatabase::~CIptvSettingsDatabase()
       
   112 // Destructor
       
   113 // -----------------------------------------------------------------------------
       
   114 EXPORT_C CIptvSettingsDatabase::~CIptvSettingsDatabase()
       
   115     {
       
   116     LIVE_TV_TRACE1(_L("CIptvSettingsDatabase::~CIptvSettingsDatabase in"));    
       
   117     iFsSession.Close(); 
       
   118     iDb.Close();
       
   119     iDbSession.Close();
       
   120     LIVE_TV_TRACE1(_L("CIptvSettingsDatabase::~CIptvSettingsDatabase out"));    
       
   121     }
       
   122 
       
   123 // ---------------------------------------------------------------------------
       
   124 // CIptvSettingsDatabase::CreateDbL()
       
   125 //
       
   126 // Create a new database. 
       
   127 // ---------------------------------------------------------------------------
       
   128 void CIptvSettingsDatabase::CreateDbL()
       
   129     {
       
   130     LIVE_TV_TRACE1(_L("CIptvSettingsDatabase::CreateDbL()"));
       
   131     if ( !BaflUtils::FileExists( iFsSession, iDbFile ) )
       
   132         {
       
   133         LIVE_TV_TRACE1( _L("Database file wasn't found, creating new"));
       
   134     	RDbNamedDatabase database;
       
   135 		CleanupClosePushL( database );
       
   136     	User::LeaveIfError( database.Create( iFsSession, iDbFile ) );
       
   137 		CreateTableL( database );
       
   138         SetDefaultValuesL( database );
       
   139         CleanupStack::PopAndDestroy( &database );
       
   140         }
       
   141     }
       
   142 
       
   143 // ---------------------------------------------------------------------------
       
   144 // CIptvSettingsDatabase::CreateDbSessionL()
       
   145 //
       
   146 // Open a new database session and the database
       
   147 // ---------------------------------------------------------------------------
       
   148 void CIptvSettingsDatabase::CreateDbSessionL()
       
   149     {
       
   150     LIVE_TV_TRACE1(_L("CIptvSettingsDatabase::CreateDbSessionL()"));
       
   151     User::LeaveIfError( iDbSession.Connect() );
       
   152     User::LeaveIfError( iDb.Open( iDbSession, iDbFile ) );
       
   153     User::LeaveIfError( iDb.Compact() );
       
   154     }
       
   155 
       
   156 // ---------------------------------------------------------------------------
       
   157 // CIptvSettingsDatabase::CreateTableL()
       
   158 //
       
   159 // Creates table. Leaves, if the table cannot be created.
       
   160 // ---------------------------------------------------------------------------
       
   161 void CIptvSettingsDatabase::CreateTableL( RDbNamedDatabase& aDatabase ) const
       
   162     {
       
   163 	LIVE_TV_TRACE1( _L("CIptvSettingsDatabase::CreateTableL in" ) );
       
   164     TDbCol column;
       
   165     CDbColSet* columns = CDbColSet::NewLC();
       
   166     
       
   167     // create columns and add them to the column set
       
   168     column = TDbCol( KIptvParentalControlCol, EDbColInt32 );
       
   169     columns->AddL( column );
       
   170                 
       
   171     column = TDbCol( KIptvRecordingTimeCol, EDbColInt32 );
       
   172     columns->AddL( column );
       
   173 
       
   174     column = TDbCol( KIptvReminderTimeCol, EDbColInt32 );
       
   175     columns->AddL( column );
       
   176 
       
   177     // last used service+channel can be here in creating db
       
   178     column = TDbCol( KIptvLastUsedServiceCol, EDbColUint32 );
       
   179     columns->AddL( column );
       
   180 
       
   181     column = TDbCol( KIptvLastUsedChannelCol, EDbColInt64 );
       
   182     columns->AddL( column );
       
   183 
       
   184     column = TDbCol( KIptvIsLastUsedCol, EDbColInt32 );
       
   185     columns->AddL( column );
       
   186 
       
   187     // create table
       
   188     User::LeaveIfError( aDatabase.CreateTable( KIptvSettingsTable, *columns ) );
       
   189 
       
   190     CleanupStack::PopAndDestroy( columns );
       
   191     LIVE_TV_TRACE1( _L("CIptvSettingsDatabase::CreateTableL out" ) ); 
       
   192     }
       
   193 
       
   194 // -----------------------------------------------------------------------------
       
   195 // CIptvSettingsDatabase::SaveSettingsL
       
   196 // Writes settings to the database.
       
   197 // -----------------------------------------------------------------------------
       
   198 //
       
   199 EXPORT_C void CIptvSettingsDatabase::SaveSettingsL( 
       
   200 									const TIptvLiveUISettings& aSettings )
       
   201     {
       
   202     RDbView view;
       
   203     CleanupClosePushL( view );
       
   204 
       
   205     User::LeaveIfError( view.Prepare( iDb, TDbQuery( KIptvQuerySettingsSql ), 
       
   206         TDbWindow::EUnlimited ) );
       
   207     User::LeaveIfError( view.EvaluateAll() );
       
   208 
       
   209     view.FirstL();
       
   210 	if ( view.AtRow() )
       
   211 		{
       
   212 		view.UpdateL();
       
   213 	    // write given settings to the database
       
   214 	    view.SetColL( KIptvParentalControlColNo, aSettings.iParentalControl ); 
       
   215 	    view.SetColL( KIptvRecordingTimeColNo, aSettings.iRecordingTimeReserve );
       
   216 	    view.SetColL( KIptvReminderTimeColNo, aSettings.iReminderTime );
       
   217 	    
       
   218 	    view.PutL();	
       
   219 		}
       
   220     CleanupStack::PopAndDestroy( &view );    // closes the view
       
   221     }   
       
   222     
       
   223 // -----------------------------------------------------------------------------
       
   224 // CIptvSettingsDatabase::ReadSettingsL
       
   225 // Reads settings from the database.
       
   226 // -----------------------------------------------------------------------------
       
   227 //
       
   228 EXPORT_C void CIptvSettingsDatabase::ReadSettingsL( TIptvLiveUISettings& aSettings )
       
   229     {
       
   230     RDbView view;
       
   231     CleanupClosePushL( view );
       
   232 
       
   233     User::LeaveIfError( view.Prepare( iDb, TDbQuery( KIptvQuerySettingsSql ), 
       
   234         TDbWindow::EUnlimited ) );
       
   235     User::LeaveIfError( view.EvaluateAll() );
       
   236     
       
   237     view.NextL();
       
   238 	if ( view.AtRow() )
       
   239 		{
       
   240 		view.GetL();
       
   241 	    // write settings to the settings structure
       
   242 	    aSettings.iParentalControl = view.ColInt( KIptvParentalControlColNo );
       
   243 	    aSettings.iRecordingTimeReserve = view.ColInt( KIptvRecordingTimeColNo );
       
   244 	    aSettings.iReminderTime = view.ColInt( KIptvReminderTimeColNo );
       
   245 		}
       
   246     CleanupStack::PopAndDestroy( &view );    // closes the view
       
   247     }
       
   248 
       
   249 // -----------------------------------------------------------------------------
       
   250 // CIptvSettingsDatabase::SetDefaultValuesL
       
   251 // Sets default values to the database.
       
   252 // -----------------------------------------------------------------------------
       
   253 //
       
   254 void CIptvSettingsDatabase::SetDefaultValuesL( 
       
   255     RDbNamedDatabase& aDatabase ) const
       
   256     {
       
   257     LIVE_TV_TRACE1( _L("CIptvSettingsDatabase::SetDefaultValuesL in" ) );
       
   258     RDbView view;
       
   259     CleanupClosePushL( view );
       
   260 
       
   261     User::LeaveIfError( view.Prepare( aDatabase, 
       
   262 		TDbQuery( KIptvQuerySettingsSql ), TDbWindow::EUnlimited ) );
       
   263     User::LeaveIfError( view.EvaluateAll() );
       
   264 
       
   265     view.InsertL();
       
   266     // default values, settings
       
   267     view.SetColL( KIptvParentalControlColNo, KIptvDefaultParentalControl );
       
   268     view.SetColL( KIptvRecordingTimeColNo, KIptvDefaultRecordingTimeReserve );
       
   269     view.SetColL( KIptvReminderTimeColNo, KIptvDefaultReminderTime );    
       
   270 
       
   271     view.SetColL( KIptvLastUsedServiceColNo, KIptvDefaultLastUsedServiceId );
       
   272     view.SetColL( KIptvLastUsedChannelColNo, KIptvDefaultLastUsedChannelId );
       
   273     view.SetColL( KIptvIsLastUsedColNo, KIptvDefaultIsLastUsed );    
       
   274 
       
   275     view.PutL();      
       
   276 
       
   277     CleanupStack::PopAndDestroy( &view );    // closes the view
       
   278     LIVE_TV_TRACE1( _L("CIptvSettingsDatabase::SetDefaultValuesL out" ) );
       
   279     }   
       
   280 
       
   281 // -----------------------------------------------------------------------------
       
   282 // CIptvSettingsDatabase::SaveLastUsageL
       
   283 // Writes last usage to the database, separated from actual settings.
       
   284 // -----------------------------------------------------------------------------
       
   285 //
       
   286 EXPORT_C void CIptvSettingsDatabase::SaveLastUsageL( 
       
   287 									const TIptvLiveUISettings& aSettings )
       
   288     {
       
   289     LIVE_TV_TRACE1( _L("CIptvSettingsDatabase::SaveLastUsageL in" ) );    
       
   290     RDbView view;
       
   291     CleanupClosePushL( view );
       
   292 
       
   293     User::LeaveIfError( view.Prepare( iDb, TDbQuery( KIptvQuerySettingsSql ), 
       
   294         TDbWindow::EUnlimited ) );
       
   295     User::LeaveIfError( view.EvaluateAll() );
       
   296 
       
   297     // Reset value, which is for checking Active Space UI at first 
       
   298     view.FirstL();		
       
   299     while ( view.AtRow() )
       
   300         {
       
   301         view.GetL();            
       
   302         view.UpdateL();
       
   303     	view.SetColL( KIptvIsLastUsedColNo, KIptvDefaultIsLastUsed );
       
   304     	view.PutL();
       
   305         view.NextL();
       
   306         }
       
   307 
       
   308     TBool found( EFalse );
       
   309     view.FirstL();		
       
   310     while ( view.AtRow() && !found )
       
   311         {
       
   312         view.GetL();
       
   313         if ( aSettings.iLastUsedServiceId == 
       
   314             view.ColUint32( KIptvLastUsedServiceColNo ) )
       
   315             {
       
   316     	    // Write ch id to the database            
       
   317     		view.UpdateL();
       
   318     	    view.SetColL( KIptvLastUsedChannelColNo, 
       
   319     	        aSettings.iLastUsedChannelId );
       
   320     	    // Set this for the Active Space UI row    
       
   321     	    view.SetColL( KIptvIsLastUsedColNo, 1 );    	        
       
   322     	    view.PutL();                
       
   323             found = ETrue;
       
   324             }
       
   325         view.NextL();
       
   326         }
       
   327 	
       
   328 	// New service id, add new	
       
   329 	if ( !found )
       
   330 	    {
       
   331 		view.InsertL();
       
   332         view.SetColL( KIptvLastUsedServiceColNo, aSettings.iLastUsedServiceId );
       
   333 	    view.SetColL( KIptvLastUsedChannelColNo, aSettings.iLastUsedChannelId );
       
   334     	view.SetColL( KIptvIsLastUsedColNo, 1 );	    
       
   335 	    view.PutL();	    
       
   336 	    }
       
   337 			
       
   338     CleanupStack::PopAndDestroy( &view );    // closes the view
       
   339     
       
   340     LIVE_TV_TRACE1( _L("CIptvSettingsDatabase::SaveLastUsageL out" ) );
       
   341     }   
       
   342     
       
   343 // -----------------------------------------------------------------------------
       
   344 // CIptvSettingsDatabase::ReadLastUsageByServiceL
       
   345 // Reads last watched channel by given service from the database. Separated 
       
   346 // from actual settings.
       
   347 // -----------------------------------------------------------------------------
       
   348 //
       
   349 EXPORT_C void CIptvSettingsDatabase::ReadLastUsageByServiceL( 
       
   350     const TUint32 aServiceId, TIptvLiveUISettings& aSettings )
       
   351     {
       
   352     LIVE_TV_TRACE1( _L("CIptvSettingsDatabase::ReadLastUsageByServiceL in" ) );    
       
   353     RDbView view;
       
   354     CleanupClosePushL( view );
       
   355 
       
   356     User::LeaveIfError( view.Prepare( iDb, TDbQuery( KIptvQuerySettingsSql ), 
       
   357         TDbWindow::EUnlimited ) );    
       
   358     User::LeaveIfError( view.EvaluateAll() );
       
   359     
       
   360     TBool found( EFalse );
       
   361     view.FirstL();
       
   362     while ( view.AtRow() && !found )
       
   363         {
       
   364         view.GetL();
       
   365         // Service found, get ch id
       
   366         if ( aServiceId == view.ColUint32( KIptvLastUsedServiceColNo ) )
       
   367             {
       
   368     	    // write last usage values to the settings structure
       
   369     	    aSettings.iLastUsedChannelId = 
       
   370     	        view.ColInt64( KIptvLastUsedChannelColNo );                
       
   371             found = ETrue;
       
   372             }
       
   373         view.NextL();
       
   374         }
       
   375     CleanupStack::PopAndDestroy( &view );    // closes the view
       
   376     
       
   377     // Last usage not found, leave so that values will be zero
       
   378     if ( !found )
       
   379         {
       
   380         User::Leave( KErrNotFound );
       
   381         }
       
   382     
       
   383     LIVE_TV_TRACE1( _L("CIptvSettingsDatabase::ReadLastUsageByServiceL out" ) );
       
   384     }
       
   385 
       
   386 // -----------------------------------------------------------------------------
       
   387 // CIptvSettingsDatabase::ReadLastUsageL
       
   388 // Reads the actual last watched channel and service from the database. 
       
   389 // Separated from actual settings.
       
   390 // -----------------------------------------------------------------------------
       
   391 //
       
   392 EXPORT_C void CIptvSettingsDatabase::ReadLastUsageL( 
       
   393     TIptvLiveUISettings& aSettings )
       
   394     {
       
   395     LIVE_TV_TRACE1( _L("CIptvSettingsDatabase::ReadLastUsageL in" ) );    
       
   396     RDbView view;
       
   397     CleanupClosePushL( view );
       
   398 
       
   399     User::LeaveIfError( view.Prepare( iDb, TDbQuery( KIptvQuerySettingsSql ), 
       
   400         TDbWindow::EUnlimited ) );    
       
   401     User::LeaveIfError( view.EvaluateAll() );
       
   402     
       
   403     TBool found( EFalse );
       
   404     view.FirstL();
       
   405     while ( view.AtRow() && !found )
       
   406         {
       
   407         view.GetL();
       
   408         // Space UI value found
       
   409         if ( view.ColInt32( KIptvIsLastUsedColNo ) == 1 )
       
   410             {
       
   411     	    // write last usage values to the settings structure
       
   412     	    aSettings.iLastUsedServiceId = 
       
   413     	        view.ColUint32( KIptvLastUsedServiceColNo );
       
   414     	    aSettings.iLastUsedChannelId = 
       
   415     	        view.ColInt64( KIptvLastUsedChannelColNo );                
       
   416             found = ETrue;
       
   417             }
       
   418         view.NextL();
       
   419         }
       
   420     CleanupStack::PopAndDestroy( &view );    // closes the view
       
   421     
       
   422     // Last usage not found, leave so that values will be zero
       
   423     if ( !found )
       
   424         {
       
   425         User::Leave( KErrNotFound );
       
   426         }
       
   427     
       
   428     LIVE_TV_TRACE1( _L("CIptvSettingsDatabase::ReadLastUsageL out" ) );
       
   429     }
       
   430 
       
   431 //  End of File