/*
* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "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:  Observer to Add a contact to the contact store
*
*/


#ifndef C_ADDCONTACTOBSERVER_H
#define C_ADDCONTACTOBSERVER_H


#include <s32file.h> 
#include <mvpbkcontactstoreobserver.h>    
#include <mvpbkcontactobserver.h>    
#include <MVPbkSingleContactOperationObserver.h>
#include <MVPbkStoreContact.h>

#include "singlecontact.h"
#include "cancelasyncrquest.h"

class CVPbkContactManager;
class MVPbkStoreContact;
class MVPbkContactLink;
class MContactCallback;
class MCancelAsync;


class CAddContactObserver : public CBase,
   							public MVPbkContactStoreObserver,
   							public MVPbkSingleContactOperationObserver,
           		   			public MVPbkContactObserver,
           		   			public MCancelAsync
{
	public:
			/*
			* called for creating an instace of add contact observer
			*/
    	static CAddContactObserver* NewL(CContactService* aContactService,
										 MVPbkContactStore* aContactStore, 
										 CSingleContact* aStoreContact,
										 const TDesC8& aGroupId,
										 const TDesC& aGroupLabel,
										 TInt aTransId,
										 MContactCallback* aCallback);
			/*
			* Destructor
			*/
    	~CAddContactObserver();
    	
    	/*
    	 * Implementation of Cancel of MCancelAsync
    	 */
		void Cancel();
	private:
 	   /*
		* Constructor		*/
	    CAddContactObserver(CContactService* aContactService,
	    					MVPbkContactStore* aContactStore, 
	    					CSingleContact* aStoreContact,	    				
	    					TInt aTransId,
	    					MContactCallback* aCallback);
	    
	   /*
		* Symbian second-phase construction
		*/
		void ConstructL(const TDesC8& aGroupId,
    				    const TDesC& aGroupLabel);
	   
	    /*
	    * Called for adding a contact into the contacts database.
	    */
	    void DoAddL();
	    
	    /*
	    * Called for committing a contact into the contacts database.
	    */
	    TInt DoCommitL(TContactOpResult aResult);
	    
	    void DoEditContactOrGroupL(MVPbkStoreContact* aContact);

	private: // from MVPbkContactObserver

	    /**
	     * An indication that a contact operation has been completed.
	     *
	     * @param aResult The result of the operation.
	     * @return None.
	     */
	    void ContactOperationCompleted( TContactOpResult aResult );

	    /**
	     * An indication that a contact operation has failed.
	     *
	     * @param aOpCode The operation identifier.
	     * @param aErrorCode The error code.
	     * @param aErrorNotified A flag indicating whether the user has been 
	     *                       notified about the error.
	     * @return None.
	     */
	    void ContactOperationFailed( TContactOp aOpCode, TInt aErrorCode,
	        TBool aErrorNotified );
	        
	        
	private: //MVPbkContactStoreObserver
		/**
         * Called when a contact store is ready to use.
         */
         void StoreReady( MVPbkContactStore& aContactStore );

        /**
         * 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 );

        /**
         * Called when changes occur in the contact store.
         * @see TVPbkContactStoreEvent
         * @param aContactStore The store the event occurred in.
         * @param aStoreEvent   Event that has occured.
         */
        virtual void HandleStoreEventL( MVPbkContactStore& aContactStore, 
                						TVPbkContactStoreEvent aStoreEvent );
	
	private: // from MVPbkSingleContactOperationObserver
	    /**
         * Called when operation is completed.
         *
         * @param aOperation the completed operation.
         * @param aContact  the contact returned by the operation.
         *                  Client must take the ownership immediately.
         *
         *                  !!! NOTICE !!!
         *                  If you use Cleanupstack for MVPbkStoreContact
         *                  Use MVPbkStoreContact::PushL or
         *                  CleanupDeletePushL from e32base.h.
         *                  (Do Not Use CleanupStack::PushL(TAny*) because
         *                  then the virtual destructor of the M-class
         *                  won't be called when the object is deleted).
         */	    
	    virtual void VPbkSingleContactOperationComplete(
                							MVPbkContactOperationBase& aOperation,
                							MVPbkStoreContact* aContact);
			/**
         * Called if the operation fails.
         *
         * @param aOperation    the failed operation.
         * @param aError        error code of the failure.
         */
        virtual void VPbkSingleContactOperationFailed(
                							MVPbkContactOperationBase& aOperation, 
                							TInt aError);
                							
	private:
	
	void CreateAndAddFieldToContactL();
	
	public:
		/*
		* Pointer to a contact manager
		*/
		CContactService* iContactService;		
		/*
		* Pointer to a contact store
		*/
		MVPbkContactStore* iContactStore;
		/*
		* Pointer to a store contact
		*/
		CSingleContact* iStoreContact;
		/*
		* Pointer to a callback
		*/
		MContactCallback* iCallback;
		/*
		* Pointer to group id.
		*/
		HBufC8* iGroupId;
		/*
		* Pointer to group label
		*/
		HBufC* iGroupLabel;
		/*
		* Flag to indicate whether contact is locked or not
		*/
		TBool iLockFlag;
		
		/*
	     * Transaction Id.
	     */
        TInt iTransId;
        
        TInt iErrorID;
        //TPtrC iErrKey;
        
        MVPbkStoreContact* iContact;
        MVPbkContactGroup* iGroup;

        
        //OperationBase pointer to be used to cancel async request
        MVPbkContactOperationBase* iOp;
};

#endif //C_ADDCONTACTOBSERVER_H