/*
* Copyright (c) 2005-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:  This is client interface class for SIP-server 
*  Version     : %version: 24 % << Don't touch! Updated by Synergy at check-out.
*
*/


#ifndef __MUSAVASIP_H__
#define __MUSAVASIP_H__

//  INCLUDES

#include "musunittesting.h"

#include <e32base.h>
#include <sip.h>

class CMusAvaSipConnectionObserver;
class CMusAvaSipObserver;
class CMusAvaSipProfileRegistryObserver;
class CSIP;
class CSIPProfile;
class CSIPProfileRegistry;
class MMusAvaSipConnectionAdapter;
class MMusAvaSipProfileRegistryAdapter;
class MSIPConnectionObserver;
class MMusAvaSipAdapter;
class CSIPProfileRegistryBase;
class CMusAvaClientResolverUtil;

/**
 *  CMusAvaSip class represent the interface for module fetcher.
 *
 *  This interface class encapsulates module selection for availability Plug-in.
 *
 *  @lib musavailabilityplugin.lib

 */

class CMusAvaSip : public CBase
	{
public:
   
   	/**
     * Two-phased constructor
     *
     * @since S60 v3.2
     * @param aCMusAvaSharedObj Pointer to CMusAvaSharedObject
     * @return Returns pointer to CMusAvaSip object
     */
	static CMusAvaSip* NewL();
	
	/**
     * Destructor
     *

     * @param 
     * @return 
     */

	~CMusAvaSip();
	
	protected:
	
	/**
     * Constructor
     *
     * @since S60 v3.2
     * @param aCMusAvaSharedObj Pointer to CMusAvaSharedObject
     * @return 
     */

	CMusAvaSip();
	
    /**
     * Perform the second phase construction of a
     *             CMusAvaSip object
     *
     * @since S60 v3.2
     * @param 
     * @return 
     */

	void ConstructL();
	
public:
    /**
     *  
     *
	 * @param 
     */
    void AddAdapterL( MMusAvaSipProfileRegistryAdapter& aAdapter );

    /**
     *  
     *
	 * @param 
     */
    void RemoveAdapter( MMusAvaSipProfileRegistryAdapter& aAdapter );	 

    /**
     *  
     *
	 * @param 
     */
    void AddAdapterL( MMusAvaSipConnectionAdapter& aAdapter, TInt aIndex = KErrNotFound );

	 /**
     * Returns CSip object 
     *
	 * @param 
     */
    void RemoveAdapter( MMusAvaSipConnectionAdapter& aAdapter );
	
    /**
     *  
     *
	 * @param 
     */
    void AddAdapterL( MMusAvaSipAdapter& aAdapter, TInt aIndex = KErrNotFound  );

	 /**
     * Returns CSip object. 
     *
	 * @param 
     */
    void RemoveAdapter( MMusAvaSipAdapter& aAdapter );

public:	 

	/**
     * Returns CSIPConnection object. 
     * Ownership is not transferred.
     * @param aForceCreation, ETrue if connection should be created
     * if it does not exists yet.
	 * @return referense to Sip Object.
     */
	CSIPConnection* ConnectionL( TBool aForceCreation = ETrue );

	 /**
     * Returns CSIPConnection object .
     * Ownership is not transferred.
     *
	 * @return referense to Sip Object.
     */
	MSIPConnectionObserver& ConnectionObserver();
    	
	 /**
     * Create Profile object.
     * 
	 * return EFalse if Profile was not created, 
	 * ETrue otherwise.
     */
     TBool CreateProfileL();
     
     /**
     * Create CSIPProfile object.
     * 
	 * return EFalse if CSIPProfile was not created, 
	 * ETrue otherwise.
     */
     TBool CreateSipProfile();
    	
	 /**
     * Returns CSIPProfile object.
     * Ownership is not transferred.
     *
     * @since  S60 v3.2
	 * @return referense to Sip Object.
     */
    CSIPProfile* Profile();

	 /**
     * Returns CSIPProfileRegistry object.
     * Ownership is not transferred.
     *
	 * @return reference to Sip Object.
     */
    CSIPProfileRegistry& ProfileRegistryL();
	
	 /**
     * Returns a buffer containing the own domain, if profile registered.
     * Ownership is transferred.
     *
	 * @return Pointer to a buffer containing the own domain name.
     */
    HBufC* OwnDomainLC();
    
    /**
     * Returns CSip object 
     * Ownership is not transferred.
     *
	 * @return reference to Sip Object.
     */
    CSIP& Sip();
    
    /**
     * Returns SipProfileId 
     *
	 * @param aSipProfileId on return will contain SipProfileId value
     * @return KErrNotFound if parameter was not found, KErrNone otherwise.
     */
    TInt SipProfileId( TUint32& aSipProfileId );
    
    /**
     * Returns a pointer to utility object that handles special client resolving 
     * in __VOIP enabled terminals. In __VOIP disabled terminals this will 
     * return a NULL pointer. This function does not transfer ownership.
     *
     * @return Pointer to resolver utility object. Make sure to be prepared 
     *         that this pointer is NULL.
     */
    CMusAvaClientResolverUtil* ClientResolverUtil() const;


private:
	
	 /**
     * Create SIPConnection object.
     * 
     */  
	void CreateSIPConnectionL();
        
    /**
     * Gets profile to be used with Mus.
     *
     * @param Reference to used profile registry.
     * @return Pointer to profile meant to be used with Mus. If not possible,
     *         returns poiner to default profile.  Ownership is transferred.
     * @leave KErrNotFound if not able to return even default profile.
     */		
    CSIPProfile* GetMusProfileL( CSIPProfileRegistryBase& aRegistry );
    
    
private:
        
     /**
     * Pointer to CSIP object.
     * Owns.
     */
	 CSIP* iSip;
	 
     /**
      * 
      * Owns.
      */
	 CSIPConnection* iSipConnection;
	 
     /**
      *
      * Owns.
      */
     CSIPProfile* iSipProfile;
     
     /**
      *
      * Owns.
      */
     CSIPProfileRegistry* iSipProfileRegistry;

     /**
     * Pointer to CMusAvaSipObserver object.
     * Owns.
     */
     CMusAvaSipObserver* iSipObserver;
     
     /**
     * Pointer to CMusAvaSipConnectionObserver object
     * Owns.
     */
     CMusAvaSipConnectionObserver* iSipConnectionObserver;
     
     /**
     * Pointer to CMusAvaSipProfileRegistryObserver object
     * Owns.
     */
     CMusAvaSipProfileRegistryObserver* iSipProfileRegistryObserver;
     
     /**
     * Pointer to utility object that handles special client resolving in
     * __VOIP enabled terminals. In __VOIP disabled terminals creation of
     * this object will fail because of missing UID in CenRep and thus this 
     * pointer can be NULL. If this object does not exist, standard client
     * resolving will be used.
     */
     CMusAvaClientResolverUtil* iClientResolverUtil;
     
     TUint32 iIapId;
     
     MUS_UNITTEST( UT_CMusAvaOptionHandler )
     MUS_UNITTEST( UT_CMusAvaSip )
     MUS_UNITTEST( UT_CMusAvaRegisterAvailability )
     MUS_UNITTEST( UT_CMusAvaConnectionMonitor )
     MUS_UNITTEST( UT_CMusAvaCapabilitySipAgent )
     MUS_UNITTEST( UT_CMusAvaCapabilityExchange )
	};

#endif

