messagingapp/msgnotifications/msgerrorwatcher/src/msgerrorwatcher_p.cpp
changeset 56 f42d9a78f435
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingapp/msgnotifications/msgerrorwatcher/src/msgerrorwatcher_p.cpp	Tue Aug 31 18:53:38 2010 +0530
@@ -0,0 +1,1331 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*     CMsgErrorWatcherPrivate implementation file
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <e32base.h>
+
+#include <msvapi.h>
+#include <msvids.h>          //Msv index entry ID's
+#include <msvuids.h>
+#include <mmscmds.h>         //EMmsScheduledReceiveForced
+#include <mmsconst.h>        //Notification folder
+#include <SenduiMtmUids.h>   //MTM Uids
+#include <mtclreg.h>         //ClientMtmRegistry
+#include <watcher.h>
+#include <mmserrors.h>
+#include <mmsclient.h>
+#include <mmssettings.h>
+
+
+
+#include <xqconversions.h>
+#include <hbglobal.h>
+#include <HbTranslator>
+#include <QString>
+#include <in_iface.h>            // KErrIfAuthenticationFailure
+#include <etelpckt.h>            // KErrGprsInsufficientResources, etc.
+//#include <exterror.h>            // KErrGsmMMServiceOptionTemporaryOutOfOrder
+#include <gsmerror.h>
+
+#include <centralrepository.h>    // link against centralrepository.lib
+#include <messaginginternalcrkeys.h> // for Central Repository keys
+
+#include <messagingvariant.hrh>  // Variation
+
+#include "msgerrorwatcher.h"
+#include "msgerrorwatcher_p.h"
+#include "msgerrorwatcher.hrh"
+#include "msgerrorcommdbobserver.h"
+#include "msgcenrepobserver.h"
+// this should be handled later,
+//#include "msgerrorconnectionobserver.h"
+#include "msgerrordiskspaceobserver.h"
+#include "msgerrorsmsdiskspaceobserver.h"
+#include "msgerrorextsmsdiskspaceobserver.h"
+#include "msgerrorroamingobserver.h"
+#include "msgerrorstartupobserver.h"
+
+
+
+#include "debugtraces.h"
+
+//const TInt KConnectionRetries = 3;
+//const TInt KIntMaxLength = 10; //2~32 =~ 4000000000
+const TUint KInitialDelayBetweenSessionConnectRetries = 5000000; //five seconds
+const TUint KMaxTimerRetries = 50;
+//const TInt KDelayAfterDisconnect = 3000000; //3 seconds
+//Total delay between first and last retry is
+//( A * (B^2 + B) ) / 2
+// - where A is KInitialDelayBetweenSessionConnectRetries
+// -   and B is KMaxTimerRetries
+//If A = 5 seconds and B = 50 times last retry is made
+//after about 106 minutes from the first one.
+//const TMsvId KWatcherInboxFolderId = KMsvGlobalInBoxIndexEntryIdValue;
+const TMsvId KWatcherOutboxFolderId = KMsvGlobalOutBoxIndexEntryIdValue;
+//const TUid KMessageEntryUid = { KUidMsvMessageEntryValue };
+
+
+CMsgErrorWatcherPrivate::CMsgErrorWatcherPrivate(MsgErrorWatcher* msgErrorWatcher  ): 
+CActive( EPriorityStandard ),
+    q_ptr(msgErrorWatcher),
+    iMmsServiceId( KMsvNullIndexEntryId ),
+    iNotificationFolderId( KMsvNullIndexEntryId ),
+    iCurrentEntryId ( KMsvNullIndexEntryId )
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:CMsgErrorWatcherPrivate : Enter");
+    CActiveScheduler::Add( this );
+    TRAP_IGNORE(InitL())
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:CMsgErrorWatcherPrivate : Exit");
+    
+    }
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::CMsgErrorWatcherPrivate
+//
+// Symbian OS default constructor can leave.
+// ---------------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::InitL()
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:InitL : Enter");
+    User::LeaveIfError( iTimer.CreateLocal() );
+    User::LeaveIfError(iFs.Connect());
+
+    TInt features = 0;   
+    CRepository* repository = CRepository::NewL( KCRUidMuiuVariation );
+    repository->Get( KMuiuMmsFeatures, features );
+    delete repository;
+    repository = NULL;
+    if ( features & KMmsFeatureIdDelayDisconnectDialog )
+        {
+        iWatcherFlags |= EReceivingDisconnectDelay;
+        }
+
+    StartWatcherL();
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:InitL : Exit");
+    }
+
+
+
+    
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::~CMsgErrorWatcherPrivate
+//
+// Destructor
+// ---------------------------------------------------------
+//
+CMsgErrorWatcherPrivate::~CMsgErrorWatcherPrivate()
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:~CMsgErrorWatcherPrivate : Enter");   
+    StopWatcher();
+    iTimer.Close();
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:~CMsgErrorWatcherPrivate : Exit");  
+    }
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::StartWatcherL
+//
+// Does the actual construction of the watcher.
+// ---------------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::StartWatcherL()
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:StartMmsFetchL : Enter"); 
+    iSession = CMsvSession::OpenSyncL( *this );
+    // might be required in future for propogating the errors to the ui.
+    iMmsReceiveErrorMessages = new ( ELeave ) CMsvEntrySelection;
+    iMmsSendErrorMessages = new ( ELeave ) CMsvEntrySelection;
+    
+    // Get message server session
+    iClientMtmRegistry = CClientMtmRegistry::NewL( *iSession );
+    TRAPD( err,
+        {
+        iMmsClient = static_cast<CMmsClientMtm*>
+            ( iClientMtmRegistry->NewMtmL( KUidMsgTypeMultimedia ) );
+        } );
+    if ( err == KErrNotFound )
+        {
+        QDEBUG_WRITE( "MmsClientMtm not found!" );
+        // Make sure iMmsClient is NULL - just in case.
+        delete iMmsClient;
+        iMmsClient = NULL;
+        }
+    else
+        {
+        User::LeaveIfError( err );
+        }
+
+    if ( iMmsClient )
+        {
+        // We're interested in roaming events only if MMS is enabled.
+        iRoamingObserver = CMsgErrorRoamingObserver::NewL( *this ); 
+        QDEBUG_WRITE( "Created Roaming Observer!" );
+        }
+
+
+    iStartupObserver = CMsgErrorStartupObserver::NewL( *this );
+    
+    if(!( iWatcherFlags & EWatcherRunning))
+        {
+        //if not yet created
+        iSmsDiskSpaceObserver = CMsgErrorSmsDiskSpaceObserver::NewL( *this );
+        iSmsExtDiskSpaceObserver = CMsgErrorExtSmsDiskSpaceObserver::NewL( *this );
+        QDEBUG_WRITE( "Created iSmsDiskSpaceObserver, iSmsExtDiskSpaceObserver!" );
+        }
+
+    iWatcherFlags |= EWatcherRunning;
+
+    if ( GetMmsServiceL() )
+        {
+        CheckMmsReceivingModeL();
+        }
+
+    // Startup successful if we got this far. Reset retry counter.
+    iTimerRetries = 0;
+    
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:StartWatcherL : Exit");
+    }
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::StopWatcher
+//
+// Stops (and destructs) the watcher.
+// ---------------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::StopWatcher()
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:~CMsgErrorWatcherPrivate : Enter");
+    iWatcherFlags &= ~EWatcherRunning;
+    iWatcherFlags &= ~ENoAPErrorPending;
+    iMmsServiceId = KMsvNullIndexEntryId;
+    iNotificationFolderId = KMsvNullIndexEntryId;
+    Cancel();
+
+    delete iCommDbObserver;
+    iCommDbObserver = NULL;
+    delete iCenRepObserver;
+    iCenRepObserver = NULL;
+//    delete iConnectionObserver;
+//    iConnectionObserver = NULL;
+    delete iDiskSpaceObserver;
+    iDiskSpaceObserver = NULL;
+    delete iSmsDiskSpaceObserver;
+    iSmsDiskSpaceObserver = NULL;
+    delete iSmsExtDiskSpaceObserver;
+    iSmsExtDiskSpaceObserver = NULL;    
+    delete iRoamingObserver;
+    iRoamingObserver = NULL;
+    delete iMmsClient;
+    iMmsClient = NULL;
+    delete iClientMtmRegistry;
+    iClientMtmRegistry = NULL;
+    delete iOperation;
+    iOperation = NULL;
+    delete iStartupObserver;
+    iStartupObserver = NULL;
+    delete iSession;
+    iSession = NULL;
+    delete iMmsReceiveErrorMessages;
+    iMmsReceiveErrorMessages = NULL;
+    delete iMmsSendErrorMessages;
+    iMmsSendErrorMessages = NULL;
+
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:~CMsgErrorWatcherPrivate : Exit");
+    }
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::StartRestartTimer
+//
+// Start session reconnect timer.
+// ---------------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::StartRestartTimer()
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:~CMsgErrorWatcherPrivate : Enter");
+    if ( !IsActive() ) 
+        {
+        QDEBUG_WRITE( "Starting timer" );
+        iStatus = KRequestPending;
+        iRequestType = EMsgRequestStartingUp;
+        iTimerRetries++;
+        //The interval between retries comes longer every time
+        iTimer.After( iStatus,
+            iTimerRetries * KInitialDelayBetweenSessionConnectRetries );
+        SetActive();
+        }
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:~CMsgErrorWatcherPrivate : Exit");
+    }
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::ResetWatcher
+//
+// Resets watcher.
+// ---------------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::ResetWatcher()
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:~CMsgErrorWatcherPrivate : Enter");
+
+    iWatcherFlags &= ~ENoAPErrorPending;
+    
+    //Drop all observers
+    delete iCommDbObserver;
+    iCommDbObserver = NULL;
+    delete iCenRepObserver;
+    iCenRepObserver = NULL;
+//    delete iConnectionObserver;
+//    iConnectionObserver = NULL;
+    delete iDiskSpaceObserver;
+    iDiskSpaceObserver = NULL;
+	delete iSmsDiskSpaceObserver;
+    iSmsDiskSpaceObserver = NULL;
+    delete iSmsExtDiskSpaceObserver;
+    iSmsExtDiskSpaceObserver = NULL;    
+    //Reset disk space errors
+    iDiskSpaceErrors = 0;
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:~CMsgErrorWatcherPrivate : Exit");
+    }
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::GetMmsServiceL
+//
+// Retrieves MMS service id from MsgStore
+// ---------------------------------------------------------
+//
+TBool CMsgErrorWatcherPrivate::GetMmsServiceL()
+    {
+    if ( !iMmsClient )
+        {
+        return EFalse;
+        }
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:~CMsgErrorWatcherPrivate : Enter");
+    if ( iMmsServiceId == KMsvNullIndexEntryId )
+        {
+        QDEBUG_WRITE( "Looking for MMS service" );
+        iMmsClient->RestoreSettingsL();
+        iMmsServiceId = iMmsClient->MmsSettings().Service();
+        iNotificationFolderId = iMmsClient->MmsSettings().NotificationFolder();
+        iMaxReceiveSize = iMmsClient->MmsSettings().MaximumReceiveSize();
+        }
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:~CMsgErrorWatcherPrivate : Exit");
+    return ( iMmsServiceId != KMsvNullIndexEntryId );
+    }
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::StartMmsFetchL
+//
+// Initiates MMS fetch
+// ---------------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::StartMmsFetchL()
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:~CMsgErrorWatcherPrivate : Enter");
+    if ( !IsActive() && iMmsReceiveErrorMessages->Count() )
+        {
+        QDEBUG_WRITE_FORMAT("Fetching  message(s): ",
+            iMmsReceiveErrorMessages->Count() );
+        TCommandParameters parameters; // initialized to zero
+        TCommandParametersBuf paramPack( parameters );
+
+        //Add service entry as the first entry in the array
+        iMmsReceiveErrorMessages->InsertL( 0, iMmsServiceId );
+
+        // First remove existing schedules:
+        QDEBUG_WRITE( "Deleting old schedules" );
+        // Calling synchronous TransferCommandL method
+        const TInt KBufSize = 256;
+        TBuf8<KBufSize> dummy;
+        iSession->TransferCommandL( *iMmsReceiveErrorMessages,
+            EMmsDeleteSchedule,
+            paramPack,
+            dummy );
+        QDEBUG_WRITE( "Old schedules deleted!" );
+
+        // Then reschedule:
+        iStatus = KRequestPending;
+        iRequestType = EMsgRequestFetching;
+        delete iOperation;
+        iOperation = NULL;
+        QDEBUG_WRITE( "Request fetch" );
+        iOperation = iSession->TransferCommandL( *iMmsReceiveErrorMessages,
+            EMmsScheduledReceive,
+            paramPack,
+            iStatus );
+        SetActive();
+        QDEBUG_WRITE( "Reset array" );
+        iMmsReceiveErrorMessages->Reset();
+        }
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:~CMsgErrorWatcherPrivate : Exit");
+    }
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::StartMmsSendL
+//
+// 
+// ---------------------------------------------------------
+// TODO: to be handled late when connection errors are handled.
+//void CMsgErrorWatcherPrivate::StartMmsSendL()
+//    {
+//   QDEBUG_WRITE("CMsgErrorWatcherPrivate:StartMmsSendL : Enter");
+//    if ( !IsActive() && iMmsSendErrorMessages->Count() )
+//        {
+//        QDEBUG_WRITE_FORMAT("Sending message(s): "),
+//            iMmsSendErrorMessages->Count() );
+//        TCommandParameters parameters; // initialized to zero
+//        TCommandParametersBuf paramPack( parameters );
+//
+//        //Add service entry as the first entry in the array
+//        iMmsSendErrorMessages->InsertL( 0, iMmsServiceId );
+//
+//        iStatus = KRequestPending;
+//        iRequestType = EMsgRequestSending;
+//        delete iOperation;
+//        iOperation = NULL;
+//        QDEBUG_WRITE( "Request send" );
+//        iOperation = iSession->TransferCommandL( *iMmsSendErrorMessages,
+//            EMmsScheduledSend,
+//            paramPack,
+//            iStatus );
+//        SetActive();
+//        QDEBUG_WRITE( "Reset array" );
+//        iMmsSendErrorMessages->Reset();
+//        }
+//     QDEBUG_WRITE("CMsgErrorWatcherPrivate:StartMmsSendL : Exit");
+//    }
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::CheckMmsReceivingModeL
+//
+// Checks MMS receiving mode
+// ---------------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::CheckMmsReceivingModeL()
+    {
+    if ( !( iWatcherFlags & EStartupReady ) || !GetMmsServiceL() )
+        {
+        return;
+        }
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:CMsgErrorWatcherPrivate : Enter");
+    TBool validAP = ValidateMmsServiceL(); //Refreshes MMS settings
+    
+
+    TInt fetchHome = iMmsClient->MmsSettings().ReceivingModeHome();
+    TInt fetchRoam = iMmsClient->MmsSettings().ReceivingModeForeign();
+    QDEBUG_WRITE_FORMAT("ReceivingModeHome: ", fetchHome );
+    QDEBUG_WRITE_FORMAT("ReceivingModeForeign: ", fetchRoam );
+
+    if ( validAP &&
+        fetchRoam == EMmsReceivingReject &&
+        fetchHome != EMmsReceivingReject )
+        {
+        QDEBUG_WRITE( "ShowNote flag enabled" );
+        iWatcherFlags |= EShowRoamingNote;
+        }
+    else
+        {
+        //Reset roaming note flag
+        QDEBUG_WRITE( "ShowNote flag disabled" );
+        iWatcherFlags &= ~EShowRoamingNote;
+        iWatcherFlags &= ~ERoamingNoteShown;
+        }
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:~CMsgErrorWatcherPrivate : Exit");
+    }
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::ValidateMmsServiceL
+//
+// Validates MMS service
+// ---------------------------------------------------------
+//
+TBool CMsgErrorWatcherPrivate::ValidateMmsServiceL()
+    {
+//    if ( !GetMmsServiceL() )
+//        {
+//        return EFalse;
+//        }
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:ValidateMmsServiceL : Enter");
+    iMmsClient->RestoreSettingsL(); //Refreshes MMS settings
+    QDEBUG_WRITE_FORMAT("ValidateService: ", iMmsClient->ValidateService( iMmsServiceId ) );
+
+    TInt errorCode = iMmsClient->ValidateService( iMmsServiceId );
+    QDEBUG_WRITE_FORMAT("ValidateService: errorcode ---  ", errorCode );
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:ValidateMmsServiceL : Exit");
+    return ( errorCode == KErrNone );
+    }
+
+// ---------------------------------------------------------
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::HandleNoAPErrorL
+//
+// Handles "no access point defined" error
+// ---------------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::HandleNoAPErrorL( TMsvEntry& aEntry )
+    { 
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleNoAPErrorL : Enter");
+    iMmsReceiveErrorMessages->AppendL( aEntry.Id() );
+
+    iWatcherFlags |= ENoAPErrorPending;
+    if ( !iCenRepObserver )
+        {
+        QDEBUG_WRITE( "Creating CenRep observer" );
+        iCenRepObserver = CMsgCenRepObserver::NewL( *this );
+        iCenRepObserver->SubscribeNotification();
+        }
+    //Let's reset the TMsvEntry::iError to get rig of excess warning note
+    ResetErrorFieldL( aEntry );
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleNoAPErrorL : Exit");
+    }
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::HandleInvalidAPErrorL
+//
+// Handles "invalid access point" error
+// ---------------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::HandleInvalidAPErrorL( TMsvEntry& aEntry, TBool aStartObserver )
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleInvalidAPErrorL : Enter");
+    iMmsReceiveErrorMessages->AppendL( aEntry.Id() );
+   
+    q_ptr->ShowNote(EInvalidAccessPointNote);
+    if ( aStartObserver && !iCommDbObserver )
+        {
+        QDEBUG_WRITE( "Creating CommDB observer" );
+        iCommDbObserver = CMsgErrorCommDbObserver::NewL( *this );
+        }
+    if ( aStartObserver && !iCenRepObserver )
+        {
+        //We must also start cenrep observer
+        QDEBUG_WRITE( "Creating CenRep observer" );
+        iCenRepObserver = CMsgCenRepObserver::NewL( *this );
+        iCenRepObserver->SubscribeNotification();
+        }    
+    
+    //Let's reset the TMsvEntry::iError to get rig of excess warning note
+    ResetErrorFieldL( aEntry ); 
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleInvalidAPErrorL : Exit");
+    }
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::HandleConnectionErrorL
+//
+// Handles "connection reserved" error
+// ---------------------------------------------------------
+// TODO: to be handled later.
+//void CMsgErrorWatcherPrivate::HandleConnectionErrorL( TMsvEntry& aEntry, TBool aReceive )
+//    {
+//        QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleConnectionErrorL : Enter");
+//    if ( !iConnectionObserver )
+//        {
+//        QDEBUG_WRITE( "Creating connection observer" );
+//        iConnectionObserver = CMsgErrorConnectionObserver::NewL( *this );
+//        }
+//    if ( iConnectionObserver->ConnectionsOpen() )
+//        {
+//        QDEBUG_WRITE( "Open connections detected" );
+//        if ( aReceive )
+//            {
+//            iMmsReceiveErrorMessages->AppendL( aEntry.Id() );
+//            }
+//        else
+//            {
+//            iMmsSendErrorMessages->AppendL( aEntry.Id() );
+//            }
+//        //No matter if already started
+//        iConnectionObserver->StartL();
+//        }
+//    else
+//        {
+//        QDEBUG_WRITE( "No open connections" );
+//        delete iConnectionObserver;
+//        iConnectionObserver = NULL;
+//        }
+//    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleConnectionErrorL : Exit");
+//    }
+
+// ---------------------------------------------------------
+// CMsgErrorWatcher::HandleDiskSpaceErrorL
+//
+// Handles "no disk space" error
+// ---------------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::HandleDiskSpaceErrorL( TMsvEntry& aEntry )
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleDiskSpaceErrorL : Enter");
+    iMmsReceiveErrorMessages->AppendL( aEntry.Id() );
+
+    iDiskSpaceErrors++;
+    if ( iDiskSpaceErrors == 1 )
+        {
+        if ( !( iWatcherFlags & EStartupReady ) )
+            {
+            return;
+            }
+        QDEBUG_WRITE( "Show note" );
+        q_ptr->ShowNote(EDiskLowNote1);
+        }
+    TUint triggerLevel = Max( KDefaultTriggerLevel, iMaxReceiveSize );
+    //Activate DiskSpace observer
+    if ( !iDiskSpaceObserver )
+        {
+       QDEBUG_WRITE( "Creating disk space observer" );
+        iDiskSpaceObserver = CMsgErrorDiskSpaceObserver::NewL( *this, *iSession, iFs );
+        }
+       QDEBUG_WRITE_FORMAT("Limit set to: ",
+        KCriticalLevel + triggerLevel + KTriggerMargin );
+    iDiskSpaceObserver->SetLimitAndActivateL( KCriticalLevel +
+        triggerLevel +
+        KTriggerMargin );
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleDiskSpaceErrorL : Exit");
+    }
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::HandleMemoryErrorL
+//
+// Handles "no memory" error
+// ---------------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::HandleMemoryErrorL( TMsvEntry& aEntry )
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleMemoryErrorL : Enter");
+    iMmsReceiveErrorMessages->AppendL( aEntry.Id() );
+    if ( !( iWatcherFlags & EStartupReady ) )
+        {
+        return;
+        }
+    q_ptr->ShowNote(EMemoryLowNote);
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleMemoryErrorL : Exit");
+    }
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::HandleRoamingEventL
+//
+// Handles events from roaming observer
+// ---------------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::HandleRoamingEventL( TBool aRoaming )
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleRoamingEventL : Enter");
+    QDEBUG_WRITE_FORMAT("aRoaming : ", aRoaming );
+    if ( !iMmsClient )
+        {
+        // We should never get here if MMS Client MTM is not present
+        // since roaming observer is not started in that case.
+        // This return is here just in case...
+        return;
+        }
+
+    TInt fetchHome = iMmsClient->MmsSettings().ReceivingModeHome();
+    TInt fetchRoam =  iMmsClient->MmsSettings().ReceivingModeForeign();
+    QDEBUG_WRITE_FORMAT("HandleRoamingEventL fetchHome : ", fetchHome );
+    QDEBUG_WRITE_FORMAT("HandleRoamingEventL fetchRoam : ", fetchRoam );
+    
+    TBool fetchAll = EFalse;
+
+    if ( aRoaming )
+        {
+        QDEBUG_WRITE( "we are in roaming." );
+        //We are in roaming network
+        if ( fetchRoam == EMmsReceivingAutomatic &&
+            fetchHome != EMmsReceivingAutomatic )
+            {
+            fetchAll = ETrue;
+            }
+        if ( ( iWatcherFlags & EShowRoamingNote ) &&
+            !( iWatcherFlags & ERoamingNoteShown ) )
+            {
+            //Show roaming note if requested
+            if ( !( iWatcherFlags & EStartupReady ) )
+                   {
+                   return;
+                   }
+            q_ptr->ShowNote(ERoamingNote);
+            iWatcherFlags |= ERoamingNoteShown;
+            }
+        }
+    else
+        {
+        QDEBUG_WRITE( "we are in home network." );
+        //We are in home network
+        if ( fetchHome == EMmsReceivingAutomatic &&
+            fetchRoam != EMmsReceivingAutomatic )
+            {
+            fetchAll = ETrue;
+            }
+        //Reset roaming note flag
+        iWatcherFlags &= ~ERoamingNoteShown;
+        }
+
+    if ( fetchAll && !IsActive() )
+        {
+        QDEBUG_WRITE( "starting fetch all" );
+        iStatus = KRequestPending;
+        iRequestType = EMsgRequestFetchingAll;
+        delete iOperation;
+        iOperation = NULL;
+        iOperation = iMmsClient->FetchAllL( iStatus, EFalse );
+        SetActive();
+        }
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:~CMsgErrorWatcherPrivate : Exit");
+    }
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::HandleCommDbEventL
+//
+// Handles events from CommDB observer
+// ---------------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::HandleCommDbEventL()
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleCommDbEventL : Enter");
+    if ( ValidateMmsServiceL() )
+        {
+        QDEBUG_WRITE( "starting fetch" );
+        StartMmsFetchL();
+        }
+    else
+        {
+        //Wait for another event
+        QDEBUG_WRITE( "restart CommDB observer" );
+        iCommDbObserver->Restart();
+        }
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleCommDbEventL : Exit");
+    }
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::HandleConnectionEvent
+//
+// Handles events from connection observer
+// ---------------------------------------------------------
+// TODO: handel later.
+//void CMsgErrorWatcherPrivate::HandleConnectionEvent()
+//    {
+//    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleConnectionEvent : Enter");
+//    if ( !IsActive() )
+//        {
+//        MEWLOGGER_WRITE( "HandleConnectionEvent, Starting delay timer" );
+//        iStatus = KRequestPending;
+//        iRequestType = EMsgRequestWaitingDisconnection;
+//        iTimer.After( iStatus, KDelayAfterDisconnect );
+//        SetActive();
+//        }
+//   QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleConnectionEvent : Exit");
+//    }
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::HandleDiskSpaceEventL
+//
+// Handles events from disk space observer
+// ---------------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::HandleDiskSpaceEventL()
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleDiskSpaceEventL : Enter");
+    QDEBUG_WRITE( "starting fetch" );
+    StartMmsFetchL();
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleDiskSpaceEventL : Exit");
+    }
+
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::HandleDiskSpaceEvent2L
+//
+// Handles events from disk space observer
+// -------k--------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::HandleDiskSpaceEvent2L()
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleDiskSpaceEvent2L : Enter");
+    // erro note text was coming form avkon.
+    QDEBUG_WRITE( "show note" );
+    q_ptr->ShowNote(ESMSIncomingLowDiskSpace);
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleDiskSpaceEvent2L : Exit");
+    
+    }
+
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::HandleStartupReadyL
+//
+// Handles events from startup state observer (currently 
+// CMsgSentItemsObserver)
+// ---------------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::HandleStartupReadyL()
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleStartupReadyL : Enter");
+    QDEBUG_WRITE( "Startup ready!" );
+    iWatcherFlags |= EStartupReady;
+    CheckMmsReceivingModeL();
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleStartupReadyL : Exit");
+    }
+
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::HandleCenRepNotificationL
+//
+// Handles events from Central Repository observer
+// ---------------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::HandleCenRepNotificationL()
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleCenRepNotificationL : Enter");
+    if ( ValidateMmsServiceL() )
+        {
+        QDEBUG_WRITE( "starting fetch" );
+        StartMmsFetchL();
+        }
+    else
+        {
+        //Wait for another event
+        QDEBUG_WRITE( "restart CenRep observer" );
+        iCenRepObserver->SubscribeNotification();
+        }
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleCenRepNotificationL : Exit");
+    }
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::HandleSessionEventL
+//
+// Handles events from MsgServer observer
+// ---------------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::HandleSessionEventL( TMsvSessionEvent aEvent,
+                                           TAny* aArg1,
+                                           TAny* aArg2,
+                                           TAny* aArg3 )
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleSessionEventL : Enter");
+    if ( ( aEvent == EMsvCloseSession ||
+        aEvent == EMsvServerTerminated ||
+        aEvent == EMsvMediaUnavailable ||
+        aEvent == EMsvMediaChanged ) &&
+        iWatcherFlags & EWatcherRunning )
+        {
+        QDEBUG_WRITE_FORMAT("StopWatcher event: ", aEvent );
+        StopWatcher();
+        //Start retry timer
+        StartRestartTimer();
+        return;
+        }
+    if ( aEvent == EMsvServerReady &&
+        !( iWatcherFlags & EWatcherRunning ) )
+        {
+        TRAPD ( err, StartWatcherL() );
+        if ( err ) //make sure watcher is not left in obscure state
+            {
+            StopWatcher();
+            }
+        return;
+        }
+    if ( aArg1 == 0 || aArg2 == 0 || !( iWatcherFlags & EWatcherRunning ) )
+        {
+        return;
+        }
+    // If for some reason MMS service is not yet found,
+    // we try to find it now...
+    GetMmsServiceL();
+
+    CMsvEntrySelection* entries = static_cast<CMsvEntrySelection*>( aArg1 );
+    TInt count = entries->Count();
+    
+    // Mark the _original_ folder as parent for "entries moved" events (in "aArg3").
+    // For other events the parent is in "aArg2".
+    TMsvId parentId = ( aEvent == EMsvEntriesMoved )
+        ? *( static_cast<TMsvId*>( aArg3 ) )
+        : *( static_cast<TMsvId*>( aArg2 ) );
+    
+    if ( count < 1 )
+        {
+        return;
+        }
+    if ( parentId == KMsvRootIndexEntryIdValue &&
+        iMmsServiceId != KMsvNullIndexEntryId )
+        {
+        // We're not interested in these events if MMS Service is not present.
+        HandleRootEventL( aEvent, entries );
+        }
+    else if ( parentId == KMsvLocalServiceIndexEntryIdValue )
+        {
+        HandleLocalServiceEventL( aEvent, entries );
+        }
+    else if ( parentId == KWatcherOutboxFolderId )
+        {
+        HandleOutboxEventL( aEvent, entries );
+        }
+    else if ( ( iMmsServiceId != KMsvNullIndexEntryId && parentId == iMmsServiceId ) ||
+        ( iNotificationFolderId != KMsvNullIndexEntryId && parentId == iNotificationFolderId ) )
+        {
+        HandleMmsServiceEventL( aEvent, entries );
+        }
+    else
+        {
+        //do nothing
+        }
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleSessionEventL : Exit");
+    }
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::HandleRootEventL
+//
+// Handles root events from MsgServer observer
+// ---------------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::HandleRootEventL( TMsvSessionEvent aEvent,
+                                        CMsvEntrySelection* aEntries )
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleRootEventL : Enter");
+    QDEBUG_WRITE_FORMAT("aEvent : ",aEvent);
+    switch ( aEvent )
+        {
+        case EMsvEntriesChanged:
+            {
+            TInt count = aEntries->Count();
+            TInt i = 0;
+            while ( i < count )
+                {
+                TMsvId dummy;
+                TMsvEntry entry;
+                TInt error = iSession->GetEntry(
+                    aEntries->At( i ), dummy, entry );
+
+                //We're only interested in MMS service
+                if ( !error && 
+                    iMmsServiceId != KMsvNullIndexEntryId &&
+                    entry.Id() == iMmsServiceId )
+                    {
+                    QDEBUG_WRITE( "HandleRootEventL, MMS service changed" );
+                    //Check whether the roaming setting has changed
+                    CheckMmsReceivingModeL();
+
+                    //We're waiting for the the user to change access points
+                    //if iCommDbObserver exists
+                    if ( iCommDbObserver && ValidateMmsServiceL() )
+                        {
+                        QDEBUG_WRITE( "HandleRootEventL, deleting CommDB observer" );
+                        StartMmsFetchL();
+                        }
+                    }
+                i++;
+                }
+            break;
+            }
+        default:
+            break;
+        }
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleRootEventL : Exit");
+    }
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::HandleLocalServiceEventL
+//
+// Handles local service events from MsgServer observer
+// ---------------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::HandleLocalServiceEventL( TMsvSessionEvent aEvent,
+                                                CMsvEntrySelection* aEntries )
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleLocalServiceEventL : Enter");
+    if ( iNotificationFolderId == KMsvNullIndexEntryId &&
+        aEvent == EMsvEntriesCreated )
+        {
+        TInt count = aEntries->Count();
+        TInt i = 0;
+        while ( i < count )
+            {
+            TMsvId dummy;
+            TMsvEntry entry;
+            TInt error = iSession->GetEntry(
+                aEntries->At( i ), dummy, entry );
+            if ( !error &&
+                entry.iDetails.Compare( KMMSNotificationFolder ) == 0 )
+                {
+                iNotificationFolderId = aEntries->At( i );
+               QDEBUG_WRITE_FORMAT("Notification folder created: ", iNotificationFolderId );
+                }
+            i++;
+            }
+        }
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleLocalServiceEventL : Exit");
+    }
+
+
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::HandleOutboxEventL
+//
+// Handles outbox events from MsgServer observer
+// ---------------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::HandleOutboxEventL( TMsvSessionEvent aEvent,
+                                          CMsvEntrySelection* aEntries )
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleOutboxEventL : Enter");
+    TInt count = aEntries->Count();
+    QDEBUG_WRITE_FORMAT("aEvent: ",aEvent);
+    switch (aEvent)
+        {
+        case EMsvEntriesChanged:
+               {
+//               MEWLOGGER_WRITE("HandleOutboxEventL: case: EMsvEntriesChanged start");
+//               TInt i = 0;
+//               MEWLOGGER_WRITEF( _L("EMsvEntriesChanged count: %d"), count );
+//               while ( i < count )
+//                   {
+//                   MEWLOGGER_WRITE( "EMsvEntriesChanged - inside while" );
+//                   TMsvId dummy;
+//                   TMsvEntry entry;
+//                   TInt error = iSession->GetEntry(
+//                       aEntries->At( i ), dummy, entry );
+//                   TUid mtm = entry.iMtm;
+//                   MEWLOGGER_WRITEF( _L("EMsvEntriesChanged - mtm ---  %d"), mtm );
+//                   MEWLOGGER_WRITEF( _L("EMsvEntriesChanged - entry id ---  %d"), iMmsSendErrorMessages->Find( entry.Id() ));
+//                   if ( mtm == KSenduiMtmMmsUid &&
+//                       iMmsSendErrorMessages->Find( entry.Id() ) == KErrNotFound )
+//                       {
+//                       MEWLOGGER_WRITE( "EMsvEntriesChanged - inside if" );
+//                       if ( // the first error is activated again to synchronize
+//                           // with connection manager (MPM) 
+//                           entry.iError == KErrPacketDataTsyMaxPdpContextsReached ||
+//                           entry.iError == KErrUmtsMaxNumOfContextExceededByPhone ||
+//                           entry.iError == KErrUmtsMaxNumOfContextExceededByNetwork ||
+//                           // add the following error to the list to synchronize with 
+//                           // connection manager (MPM)
+//                           entry.iError == KErrGprsInsufficientResources )
+//                           {
+//                           MEWLOGGER_WRITE( "MMS send - connection active" );
+//                           
+//                           //Let's now save the id. This way we can reset the entrys
+//                           //error field just before the fetch start. This prevents
+//                           //duplicate error notes because this case branch is reached many times.
+//                           iCurrentEntryId = entry.Id();
+//                           
+//                           HandleConnectionErrorL( entry, EFalse );
+//                           }
+//                       }
+//                   i++;
+//                   }
+             break;      
+             }
+        case EMsvEntriesMoved: // Messages are moved _from_ this folder.
+        case EMsvEntriesDeleted:
+            {
+            TInt i = 0;
+            while ( i < count )
+                {
+                TInt selectionId = iMmsSendErrorMessages->Find( aEntries->At( i ) );
+                if ( selectionId != KErrNotFound )
+                    {
+                    iMmsSendErrorMessages->Delete( selectionId );
+                    }
+                i++;
+                }
+            }
+            break;
+        default:
+            break;
+        }
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleOutboxEventL : Exit");
+    }
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::HandleMmsServiceEventL
+//
+// Handles MMS service events from MsgServer observer
+// ---------------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::HandleMmsServiceEventL( TMsvSessionEvent aEvent,
+                                              CMsvEntrySelection* aEntries )
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleMmsServiceEventL : Enter");
+    TInt count = aEntries->Count();
+    QDEBUG_WRITE_FORMAT("aEvent: ", aEvent );
+    switch (aEvent)
+        {
+        case EMsvEntriesChanged:
+            {
+            TInt i = 0;
+            while ( i < count )
+                {
+                TMsvId dummy;
+                TMsvEntry entry;
+                TInt error = iSession->GetEntry(
+                    aEntries->At( i ), dummy, entry );
+
+                if ( !error )
+                    {
+                    QDEBUG_WRITE_FORMAT("FetchState: ", entry.SendingState() );
+                    QDEBUG_WRITE_FORMAT("Error: ", entry.iError );
+                    QDEBUG_WRITE_FORMAT("Retries: ", entry.iMtmData3 );
+                    QDEBUG_WRITE_FORMAT("Failed: ", (TInt)entry.Failed() );
+                    QDEBUG_WRITE_FORMAT("ArrayId: ", iMmsReceiveErrorMessages->Find( entry.Id() ) );
+                    }
+                //Check that reception has failed and that the entry is not
+                //already in iMmsReceiveErrorMessages
+                if ( !error &&
+                    iMmsReceiveErrorMessages->Find( entry.Id() ) == KErrNotFound )
+                    {
+                    TInt entryErr = entry.iError;
+                    if ( entryErr == KErrGprsMissingorUnknownAPN )
+                        {
+                        // Map to "invalid ap" error.
+                        entryErr = KMmsErrorAP1Invalid;
+                        }
+                    QDEBUG_WRITE_FORMAT("entryErr: ", entryErr );
+                    switch ( entryErr )
+                        {
+                        case KErrDiskFull:
+                            {
+                            HandleDiskSpaceErrorL( entry );
+                            }
+                            break;
+                        case KErrNoMemory:
+                            {
+                            HandleMemoryErrorL( entry );
+                            }
+                            break;
+                          // TODO: to be handled later.
+                         // the first error is activated again to synchronize
+                         // with connection manager (MPM)
+//                        case KErrPacketDataTsyMaxPdpContextsReached:
+//                        case KErrUmtsMaxNumOfContextExceededByPhone:
+//                        case KErrUmtsMaxNumOfContextExceededByNetwork:
+//                        // add the following error to the list to synchronize with 
+//                        // connection manager (MPM)
+//                        case KErrGprsInsufficientResources:
+//                            {
+//                            //Let's now save the id. This way we can reset the entrys
+//                            //error field just before the fetch start. This prevents
+//                            //duplicate error notes because this case branch is reached many times.
+//                            iCurrentEntryId = entry.Id();
+//                            //Connection already active should be "detected"
+//                            //only after third retry failure if "disconnect
+//                            //delay" feature is activated.
+//                            TInt retries = ( iWatcherFlags & EReceivingDisconnectDelay )
+//                                ? KConnectionRetries
+//                                : 0;
+//                            if ( ( entry.iMtmData3 & KMmsRetryCountMask ) >= retries ) //lint !e574
+//                                {
+//                                MEWLOGGER_WRITE( "MMS fetch - connection active" );
+//                                
+//                                
+//                                HandleConnectionErrorL( entry, ETrue );
+//                                }
+//                            }
+//
+//                            break;
+
+                        case KMmsErrorNoWAPAccessPoint:
+                            {
+                            HandleNoAPErrorL( entry );
+                            }
+                            break;
+                        case KMmsErrorAP1Invalid:
+                        case KMmsErrorNoURI1:
+                            {
+                            HandleInvalidAPErrorL( entry, ETrue );
+                            }
+                            break;
+                        case KErrIfAuthenticationFailure: //username/passwd
+                            {
+                            HandleInvalidAPErrorL( entry, EFalse );
+                            }
+                            break;
+                        default:
+                            //nothing to do
+                            break;
+                        }
+                    }
+                i++;
+                }
+            }
+            break;
+        case EMsvEntriesMoved: // Messages are moved _from_ this "folder".
+        case EMsvEntriesDeleted:
+            {
+            TInt i = 0;
+            TInt originalCount = iMmsReceiveErrorMessages->Count();
+            while ( i < count )
+                {
+                TInt selectionId = iMmsReceiveErrorMessages->Find( aEntries->At( i ) );
+                if ( selectionId != KErrNotFound )
+                    {
+                    iMmsReceiveErrorMessages->Delete( selectionId );
+                    }
+                i++;
+                }
+            if ( originalCount && !iMmsReceiveErrorMessages->Count() )
+                {
+                // array was emptied
+                ResetWatcher();
+                }
+            }
+            break;
+        default:
+            break;
+        }
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:HandleMmsServiceEventL : Enter");
+    }
+
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::ResetErrorFieldL
+//
+// Reset TMsvEntry::iError of the current notification
+// ---------------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::ResetErrorFieldL( )
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:ResetErrorFieldL : Enter");
+    //Makes sure the entry is set
+    if( iCurrentEntryId != KMsvNullIndexEntryId )
+        {
+        CMsvEntry *cEntry( NULL );
+        TRAPD( err, cEntry = iSession->GetEntryL( iCurrentEntryId ) );
+        if ( err == KErrNotFound )
+        	{
+        	iCurrentEntryId = KMsvNullIndexEntryId;
+        	return;
+        	}
+        CleanupStack::PushL( cEntry );
+        TMsvEntry tEntry = cEntry->Entry();
+        tEntry.iError = KErrNone;
+        cEntry -> ChangeL( tEntry );
+        CleanupStack::PopAndDestroy( cEntry );
+        //This prevents getting here to often
+        iCurrentEntryId = KMsvNullIndexEntryId;
+        } 
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:ResetErrorFieldL : Exit");
+    }
+    
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::ResetErrorFieldL
+//
+// Reset TMsvEntry::iError 
+// ---------------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::ResetErrorFieldL( TMsvEntry& aEntry )
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:ResetErrorFieldL() : Enter");
+    CMsvEntry *cEntry = iSession->GetEntryL( aEntry.Id() );  
+    CleanupStack::PushL( cEntry );
+    aEntry.iError = KErrNone;
+    cEntry -> ChangeL( aEntry );
+    CleanupStack::PopAndDestroy( cEntry ); 
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:ResetErrorFieldL() : Exit");
+    }
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::DoCancel
+//
+// From active object framework
+// ---------------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::DoCancel()
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:DoCancel : Enter");
+    iTimer.Cancel();
+    if ( iOperation )
+        {
+        iOperation->Cancel();
+        }
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:DoCancel : Exit");
+    }
+
+// ---------------------------------------------------------
+// CMsgErrorWatcherPrivate::RunL
+//
+// From active object framework
+// ---------------------------------------------------------
+//
+void CMsgErrorWatcherPrivate::RunL()
+    {
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:RunL : Enter");
+    QDEBUG_WRITE_FORMAT("RunL, iStatus: ", iStatus.Int() );
+    QDEBUG_WRITE_FORMAT("RunL, iRequestType: ", iRequestType );
+    QDEBUG_WRITE_FORMAT("RunL, EMsgRequestSending - iMmsReceiveErrorMessages: ", iMmsReceiveErrorMessages->Count() );
+    
+    switch ( iRequestType )
+        {
+        case EMsgRequestStartingUp:
+            {
+            if ( !( iWatcherFlags & EWatcherRunning ) )
+                {
+                TRAPD ( err, StartWatcherL() );
+                if ( err ) //make sure watcher is not left in obscure state
+                    {
+                    QDEBUG_WRITE_FORMAT("Leave from StartWatcherL: %d", err );
+                    StopWatcher();
+                    if ( iTimerRetries < KMaxTimerRetries )
+                        {
+                        StartRestartTimer();
+                        }
+                    //else give up
+                    }
+                }
+            }
+            break;
+        case EMsgRequestSending:
+            {
+            if ( iMmsReceiveErrorMessages->Count() )
+                {
+                StartMmsFetchL();
+                }
+            else
+                {
+//                delete iConnectionObserver;
+//                iConnectionObserver = NULL;
+                ResetErrorFieldL();
+                }
+            break;
+            }
+        case EMsgRequestFetching:
+            {
+            ResetErrorFieldL();
+            ResetWatcher();
+            break;
+            }
+//       TODO: to be handled later.
+//        case EMsgRequestWaitingDisconnection:
+//            {
+//            MEWLOGGER_WRITE( "RunL, Disconnect delay passed" );
+//            MEWLOGGER_WRITEF( _L("RunL, EMsgRequestWaitingDisconnection - iMmsReceiveErrorMessages: %d"),  iMmsSendErrorMessages->Count() );
+//            if ( iMmsSendErrorMessages->Count() )
+//                {
+//                StartMmsSendL();
+//                }
+//            else
+//                {
+//                StartMmsFetchL();
+//                }
+//            //ResetErrorFieldL();     
+//            }
+//            break;
+        case EMsgRequestFetchingAll:
+        default:
+            break;
+        }
+    QDEBUG_WRITE("CMsgErrorWatcherPrivate:RunL : Exit");
+    }
+
+
+//  End of File  
+