emailservices/emailserver/src/fsnotificationhandlermgrimpl.cpp
branchRCL_3
changeset 80 726fba06891a
parent 64 3533d4323edc
--- a/emailservices/emailserver/src/fsnotificationhandlermgrimpl.cpp	Wed Sep 15 11:52:37 2010 +0300
+++ b/emailservices/emailserver/src/fsnotificationhandlermgrimpl.cpp	Wed Oct 13 14:11:15 2010 +0300
@@ -38,6 +38,10 @@
 
 static const TInt64 KMegaByte = 1048576;
 
+_LIT( KFSMailServerPanic, "FS mail server" );
+const TInt KUndefinedState = 1;
+const TTimeIntervalMicroSeconds32 KDelay = 5000000; // 5 seconds 
+
 // ======== MEMBER FUNCTIONS ========
 
 
@@ -64,9 +68,11 @@
     FUNC_LOG;
     // Performs the time consuming initialization asynchronously in RunL, in order
     // to let the process startup finish quicker
+    iTimer.CreateLocal();
+    SetActive();
+    iState = EPrepareInitialization;
     TRequestStatus* status = &iStatus;
-    User::RequestComplete(status, KErrNone);
-    SetActive();
+    User::RequestComplete( status, KErrNone );
     }
 
 // ---------------------------------------------------------------------------
@@ -76,48 +82,98 @@
 void CFSNotificationHandlerMgr::RunL()
     {
     FUNC_LOG;
-    // Create mail client
-    iMailClient = CFSMailClient::NewL();
-    if ( iMailClient == NULL )
+    
+    TBool goToNextState = ETrue;
+    
+    switch( iState )
         {
-        User::Leave( KErrNoMemory );
+        case EPrepareInitialization:
+            {
+            // Create mail client
+            iMailClient = CFSMailClient::NewL();
+            if ( iMailClient == NULL )
+                {
+                User::Leave( KErrNoMemory );
+                }
+            // Once mail client is created ok, disk space needs to be checked
+            // and cleaned if necessary
+            CleanTempFilesIfNeededL();
+            break;
+            }
+        case EInitializeMailIconHandler:
+            {
+            CreateAndStoreHandlerL( KMailIconHandlerUid );
+            break;
+            }
+        case EInitializeLedHandler:
+            {
+            CreateAndStoreHandlerL( KLedHandlerUid );
+            break;
+            }
+#ifndef __WINS__
+        case ESoundHandler:
+            {
+            // Earlier RefreshData() was called for the soundhandler
+            // object after creation, but as it does not do anything
+            // it is not called anymore.
+            CreateAndStoreHandlerL( KSoundHandlerUid );
+            break;
+            }
+#endif
+        case EInitializeMtmHandler:
+            {
+            CreateAndStoreHandlerL( KMtmHandlerUid );
+            break;
+            }      
+        case EInitializeOutofMemoryHandler:
+            {
+            CreateAndStoreHandlerL( KOutofMemoryHandlerUid );
+            break;
+            }
+        case EInitializeAuthenticationHandler:
+            {
+            CreateAndStoreHandlerL( KAuthenticationHandlerUid );
+            break;
+            }
+        case EInitializeMessageQueryHandlerUid:
+            {
+            CreateAndStoreHandlerL( KMessageQueryHandlerUid );
+            break;
+            }
+        case EWaitForPluginsReady:
+            {
+            if ( !iMailClient->AreAllPluginsLoaded() )
+                {
+                goToNextState = EFalse;
+                SetActive();
+                iTimer.After( iStatus, KDelay );
+                }
+            break;
+            }
+        case EInitializeCMailCpsHandlerUid:
+            {
+            CreateAndStoreHandlerL( KCMailCpsHandlerUid );
+            break;
+            }
+        case EFinish:
+            {
+            StartObservingL();
+            goToNextState = EFalse;
+            break;
+            }
+        default:
+            {
+            User::Panic( KFSMailServerPanic, KUndefinedState );
+            break;
+            }
         }
-
-    // Once mail client is created ok, disk space needs to be checked
-    // and cleaned if necessary
-    CleanTempFilesIfNeededL();
-
-    //<cmail>
-    // Notification handlers are created next.
-    // Notice that if a handler cannot be created it does not mean
-    // that the construction of the manager would be stopped. This
-    // approach is chosen so that if something goes wrong with
-    // construction of a handler it can safely leave and get
-    // destroyed but does not interfere other handlers.
-
-    CreateAndStoreHandlerL( KMailIconHandlerUid );
-
-    CreateAndStoreHandlerL( KLedHandlerUid );
-
-#ifndef __WINS__
-    CreateAndStoreHandlerL( KSoundHandlerUid );
-    // Earlier RefreshData() was called for the soundhandler
-    // object after creation, but as it does not do anything
-    // it is not called anymore.
-#endif
-
-    CreateAndStoreHandlerL( KMtmHandlerUid );
-
-    CreateAndStoreHandlerL( KOutofMemoryHandlerUid );
-
-    CreateAndStoreHandlerL( KAuthenticationHandlerUid );
-
-    CreateAndStoreHandlerL( KMessageQueryHandlerUid );
-
-    CreateAndStoreHandlerL( KCMailCpsHandlerUid );
-    //</cmail>
-
-    StartObservingL();
+    if ( goToNextState )
+        {
+        iState = TState( iState + 1 );
+        SetActive();
+        TRequestStatus* status = &iStatus; 
+        User::RequestComplete( status, KErrNone );
+        }
     }
 
 // ---------------------------------------------------------------------------
@@ -196,6 +252,8 @@
         }
 
     iAppUi = NULL;
+    
+    iTimer.Close();
 
     // Finished using ECom
     // ECom used at least in CFSMailHSUpdateHandler