wvuing/wvuistorage/src/CCAStorageManager.h
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wvuing/wvuistorage/src/CCAStorageManager.h	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,720 @@
+/*
+* Copyright (c) 2002-2005 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:  Storage manager header file
+*
+*/
+
+
+#ifndef CCASTORAGEMANAGER_H
+#define CCASTORAGEMANAGER_H
+
+#include "impsbuilddefinitions.h"
+
+//  INCLUDES
+#include <e32std.h>
+#include <f32file.h>
+#include <babackup.h>
+
+#include "MCAStoredContacts.h"
+#include "TCAStoragePanics.h"
+#include "TStorageManagerGlobals.h"
+#include "MCAStoredGroups.h"
+#include "MCAStoredContactsObserver.h"
+#include "MCAStoredGroupsObserver.h"
+#include "MCARefreshTimerObserver.h"
+#include "MCAStorageInfo.h"
+
+// FORWARD DECLARATIONS
+class CBaBackupSessionWrapper;
+class CCAContactList;
+class MCAStoredContactsObserver;
+class CCAStorage;
+class CCAGroup;
+class CCARefreshTimer;
+class CCAContactSorter;
+
+
+// CLASS DECLARATION
+/**
+ * Storage Manager.
+ *
+ * Note! The following methods do not allow themselves to be called if backup
+ * is in progress (use MBackupOperationObserver or CBaBackupSessionWrapper).
+ * In such a case, the methods either leave or return without doing anything.
+ *
+ * - AddContactL (both variants)
+ * - RemoveContactL
+ * - PopulateContactsList
+ * - CreateGroupL
+ * - DeleteGroupL
+ * - PopulateGroupsList
+ *
+ * After the backup has finished, an HandleListInvalidation event is sent to
+ * observers.
+ *
+ * @lib CAStorage.dll
+ * @since 3.0
+ */
+class CCAStorageManager : public CBase,
+            public MCAStoredContacts,
+            public MCAStoredGroups,
+            public MCAStoredContactsObserver,
+            public MCAStoredGroupsObserver,
+            public MCARefreshTimerObserver,
+            public MCAStorageInfo
+    {
+    public:  // Constructors and destructor
+
+        /**
+         * Two-phased constructor.
+         */
+        IMPORT_C static CCAStorageManager* NewL();
+
+        /**
+         * Destructor.
+         */
+        ~CCAStorageManager();
+
+    public: // New functions
+        /**
+         * Creates instance of storage
+         * @return CCAStorageManager pointer
+         */
+        static CCAStorageManager* InstanceL();
+
+        /**
+         * Release instance of storage
+         * @return KErrNone if released.
+         */
+        static TInt ReleaseL();
+
+    public: // Functions from base classes
+
+        /**
+         * From MCAStoredContacts
+         */
+        void AddObserverL( MCAStoredContactsObserver* aObserver );
+
+        /**
+         * From MCAStoredContacts
+         */
+        void RemoveObserver( MCAStoredContactsObserver* aObserver );
+
+        /**
+         * From MCAStoredContacts
+         */
+        MCAContactList* AddContactListIdL( const TDesC& aContactListId,
+                                           const TDesC& aDisplayName,
+                                           TBool aNotify = ETrue );
+
+        /**
+         * From MCAStoredContacts
+         */
+        void RemoveContactList( const TDesC& aContactListId );
+
+        /**
+         * From MCAStoredContacts
+         */
+        void SetContactListCollapsed( const TDesC& aContactListId,
+                                      TBool aCollapsed );
+
+        /**
+         * From MCAStoredContacts
+         */
+        void RemoveContact( const TDesC& aListId, const TDesC& aContactId );
+
+        /**
+         * From MCAStoredContacts
+         */
+        MCAStoredContact* FindContact( const TDesC& aContactListId,
+                                       const TDesC& aId );
+
+        MCAStoredContact* FindContact( const TDesC& aContactListId,
+                                       const TDesC& aId,
+                                       MCAContactList*& aContactList );
+        /**
+         * From MCAStoredContacts
+         */
+        MCAStoredContact* FindAnyContact( const TDesC& aContactId );
+
+        /**
+         * From MCAStoredContacts
+         */
+        MCAStoredContact* FindAnyContactByNick( const TDesC& aNick );
+
+        /**
+         * From MCAStoredContacts
+         */
+        TInt FindContact( const MCAStoredContact& aContact ) const;
+
+        /**
+         * From MCAStoredContacts
+         */
+        TBool ContactInAllLists( const TDesC& aContactId ) const;
+
+        /**
+         * From MCAStoredContacts
+         */
+        TInt ListCount() const;
+
+        /**
+         * From MCAStoredContacts
+         */
+        MCAContactList& ListAt( TInt aIndex ) const;
+
+        /**
+         * From MCAStoredContacts
+         */
+        void FindContacts( RPointerArray< MCAStoredContact >& aArray,
+                           const TDesC& aContactId ) const;
+
+        /**
+         * From MCAStoredContacts
+         */
+        TInt ContactCount( TBool aSkipOfflineContacts = EFalse ) const;
+
+        /**
+         * From MCAStoredContacts
+         */
+        void SetWVHiding( TBool aHiding );
+
+        /**
+         * From MCAStoredContacts
+         */
+        TBool WVHiding();
+        /**
+         * From MCAStoredContacts
+         */
+        void SetWVHidingPrefixOnly( TBool aHidingPrefixOnly ); //  UI CR ID :101-39728: Show domain part of the user ID
+
+
+        /**
+         * From MCAStoredContacts
+         */
+        TBool WVHidingPrefixOnly();   // UI CR ID: 101-39728: Show domain part of the user ID
+
+        /**
+        * From MCAStoredContacts
+        */
+        void SetCapitalizingEnabled( TBool aCapital );  // UI CR ID: 101-39727
+
+        /**
+         * From MCAStoredContacts
+         */
+        TBool CapitalizingEnabled();  // UI CR ID: 101-39727
+
+        /**
+         * From MCAStoredContacts
+         */
+        void SetWatched( const TDesC& aContactId, TBool aStatus );
+
+        /**
+         * From MCAStoredContacts
+         */
+        void SetPendingMessages( const TDesC& aContactId, TInt aAmount );
+
+        /**
+         * From MCAStoredContacts
+         */
+        void SetBlocked( const TDesC& aContactId, TBool aStatus );
+
+        /**
+         * From MCAStoredContacts
+         */
+        void SetBlocked( const TDesC& aContactId,
+                         const TDesC& aListId,
+                         TBool aStatus );
+
+        /**
+         * From MCAStoredContacts
+         */
+        void Sort( const TDesC& aContactListId = KNullDesC );
+
+        /**
+         * Resort one contact, what ever contact list it is in
+         */
+        void ResortContactInAll( MCAStoredContact* aContact );
+
+        /**
+         * From MCAStoredContacts
+         */
+        void SetSortAlgorithm( MCAStoredContact::TSortAlgorithm aAlgorithm );
+
+        /**
+         * From MCAStoredContacts
+         */
+        TStorageManagerGlobals::TPresenceStatus OnlineStatus(
+            const TDesC& aContactId );
+
+        /**
+         * From MCAStoredContacts
+         */
+        MCAStoredContact* UpdatePresenceL(   const TDesC& aContactId,
+                                             TStorageManagerGlobals::TPresenceStatus aStatus,
+                                             TStorageManagerGlobals::TClientType aType,
+                                             const TDesC& aAlias,
+                                             const TDesC& aStatusText,
+                                             TStorageManagerGlobals::TPresenceStatus& aOldOnlineStatus );
+        /**
+         * From MCAStoredContacts
+         */
+        const TPtrC Identification( const TDesC& aContactId );
+
+        /**
+         * From MCAStoredContacts
+         */
+        MCAStoredContact& OwnStatus();
+
+        /**
+         * From MCAStoredContacts
+         */
+        void SetContactListLock( TBool aLocked );
+
+        /**
+         * From MCAStoredContacts
+         */
+        void ResetContactLists();
+
+        /**
+         * From MCAStoredContacts
+         */
+        void SetContactListProperty( TContactListProperty aProperty );
+
+        /**
+         * From MCAStoredContacts
+         */
+        TInt InitSynchroniseProcess();
+
+        /**
+         * From MCAStoredContacts
+         */
+        TInt SetNextForSynchroniseProcess();
+
+        /**
+         * From MCAStoredContacts
+         */
+        MCAContactList& ListInSyncProcessL();
+
+        /**
+         * From MCAStoredContacts
+         */
+        TBool IsAllSynchronised( TBool &aIsFailed ) const;
+
+        /**
+         * From MCAStoredGroups
+         */
+        void AddObserverL( MCAStoredGroupsObserver* aObserver );
+
+        /**
+         * From MCAStoredGroups
+         */
+        void RemoveObserver( MCAStoredGroupsObserver* aObserver );
+
+        /**
+         * From MCAStoredGroups
+         */
+        MCAExtendedStoredGroup* CreateGroupL();
+
+        /**
+         * From MCAStoredGroups
+         */
+        void DeleteGroupL( MCAStoredGroup* aGroup );
+
+        /**
+         * From MCAStoredGroups
+         */
+        MCAStoredGroup* FindGroup( const TDesC& aId );
+
+        /**
+         * From MCAStoredGroups
+         */
+        void PopulateGroupsListL( RPointerArray<MCAStoredGroup>& aList,
+                                  TBool aReturnOnlyVisible );
+
+        /**
+         * From MCAStoredGroups
+         */
+        void SignalGroupChangedL( const TDesC& aGroupId );
+
+        /**
+         * From MCAStoredGroups
+         */
+        void SignalGroupAddedL( const TDesC& aGroupId );
+
+        /**
+         * From MCAStoredGroups
+         */
+        void SaveGroupL( const TDesC& aGroupId );
+
+        /**
+         * From MCAStoredGroups
+         */
+        virtual void HideAllGroups( TBool aAllGroups = EFalse );
+
+        /**
+         * From MCAStoredGroups
+         */
+        virtual void ShowAllGroups();
+
+        /**
+         *  Count of stored groups
+         *  @return Count of groups
+         */
+        virtual TInt GroupCount( TBool aOnlyVisible ) const;
+
+        /**
+         * From MCAStoredGroups
+         */
+        virtual void CheckFreespaceLevelL( MCAExtendedStoredGroup* aGroup );
+
+        /**
+         * From MCAStoredContacts
+         */
+        void SetNotifyOnSave( TBool aStatus );
+
+        /**
+         * MCAStoredContactsObserver
+         */
+        void HandleContactDelete( const TDesC& aContact );
+
+        /**
+         * MCAStoredContactsObserver
+         */
+        void HandleAddition( MCAContactList& aList, MCAStoredContact& aContact );
+
+        /**
+         * MCAStoredContactsObserver
+         */
+        void HandleChange( MCAContactList* aList, MCAStoredContact* aContact,
+                           TStorageManagerGlobals::TCAObserverEventType aEventType,
+                           TBool aUserIdChanged );
+
+        /**
+         * MCAStoredContactsObserver
+         * MCAStoredGroupsObserver
+         * This method is unused.
+         */
+        void HandleBackupRestoreEvent(
+            const TStorageManagerGlobals::TCAObserverEventType aEventType );
+
+        /**
+         * MCAStoredGroupsObserver
+         */
+        void HandleDelete( const TDesC& aId );
+
+        /**
+         * MCAStoredGroupsObserver
+         */
+        void HandleAddition( const TDesC& aId );
+
+        /**
+         * MCAStoredGroupsObserver
+         */
+        void HandleChange( const TDesC& aId );
+
+        /**
+         * MCAStoredContacts
+         */
+        MCAStoredContact* CreateContactL(
+            const TDesC& aContactList,
+            const TDesC& aNickname,
+            const TDesC& aWVID );
+
+        /**
+         * MCAStoredContacts
+         */
+        MCAStoredContact* CreateContactL(
+            MCAContactList& aContactList,
+            const TDesC& aNickname,
+            const TDesC& aWVID,
+            TStorageManagerGlobals::TPresenceStatus aStatus,
+            TStorageManagerGlobals::TClientType aType,
+            const TDesC& aAlias,
+            const TDesC& aStatusText );
+
+        /**
+         * MCAStoredContacts
+         */
+        void SendContactListUpdatedEvent( MCAContactList& aList );
+
+
+        /**
+         * From MCAStoredContacts
+         */
+        void RemoveAllContactsL();
+
+        /**
+         * From MCAStoredContacts
+         */
+        void SetShowNickname( TBool aShowNickname ) ;
+
+        /**
+         * Clears all selected-flags
+         */
+        void ClearSelected();
+
+        /**
+         * Gets all selected contacts
+         */
+        void GetSelectedL( RPointerArray<MCAStoredContact>& aSelected,
+                           TStorageManagerGlobals::TFilterType aFilter );
+
+        /**
+         * From MCARefreshTimerObserver
+         */
+        void HandleTimeWaited( const TInt aError );
+
+        /**
+         * From MCAStorageInfo
+         */
+        TBool ShowNickname();
+
+        /**
+         * From MCAStorageInfo
+         */
+        TBool CollapseLocked();
+
+        /**
+         * From MCAStoredContacts
+         */
+        TBool IsContactValid( const MCAStoredContact* aContact ) const;
+
+        /**
+         * From MCAStoredContacts
+         */
+        void SortContactLists();
+
+
+        /**
+        * From MCAStoredContacts
+        */
+        TBool IsGroupDeleted();
+
+        /**
+         * From MCAStoredContacts
+         */
+        void SetGroupDeleted( TBool aValue );
+
+    private:
+
+        /**
+         * C++ default constructor.
+         */
+        CCAStorageManager();
+
+        /**
+         * By default Symbian 2nd phase constructor is private.
+         */
+        void ConstructL();
+
+        // internal contact list managing helper routines
+
+        /**
+         * Find the index of the list element in our list of groups that
+         * has the given group id.
+         * @since 2.1
+         * @param aId The id to search
+         * @return The index in the list, or KErrNotFound
+         */
+        TInt FindGroupIndexByGroupId( const TDesC& aId );
+
+        /**
+         * Helper routine for handling observer events for contacts
+         * @param aType The type of observer event
+         * @param aContact Event occured for contact.
+         * @param aContactId, Id of contact
+         * @param aList Contact list where contact can be found
+         * @param aUserIdChanged, Is user id changed or not.
+         */
+        void SendObserverEvent(
+            TStorageManagerGlobals::TCAObserverEventType aType,
+            MCAStoredContact* aContact,
+            const TDesC& aContactId,
+            MCAContactList* aList = NULL,
+            TBool aUserIdChanged = EFalse );
+
+        /**
+         * Helper routine for handling observer events for groups
+         * @since 2.1
+         * @param aType The type of observer event
+         * @param aParameter The group id
+         */
+        void SendObserverEvent(
+            TStorageManagerGlobals::TCAObserverEventType aType,
+            const TDesC& aParameter );
+
+        /**
+         * Helper routine for backup and restore events
+         * @param aType The event type
+         * @param aParam The parameter
+         */
+        void SendBRObserverEvent(
+            TStorageManagerGlobals::TCAObserverEventType aType );
+
+        /**
+         * Synchronize groups with persistent storage. Called from Constructor.
+         * @since 2.1
+         */
+        void SynchronizeGroupsL();
+
+        /**
+         * Notify all the observers about the given event
+         * @param aType The type of observer event
+         * @param aContact The contact in question
+         * (or -1 == KCAStorageDontKnowPos to force search for given contact id
+         * in aParameter)
+         * @param aFromPEC, ETrue, if event is coming from PEC
+         * @since 2.1
+         */
+        void NotifyAllObservers( TStorageManagerGlobals::TCAObserverEventType aType,
+                                 MCAStoredContact* aContact,
+                                 const TDesC& aContactId,
+                                 MCAContactList *aList,
+                                 TBool aUserIdChanged );
+
+        /**
+         * Notify all the observer about the given event after small delay
+         * If new notify events come during delay, then notify is "shifted"
+         * with new delay time and notify event is change to "multiplechanges".
+         * @param aType The type of observer event
+         * @param aContact The contact in question
+         * (or -1 == KCAStorageDontKnowPos to force search for given contact id
+         * in aParameter)
+         * @param aFromPEC, ETrue, if event is coming from PEC
+         * @since 2.6
+         */
+        void NotifyAllObserversWithDelay(
+            TStorageManagerGlobals::TCAObserverEventType aType,
+            MCAStoredContact* aContact, const TDesC& aContactId,
+            MCAContactList* aList,
+            TBool aUserIdChanged );
+
+        /**
+         * Actual implementation for NotifyAllObserversWithDelay
+         * @see NotifyAllObserversWithDelay
+         */
+        void DoNotifyAllObserversWithDelayL(
+            TStorageManagerGlobals::TCAObserverEventType aType,
+            MCAStoredContact* aContact, const TDesC& aContactId,
+            MCAContactList* aList,
+            TBool aUserIdChanged );
+
+        // TLinearOrder
+        static TInt ContactListOrderByDisplayName(
+            const CCAContactList& aContactA,
+            const CCAContactList& aContactB );
+
+        static TBool ContactListFindByContactId(
+            const CCAContactList& aContactA,
+            const CCAContactList& aContactB );
+
+        /**
+         * Find contact list for internal use.
+         * @param aListId. List to find.
+         * @return Contact list if found. if not found return NULL
+         */
+        CCAContactList* FindContactListInternal( const TDesC& aListId );
+
+        /**
+         * Find contact list
+         * @param aListId. List to find.
+         * @return Contact list if found. If not found return NULL
+         */
+        MCAContactList* FindContactList( const TDesC& aListId );
+
+        TInt FindContactListById( const TDesC& aListId );
+
+        /**
+         * Populate contact array
+         * @param aArray. Array to be populated by contacts.
+         * @param aContactId. Id of contacts which are appended to array.
+         */
+        void PopulateContactArrayL( RPointerArray< MCAContactList >& aListArray,
+                                    RPointerArray< MCAStoredContact >& aContactArray,
+                                    const TDesC& aContactId );
+
+        /**
+         * Find next list for sync
+         * @param Offset for earlier item.
+         */
+        TInt FindNextForSynch( TInt aOffset );
+
+    private:    // Data
+
+        // observers list, used with MCAStoredContacts inherited methods
+        RPointerArray< MCAStoredContactsObserver > iContactObservers;
+        // owns the array, but not the observers
+
+        // observers list, used with MCAStoredGroups inherited methods
+        RPointerArray< MCAStoredGroupsObserver > iGroupObservers;
+        // owns the array, but not the observers
+
+        // list of contacts
+        RPointerArray< CCAContactList > iContactList;   // owns
+
+        // list of groups
+        RPointerArray< CCAGroup > iGroupList;   // owns
+
+        // the persistent storage
+        CCAStorage* iStorage;   // owns
+
+        // the backup server session
+        CBaBackupSessionWrapper* iBackupSession; // owns
+
+        // notify upon save or not
+        TBool iNotifyUponSave;
+
+        // hide "wv:" from contact identification (ETrue)
+        TBool iWVHiding;
+
+        // Timer used to wait before calling HandleChange to observers.
+        CCARefreshTimer* iRefreshTimer; // owns
+
+        // Helper variables for shifted change events.
+        TInt iRefreshStartCounter;
+        HBufC*  iLatestContactToRefresh; // WVID of latest contact
+        MCAContactList* iLatestContactList; // latest contactlist
+        TStorageManagerGlobals::TCAObserverEventType iRefreshEventType;
+        TBool iRefreshUserIdChanged;
+
+        /// Sorter for contacts. Owns
+        CCAContactSorter* iContactSorter;
+
+        /// Contact for own status
+        MCAStoredContact* iOwnStatus;
+
+        /// Operation error
+        TInt iOperationError;
+
+        /// Contact list lock status ETrue locked, EFalse unlocked.
+        TBool iContactListLock;
+
+        // To show nickname or not
+        TBool iShowNickname;
+
+        // Current contact list to be synchronised.
+        TInt iCurrentListSync;
+        // hide "wv:" from contact identification (ETrue) only wv: part
+        TBool iWVHidingPrefixOnly;
+        // capitalizig the listname
+        TBool iCapital;
+
+
+        TBool iGroupDeleted;
+
+    };
+
+#endif      // CCASTORAGEMANAGER_H
+
+// End of File