/*
* 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:
*  Version     : %version: 6.1.4 % << Don't touch! Updated by Synergy at check-out.
*
*/



#ifndef MUSSIPPROFILEHANDLER_H
#define MUSSIPPROFILEHANDLER_H


// INTERNAL INCLUDE
#include "musunittesting.h"

// SYSTEM INCLUDE
#include <e32base.h>
#include <sipobserver.h>
#include <sipconnectionobserver.h>
#include <sipprofileregistryobserver.h>
#include <sipprofilealrobserver.h>


class CSIPProfile;
class CSIPProfileRegistry;
class CSipProfileAlrController;
class CUri8;
class MMusSipProfileUser;

/**
*
* @lib musengine.lib
*/
class CMusSipProfileHandler : public CBase,
                              public MSIPProfileRegistryObserver,
                              public MSIPObserver,
                              public MSIPConnectionObserver,
                              public MSipProfileAlrObserver                             
    {
    MUS_UNITTEST( UT_CMusEngSipProfileHandler )
    
    public:

        /**
        * Creates new instance of CMusSipProfileHandler
        * @param aSipProfileId profile id of requested profile
        */
        static CMusSipProfileHandler* NewL( MMusSipProfileUser& aUser );

        /**
        * Destructor
        *
        */
        ~CMusSipProfileHandler();


    public: // API
        
        /**
        * Creates the SIP profile used.
        * @param aSipProfileId profile ID of requested SIP profile
        */
        void CreateProfileL( TUint32 aSipProfileId );
        
        /**
        * Returns the used SIP profile.
        * @pre SipProfileL has been called
        * @return SIP profile or NULL if the SIP profile cannot be found,
        *         The ownership is not transferred.
        */ 
        CSIPProfile* Profile();
        
        /**
        * Returns the registered public user identity of the used SIP profile
        * @pre SipProfileL has been called
        * @return a pointer to the URI, the ownership is transferred 
        */       
        CUri8* UserFromProfileLC();

        /**
        * Refreshes the availabilities of the access points 
        * for the used SIP profile.
        * Should be called when a MuS session terminates.
        */
        void RefreshIapAvailabilities();
        
        /**
         * @return ETrue if SIP profile returned by Profile() is registered
         */
        TBool IsRegistered();

        
    private:

        /**
        * Constructor
        */
        CMusSipProfileHandler( MMusSipProfileUser& aUser );

        /**
        * Second-phase constructor
        */
        void ConstructL();

    private: // From MSIPProfileRegistryObserver

        /**
        * An event related to SIP Profile has accorred
        *
        * @param aProfileId a profile Id
        * @param aEvent an occurred event
        **/
        void ProfileRegistryEventOccurred( 
            TUint32 aProfileId,
            MSIPProfileRegistryObserver::TEvent aEvent );

        /**
        * An asynchronous error has occurred related to SIP profile
        * Event is send to those observers, who have the
        * corresponding profile instantiated.
        *
        * @param aProfileId the id of failed profile
        * @param aError an occurred error
        */
        void ProfileRegistryErrorOccurred( 
            TUint32 aProfileId,
            TInt aError );

    private: // From MSIPObserver    

        void IncomingRequest( TUint32 aIapId,
                              CSIPServerTransaction* aTransaction );

        void TimedOut( CSIPServerTransaction& aTransaction );

    private: // MSIPConnectionObserver must be implemented to enable SIP profile
        
        void IncomingRequest (CSIPServerTransaction* aTransaction );

        void IncomingRequest (CSIPServerTransaction* aTransaction,
                              CSIPDialog& aDialog );

        void IncomingResponse (CSIPClientTransaction& aTransaction );

        void IncomingResponse ( CSIPClientTransaction& aTransaction,
                                CSIPDialogAssocBase& aDialogAssoc );

        void IncomingResponse ( CSIPClientTransaction& aTransaction,
                                CSIPInviteDialogAssoc* aDialogAssoc );

        void IncomingResponse( CSIPClientTransaction& aTransaction,
                               CSIPRegistrationBinding& aRegistration );

        void ErrorOccured( TInt aError, CSIPTransactionBase& aTransaction );

        void ErrorOccured( TInt aError,
                           CSIPClientTransaction& aTransaction,
                           CSIPRegistrationBinding& aRegistration );

        void ErrorOccured( TInt aError,
                           CSIPTransactionBase& aTransaction,
                           CSIPDialogAssocBase& aDialogAssoc );
        
        void ErrorOccured( TInt aError, CSIPRefresh& aSIPRefresh );

        void ErrorOccured( TInt aError, 
                           CSIPRegistrationBinding& aRegistration );

        void ErrorOccured( TInt aError, CSIPDialogAssocBase& aDialogAssoc );

        void InviteCompleted( CSIPClientTransaction& aTransaction );

        void InviteCanceled( CSIPServerTransaction& aTransaction );
        
        void ConnectionStateChanged( CSIPConnection::TState aState );     
        
    private: // From MSipProfileAlrObserver    
        
        void AlrEvent( MSipProfileAlrObserver::TEvent aEvent,
                       TUint32 aProfileId,
                       TUint32 aSnapId,
                       TUint32 aIapId );

        void AlrError( TInt aError,
                       TUint32 aProfileId,
                       TUint32 aSnapId,
                       TUint32 aIapId );         
  
    private: // New functions
        
        TUint32 ProfileId() const;
        
    private: // DATA
        
        MMusSipProfileUser& iUser;
        CSIP* iSip;
        CSIPProfileRegistry* iProfileRegistry;
        CSipProfileAlrController* iProfileAlrController;
        CSIPProfile* iSipProfile;
    };


#endif // MUSSIPPROFILEHANDLER_H
