diff -r 000000000000 -r 72b543305e3a messagingappbase/ncnlist/inc/CNcnNotifApiObserver.h --- /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 +#include +#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 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 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