--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneclientserver/phoneserver/Src/Messenger/CPhSrvSubSessionMessenger.cpp Tue Feb 02 01:11:09 2010 +0200
@@ -0,0 +1,404 @@
+/*
+* 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