--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/satengine/SatServer/Engine/src/CSatClientServiceReq.cpp Tue Feb 02 01:11:09 2010 +0200
@@ -0,0 +1,298 @@
+/*
+* Copyright (c) 2002-2007 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: Handles client requests.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "CSatClientServiceReq.h"
+#include "MSatUtils.h"
+#include "MSatSUiClientHandler.h"
+#include "EnginePanic.h"
+#include "SatLog.h"
+
+_LIT( KTxtServer, "SatServer" );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CSatClientServiceReq::CSatClientServiceReq
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CSatClientServiceReq::CSatClientServiceReq(
+ TSatServerRequest aRequest,
+ TSatServerRequest aResponse,
+ MSatCommand* aCommand,
+ MSatUtils& aUtils ) :
+ iHandledRequest( aRequest ),
+ iHandledResponse( aResponse ),
+ iResponseObserver( aCommand ),
+ iUtils( aUtils )
+ {
+ LOG( SIMPLE, "SATENGINE: \
+ CSatClientServiceReq::CSatClientServiceReq calling-exiting" )
+ }
+
+// -----------------------------------------------------------------------------
+// CSatClientServiceReq::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CSatClientServiceReq* CSatClientServiceReq::NewL(
+ TSatServerRequest aRequest,
+ TSatServerRequest aResponse,
+ MSatCommand* aCommand,
+ MSatUtils& aUtils )
+ {
+ LOG( SIMPLE, "SATENGINE: CSatClientServiceReq::NewL calling-exiting" )
+ return new ( ELeave ) CSatClientServiceReq(
+ aRequest, aResponse, aCommand, aUtils );
+ }
+
+
+// Destructor
+CSatClientServiceReq::~CSatClientServiceReq()
+ {
+ LOG( SIMPLE,
+ "SATENGINE: CSatClientServiceReq::~CSatClientServiceReq calling" )
+
+ iResponseObserver = NULL;
+ iCmdData = 0;
+ iCmdRsp = 0;
+
+ LOG( SIMPLE,
+ "SATENGINE: CSatClientServiceReq::~CSatClientServiceReq exiting" )
+ }
+
+// -----------------------------------------------------------------------------
+// CSatClientServiceReq::HandleCommand
+// Handles the SIM command. If client has not yet requested service for this
+// SIM command, command is stored for later use.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CSatClientServiceReq::HandleCommand(
+ TDesC8* aCmdData, // Data to be sent to client.
+ TDes8* aCmdRsp, // Client is response is written to this.h
+ TSatServerRequest aRequest ) // Command from SIM
+ {
+ LOG( DETAILED, "SATENGINE: CSatClientServiceReq::HandleCommand calling" )
+
+ __ASSERT_ALWAYS( iResponseObserver,
+ PanicSatEngine( ESatEngineNullPointer ) );
+
+ TBool handled( EFalse );
+ // Handle the command here if the request op codes match.
+ if ( iHandledRequest == aRequest )
+ {
+ LOG( DETAILED, "SATENGINE: CSatClientServiceReq::HandleCommand \
+ request op codes match" )
+ // Store the descriptors
+ iCmdData = aCmdData;
+ iCmdRsp = aCmdRsp;
+
+ handled = ETrue;
+
+ // Is the client already waiting for the command
+ if ( iRequestPending )
+ {
+ LOG( DETAILED, "SATENGINE: CSatClientServiceReq::HandleCommand \
+ RequestPending" )
+ // Request is served.
+ iRequestPending = EFalse;
+ SendDataToClient();
+ }
+ else
+ {
+ LOG( DETAILED, "SATENGINE: CSatClientServiceReq::HandleCommand \
+ no RequestPending" )
+ // Client request was not available, so command is waiting for
+ // client request.
+ iCmdPending = ETrue;
+ }
+ }
+
+ LOG( DETAILED, "SATENGINE: CSatClientServiceReq::HandleCommand exiting" )
+ return handled;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatClientServiceReq::HandleRequest
+// Handles the client's request.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CSatClientServiceReq::HandleRequest(
+ const RMessage2& aRequest ) // Request from client.
+ {
+ LOG( DETAILED, "SATENGINE: CSatClientServiceReq::HandleRequest calling" )
+
+ TBool handled( EFalse );
+
+ // Is the request handled here.
+ const TInt request( aRequest.Function() );
+ if ( request == iHandledRequest )
+ {
+ LOG( DETAILED, "SATENGINE: CSatClientServiceReq::HandleRequest \
+ handle request" )
+ handled = ETrue;
+ iRequest = aRequest;
+
+ // Is the command waiting for client.
+ if ( iCmdPending )
+ {
+ LOG( DETAILED, "SATENGINE: CSatClientServiceReq::HandleRequest \
+ iCmdPending" )
+ iCmdPending = EFalse;
+ SendDataToClient();
+ }
+ else
+ {
+ // Command has not yet arrived from SIM, so
+ // wait for the command.
+ iRequestPending = ETrue;
+ }
+ }
+ // Is the response handled here.
+ else if ( request == iHandledResponse )
+ {
+ LOG( DETAILED, "SATENGINE: CSatClientServiceReq::HandleRequest \
+ handle response" )
+ handled = ETrue;
+
+ TRAPD( res, aRequest.ReadL( 0, *iCmdRsp ) );
+
+ // Send the response further only if IPC succeeded.
+ if ( KErrNone != res )
+ {
+ LOG( DETAILED, "SATENGINE: CSatClientServiceReq::HandleRequest \
+ KErrNone != res" )
+ iRequest.Panic( KTxtServer, ESatSBadDescriptor );
+ }
+
+ // Release client first, then handle the response
+ aRequest.Complete( KErrNone );
+ // Notify command that response is available.
+ iResponseObserver->ClientResponse();
+ }
+ else
+ {
+ }
+
+ LOG( DETAILED, "SATENGINE: CSatClientServiceReq::HandleRequest exiting" )
+ return handled;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatClientServiceReq::SendDataToClient
+// Writes the data to client address space and completes the iRequest.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSatClientServiceReq::SendDataToClient()
+ {
+ LOG( SIMPLE, "SATENGINE: CSatClientServiceReq::SendDataToClient calling" )
+
+ TRAPD( res,iRequest.WriteL( 0, *iCmdData ) );
+ LOG2( SIMPLE, "SATENGINE: CSatClientServiceReq::SendDataToClient res: %d",
+ res )
+ if ( KErrNone != res )
+ {
+ iRequest.Panic( KTxtServer, ESatSBadDescriptor );
+ }
+
+ iRequest.Complete( KErrNone );
+
+ // If UI is not launched by user, make sure UI is in foreground
+ if ( !iUtils.SatUiHandler().UiLaunchedByUser() )
+ {
+ LOG( SIMPLE,
+ "SATENGINE: CSatClientServiceReq::SendDataToClient \
+ EBringSatUiToForeGround" )
+ iUtils.NotifyEvent( MSatUtils::EBringSatUiToForeGround );
+ }
+
+ LOG( SIMPLE, "SATENGINE: CSatClientServiceReq::SendDataToClient exiting" )
+ }
+
+// -----------------------------------------------------------------------------
+// CSatClientServiceReq::IsMyRequest
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CSatClientServiceReq::IsMyRequest( const TSatServerRequest aRequest )
+ {
+ LOG( SIMPLE, "SATENGINE: CSatClientServiceReq::IsMyRequest calling" )
+ TBool myRequest( EFalse );
+
+ if ( iHandledRequest == aRequest )
+ {
+ LOG( SIMPLE,
+ "SATENGINE: CSatClientServiceReq::IsMyRequest" )
+
+ myRequest = ETrue;
+ }
+ LOG2( SIMPLE, "SATENGINE: CSatClientServiceReq::IsMyRequest exiting, \
+ return: %d", myRequest )
+ return myRequest;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatClientServiceReq::SetCommandHandler
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSatClientServiceReq::SetCommandHandler( MSatCommand* aCommand )
+ {
+ LOG( SIMPLE, "SATENGINE: CSatClientServiceReq::SetCommandHandler calling" )
+
+ iResponseObserver = aCommand;
+
+ LOG( SIMPLE, "SATENGINE: CSatClientServiceReq::SetCommandHandler exiting" )
+ }
+
+// -----------------------------------------------------------------------------
+// CSatClientServiceReq::Reset
+// Resets member data
+// -----------------------------------------------------------------------------
+//
+void CSatClientServiceReq::Reset()
+ {
+ LOG( SIMPLE, "SATENGINE: CSatClientServiceReq::Reset calling" )
+
+ // Check is request pending
+ if ( !iRequestPending )
+ {
+ // Request not pending meaning that command is executing.
+ // Send client response to prevent SIM to lock
+ LOG( NORMAL, " Request is not pending" )
+ // Notify command that response is available.
+ iResponseObserver->ClientResponse();
+ }
+
+ // Clean data
+ iCmdData = NULL;
+ iCmdRsp = NULL;
+ iCmdPending = EFalse;
+ iRequestPending = EFalse;
+ // We don't reset iResponseObserver
+
+ LOG( SIMPLE, "SATENGINE: CSatClientServiceReq::Reset exiting" )
+ }
+
+// End of File