contentstorage/srvsrc/castorageproxy.cpp
changeset 103 b99b84bcd2d1
parent 80 397d00875918
child 104 9b022b1f357c
--- 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 <driveinfo.h>
+#include <hbtextresolversymbian.h>
+
 #include "castorage.h"
 #include "castorageproxy.h"
 #include "castoragefactory.h"
@@ -107,14 +110,23 @@
     TChangeType changeType = EAddChangeType;
     RArray<TInt> parentArray;
     CleanupClosePushL( parentArray );
-
+          
     if( aEntry->GetId() > 0 )
         {
         changeType = EUpdateChangeType;
         RArray<TInt> 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<CCaLocalizationEntry> 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;
+	}