--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/common_tsy/commontsy/src/mmcustomtsy/CMmWimTsy.cpp Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,1194 @@
+// Copyright (c) 2006-2009 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:
+//
+
+
+
+// INCLUDE FILES
+#include "CMmWimTsy.h"
+#include <ctsy/rmmcustomapi.h>
+#include <ctsy/tflogger.h>
+#include <ctsy/pluginapi/cmmdatapackage.h>
+
+// ======== MEMBER FUNCTIONS ========
+
+CMmWimTsy::CMmWimTsy()
+ {
+ }
+
+void CMmWimTsy::ConstructL(
+ CMmCustomTsy* aMmCustomTsy )
+ {
+ iMmCustomTsy = aMmCustomTsy;
+
+ // Create req handle store
+#ifdef REQHANDLE_TIMER
+ // Create req handle store
+ iTsyReqHandleStore = CMmTsyReqHandleStore::NewL( iMmCustomTsy,
+ iMmCustomTsy->iMmPhoneTsy, EWIMRequestTypeMaxNumOfRequests,
+ iWIMReqHandles );
+#else // REQHANDLE_TIMER
+ iTsyReqHandleStore = CMmTsyReqHandleStore::NewL(
+ EWIMRequestTypeMaxNumOfRequests, iWIMReqHandles );
+
+ return;
+#endif // REQHANDLE_TIMER
+ }
+
+CMmWimTsy* CMmWimTsy::NewL(
+ CMmCustomTsy* aMmCustomTsy )
+ {
+ CMmWimTsy* mmWIM = new ( ELeave ) CMmWimTsy();
+ CleanupStack::PushL( mmWIM );
+ mmWIM->ConstructL( aMmCustomTsy );
+ CleanupStack::Pop( mmWIM );
+
+ return mmWIM;
+ }
+
+CMmWimTsy::~CMmWimTsy()
+ {
+ if ( iTsyReqHandleStore )
+ {
+ delete iTsyReqHandleStore;
+ }
+
+ iMmCustomTsy = NULL;
+ iRetApduInfo = NULL;
+ iRetApduData = NULL;
+ iAnswerToReset = NULL;
+ iApduParameters = NULL;
+ iSimCardReaderStatus = NULL;
+ iNotifiedSimCardStatus = NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::Init
+// Initialisation method that is called from ETel Server.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmWimTsy::Init()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::RegisterNotification
+// Called when the server recognises that this notification is being posted
+// for the first time on this sub-session object. It enables the TSY to "turn
+// on" any regular notification messages that it may receive from DOS.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmWimTsy::RegisterNotification(
+ const TInt aIpc )
+ {
+ TInt ret ( KErrNotSupported );
+
+ switch ( aIpc )
+ {
+ case ECustomNotifySimCardStatusIPC:
+ ret = KErrNone;
+ break;
+ default:
+ ret = KErrNotSupported;
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::SupportingIPC
+// Tells whether the object supports given IPC.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CMmWimTsy::SupportingIPC(
+ const TInt aIpc )
+ {
+ TInt ret( EFalse );
+
+ switch ( aIpc )
+ {
+ case ECustomSimWarmResetIPC:
+ case ECustomGetATRIPC:
+ case ECustomSendAPDUReqIPC:
+ case ECustomGetSimCardReaderStatusIPC:
+ case ECustomNotifySimCardStatusIPC:
+ case ECustomSendAPDUReqV2IPC:
+ case ECustomPowerSimOnIPC:
+ case ECustomPowerSimOffIPC:
+ ret = ETrue;
+ break;
+ default:
+ ret = EFalse;
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::DeregisterNotification
+// Called when the server recognises that this notification will not be posted
+// again because the last client to have a handle on this sub-session object
+// has just closed the handle. It enables the TSY to "turn off" any regular
+// notification messages that it may receive from DOS.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmWimTsy::DeregisterNotification(
+ const TInt aIpc )
+ {
+ TInt ret ( KErrNotSupported );
+
+ switch ( aIpc )
+ {
+ case ECustomNotifySimCardStatusIPC:
+ ret = KErrNone;
+ break;
+ default:
+ ret = KErrNotSupported;
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::DoExtFuncL
+// Dispatches extension function requests. At the beginning of this method,
+// packaged pointers are unpacked. Then the correct function is selected
+// using the IPC number.
+// If the IPC is supported, returns the return value of corresponding function
+// else returns KErrNotSupported.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmWimTsy::DoExtFuncL(
+ const TTsyReqHandle aTsyReqHandle,
+ const TInt aIpc,
+ const TDataPackage& aPackage )
+ {
+ TInt ret( KErrNotSupported );
+
+ switch ( aIpc )
+ {
+ case ECustomSendAPDUReqIPC:
+ ret = SendAPDUReqL( aTsyReqHandle, aPackage.Des1n(),
+ aPackage.Des2n() );
+ break;
+ case ECustomGetATRIPC:
+ ret = GetATRL( aTsyReqHandle, aPackage.Des1n() );
+ break;
+ case ECustomSimWarmResetIPC:
+ ret = SimWarmResetL( aTsyReqHandle );
+ break;
+ case ECustomGetSimCardReaderStatusIPC:
+ ret = GetSimCardReaderStatusL( aTsyReqHandle, REINTERPRET_CAST(
+ RMmCustomAPI::TSimCardReaderStatus*, aPackage.Ptr1() ) );
+ break;
+ case ECustomNotifySimCardStatusIPC:
+ ret = NotifySimCardStatus( aTsyReqHandle, REINTERPRET_CAST(
+ RMmCustomAPI::TSIMCardStatus*, aPackage.Ptr1() ) );
+ break;
+ case ECustomSendAPDUReqV2IPC:
+ ret = SendAPDUReqV2L( aTsyReqHandle, REINTERPRET_CAST(
+ RMmCustomAPI::TApduParameters*, aPackage.Ptr1() ) );
+ break;
+ case ECustomPowerSimOnIPC:
+ ret = PowerSimOnL( aTsyReqHandle );
+ break;
+ case ECustomPowerSimOffIPC:
+ ret = PowerSimOffL( aTsyReqHandle );
+ break;
+ default:
+ ret = KErrNotSupported;
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::ReqModeL
+// Returns request mode for given IPC. Leaves with error code KErrNotSupported
+// if the IPC number does not belong to some of the WIM-related API functions.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTelObject::TReqMode CMmWimTsy::ReqModeL(
+ const TInt aIpc )
+ {
+ CTelObject::TReqMode ret=0;
+
+ switch ( aIpc )
+ {
+ case ECustomSendAPDUReqIPC:
+ // Custom TSY has its own flow control and allows several
+ // simultaneous requests.
+ ret = KReqModeMultipleCompletionEnabled;
+ break;
+ case ECustomNotifySimCardStatusIPC:
+ ret = KReqModeRePostImmediately |
+ KReqModeMultipleCompletionEnabled;
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::NumberOfSlotsL
+// Returns number of slots to be used for given IPC. Leaves with error code
+// KErrNotSupported if the IPC number does not belong to some of the
+// WIM-related API functions.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmWimTsy::NumberOfSlotsL(
+ const TInt aIpc )
+ {
+ TInt numberOfSlots = KMmCustomDefaultSlots;
+
+ switch ( aIpc )
+ {
+ case ECustomSendAPDUReqIPC:
+ break;
+ case ECustomNotifySimCardStatusIPC:
+ break;
+ default:
+ // Unknown or invalid IPC
+ User::Leave( KErrNotSupported );
+ break;
+ }
+
+ return numberOfSlots;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::CancelService
+// When the clients close their sub-sessions (eg. by calling RPhone::Close),
+// they may not have cancelled all their outstanding asynchronous requests
+// before closing. It is up to the ETel server to clean up in this situation,
+// so the server will find the list of outstanding requests related to that
+// sub-session object and pass these outstanding IPC request numbers, one at
+// a time, to the CancelService function in the TSY.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmWimTsy::CancelService(
+ const TInt aIpc,
+ const TTsyReqHandle aTsyReqHandle )
+ {
+ TInt ret( KErrGeneral );
+
+ switch ( aIpc )
+ {
+ case ECustomSendAPDUReqIPC:
+ ret = SendAPDUReqCancel( aTsyReqHandle );
+ break;
+ case ECustomGetATRIPC:
+ ret = GetATRCancel();
+ break;
+ case ECustomSimWarmResetIPC:
+ ret = SimWarmResetCancel();
+ break;
+ case ECustomGetSimCardReaderStatusIPC:
+ ret = GetSimCardReaderStatusCancel();
+ break;
+ case ECustomNotifySimCardStatusIPC:
+ ret = NotifySimCardStatusCancel();
+ break;
+ case ECustomSendAPDUReqV2IPC:
+ ret = SendAPDUReqV2Cancel();
+ break;
+ case ECustomPowerSimOnIPC:
+ ret = PowerSimOnCancel();
+ break;
+ case ECustomPowerSimOffIPC:
+ ret = PowerSimOffCancel();
+ break;
+ default:
+ ret = KErrGeneral;
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::SendAPDUReqL
+// Send APDU request to DOS.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmWimTsy::SendAPDUReqL(
+ const TTsyReqHandle aTsyReqHandle,
+ TDes8* aInfo,
+ TDes8* aData )
+ {
+ TInt ret ( KErrNone );
+
+ // This is originally a TApdu in the API
+ RMmCustomAPI::TApdu apduReq;
+ apduReq.iInfo = aInfo;
+ apduReq.iData = aData;
+
+ // call DOS, packed parameter: a RMmCustomAPI::TApdu
+ CMmDataPackage dataPackage;
+ dataPackage.PackData( &apduReq );
+ ret = iMmCustomTsy->Phone()->MessageManager()->HandleRequestL(
+ ECustomSendAPDUReqIPC, &dataPackage );
+
+ if ( KErrNone == ret )
+ {
+ // save pointer to client for response data
+ iRetApduInfo = aInfo;
+ iRetApduData = aData;
+
+#ifdef REQHANDLE_TIMER
+ SetTypeOfResponse( EWIMRequestTypeSendAPDUReq, aTsyReqHandle );
+#else
+ iTsyReqHandleStore->SetTsyReqHandle(
+ EWIMRequestTypeSendAPDUReq, aTsyReqHandle );
+#endif // REQHANDLE_TIMER
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::CompleteSendAPDUReq
+// Completes a Send APDU request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+#ifndef USING_CTSY_DISPATCHER
+void CMmWimTsy::CompleteSendAPDUReq(
+ CMmDataPackage* aDataPackage,
+ TInt aError )
+ {
+ // Complete request
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EWIMRequestTypeSendAPDUReq );
+
+ if( reqHandle )
+ {
+ if ( KErrNone == aError )
+ {
+ //unpack the data
+ TPtrC8* info = NULL;
+ TPtrC8* data = NULL;
+
+ aDataPackage->UnPackData( &info, &data );
+ // request was successful, copy data to client side
+ if ( iRetApduInfo && info )
+ {
+ iRetApduInfo->Copy( info->Ptr(), info->Length() );
+ }
+
+ if ( iRetApduData && data )
+ {
+ iRetApduData->Copy( data->Ptr(), data->Length() );
+ }
+ }
+ iMmCustomTsy->ReqCompleted( reqHandle, aError );
+ }
+ }
+#endif //USING_CTSY_DISPATCHER
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::SendAPDUReqCancel
+// Cancel outstanding Send APDU request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmWimTsy::SendAPDUReqCancel(
+ TTsyReqHandle aTsyReqHandle )
+ {
+ // reset the reqhandle
+ iTsyReqHandleStore->ResetTsyReqHandle(
+ EWIMRequestTypeSendAPDUReq );
+
+ // reset return pointers
+ iRetApduInfo = NULL;
+ iRetApduData = NULL;
+
+ // complete
+ iMmCustomTsy->ReqCompleted( aTsyReqHandle, KErrCancel );
+
+ return KErrNone;
+ }
+
+#ifdef REQHANDLE_TIMER
+// ---------------------------------------------------------------------------
+// CMmWimTsy::SetTypeOfResponse
+// Sets the type of response for a given handle. Automatic mode includes an
+// automatic response in case of non response from the DOS in a specified time.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmWimTsy::SetTypeOfResponse(
+ const TInt aReqHandleType,
+ const TTsyReqHandle aTsyReqHandle )
+ {
+ TInt timeOut( 0 );
+ TInt ipc( 0 );
+
+ switch ( aReqHandleType )
+ {
+ case EWIMRequestTypeSendAPDUReq:
+ timeOut = KMmSendAPDUTimeOut;
+ ipc = ECustomSendAPDUReqIPC;
+ break;
+ case EWIMRequestTypeSimWarmReset:
+ timeOut = KMmSimWarmResetTimeOut;
+ ipc = ECustomSimWarmResetIPC;
+ break;
+ case EWIMRequestTypeGetATR:
+ timeOut = KMmGetATRTimeOut;
+ ipc = ECustomGetATRIPC;
+ break;
+ case EWIMRequestTypeGetSimCardReaderStatus:
+ timeOut = KMmGetSimCardReaderStatusTimeOut;
+ ipc = ECustomGetSimCardReaderStatusIPC;
+ break;
+ case EWIMRequestTypeSendAPDUReqV2:
+ timeOut = KMmSendAPDUV2TimeOut;
+ ipc = ECustomSendAPDUReqV2IPC;
+ break;
+ case EWIMRequestTypePowerSimOn:
+ timeOut = KMmPowerSimOnTimeOut;
+ ipc = ECustomPowerSimOnIPC;
+ break;
+ case EWIMRequestTypePowerSimOff:
+ timeOut = KMmPowerSimOffTimeOut;
+ ipc = ECustomPowerSimOffIPC;
+ break;
+ default:
+ // Does not use timer
+ break;
+ }
+
+ if ( 0 < timeOut )
+ {
+ // The timeout parameter is given in seconds.
+ iTsyReqHandleStore->SetTsyReqHandle( aReqHandleType, aTsyReqHandle,
+ timeOut, ipc );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::Complete
+// Completes the request due the timer expiration.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmWimTsy::Complete(
+ TInt aReqHandleType,
+ TInt aError )
+ {
+TFLOGSTRING3( "CustomTSY: CMmWimTsy::Complete.\n\t ReqHandleType:%d \n\t Error:%d\n", aReqHandleType, aError );
+ iMmCustomTsy->ReqCompleted( iTsyReqHandleStore->ResetTsyReqHandle(
+ aReqHandleType ), aError );
+ }
+#endif // REQHANDLE_TIMER
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::GetATRL
+// Send GetATR request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmWimTsy::GetATRL(
+ const TTsyReqHandle aTsyReqHandle,
+ TDes8 *aATR )
+ {
+TFLOGSTRING( "TSY: CMmWimTsy::GetATRL" );
+
+ TTsyReqHandle getAtrHandle = iTsyReqHandleStore->
+ GetTsyReqHandle( EWIMRequestTypeGetATR );
+
+ if ( 0 < getAtrHandle )
+ {
+ // The request is already in processing because of previous request
+ // Complete request with status value informing the client about
+ // the situation.
+TFLOGSTRING( "TSY: CMmWimTsy::GetATRL - KErrServerBusy" );
+ iMmCustomTsy->ReqCompleted( aTsyReqHandle, KErrServerBusy );
+ }
+ else
+ {
+ // save pointer to client for response data
+ iAnswerToReset = aATR;
+
+ // Call DOS, packed parameter: aATR
+ CMmDataPackage dataPackage;
+ dataPackage.PackData( &aATR );
+ TInt ret = iMmCustomTsy->Phone()->MessageManager()->HandleRequestL(
+ ECustomGetATRIPC, &dataPackage );
+
+ // check the return value of the call to DOS
+ if ( KErrNone != ret )
+ {
+ iMmCustomTsy->ReqCompleted( aTsyReqHandle, ret );
+ }
+ else
+ {
+#ifdef REQHANDLE_TIMER
+ SetTypeOfResponse( EWIMRequestTypeGetATR, aTsyReqHandle );
+#else
+ iTsyReqHandleStore->SetTsyReqHandle(
+ EWIMRequestTypeGetATR, aTsyReqHandle );
+#endif
+ }
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::CompleteGetATR
+// Completes a GetATR request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmWimTsy::CompleteGetATR(
+ TPtrC8& aData,
+ TInt aError )
+ {
+TFLOGSTRING( "TSY: CMmWimTsy::CompleteGetATR ");
+ // reset the reqhandle
+ TTsyReqHandle tsyReqHandle =
+ iTsyReqHandleStore->ResetTsyReqHandle( EWIMRequestTypeGetATR );
+
+ // Check the reqHandle
+ if ( EWIMTsyReqHandleUnknown != tsyReqHandle )
+ {
+ // request was successful, copy data to client side
+ if ( KErrNone == aError )
+ {
+ //check the size....
+ if ( (*iAnswerToReset).MaxLength() >= aData.Length() )
+ {
+ (*iAnswerToReset).Copy( aData );
+ }
+ else // data is too big for client's buffer
+ {
+ aError = KErrOverflow;
+ }
+ }
+ iAnswerToReset = NULL;
+ iMmCustomTsy->ReqCompleted( tsyReqHandle, aError );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::GetATRCancel
+// Cancels an outstanding GetATR request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmWimTsy::GetATRCancel()
+ {
+TFLOGSTRING( "CMmWimTsy::GetATRCancel" );
+ // reset the reqhandle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EWIMRequestTypeGetATR );
+
+ // reset pointer to client data
+ iAnswerToReset = NULL;
+
+ if( EWIMTsyReqHandleUnknown != reqHandle )
+ {
+ // complete
+ iMmCustomTsy->ReqCompleted( reqHandle, KErrCancel );
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::SimWarmResetL
+// Send SimWarmReset request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmWimTsy::SimWarmResetL(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+TFLOGSTRING( "CMmWimTsy::SimWarmResetL");
+ TTsyReqHandle simWarmResetHandle =
+ iTsyReqHandleStore->GetTsyReqHandle( EWIMRequestTypeSimWarmReset );
+
+ if ( 0 < simWarmResetHandle )
+ {
+ // The request is already in processing because of previous request
+ // Complete request with status value informing the client about
+ // the situation.
+TFLOGSTRING( "TSY: CMmWimTsy::SimWarmResetL - KErrServerBusy" );
+ iMmCustomTsy->ReqCompleted( aTsyReqHandle, KErrServerBusy );
+ }
+ else
+ {
+ TInt ret = iMmCustomTsy->Phone()->MessageManager()->HandleRequestL(
+ ECustomSimWarmResetIPC );
+
+ // check the return value of the call to DOS
+ if ( KErrNone != ret )
+ {
+ iMmCustomTsy->ReqCompleted( aTsyReqHandle, ret );
+ }
+ else
+ {
+#ifdef REQHANDLE_TIMER
+ SetTypeOfResponse( EWIMRequestTypeSimWarmReset, aTsyReqHandle );
+#else
+ iTsyReqHandleStore->SetTsyReqHandle(
+ EWIMRequestTypeSimWarmReset, aTsyReqHandle );
+#endif
+ }
+ }
+
+ return KErrNone;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::CompleteSimWarmReset
+// Completes a SimWarmReset request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmWimTsy::CompleteSimWarmReset(
+ TInt aError )
+ {
+TFLOGSTRING( "CMmWimTsy::CompleteSimWarmReset" );
+
+ // reset the reqhandle
+ TTsyReqHandle tsyReqHandle =
+ iTsyReqHandleStore->ResetTsyReqHandle( EWIMRequestTypeSimWarmReset );
+
+ if ( EWIMTsyReqHandleUnknown != tsyReqHandle )
+ {
+ // Complete request
+ iMmCustomTsy->ReqCompleted( tsyReqHandle, aError );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::SimWarmResetCancel
+// Cancels an outstanding SimWarmReset request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmWimTsy::SimWarmResetCancel()
+ {
+TFLOGSTRING( "TSY: CMmWimTsy::SimWarmResetCancel" );
+ // reset the reqhandle
+ TTsyReqHandle reqHandle =
+ iTsyReqHandleStore->ResetTsyReqHandle( EWIMRequestTypeSimWarmReset );
+
+ if( EWIMTsyReqHandleUnknown != reqHandle )
+ {
+ // complete
+ iMmCustomTsy->ReqCompleted( reqHandle, KErrCancel );
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::GetSimCardReaderStatusL
+// Send GetSimCardReaderStatus request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmWimTsy::GetSimCardReaderStatusL(
+ const TTsyReqHandle aTsyReqHandle,
+ RMmCustomAPI::TSimCardReaderStatus* aSimCardReaderStatus )
+ {
+TFLOGSTRING( "TSY: CMmWimTsy::GetSimCardReaderStatusL" );
+ TTsyReqHandle getSimCardReaderStatusHandle =
+ iTsyReqHandleStore->GetTsyReqHandle(
+ EWIMRequestTypeGetSimCardReaderStatus );
+
+ if ( 0 < getSimCardReaderStatusHandle )
+ {
+ // The request is already in processing because of previous request
+ // Complete request with status value informing the client about
+ // the situation.
+TFLOGSTRING( "TSY: CMmWimTsy::GetSimCardReaderStatusL - KErrServerBusy" );
+ iMmCustomTsy->ReqCompleted( aTsyReqHandle, KErrServerBusy );
+ }
+ else
+ {
+ // call DOS, packed parameter: aSimCardReaderStatus
+ CMmDataPackage dataPackage;
+ dataPackage.PackData( &aSimCardReaderStatus );
+ TInt ret = iMmCustomTsy->Phone()->MessageManager()->HandleRequestL(
+ ECustomGetSimCardReaderStatusIPC, &dataPackage );
+
+ // check the return value of the call to DOS
+ if ( KErrNone != ret )
+ {
+ iMmCustomTsy->ReqCompleted( aTsyReqHandle, ret );
+ }
+ else
+ {
+ // save pointer to client for response data
+ iSimCardReaderStatus = aSimCardReaderStatus;
+#ifdef REQHANDLE_TIMER
+ SetTypeOfResponse( EWIMRequestTypeGetSimCardReaderStatus,
+ aTsyReqHandle );
+#else
+ iTsyReqHandleStore->SetTsyReqHandle(
+ EWIMRequestTypeGetSimCardReaderStatus, aTsyReqHandle );
+#endif
+ }
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::CompleteGetSimCardReaderStatus
+// Completes a GetSimCardReaderStatus request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmWimTsy::CompleteGetSimCardReaderStatus(
+ TPtrC8& aData,
+ TInt aError )
+ {
+TFLOGSTRING( "CMmWimTsy::CompleteGetSimCardReaderStatus" );
+ // reset the reqhandle
+ TTsyReqHandle tsyReqHandle =
+ iTsyReqHandleStore->ResetTsyReqHandle(
+ EWIMRequestTypeGetSimCardReaderStatus );
+
+ // check the handle and complete
+ if ( EWIMTsyReqHandleUnknown != tsyReqHandle )
+ {
+ if(KErrNone == aError)
+ {
+ // Copy the data
+ if ( 0 < aData.Length() )
+ {
+ iSimCardReaderStatus->SetStatus( aData[0] );
+ }
+ else
+ {
+ // There was no data, set status to zero
+ iSimCardReaderStatus->SetStatus( 0 );
+ }
+ }
+ iSimCardReaderStatus = NULL;
+ iMmCustomTsy->ReqCompleted( tsyReqHandle, aError );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::GetSimCardReaderStatusCancel
+// Cancels an outstanding GetSimCardReaderStatus request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmWimTsy::GetSimCardReaderStatusCancel()
+ {
+TFLOGSTRING( "TSY: CMmWimTsy::GetSimCardReaderStatusCancel" );
+ // reset the reqhandle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EWIMRequestTypeGetSimCardReaderStatus );
+
+ // reset pointer to client data
+ iSimCardReaderStatus = NULL;
+
+ if( EWIMTsyReqHandleUnknown != reqHandle )
+ {
+ // complete
+ iMmCustomTsy->ReqCompleted( reqHandle, KErrCancel );
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::NotifySimCardStatus
+// Notifies a client of physical status change of SIM.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmWimTsy::NotifySimCardStatus(
+ const TTsyReqHandle aTsyReqHandle,
+ RMmCustomAPI::TSIMCardStatus* aCardStatus )
+ {
+TFLOGSTRING( "TSY: CMmWimTsy::NotifySimCardStatus" );
+ if ( NULL != aCardStatus )
+ {
+ // save pointer to client for response data
+ iNotifiedSimCardStatus = aCardStatus;
+
+ iTsyReqHandleStore->SetTsyReqHandle(
+ EWIMRequestTypeNotifySimCardStatus, aTsyReqHandle );
+
+ return KErrNone;
+ }
+
+ return KErrArgument;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::CompleteNotifySimCardStatus
+// Completes a NotifySimCardStatus method.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmWimTsy::CompleteNotifySimCardStatus(
+ RMmCustomAPI::TSIMCardStatus aCardStatus )
+ {
+TFLOGSTRING( "CMmWimTsy::CompleteNotifySimCardStatus" );
+ // reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EWIMRequestTypeNotifySimCardStatus );
+
+ // check the handle and complete
+ if ( EWIMTsyReqHandleUnknown != reqHandle )
+ {
+ // Copy the data
+ if ( NULL != iNotifiedSimCardStatus )
+ {
+ *iNotifiedSimCardStatus = aCardStatus;
+ iNotifiedSimCardStatus = NULL;
+ }
+ iMmCustomTsy->ReqCompleted( reqHandle, KErrNone );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::NotifySimCardStatusCancel
+// Cancels an outstanding NotifySimCardStatus request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmWimTsy::NotifySimCardStatusCancel()
+ {
+TFLOGSTRING( "TSY: CMmWimTsy::NotifySimCardStatusCancel" );
+ // reset pointer to client data
+ iNotifiedSimCardStatus = NULL;
+
+ // reset reqhandle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EWIMRequestTypeNotifySimCardStatus );
+
+ if( EWIMTsyReqHandleUnknown != reqHandle )
+ {
+ // complete with KErrCancel
+ iMmCustomTsy->ReqCompleted( reqHandle, KErrCancel );
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::SendAPDUReqV2L
+// Send APDU request to APDU server.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmWimTsy::SendAPDUReqV2L(
+ const TTsyReqHandle aTsyReqHandle,
+ RMmCustomAPI::TApduParameters* aApduParameters )
+ {
+TFLOGSTRING( "TSY: CMmWimTsy::SendAPDUReqV2L" );
+ TTsyReqHandle sendApduReqV2Handle =
+ iTsyReqHandleStore->GetTsyReqHandle( EWIMRequestTypeSendAPDUReqV2 );
+ TInt ret = KErrNone;
+
+ if ( 0 < sendApduReqV2Handle )
+ {
+ // The request is already in processing because of previous request
+ // Complete request with status value informing the client about
+ // the situation.
+TFLOGSTRING( "TSY: CMmWimTsy::SendAPDUReqV2L - KErrServerBusy" );
+ iMmCustomTsy->ReqCompleted( aTsyReqHandle, KErrServerBusy );
+ return ret;
+ }
+ else
+ {
+ // call DOS, packed parameter: aData
+ CMmDataPackage dataPackage;
+ dataPackage.PackData( &aApduParameters );
+ ret = iMmCustomTsy->Phone()->MessageManager()->HandleRequestL(
+ ECustomSendAPDUReqV2IPC, &dataPackage );
+ // check result
+ if ( KErrNone == ret )
+ {
+ // save pointer to client for response data
+ iApduParameters = aApduParameters;
+#ifdef REQHANDLE_TIMER
+ SetTypeOfResponse( EWIMRequestTypeSendAPDUReqV2, aTsyReqHandle );
+#else
+ iTsyReqHandleStore->SetTsyReqHandle(
+ EWIMRequestTypeSendAPDUReqV2, aTsyReqHandle );
+#endif
+ }
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::CompleteSendAPDUReqV2
+// Completes a Send APDU request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmWimTsy::CompleteSendAPDUReqV2(
+ TPtrC8 &aData,
+ TInt aError )
+ {
+TFLOGSTRING( "TSY: CMmWimTsy::CompleteSendAPDUReqV2" );
+ // reset the reqhandle
+ TTsyReqHandle tsyReqHandle =
+ iTsyReqHandleStore->ResetTsyReqHandle( EWIMRequestTypeSendAPDUReqV2 );
+
+ // check the handle and complete
+ if ( EWIMTsyReqHandleUnknown != tsyReqHandle )
+ {
+ // request was successful, copy data to client side
+ if ( KErrNone == aError )
+ {
+ // check the size....
+ if ( iApduParameters->iRspData.MaxLength() >= aData.Length())
+ {
+ iApduParameters->iRspData.Copy( aData);
+ }
+ else // data is too big for client's buffer
+ {
+ aError = KErrOverflow;
+ }
+ }
+ iApduParameters = NULL;
+ iMmCustomTsy->ReqCompleted( tsyReqHandle, aError );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::SendAPDUReqV2Cancel
+// Cancels an outstanding Send APDU request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmWimTsy::SendAPDUReqV2Cancel()
+ {
+TFLOGSTRING( "TSY: CMmWimTsy::SendAPDUReqV2Cancel" );
+ // reset the reqhandle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EWIMRequestTypeSendAPDUReqV2 );
+
+ // reset return pointer
+ iApduParameters = NULL;
+
+ if( EWIMTsyReqHandleUnknown != reqHandle )
+ {
+ // complete
+ iMmCustomTsy->ReqCompleted( reqHandle, KErrCancel );
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::PowerSimOnL
+// Send PowerSimOn request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmWimTsy::PowerSimOnL(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+TFLOGSTRING( "TSY: CMmWimTsy::PowerSimOnL" );
+ TTsyReqHandle powerSimOnHandle =
+ iTsyReqHandleStore->GetTsyReqHandle( EWIMRequestTypePowerSimOn );
+
+ if ( 0 < powerSimOnHandle )
+ {
+ // The request is already in processing because of previous request
+ // Complete request with status value informing the client about
+ // the situation.
+TFLOGSTRING( "TSY: CMmWimTsy::PowerSimOnL - KErrServerBusy" );
+ iMmCustomTsy->ReqCompleted( aTsyReqHandle, KErrServerBusy );
+ }
+ else
+ {
+ TInt ret = iMmCustomTsy->Phone()->MessageManager()->HandleRequestL(
+ ECustomPowerSimOnIPC );
+
+ // check the return value of the call to DOS
+ if ( KErrNone != ret )
+ {
+ iMmCustomTsy->ReqCompleted( aTsyReqHandle, ret );
+ }
+ else
+ {
+#ifdef REQHANDLE_TIMER
+ SetTypeOfResponse( EWIMRequestTypePowerSimOn, aTsyReqHandle );
+#else
+ iTsyReqHandleStore->SetTsyReqHandle(
+ EWIMRequestTypePowerSimOn, aTsyReqHandle );
+#endif
+ }
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::CompletePowerSimOn
+// Completes a PowerSimOn request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmWimTsy::CompletePowerSimOn(
+ TInt aError )
+ {
+TFLOGSTRING( "TSY: CMmWimTsy::CompletePowerSimOn" );
+ // reset the reqhandle
+ TTsyReqHandle tsyReqHandle =
+ iTsyReqHandleStore->ResetTsyReqHandle( EWIMRequestTypePowerSimOn );
+
+ if ( EWIMTsyReqHandleUnknown != tsyReqHandle )
+ {
+ // Complete request
+ iMmCustomTsy->ReqCompleted( tsyReqHandle, aError );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::PowerSimOnCancel
+// Cancels an outstanding PowerSimOn request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmWimTsy::PowerSimOnCancel()
+ {
+TFLOGSTRING( "TSY: CMmWimTsy::PowerSimOnCancel" );
+ // reset the reqhandle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EWIMRequestTypePowerSimOn );
+
+ if( EWIMTsyReqHandleUnknown != reqHandle )
+ {
+ // complete
+ iMmCustomTsy->ReqCompleted( reqHandle, KErrCancel );
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::PowerSimOffL
+// Send PowerSimOff request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmWimTsy::PowerSimOffL(
+ const TTsyReqHandle aTsyReqHandle )
+ {
+TFLOGSTRING( "TSY: CMmWimTsy::PowerSimOffL" );
+ TTsyReqHandle powerSimOffHandle =
+ iTsyReqHandleStore->GetTsyReqHandle( EWIMRequestTypePowerSimOff );
+
+ if ( 0 < powerSimOffHandle )
+ {
+ // The request is already in processing because of previous request
+ // Complete request with status value informing the client about
+ // the situation.
+TFLOGSTRING( "TSY: CMmWimTsy::PowerSimOffL - KErrServerBusy" );
+ iMmCustomTsy->ReqCompleted( aTsyReqHandle, KErrServerBusy );
+ }
+ else
+ {
+ TInt ret = iMmCustomTsy->Phone()->MessageManager()->HandleRequestL(
+ ECustomPowerSimOffIPC );
+
+ // check the return value of the call to DOS
+ if ( KErrNone != ret )
+ {
+ iMmCustomTsy->ReqCompleted( aTsyReqHandle, ret );
+ }
+ else
+ {
+#ifdef REQHANDLE_TIMER
+ SetTypeOfResponse( EWIMRequestTypePowerSimOff, aTsyReqHandle );
+#else
+ iTsyReqHandleStore->SetTsyReqHandle(
+ EWIMRequestTypePowerSimOff, aTsyReqHandle );
+#endif
+ }
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::CompletePowerSimOff
+// Completes a PowerSimOff request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmWimTsy::CompletePowerSimOff(
+ TInt aError )
+ {
+TFLOGSTRING( "TSY: CMmWimTsy::CompletePowerSimOff" );
+ // reset the reqhandle
+ TTsyReqHandle tsyReqHandle =
+ iTsyReqHandleStore->ResetTsyReqHandle( EWIMRequestTypePowerSimOff );
+
+ if ( EWIMTsyReqHandleUnknown != tsyReqHandle )
+ {
+ // Complete request
+ iMmCustomTsy->ReqCompleted( tsyReqHandle, aError );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmWimTsy::PowerSimOffCancel
+// Cancels an outstanding PowerSimOff request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmWimTsy::PowerSimOffCancel()
+ {
+TFLOGSTRING( "TSY: CMmWimTsy::PowerSimOffCancel" );
+ // reset the reqhandle
+ TTsyReqHandle reqHandle =
+ iTsyReqHandleStore->ResetTsyReqHandle( EWIMRequestTypePowerSimOff );
+
+ if( EWIMTsyReqHandleUnknown != reqHandle )
+ {
+ // complete
+ iMmCustomTsy->ReqCompleted( reqHandle, KErrCancel );
+ }
+
+ return KErrNone;
+ }
+
+// End of File
+