predictivesearch/adapters/contacts/inc/cpcscontactfetch.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 10:12:17 +0200
changeset 0 e686773b3f54
child 21 b3431bff8c19
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* Copyright (c) 2007 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:  Active object that reads all the contacts from the database
*
*/


#ifndef C_PCS_CONTACT_FETCH_H
#define C_PCS_CONTACT_FETCH_H

// SYSTEM INCLUDES
#include <f32file.h>
#include <badesca.h>
#include <e32std.h>
#include <e32cmn.h>
#include <MVPbkContactStoreListObserver.h>
#include <MVPbkContactFindFromStoresObserver.h>
#include <MVPbkSingleContactOperationObserver.h>
#include <MVPbkContactViewObserver.h>
#include <CVPbkContactLinkArray.h>

// USER INCLUDES 
#include "mdatastoreobserver.h"
#include "cpcscontactstore.h"
#include "PSContactsAdapterInternalCRKeys.h"

// FORWARD DECLARATIONS
class CPsData;
class CVPbkContactManager;
class CVPbkContactStoreUriArray;
class CVPbkContactLinkArray;
class MVPbkContactOperationBase;
class MVPbkContactLinkArray;
class MVPbkBaseContact;
class CVPbkFieldTypeRefsList;
class MVPbkContactViewObserver;


/**
 *  This class is the contact fetch class. 
 *  This class manages all the data stores defined. 
 *  @lib pscontactsadapter.lib
 */
class CPcsContactFetch: public CActive,
                        public MVPbkContactStoreListObserver

                          
{	
	public:

			/**
			* 1st phase constructor 
			* @return returns pointer to the constructed object of type CPcsContactFetch
			*/
			static CPcsContactFetch* NewL();

			/**
			* Destructor
			*/
			virtual ~CPcsContactFetch();
   
	public:
	
			// From base class MVPbkContactStoreListObserver

			/**
			* From MVPbkContactStoreListObserver  
			* Called when the opening process is complete, ie. all stores have been reported
			* either failed or successfully opened.
			*/
			void OpenComplete();  

			/**
			* From MVPbkContactStoreListObserver  
			* Called when a contact store is ready to use.
			* @param aContactStore - The store that became available.
			*/
			void StoreReady(MVPbkContactStore& aContactStore);

			/**
			* From MVPbkContactStoreListObserver  
			* Called when a contact store becomes unavailable.
			* Client may inspect the reason of the unavailability and decide whether or not
			* it will keep the store opened (ie. listen to the store events).
			* @param aContactStore - The store that became unavailable.
			* @param aReason - The reason why the store is unavailable.
			*                This is one of the system wide error codes.
			*/
			void StoreUnavailable(MVPbkContactStore& aContactStore, TInt aReason);

			/**
			* From MVPbkContactStoreListObserver  
			* Called when changes occur in the contact store i.e contact 
			* added/deleted, group added/deleted etc.
			* @see TVPbkContactStoreEvent
			* @param aContactStore - The store the event occurred in.
			* @param aStoreEvent - Event that has occured.
			*/
			void HandleStoreEventL(
			        MVPbkContactStore& aContactStore, 
			        TVPbkContactStoreEvent aStoreEvent);
	    
	public:
		 	/**
		    * Gets the supported data stores URIs
		    * @param aDataStoresURIs supported data stores URIs
		    */  
		    void GetSupportedDataStoresL( RPointerArray<TDesC> &aDataStoresURIs );
		    
		    /**
		    * Checks if the data store is supported by this adapter
		    * @param aDataStoreURI - The datastore to be checked
		    * @return ETrue if this store is supported
		    */
		    TBool IsDataStoresSupportedL( TDesC& aDataStoreURI );

			/**
			* Initiate data fetch from the contacts adapter
			* @param aDataStoreURI - The store from which data is requested
			*/
			void RequestForDataL(TDesC& aDataStoreURI);

			/**
			* Set the observer to receive the fetched results
			* @param aObserver - Observer to receive the contacts data
			*/
			void SetObserver(MDataStoreObserver& aObserver);
	
	public:
			/**
		    * Gets the supported data fields 
		    * @param aDataFields - supported data fields         
		    */ 
			void GetSupportedDataFieldsL(RArray<TInt> &aDataFields );
			
	protected: 

			// From base class CActive

			/**
			* From CActive
			* Implements cancellation of an outstanding request.
			* This function is called as part of the active object's Cancel().
			*/
			void DoCancel() ;

			/**
			* From CActive
			* Handles an active object's request completion event.
			*
			* The function is called by the active scheduler when a request
			* completion event occurs, i.e. after the active scheduler's
			* WaitForAnyRequest() function completes.
			*
			* Before calling this active object's RunL() function, the active scheduler 
			* has:
			* 	
			* 1. decided that this is the highest priority active object with
			*   a completed request
			*
			* 2. marked this active object's request as complete (i.e. the request is no 
			*   longer outstanding)
			*
			* RunL() runs under a trap harness in the active scheduler. If it leaves,
			* then the active scheduler calls RunError() to handle the leave.
			*
			* Note that once the active scheduler's Start() function has been called, 
			* all user code is run under one of the program's active object's RunL() or 
			* RunError() functions.
			*/
			void RunL();

				
			/**
			* From CActive 
			* If the RunL function leaves,
			* then the active scheduler calls RunError() to handle the leave.
			* @param aError - The error code
			*/
			TInt RunError( TInt aError );
		
	private:	
	
			/**
			* Constructor
			*/
			CPcsContactFetch();

			/** 
			* 2nd phase constructor
			*/
			void ConstructL();

			/**
			* Fetches the data from a particular contact 
			* @param aContact - The contact from database 
			* @param aPhoneData - The contact in CPsData format 
			*/
			void  GetDataForSingleContactL ( MVPbkBaseContact& aContact,CPsData* aPhoneData );


			/**
			* Creates the substore 
			* @param aDataStoreURI - The store for which substore is to be created
			*/
 			void CreateSubStoresL(TDesC& aDataStoreURI);
            
            
            /**
			* Reads the configured URIs from the central repository
			*/
            void ReadUrisFromCenrepL();
            
	private:
	
	        /**
			 * Holds the observer object to communicate add/modify/delete of contacts
			 * Not owned.
			 */
			MDataStoreObserver* iObserver;
	    
	    	/**
             * Owns an instance of active scheduler wait
             */
    	    CActiveSchedulerWait *iWait;
    	      
			/**
			 * Flags for store operations
			 */
			TBool   iAtLeastOneStoreReady; 
			TBool   iNoContactStoreAvailable;
			TBool   iRequestForData;
			TBool   iSubStoreCreated;

			/**
			 * The contact manager for accessing the phone contacts
			 * Own.  
			 */
			CVPbkContactManager*  iContactManager;		

			/**
             * Uris(data stores) read from the central repository
             */
    	    RPointerArray<HBufC> iUriFromCenrep;

			/**
             * Data stores instances
             */
    	    RPointerArray<CPcsContactStore> iAllDataStores;
   
};

#endif // C_PCS_CONTACT_FETCH_H