--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/PECengine/ListLibrary2/ContactListSrc/CPEngContactListModBase.h Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,599 @@
+/*
+* Copyright (c) 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: Contact list model implementation
+*
+*/
+
+#ifndef __CPENGCONTACTLISTMODBASE_H__
+#define __CPENGCONTACTLISTMODBASE_H__
+
+// INCLUDES
+#include "MPEngContactListAdvance.h"
+#include "CPEngStoreEntry.h"
+#include "MPEngContactListSettingsObserver.h"
+#include "MPEngContactListModStore.h"
+#include "TPEngContactListBaseSettings.h"
+#include <e32base.h>
+
+
+// FORWARD DECLARATIONS
+class CPEngContactListModItemContainer;
+class CPEngContactListModChangeMonitor;
+class CPEngContactListSettings;
+class MPEngContactListSettingsManager;
+
+
+// HELP CLASS DECLARATION
+
+/**
+ * Reference owning pointer array.
+ */
+template<class T>
+class RReffArray : public RPointerArray<T>
+ {
+ public:
+
+ /**
+ * Overwritten Close() behaviour.
+ * Closes access to items.
+ */
+ inline void Close()
+ {
+ TInt count( RPointerArray<T>::Count() );
+ for ( TInt x( 0 ) ; x < count ; ++x )
+ {
+ RPointerArray<T>::operator[]( x )->Close();
+ }
+ RPointerArray<T>::Reset();
+ }
+ };
+
+
+
+
+// CLASS DECLARATION
+/**
+ * Contact list model
+ * Main implementation of the Contact List model.
+ *
+ * @lib PEngListLib2
+ * @since 3.0
+ */
+NONSHARABLE_CLASS( CPEngContactListModBase ) :
+ public CPEngStoreEntry,
+ public MPEngContactListAdvance,
+ public MPEngContactListSettingsObserver,
+ public MPEngContactListModStore
+ {
+public: // Constructors, destructor
+ /**
+ * Two-phased constructor.
+ */
+ static CPEngContactListModBase* NewL(
+ CPEngContactListSettings& aListSetting,
+ MPEngStorageManager& aStorageManager,
+ MPEngContactListSettingsManager& aCntLstSettingsManager );
+
+ /**
+ * Two-phased constructor.
+ */
+ static CPEngContactListModBase* NewLC(
+ CPEngContactListSettings& aListSetting,
+ MPEngStorageManager& aStorageManager,
+ MPEngContactListSettingsManager& aCntLstSettingsManager );
+
+
+ /**
+ * Destructor
+ */
+ ~CPEngContactListModBase();
+
+
+
+protected: // Constructors
+
+ /**
+ * C++ constructor.
+ */
+ CPEngContactListModBase(
+ CPEngContactListSettings& aListSettings,
+ MPEngContactListSettingsManager& aCntLstSettingsManager );
+
+ /**
+ * Symbian constructor.
+ */
+ void ConstructL( MPEngStorageManager& aStorageManager );
+
+
+
+
+
+public: // From MPEngContactListAdvance
+
+ /**
+ * Gets Reference to the once item of the contact lists
+ * @see <MPEngContactListAdvance.h>
+ */
+ MPEngContactItemAdvance& ContactItemAdvance(
+ TInt aIndex,
+ TPEngContactListView aView = EPEngCntListLocalView );
+
+
+
+
+public: // From MPEngContactList2
+
+ /**
+ * Inserts a Contact into the Contact list.
+ * @see <MPEngContactList2>
+ */
+ TInt AddContactL( const TDesC& aContact,
+ const TDesC& aNickName = KNullDesC );
+
+ /**
+ * Removes Contact from the Contact list
+ * @see <MPEngContactList2>
+ */
+ void RemoveContactL( const TDesC& aContact );
+
+
+
+ /**
+ * Find Contact in the contact list
+ * @see <MPEngContactList2>
+ */
+ TInt FindContact( const TDesC& aContact,
+ TPEngContactListView aView = EPEngCntListLocalView ) const;
+
+
+
+ /**
+ * Count of the Contacts of the Contact list view
+ * @see <MPEngContactList2>
+ */
+ TInt Count( TPEngContactListView aView = EPEngCntListLocalView ) const;
+
+
+ /**
+ * Contact Item of the Contact list
+ * @see <MPEngContactList2>
+ */
+ MPEngContactItem& ContactItem(
+ TInt aIndex,
+ TPEngContactListView aView = EPEngCntListLocalView );
+
+ const MPEngContactItem& ContactItem(
+ TInt aIndex,
+ TPEngContactListView aView = EPEngCntListLocalView ) const;
+
+
+ /**
+ * Contacts which were removed from the contact list
+ * @see <MPEngContactList2>
+ */
+ const MDesCArray& RemovedContacts( ) const;
+
+
+ /**
+ * Contacts which were added to the contact list
+ * @see <MPEngContactList2>
+ */
+ const MDesCArray& AddedContacts( ) const;
+
+
+ /**
+ * Contact list Settings
+ * @see <MPEngContactList2>
+ */
+ MPEngContactListProperties& ListProperties();
+
+
+ /**
+ * Remove all contacts from the contact list
+ * @see <MPEngContactList2>
+ */
+ void RemoveAllContactsL( );
+
+
+ /**
+ * Suspend contact list update notifications
+ * @see <MPEngContactList2>
+ */
+ void SuspendUpdateNotification( );
+
+
+ /**
+ * Release sending of the contact list update notifications
+ * @see <MPEngContactList2>
+ */
+ void ReleaseUpdateNotification( );
+
+
+ /**
+ * Roll back all changes
+ * @see <MPEngContactList2>
+ */
+ TInt RollBackAllChangesL( );
+
+
+ /**
+ * Contact list locked by other client
+ * @see <MPEngContactList2>
+ */
+ TBool UpdateInProgress( ) const;
+
+
+ /**
+ * Update of the contact list required
+ * @see <MPEngContactList2>
+ */
+ TBool UpdateRequired() const;
+
+
+
+
+public: // Functions from CPEngStoreEntry
+
+ /**
+ * ExternalizeL provides way to externalize data from store entry.
+ * @see <MPEngStoreEntry.h>
+ */
+ void ExternalizeL( RWriteStream& aStream,
+ TPEngStorageType aStorageType ) const;
+
+ /**
+ * InternalizeL provides way to internalise data to store entry.
+ * @see <MPEngStoreEntry.h>
+ */
+ void InternalizeL( RReadStream& aStream,
+ TPEngStorageType aStorageType );
+
+ /**
+ * Store Id of the contact list
+ * @see <MPEngStoreEntry.h>
+ */
+ virtual const TDesC& StorageId() const;
+
+ /**
+ * Store size of the contact list
+ * @see <MPEngStoreEntry.h>
+ */
+ virtual TUint32 EntrySize() const;
+
+
+
+
+public: // CPEngStoreEntry / MPEngSIDChangeObserver
+
+ /**
+ * Handle change of the Storage IDs
+ * @see <MPEngSIDChangeObserver.h>
+ */
+ void HandleSIDsChangeL( CPtrCArray& aChangedSIDs );
+
+ /**
+ * Called when SIDs notifier fails
+ * @see <MPEngSIDChangeObserver.h>
+ */
+ void HandleSIDNotifyError( TInt aError );
+
+
+
+
+public: // MPEngContactListModStore
+
+ /**
+ * Gets reference to the store entry size
+ * Size can be modified through this reference
+ *
+ * @see <MPEngContactListModStore.h>
+ */
+ TInt& StoreSizeCount( );
+
+ /**
+ * Stores entry to the store
+ * @see <MPEngContactListModStore.h>
+ */
+ void StoreEntryL();
+
+
+
+public: // function of the MPEngContactListSettingsObserver
+
+ /**
+ * Refresh contact list settings reference
+ * @see <MPEngContactListSettingsObserver.h>
+ */
+ void RefreshSettingsReference( );
+
+
+
+
+public: // New functions used for ListLib private use
+
+
+ /**
+ * Maps contact list type to storage type.
+ *
+ * @since 3.0
+ */
+ static TPEngStorageType StoreTypeForListType( TPEngContactListType aListType );
+
+
+ /**
+ * Reference count support
+ *
+ * @since 3.0
+ */
+ void Open();
+
+
+ /**
+ * Reference count support
+ *
+ * @since 3.0
+ */
+ void Close();
+
+
+ /**
+ * Stores contact list content to the store
+ * @since 3.0
+ */
+ void StoreContactListL( );
+
+
+ /**
+ * Fill give array with contacts need to be updated.
+ *
+ * Depends on the function, either contacts which need to be updated
+ * are added. Or contacts which needs to be deleted are added.
+ *
+ * Ownership of appended contact items is not returned.
+ *
+ * @since 3.0
+ * @param array to be filled with contacts
+ */
+ void FillAddNickListL(
+ RPointerArray<CPEngContactListModItemContainer>& aAddNickList );
+ void FillRemoveNickListL(
+ RPointerArray<CPEngContactListModItemContainer>& aRemoveNickList );
+
+
+ /**
+ * Commit changes after successful update request
+ * Request can either update new or edited contacts
+ * "CommitAddContactsL" or removed contacts "CommitRemoveContactsL"
+ *
+ * @since 3.0
+ */
+ void CommitAddContactsL();
+ void CommitRemoveContactsL();
+
+
+ /**
+ * Roll back all changes
+ * Content of the local view is set same as network one
+ *
+ * @since 3.0
+ */
+ void RollbackL();
+
+
+ /**
+ * Look for contact among all contact views.
+ *
+ * @since 3.0
+ * @param aContact to loook for
+ * @return contact item if found, or NULL pointer
+ */
+ CPEngContactListModItemContainer* FindContactInAll( const TDesC& aContact );
+
+
+ /**
+ * Check if Contact is valid on the Network server
+ *
+ * @since 3.0
+ * @param aContact contact to check
+ * @return ETrue if contact exist on network server
+ */
+ TBool ContactExistsOnServer( CPEngContactListModItemContainer& aContact );
+
+
+ /**
+ * Adopt new set of contacts.
+ * Contacts are either adopted for both views ( Local, network)
+ * "AdoptNewContactsL"
+ * or only for network view "AddoptNetworkViewL" which leaves
+ * contact list in state needed for update
+ * Passed array owns reference to the member items.
+ * Once item is adopted it is removed from passed array
+ *
+ * @since 3.0
+ * @param aContacts list of contacts to be adopted
+ */
+ void AdoptNewContactsL(
+ RPointerArray<CPEngContactListModItemContainer>& aContacts );
+ void AdoptNetworkViewL(
+ RPointerArray<CPEngContactListModItemContainer>& aContacts );
+
+
+ /**
+ * Remove bad contact from the contact list
+ *
+ * @since 3.0
+ * @param aContact contact Id
+ */
+ void RemoveBadContactL( const TDesC& aContact );
+
+
+
+ /**
+ * Reset content of the contact list
+ *
+ * @since 3.0
+ */
+ virtual void Reset();
+
+
+ /**
+ * Reset Local/Network view List
+ *
+ * @since 3.0
+ */
+ void ResetLocalView();
+ void ResetNetworkView();
+
+
+ /**
+ * Leaves with KErrInUse if the contact list
+ * update is progress.
+ *
+ * @since 3.0
+ */
+ void LeaveIfListUpdateInProgressL() const;
+
+
+ /**
+ * Get ChangeMonitor reference.
+ *
+ * @since 3.0
+ * @return change monitor
+ */
+ CPEngContactListModChangeMonitor& ChangeMonitor();
+
+
+ /**
+ * Get Contact List Settings
+ *
+ * @since 3.0
+ * @return contact list settings
+ */
+ CPEngContactListSettings& Settings( );
+
+
+ /**
+ * Server Ordered Contacts
+ *
+ * @since 3.0
+ * @return List of server ordered contacts
+ */
+ const RPointerArray<CPEngContactListModItemContainer>& ServerOrderedContacts() const;
+
+
+ /**
+ * Find contact in the array
+ *
+ * @since 3.0
+ * @param aContact contact name
+ * @return index in the array, or KErrNotFound
+ */
+ TInt DoFindContact(
+ const RPointerArray<CPEngContactListModItemContainer>& aArray,
+ const TDesC& aContact,
+ TInt& aIndex,
+ TBool aFirstPrefered = EFalse ) const;
+
+ TInt DoFindContact(
+ const RPointerArray<CPEngContactListModItemContainer>& aArray,
+ const TDesC& aContact ) const;
+
+
+
+private: // Helpers
+
+
+ /**
+ * Externalize all contacts
+ *
+ * @since 3.0
+ * @param aStream stream to externalize to
+ * @param aType storage type of externalize
+ */
+ void ExternalizeContactsL( RWriteStream& aStream,
+ TPEngStorageType aStorageType ) const;
+
+ /**
+ * Internalize all contacts
+ *
+ * @since 3.0
+ * @param aStream stream to store internalize from
+ * @param aType storage type of internalize
+ */
+ void InternalizePermanentContactsL( RReadStream& aStream );
+
+
+ /**
+ * Internalize all contacts
+ *
+ * @since 3.0
+ * @param aStream stream to store internalize from
+ * @param aType storage type of internalize
+ */
+ void InternalizeCachedContactsL( RReadStream& aStream );
+
+
+ /**
+ * Restore server ordered array
+ */
+ void RestoreServerOrderedArray();
+
+
+ /**
+ * Reorganizes network view's server order indexes
+ */
+ void ReorganizeServerIndexOrder( TInt aIndex );
+
+
+
+private: // Data
+
+
+ /// OWN: Local view of the contacts
+ /// Elements OWNed
+ RReffArray<CPEngContactListModItemContainer> iLocalView;
+
+ /// OWN: Network view of the contacts
+ /// Elements OWNed
+ RReffArray<CPEngContactListModItemContainer> iNetworkView;
+
+
+ /// OWN: Contacts ordered in the order as network server sent it
+ /// Elements references, same content as iNetworkView
+ RPointerArray<CPEngContactListModItemContainer> iServerOrder;
+
+ /// OWN: Monitor of the changes
+ CPEngContactListModChangeMonitor* iChangesMonitor;
+
+
+ /// OWN: Access count of the model
+ TInt iAccessCount;
+
+ /// REF: Setting of the contact list
+ CPEngContactListSettings* iSettings;
+
+ /// REF: Contact List settings manager
+ MPEngContactListSettingsManager& iCntLstSettingsManager;
+
+ /// OWN: Storage Id of the contact list
+ HBufC* iStorageId;
+ };
+
+#endif // __CPENGCONTACTLISTMODBASE_H__
+
+
+// End of File
+
+
+