webengine/widgetregistry/Server/src/WidgetRegistry.cpp
changeset 27 60c5402cb945
parent 17 c8a366e56285
child 36 0ed94ceaa377
--- a/webengine/widgetregistry/Server/src/WidgetRegistry.cpp	Thu Sep 24 12:53:48 2009 +0300
+++ b/webengine/widgetregistry/Server/src/WidgetRegistry.cpp	Mon Oct 26 08:28:45 2009 +0200
@@ -30,7 +30,6 @@
 #include <libxml2_parser.h>
 #include <libxml2_tree.h>
 #include <xmlengxestd.h>
-#include "WidgetMMCHandler.h"
 #include "UidAllocator.h"
 #if defined( BRDO_WRT_SECURITY_MGR_FF )
 #include <RTSecManager.h>
@@ -189,9 +188,8 @@
     iAppArch.Close();
     delete iInstaller;
     iLangDirList.ResetAndDestroy();
-    delete iMMCHandler;
     delete iXmlProcessor;
-
+	delete iApaAppListNotifier;
     iFs.Close();
     LOG_DESTRUCT;
     }
@@ -220,8 +218,23 @@
     // it should be detected and corrected once the resource limit
     // that caused the leave is removed.
     TBool dirtyFlag = EFalse;
+    TInt parseError = KErrNone;
     iXmlProcessor = CWidgetRegistryXml::NewL();
-    TRAP_IGNORE( InternalizeL( dirtyFlag ) );
+    // For first attempt assume usual case that things are consistent
+    // and the registry entry file can be parsed and used.
+    TRAP_IGNORE( InternalizeL( EFalse, // aDoConsistency,
+                               EFalse, // aIgnoreParseError
+                               dirtyFlag,
+                               parseError ) );
+    if ( parseError )
+        {
+        // Special case where we need to do consistency because
+        // the widget registry entry file is corrupt.
+        TRAP_IGNORE( InternalizeL( ETrue, // aDoConsistency,
+                                   ETrue, // aIgnoreParseError
+                                   dirtyFlag,
+                                   parseError ) );
+        }
     if ( dirtyFlag )
         {
         // Basically same reason to ignore leaves here.
@@ -237,9 +250,7 @@
     LOG1( "ConstructL internalize done, registry count %d",
               iEntries.Count() );
     LOG_CLOSE;
-
-    iMMCHandler = CWidgetMMCHandler::NewL( *this, iFs );
-    iMMCHandler->Start();
+    iApaAppListNotifier = CApaAppListNotifier::NewL(this,CActive::EPriorityStandard);
     }
 
 // ============================================================================
@@ -496,7 +507,10 @@
 // @since 3.1
 // ============================================================================
 //
-void CWidgetRegistry::InternalizeL( TBool& aDirtyFlag )
+void CWidgetRegistry::InternalizeL( TBool doConsistency, // in param
+                                    TBool aIgnoreParseError, // in param
+                                    TBool& aDirtyFlag, // out param
+                                    TInt& aParseError )// out param
     {
     LOG_OPEN;
     LOG( "Internalize" );
@@ -520,7 +534,10 @@
 
     CleanupClosePushL( appArchList );
     CleanupClosePushL( appArchListFlags );
-    TBool doConsistency = AppArchWidgets( appArchList, appArchListFlags );
+    if ( doConsistency )
+        {
+        doConsistency = AppArchWidgets( appArchList, appArchListFlags );
+        }
     if ( doConsistency )
         {
 
@@ -622,25 +639,31 @@
         // that caused the leave is removed.
         if ( xmlExists )
             {
-            TRAP_IGNORE( InternalizeXmlL( iRegistryXmlFileName,
-                                          driveUnit,
-                                          doConsistency,
-                                          appArchList,
-                                          appArchListFlags,
-                                          installedListForDrive,
-                                          installedListForDriveFlags,
-                                          dirtyFlag ) );
+            TRAP( aParseError,
+                  InternalizeXmlL( iRegistryXmlFileName,
+                                   driveUnit,
+                                   doConsistency,
+                                   appArchList,
+                                   appArchListFlags,
+                                   installedListForDrive,
+                                   installedListForDriveFlags,
+                                   dirtyFlag ) );
             }
         else if ( binaryExists )
             {
-            TRAP_IGNORE( InternalizeBinaryL( iRegistryBinaryFileName,
-                                             driveUnit,
-                                             doConsistency,
-                                             appArchList,
-                                             appArchListFlags,
-                                             installedListForDrive,
-                                             installedListForDriveFlags,
-                                             dirtyFlag ) );
+            TRAP( aParseError,
+                  InternalizeBinaryL( iRegistryBinaryFileName,
+                                      driveUnit,
+                                      doConsistency,
+                                      appArchList,
+                                      appArchListFlags,
+                                      installedListForDrive,
+                                      installedListForDriveFlags,
+                                      dirtyFlag ) );
+            }
+        if ( !aIgnoreParseError && aParseError )
+            {
+            User::Leave( aParseError );
             }
 
         if ( doConsistency )
@@ -2222,5 +2245,23 @@
     LOG( "AppArchListConsistency done" );
     }
 
-
+void CWidgetRegistry::HandleAppListEvent(TInt aEvent)
+    {
+    TBool dirtyFlag = EFalse;
+    TInt parseError = KErrNone;
+    // Assume usual case and things are consistent
+    // and the registry entry file can be parsed and used.
+    TRAPD( error, InternalizeL( EFalse,
+                                EFalse,
+                                dirtyFlag,
+                                parseError ) );
+    if ( KErrNone == error )
+        {
+        // internalize consistency enforcement may have altered registry
+        if ( dirtyFlag )
+            {
+            TRAP_IGNORE( ExternalizeL(); );
+            }
+        }
+    }
 // End of File