messagingappbase/ncnlist/inc/CNcnNotifApiObserver.h
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/ncnlist/inc/CNcnNotifApiObserver.h	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,487 @@
+/*
+* Copyright (c) 2004 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:   Defines class CNcnNotifApiObserver.
+*
+*/
+
+
+
+#ifndef CNCNNOTIFAPIOBSERVER_H
+#define CNCNNOTIFAPIOBSERVER_H
+
+//  INCLUDES
+#include <e32base.h>
+#include <msvapi.h>
+#include "MNcnNotificationObserver.h"
+#include "MNcnMsvSessionHandlerObserver.h"
+#include "NcnBaseTimer.h"
+
+// FORWARD DECLARATIONS
+class CNcnModelBase;
+class CMsvSession;
+class CNcnTimer;
+
+// CLASS DECLARATION
+
+/**
+* Observes if there are any messages in any of remote email boxes.
+* This version supports NCN Notification API. 
+*/
+class CNcnNotifApiObserver : public CBase,
+                             public MNcnNotificationObserver,
+                             public MNcnMsvSessionHandlerObserver,
+                             public MNcnTimer
+    {      
+            
+    public:     // Constructors and destructor
+
+        /**
+        * Two-phased constructor.
+        */
+        static CNcnNotifApiObserver* NewL( CNcnModelBase& aModel );
+
+        /**
+        * Destructor.
+        */
+        virtual ~CNcnNotifApiObserver();            
+        
+    public:     // New methods
+        
+        /**
+         * Handles new email entries from msv. Updates the count
+         * on appropriate mailbox.
+         * @param aEntry EMail msv entry.
+         */
+        void HandleNewEMailMsvEntryL( const TMsvEntry& aEntry );
+        
+        /**
+         * Handles deleted email entries from msv. Updates the count
+         * on appropriate mailbox.
+         * @param aEntry EMail msv entry id.
+         */
+        void HandleDeletedEMailMsvEntryL( const TMsvId& aEntryId );
+        
+    private:    // From MNcnTimer
+    
+        void NcnTimerCompleted();
+
+    private:    // From MNcnMsvSessionHandlerObserver
+    
+        void HandleMsvSessionReadyL( CMsvSession& aMsvSession );
+        void HandleMsvSessionClosedL();
+        void HandleMsvEntryCreatedL( const TMsvId& aMsvId );
+        void HandleMsvEntryDeletedL( const TMsvId& aMsvId );
+        void HandleMsvMediaChangedL( const TDriveNumber& aDriveNumber );    
+        void HandleMsvMediaAvailableL( const TDriveNumber& aDriveNumber );
+        void HandleMsvMediaUnavailableL();
+      
+    private:    // From MNcnNoficationObserver
+    
+        void HandleNewInternalMessagesL(
+                        const TNcnNotifMessageType aType );
+
+        void HandleNewInternalMessagesL(
+                        const TNcnNotifMessageType aType,
+                        const TMsvId& aMailBox,
+                        const MDesCArray& aInfo );
+                        
+        void HandleInternalMarkUnreadL(
+                        const TNcnUnreadRequestType aRequest );
+
+        void HandleInternalMarkUnreadL(
+                        const TNcnUnreadRequestType aRequest,
+                        const TMsvId& aMailbox );
+
+        void HandleNewMessagesL(
+                        const TMsvId& aMailBox,
+                        const MNcnNotification::TIndicationType aIndicationType,
+                        const MDesCArray& aInfo );
+
+        void HandleMarkUnreadL( const TMsvId& aMailBox );                        
+                        
+    private:    // New functions
+                
+        /**
+         * Returns ETrue if entry is an email entry.
+         */
+        TBool IsEMailEntry( const TMsvEntry& aEntry );
+        
+        /**
+         * Internal helper class for new mail count book-keeping.
+         * Used to allow storing of mailbox status in an array.
+         */
+        class TNcnMailBoxStatus
+            { 
+            public :
+            
+                TNcnMailBoxStatus( TMsvId aMailBox );
+                
+                static TInt Compare( const TNcnMailBoxStatus& aFirst, 
+                                     const TNcnMailBoxStatus& aSecond );
+                                     
+                static TBool Match( const TNcnMailBoxStatus& aFirst, 
+                                    const TNcnMailBoxStatus& Second );
+                                    
+            public:
+            
+                /**
+                 * MsvId of the mailbox.
+                 */
+                TMsvId iMailBox;                
+
+                /**
+                 * MTM of the mailbox. Eg. Pop3, Imap etc.
+                 */
+                TUid iMTMType;    
+ 
+                 /**
+                 * Technology type of the mailbox.
+                 */
+                TUid iMailBoxTechnologyType;  
+                                               
+                /**
+                 * Amount of new emails at the time of the last NewMessages call
+                 * on mailbox.
+                 */
+                TInt iPublishedNewEmailCount;
+                
+                /**
+                 * Highest email msv id so far in mailbox.
+                 */
+                TMsvId iHighestEMailMsvId;
+
+                /**
+                 * Highest IMAP uid id so far in mailbox.
+                 */
+                TUint32 iHighestIMAPId;
+                
+                 /**
+                 * Time when the latest message has arrived to this inbox
+                 */
+                TTime iLatestMessageArrival;
+                                                               
+                /**
+                 * Highest MsvId at the time of the last MarkUnread call
+                 * on mailbox.
+                 */
+                TMsvId iUnreadCheckpointMsvId;
+                                
+                /**
+                 * Highest MsvId at the time of the last NewMessages call
+                 * on mailbox.
+                 */
+                TMsvId iPublishedCheckpointMsvId;
+                
+                 /**
+                 * Highest IMAP uid at the time of the last NewMessages call
+                 * on mailbox. This is IMAP specific variable. The IMAP
+                 * messages come to the terminal in ID order.
+                 * In boot-up this is set to highest IMAP id in the box
+                 */
+                TUint32 iPublishedCheckpointIMAPId;
+
+                /**
+                 * Timestamp at the time of the last NewMessages call
+                 * on mailbox. This is used for non IMAP messages (POP, SyncMl etc.)
+                 * In boot-up this is set to latest time stamp in the box
+                 */
+                TTime iPublishedCheckpointTimeStamp;      
+                         
+                /**
+                 * Array containing the id's of messages considered new
+                 * in the box.
+                 */
+                RArray<TMsvId> iNewMessageIds;
+                
+                /**
+	             * Refresh request status
+	             */
+	            TBool iRefreshRequested;
+	                            
+                /**
+                 * Notification status.
+                 */
+                TBool iNotified;
+                
+                /**
+                 * Mail boxes can use specific notification parameters
+                 * If TRUE notification by icon is required. Default TRUE
+                 */
+		    	TBool iIcon;
+
+                /**
+                 * Mail boxes can use specific notification parameters
+                 * If TRUE notification by tone is required. Default TRUE
+                 */
+		    	TBool iTone;
+		    	
+                /**
+                 * Mail boxes can use specific notification parameters
+                 * If TRUE notification by note is required. Default TRUE
+                 */
+		    	TBool iNote;
+		    	
+		    	/** Mail box will request for show icon if iShowIcon is true.
+		    	 *  Default value will be True
+		    	 *  This flag will be set to true if new mail is received.
+		    	 *  This flag will be set to flase, if mce sends mailbox oened
+		    	 *  event.
+		    	 *  If  iShowIcon is true
+		    	 *  than  mailbox will request for icon notification
+		    	 *  and iShowIcon is False
+		    	 *  Than  mailbox will not request for icon notification, 
+		    	 *  because mailbox is opened by user in MCE. Mce inform
+		    	 *  opening of mailbox event to respective mailbox in ncn list.
+		    	 */
+		    	TBool iShowIcon;
+            };
+    
+        /**
+         * Loads all registered mail boxes to status array.
+         * @param aMsvSession Current msv session.
+         */
+        void LoadMailboxesL( CMsvSession& aMsvSession );
+        
+        /**
+         * Returns ETrue if technology type is a mail technology type.
+         * @return ETrue if technology type is a mail technology type.
+         */
+        TBool IsMailTechnologyType( const TUid& aTechnologyType );
+        
+        /**
+         * Adds mailboxes of given mtm type to iMailBoxStatusArray.
+         * @param aMtmType MTM of the mailbox.
+         * @param aTechnologyType Technology type of the mailbox.
+         * @param aMsvSession Current msv session.
+         */
+        void AddBoxesToStatusArrayL( const TUid& aMtmType, const TUid& aTechnologyType, CMsvSession& aMsvSession );
+        
+        /**
+         * Adds a mail box to status array.
+         * @param aMsvId MsvId of the mail box.
+         * @param aMtmType MTM of the mailbox.
+         * @param aTechnologyType Technology type of the mail box.
+         */
+        void AddMailBoxL( const TMsvId& aMsvId, const TUid& aMtmType, const TUid& aTechnologyType );
+        
+        /**
+         * Removes a mail box to status array.
+         * @param aMsvId MsvId of the mail box.
+         * @param aMtm Mtm of the mail box.
+         */
+        void RemoveMailBox( const TMsvId& aMsvId );
+        
+        /**
+         * Updates the amount of total new emails based on iMailBoxStatusArray.
+         * Note: This method does not query message server.
+         */
+        void UpdateTotalNewEmails();                            
+        
+        /**
+         * Updates the notification to reflect the current state of
+         * new email count. Update is not done if change has not happened
+         * @param aForceUpdate Forces the update of the notification
+  		 * @param aIcon Notifies with icon
+		 * @param aTone Notifies with tone
+		 * @param aNote Notifies with note
+         */
+        void UpdateNotification( 	TBool aForceUpdate = EFalse,
+							        TBool aIcon = ETrue,
+							        TBool aTone = ETrue,
+							        TBool aNote = ETrue);
+        
+        /**
+         * Returns the Mailbox with specified id. Leaves with KErrNotFound if no
+         * such mailbox is found (in local structure).
+         * @param aId Mailbox id.
+         */
+        TNcnMailBoxStatus& MailBoxStatusL( const TMsvId& aId );
+        
+        /**
+         * Checks the mailbox's "new email indicator" setting.
+         * Setting is only available in IMAP/POP/SyncMl boxes
+         * and not in 3rd party boxes.
+         * @param aMailboxStatus the queried mail box
+         * @Leave KErrNotSupported if the mail box does not support this setting
+         * @return ETrue if "new email indicator" setting is on
+         */
+        TBool NewEmailIndicatorsSetL( const TNcnMailBoxStatus& aMailboxStatus );        
+        
+        /**
+         * Returns message server entry with specified service id.
+         *
+         * Method leaves with KErrNotSupported if supplied id does not
+         * point to a service entry.
+         *
+         * @param aServiceId Service id.
+         * @return Message server entry.
+         */
+        CMsvEntry* ServiceEntryL( const TMsvId& aServiceId );
+        
+        /**
+         * Returns message server entry with specified service id and
+         * puts it into the cleanup stack.
+         *
+         * Method leaves with KErrNotSupported if supplied id does not
+         * point to a service entry.
+         *
+         * @param aServiceId Service id.
+         * @return Message server entry.
+         */
+        CMsvEntry* ServiceEntryLC( const TMsvId& aServiceId );
+        
+        /**
+         * Marks the mailbox unread. This resets the amount of new
+         * emails, both released and actual.
+         * @param aId Id of the mailbox.
+         */
+        void MarkUnreadL( const TMsvId& aId );
+        
+        /**
+         * Marks all mailboxes unread.
+         */
+        void MarkAllUnread( );
+        
+        /**
+         * Publishes mailboxes new email amount. All new emails that
+         * have not been published are added to the amount of
+         * new emails. Note that this method does not update the notification,
+         * use UpdateNotification.
+         * @param aId Id of the mailbox.
+         */
+        void PublishNewMessagesL( const TMsvId& aId );
+        
+        /**
+         * Publishes new email amounts in all mailboxes.
+         * Note that this method does not update the notification,
+         * use UpdateNotification.
+         */
+        void PublishAllNewMessages( );
+
+        /**
+         * Browse through the mailbox's messages and find highest
+         * MsvId, ImapId and latest time stamp that messages have.
+         * Defaults values to 0.
+		 * @param aId Id of the mailbox.
+	 	 * @param aHighestMsvId Highest message MsvId that box contains
+		 * @param aHighestImapId Highest message ImapId that box contains
+		 * @param aLatestTimeStamp Latest message time stamp that box contains
+         */
+        void FindHighest_MsvId_ImapId_LatestTime(	const TMsvId& aId,
+													TMsvId& aHighestMsvId,
+													TUint32& aHighestImapId,
+													TTime& aLatestTimeStamp );
+        
+        /**
+         * Browse through the mailbox's messages and find highest
+         * MsvId, ImapId and latest time stamp that messages have.
+         * Values should be 0 when the method is used.
+		 * @param aId Id of the mailbox.
+	 	 * @param aHighestMsvId Highest message MsvId that box contains
+		 * @param aHighestImapId Highest message ImapId that box contains
+		 * @param aLatestTimeStamp Latest message time stamp that box contains
+         */
+        void FindHighest_MsvId_ImapId_LatestTimeL(	const TMsvId& aId,
+													TMsvId& aHighestMsvId,
+													TUint32& aHighestImapId,
+													TTime& aLatestTimeStamp );
+          
+        /**
+         * Returns mail boxes MTM and Technolgy type
+         * @param aId Id of the entry.
+         * @param aMtmType The MTM type
+         * @param aTechnologyType The technolgy type
+         * @return System wide error code
+         */
+        TInt GetMailBoxesAttributesL( const TMsvId& aMsvId, TUid& aMtmType, TUid& aTechnologyType );
+        
+        /**
+         * Makes a check for this entry and determines if it requires notification.
+         * Phone keeps a certain amount of messages in the terminal and when one of
+         * those messages is deleted it retrieves another one from the mail box.
+         * Sometimes it retrieves a message that has already been notified so it
+         * requires no notification. In this method we try to identify those messages.
+         * In IMAP boxes the messages have a special id, this is in increasing order.
+         * We know the highest id at the time of notification and do not notify of messages
+         * that have lower id. In POP, SyncMl etc. boxes we do this same comparison using
+         * time stamps. We only notify messages that have newer timestamp than last notification.
+         * Timestamp comparison must be done using UTC time because of the time zones.
+         * @param aMailbox The mailbox that contains this message
+         * @param aEntry The entry it self.
+         * @return True if notification is required
+         */        
+        TBool IsNotificationNeededForThisMessageL( const TNcnMailBoxStatus& aMailbox, const TMsvEntry& aEntry );
+
+        /**
+         * Takes the mailbox and determines the used notifications for it.
+         * 3rs party mailboxes give the notifications in the API, but IMAP
+         * POP and SynvMl do not. For S60 mailbox's ncnlist will read
+         * "new mail indicator" setting and determines the used notification
+         * based on the settings value.
+         * @param aMailbox updated mailbox status entity
+         * @leave KErrNotSupported given mail box is not IMAP/POP/SyncMl
+         * @leave System wide error code
+         */
+        void UpdateS60MailBoxNotificationAttributesL( TNcnMailBoxStatus& aMailbox );
+        
+        /**
+         * A small helper method. Takes the desired indicators as TIndicationType
+         * and converts it to separate booleans for tone, note and icon
+         * Method updates the values to the mailbox
+         * @param aMailbox updated mailbox status entity
+         * @param aIndicationType The desired indication type
+         */
+        void UpdateMailBoxesNotifications( TNcnMailBoxStatus& aMailbox, const TInt& aIndicationType );
+             
+    private:    // Constructors and destructor
+
+        /**
+         * C++ default constructor.
+         */
+        CNcnNotifApiObserver( CNcnModelBase& aModel );
+
+        /**
+         * By default Symbian OS constructor is private.
+         */
+        void ConstructL();
+        
+        /**
+         * 	Returns ETrue, if aEntry is in SyncML boxes Sent folder
+         */
+        TBool IsSyncMLEntryInSentFolderL( const TMsvEntry& aEntry  );
+
+    private:    // Data
+    
+        // Array containing mailbox 1ids and number of new mails in each of them.
+        RArray<TNcnMailBoxStatus> iMailBoxStatusArray;
+        
+        // Sum of all mailboxes' new mail counts
+        TInt iTotalNewMailCount;
+        
+        // Last notified new mail count
+        TInt iNotifiedNewMailCount;                        
+        
+        // Not own, pointer to the event monitor object.
+        CNcnModelBase& iModel;
+        
+        // Timer instance. Owned.
+        CNcnTimer* iTimer;        
+        
+        //Reference to msv session. Not owned
+        CMsvSession* iMsvSession;
+    };
+
+#endif      // CNCNNOTIFAPIOBSERVER_H
+
+// End of File