wim/WimServer/src/WimCallbackImpl.cpp
changeset 0 164170e6151a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wim/WimServer/src/WimCallbackImpl.cpp	Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,758 @@
+/*
+* Copyright (c) 2003 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:  This file contain the implementation of CWimCallBack class.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include    "WimCallbackImpl.h"
+#include    "WimSession.h"
+#include    "WimServer.h"
+#include    "WimResponse.h"
+#include    "WimApduImpl.h"
+#include    "WimSimFileHandler.h"
+#include    "WimUtilityFuncs.h"
+#include    "WimConsts.h"
+#include    "WimTrace.h"
+#include    <x509cert.h>
+
+// These variables are static because static function calls from WIMI
+static CWimApdu* gApdu = NULL;
+static CWimSimFileHandler* gSimFileHandler = NULL;
+static TRequestStatus* gStatus = NULL;
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CWimCallBack::InitOkResp
+// Respond to InitOK operation
+// -----------------------------------------------------------------------------
+//
+void CWimCallBack::InitOkResp( WIMI_STAT aStatus )
+    {
+    _WIMTRACE2(_L("WIM|WIMServer|CWimCallBack::InitOkResp|Begin aStatus=%d"), aStatus);
+    CWimServer::iWimStatus = CWimUtilityFuncs::MapWIMError( aStatus );   
+    
+    if ( aStatus == WIMI_Ok )
+        {
+        CWimServer::SetWimInitialized( ETrue, KErrNone ); // WIM has initialized
+        _WIMTRACE(_L("WIM|WIMServer|CWimCallBack::InitOkResp|Initialized=True"));
+        }
+    else
+        {
+        if( aStatus == WIMI_ERR_UserCancelled )
+	        {
+	        CWimServer::iWimStatus = KErrCancel;
+	        CWimServer::SetWimInitialized( EFalse, KErrCancel );
+            WIMI_CloseDownReq();
+	        }
+        else
+	        {
+	        CWimServer::SetWimInitialized( EFalse, CWimServer::iWimStatus ); // WIM has not initialized	
+            WIMI_CloseDownReq();
+	        }
+        
+        _WIMTRACE(_L("WIM|WIMServer|CWimCallBack::InitOkResp|Initialized=False"));
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CWimCallBack::CloseDownResp
+// Respond to CloseDown operation
+// -----------------------------------------------------------------------------
+//
+void CWimCallBack::CloseDownResp( WIMI_STAT aStatus )
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::CloseDownResp | Begin"));
+    CWimServer::iWimStatus = CWimUtilityFuncs::MapWIMError( aStatus );
+    CWimServer::SetWimInitialized( EFalse, CWimServer::iWimStatus ); // WIM has not initialized
+    delete gSimFileHandler; // Close connection to CustomAPI
+    gSimFileHandler = NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CWimCallBack::CompleteResponse
+// Complete response
+// -----------------------------------------------------------------------------
+//
+void CWimCallBack::CompleteResponse(
+    WIMI_TransactId_t aTrId,
+    WIMI_STAT aStatus )
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::CompleteResponse | Begin"));
+    TWimReqTrId* trIdType = ( TWimReqTrId* )aTrId;
+    CWimResponse* pTrId = ( CWimResponse* )( trIdType->iReqTrId );
+    pTrId->iStatus = aStatus;
+    pTrId->CompleteMsgAndDelete();
+    delete trIdType;
+    }
+
+/* ------------ Digital signature ------------------------------------------- */
+
+// -----------------------------------------------------------------------------
+// CWimCallBack::SetSignTextRequestStatus
+// Set RequestStatus of SignTextHandler
+// -----------------------------------------------------------------------------
+//
+void CWimCallBack::SetSignTextRequestStatus( TRequestStatus* aStatus )
+    {
+    gStatus = aStatus;
+    }
+
+// -----------------------------------------------------------------------------
+// CWimCallBack::SignResp
+// Respond to the digital signature operation
+// -----------------------------------------------------------------------------
+//
+void CWimCallBack::SignResp(
+    WIMI_TransactId_t aTrId, 
+    WIMI_STAT aStatus,
+    TUint8 aSignLen,
+    TUint8* aSign )
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::SignResp | Begin"));
+
+    TWimReqTrId* trIdType = ( TWimReqTrId* )aTrId;
+    CWimResponse* trId = ( CWimResponse* )( trIdType->iReqTrId );
+    trId->iStatus = aStatus;
+
+    // In case PIN was incorrect try ask PIN again, don't complete message
+    // If PIN is blocked show note and don't complete message yet.
+    if ( aStatus != WIMI_ERR_BadPIN && aStatus != WIMI_ERR_PINBlocked && aStatus != WIMI_ERR_CardIOError )
+        {
+        if ( trId->iStatus == WIMI_Ok )
+            {
+            TRAP( trId->iError, SignRespL( trId, aSignLen, aSign ) );
+            }
+        WIMI_Ref_pt pWimRefTemp = NULL;
+        pWimRefTemp = WIMI_GetWIMRef( 0 );
+        if ( pWimRefTemp )  // Close the WIM
+            {
+            WIMI_CloseWIM( pWimRefTemp );
+            free_WIMI_Ref_t( pWimRefTemp );
+            }
+        trId->CompleteMsgAndDelete(); 
+        delete trIdType;
+        }
+
+    // Complete SignTextHandler status
+    if ( gStatus )
+        {
+        User::RequestComplete( gStatus, aStatus );
+        }
+    else // SignTextHandler not active, complete message with error if not done
+        {
+        if ( aStatus == WIMI_ERR_BadPIN || aStatus == WIMI_ERR_PINBlocked || aStatus == WIMI_ERR_CardIOError )
+            {
+            trId->CompleteMsgAndDelete();
+            delete trIdType;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CWimCallBack::SignRespL
+// Write signed text to client memory. Signature allocated in WIMI is freed 
+// also by WIMI.
+// -----------------------------------------------------------------------------
+//
+void CWimCallBack::SignRespL(
+    CWimResponse* aTrId,
+    TUint8 aSignLen,
+    TUint8* aSign )
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::SignRespL | Begin"));
+
+    RMessage2& message = aTrId->iMessage;
+
+    TPtr8 signaturePtr( aSign, aSignLen, aSignLen );
+
+    message.WriteL( 3, signaturePtr );
+    }
+
+/* ------------ Certificate management -------------------------------------- */
+
+// -----------------------------------------------------------------------------
+// CWimCallBack::CertificateResp
+// Respond to Certificate fetch operation
+// -----------------------------------------------------------------------------
+//
+void CWimCallBack::CertificateResp( 
+    WIMI_TransactId_t aTrId,
+    WIMI_STAT aStatus,
+    WIMI_Ref_t* aCertRef,
+    TUint16 aCertlen,
+    TUint8* aCert )
+    {
+    if ( aTrId )
+    	{
+        _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::CertificateResp | Begin"));
+        TWimReqTrId* trIdType = ( TWimReqTrId* )aTrId;
+        CWimResponse* pTrId = ( CWimResponse* )( trIdType->iReqTrId );
+        pTrId->iStatus = aStatus;
+        if ( pTrId->iStatus == WIMI_Ok)
+            {
+            TRAP( pTrId->iError,
+                CertificateRespL( pTrId, aStatus, aCertRef, aCertlen, aCert ) );
+            }
+        pTrId->CompleteMsgAndDelete(); 
+        delete trIdType;
+    	}
+    else
+    	{
+    	_WIMTRACE(_L("WIM | WIMServer | CWimCallBack::CertificateResp | certhandler starts this"));
+    	if ( gStatus )
+	        {
+	        TPtrC8 certPtr( aCert, aCertlen );
+	        CX509Certificate* cert = NULL;
+	        TRAPD( err, cert =  CX509Certificate::NewL( certPtr ) );
+	        _WIMTRACE2(_L("WIM | WIMServer | CWimCallBack::CertificateResp | x509 err %d"), err );
+	        User::RequestComplete( gStatus, err );
+	        delete cert;
+	        cert = NULL;
+	        }
+    	}
+    }
+
+// -----------------------------------------------------------------------------
+// CWimCallBack::CertificateRespL
+// Respond to the certificate fetch operation
+// -----------------------------------------------------------------------------
+//
+void CWimCallBack::CertificateRespL(
+    CWimResponse* aTrId,
+    WIMI_STAT /*aStatus*/,
+    WIMI_Ref_t* /*aWimiRef*/,
+    TUint16 aCertLen,
+    TUint8* aCert )
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CertificateRespL | Begin"));
+    _WIMTRACE2(_L("WIM | WIMServer | The length of certificate is %d"), aCertLen);
+    
+    RMessage2& message = aTrId->iMessage;
+        
+    if ( aTrId->iStatus == WIMI_Ok )
+        {
+        TPtr8 certPtr( aCert, aCertLen, aCertLen );
+        message.WriteL( 2, certPtr );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CWimCallBack::CertificateDeleteResp
+// Respond to the certificate delete operation
+// -----------------------------------------------------------------------------
+//
+void CWimCallBack::CertificateDeleteResp( 
+    WIMI_TransactId_t aTrId,
+    WIMI_STAT aStatus )
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::CertificateDeleteResp | Begin"));
+    CompleteResponse( aTrId, aStatus );
+    }
+
+// -----------------------------------------------------------------------------
+// CWimCallBack::CertificateStoreResp
+// Respond to the certificate store operation
+// -----------------------------------------------------------------------------
+//
+void CWimCallBack::CertificateStoreResp(
+    WIMI_TransactId_t aTrId,
+    WIMI_STAT aStatus,
+    WIMI_Ref_t* /*aCertRef*/ )
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::CertificateStoreResp | Begin"));
+    TWimReqTrId* trIdType = ( TWimReqTrId* )aTrId;
+    CWimResponse* pTrId = (CWimResponse*)( trIdType->iReqTrId );
+    pTrId->iStatus = aStatus;
+
+    pTrId->CompleteMsgAndDelete();
+    delete trIdType;
+    }
+
+/* ------------ PIN management ---------------------------------------------- */
+
+// -----------------------------------------------------------------------------
+// CWimCallBack::VerifyPINResp
+// Respond to Verify PIN operation
+// -----------------------------------------------------------------------------
+//
+void CWimCallBack::VerifyPINResp( WIMI_TransactId_t aTrId, WIMI_STAT aStatus )
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::VerifyPINResp | Begin"));
+    if( aTrId )
+	    {
+	    TWimReqTrId* trIdType = ( TWimReqTrId* )aTrId;
+	    CWimResponse* trId = ( CWimResponse* )( trIdType->iReqTrId );
+	    trId->iStatus = aStatus;
+
+	    // In case PIN was incorrect try ask PIN again, don't complete message
+	    // If PIN is blocked show note and don't complete message yet.
+        if ( aStatus != WIMI_ERR_BadPIN && aStatus != WIMI_ERR_PINBlocked && aStatus != WIMI_ERR_CardIOError )
+	        { 	
+	        trId->CompleteMsgAndDelete(); 
+	        delete trIdType;
+	        }
+	        
+	    if ( gStatus )
+	        {
+	        User::RequestComplete( gStatus, aStatus );
+	        }
+	    else // SignTextHandler not active, complete message with error if not done
+	        {
+	        if ( aStatus == WIMI_ERR_BadPIN || aStatus == WIMI_ERR_PINBlocked || aStatus == WIMI_ERR_CardIOError )
+	            {
+	            trId->CompleteMsgAndDelete();
+	            delete trIdType;
+	            }
+	        }
+	    }
+    else
+        {
+    	if ( gStatus )
+	        {
+	        User::RequestComplete( gStatus, CWimUtilityFuncs::MapWIMError( aStatus ) );
+	        }
+        }    	 	
+    }
+    
+
+// -----------------------------------------------------------------------------
+// CWimCallBack::ChangePINResp
+// Respond to Change PIN operation
+// -----------------------------------------------------------------------------
+//
+void CWimCallBack::ChangePINResp( WIMI_TransactId_t aTrId, WIMI_STAT aStatus )
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::ChangePINResp | Begin"));
+
+    TWimReqTrId* trIdType = ( TWimReqTrId* )aTrId;
+    CWimResponse* trId = ( CWimResponse* )( trIdType->iReqTrId );
+    trId->iStatus = aStatus;
+
+    // In case PIN was incorrect try ask PIN again, don't complete message
+    // If PIN is blocked show note and don't complete message yet.
+    if ( aStatus != WIMI_ERR_BadPIN && aStatus != WIMI_ERR_PINBlocked && aStatus != WIMI_ERR_CardIOError )
+        {
+        if( CWimServer::Server()->WimTimer()->TimeRemaining() == 0 )
+            {
+            _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::ChangePINResp | TimeRemaing =0 "));
+            WIMI_Ref_pt pWimRefTemp = NULL;
+            pWimRefTemp = WIMI_GetWIMRef( 0 );
+            if ( pWimRefTemp )  // Close the WIM
+                {
+                WIMI_CloseWIM( pWimRefTemp );
+                free_WIMI_Ref_t( pWimRefTemp );
+                }
+            }    	
+        trId->CompleteMsgAndDelete(); 
+        delete trIdType;
+        }
+    
+     
+    // Complete SignTextHandler status
+    if ( gStatus )
+        {
+        User::RequestComplete( gStatus, aStatus );
+        }
+    else // SignTextHandler not active, complete message with error if not done
+        {
+        if ( aStatus == WIMI_ERR_BadPIN || aStatus == WIMI_ERR_PINBlocked || aStatus == WIMI_ERR_CardIOError )
+            {
+            trId->CompleteMsgAndDelete();
+            delete trIdType;
+            }
+        }
+      _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::ChangePINResp | 10"));   
+    }
+
+// -----------------------------------------------------------------------------
+// CWimCallBack::UnblockPINResp
+// Respond to Unblock PIN operation
+// -----------------------------------------------------------------------------
+//
+void CWimCallBack::UnblockPINResp( WIMI_TransactId_t aTrId, WIMI_STAT aStatus )
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::UnblockPINResp | Begin"));
+
+    TWimReqTrId* trIdType = ( TWimReqTrId* )aTrId;
+    CWimResponse* trId = ( CWimResponse* )( trIdType->iReqTrId );
+    trId->iStatus = aStatus;
+
+    // In case PIN was incorrect try ask PIN again, don't complete message
+    // If PIN is blocked show note and don't complete message yet.
+  
+    if ( aStatus != WIMI_ERR_BadPIN && aStatus != WIMI_ERR_PINBlocked && aStatus != WIMI_ERR_CardIOError )
+        {
+        _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::SignResp | TimeRemaing =0 "));
+        WIMI_Ref_pt pWimRefTemp = NULL;
+        pWimRefTemp = WIMI_GetWIMRef( 0 );
+ 
+        if ( pWimRefTemp )  // Close the WIM
+            {
+            WIMI_CloseWIM( pWimRefTemp );
+            free_WIMI_Ref_t( pWimRefTemp );
+            }
+        
+        //  WIMI_InitializeReq( &CWimServer::Server()->iWimCallBack );
+        
+        trId->CompleteMsgAndDelete(); 
+        delete trIdType;
+        }
+
+    // Complete SignTextHandler status
+    if ( gStatus )
+        {
+        User::RequestComplete( gStatus, aStatus );
+        }
+    else // SignTextHandler not active, complete message with error if not done
+        {
+        if ( aStatus == WIMI_ERR_BadPIN || aStatus == WIMI_ERR_PINBlocked || aStatus == WIMI_ERR_CardIOError )
+            {
+            trId->CompleteMsgAndDelete();
+            delete trIdType;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CWimCallBack::EnablePINResp
+// Respond to Enable PIN Response
+// -----------------------------------------------------------------------------
+//
+void CWimCallBack::EnablePINResp( WIMI_TransactId_t aTrId, WIMI_STAT aStatus )
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::EnablePINResp | Begin"));
+     
+    TWimReqTrId* trIdType = ( TWimReqTrId* )aTrId;
+    CWimResponse* trId = ( CWimResponse* )( trIdType->iReqTrId );
+    trId->iStatus = aStatus;
+
+    // In case PIN was incorrect try ask PIN again, don't complete message
+    // If PIN is blocked show note and don't complete message yet.
+    if ( aStatus != WIMI_ERR_BadPIN && aStatus != WIMI_ERR_PINBlocked && aStatus != WIMI_ERR_CardIOError )
+        {
+        if( CWimServer::Server()->WimTimer()->TimeRemaining() == 0 )
+            {
+            _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::SignResp | TimeRemaing =0 "));
+            WIMI_Ref_pt pWimRefTemp = NULL;
+            pWimRefTemp = WIMI_GetWIMRef( 0 );
+            if ( pWimRefTemp )  // Close the WIM
+                {
+                WIMI_CloseWIM( pWimRefTemp );
+                free_WIMI_Ref_t( pWimRefTemp );
+                }
+            }    	
+        trId->CompleteMsgAndDelete(); 
+        delete trIdType;
+        }
+
+    // Complete SignTextHandler status
+    if ( gStatus )
+        {
+        User::RequestComplete( gStatus, aStatus );
+        }
+    else // SignTextHandler not active, complete message with error if not done
+        {
+        if ( aStatus == WIMI_ERR_BadPIN || aStatus == WIMI_ERR_PINBlocked || aStatus == WIMI_ERR_CardIOError )
+            {
+            trId->CompleteMsgAndDelete();
+            delete trIdType;
+            }
+        }
+    }
+
+/* ------------ Hardware driver support ------------------------------------- */
+// -----------------------------------------------------------------------------
+// CWimCallBack::CardInsertedResp
+// Respond to CardInserted operation
+// -----------------------------------------------------------------------------
+//
+void CWimCallBack::CardInsertedResp(
+    TUint8 /*aReader*/,
+    WIMI_STAT /*aStatus*/,
+    WIMI_Ref_t* /*aWIMRef*/ )
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::CardInsertedResp | Begin"));
+    }
+
+// -----------------------------------------------------------------------------
+// CWimCallBack::Open
+// Open connection to card
+// -----------------------------------------------------------------------------
+//
+TUint8 CWimCallBack::Open( TUint8 aReader )
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::Open | Begin"));
+    __ASSERT_ALWAYS( gApdu, User::Panic( _L( "Null pointer" ), KErrGeneral ) );
+    return gApdu->Open( aReader );
+    }
+
+// -----------------------------------------------------------------------------
+// CWimCallBack::Close
+// Close connection to card
+// -----------------------------------------------------------------------------
+//
+TUint8 CWimCallBack::Close( TUint8 aReader )
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::Close | Begin"));
+    __ASSERT_ALWAYS( gApdu, User::Panic( _L( "Null pointer" ), KErrGeneral ) );
+
+    TUint8 ret;
+    ret = gApdu->Close( aReader );
+    
+     _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::Close | 1"));
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CWimCallBack::APDUReq
+// APDU Request
+// -----------------------------------------------------------------------------
+//
+void CWimCallBack::APDUReq( TUint8 aReader, TUint8* aApdu, TUint16 aApdulen )
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::APDUReq | Begin"));
+    __ASSERT_ALWAYS( gApdu, User::Panic( _L( "Null pointer" ), KErrGeneral ) );
+    
+    WIMI_BinData_t* ret_apdu =
+        ( WIMI_BinData_t* )WSL_OS_Malloc( sizeof( WIMI_BinData_t ) );
+    TUint16 sw;
+
+    TUint8 status = gApdu->SendAPDU( aReader, aApdu, aApdulen );
+    
+    sw = gApdu->ResponseSW();
+    TPtrC8 ptr = gApdu->ResponseApdu();
+    ret_apdu->pb_buf = ( TUint8* )ptr.Ptr();
+    ret_apdu->ui_buf_length = ( TUint16 )ptr.Length();
+    
+    WIMI_APDUResp( aReader, status, ret_apdu, sw );
+    WSL_OS_Free( ret_apdu );
+    }
+
+// -----------------------------------------------------------------------------
+// CWimCallBack::GetATRReq
+// Not supported in Series 60
+// -----------------------------------------------------------------------------
+//
+void CWimCallBack::GetATRReq( TUint8 /*aReader*/ )
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::GetATRReq | Begin"));
+    }
+
+// -----------------------------------------------------------------------------
+// CWimCallBack::GetReaderListReq
+// Get reader list request
+// -----------------------------------------------------------------------------
+//
+void CWimCallBack::GetReaderListReq()
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::GetReaderListReq | Begin"));
+    WIMI_BinData_t* list = 
+        ( WIMI_BinData_t * )WSL_OS_Malloc( sizeof( WIMI_BinData_t ) ) ;
+
+    TInt ret = KErrNone;
+    TUint8 retval = KErrNone;
+
+    if ( !gApdu )
+        {
+        TRAP( ret, gApdu = CWimApdu::NewL() ); // New CWimApdu
+        }
+
+    if ( ret != KErrNone )
+        {
+        _WIMTRACE2(_L("WIM|WIMServer|CWimCallBack::GetReaderListReq|CWimApdu::NewL() leaved with %d"), ret);
+        retval = KWimStatusIOError;
+        list->ui_buf_length = 0;
+        list->pb_buf = NULL;
+        }
+    else
+        {
+        TRAP( ret, retval = gApdu->RequestListL() );
+    
+        if ( ret != KErrNone )
+            {
+            retval = KWimStatusIOError;
+            }
+        list->ui_buf_length = gApdu->StatusListLength();
+        _WIMTRACE2(_L("WIM|WIMServer|CWimCallBack::GetReaderListReq|statuslistlength=%d"), list->ui_buf_length);
+        list->pb_buf = (TUint8*)gApdu->StatusList().Ptr();
+        }
+    _WIMTRACE2(_L("WIM|WIMServer|CWimCallBack::GetReaderListReq|retval=%d"), retval);
+
+    if ( retval == KErrNone )
+        {
+        WIMI_GetReaderListResp( WIMI_APDU_OK, list );
+        }
+    else
+        {
+        WIMI_GetReaderListResp( WIMI_APDU_TRANSMISSION_ERROR, list );
+        }
+    WSL_OS_Free( list );
+    }
+
+/* ------------ SIM file reading and OMA Provisioning ----------------------- */
+
+// -----------------------------------------------------------------------------
+// CWimCallBack::ReadSimFileReq
+// Read SIM file request
+// -----------------------------------------------------------------------------
+//
+void CWimCallBack::ReadSimFileReq( TUint8 aReaderId,
+                                   TUint8* aPath,
+                                   TUint16 aOffset,          
+                                   TUint16 aSize )
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::ReadSimFileReq | Begin"));
+
+    TRAPD( ret, DoReadSimFileReqL( aReaderId, aPath, aOffset, aSize ) );
+
+    if ( ret != KErrNone )  // DoReadSimFileReq leaved
+        {
+        _WIMTRACE2(_L("WIM | WIMServer | CWimCallBack::ReadSimFileReq | Trapped Leave, ret = %d"), ret );
+
+        WIMI_BinData_t responseBytes;
+        responseBytes.pb_buf = NULL;
+        responseBytes.ui_buf_length = 0;
+        TUint8 status = WIMI_Err;
+        // WIMI call with zero buffer
+        WIMI_SIM_ReadFileResp( aReaderId, status, &responseBytes );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CWimCallBack::ReadSimFileReq
+// Read SIM file request
+// -----------------------------------------------------------------------------
+//
+void CWimCallBack::DoReadSimFileReqL( TUint8 aReaderId,
+                                      TUint8* aPath,
+                                      TUint16 aOffset,          
+                                      TUint16 aSize )
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::DoReadSimFileReqL | Begin"));
+
+    if ( !gSimFileHandler ) 
+        {
+        gSimFileHandler = CWimSimFileHandler::NewL();
+        }
+
+    RMmCustomAPI::TSimFilePath filePath;
+    filePath.Copy( aPath, KSimFilePathLength ); // SIM file path is 8 bytes
+
+    gSimFileHandler->ReadSimFileL( aReaderId,
+                                   filePath,
+                                   aOffset,
+                                   aSize );
+
+    _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::DoReadSimFileReqL | End"));
+    }
+
+// -----------------------------------------------------------------------------
+// CWimCallBack::OmaProvisioningResp
+// Response to OMA Provisioning Smart Card file request
+// -----------------------------------------------------------------------------
+//
+void CWimCallBack::OmaProvisioningResp( WIMI_TransactId_t aTrId,
+                                        WIMI_STAT aStatus,
+                                        TUint16 aFileLen,
+                                        TUint8* aFile )
+    {
+    _WIMTRACE2(_L("WIM | WIMServer | CWimCallBack::OmaProvisioningResp, aFileLen = %d"), aFileLen);
+
+    TWimReqTrId* trIdType = ( TWimReqTrId* )aTrId;
+    CWimResponse* pTrId = ( CWimResponse* )( trIdType->iReqTrId );
+    pTrId->iStatus = aStatus;
+
+    if ( pTrId->iStatus == WIMI_Ok )
+        {
+        TRAP( pTrId->iError, OmaProvisioningRespL( pTrId, aFileLen, aFile ) );
+        _WIMTRACE2(_L("WIM | WIMServer | CWimCallBack::OmaProvisioningResp, TRAP(OmaProvisioningRespL)=%d"), pTrId->iError);
+        }
+
+    pTrId->CompleteMsgAndDelete(); 
+    delete trIdType;
+    _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::OmaProvisioningResp | End"));
+    }
+
+// -----------------------------------------------------------------------------
+// CWimCallBack::OmaProvisioningRespL
+// Write OMA Provisioning Smart Card file to client memory
+// -----------------------------------------------------------------------------
+//
+void CWimCallBack::OmaProvisioningRespL( CWimResponse* aTrId,
+                                         TUint16 aFileLen,
+                                         TUint8* aFile )
+    {
+    _WIMTRACE2(_L("WIM | WIMServer | CWimCallBack::OmaProvisioningRespL, aFileLen = %d"), aFileLen);
+
+    RMessage2& message = aTrId->iMessage;
+        
+    TOmaProv omaProvisioning;
+    omaProvisioning.iSize = aFileLen;
+
+    TPckgBuf<TOmaProv> omaFilePckg( omaProvisioning );
+    message.ReadL( 0, omaFilePckg );
+
+    TPtr8 omaFilePtr( aFile, aFileLen, aFileLen );
+    message.WriteL( 1, omaFilePtr );
+    }
+
+// -----------------------------------------------------------------------------
+// CWimCallBack::CancelPinOperation
+// Cancel pin operation by stop apdu sending
+// -----------------------------------------------------------------------------
+//
+void CWimCallBack::CancelPinOperation()
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::CancelPinOperation Begin"));
+	gApdu->CancelApduSending();
+	
+	WIMI_APDUResp( 0, WIMI_ERR_UserCancelled, NULL, 0 );
+	
+	_WIMTRACE(_L("WIM | WIMServer | CWimCallBack::CancelPinOperation End"));
+    }
+
+// -----------------------------------------------------------------------------
+// CWimCallBack::CancelWimInitialize
+// Cancel Wim Initialize by stop apdu sending
+// -----------------------------------------------------------------------------
+//    
+void CWimCallBack::CancelWimInitialize()
+    {
+	 _WIMTRACE(_L("WIM | WIMServer | CWimCallBack::CancelWimInitialize Begin"));
+	gApdu->CancelApduSending();
+	
+	WIMI_APDUResp( 0, WIMI_ERR_UserCancelled, NULL, 0 );
+	
+	_WIMTRACE(_L("WIM | WIMServer | CWimCallBack::CancelWimInitialize End"));
+    }
+    
+// -----------------------------------------------------------------------------
+// CWimCallBack::DeletegApdu
+//
+// -----------------------------------------------------------------------------
+//
+void CWimCallBack::DeletegApdu()
+    {
+	if ( gApdu )
+	    {
+		delete gApdu;
+		gApdu= NULL;
+	    }
+    }
+
+// End of File