diff -r 000000000000 -r ff3b6d0fd310 satengine/SatServer/Engine/src/CSatSUiSubSession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/satengine/SatServer/Engine/src/CSatSUiSubSession.cpp Tue Feb 02 01:11:09 2010 +0200 @@ -0,0 +1,563 @@ +/* +* Copyright (c) 2002-2008 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: Ui sub session. +* +*/ + + + +// INCLUDE FILES +#include +#include + +#include "CSatSUiSubSession.h" +#include "CSatSSession.h" +#include "CSatSServer.h" +#include "CSatCommandHandler.h" +#include "CSatCommandContainer.h" +#include "MSatApi.h" +#include "EnginePanic.h" +#include "SatLog.h" +#include "SATInternalPSKeys.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CSatSUiSubSession::CSatSUiSubSession +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +//lint -e{1403, 1769} Can not be initialized, harmless. +CSatSUiSubSession::CSatSUiSubSession( + CSatSSession& aSession, + MSatApi& aSatApi, + TSatEventMediator& aEventMediator ) // Session + : + CSatSSubSession( aSession ), + iEventData(), + iEventDataPckg( iEventData ), + iSatApi( aSatApi ), + iEventMediator( aEventMediator ) + { + LOG( SIMPLE, + "SATENGINE: CSatSUiSubSession::CSatSUiSubSession calling - exiting" ) + } + +// ----------------------------------------------------------------------------- +// CSatSUiSubSession::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CSatSUiSubSession::ConstructL() + { + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession::ConstructL calling" ) + + iEventMediator.RegisterL( this, MSatUtils::ESmsSent ); + + // Get registered service requests from MSatUtils. + iServiceRequest = iSession.SatServer()->SatUtils()->ServiceRequests(); + + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession::ConstructL exiting" ) + } + +// ----------------------------------------------------------------------------- +// CSatSUiSubSession::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CSatSUiSubSession* CSatSUiSubSession::NewL( + CSatSSession& aSession, + MSatApi& aSatApi, + TSatEventMediator& aEventMediator ) + { + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession::NewL calling" ) + + CSatSUiSubSession* self = + new( ELeave ) CSatSUiSubSession( aSession, aSatApi, aEventMediator ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession::NewL exiting" ) + return self; + } + +// Destructor +CSatSUiSubSession::~CSatSUiSubSession() + { + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession::~CSatSUiSubSession calling" ) + + iServiceRequest = NULL; + + // Unregister to listen events + iEventMediator.Unregister( this ); + + // Inform session that UI Session is closed. + // Session tells to container of iServiceRequest to reset + // request handlers. + iSession.UiSessionClosed(); + + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession::~CSatSUiSubSession exiting" ) + } + +// ----------------------------------------------------------------------------- +// CSatSUiSubSession::HandleCommandL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSatSUiSubSession::HandleCommandL( + const RMessage2& aMessage ) // Message from ui client. + { + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession::HandleCommandL calling" ) + LOG2( SIMPLE, "SATENGINE: CSatSUiSubSession::HandleCommandL \ + command: %i", aMessage.Function() ) + switch ( aMessage.Function() ) + { + // Ui client is ready to handle setupmenu command. + case ESatSProactiveSetUpMenu: + { + // Notifies that SetUpMenu command has been made because SAT Client + // side application is returning to the main menu after SelectItem. + // For example: Next action is LaunchBrowser command and after + // Browser is launched then SAT Client side application has been + // opened top of Browser. In some cases SAT client side application + // stays topmost. + iEventMediator.Notify( MSatUtils::ESetUpMenuRequested ); + // This service request is handled also like commands listed below. + } + //lint -fallthrough intended here + case ESatSProactiveDisplayText: + case ESatSProactiveGetInkey: + case ESatSProactiveGetInput: + case ESatSProactiveSelectItem: + case ESatSProactivePlayTone: + case ESatSProactiveRefresh: + case ESatSProactiveDisplayTextResponse: + case ESatSProactiveGetInkeyResponse: + case ESatSProactiveGetInputResponse: + case ESatSProactiveSelectItemResponse: + case ESatSProactivePlayToneResponse: + case ESatSProactiveQuery: + case ESatSProactiveQueryResponse: + case ESatSProactiveNotification: + case ESatSProactiveNotificationResponse: + { + const TInt count( iServiceRequest->Count() ); + TBool requestHandled( EFalse ); + TInt index( 0 ); + // Loop until request is handled or no request handler found. + while ( !requestHandled && index < count ) + { + requestHandled = iServiceRequest->At( index )-> + HandleRequest( aMessage ); + index++; + } + LOG2( SIMPLE, "SATENGINE: CSatSUiSubSession::HandleCommandL \ + index: %i", index ) + break; + } + + // Menu selection envelope. + case ESatSActiveMenuSelection: + { + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession: MenuSelection" ) + // Declare the IPC data structures. + RSat::TMenuSelectionV1 menuSelection; + RSat::TMenuSelectionV1Pckg menuSelectionPckg( menuSelection ); + + // Perform the IPC transfer of response data. + TRAPD( res, aMessage.ReadL( 0, menuSelectionPckg ) ); + + // Send the response further only if IPC succeeded. + if ( KErrNone != res ) + { + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession: KErrNone != res" ) + iSession.PanicClient( aMessage, ESatSBadDescriptor ); + } + iSatApi.SendMenuSelection( menuSelectionPckg ); + + // Complete the client request. + aMessage.Complete( KErrNone ); + LOG( SIMPLE, + "SATENGINE: CSatSUiSubSession::HandleCommandL exiting" ) + return; + } + + case ESatSProactiveEvent: + { + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession: Event" ) + iEventRequest = aMessage; + iEventRequestAvailable = ETrue; + if ( iCloseUiRequested ) + { + LOG( SIMPLE, + "SATENGINE: CSatSUiSubSession::HandleCommandL closeui" ) + CloseUiSession(); + } + else if ( iSmsSent ) + { + LOG( SIMPLE, + "SATENGINE: CSatSUiSubSession::HandleCommandL smssent" ) + SendSmsSentEventToClient(); + } + else if ( iClearScreenRequested ) + { + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession::HandleCommandL \ + clearscreen" ) + ClearScreen(); + } + else if ( iUiEventRequested ) + { + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession::HandleCommandL \ + UiEventRequested" ) + HandleUiEventNotification(); + } + else + { + LOG( SIMPLE, "SATENGINE: Event request available" ) + } + + break; + } + + case ESatSProactiveEventResponse: + { + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession: EventResponse" ) + // Declare the IPC data structures. + TSatEventV1 eventRsp; + //lint -e{603} eventRsp read through eventRspPckg in ReadL. + TSatEventV1Pckg eventRspPckg( eventRsp ); + + // Perform the IPC transfer of response data. + TRAPD( res, aMessage.ReadL( 0, eventRspPckg ) ); + if ( KErrNone != res ) + { + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession::HandleCommandL \ + read response data error" ) + iSession.PanicClient( aMessage, ESatSBadDescriptor ); + } + else + { + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession::HandleCommandL \ + no error" ) + aMessage.Complete( KErrNone ); + } + break; + } + + case ESatSSessionTerminated: + { + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession: SessionTerminated" ) + TSatTermination temp; + //lint -e{603} temp read through tempPckg in ReadL. + TSatTerminationPckg tempPckg ( temp ); + TRAPD( res, aMessage.ReadL( 0, tempPckg ) ); + if ( KErrNone != res ) + { + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession::HandleCommandL \ + read tempPckg error" ) + iSession.PanicClient( aMessage, ESatSBadDescriptor ); + } + else + { + LOG2( SIMPLE, "SATENGINE: CSatSUiSubSession::HandleCommandL \ + temp.type: %i", temp.type ) + switch ( temp.type ) + { + case ETerminatedByCancel: + { + iEventMediator.Notify( + MSatUtils::ECommandCancelled ); + break; + } + case ETerminatedByEndKey: + { + iEventMediator.Notify( + MSatUtils::ECancelledUsingEndKey ); + + PublishSatAppClosedUsingEndKey(); + + // Inform session that UI Session is closed. + // Session is not actually closed yet but this prevents + // sending data through this session. + // Notify thread death monitor + iSession.NotifyThreadDeathMonitor(); + break; + } + default: + { + LOG( SIMPLE, "SATENGINE: Unknown termination type" ) + } + } + } + // Complete the client request. + aMessage.Complete( KErrNone ); + break; + } + + default: + { + LOG( SIMPLE, " Unhandled command") + } + } + + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession::HandleCommandL exiting" ) + } + +// ----------------------------------------------------------------------------- +// CSatSUiSubSession::CloseUiSession +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSatSUiSubSession::CloseUiSession() + { + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession::CloseUiSession calling" ) + + // Set request flag to ETrue. Updated when command is successfully sent. + iCloseUiRequested = ETrue; + + // Notify thread death monitor + iSession.NotifyThreadDeathMonitor(); + + iEventData.iEvent = ESatSCloseSatUiAppEvent; + + const TBool commandSent( SendCommandDataToClient( iEventRequestAvailable, + iEventDataPckg, + iEventRequest ) ); + + if ( commandSent ) + { + LOG( SIMPLE, + "SATENGINE: CSatSUiSubSession::CloseUiSession commandSent" ) + // If command was sent, set flag to false, so when next Event request + // arrives, command data is not sent. + iCloseUiRequested = EFalse; + } + + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession::CloseUiSession exiting" ) + } + +// ----------------------------------------------------------------------------- +// CSatSUiSubSession::ClearScreen +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSatSUiSubSession::ClearScreen() + { + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession::ClearScreen calling" ) + + // Set request flag to ETrue. Updated when command is successfully sent. + iClearScreenRequested = ETrue; + + iEventData.iEvent = ESatSClearScreenEvent; + + const TBool commandSent( SendCommandDataToClient( iEventRequestAvailable, + iEventDataPckg, + iEventRequest ) ); + + if ( commandSent ) + { + LOG( SIMPLE, + "SATENGINE: CSatSUiSubSession::ClearScreen commandSent" ) + // If command was sent, set flag to false, so when next Event request + // arrives, command data is not sent. + iClearScreenRequested = EFalse; + } + + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession::ClearScreen exiting" ) + } + +// ----------------------------------------------------------------------------- +// CSatSUiSubSession::UiEventNotification +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSatSUiSubSession::UiEventNotification( + TInt aEventId, TInt aEventStatus, TInt aEventError ) + { + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession::UiEventNotification calling" ) + + // Set request flag to ETrue. Updated when command is successfully sent. + iUiEventRequested = ETrue; + iEventData.iEvent = static_cast< TSatSEvent >( aEventId ); + iEventData.iStatus = static_cast< TSatSEventStatus >( aEventStatus ); + iEventData.iError = aEventError; + + HandleUiEventNotification(); + + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession::UiEventNotification exiting" ) + } + +// ----------------------------------------------------------------------------- +// CSatSUiSubSession::HandleUiEventNotification +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSatSUiSubSession::HandleUiEventNotification() + { + LOG( SIMPLE, + "SATENGINE: CSatSUiSubSession::HandleUiEventNotification calling" ) + + // Send Command to client + const TBool commandSent( SendCommandDataToClient( iEventRequestAvailable, + iEventDataPckg, + iEventRequest ) ); + + // Check the status of command sending + if ( commandSent ) + { + LOG( SIMPLE, + "SATENGINE: CSatSUiSubSession::HandleUiEventNotification commandSent" ) + // If command was sent, set flag to false, so when next Event request + // arrives, command data is not sent. + iUiEventRequested = EFalse; + } + + LOG( SIMPLE, + "SATENGINE: CSatSUiSubSession::HandleUiEventNotification exiting" ) + } + +// ----------------------------------------------------------------------------- +// CSatSUiSubSession::SendCommand +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSatSUiSubSession::SendCommand( + TDesC8* aCmdData, // Data from SIM. + TDes8* aCmdRsp, // Response. + TSatServerRequest aRequest ) // Request, which the aData is sent. + { + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession::SendCommand calling" ) + + const TInt count( iServiceRequest->Count() ); + TBool requestHandled( EFalse ); + TInt index( 0 ); + + // Loop until request is handled or no request handler found. + while ( !requestHandled && ( index < count ) ) + { + requestHandled = iServiceRequest->At( index )->HandleCommand( + aCmdData, aCmdRsp, aRequest ); + index++; + } + LOG2( SIMPLE, "SATENGINE: CSatSUiSubSession::SendCommand \ + index: %i", index ) + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession::SendCommand exiting" ) + } + +// ----------------------------------------------------------------------------- +// CSatSUiSubSession::Event +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSatSUiSubSession::Event( TInt aEvent ) + { + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession::Event calling" ) + + if ( MSatUtils::ESmsSent == aEvent ) + { + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession::Event ESmsSent" ) + iSmsSent = ETrue; + SendSmsSentEventToClient(); + } + + LOG( SIMPLE, "SATENGINE: CSatSUiSubSession::Event exiting" ) + } + +// ----------------------------------------------------------------------------- +// CSatSUiSubSession::SendCommandDataToClient +// Writes descriptor to clients address space and +// completes the request. +// ----------------------------------------------------------------------------- +// +TBool CSatSUiSubSession::SendCommandDataToClient( + TBool& aRequestAvailable, // Is request available + const TDesC8& aData, // Data to be sent to client + const RMessage2& aMessage ) const // Message of the request + { + LOG( SIMPLE, + "SATENGINE: CSatSUiSubSession::SendCommandDataToClient calling" ) + + TBool commandSent( EFalse ); + + // Is ui client ready to receive the command data. + if ( aRequestAvailable ) + { + LOG( SIMPLE, "SATENGINE: SendCommandDataToClient: Sending to Client" ) + TRAPD( res, aMessage.WriteL( 0, aData ) ); + if ( KErrNone != res ) + { + LOG( SIMPLE, + "SATENGINE: SendCommandDataToClient: KErrNone != res" ) + iSession.PanicClient( aMessage, ESatSBadDescriptor ); + } + aMessage.Complete( KErrNone ); + aRequestAvailable = EFalse; + commandSent = ETrue; + } + + LOG( SIMPLE, + "SATENGINE: CSatSUiSubSession::SendCommandDataToClient exiting" ) + return commandSent; + } + +// ----------------------------------------------------------------------------- +// CSatSUiSubSession::SendSmsSentEventToClient +// ----------------------------------------------------------------------------- +// +void CSatSUiSubSession::SendSmsSentEventToClient() + { + LOG( SIMPLE, + "SATENGINE: CSatSUiSubSession::SendSmsSentEventToClient calling" ) + + iEventData.iEvent = ESatSSmEndEvent; + const TBool commandSent( SendCommandDataToClient( iEventRequestAvailable, + iEventDataPckg, iEventRequest ) ); + + if ( commandSent ) + { + LOG( SIMPLE, + "SATENGINE: CSatSUiSubSession::SendSmsSentEventToClient commandSent" ) + // If command was sent, set flag to false, so when next Event request + // arrives, command data is not sent. + iSmsSent = EFalse; + } + + LOG( SIMPLE, + "SATENGINE: CSatSUiSubSession::SendSmsSentEventToClient exiting" ) + } + +// ----------------------------------------------------------------------------- +// Publish the P&S key KSatAppClosedUsingEndKey to indicate the occurred +// End Key action +// ----------------------------------------------------------------------------- +// +void CSatSUiSubSession::PublishSatAppClosedUsingEndKey() + { + LOG( SIMPLE, + "SATENGINE:CSatSUiSubSession::PublishSatAppClosedUsingEndKey calling" ) + + TInt error = RProperty::Set( KPSUidSatServerInternal, + KSatAppClosedUsingEndKey, KSatAppTerminatedUsingEndKey ); + LOG2( SIMPLE, "CSatSUiSubSession::PublishSatAppClosedUsingEndKey \ + P&S key: %i", KSatAppTerminatedUsingEndKey ) + LOG2(NORMAL, + "SATENGINE: CSatSUiSubSession::PublishSatAppClosedUsingEndKey - \ + publish KSapAppClosedUsingEndKey and return: %d ", error ); + + LOG( SIMPLE, + "SATENGINE:CSatSUiSubSession::PublishSatAppClosedUsingEndKey exiting" ) + }