webengine/widgetengine/src/Preferences.cpp
changeset 26 cb62a4f66ebe
parent 15 60c5402cb945
child 44 800203832575
equal deleted inserted replaced
25:0ed94ceaa377 26:cb62a4f66ebe
    32 const TInt KMaxIntLength = 10;
    32 const TInt KMaxIntLength = 10;
    33 const TInt KMaxKeyValueSize = 4096; //4 k
    33 const TInt KMaxKeyValueSize = 4096; //4 k
    34 
    34 
    35 _LIT( KKeyFormat, "%d.%S" );
    35 _LIT( KKeyFormat, "%d.%S" );
    36 _LIT( KPrefsFile,"prefs.dat" );
    36 _LIT( KPrefsFile,"prefs.dat" );
       
    37 _LIT( KPrefsTmpFile,"prefs.dat.tmp" );
       
    38 _LIT( KPrefsBakFile, "prefs.dat.bak" );
    37 
    39 
    38 
    40 
    39 // ----------------------------------------------------------------------------
    41 // ----------------------------------------------------------------------------
    40 // WidgetPreferences::WidgetPreferences
    42 // WidgetPreferences::WidgetPreferences
    41 // C++ Constructor
    43 // C++ Constructor
   262         }
   264         }
   263 
   265 
   264         CleanupStack::Pop();   // k
   266         CleanupStack::Pop();   // k
   265 
   267 
   266         // Save update to persistent storage
   268         // Save update to persistent storage
   267 		saveL();
   269         TRAPD(err, saveL());
       
   270         if(err!= KErrNone)
       
   271             {
       
   272             deleteAllPrefFiles();
       
   273             }
   268     }
   274     }
   269 
   275 
   270 }
   276 }
   271 
   277 
   272 // ----------------------------------------------------------------------------
   278 // ----------------------------------------------------------------------------
   304         }
   310         }
   305 
   311 
   306         CleanupStack::PopAndDestroy();   // k
   312         CleanupStack::PopAndDestroy();   // k
   307 
   313 
   308         // Save update to persistent storage
   314         // Save update to persistent storage
   309 		saveL();
   315 	TRAPD(err, saveL());
       
   316     if(err!= KErrNone) {
       
   317         deleteAllPrefFiles();
       
   318         }
   310     }
   319     }
   311 }
   320 }
   312 
   321 
   313 // ----------------------------------------------------------------------------
   322 // ----------------------------------------------------------------------------
   314 // WidgetPreferences::SaveL
   323 // WidgetPreferences::SaveL
   321     if ( !m_basepath || (m_basepath->Length() <= 0) )
   330     if ( !m_basepath || (m_basepath->Length() <= 0) )
   322         return;
   331         return;
   323 
   332 
   324     RFs fs;
   333     RFs fs;
   325 
   334 
   326     if ( fs.Connect() == KErrNone ) {
       
   327         
   335         
   328         CleanupClosePushL( fs );
   336     // Connect to file server
   329         HBufC* filePath = HBufC::NewLC( m_basepath->Length() + KPrefsFile().Length() );
   337     User::LeaveIfError(fs.Connect());
   330 
   338     CleanupClosePushL( fs );
   331         TPtr fName( filePath->Des() );
   339         
   332         fName.Append( *m_basepath );
   340     // Form filenames
   333         fName.Append( KPrefsFile );
   341     HBufC* tmpFilePath = HBufC::NewLC( m_basepath->Length() + KPrefsTmpFile().Length() );
   334 
   342     HBufC* bakFilePath = HBufC::NewLC( m_basepath->Length() + KPrefsBakFile().Length() );
   335         RFileWriteStream writeStream;
   343     HBufC* filePath = HBufC::NewLC( m_basepath->Length() + KPrefsFile().Length() );
   336         TInt fileerror = writeStream.Replace( fs, *filePath, EFileWrite );
   344 
   337 
   345     TPtr fName( tmpFilePath->Des() );
   338         if ( fileerror != KErrNone ) {
   346     fName.Append( *m_basepath );
   339             fs.CreatePrivatePath( EDriveC );
   347     fName.Append( KPrefsTmpFile );
   340             fileerror = writeStream.Create( fs, *filePath, EFileWrite|EFileShareExclusive );
   348     
   341         }
   349     fName.Set( bakFilePath->Des() );
   342 
   350     fName.Append( *m_basepath );
   343         if ( fileerror == KErrNone ) {
   351     fName.Append( KPrefsBakFile );
   344             CleanupClosePushL( writeStream );
   352     
   345             writeStream.WriteInt32L( m_preferences->Count() );
   353     fName.Set( filePath->Des() );
   346             
   354     fName.Append( *m_basepath );
   347             TPtrHashMapIter<TDesC,PrefElement> it( *m_preferences );
   355     fName.Append( KPrefsFile );
   348             const TDesC* key;
   356 
   349             const PrefElement* pref;
   357 	  RFileWriteStream writeStream;
   350 
   358     writeStream.PushL();
   351             while ( ( key = it.NextKey() ) != 0 ) {
   359     
   352                 pref = it.CurrentValue();
   360 	// Try to create the temp file
   353                 writeStream.WriteInt32L( key->Length() );
   361 	if(writeStream.Replace(fs, *tmpFilePath, EFileWrite|EFileShareExclusive) != KErrNone) {
   354                 writeStream.WriteL( *key );
   362 		// Make sure the private path exists
   355                 writeStream.WriteInt32L( pref->value().Length() );
   363 		fs.CreatePrivatePath( EDriveC );
   356                 writeStream.WriteL( pref->value() );
   364 		
   357                 writeStream.WriteInt32L( pref->valueSize() );
   365 		// Try again to create the file
       
   366 		User::LeaveIfError(writeStream.Create(fs, *tmpFilePath, EFileWrite|EFileShareExclusive));
       
   367 	}
       
   368 
       
   369     // Try to externalize the data to the stream
       
   370     TRAPD(err, externalizeL(writeStream));
       
   371     
       
   372     // Close the stream
       
   373     CleanupStack::PopAndDestroy(); // writeStream
       
   374     	     
       
   375     // If no error at this point then we're guaranteed to have a valid file
       
   376     if(err!=KErrNone)
       
   377     	{
       
   378     	// Delete the temp file
       
   379     	fs.Delete(*tmpFilePath);
       
   380     	
       
   381     	// And leave with the error code
       
   382     	User::Leave(err);
       
   383     	}
       
   384     	
       
   385     // Backup any old valid file just in case
       
   386     fs.Delete(*bakFilePath);
       
   387     fs.Rename(*filePath, *bakFilePath);
       
   388     
       
   389     // Rename the temp file to be the actual settings file
       
   390     err = fs.Rename(*tmpFilePath, *filePath);
       
   391     if(err!=KErrNone)
       
   392     	{
       
   393     	// If we had a backup settings file, try to return it
       
   394     	fs.Rename(*bakFilePath, *filePath);
       
   395     	User::Leave(err);
       
   396     	}
       
   397 
       
   398 	// Cleanup
       
   399 	CleanupStack::PopAndDestroy(4); // filePath, bakFilePath, tmpFilePath, fs
       
   400 
       
   401 }
       
   402 
       
   403 // ----------------------------------------------------------------------------
       
   404 // WidgetPreferences::externalizeL
       
   405 //
       
   406 //
       
   407 // ----------------------------------------------------------------------------
       
   408 
       
   409 void WidgetPreferences::externalizeL(RWriteStream& aStream) const
       
   410 {
       
   411     aStream.WriteInt32L( m_preferences->Count() );
       
   412 	
       
   413     TPtrHashMapIter<TDesC,PrefElement> it( *m_preferences );
       
   414     const TDesC* key;
       
   415     const PrefElement* pref;
       
   416 
       
   417     while ( ( key = it.NextKey() ) != 0 ) {
       
   418         pref = it.CurrentValue();
       
   419         aStream.WriteInt32L( key->Length() );
       
   420         aStream.WriteL( *key );
       
   421         aStream.WriteInt32L( pref->value().Length() );
       
   422         aStream.WriteL( pref->value() );
       
   423         aStream.WriteInt32L( pref->valueSize() );
       
   424     }
       
   425     aStream.CommitL();
       
   426     
       
   427 }
       
   428 
       
   429 // ----------------------------------------------------------------------------
       
   430 // WidgetPreferences::internalizeL
       
   431 //
       
   432 //
       
   433 // ----------------------------------------------------------------------------
       
   434 void WidgetPreferences::internalizeL(RReadStream& aStream)
       
   435 {
       
   436     TInt count( aStream.ReadInt32L() );
       
   437     for( TInt i = 0; i < count; i++ ) {
       
   438         
       
   439         TInt len = aStream.ReadInt32L();
       
   440 
       
   441         if ( len > 0 ) {
       
   442             HBufC* key = HBufC::NewLC( len );
       
   443             TPtr ptrkey = key->Des();
       
   444             aStream.ReadL( ptrkey, len );
       
   445             len = aStream.ReadInt32L();
       
   446 
       
   447             if ( len <= KMaxKeyValueSize ) {
       
   448                 HBufC* value = HBufC::NewLC( len );
       
   449                 TPtr ptrvalue = value->Des();
       
   450                 aStream.ReadL( ptrvalue, len );
       
   451                 PrefElement* pref = new ( ELeave ) PrefElement;
       
   452                 CleanupStack::PushL( pref );
       
   453                 pref->setValueL( ptrvalue );
       
   454                 TInt size = aStream.ReadInt32L();
       
   455                 pref->setValueSize( size );
       
   456                 m_preferences->InsertL( key, pref );
       
   457                 CleanupStack::Pop(); //pref
       
   458                 CleanupStack::PopAndDestroy(); //value
       
   459                 CleanupStack::Pop(); //key
   358             }
   460             }
   359 
   461             else {
   360             writeStream.CommitL();
   462                 CleanupStack::PopAndDestroy( key );
   361             CleanupStack::PopAndDestroy(); //writeStream
   463              }
   362         }
   464 
   363 
   465          }
   364         CleanupStack::PopAndDestroy( 2 ); //fs,filePath
   466 
   365     }
   467         else {
       
   468             break;
       
   469         }
       
   470      }
       
   471 
       
   472  }
       
   473 
       
   474 // ----------------------------------------------------------------------------
       
   475 // WidgetPreferences::deleteAllPrefFiles
       
   476 //
       
   477 //
       
   478 // ----------------------------------------------------------------------------
       
   479 void WidgetPreferences::deleteAllPrefFiles(){
       
   480 
       
   481    if ( !m_basepath || (m_basepath->Length() <= 0) ) 
       
   482          return;
       
   483 
       
   484 
       
   485    RFs fs;
       
   486    // Deleting bkUp and main prefs file.
       
   487    User::LeaveIfError(fs.Connect());
       
   488    CleanupClosePushL( fs );
       
   489    
       
   490    HBufC* bkFilePath = HBufC::NewLC( m_basepath->Length() + KPrefsBakFile().Length() );
       
   491 
       
   492    TPtr fName( bkFilePath->Des() );
       
   493    fName.Append( *m_basepath );
       
   494    fName.Append( KPrefsBakFile );
       
   495  
       
   496    fs.Delete( *bkFilePath  );
       
   497          
       
   498    CleanupStack::PopAndDestroy(); 
       
   499 
       
   500    HBufC* prefFilePath = HBufC::NewLC( m_basepath->Length() + KPrefsFile().Length() );
       
   501 
       
   502    TPtr fNamePr( prefFilePath->Des() );
       
   503    fNamePr.Append( *m_basepath );
       
   504    fNamePr.Append( KPrefsFile);
       
   505  
       
   506    fs.Delete( *prefFilePath  );
       
   507          
       
   508    CleanupStack::PopAndDestroy(2);
   366 
   509 
   367 }
   510 }
   368 
   511 
   369 // ----------------------------------------------------------------------------
   512 // ----------------------------------------------------------------------------
   370 // WidgetPreferences::LoadL
   513 // WidgetPreferences::LoadL
   372 //
   515 //
   373 //
   516 //
   374 // ----------------------------------------------------------------------------
   517 // ----------------------------------------------------------------------------
   375 void WidgetPreferences::loadL()
   518 void WidgetPreferences::loadL()
   376 {
   519 {
       
   520    if ( !m_basepath || (m_basepath->Length() <= 0) ) 
       
   521          return;
       
   522     
       
   523     // Try to connect to file server
   377     RFs fs;
   524     RFs fs;
   378     if ( !m_basepath || (m_basepath->Length() <= 0) )
   525     User::LeaveIfError(fs.Connect());
   379         return;
   526     CleanupClosePushL( fs );
   380 
   527     
   381     if ( fs.Connect() == KErrNone ) {
   528     // Form settings file name
   382         CleanupClosePushL( fs );
   529     HBufC* filePath = HBufC::NewLC( m_basepath->Length() + KPrefsFile().Length() );
   383         HBufC* filePath = HBufC::NewLC( m_basepath->Length() + KPrefsFile().Length() );
   530     TPtr fName( filePath->Des() );
   384 
   531     fName.Append( *m_basepath );
   385         TPtr fName( filePath->Des() );
   532     fName.Append( KPrefsFile );
   386         fName.Append( *m_basepath );
   533 
   387         fName.Append( KPrefsFile );
   534     // Open stream
   388 
   535     RFileReadStream readStream;
   389         RFileReadStream readStream;
   536     readStream.PushL();
   390 
   537     TInt err = readStream.Open( fs, *filePath, EFileRead );
   391         if ( readStream.Open( fs, *filePath, EFileRead ) == KErrNone ) {
   538     if(err!=KErrNone) {
   392             CleanupClosePushL( readStream );
   539         User::Leave(err);
   393             TInt count( readStream.ReadInt32L() );
   540     }
   394 
   541     
   395             for( TInt i = 0; i < count; i++ ) {
   542     // Read the data from the stream
   396                 TInt len = readStream.ReadInt32L();
   543     internalizeL(readStream);
   397 
   544 
   398                 if ( len > 0 ) {
   545     CleanupStack::PopAndDestroy(3); // readStream, filePath, fs
   399                     HBufC* key = HBufC::NewLC( len );
       
   400                     TPtr ptrkey = key->Des();
       
   401                     readStream.ReadL( ptrkey, len );
       
   402                     len = readStream.ReadInt32L();
       
   403 
       
   404                     if ( len <= KMaxKeyValueSize ) {
       
   405                         HBufC* value = HBufC::NewLC( len );
       
   406                         TPtr ptrvalue = value->Des();
       
   407                         readStream.ReadL( ptrvalue, len );
       
   408                         PrefElement* pref = new ( ELeave ) PrefElement;
       
   409                         CleanupStack::PushL( pref );
       
   410                         pref->setValueL( ptrvalue );
       
   411                         TInt size = readStream.ReadInt32L();
       
   412                         pref->setValueSize( size );
       
   413                         m_preferences->InsertL( key, pref );
       
   414                         CleanupStack::Pop(); //pref 
       
   415                         CleanupStack::PopAndDestroy(); //value
       
   416                         CleanupStack::Pop(); //key
       
   417                     }
       
   418                     else {
       
   419                         CleanupStack::PopAndDestroy( key );
       
   420                     }
       
   421                 }
       
   422                 else {
       
   423                     break;
       
   424                 }
       
   425             }
       
   426 
       
   427             CleanupStack::PopAndDestroy(); //readStream
       
   428         }
       
   429 
       
   430         CleanupStack::PopAndDestroy( 2 ); //fs,filePath
       
   431     }
       
   432 }
   546 }
   433     
   547     
   434 // ----------------------------------------------------------------------------
   548 // ----------------------------------------------------------------------------
   435 // PrefElement::PrefElement
   549 // PrefElement::PrefElement
   436 // C++ constructor
   550 // C++ constructor
   486 
   600 
   487     m_value  = value.AllocL();
   601     m_value  = value.AllocL();
   488 }
   602 }
   489 
   603 
   490 
   604 
       
   605