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



//  INCLUDES

#ifndef _INC_CMMUSSDMESSHANDLER_
#define _INC_CMMUSSDMESSHANDLER_

#include <e32def.h>

#include "mmmmesshandlerbase.h"
#include "cmmphonetreceiver.h"
#include "cmmphonetsender.h"

//  CONSTANTS

    //none


//  MACROS

    //none


//  DATA TYPES

    //none

//  EXTERNAL DATA STRUCTURES

    //none


//  FUNCTION PROTOTYPES

    //none


//  FORWARD DECLARATIONS

class CMmMessageRouter;
class CMmPhoNetReceiver;
class CMmPhoNetSender;
class CMmUssdTsy;

//  CLASS DEFINITIONS

// DESCRIPTION
//
// CMmUssdMessHandler is used to create and send mode-independent Ussd
// ISI-messages to PhoNet via PhoNetSender. It also receives Ussd ISI-messages
// from PhoNet via PhoNetReceiver. If the message is mode-independent,
// it will be handled here. Otherwise, the message will be sent to message
// handler of active mode.

class CMmUssdMessHandler :
    public CBase, public MMmMessHandlerBase, public MMmMessageReceiver
{
    //METHODS
    public:

        /**
        * C++ destructor
        * @param none
        * @return none
        */
        ~CMmUssdMessHandler();

        /**
        * Two-phased constructor.
        * @param aPhoNetSender Pointer to the phonet sender
        * @param aPhoNetReceiver Pointer to the phonet receiver
        * @param aMessageRouter Pointer to the message router
        */
        static CMmUssdMessHandler* NewL(
            CMmPhoNetSender* aCMmPhoNetSender,
            CMmPhoNetReceiver* aCMmPhoNetReceiver,
            CMmMessageRouter* aMessageRouter );

        /**
        * From CMessHandlerBase. This method is the single entry point for
        * requests coming from the Symbian OS layer to this message handler
        * @since ?Series60_version
        * @param aIpc IPC number of the request
        * @return TInt KErrNone or error code
        */
        TInt  ExtFuncL( TInt aIpc,
            const CMmDataPackage* aDataPackage );

    public: // New functions

        /**
        * Handles a received message by calling the specific
        * message handling method.
        * @param aIsiMessage, reference to the received message.
        * @return TInt: True if message been handled in this message handler
        */
        void ReceiveMessageL( const TIsiReceiveC &aIsiMessage );

        /**
        * Construct a SS_GSM_USSD_SEND_REQ ISI message
        * @param TUint8 aTransactionId, transaction id number
        * @param TDes8* aData, message data
        * @param TDes8* aAttributes, message attributes
        * @return TInt KErrNone or error code
        */
        TInt SsGsmUssdSendReq(
            const CMmDataPackage* aDataPackage );

        /**
        * Construct a SS_GSM_USSD_SEND_REQ ISI message
        * @return TInt KErrNone or error code
        */
        TInt SsGsmUssdSendReq( void );

        /**
        * Completes successful Ss Gsm Ussd Send Request
        * @param aIsiMessage
        */
        void SsGsmUssdSendResp( const TIsiReceiveC &aIsiMessage );

        /*
        * Completes unsuccessful Ss Gsm Ussd Send Request
        * @param  const TIsiReceiveC &aIsiMessage , the received ISI message
        */
        void SsServiceFailedResp( const TIsiReceiveC &aIsiMessage );

        /**
        * breaks a SS_GSM_USSD_RECEIVE_IND ISI message
        * @param aIsiMessage
        */
        void SsGsmUssdReceiveInd( const TIsiReceiveC &aIsiMessage );

        /**
        * Handles errors comes from PhoNetReceiver RunError
        * @param const TIsiReceiveC &aIsiMessage: The received ISI message
        */
        void HandleError(const TIsiReceiveC &aIsiMessage, TInt aError);

    protected:

        /**
        * C++ constructor
        * @param none
        * @return none
        */
        CMmUssdMessHandler();

    private:

        /**
        * Initialises object attributes.
        */
        void ConstructL();

    //ATTRIBUTES
    public:
        //none

    protected:

        // Pointer to the PhonetSender
        CMmPhoNetSender* iPhoNetSender;

        // pointer to the message router
        CMmMessageRouter* iMessageRouter;


    private:

        TBool iIsSendReleaseCalled;
        TBool iIsUssdSendReqOnGoing;
        TBool iIsSendReleaseReqPending;

        // Etrue if NoFdn request is in active
        TBool iNoFdnUSSDReq;

        // Used to distinguish between command and request MT USSD's
        TBool iLastMtUssdIsRequest;
};

#endif // CMMUSSDMESSHANDLER

//End Of File
