telephonyserverplugins/common_tsy/commontsy/src/mmcustomtsy/CMmWimTsy.cpp
branchopencode
changeset 24 6638e7f4bd8f
parent 0 3553901f7fa8
--- a/telephonyserverplugins/common_tsy/commontsy/src/mmcustomtsy/CMmWimTsy.cpp	Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/common_tsy/commontsy/src/mmcustomtsy/CMmWimTsy.cpp	Thu May 06 15:10:38 2010 +0100
@@ -1,1194 +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
-
+// 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
+