phoneclientserver/phoneserver/Src/CommandHandler/CPhSrvSubSessionCommandHandlerNotify.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:11:09 +0200
changeset 0 ff3b6d0fd310
child 12 ae8abd0db65c
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* Copyright (c) 2003-2004 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 Command handler notify.
*                The stub version of this file can be found from file
*                CPhSrvSubSessionCommandHandlerNotifyStub.cpp
*
*/



// INCLUDE FILES
#include    "CPhSrvSubSessionCommandHandlerNotify.h"
#include    "CPhSrvSession.h"
#include    "CPhSrvServer.h"
#include    <PhCltTypes.h>
#include    "MPhSrvComHandNegotiators.h"




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


// -----------------------------------------------------------------------------
// CPhSrvSubSessionCommandHandlerNotify::CPhSrvSubSessionCommandHandlerNotify
// 
// Constructor.
// -----------------------------------------------------------------------------
//
CPhSrvSubSessionCommandHandlerNotify::CPhSrvSubSessionCommandHandlerNotify( 
    CPhSrvSession& aSession )
:   CPhSrvSubSessionBase( aSession, EPhSrvSubSessionTypeComHandNotify )
    {
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionCommandHandlerNotify::NewL
// 
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CPhSrvSubSessionBase* 
    CPhSrvSubSessionCommandHandlerNotify::NewL(
        CPhSrvSession& aSession )
    {
    // Just to make sure that the destructor does not leave.
    aSession.PhoneServer().ComHandNegotiatorL();

    CPhSrvSubSessionBase* self = 
        new( ELeave ) CPhSrvSubSessionCommandHandlerNotify( aSession );
    
    return self;
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionCommandHandlerNotify::~CPhSrvSubSessionCommandHandlerNotify
// 
// Destructor.
// -----------------------------------------------------------------------------
//
CPhSrvSubSessionCommandHandlerNotify::~CPhSrvSubSessionCommandHandlerNotify()
    {
    // Inform that we are not ready to process requests anymore.
    if ( PhoneSession().PhoneServer().IsComHandNegotiator() )
        {
        PhoneSession().
            PhoneServer().
                ComHandNegotiator().
                    SetNegotiatorReadyRequestCancel( *this );
        }
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionCommandHandlerNotify::PhSrvMessageDecoderCanProcessMessage
// 
// Framework function. Returns ETrue for the op codes that
// this subsession can handle.
// -----------------------------------------------------------------------------
//
TBool 
    CPhSrvSubSessionCommandHandlerNotify::PhSrvMessageDecoderCanProcessMessage(
        TInt aFunction )
    {
    switch( aFunction )
        {
        case EPhoneServerComHandNotifySubSessionClose:
        case EPhoneServerComHandNotifySubSessionComHandRequest:
        case EPhoneServerComHandNotifySubSessionComHandRequestCancel:
        case EPhoneServerComHandNotifySubSessionReportComHandResult:
            return ETrue;
            
        default:
            return EFalse;
        }
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionCommandHandlerNotify::PhSrvMessageProcessorHandleMessageL
// 
// Framework function. Handle any op-codes here.
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionCommandHandlerNotify::PhSrvMessageProcessorHandleMessageL(
    const RMessage2& aMessage )
    {
    switch( aMessage.Function() )
        {
        case EPhoneServerComHandNotifySubSessionClose:
            CmdSubSessionClose( aMessage );
            break;

        case EPhoneServerComHandNotifySubSessionComHandRequest:
            CmdSubSessionComHandNotifyRequestL( aMessage );
            break;

        case EPhoneServerComHandNotifySubSessionComHandRequestCancel:
            CmdSubSessionComHandNotifyRequestCancelL( aMessage );
            break;

        case EPhoneServerComHandNotifySubSessionReportComHandResult:
            CmdSubSessionComHandNotifyReportL( aMessage );
            break;
            
        default:
            PhoneSession().PanicClient(
                aMessage,
                EPhCltServerInitiatedPanicInvalidRequest );
            break;
        }
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionCommandHandlerNotify::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 CPhSrvSubSessionCommandHandlerNotify::
    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;
    }


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



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


// -----------------------------------------------------------------------------
// CPhSrvSubSessionCommandHandlerNotify::CmdSubSessionComHandNotifyRequestL
// 
// Handle command handler notifier's request.
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionCommandHandlerNotify::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 );
        }
    }


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

    aMessage.Complete( KErrNone );
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionCommandHandlerNotify::CmdSubSessionComHandNotifyReportL
// 
// Tell the result of the request execution to the command handler client.
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionCommandHandlerNotify::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