phoneclientserver/phoneserver/Src/Messenger/CPhSrvSubSessionMessenger.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:15:03 +0100
branchRCL_3
changeset 20 987c9837762f
parent 19 7d48bed6ce0c
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2004-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 Messenger.
*                The stub version of this file can be found from file
*                CPhSrvSubSessionMessengerStub.cpp
*
*/



// INCLUDE FILES
#include    "CPhSrvSubSessionMessenger.h"
#include    "CPhSrvSession.h"
#include    "CPhSrvServer.h"
#include    <PhCltTypes.h>
#include    "MPhSrvMessengerNegotiators.h"
#include    "PhSrvMessengerTypes.h"



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

// -----------------------------------------------------------------------------
// CPhSrvSubSessionMessenger::CPhSrvSubSessionMessenger
// 
// Constructor.
// -----------------------------------------------------------------------------
//
CPhSrvSubSessionMessenger::CPhSrvSubSessionMessenger( 
    CPhSrvSession& aSession )
:   CPhSrvSubSessionBase( aSession, EPhSrvSubSessionTypeMessenger )
    {
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionMessenger::~CPhSrvSubSessionMessenger
// 
// Destructor.
// -----------------------------------------------------------------------------
//
CPhSrvSubSessionMessenger::~CPhSrvSubSessionMessenger()
    {
    Clean();
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionMessenger::NewL
// 
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CPhSrvSubSessionBase* CPhSrvSubSessionMessenger::NewL(
    CPhSrvSession& aSession )
    {
    // Just to make sure that the negotiator will exist.
    aSession.PhoneServer().MessengerNegotiatorL();

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


// -----------------------------------------------------------------------------
// CPhSrvSubSessionMessenger::PhSrvMessageDecoderCanProcessMessage
// 
// Framework function. Returns ETrue for the op codes that
// this subsession can handle.
// -----------------------------------------------------------------------------
//
TBool CPhSrvSubSessionMessenger::PhSrvMessageDecoderCanProcessMessage( 
    TInt aFunction )
    {
    switch( aFunction )
        {
        case EPhoneServerMessengerSubSessionOpen:
        case EPhoneServerMessengerSubSessionClose:
        case EPhoneServerMessengerSubSessionConstruct:
        case EPhoneServerMessengerSubSessionReceive:
        case EPhoneServerMessengerSubSessionSend:
        case EPhoneServerMessengerSubSessionSkip:
        case EPhoneServerMessengerSubSessionCancel:
            return ETrue;
            
        default:
            return EFalse;
        }
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionMessenger::PhSrvMessageProcessorHandleMessageL
// 
// Framework function. Handle any op-codes here.
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionMessenger::PhSrvMessageProcessorHandleMessageL( 
    const RMessage2& aMessage )
    {
    TBool permissionStatus ( EFalse );
     
    // Check needed capabilities    
    TBool hasCapWriteDeviceData( EFalse );                  
    hasCapWriteDeviceData = aMessage.HasCapability( ECapabilityWriteDeviceData );            

    switch( aMessage.Function() )
        {
        case EPhoneServerMessengerSubSessionClose:
            CmdSubSessionClose( aMessage );
            permissionStatus = ETrue;
            break;

        case EPhoneServerMessengerSubSessionConstruct:
            CmdSubSessionMessengerConstructL( aMessage );
            permissionStatus = ETrue;
            break;

        case EPhoneServerMessengerSubSessionReceive:
            if ( hasCapWriteDeviceData )
                {  
                CmdSubSessionMessengerReceive( aMessage );
                permissionStatus = ETrue;
                }
            break;
        case EPhoneServerMessengerSubSessionSend:
            if ( hasCapWriteDeviceData )
                {  
                CmdSubSessionMessengerSend( aMessage );
                permissionStatus = ETrue;
                }
            break;
        case EPhoneServerMessengerSubSessionSkip:
            if ( hasCapWriteDeviceData )
                {  
                CmdSubSessionMessengerSkip( aMessage );
                permissionStatus = ETrue;
                }
            break;
        case EPhoneServerMessengerSubSessionCancel:
            if ( hasCapWriteDeviceData )
                {  
                CmdSubSessionMessengerCancel( aMessage );
                permissionStatus = ETrue;
                }
            break;

        default:
            PhoneSession().PanicClient(
                aMessage,
                EPhCltServerInitiatedPanicInvalidRequest );
            break;
        }
        
    // If caps are not ok
    if ( !permissionStatus )
        {        
        aMessage.Complete( KErrPermissionDenied );
        }         
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionMessenger::CmdSubSessionClose
// 
// Close the sub-session.
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionMessenger::CmdSubSessionClose( 
    const RMessage2& aMessage )
    {
    Clean();

    PhoneSession().CloseSubSession( aMessage );
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionMessenger::CmdSubSessionMessengerConstructL
// 
// 
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionMessenger::CmdSubSessionMessengerConstructL( 
    const RMessage2& aMessage )
    {
    TPhCltMessengerParameters parameters;

    // Check the Construct parameters.
    TPckg< TPhCltMessengerParameters > recParPckg( 
        parameters );
    Read(
        aMessage,
        0,
        recParPckg );

    // Ask the messenger negotiator to reserve all needed space
    // for this subsession.
    MPhSrvMessengerNegotiator& messengerNegotiator = GetMessengerNegotiator();

    messengerNegotiator.NegotiatorRequestConstructL( 
        *this,
        parameters,
        aMessage );
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionMessenger::CmdSubSessionMessengerReceive
// 
// 
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionMessenger::CmdSubSessionMessengerReceive( 
    const RMessage2& aMessage )
    {

    TPhCltMessengerParameters parameters;

    // Check the Receive parameters.
    TPckg< TPhCltMessengerParameters > recParPckg( 
        parameters );
    Read(
        aMessage,
        0,
        recParPckg );

    // This is Receive request.
    parameters.iMessengerCommand = EPhCltMesCommandReceive;

    // Ask the messenger negotiator to handle this request.
    ForwardRequest( 
        *this,
        parameters,
        aMessage );
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionMessenger::CmdSubSessionMessengerSend
// 
// 
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionMessenger::CmdSubSessionMessengerSend( 
    const RMessage2& aMessage )
    {
    TPhCltMessengerParameters parameters;

    // Check the Send parameters.
    TPckg< TPhCltMessengerParameters > sendParPckg( 
        parameters );
    Read(
        aMessage,
        0,
        sendParPckg );

    // This is Send request.
    parameters.iMessengerCommand = EPhCltMesCommandSend;

    // Ask the messenger negotiator to handle this request.
    ForwardRequest( 
        *this,
        parameters,
        aMessage );
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionMessenger::CmdSubSessionMessengerSkip
// 
// 
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionMessenger::CmdSubSessionMessengerSkip( 
    const RMessage2& aMessage )
    {
    TPhCltMessengerParameters parameters;

    // This is Skip request.
    parameters.iMessengerCommand = EPhCltMesCommandSkip;

    // Ask the messenger negotiator to handle this request.
    ForwardRequest( 
        *this,
        parameters,
        aMessage );
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionMessenger::CmdSubSessionMessengerCancel
// 
// Handle command handler client's cancel request.
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionMessenger::CmdSubSessionMessengerCancel( 
    const RMessage2& aMessage )
    {
    TInt returnValue = KErrArgument;

    TPhCltMessengerParameters parameters;

    // Check the Cancel parameters.
    TPckg< TPhCltMessengerParameters > recParPckg( 
        parameters );
    Read(
        aMessage,
        0,
        recParPckg );

    TPhCltMessengerRequest request = parameters.iCancelRequest;


    TPhCltMessengerCommand mesCommand = EPhCltMesCommandUnknown;
    if ( request == EPhCltMesRequestReceive)
        {
        mesCommand = EPhCltMesCommandReceive;
        }
    else if ( request == EPhCltMesRequestSend )
        {
        mesCommand = EPhCltMesCommandSend;
        }

    // Perform cancel only if that was valid request.
    if ( mesCommand != EPhCltMesCommandUnknown )
        {
        // Ask the messenger negotiator to cancel the pending request
        // for this subsession.
        MPhSrvMessengerNegotiator& messengerNegotiator = 
            GetMessengerNegotiator();

        messengerNegotiator.NegotiatorRequestCancel( *this, mesCommand );

        returnValue = KErrNone;
        }
    aMessage.Complete( returnValue );
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionMessenger::GetMessengerNegotiator
// 
// Return the messenger negotiator.
// -----------------------------------------------------------------------------
//
MPhSrvMessengerNegotiator& CPhSrvSubSessionMessenger::GetMessengerNegotiator()
    {
    // Messenger negotiator created already in NewL.
    return PhoneSession().PhoneServer().MessengerNegotiator();
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionMessenger::ForwardRequest
// 
// Forward request to negotiator.
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionMessenger::ForwardRequest(
    CPhSrvSubSessionBase& aSubSession,
    const TPhCltMessengerParameters& aParameters,
    const RMessage2& aMessage )
    {
    // Ask the messenger negotiator to handle this request.
    MPhSrvMessengerNegotiator& messengerNegotiator = GetMessengerNegotiator();

    messengerNegotiator.NegotiatorRequest( 
        aSubSession,
        aParameters,
        aMessage );
    }


// -----------------------------------------------------------------------------
// CPhSrvSubSessionMessenger::Clean
// 
// Clean the negotiator side.
// -----------------------------------------------------------------------------
//
void CPhSrvSubSessionMessenger::Clean()
    {
    // Ask the messenger negotiator to release all reserved space
    // for this subsession.
    MPhSrvMessengerNegotiator& messengerNegotiator = GetMessengerNegotiator();

    messengerNegotiator.NegotiatorRequestDelete( *this );
    }


// End of File