srsf/nssvascontacthdlr/src/nssvasccontacthandlerimpl.h
branchRCL_3
changeset 18 cad71a31b7fc
parent 17 8ce15fced3a6
child 19 e36f3802f733
--- a/srsf/nssvascontacthdlr/src/nssvasccontacthandlerimpl.h	Thu Aug 19 09:56:14 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,846 +0,0 @@
-/*
-* Copyright (c) 2004-2006 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:  VAS contact handler implementation
-*
-*/
-
-
-#ifndef NSSCONTACTHANDLERIMPL_H
-#define NSSCONTACTHANDLERIMPL_H
-
-//  INCLUDES
-#include <cenrepnotifyhandler.h>
-
-#include <vasmcontactobserver.h>
-
-#include <nssvasmgetcontextclient.h>
-#include <nssvasmgettagclient.h>
-#include <nssvasmtraintexteventhandler.h>
-#include <nssvasmdeletecontextclient.h>
-#include <nssvasmdeletetagclient.h>
-#include <nssvasmsavetagclient.h>
-#include <nssvasmsavecontextclient.h>
-#include "nssvasdatasyncwatcher.h"
-#include <nssvascoreconstant.h>
-#include "srsfbldvariant.hrh"
-
-// Publish & Subscribe of the contact handler activity
-#include <e32property.h>  
-
-#include <PbkFields.hrh>
-
-// CONSTANTS
-
-// Number of restart timer calls checked during periodic calls check
-const TInt KEventMomentsSize = 3;
-
-// MACROS
-// Deprecated
-#ifdef TEST_MANUAL_SYNC
-#define CNssContactHandler CManualContactHandler
-#endif // TEST_MANUAL_SYNC
-    
-// FORWARD DECLARATIONS
-class CNssTrainingParameters;
-class MVasBasePbkHandler;
-class CNssVASDBMgr;
-class MNssTagMgr;
-class MNssContextMgr;
-class CSuccessfulDeletionSimulator;
-class CRepository;
-class CNssChBackupObserver;
-
-// CLASS DECLARATION
-
-/**
-*  TNssContextClientData contains last last sync time and UI language
-*  which was used when training voice tags.
-*
-*  @lib NssVASContactHdlr.dll
-*  @since 2.8
-*/
-struct TNssContextClientData
-    {
-    TTime iLastSyncTime;
-    TLanguage iLanguage;
-    TContactSyncId iContactSyncId;
-
-    void InternalizeL(const TDesC8& aBuffer)
-        {
-        iLastSyncTime = 0;
-    	iLanguage = ELangOther;
-    	iContactSyncId = KErrNotFound;
-
-        if ( (TUint)aBuffer.Size() > sizeof( TNssContextClientData ) )        
-            {
-            User::Leave( KErrCorrupt );
-            }
-
-        Mem::Copy( this, aBuffer.Ptr(), sizeof( TNssContextClientData ) );
-        }
-
-    void ExternalizeL(TDes8& aBuffer)
-        {
-        if ( (TUint)aBuffer.MaxSize() < sizeof( TNssContextClientData ) )
-            {
-            User::Leave( KErrTooBig );
-            }
-
-        aBuffer.SetLength( 0 );
-        aBuffer.Copy( (TUint8*)this, sizeof( TNssContextClientData ) );
-        }
-    };
-    
-/**
-*  Contact handler creates voice tags out of phonebook contacts and keeps
-*  SIND data in sync with the phonebook
-*
-*  @lib NssVASContactHdlr.dll
-*  @since 2.8
-*/
-NONSHARABLE_CLASS( CNssContactHandlerImplementation ): public CBase,
-                                                       public MVasContactObserver,
-                                                       public MNssGetTagClient,
-                                                       public MNssDeleteTagClient,
-                                                       public MNssGetContextClient,
-                                                       public MNssSaveTagClient,
-                                                       public MNssSaveContextClient,
-                                                       public MNssTrainTextEventHandler,
-                                                       public MNssDeleteContextClient,
-                                                       public MNssDataSyncStateObserver,
-                                                       public MCenRepNotifyHandlerCallback
-    {
-   // DATA TYPES
-    enum TContactHandlerState
-		{
-		ECHIdle,
-    	ECHInitializing,
-    	// contact addition, removal or change
-    	ECHHandlingNormalChanges,
-    	ECHFullResync
-		};
-		
-		
-    struct TExtension
-        {
-        TPbkFieldId iId;
-        HBufC* iText;
-        TVasExtensionAction iAction;
-        TVasExtensionCommand iCommand;
-        };	
-        
-    struct TContactData
-    	{
-    	// Can be 1.Nickname, 2.firstname-lastname or vise versa, 3.Company name
-    	HBufC*                iTitle;
-    	TContactItemId        iID;
-    	TTime                 iSyncTime;
-    	TVasTagType           iType;
-    	};
-
-   public:  // Constructors and destructor
-
-      /**
-      * Two-phased constructor.
-      */
-      static CNssContactHandlerImplementation* NewL( );
-        
-      /**
-      * Destructor.
-      */
-      virtual ~CNssContactHandlerImplementation();
-   public: // New functions
-      
-      /**
-      * Disables the contact handler until EnableEventHandling is called
-      * Typically this means 'until reboot'
-      * Is used in case of unrecoverable error.
-      * 
-      * @todo Move to private?
-      * @return void
-      */
-      void DisableEventHandling();
-
-      /**
-      * Enables the contact handler. 
-      * 
-      * @deprecated Move to private?
-      * @return void
-      */
-      void EnableEventHandling();
-
-    public: // Functions from base classes
-    
-        /**
-        * Is called by phonebook handler when contact change has occurred
-        *
-        * @param aEvent Event to be handled
-        */
-        void HandleEventL( const TPhonebookEvent& aEvent );
-        
-        /**
-        * Is called by tag manager when getting of a tag list is completed 
-        * successfully
-        * From MNssGetTagClient Interface 
-        *
-        * @param aTagList list of tags returned
-        * @param aErrorCode KErrNone if getting of tags has been successfull
-        * @return void
-        */
-        void GetTagListCompleted( MNssTagListArray* aTagList, TInt aErrorCode );
-        
-        /**
-        * Called when the deletion of a tag requested from tag manager
-        * is completed successfully
-        * From MNssDeleteTagClient Interface 
-        * @param aErrorCode KErrNone if tag deletion has been successfull
-        * @return void
-        */
-        void DeleteTagCompleted( TInt aErrorCode );
-        
-        /**
-        * Called by tag manager, when GetContext() completes successfully
-        *
-        * Depending on the contact handler state, continues full resync sequence or
-		* sets the idle state
-        * @param aContext
-        * @param aErrorCode KErrNone if getting of context list was successfull
-        * @return void
-        */
-        void GetContextCompleted(MNssContext* aContext, TInt aErrorCode);
-        
-        /**
-        * Callback to indicate GetContext successed.
-        * @param aContextList - A list of contexts. 
-        *        user has to ResetAndDestroy() after using the list.
-        * @param aErrorCode KErrNone if getting of context list was successfull
-        * @return None
-        */
-        void GetContextListCompleted( MNssContextListArray *aContextList,
-                                      TInt aErrorCode );
-        
-        /**
-        * Is called when SaveContext() completes
-        * @param aErrorCode KErrNone if saving of context was successfull
-        */
-        void SaveContextCompleted( TInt aErrorCode );
-        
-        /**
-        * Callback to indicate taht SaveTag completed successfully
-        * @param aErrorCode KErrNone if saving of tag has was successfull
-        * @return None
-        */
-        void SaveTagCompleted( TInt aErrorCode );
-        
-        /** 
-        *  Is called when data sync status is changed and when data sync state
-        *  observation was just started
-        *  @param aRunning ETrue if from now on data sync process is running
-        *                  EFalse otherwise
-        *  @see MNssDataSyncStateObserver
-        */
-        void DataSyncStateChanged( TBool aRunning );
-        
-        /** 
-        *  Is called when backup/restore status is changed and when backup/restore
-        *  state observation was just started
-        *  @param aRunning ETrue if some backup/restore action is in progress
-        *                  EFalse otherwise
-        *  @param aRestoreType ETrue if the event is restore related
-        *                      EFalse if the event is backup related
-        *  @see CNssChBackupObserver
-        */
-        void BackupRestoreStateChanged( TBool aRestoreType, TBool aRunning );
-        
-        /** 
-        *  From MCenRepNotifyHandlerCallback
-        *  @see MCenRepNotifyHandlerCallback for more information
-        */
-        void HandleNotifyInt( TUint32 aId, TInt aNewValue );
-        
-    private:
-        
-      	/**
-      	* C++ default constructor.
-      	*/
-      	CNssContactHandlerImplementation( );
-
-        /**
-        * Second-phase constructor
-        */
-        void ConstructL();
-        
-        // Prohibit copy constructor
-        CNssContactHandlerImplementation( const CNssContactHandlerImplementation& );
-        
-        // Prohibit assigment operator
-        CNssContactHandlerImplementation& operator= ( const CNssContactHandlerImplementation& );
-        
-      	/** 
-      	* Register itself for phonebook database events
-      	*/  
-      	void RegisterForDatabaseEventsL(  );
-
-        /**
-        * Check if the event was caused by voice tag field adding
-        * @param aEvent event from contact db
-        * @return ETrue if voice tag field was added
-        */
-        TBool CausedByVoiceTagAddition( const TPhonebookEvent& aEvent );
-        
-        /**
-        * Get the current contact's title in a buffer
-        * @param aContactId Id of the contact to return title for
-        * @param aUseDefaultOrder If ETrue created title uses preferred 
-        * 		 lastname-firstname order of the current UI language. If 
-        *		 EFalse, uses reverse order
-        * @param aBothFirstAndLastFound Is set to ETrue if returned title 
-        *		 contains both first name and last name. To EFalse otherwise
-        * @param aTagType Set based on found tag type (name or company name)
-        * @return 'Title' of the contact, i.e. value that is pronounced when
-        *		 this contact tag is recognized by SIND
-        */
-        HBufC* GetContactTitleL( TContactItemId aContactId, TBool aUseDefaultOrder, 
-                                 TBool& aBothFirstAndLastFound, TVasTagType& aTagType );
-        
-        /** 
-        * Return the nickname for a given contact
-        *
-        * @exception KErrNotFound if nickname field is not present
-        * @param aContactId Phonebook id of the contact in question
-        * @return NULL if nickname is present, but empty. 
-        *		  Otherwise newly allocated descriptor to the nickname
-        */
-        HBufC* GetContactNicknameL( TContactItemId aContactId );
-        
-        /*
-         * Returns a flag which tells if name order should be changed.
-         * @return ETrue if preferred order of the current UI language is 
-         * lastname-firstname. EFalse otherwise
-         */
-        TBool SwapNameOrder();
-        
-        // Process the Contact Database Events
-        void DoHandleEventsL();
-        
-        /**
-         * Routine to handle failure during processing the event at the lower
-         * layers
-         */ 
-        void DoHandleEventFailedL();
-        
-        /**
-         * Single tag training completed successfully
-         */       
-        void HandleTrainComplete( TInt aErrorCode );
-        
-        /**************** The functions to handle miscellanious changes ***************/
-        
-        // Handling miscellaneous changes has 3 phases:
-        // 1. Fuse add & remove & change events into a list
-        //    of tags to be added and tags to be removed.
-        // 2. Remove tags to be removed.
-        // 3. Add tags to be added
-        
-        
-        /** 
-         * Fuse add & remove & change events into a list of tags to be added
-         * and tags to be removed.
-         */
-        void CollectAddRemoveListsL();
-        
-        
-        /**
-         * Starts adding names: Creates the tags and sends TrainTextL calls.
-         */
-        void DoAddNamesL();
-        
-        /** 
-         * Is called after all the tags scheduled for addition have been 
-         * trained successfully
-         */
-        void DoAddNamesTrainingFinished();
-        
-        /**
-         * Initiates saving tags after they have been trained.
-         * After saving tags started is recursively called for every next
-         * tag to be saved
-         */
-        void DoAddNamesSaveTag();
-        
-        /**
-         * Is called when single tag saving has been completed
-         * @param aError KErrNone if saving was successful, 
-         *				 KErrGeneral otherwise
-         */ 
-        void DoAddNamesSaveTagCompleted( TInt aError );
-        
-        /** 
-         * Cleanup addition-related buffers after new tags have been created, 
-         * trained and saved.
-         * Add voice tag icons to the phonebook
-         */
-        void DoAddNamesCompletedL();
-        
-        
-        /**
-         * Start removing names by requesting list of tags for the first 
-         * contact scheduled for deletion
-         */
-        void DoRemoveNamesL();
-        
-        /**
-         * Callback for handling list of tags, that should be deleted
-         * The first list is requested from DoRemoveNamesL, other - recursively
-         * from DoRemoveNamesAfterGetTagList
-         * @param aTagListArray List of tags to be deleted. Can be empty
-         */ 
-        void DoRemoveNamesAfterGetTagList( MNssTagListArray* aTagListArray );
-        
-        /** 
-         * Send single DeleteTag call to remove the first tag of those that 
-         * are in the to-be-deleted list from VAS
-         * Expects callbacks to DeleteTagCompleted or to DeleteTagFailed
-         */
-        void DoRemoveNamesCallDeleteTag();
-        
-        /**
-         * DeleteTag() callbacks call this funciton. It counts
-		 * the number of callbacks, and when all callbacks have arrived
-		 * goes to the next phase: RemovingNamesCompletedL or
-		 * DoHandleEventFailedL
-         */
-        void DoRemoveNamesAfterDeleteTagCompleted();
-        
-        /**
-         * Tag removal for a pack on names completed successfully. Clean the
-         * deletion tag buffers
-         */ 
-        void RemovingNamesCompletedL();
-        
-        /**
-         *  TLinearOrder comparison function for sorting phonebook events
-         */
-        static TInt PhonebookOrder( const TPhonebookEvent& a1, const TPhonebookEvent& a2 );
-        
-        /*************** The functions to handle miscellanious changes end ************/
-        /**
-        * Compares client data from VAS context to the state of the phonebook
-        * to find out if full synchronization is needed.
-        * Compares client data (saved in VAS context)
-		* to state of the phonebook to find out if
-		* full synchronization is needed.
-		*
-		* If full resync is needed initiates it by saving into the event queue
-		* special 'full resync event'
-        * @since 2.0
-        */       
-        void CheckErrorSigns();
-        
-        /**
-         * Handle errors which happend when updating normal changes
-         */ 
-        void NormalChangesHandleError();
-        
-        /**
-         * Start full resynchronisation
-         */
-        void FullResyncStart();
-        
-        /**
-         * Delete existing context if any, create a new one.
-         * Is a part of full resynchronization sequence
-         */
-        void FullResyncCreateContextL();
-        
-        /**
-         * Simulate phonebook addition events for all the phonebook contacts.
-         * Is a part of full resynchronization sequence
-         */
-        void FullResyncCreateChangesL();
-
-		/**
-		 * Checks if the event queue contains an event, which
-		 * launches full resynchronization
-		 * @return ETrue if full resync request is present in the queue
-		 *		   EFalse otherwise
-		 */
-        TBool IsFullResyncNeeded();
-        
-        /**
-         * Is called when conext deletion has completed successfully.
-         * Is a part of the full synchronization sequence
-         * @param aErrorCode KErrNone if deletion of context was successfull
-         */
-        void DeleteContextCompleted( TInt aErrorCode );
-        
-        /**
-         * Is called when conext deletion fails.
-         * Is a part of the full synchronization sequence
-         */
-        //void DeleteContextFailed( enum MNssDeleteContextClient::TNssDeleteContextClientFailCode  );
-        
-        /**
-         * Static callback required by Symbian Timer services.
-         * Real action happens in the DoPeriodicCallback 
-         * @param pX Pointer to the active instance of CNssContactHandlerImplementation
-         * @return KErrNone. Has no meaning in this case
-         * @see CNssContactHandlerImplementation::DoPeriodicCallback()
-         */
-        static TInt PeriodicCallback( TAny* pX );
-        
-        /**
-         * Timer callback used to check if periodic action completed,
-         * there are events to process and contact handler can do it now 
-         * (is idle). If this is true, initiates event processing
-         */
-        void DoPeriodicCallback();
-        
-        /**
-    	* Checks if it events look like they are periodically sent 
-    	* from some lengthy operation
-    	* @return ETrue if periodic behavior detected, EFalse otherwise
-    	*/
-    	TBool PeriodicAction();
-    	
-    	/**
-    	* Updates variables used for periodic action checks.
-    	* Adds current time to the array of phonebook event moments
-    	*/
-    	void UpdatePeriodicActionVars();
-    	
-    	
-    	/**
-    	* Returns maximal interval between time moments recorded in the  array.
-    	* Moments are stored in a cyclic way, i.e. moment 0 is stored at index 0,
-    	* moment1 at index 2,... moment n at index 0 again
-    	* @param aMoments Array of time moments
-    	* @param aMomensLength Length of the aMoments array. Must be > 1
-    	* @param aLastMomentIndex Index of the last recorded moment within aMoments
-    	* @return Maximal interval. If Maximal interval is too big to fit into
-    	*		  TTimeIntervalMicroSeconds32, TTimeIntervalMicroSeconds32(KMaxTInt)
-    	*		  is returned
-    	*/
-    	TTimeIntervalMicroSeconds32 MaximalInterval( const TTime aMoments[], const TInt aMomentsLength, const TInt aLastMomentIndex );
-    	
-    	/**
-    	* Set the contact handler state. It is the place, where state-related 
-    	* invariants are checked in debug builds. In debug builds panics if
-    	* intended change is illegal
-    	*/
-    	void SetState( TContactHandlerState aState );
-    	
-    	/**
-    	* Returns immediately if neither data sync nor backup is in progress
-    	* Otherwise waits indefinetely until data sync run is over
-    	*/
-    	void WaitUntilNoSyncBackupIsRunning();
-        
-        /**
-         * Sets the central repository full resync flag
-         * @leave CRepository error codes
-         */
-        void SetFullResyncCrFlagL( TBool aResyncNeeded );
-
-#ifdef __SIND_EXTENSIONS	    	
-    	/**
-    	* Read name dialling extension from resource file
-    	*/
-    	void ReadExtensionsL();
-    	
-    	/**
-    	* Finds extension field based on priority lists
-    	*
-    	* @param aAction Extension action
-    	* @return KErrNotFound if contact item field was not found
-    	*/
-    	TInt FindExtensionField( TVasExtensionAction aAction,
-    	                         TPbkFieldId aDefaultFieldId );
-    	                                          
-    	                                          
-        /**
-        * Loops through list of fields
-        *
-        * @param aArray Array field IDs
-        * @param aCount Number of elements in aArray
-        * @param aItem Contact item
-        *
-        * @return KErrNotFound if contact item field was not found
-        */    	                                          
-        TInt ExtensionFieldFindLoop( const TPbkFieldId* const aArray, 
-                                     TInt aCount );
-#endif // __SIND_EXTENSIONS	
-
-    	/**
-         * Reads a contact and returns a phonebook contact item. If contact is 
-         * already locked by something, function keeps trying for a long time.
-         * If still fails, contact handler is disabled and full resync will
-         * be attempted after the reboot
-         *
-         * @param aContactId Contact item id to be read.
-         */           
-        void ReadContactL( TContactItemId aContactId );
-            
-        /**
-         * Opens a contact. If contact is already locked by something,
-         * function keeps trying for a long time.
-         * If still fails, contact handler is disabled and full resync will
-         * be attempted after the reboot
-         *
-         * @param aContactId Contact item id to be opened.
-         */
-        void OpenContactL( TContactItemId aContactId );            
-        
-        /** 
-        * Reads contact from phonebook
-        * 
-        * If contact is already locked by something, function keeps trying for a long time.
-        * If still fails, contact handler is disabled and full resync will
-        * be attempted after the reboot
-        *
-        * @param aContactId Contact of interest
-        * @param aReadContact ETrue for ReadContactL and EFalse for OpenContactL
-        */
-        void GetContactL( TContactItemId aContactId, TBool aReadContact );
-        
-        /**
-         * Static callback required by Symbian Timer services.
-         * Real action happens in the DoContactWaitCallback 
-         * @param pX Pointer to the active instance of CNssContactHandlerImplementation
-         * @return KErrNone. Has no meaning in this case
-         * @see CNssContactHandlerImplementation::DoPeriodicCallback()
-         */
-        static TInt ContactWaitCallback( TAny* pX );
-        
-        /**
-         * Timer callback used to check if phonebook contact is unlocked
-         * Unlocks the waiter
-         */
-        void DoContactWaitCallback();
-        
-        /**
-        * Utility function to check if there isn't enough disk space to perform
-        * the operation.
-        *
-        * @return ETrue if there is not enough disk space, EFalse otherwise
-        */
-        TBool NoDiskSpace();
-        
-        /**
-        * Utility function to substitute all separator characters as white spaces.
-        *
-        * @param aBuf Descriptor which is manipulated
-        */
-        void TrimName( HBufC* aBuf );
-        
-        /**
-        * Utility function to append name to a buffer.
-        *
-        * @param aBuf Descriptor which is appended
-        * @param aName Name
-        */
-        void AppendName( HBufC* aBuf, HBufC* aName );
-
-        /**
-        * Utility function to append extension marker ("_2") to buffer.
-        *
-        * @param aDes Buffer where to do the modification
-        */        
-        void AppendExtensionMarker( TDes& aDes );
-
-		/**
-		* Establishes the connection to the contact engine and 
-		* starts listening to it
-		*/ 
-		void ConnectToPhonebookL();
-		
-		/** 
-		* Clears the connection to the contact engine
-		*/
-		void DisconnectFromPhonebook();
-    	
-   private:    // Data
-       // Phonebook engine
-       MVasBasePbkHandler* iPbkHandler;
-       CNssVASDBMgr* iVasDbManager;
-       MNssTagMgr* iTagManager;
-       MNssContextMgr* iContextManager;
-       TContactHandlerState iState;
-
-       // Id of the contact that is currently deleted
-       /** @todo Why is it not used for additions? Or why it is used at all? */
-       TContactItemId iContactId;
-
-       // Notifier object for the default contact database. 
-       // iContactChangeNotifier attaches contact handler to the phonebook
-       // engine as long as the object exists.
- //      CPbkContactChangeNotifier* iContactChangeNotifier;
-
-       // Tells if ocntact handler is active
-       TBool iHandlerEnabled;
-
-       // Context used for name dialing
-       MNssContext* iContext;
-
-       // List of raw database events. Also can store special 'full resync' event
-       RArray<TPhonebookEvent> iEventArray;
-
-       // Number of retrials to save tags
-       TInt iRetry;
-
-       // Delimeter between first an last name in the contact title
-       TChar iSeparator;
-       
-       // Array of relevant data from contacts to add
-       // Just id and title
-       RArray<TContactData> iContactQueue;
-
-       // Language specific settings
-       CNssTrainingParameters* iTrainingParams;
-       
-       // List of contacts to add to VAS
-       RArray<TPhonebookEvent> iAddList;
-
-       // List of contacts to remove tags for
-       RArray<TPhonebookEvent> iDelList;
-       
-       // List of contacts, for which voice tag icon has been added OR REMOVED
-       // Is used to ignore events related to the change of voice dial icon
-       RArray<TContactItemId> iVoiceTagAddedList;
-       
-       // List of contacts for which voice tag icon should be removed if present
-       // The need for it occurs if training voice tag fails and before training
-       // icon was present
-       RArray<TContactItemId> iRemoveIconList;
-       
-       // List of tags that are to be trained and saved
-       RPointerArray<MNssTag> iTagArray;
-       
-       // Counts the number of callbacks after TrainText() calls
-       TInt iTrainCallbackCounter;
-       
-       // Counts the number of callbacks after SaveTag() calls
-       TInt iSaveCallbackCounter;
-       
-       // Counts the number of callbacks after DeleteTag() calls
-       TInt iDeleteCallbackCounter;
-       
-       // General information about the context used for name dialing:
-       // language and last sync timestamp
-       TNssContextClientData iClientData;
-       
-       // Tells if full resync happened at least once
-       // I.e. if name dialing context exists
-       TBool iHaveWeEverSynced;
-       
-       // Indicates if error happened during normal event handling
-       // Can be only KErrNone of KErrGeneral
-       TInt iNormalChangesError;
-       
-       // List of tags to be deleted for one contact
-       // (main name + possible nickname )
-       MNssTagListArray* iDeleteTagListArray;
-       
-       // Languages which use lastname-firstname order in names
-       RArray<TLanguage> iSwappedLanguages;
-       
-       // Timer used to ensure, that events queue is checked at least every 30 secs
-       CPeriodic* iPeriodicHandleEventTimer;
-       
-       // Array of event receivement times
-       TTime iEventMoments[KEventMomentsSize];
-    
-       // Index of the last value in iRestartTimerCalls
-       TInt iEventMomentIndex;
-    
-       
-	   // Time interval used to detect END of periodic action. In microseconds
-	   // Note, that it is NOT the value used to command 
-	   // iPeriodicHandleEventTimer
-	   TTimeIntervalMicroSeconds iEndOfPeriodicActionInterval;
-	   
-	   // Counter for consecutive full resyncs forced by error during
-	   // handling normal changes (or also resync changes)
-	   // Is used to prevent endless resyncing in case of some unexpected
-	   // consistent lower level failure
-	   TInt iConsecutiveErrorFullResync;
-	   
-	   // Publish & Subscribe property, that tells external entities if contact
-	   // handler training is ongoing. Note, that it is different from
-	   // the contact handler state
-	   RProperty iBusyProperty;
-	   
-	   // Publish & Subscribe property that watches for the PC-Suite Sync activity
-	   RProperty iSyncProperty;
-
-	   // Temporary container for a tag that is created and used in the
-	   // DoAddNamesL. Member variable is used only because we cannot use
-	   // CleanupStack with MNssTag
-	   MNssTag* iNewTag;
-	   // Informs that VoIP feature is supported.
-	   TBool iVoIPFeatureSupported;
-	   
-	   // Informs that video telephony feature is supported
-	   TBool iVideoCallFeatureSupported;
-	   
-#ifdef __SIND_EXTENSIONS	   
-       // extensions
-	   RArray<TExtension> iExtensionList;
-#endif //__SIND_EXTENSIONS
-
-	   // ETrue if PC-suite data sync is in progress. I.e. contact hanlder should
-	   // delay its actions until iDataSyncRunning is EFalse
-	   TBool iDataSyncRunning;
-	   
-	   // Waits until iDataSyncRunning is EFalse
-	   CActiveSchedulerWait* iSyncBackupWaiter;
-	   
-	   // Waits until contact of interest is unlocked
-	   CActiveSchedulerWait* iContactWaiter;
-	   
-	   // Periodic timer that ticks ones per socond if we are waiting for the
-	   // contact unlock
-	   CPeriodic* iContactWaitTimer;
-	   
-	   // Watches for the data sync state changes
-	   MNssDataSyncWatcher* iDataSyncWatcher;
-	   
-	   // Watches the backup/restore state
-	   CNssChBackupObserver* iBackupObserver;
-	   
-	   // Watches central repository changes
-	   CCenRepNotifyHandler* iRepositoryObserver;
-	   
-	   // Is used to *asynchronously* simulate successful tag deletion
-	   CSuccessfulDeletionSimulator* iDeletionSimulator;
-	   
-	   // To simplify access for the pure utility class
-	   friend class CSuccessfulDeletionSimulator;
-	   
-	   // File server session to find out the available disk space
-	   RFs iFSession;
-	   
-	   // central repository for setting resync needed flag
-	   CRepository* iRepository;
-
-	   // flag for phonebook restore
-	   TBool iRestoreRunning;
-	   
-	   // Current resync flag state
-	   TBool iResyncAtBoot;
-    };
-
-#endif // CONTACTHANDLERIMPL_H
-            
-// End of File