diff -r 000000000000 -r ff3b6d0fd310 phoneclientserver/phoneserver/Src/CommandHandler/CPhSrvSubSessionCommandHandlerNotify.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneclientserver/phoneserver/Src/CommandHandler/CPhSrvSubSessionCommandHandlerNotify.cpp Tue Feb 02 01:11:09 2010 +0200 @@ -0,0 +1,281 @@ +/* +* 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 +#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