/*
* Copyright (c) 2008 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: ximp context observer
*
*/


#ifndef CVIMPSTENGINESESSIONCNTXTOBSERVER_H_
#define CVIMPSTENGINESESSIONCNTXTOBSERVER_H_


// INCLUDES
#include <e32base.h>

#include "tvimpstenums.h"

#include <ximpcontextobserver.h>
#include <searchelement.h>

class MVIMPSTServiceListObserver;
class CVIMPSTEngineRequestMapper;
class MXIMPContext;
class MVIMPSTEngineSearchExtentionEventObserver;
class MPresenceGrantRequestListEvent;
class MSearchKeysEvent;
class MPresenceFeatures;
class MXIMPClient;
class MVIMPSTEngineSessionCntxtObserver;
class MPresenceAuthorization;
class MPresenceWatching;
class MPresentityGroups;
class MPresencePublishing;
class MPresenceObjectFactory;

// CLASS DESCRIPTION

/**
 * ximp context observer
 *  @lib vimpstengine.lib
 *  @since S60 5.0 
 */
NONSHARABLE_CLASS( CVIMPSTEngineSessionCntxtObserver ) : public CBase,
								  public MXIMPContextObserver
								  
								  
    {
    //for testcases.
    friend class T_VimpstEngineSessionCntxtObserver;
     friend class T_VimpstEnginePresenceSubService;

	public:
		
	    /**
	     * Two-phased constructor.
	     * @param aSettingsId: settings id.
         * @param aAdapterUid: Uid of the ximpfw adaptation.
		 * @return CVIMPSTEngineSessionCntxtObserver new instance of this class
	 	 */
		static CVIMPSTEngineSessionCntxtObserver* 
							CVIMPSTEngineSessionCntxtObserver::NewL(TUint32 aServiceId);
        /**
	     * Two-phased constructor.
	     * @param aSettingsId: settings id.
         * @param aAdapterUid: Uid of the ximpfw adaptation.
		 * @return CVIMPSTEngineSessionCntxtObserver new instance of this class
	 	 */							
	    static CVIMPSTEngineSessionCntxtObserver* 
	    					CVIMPSTEngineSessionCntxtObserver::NewLC(TUint32 aServiceId);
	    
	    
	   /**
	    * C++ default destructor.
		* ~CVIMPSTEngineSessionCntxtObserver
		*/
	    ~CVIMPSTEngineSessionCntxtObserver();
	    
	   /**
		* GetCompletedReqResult
		* @return TInt the result code 
		*/
	    TInt GetCompletedReqResult() const;
	    
	   /**
		* GetRequestMapper
		* @return CVIMPSTEngineRequestMapper pointer to RequestMapper 
		*/
	    CVIMPSTEngineRequestMapper* GetRequestMapper() const;   
       
	    /**
         * Presence bind
         * 
         * @since S60 5.0
         * @param aProtocolUid - uid of the ximpfw adaptation.
         * @return TInt, error if any.
         */         
         TInt ServerBindL(TUid aProtocolUid);

        /**
         * Presence unbind
         *
         * @since S60 5.0
         * @param aDoUnsubscribe, do unsubscribe before unbind.
         * Unsubscribe can not be done if unbind is triggered by
         * lost network.
         * @return TInt, error if any.
         */         
        TInt ServerUnBindL( TBool aDoUnsubscribe );  
        
        /**
         * Returns pointer to XIMP presence authorization interface.
         * This method must be used to get access.
         * If feature is not supported by current
         * presence adapter, leaves with KErrNotSupported.
         *
         * @since S60 3.2
         * @return MPresenceAuthorization reference
         */        
        MPresenceAuthorization& XimpAuthorizationL();

        /**
         * Returns pointer to XIMP presence watching interface.
         * This method must be used to get access.
         * If feature is not supported by current
         * presence adapter, leaves with KErrNotSupported.
         *
         * @since S60 3.2
         * @return MPresenceWatching reference
         */        
        MPresenceWatching& XimpPresenceWatchingL();

        /**
         * Returns pointer to XIMP presence presentity groups interface.
         * This method must be used to get access.
         * If feature is not supported by current
         * presence adapter, leaves with KErrNotSupported.
         *
         * @since S60 3.2
         * @return MPresentityGroups reference
         */        
        MPresentityGroups& XimpPresentityGroupsL();

        /**
         * Returns pointer to XIMP presence publishing interface.
         * This method must be used to get access.
         * If feature is not supported by current
         * presence adapter, leaves with KErrNotSupported.
         *
         * @since S60 3.2
         * @return MPresentityGroups reference
         */        
        MPresencePublishing& XimpPresencePublishingL();
        
        /**
         * Gets reference to object factory interface.
         *
         * Returned object factory interface is used
         * to instantiate presence objects.
         *
         * @return Object factory interface.
         *         No ownership is returned caller.
         */
        MPresenceObjectFactory& PresenceObjectFactoryL() const ;
        
        MPresenceFeatures& PresenceFeaturesL() const;

        /**
         * Gets reference to Presencecontext.
         *
         * Returned Presencecontext interface is used
         * to instantiate object factory.
         *
         * @since 5.0
         * @return Object factory interface.
         *  No ownership is returned caller.
         */
        MXIMPContext& XimpPresenceContextL();        
        
         /**
          * Register observer from getting notified of ximp events.
          *
          * @since 5.0
          * @param aObserver observer to be called when ximp events are received.
          * Unregister is done by session context when the presence context gets
		  *	unbinded. The Requester must register each time when XIMP Context gets Binded.
		  * Otherwise he will not get the event
          */
         void RegisterObserver(MVIMPSTEngineSessionCntxtObserver* aObserver);
         
         /**
          * get the supproted features form the ximp adaptation
          *
          * @since 5.0
          * @return MDesC8Array array of supported features.
          */
         TInt GetSupportedFeatures();
         
         
         /**
          * get the supproted features form the ximp adaptation
          *
          * @since 5.0
          * @return MDesC8Array array of supported features.
          */
         TVIMPSTEnums::TVIMPSTBindStatus ContextBindStatus();
      
	private:

		/**
         * Unregister observer from getting notified of ximp events.
         *
         * @since 5.0
         * @param aObserver observer to be called when ximp events are received.
         */
         void UnRegisterObserver(MVIMPSTEngineSessionCntxtObserver* aObserver);

	    /**
	     * HandleximpContextEvent method from context obsrver  
	     * ximp framework
	     * @param aContext
	     * @param aEvent, event  
	     */
	    
	    void HandlePresenceContextEvent( const MXIMPContext& aContext,
	                                     const MXIMPBase& aEvent );                                     
	    
	    /**
         * Handles presence callbacks
         *
         * @since S60 3.2
         * @param aContext, context
         * @param aEvent, event
         * @return void
         */ 
        void DoHandlePresenceContextEventL(
            const MXIMPContext& aContext,
            const MXIMPBase& aEvent );   
	               
       /**
        * Resolves and allocates presense uri from ximp operation.
        *
        * @since S60 5.0
        * @param aEvent, used to get the ximpidentity.
        * @return HBufC, presence uri from operation. Ownsership passed.
        */           
     	HBufC* UriFromXimpOperationLC(const MXIMPBase& aEvent );
	private: 	
		
	   	/**
	     *second phase constructor
	     */
	    void ConstructL();
	    
	   /**
		* CVIMPSTEngineSessionCntxtObserver
		* @param aSettingsId: settings id.
		* @param aAdapterUid: Uid of the ximpfw adaptation.
		*/
	    CVIMPSTEngineSessionCntxtObserver(TUint32 aServiceId);
	    
	    /**
	     * Identifies the Features supported by the Adaptation
	     * and stores the information in iFeatureSupported 
	     */
	    void IdentifySupportedFeaturesL();	    
	    

	private:  //Data
 	    // not own
        TUint32 iServiceId;
	   
  	    //Result code from waited request
	    TInt    iReqResult;  
	    
	    // Current presence bind status
	    TVIMPSTEnums::TVIMPSTBindStatus iBindStatus;
	    
	    //OWN: request mapper to mapp each request
	    CVIMPSTEngineRequestMapper*    iRequestMapper;
	    
	    // own , client for presence framework
        MXIMPClient*                      iClient;
        
        // own ,presence context to prsence framework
        MXIMPContext*             iPresenceCtx;
	    
	    // owned  pointer to presence plugin
	    MPresenceFeatures* iFeatures;
	    
	    //Stores the XIMPFw EventTypes Subscribed for      
	    RArray< TInt32 > iAcceptedEventTypes;
	    
	    // Own, array of observers.
	    RPointerArray<MVIMPSTEngineSessionCntxtObserver> iObserverArray;
	    
	    //Stores the XIMP Features Supported
	    TInt iFeatureSupported;

	    
    };



#endif //CVIMPSTENGINESESSIONCNTXTOBSERVER_H_


