emailservices/emailserver/src/fsnotificationhandlermgrimpl.cpp
changeset 0 8466d47a6819
child 8 e1b6206813b4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailservices/emailserver/src/fsnotificationhandlermgrimpl.cpp	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,470 @@
+/*
+* Copyright (c) 2007-2008 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:  Implementation of notification handler manager
+*
+*/
+
+
+#include "emailtrace.h"
+#include <ecom/ecom.h> // FinalClose()
+//<cmail>
+#include "CFSMailClient.h"
+//</cmail>
+#include <sysutil.h>
+//<cmail>
+#include <fsmailserver.rsg>
+#include "cmailhandlerpluginuids.h"
+#include "fsnotificationhandlerbase.h"
+#include "FsEmailGlobalDialogsAppUi.h"
+#include "FsEmailMessageQueryDialog.h"
+#include "FsEmailAuthenticationDialog.h"
+//</cmail>
+#include "fsnotificationhandlermgrimpl.h"
+//<cmail>
+#include "FsEmailGlobalDialogsAppUi.h"
+//</cmail>
+
+
+static const TInt64 KMegaByte = 1048576;
+
+// ======== MEMBER FUNCTIONS ========
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+//<cmail> // aAppUi parameter no longer used, created by its own
+CFSNotificationHandlerMgr::CFSNotificationHandlerMgr(CFsEmailGlobalDialogsAppUi* aAppUi) :
+//</cmail>
+    CActive( EPriorityStandard ),
+    iAppUi( aAppUi )
+    {
+    FUNC_LOG;
+    CActiveScheduler::Add( this );
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CFSNotificationHandlerMgr::ConstructL()
+    {
+    FUNC_LOG;
+    // Performs the time consuming initialization asynchronously in RunL, in order
+    // to let the process startup finish quicker
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete(status, KErrNone);
+    SetActive();
+    }
+
+// ---------------------------------------------------------------------------
+// Finishes the initialisation
+// ---------------------------------------------------------------------------
+//
+void CFSNotificationHandlerMgr::RunL()
+    {
+    FUNC_LOG;
+    // 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();
+
+    //<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();
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CFSNotificationHandlerMgr::DoCancel()
+    {
+    FUNC_LOG;
+    // Nothing to cancel
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CFSNotificationHandlerMgr::CreateAndStoreHandlerL( TInt aImplementationUid )
+    {
+    FUNC_LOG;
+    CFSNotificationHandlerBase* handler = NULL;
+    TRAPD( error, handler = CFSNotificationHandlerBase::NewL( aImplementationUid, *this ) );
+    if( handler && (error == KErrNone) )
+        {
+        iHandlers.Append( handler );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+//<cmail>
+CFSNotificationHandlerMgr* CFSNotificationHandlerMgr::NewL(CFsEmailGlobalDialogsAppUi* aAppUi)
+//</cmail>
+    {
+    FUNC_LOG;
+    CFSNotificationHandlerMgr* self = CFSNotificationHandlerMgr::NewLC( aAppUi );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+//<cmail>
+CFSNotificationHandlerMgr* CFSNotificationHandlerMgr::NewLC(CFsEmailGlobalDialogsAppUi* aAppUi)
+//</cmail>
+    {
+    FUNC_LOG;
+    CFSNotificationHandlerMgr* self = new( ELeave ) CFSNotificationHandlerMgr( aAppUi );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CFSNotificationHandlerMgr::~CFSNotificationHandlerMgr()
+    {
+    FUNC_LOG;
+    Cancel();
+
+    StopObserving();
+
+    iHandlers.ResetAndDestroy();
+
+    iHSConnection = NULL;
+
+	if( iMailClient )
+		{
+        iMailClient->Close();
+        iMailClient = NULL;
+		}
+
+	//<cmail>
+	iAppUi = NULL;
+	//</cmail>
+
+    // Finished using ECom
+    // ECom used at least in CFSMailHSUpdateHandler
+    REComSession::FinalClose();
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CFSNotificationHandlerMgr::EventL(
+    TFSMailEvent aEvent,
+    TFSMailMsgId aMailbox,
+    TAny* aParam1,
+    TAny* aParam2,
+    TAny* aParam3 )
+    {
+    FUNC_LOG;
+    // First we check each event here. This is done so we know
+    // if something has must be done before passing the event on
+    // to handlers. For example we may want to register to
+    // mailbox events.
+
+    switch ( aEvent )
+        {
+        case TFSEventNewMailbox:
+            {
+            iMailClient->SubscribeMailboxEventsL( aMailbox, *this );
+            iMailClient->GetBrandManagerL().UpdateMailboxNamesL( aMailbox );
+            break;
+            }
+        case TFSEventMailboxDeleted:
+            {
+            // Don't have to do anything here. Observing has ended when the
+            // mailbox is deleted.
+            break;
+            }
+        case TFSMailboxAvailable: // Flow through
+        case TFSMailboxUnavailable: // Flow through
+        case TFSEventMailboxRenamed:
+            {
+            break;
+            }
+        case TFSEventNewMail:
+            {
+            // If this is a preinstalled version and we receive a new mail we
+            // update the current status of the HS here before passing
+            // the events to handlers so they don't have to do it. If they
+            // do it, it is done several times which is not desired.
+            // The drawback is that by doing it here we might also do it
+            // in situations where the handlers would actually not need it.
+            // Possibly the best solution would be to initialise the
+            // iHSConnection once and then let it observe for changes in
+            // central repository. Currently that solution is not implemented
+            // as it would require more time to implement.
+            }
+        default:
+            {
+            break;
+            }
+        }
+
+
+    // Let's pass all events to handlers also.
+    const TInt handlerCount( iHandlers.Count() );
+    TInt handlerIndex( 0 );
+
+    while ( handlerIndex < handlerCount )
+        {
+        // Event is passed to each handler. If one fails the
+        // event is still passed to others as they are not
+        // necessarily dependant on the same services. This way
+        // If one fails the others can still succeed.
+        TRAP_IGNORE(
+            iHandlers[handlerIndex]->EventL( aEvent,
+                                             aMailbox,
+                                             aParam1,
+                                             aParam2,
+                                             aParam3 ) );
+        ++handlerIndex;
+        }
+    }
+
+CFSMailClient& CFSNotificationHandlerMgr::MailClient() const
+    {
+    FUNC_LOG;
+    // Instance of this class does not exist without the
+    // mail client so it is safe to return a reference to the
+    // pointed object.
+    return *iMailClient;
+    }
+
+CFSNotificationHandlerHSConnection* CFSNotificationHandlerMgr::HSConnection() const
+    {
+    FUNC_LOG;
+    return iHSConnection;
+    }
+
+void CFSNotificationHandlerMgr::IncreaseDialogCount()
+    {
+    FUNC_LOG;
+    iDialogCount++;
+    }
+
+void CFSNotificationHandlerMgr::DecreaseDialogCount()
+    {
+    FUNC_LOG;
+    iDialogCount--;
+    }
+
+TInt CFSNotificationHandlerMgr::GetDialogCount()
+    {
+    FUNC_LOG;
+    return iDialogCount;
+    }
+
+//<cmail>
+void CFSNotificationHandlerMgr::MessageQueryL( TDesC& aMailboxName,
+                                               TRequestStatus& aStatus,
+                                               const TDesC& aCustomMessageText,
+                                               TFsEmailNotifierSystemMessageType aMessageType )
+    {
+    FUNC_LOG;
+    CFsEmailMessageQueryDialog* dialog =
+            CFsEmailMessageQueryDialog::NewLC(
+                aStatus, aMailboxName, aMessageType, aCustomMessageText );
+    // RunLD pops dialog from cleanup stack
+    dialog->RunLD();
+    }
+//</cmail>
+
+TInt CFSNotificationHandlerMgr::AuthenticateL( TDes& aPassword,
+                                               TDesC& aMailboxName,
+                                               TRequestStatus& aStatus )
+    {
+    FUNC_LOG;
+    CFsEmailAuthenticationDialog* dialog = CFsEmailAuthenticationDialog::NewL( aStatus, aMailboxName, aPassword );
+    TRAPD( err, dialog->ExecuteLD( R_FS_MSERVER_DIALOG_AUTHENTICATION ) );
+    return err;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CFSNotificationHandlerMgr::StartObservingL()
+    {
+    FUNC_LOG;
+    iMailClient->AddObserverL( *this );
+
+    RPointerArray<CFSMailBox> mailBoxList;
+    // Null id given as a plugin id. mailboxes of all plugins retrieved.
+    // Notice that ownership of the mailboxes is not passed to here.
+    iMailClient->ListMailBoxes( TFSMailMsgId(), mailBoxList );
+
+    TInt mailBoxCount( mailBoxList.Count() );
+    TInt mailboxIndexer( 0 );
+    while ( mailboxIndexer < mailBoxCount )
+        {
+
+        // Here could be prevented the observing of mailboxes
+        // that don't contain inbox but it is probably rather
+        // improbable and it also would complicate the implementation.
+        // So not implemented.
+        TFSMailMsgId currentMailboxId(
+            mailBoxList[mailboxIndexer]->GetId() );
+        TInt error = KErrNone;
+        TRAP( error, iMailClient->SubscribeMailboxEventsL( currentMailboxId,
+                                                           *this ) );
+
+        // Although an error would occur in subscribing to some mailbox
+        // the execution is still continued so that one mailbox won't
+        // prevent mail server from using the other mailboxes.
+
+        ++mailboxIndexer;
+        }
+
+    mailBoxList.ResetAndDestroy();
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CFSNotificationHandlerMgr::StopObserving()
+    {
+    FUNC_LOG;
+
+    // Removeobserver is also called for each mailbox
+    // We should be an observer for each mailbox so this should not
+    // bring up any problems normally.
+
+    RPointerArray<CFSMailBox> mailBoxList;
+    // Null id given as a plugin id. mailboxes of all plugins retrieved.
+    // Notice that ownership of the mailboxes is not passed to here.
+    iMailClient->ListMailBoxes( TFSMailMsgId(), mailBoxList );
+
+    TInt mailBoxCount( mailBoxList.Count() );
+    TInt mailboxIndexer( 0 );
+    while ( mailboxIndexer < mailBoxCount )
+        {
+        TFSMailMsgId currentMailboxId(
+            mailBoxList[mailboxIndexer]->GetId() );
+        iMailClient->UnsubscribeMailboxEvents( currentMailboxId,
+                                               *this );
+
+        ++mailboxIndexer;
+        }
+
+    mailBoxList.ResetAndDestroy();
+
+
+    iMailClient->RemoveObserver( *this );
+
+    }
+
+// ---------------------------------------------------------------------------
+// Function cleans up downloaded files of mailboxes if disk space is low
+// ---------------------------------------------------------------------------
+//
+void CFSNotificationHandlerMgr::CleanTempFilesIfNeededL()
+	{
+    FUNC_LOG;
+    RFs fsSession;
+    User::LeaveIfError(fsSession.Connect());
+    CleanupClosePushL(fsSession);
+    // Check whether disk space is below 3MB, in that case start cleaning up
+    // downloaded attachments from mailboxes.
+    if ( SysUtil::DiskSpaceBelowCriticalLevelL( &fsSession, 3*KMegaByte, EDriveC ) )
+    	{
+	    RPointerArray<CFSMailBox> mailBoxList;
+	    // Null id given as a plugin id. mailboxes of all plugins retrieved.
+	    // Notice that ownership of the mailboxes is not passed to here.
+	    iMailClient->ListMailBoxes( TFSMailMsgId(), mailBoxList );
+		for ( TInt i = 0 ; i < mailBoxList.Count() ; ++i )
+		    {
+			TRAP_IGNORE( mailBoxList[i]->RemoveDownLoadedAttachmentsL() );
+		    }
+	    mailBoxList.ResetAndDestroy();
+ 	    }
+    CleanupStack::PopAndDestroy( &fsSession );
+	}
+
+
+//<cmail>
+// ---------------------------------------------------------------------------
+// CFSNotificationHandlerMgr::SendAppUiToBackground()
+// ---------------------------------------------------------------------------
+//
+void CFSNotificationHandlerMgr::SendAppUiToBackground()
+    {
+    FUNC_LOG;
+    if(iAppUi)
+        iAppUi->SendToBackground();
+    }
+
+// ---------------------------------------------------------------------------
+// CFSNotificationHandlerMgr::BringAppUiToForeground()
+// ---------------------------------------------------------------------------
+//
+void CFSNotificationHandlerMgr::BringAppUiToForeground()
+    {
+    FUNC_LOG;
+    if(iAppUi)
+        iAppUi->BringToForeground();
+    }
+//</cmail>
+
+// End of file
+