telephonyserverplugins/common_tsy/commontsy/src/mmcustomtsy/CMmWimTsy.cpp
changeset 0 3553901f7fa8
child 19 630d2f34d719
--- /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
+