phoneclientserver/phoneserver/Src/Standard/Standard_Aiw/CPhSrvSubSessionNotifier.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 16 Apr 2010 15:31:58 +0300
changeset 13 e32024264ebb
parent 12 ae8abd0db65c
permissions -rw-r--r--
Revision: 201011 Kit: 201015

/*
* Copyright (c) 2002-2005 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:  Sub Session Notifier.
*
*/



// INCLUDE FILES
#include <phclttypes.h> 
#include "cphsrvsubsessionnotifier.h" 
#include "cphsrvsession.h" 
#include "cphsrvserver.h" 
#include "mphsrvemergencynegotiators.h" 
#include "mphsrvobjectnegotiators.h" 
#include "mphsrvcomhandnegotiators.h" 

// CONSTANTS
// None.

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CPhSrvSubSessionNotifier::CPhSrvSubSessionNotifier
// 
// C++ Constructor
// -----------------------------------------------------------------------------
//
CPhSrvSubSessionNotifier::CPhSrvSubSessionNotifier( CPhSrvSession& aSession )
    :   CPhSrvSubSessionBase( aSession, EPhSrvSubSessionTypeCallNotifier ),
        iTelNumberPckg( iTelNumber )
    {
    
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionNotifier::~CPhSrvSubSessionNotifier
// 
// C++ Destructor
// -----------------------------------------------------------------------------
//
CPhSrvSubSessionNotifier::~CPhSrvSubSessionNotifier()
    {
    if ( PhoneSession().PhoneServer().IsCallNegotiator() )
        {
        PhoneSession().
            PhoneServer().
                CallNegotiator().
                    SetNegotiatorReadyCallCancel( *this ); 
        }   
    if ( PhoneSession().PhoneServer().IsEmergencyCallNegotiator() )
        {
        PhoneSession().
            PhoneServer().
                EmergencyCallNegotiator().
                    SetNegotiatorReadyCallCancel( *this );
        }
    if ( PhoneSession().PhoneServer().IsComHandNegotiator() )
        {
        PhoneSession().
            PhoneServer().
                ComHandNegotiator().
                    SetNegotiatorReadyRequestCancel( *this );
        
        }
    delete iDialData;
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionNotifier::ConstructL
// 
// Symbian OS 2nd phase constructor
// -----------------------------------------------------------------------------
//
/*****************************************************
*   Series 60 Customer / ETel
*   Series 60  ETel API
*****************************************************/
void CPhSrvSubSessionNotifier::ConstructL()
    {
    CPhSrvSubSessionBase::ConstructL();
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionNotifier::PhSrvMessageDecoderCanProcessMessage
// 
// Framework function. Returns ETrue for the op codes that
// this subsession can handle.
// -----------------------------------------------------------------------------
//
TBool CPhSrvSubSessionNotifier::PhSrvMessageDecoderCanProcessMessage(
        TInt aFunction )
    {
    switch( aFunction )
        {
        case EPhoneServerNotifySubSessionClose:
        case EPhoneServerNotifySubSessionNotifyCallRequest:
        case EPhoneServerNotifySubSessionNotifyCallRequestCancel:
        case EPhoneServerNotifySubSessionReportCallResult:
        case EPhoneServerNotifySubSessionDialData:

        case EPhoneServerNotifyEmergencySubSessionNotifyCallRequest:
        case EPhoneServerNotifyEmergencySubSessionNotifyCallRequestCancel:
        case EPhoneServerNotifyEmergencySubSessionReportCallResult:

        case EPhoneServerComHandNotifySubSessionComHandRequest:
        case EPhoneServerComHandNotifySubSessionComHandRequestCancel:
        case EPhoneServerComHandNotifySubSessionReportComHandResult:

            return ETrue;

        default:
            return EFalse;
        }   
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionNotifier::PhSrvMessageProcessorHandleMessageL
// 
// Framework function. Handle any op-codes here.
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionNotifier::PhSrvMessageProcessorHandleMessageL(
    const RMessage2& aMessage )
    {
    switch( aMessage.Function() )
        {
        case EPhoneServerNotifySubSessionClose:
            CmdSubSessionCloseL( aMessage );
            break;
        case EPhoneServerNotifySubSessionNotifyCallRequest:
            CmdSubSessionNotifyCallRequestL( aMessage );
            break;
        case EPhoneServerNotifySubSessionNotifyCallRequestCancel:
            CmdSubSessionNotifyCallRequestCancelL( aMessage );
            break;
        case EPhoneServerNotifySubSessionReportCallResult:
            CmdSubSessionReportCallResultL( aMessage );
            break;
        case EPhoneServerNotifySubSessionDialData:
            CmdSubSessionDialDataL( aMessage );
            break;
        case EPhoneServerNotifyEmergencySubSessionNotifyCallRequest:
            CmdSubSessionNotifyEmergencyL( aMessage );
            break;
        case EPhoneServerNotifyEmergencySubSessionNotifyCallRequestCancel:
            CmdSubSessionNotifyEmergencyCancel( aMessage );
            break;
        case EPhoneServerNotifyEmergencySubSessionReportCallResult:
            CmdSubSessionReportEmergencyCallResultL( aMessage );
            break;  
        case EPhoneServerComHandNotifySubSessionComHandRequest:
            CmdSubSessionComHandNotifyRequestL( aMessage );
            break;
        case EPhoneServerComHandNotifySubSessionComHandRequestCancel:
            CmdSubSessionComHandNotifyRequestCancelL( aMessage );
            break;
        case EPhoneServerComHandNotifySubSessionReportComHandResult:
            CmdSubSessionComHandNotifyReportL( aMessage );
            break;             
        default:
            PhoneSession().PanicClient(
                aMessage,
                EPhCltServerInitiatedPanicInvalidRequest );
            break;
        }
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionNotifier::InitiatorMakeAsynchronousCall
// 
// Called by the phone call negotiator when it wants this
// object to initiate a call (on behalf of the external
// interface).
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionNotifier::InitiatorMakeAsynchronousCallL(
      CPhCltExtPhoneDialData& aArgs )
    {
    // data length to send
    const TInt dataLength = aArgs.CalculatePackageSize();
    
    const TPckg< TInt > pDataLength( dataLength );
    //save dial data  
    CmdSubSessionCloneDialDataL( aArgs );

    PhoneSession().Write(
    iPendingDialRequestPointer,
    0,
    pDataLength );   

    // Indicate that the phone notifier should try and make the call.
    if ( !iPendingDialRequestPointer.IsNull() )
        {
        iPendingDialRequestPointer.Complete( KErrNone );
        }
    iHavePendingDialRequestPointer = EFalse;
    
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionNotifier::InitiatorIsReadyToMakeCall
// 
// Does this session have a pending request?
// -----------------------------------------------------------------------------
//
TBool CPhSrvSubSessionNotifier::InitiatorIsReadyToMakeCall() const
    {
    return iHavePendingDialRequestPointer;
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionNotifier::CmdSubSessionCloseL
// 
// Close the sub-session
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionNotifier::CmdSubSessionCloseL(
    const RMessage2& aMessage )
    {
    PhoneSession().CloseSubSession( aMessage );
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionNotifier::CmdSubSessionNotifyCallRequestL
// 
// Setup an asynchronous request to handle external interface
// call requests.
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionNotifier::CmdSubSessionNotifyCallRequestL(
    const RMessage2& aMessage )
    {
    // Update our pending request pointer if it's not already set
    if  ( iHavePendingDialRequestPointer )
        {
        PhoneSession().PanicClient(
            aMessage,
            EPhCltServerInitiatedPanicRequestAlreadyActive );
        }
    else
        {
        iPendingDialRequestPointer = aMessage;
        iHavePendingDialRequestPointer = ETrue;

        // The phone app engine is ready to process a call request. 
        // Tell the negotiator that we're ready to process any pending 
        // requests.
        MPhSrvNegotiatorCall& callNegotiator = 
            PhoneSession().PhoneServer().CallNegotiatorL();
        callNegotiator.SetNegotiatorReadyCallL( *this );
        }
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionNotifier::CmdSubSessionNotifyCallRequestCancelL
// 
// Cancel an outstanding request to handle call initiations.
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionNotifier::CmdSubSessionNotifyCallRequestCancelL(
    const RMessage2& aMessage )
    {
    if  ( !iHavePendingDialRequestPointer )
        {
        PhoneSession().PanicClient(
            aMessage,
            EPhCltServerInitiatedPanicRequestNotActive );
        }
    else
        {
        if ( !iPendingDialRequestPointer.IsNull() )
            {
            iPendingDialRequestPointer.Complete( KErrCancel );
            }
        iHavePendingDialRequestPointer = EFalse;
        }

    aMessage.Complete( KErrNone );
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionNotifier::CmdSubSessionReportCallResultL
// 
// Tell the external call interface client the result of 
// dialing a call.
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionNotifier::CmdSubSessionReportCallResultL(
    const RMessage2& aMessage )
    {
    // Get result
    const TPhCltPhoneResults result = 
        static_cast< TPhCltPhoneResults >( aMessage.Int0() );

    // Tell call negotiator of result
    MPhSrvNegotiatorCall& callNegotiator = 
        PhoneSession().PhoneServer().CallNegotiatorL();
    callNegotiator.SetNegotiatorAttemptedCallResponseValue( result );

    // Complete the request
    aMessage.Complete( KErrNone );
    }

// -----------------------------------------------------------------------------
// CPhSrvSubSessionNotifier::CmdSubSessionCloneDialData
// 
// Clones call arguments to object
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionNotifier::CmdSubSessionCloneDialDataL(
 CPhCltExtPhoneDialData& aArgs )
    {
    iDialData = CPhCltExtPhoneDialData::NewL();
    iDialData->SetTelephoneNumber( aArgs.TelephoneNumber() );
    iDialData->SetCallType( aArgs.CallType() );
    iDialData->SetNameL( aArgs.Name() );
    iDialData->SetWindowGroup( aArgs.WindowGroup() );
    iDialData->SetRedial( aArgs.Redial() );
    iDialData->SetRedialMaximumDuration( aArgs.RedialMaximumDuration() );
    iDialData->SetContactLinkL( aArgs.ContactLink() );
    iDialData->SetSubAddressL( aArgs.SubAddress() );
    iDialData->SetShowNumber( aArgs.ShowNumber() );
    iDialData->SetAllowMatch( aArgs.AllowMatch() );
    iDialData->SetSATCall( aArgs.SATCall() );
    iDialData->SetEndOtherCalls( aArgs.EndOtherCalls() );
    iDialData->SetBearerL( aArgs.Bearer() );
    iDialData->SetSendKeyPressed( aArgs.SendKeyPressed() );
    iDialData->SetInitiateCall( aArgs.InitiateCall() );
    iDialData->SetServiceId( aArgs.ServiceId() );
    iDialData->SetUUIL( aArgs.UUI() );
    }
    
// -----------------------------------------------------------------------------
// CPhSrvSubSessionNotifier::CmdSubSessionDialDataL
// 
// Tell the external call interface client the result of 
// dialing a call.
// -----------------------------------------------------------------------------
//  
void CPhSrvSubSessionNotifier::CmdSubSessionDialDataL ( 
    const RMessage2& aMessage )
    {
    HBufC8* package = NULL;
    package = iDialData->PackLC();
    if ( package )
        {
        PhoneSession().Write(
        aMessage,
        0,
       *package );
        aMessage.Complete( KErrNone );   
        CleanupStack::PopAndDestroy( package );
        }
    delete iDialData;
    iDialData = NULL;
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionNotifier::InitiatorMakeAsynchronousCall
// 
// Called by the phone call negotiator when it wants this
// object to initiate a call (on behalf of the external
// interface).
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionNotifier::InitiatorMakeEmergencyCall( const RMessage2& aMessage )
    {
    
    // Write to phone notifier's address space
    PhoneSession().Read(
        aMessage,
        0,
         iTelNumberPckg );
    
    PhoneSession().Write(
        iPendingEmergencyRequestPointer,
        0,
        iTelNumberPckg );
        
    // Indicate that the phone notifier should try and make the call.
    if ( !iPendingEmergencyRequestPointer.IsNull() )
        {
        iPendingEmergencyRequestPointer.Complete( KErrNone );
        }
    iHavePendingEmergencyRequestPointer = EFalse;
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionNotifier::InitiatorIsReadyToMakeCall
// 
// Does this session have a pending request?
// -----------------------------------------------------------------------------
//
TBool CPhSrvSubSessionNotifier::InitiatorIsReadyToMakeEmergencyCall() const
    {
    return iHavePendingEmergencyRequestPointer;
    }

// -----------------------------------------------------------------------------
// CPhSrvSubSessionNotifier::CmdSubSessionNotifyCallRequestL
// 
// Setup an asynchronous request to handle external interface
// call requests.
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionNotifier::CmdSubSessionNotifyEmergencyL(
    const RMessage2& aMessage )
    {
    // Update our pending request pointer if it's not already set
    if  ( iHavePendingEmergencyRequestPointer )
        {
        PhoneSession().PanicClient(
            aMessage,
            EPhCltServerInitiatedPanicRequestAlreadyActive );
        }
    else
        {
        iPendingEmergencyRequestPointer = aMessage;
        iHavePendingEmergencyRequestPointer = ETrue;

        // The phone app engine is ready to process a call request. 
        // Tell the negotiator that we're ready to process any pending 
        // requests.
        MPhSrvEmergencyNegotiatorCall& emergencyNegotiator = 
            PhoneSession().PhoneServer().EmergencyCallNegotiatorL();
        emergencyNegotiator.SetNegotiatorReadyCall( *this );
        }
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionNotifier::CmdSubSessionNotifyCallRequestCancelL
// 
// Cancel an outstanding request to handle call initiations.
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionNotifier::CmdSubSessionNotifyEmergencyCancel(
    const RMessage2& aMessage )
    {
    if  ( !iHavePendingEmergencyRequestPointer )
        {
        PhoneSession().PanicClient(
            aMessage,
            EPhCltServerInitiatedPanicRequestNotActive );
        }
    else
        {
        if ( !iPendingEmergencyRequestPointer.IsNull() )
            {
            iPendingEmergencyRequestPointer.Complete( KErrCancel );
            }
        iHavePendingEmergencyRequestPointer = EFalse;
        }

    aMessage.Complete( KErrNone );
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionNotifier::CmdSubSessionReportEmergencyCallResultL
// 
// Tell the external call interface client the result of 
// dialing a call.
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionNotifier::CmdSubSessionReportEmergencyCallResultL(
    const RMessage2& aMessage )
    {
    // Get result
    const TPhCltPhoneResults result = 
        static_cast< TPhCltPhoneResults >( aMessage.Int0() );

    // Tell call negotiator of result
    MPhSrvEmergencyNegotiatorCall& emergencyNegotiator = 
        PhoneSession().PhoneServer().EmergencyCallNegotiatorL();
    emergencyNegotiator.SetNegotiatorAttemptedCallResponseValue( result );

    // Complete the request
    aMessage.Complete( KErrNone );
    }

// -----------------------------------------------------------------------------
// CPhSrvSubSessionNotifier::InitiatorMakeAsynchronousComHandRequest
// 
// Called by the command handler negotiator when it wants this object to 
// initiate a command handler request (on behalf of the external interface).
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionNotifier::
    InitiatorMakeAsynchronousComHandRequest( 
    const TPhCltComHandCommandParameters& aParams )
    {
    // Package up the data to send
    TPckgC< TPhCltComHandCommandParameters > 
        comHandDetails( aParams );

    // Write to command handler notifier's address space
    PhoneSession().Write( 
        iPendingComHandRequestPointer,
        0,
        comHandDetails );

    // Indicate that the command handler notifier should try to perform the 
    // request.
    if ( !iPendingComHandRequestPointer.IsNull() )
        {
        iPendingComHandRequestPointer.Complete( KErrNone );
        }
    iHavePendingComHandRequestPointer = EFalse;
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionNotifier::InitiatorIsReadyToPerformRequest
// 
// Does this session have a pending request?
// -----------------------------------------------------------------------------
//
TBool CPhSrvSubSessionNotifier::InitiatorIsReadyToPerformRequest() 
    const
    {
    return iHavePendingComHandRequestPointer;
    }

// -----------------------------------------------------------------------------
// CPhSrvSubSessionNotifier::CmdSubSessionComHandNotifyRequestL
// 
// Handle command handler notifier's request.
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionNotifier::CmdSubSessionComHandNotifyRequestL( 
    const RMessage2& aMessage )
    {
    // Update our pending request pointer if it's not already set
    if  ( iHavePendingComHandRequestPointer )
        {
        PhoneSession().PanicClient(
            aMessage,
            EPhCltServerInitiatedPanicRequestAlreadyActive );
        }
    else
        {
        iPendingComHandRequestPointer = aMessage;
        iHavePendingComHandRequestPointer = ETrue;

        // The phone app engine is ready to process a command handler request.
        // Tell the negotiator that we're ready to process any pending 
        // requests.
        MPhSrvComHandNegotiator& comHandNegotiator = 
            PhoneSession().PhoneServer().ComHandNegotiatorL();
        comHandNegotiator.SetNegotiatorReadyRequestL( *this );
        }
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionNotifier::
// CmdSubSessionComHandNotifyRequestCancelL
// 
// Handle command handler notifier's request cancel.
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionNotifier::
    CmdSubSessionComHandNotifyRequestCancelL( 
        const RMessage2& aMessage )
    {
    if  ( iHavePendingComHandRequestPointer )
        {
        iPendingComHandRequestPointer.Complete( KErrCancel );
        iHavePendingComHandRequestPointer = EFalse;
        }

    aMessage.Complete( KErrNone );
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionNotifier::CmdSubSessionComHandNotifyReportL
// 
// Tell the result of the request execution to the command handler client.
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionNotifier::CmdSubSessionComHandNotifyReportL( 
    const RMessage2& aMessage )
    {
    // Get result
    const TPhCltPhoneResults result = 
        static_cast< TPhCltPhoneResults >( aMessage.Int0() );

    // Tell command handler negotiator of result
    MPhSrvComHandNegotiator& comHandNegotiator = 
        PhoneSession().PhoneServer().ComHandNegotiatorL();
    comHandNegotiator.SetNegotiatorAttemptedRequestResponseValue( result );

    // Complete the request
    aMessage.Complete( KErrNone );
    }

// End of File