emailservices/emailserver/cmailhandlerplugin/inc/cmailcpshandler.h
branchRCL_3
changeset 25 3533d4323edc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailservices/emailserver/cmailhandlerplugin/inc/cmailcpshandler.h	Wed Sep 01 12:28:57 2010 +0100
@@ -0,0 +1,502 @@
+/*
+* Copyright (c) 2008 - 2009 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:  Class to handle content publishing for widget
+*
+*/
+
+
+#ifndef __CMAILCPSHANDLER_H__
+#define __CMAILCPSHANDLER_H__
+
+#include <aknappui.h>
+#include <memailobserverlistener.h> // base class
+#include <AknGlobalNote.h>
+
+// FSMailServer classes (base classes and callback interfaces)
+#include "fsnotificationhandlerbase.h"
+#include "fsnotificationhandlernotifierinitiator.h"
+#include "fsnotificationhandlernotifierinitiatorobserver.h"
+// Member classes
+#include "cmailcpssettings.h" // MMailCpsSettingsCallback
+
+class CMailCpsIf;
+class CFSMailBox;
+class CMailMailboxDetails;
+class CMailCpsSettings;
+class CMailExternalAccount;
+class CMailPluginProxy;
+class CEmailObserverPlugin;
+class CMailCpsUpdateHelper;
+
+/**
+ * CMail ContentPublishingService Handler class
+ * Class implementing a handler functionality towards rest of the MailServer
+ * 
+ *  @lib fsmailserver.exe
+ *  @since S60 v5.1
+ */
+NONSHARABLE_CLASS( CMailCpsHandler ) : 
+    public CFSNotificationHandlerBase,
+    public MMailCpsSettingsCallback,
+    public EmailInterface::MEmailObserverListener
+    {
+public:
+    
+    /**
+     * Two-phased constructor.
+     * @param aOwner Owner and manager of this handler.
+     */ 
+    static CMailCpsHandler* NewL( MFSNotificationHandlerMgr& aOwner );
+    
+    /**
+    * Destructor.
+    */
+    virtual ~CMailCpsHandler();
+
+    /**
+     * From MMailCpsSettingsCallback
+     */
+    virtual void SettingsChangedCallback();
+
+    /**
+     *
+     */
+    void SetUpdateNeeded( const TFSMailMsgId aMailbox );
+    
+    /**
+     * Wraps all "Update*" methods
+     */
+    void UpdateFullL();    
+
+    /**
+     * Method that actually does the full update.
+     * Used by CMailCpsUpdateHelper.
+     */
+    void DoUpdateFullL();    
+	
+    /**
+     *
+     */
+    void UpdateMailboxesL(TInt aInstance, const TDesC& aContentId);
+
+    /**
+     *
+     */
+    void LaunchWidgetSettingsL( const TDesC& aContentId );
+
+    /**
+     *
+     */
+    void LaunchEmailUIL( const TDesC& aContentId );
+
+    /**
+     *
+     */    
+    void LaunchEmailWizardL( const TDesC& aContentId );
+    /**
+     * Launches an application based on the given contentId
+     * This method is for external (3rd party) accounts
+     * @param aContentId specifies the widget that was pressed by the user
+     */
+    void LaunchExtAppL( const TDesC& aContentId );
+
+    /**
+     *
+     */		
+    void DissociateWidgetFromSettingL( const TDesC& aContentId );    
+
+    /**
+     * Return total number of mailboxes (native+3rd party) in the system
+     */
+    TInt TotalMailboxCountL();
+    
+    /**
+     * Return total number of native mailboxes in the system
+     */     
+    TInt TotalIntMailboxCount();
+
+    /**
+     * Return total number of 3rd party mailboxes in the system
+     */
+    TInt TotalExtMailboxCountL();
+    
+	/**
+     * Gets correct localised format for time (or date) string
+     */ 
+    static HBufC* GetMessageTimeStringL( TTime aMessageTime );
+
+    // From MEmailObserverListener
+    void EmailObserverEvent( EmailInterface::MEmailData& aData );
+
+    /**
+     *
+     */
+    void SetWaitingForNewMailbox( const TDesC& aContentId );
+    
+    /**
+     *
+     */
+    void CleanWaitingForNewMailbox();
+
+    /**
+     *
+     */
+    void SetWaitingForNewWidget( const TFSMailMsgId aMailbox );
+    
+    /**
+     *
+     */
+    void CleanWaitingForNewWidget();
+
+    /**
+     *
+     */
+    TFSMailMsgId WaitingForNewWidget();
+
+    /**
+     *
+     */
+    void AssociateWidgetToSetting( const TDesC& aContentId,
+                                   const TFSMailMsgId aMailbox );
+
+    /**
+     *
+     */    
+    TBool Associated( const TDesC& aContentId );
+
+    /**
+     *
+     */
+    void DisplayHSPageFullNoteL();
+        
+    /**
+     * get count of unread messages in inbox
+     * @param aMailbox mailbox id
+     */    
+    TInt GetUnreadCountL( TFSMailMsgId aMailbox);
+
+protected:
+    /**
+     * From CFSNotificationHandlerBase
+     * see baseclass for details
+     */
+    virtual TBool CapabilitiesToContinueL(
+        TFSMailEvent aEvent,
+        TFSMailMsgId aMailbox,
+        TAny* aParam1,
+        TAny* aParam2,
+        TAny* aParam3 ) const;
+
+    /**
+     * From CFSNotificationHandlerBase
+     * see baseclass for details
+     */
+    virtual void HandleEventL(
+        TFSMailEvent aEvent,
+        TFSMailMsgId aMailbox,
+        TAny* aParam1,
+        TAny* aParam2,
+        TAny* aParam3 );
+    
+private:
+    /**
+     * Constructor
+     * @param aOwner reference to owning class. CpsHandler is just one of
+     *        the handlers running in MailServer process.
+     */
+    CMailCpsHandler( MFSNotificationHandlerMgr& aOwner );
+    void ConstructL();
+
+    // Initialization methods
+    /**
+     * Resets everything
+     */
+    void Reset();
+
+    /**
+     * Initializes native accounts
+     */
+    void InitializeL();
+    
+    /**
+     * Initializes external accounts
+     */
+    void InitializeExternalAccountsL();
+    
+    // Creation methods
+    /**
+     * Creates an instance of mailboxdetails based on parameters
+     * @param aMailbox mailbox
+     * @return pointer to instance of CMailMailboxDetails.
+     *         Caller gets ownership of the returned object.
+     */
+    CMailMailboxDetails* CreateMailboxDetailsL( CFSMailBox& aMailbox );
+
+    /**
+     * Finds mailbox details instance from the local array
+     * @param aMailbox mailbox id
+     * @return pointer to instance of CMailMailboxDetails
+     */
+    CMailMailboxDetails* FindMailboxDetails( TFSMailMsgId aMailbox );
+    
+    /**
+     *
+     */
+    void CMailCpsHandler::UpdateMailboxNameL( const TInt aMailBoxNumber,
+                                              const TInt aWidgetInstance,
+                                              const TInt aRowNumber );
+
+    /**
+     * Handles publishing of message details
+     */
+	void UpdateMessagesL( const TInt aMailBoxNumber,
+                          const TInt aWidgetInstance,
+	                      const TInt aMessageNumber,
+                          const TInt aFirstRow );
+	
+	/**
+     *
+     */
+	void UpdateEmptyMessagesL( const TInt aWidgetInstance,
+	                           const TInt aFirstRow );
+
+    /**
+     * Handles publishing of mailbox icon
+     */
+    void UpdateMailBoxIconL( const TInt aMailBoxNumber,
+                             const TInt aWidgetInstance,
+                             const TInt aRowNumber );
+
+    /**
+     * Handles publishing of unseen icon
+     */    
+    void UpdateIndicatorIconL( const TInt aMailBoxNumber, 
+                               const TInt aWidgetInstance,
+                               const TInt aRowNumber );
+
+    // Event handling subroutines
+    /**
+     * handles new mailbox event
+     * @param aMailbox mailbox id
+     */
+    void HandleNewMailboxEventL( const TFSMailMsgId aMailbox );
+
+    /**
+     * Handles mailbox renamed event.
+     * @param aMailbox mailbox id
+     */
+    void HandleMailboxRenamedEventL( const TFSMailMsgId aMailbox );
+
+    /**
+     * handles mailbox deleted event
+     * @param aMailbox mailbox id
+     */
+    void HandleMailboxDeletedEventL( const TFSMailMsgId aMailbox );
+    
+    /**
+     * handles new mail event
+     * @param aMailbox mailbox id
+     * @param aParam1 contains event specific parameters
+     * @param aParam2 contains event specific parameters
+     */
+    void HandleNewMailEventL( TFSMailMsgId aMailbox, TAny* aParam1, TAny* aParam2 );
+
+    /**
+     * handles mail deleted event
+     * @param aMailbox mailbox id
+     * @param aParam1 contains event specific parameters
+     * @param aParam2 contains event specific parameters
+     */
+    void HandleMailDeletedEventL( TFSMailMsgId aMailbox, TAny* aParam1, TAny* aParam2 );
+
+    /**
+     * get count of unseen messages in inbox
+     * @param aMailbox mailbox id
+     */    
+    TInt GetUnseenCountL( TFSMailMsgId aMailbox);    
+    
+    /**
+     * Tells if outbox is empty
+     * @param aMailbox mailbox id
+     */    
+    TBool IsOutboxEmptyL( TFSMailMsgId aMailbox);    
+    
+    /**
+     * From CFSNotificationHandlerBase
+     * Not used
+     */
+    virtual void TurnNotificationOn();
+
+    /**
+     * From CFSNotificationHandlerBase
+     * Not used
+     */
+    virtual void TurnNotificationOff();
+
+    /**
+     *
+     */
+    TInt GetMailIcon( CFSMailMessage* aMsg );
+
+    /**
+     *
+     */	
+    TInt GetUnreadMsgIcon( CFSMailMessage* aMsg );
+	
+    /**
+     *
+     */	
+    TInt GetReadMsgIcon( CFSMailMessage* aMsg );
+
+    /**
+     *
+     */
+    TInt GetUnreadCalMsgIcon( CFSMailMessage* aMsg );
+
+    /**
+     *
+     */    
+    TInt GetReadCalMsgIcon( CFSMailMessage* aMsg );
+ 
+    /**
+     *
+     */
+    TBool IsValidDisplayName(const TDesC& aDisplayName);
+
+    /**
+     *
+     */     
+    void PublishMessageL( TInt aWidgetInstance, CFSMailMessage& aMessage,
+                          const TDesC& aSenderName,
+                          const TDesC& aSubject,
+                          const TDesC& aTime, TInt aFirstRow);
+   
+    /**
+     * Checks if the given message is already know/published
+     * @param aMailbox specifies the mailboxdetails object where duplicate is searched from
+     * @param aMsgId Id of the new message
+     * @return ETrue if duplicate, EFalse if new message
+     */
+    TBool IsDuplicate( const CMailMailboxDetails& aMailbox, const TFSMailMsgId& aMsgId );
+
+    //
+    // Private methods related to 3rd party email widget publishers
+    //
+    /**
+     * Removes all plugin proxies (and plugins) that are not listed in aAccounts
+     * @param aAccounts up-to-date list of external (3rd party) email accounts
+     *        that are specified in settings
+     */
+    void RemoveUnusedPluginsL( RPointerArray<CMailExternalAccount>& aAccounts );
+    
+    /**
+     * Goes through the array of external accounts and instantiates (newly added)
+     * 3rd party plugins
+     * @param aAccounts up-to-date list of external (3rd party) email accounts
+     *        that are specified in settings
+     */
+    void AddNewPluginsL( RPointerArray<CMailExternalAccount>& aAccounts );
+    
+    /**
+     * Goes through the array of existing 3rd party plugin (proxies) and
+     * lets them take the accounts given in the param array.
+     * Plugin proxies also update the widget data.
+     * @param aAccounts up-to-date list of external (3rd party) email accounts
+     *        that are specified in settings
+     */
+    void SelectAndUpdateExtAccountsL( RPointerArray<CMailExternalAccount>& aAccounts );
+    
+    /**
+     * Checks whether aAccounts array has entries relating to plugin with id aPluginId
+     * @param aPluginId 3rd party plugin identifier (implementation uid)
+     * @param aAccounts array of 3rd party email account information
+     * @return true or false
+     */
+    TBool IsPluginInArray( const TInt aPluginId, RPointerArray<CMailExternalAccount>& aAccounts );
+    
+    /**
+     * Checks whether aPlugins array has entries relating to plugin with id aPluginId
+     * @param aPluginId 3rd party plugin identifier (implementation uid)
+     * @param aPlugins array of plugin proxies
+     * @return true or false
+     */
+    TBool IsPluginInArray( const TInt aPluginId, RPointerArray<CMailPluginProxy>& aPlugins );
+
+    /**
+     * Goes through iExternalPlugins array and finds correct entry
+     * @param aContentId specifying a widget/account
+     * @return correct plugin proxy instance pointer (ownership not transferred)
+     *         if not found, NULL is retuned
+     */
+    CMailPluginProxy* GetExtPluginL( const TDesC& aContentId );
+    
+private: // data
+    CEikonEnv* iEnv;
+    // pointer to liw wrapper that handles actual publishing
+    CMailCpsIf*                        iLiwIf;
+    // pointer to settings class that handles settings loading and observing logic
+    CMailCpsSettings*                  iSettings;
+    // local cache of mailbox details
+    RPointerArray<CMailMailboxDetails> iAccountsArray;
+    // array of plugin proxies. One plugin proxy handles one 3rd party plugin and its accounts
+    RPointerArray<CMailPluginProxy>    iExternalPlugins;
+    // tells if email wizard is started from widget and it is still running
+    // and to which widget next added account is added.
+    HBufC*                             iWaitingForNewMailbox;
+    //
+    TFSMailMsgId                       iWaitingForNewWidget;
+    //
+    CAknGlobalNote*                    iQuery;
+    // Helper for limiting rate of updates to Homescreen widget
+    CMailCpsUpdateHelper*              iUpdateHelper;
+    };
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+
+// Helper class for limiting rate of updates to Homescreen widget
+
+// Don't make widget updates more often than this delay (milliseconds)
+#define KMailCpsHandlerUpdateDelay 1000
+
+class CMailCpsUpdateHelper : public CTimer
+    {
+    public:
+        static CMailCpsUpdateHelper* NewLC( CMailCpsHandler *aHandler );
+        static CMailCpsUpdateHelper* NewL( CMailCpsHandler *aHandler );
+
+        virtual ~CMailCpsUpdateHelper();
+
+        // Notify that Homescreen widget(s) should be updated
+        void UpdateL();	
+
+    protected:
+        void ConstructL();
+        virtual void RunL();
+        TInt RunError( TInt aError );
+
+    private:
+        CMailCpsUpdateHelper( CMailCpsHandler *aHandler );
+
+        // Performs the update, resets the timer, etc.
+        void DoUpdateL();
+
+        // Handler to use to do updates (not owned)
+        CMailCpsHandler *iCpsHandler;
+        // Whether or not an update is pending
+        TBool iPending;
+    };
+
+
+#endif  //__CMAILCPSHANDLER_H__