webengine/widgetengine/src/Preferences.cpp
changeset 65 5bfc169077b2
parent 37 cb62a4f66ebe
child 68 92a765b5b3e7
equal deleted inserted replaced
42:d39add9822e2 65:5bfc169077b2
    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" );
       
    39 
    37 
    40 
    38 
    41 // ----------------------------------------------------------------------------
    39 // ----------------------------------------------------------------------------
    42 // WidgetPreferences::WidgetPreferences
    40 // WidgetPreferences::WidgetPreferences
    43 // C++ Constructor
    41 // C++ Constructor
   264         }
   262         }
   265 
   263 
   266         CleanupStack::Pop();   // k
   264         CleanupStack::Pop();   // k
   267 
   265 
   268         // Save update to persistent storage
   266         // Save update to persistent storage
   269         TRAPD(err, saveL());
   267 		saveL();
   270         if(err!= KErrNone)
       
   271             {
       
   272             deleteAllPrefFiles();
       
   273             }
       
   274     }
   268     }
   275 
   269 
   276 }
   270 }
   277 
   271 
   278 // ----------------------------------------------------------------------------
   272 // ----------------------------------------------------------------------------
   310         }
   304         }
   311 
   305 
   312         CleanupStack::PopAndDestroy();   // k
   306         CleanupStack::PopAndDestroy();   // k
   313 
   307 
   314         // Save update to persistent storage
   308         // Save update to persistent storage
   315 	TRAPD(err, saveL());
   309 		saveL();
   316     if(err!= KErrNone) {
       
   317         deleteAllPrefFiles();
       
   318         }
       
   319     }
   310     }
   320 }
   311 }
   321 
   312 
   322 // ----------------------------------------------------------------------------
   313 // ----------------------------------------------------------------------------
   323 // WidgetPreferences::SaveL
   314 // WidgetPreferences::SaveL
   330     if ( !m_basepath || (m_basepath->Length() <= 0) )
   321     if ( !m_basepath || (m_basepath->Length() <= 0) )
   331         return;
   322         return;
   332 
   323 
   333     RFs fs;
   324     RFs fs;
   334 
   325 
       
   326     if ( fs.Connect() == KErrNone ) {
   335         
   327         
   336     // Connect to file server
   328         CleanupClosePushL( fs );
   337     User::LeaveIfError(fs.Connect());
   329         HBufC* filePath = HBufC::NewLC( m_basepath->Length() + KPrefsFile().Length() );
   338     CleanupClosePushL( fs );
   330 
   339         
   331         TPtr fName( filePath->Des() );
   340     // Form filenames
   332         fName.Append( *m_basepath );
   341     HBufC* tmpFilePath = HBufC::NewLC( m_basepath->Length() + KPrefsTmpFile().Length() );
   333         fName.Append( KPrefsFile );
   342     HBufC* bakFilePath = HBufC::NewLC( m_basepath->Length() + KPrefsBakFile().Length() );
   334 
   343     HBufC* filePath = HBufC::NewLC( m_basepath->Length() + KPrefsFile().Length() );
   335         RFileWriteStream writeStream;
   344 
   336         TInt fileerror = writeStream.Replace( fs, *filePath, EFileWrite );
   345     TPtr fName( tmpFilePath->Des() );
   337 
   346     fName.Append( *m_basepath );
   338         if ( fileerror != KErrNone ) {
   347     fName.Append( KPrefsTmpFile );
   339             fs.CreatePrivatePath( EDriveC );
   348     
   340             fileerror = writeStream.Create( fs, *filePath, EFileWrite|EFileShareExclusive );
   349     fName.Set( bakFilePath->Des() );
   341         }
   350     fName.Append( *m_basepath );
   342 
   351     fName.Append( KPrefsBakFile );
   343         if ( fileerror == KErrNone ) {
   352     
   344             CleanupClosePushL( writeStream );
   353     fName.Set( filePath->Des() );
   345             writeStream.WriteInt32L( m_preferences->Count() );
   354     fName.Append( *m_basepath );
   346             
   355     fName.Append( KPrefsFile );
   347             TPtrHashMapIter<TDesC,PrefElement> it( *m_preferences );
   356 
   348             const TDesC* key;
   357 	  RFileWriteStream writeStream;
   349             const PrefElement* pref;
   358     writeStream.PushL();
   350 
   359     
   351             while ( ( key = it.NextKey() ) != 0 ) {
   360 	// Try to create the temp file
   352                 pref = it.CurrentValue();
   361 	if(writeStream.Replace(fs, *tmpFilePath, EFileWrite|EFileShareExclusive) != KErrNone) {
   353                 writeStream.WriteInt32L( key->Length() );
   362 		// Make sure the private path exists
   354                 writeStream.WriteL( *key );
   363 		fs.CreatePrivatePath( EDriveC );
   355                 writeStream.WriteInt32L( pref->value().Length() );
   364 		
   356                 writeStream.WriteL( pref->value() );
   365 		// Try again to create the file
   357                 writeStream.WriteInt32L( pref->valueSize() );
   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
       
   460             }
   358             }
   461             else {
   359 
   462                 CleanupStack::PopAndDestroy( key );
   360             writeStream.CommitL();
   463              }
   361             CleanupStack::PopAndDestroy(); //writeStream
   464 
   362         }
   465          }
   363 
   466 
   364         CleanupStack::PopAndDestroy( 2 ); //fs,filePath
   467         else {
   365     }
   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);
       
   509 
   366 
   510 }
   367 }
   511 
   368 
   512 // ----------------------------------------------------------------------------
   369 // ----------------------------------------------------------------------------
   513 // WidgetPreferences::LoadL
   370 // WidgetPreferences::LoadL
   515 //
   372 //
   516 //
   373 //
   517 // ----------------------------------------------------------------------------
   374 // ----------------------------------------------------------------------------
   518 void WidgetPreferences::loadL()
   375 void WidgetPreferences::loadL()
   519 {
   376 {
   520    if ( !m_basepath || (m_basepath->Length() <= 0) ) 
       
   521          return;
       
   522     
       
   523     // Try to connect to file server
       
   524     RFs fs;
   377     RFs fs;
   525     User::LeaveIfError(fs.Connect());
   378     if ( !m_basepath || (m_basepath->Length() <= 0) )
   526     CleanupClosePushL( fs );
   379         return;
   527     
   380 
   528     // Form settings file name
   381     if ( fs.Connect() == KErrNone ) {
   529     HBufC* filePath = HBufC::NewLC( m_basepath->Length() + KPrefsFile().Length() );
   382         CleanupClosePushL( fs );
   530     TPtr fName( filePath->Des() );
   383         HBufC* filePath = HBufC::NewLC( m_basepath->Length() + KPrefsFile().Length() );
   531     fName.Append( *m_basepath );
   384 
   532     fName.Append( KPrefsFile );
   385         TPtr fName( filePath->Des() );
   533 
   386         fName.Append( *m_basepath );
   534     // Open stream
   387         fName.Append( KPrefsFile );
   535     RFileReadStream readStream;
   388 
   536     readStream.PushL();
   389         RFileReadStream readStream;
   537     TInt err = readStream.Open( fs, *filePath, EFileRead );
   390 
   538     if(err!=KErrNone) {
   391         if ( readStream.Open( fs, *filePath, EFileRead ) == KErrNone ) {
   539         User::Leave(err);
   392             CleanupClosePushL( readStream );
   540     }
   393             TInt count( readStream.ReadInt32L() );
   541     
   394 
   542     // Read the data from the stream
   395             for( TInt i = 0; i < count; i++ ) {
   543     internalizeL(readStream);
   396                 TInt len = readStream.ReadInt32L();
   544 
   397 
   545     CleanupStack::PopAndDestroy(3); // readStream, filePath, fs
   398                 if ( len > 0 ) {
       
   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     }
   546 }
   432 }
   547     
   433     
   548 // ----------------------------------------------------------------------------
   434 // ----------------------------------------------------------------------------
   549 // PrefElement::PrefElement
   435 // PrefElement::PrefElement
   550 // C++ constructor
   436 // C++ constructor
   600 
   486 
   601     m_value  = value.AllocL();
   487     m_value  = value.AllocL();
   602 }
   488 }
   603 
   489 
   604 
   490 
   605