diff -r 156f692b1687 -r b99b84bcd2d1 contentstorage/srvsrc/castorageproxy.cpp --- a/contentstorage/srvsrc/castorageproxy.cpp Fri Jun 11 13:58:37 2010 +0300 +++ b/contentstorage/srvsrc/castorageproxy.cpp Wed Jun 23 18:33:40 2010 +0300 @@ -15,6 +15,9 @@ * */ +#include +#include + #include "castorage.h" #include "castorageproxy.h" #include "castoragefactory.h" @@ -107,14 +110,23 @@ TChangeType changeType = EAddChangeType; RArray parentArray; CleanupClosePushL( parentArray ); - + if( aEntry->GetId() > 0 ) { changeType = EUpdateChangeType; RArray id; CleanupClosePushL( id ); id.AppendL( aEntry->GetId() ); - iStorage->GetParentsIdsL( id, parentArray ); + if (aItemAppearanceChange == EItemUninstallProgressChanged) + { + // no need to search for parent parents for uninstall + // progress change + iStorage->GetParentsIdsL( id, parentArray, EFalse ); + } + else + { + iStorage->GetParentsIdsL( id, parentArray ); + } CleanupStack::PopAndDestroy( &id ); } @@ -126,8 +138,47 @@ { changeType = EAddChangeType; } - - iStorage->AddL( aEntry, aUpdate ); + + // do not update entry in db with uninstall progress + if (aItemAppearanceChange != EItemUninstallProgressChanged) + { + RPointerArray localizations; + CleanupResetAndDestroyPushL( localizations ); + CCaLocalizationEntry* tempLocalization = NULL; + if( aEntry->isLocalized( CCaInnerEntry::ENameLocalized ) ) + { + tempLocalization = LocalizeTextL( aEntry ); + if( tempLocalization ) + { + localizations.Append( tempLocalization ); + tempLocalization = NULL; + } + } + if( aEntry->isLocalized( CCaInnerEntry::EDescriptionLocalized ) ) + { + tempLocalization = LocalizeDescriptionL( aEntry ); + if (tempLocalization) + { + localizations.Append(tempLocalization); + tempLocalization = NULL; + } + } + + iStorage->AddL( aEntry, aUpdate ); + + for( TInt j =0; j < localizations.Count(); j++ ) + { + localizations[j]->SetRowId( aEntry->GetId() ); + AddLocalizationL( *( localizations[j] ) ); + } + if( localizations.Count() > 0 ) + { + HbTextResolverSymbian::Init( _L(""), KLocalizationFilepathZ ); + } + CleanupStack::PopAndDestroy( &localizations ); + } + + for( TInt i = 0; i < iHandlerNotifier.Count(); i++ ) { iHandlerNotifier[i]->EntryChanged( aEntry, changeType, parentArray ); @@ -317,6 +368,9 @@ CleanupStack::PopAndDestroy( &parentArray ); } +#ifdef COVERAGE_MEASUREMENT +#pragma CTC SKIP +#endif //COVERAGE_MEASUREMENT (calls another method) // --------------------------------------------------------------------------- // // --------------------------------------------------------------------------- @@ -325,6 +379,9 @@ { iStorage->LoadDataBaseFromRomL(); } +#ifdef COVERAGE_MEASUREMENT +#pragma CTC ENDSKIP +#endif //COVERAGE_MEASUREMENT // --------------------------------------------------------- // @@ -350,3 +407,147 @@ iHandlerNotifier.Remove( i ); } } + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +CCaLocalizationEntry* CCaStorageProxy::LocalizeTextL( CCaInnerEntry* aEntry ) + { + CCaLocalizationEntry* result = NULL; + TInt textLength = aEntry->GetText().Length(); + if (textLength > 0) + { + TChar delimiter = '/'; // cannot add it as global + RBuf title; + CleanupClosePushL( title ); + title.CreateL( aEntry->GetText() ); + TInt pos = title.LocateReverse( delimiter ); + if ( pos > 0 && pos + 1 < textLength ) // 1 is for delimiters + { + TPtrC16 logString = title.Mid( pos + 1 ); + TInt qmFileNameLength = textLength - charsToFilename - 1 - logString.Length(); + TPtrC16 qmFile = title.Mid( charsToFilename, qmFileNameLength ); + if ( InitializeTranslatorL( qmFile ) ) + { + result = CCaLocalizationEntry::NewLC(); + HBufC* translatedString = HbTextResolverSymbian::LoadLC( logString ); + if ( translatedString->Compare( logString ) ) + { + result->SetStringIdL( logString ); + aEntry->SetTextL( *translatedString ); + if( translatedString ) + { + CleanupStack::PopAndDestroy( translatedString ); + } + result->SetTableNameL( KLocalizationCaEntry ); + result->SetAttributeNameL( KLocalizationEnText ); + result->SetQmFilenameL( qmFile ); + result->SetRowId( aEntry->GetId() ? 0 : aEntry->GetId() ); // must be added when present + } + else + { + if (translatedString) + { + CleanupStack::PopAndDestroy(translatedString); + } + } + CleanupStack::Pop( result ); + } + } + CleanupStack::PopAndDestroy( &title ); + } + return result; + } + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +CCaLocalizationEntry* CCaStorageProxy::LocalizeDescriptionL( CCaInnerEntry* aEntry ) + { + CCaLocalizationEntry* result = NULL; + TInt dscLength = aEntry->GetDescription().Length(); + if ( dscLength ) + { + TChar delimiter = '/'; // cannot add it as global + RBuf description; + CleanupClosePushL( description ); + description.CreateL( aEntry->GetDescription() ); + TInt pos = description.LocateReverse( delimiter ); + if ( pos > 0 && pos + 1 < dscLength ) // 1 is for delimiters + { + TPtrC16 logString = description.Mid(pos + 1); + TInt qmFileNameLength = dscLength - charsToFilename - 1 - logString.Length(); + TPtrC16 qmFile = description.Mid(charsToFilename, qmFileNameLength); + if ( InitializeTranslatorL( qmFile ) ) + { + result = CCaLocalizationEntry::NewLC(); + HBufC* translatedString = HbTextResolverSymbian::LoadLC( logString ); + if ( translatedString->Compare( logString ) ) + { + result->SetStringIdL( logString ); + aEntry->SetDescriptionL( *translatedString ); + CleanupStack::PopAndDestroy( translatedString ); + result->SetTableNameL( KLocalizationCaEntry ); + result->SetAttributeNameL( KLocalizationEnDescription ); + result->SetQmFilenameL( qmFile ); + result->SetRowId( aEntry->GetId() ? 0 : aEntry->GetId() ); // must be added when present + } + else + { + CleanupStack::PopAndDestroy( translatedString ); + } + CleanupStack::Pop( result ); + } + } + CleanupStack::PopAndDestroy( &description ); + } + return result; + } + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +TBool CCaStorageProxy::InitializeTranslatorL( TDesC& aQmFilename ) + { + TBool result = HbTextResolverSymbian::Init( aQmFilename, KLocalizationFilepathC ); + if ( !result ) + { + // this should not be called too often + TChar currentDriveLetter; + TDriveList driveList; + RFs fs; + User::LeaveIfError( fs.Connect() ); + User::LeaveIfError( fs.DriveList( driveList ) ); + + RBuf path; + CleanupClosePushL( path ); + path.CreateL( KLocalizationFilepath().Length() + 1 ); + + for ( TInt driveNr = EDriveY; driveNr >= EDriveA; driveNr-- ) + { + if ( driveList[driveNr] ) + { + User::LeaveIfError(fs.DriveToChar( driveNr, currentDriveLetter )); + path.Append( currentDriveLetter ); + path.Append( KLocalizationFilepath ); + if (HbTextResolverSymbian::Init( aQmFilename, path )) + { + result = ETrue; + break; + } + } + path.Zero(); + } + CleanupStack::PopAndDestroy( &path ); + fs.Close(); + + if( !result ) + { + result = HbTextResolverSymbian::Init( aQmFilename, KLocalizationFilepathZ ); + } + } + return result; + }