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 |