phoneclientserver/phoneserver/Src/CommandHandler/CPhSrvSubSessionCommandHandlerNotify.cpp
changeset 0 ff3b6d0fd310
child 19 7d48bed6ce0c
--- /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    <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