wim/WimClient/src/WimSecModule.cpp
changeset 0 164170e6151a
child 5 3b17fc5c9564
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wim/WimClient/src/WimSecModule.cpp	Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,683 @@
+/*
+* Copyright (c) 2002 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:  API for managing WIM Security Module.
+*
+*/
+
+
+//INCLUDES
+#include "WimSecModule.h"
+#include "WimConsts.h"
+#include "WimPin.h"
+#include "WimMgmt.h"
+#include "WimTrace.h"
+
+//CONSTANTS
+_LIT( KZeroHex,"0%x" );
+_LIT( KHex, "%x" );
+//Must be const, else this won't compile to Thumb & arm4
+const TUint KSerialNumberMask = 0x0F; 
+const TUint KPinNum = 0x02;	
+
+//================= MEMBER FUNCTIONS  for CWimSecModule=======================
+//
+//  C++ default constructor. Initialize the member variables
+//
+//
+CWimSecModule::CWimSecModule( TWimAddress aWimAddr ): CActive( EPriorityHigh ),
+                                                      iReference( aWimAddr ),
+                                                      iPinNRsInit( EFalse )
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CWimSecModule::NewL()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CWimSecModule* CWimSecModule::NewL( TWimAddress aWimAddr )
+    {
+    _WIMTRACE ( _L( "CWimSecModule::NewL()" ) );
+    __ASSERT_DEBUG( aWimAddr, User::Leave( KErrArgument ) );    
+    CWimSecModule* self = new( ELeave ) CWimSecModule( aWimAddr );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self ); //self
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CWimSecModule::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CWimSecModule::ConstructL()
+    {
+    CActiveScheduler::Add( this );
+    _WIMTRACE ( _L( "CWimSecModule::ConstructL()" ) );
+    iLabel = HBufC::NewL( KLabelLen );
+    iManufacturer = HBufC::NewL( KManufacturerLen );
+    iSerialNumber = HBufC::NewL( KSerialNumberLen );
+    iPinInfoLst = new( ELeave )CArrayFixFlat<TWimPinStruct>(KPinNum);
+    }
+
+// -----------------------------------------------------------------------------
+// CWimSecModule::IsOpen()
+// Checks is WIM already open.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CWimSecModule::IsOpen()
+    {
+    _WIMTRACE ( _L( "CWimSecModule::IsOpen()" ) );
+    return iClientSession->IsOpen( iReference ); 
+    }
+
+
+// -----------------------------------------------------------------------------
+// CWimSecModule::CloseAfter()
+// Returns the time which is set as WIM closeout time
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CWimSecModule::CloseAfter()
+    {
+    _WIMTRACE ( _L( "CWimSecModule::CloseAfter()" ) );
+    return iClientSession->CloseAfter();  
+    }
+
+// -----------------------------------------------------------------------------
+// CWimSecModule::TimeRemaining()
+// Returns the timeout which tells how long WIM Security Module will be open 
+// after it is opened.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CWimSecModule::TimeRemaining()
+    {
+    _WIMTRACE ( _L( "CWimSecModule::TimeRemaining()" ) );
+    return iClientSession->TimeRemaining( );      
+    }
+
+// -----------------------------------------------------------------------------
+// CWimSecModule::PinNrEntriesL()
+// Returns WIM Security Module's keys' PIN-NR objects in array.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CWimSecModule::PinNrEntriesL( 
+                                      const CArrayPtrFlat<CWimPin>*& aPinNRs,
+                                      TRequestStatus& aStatus ) 
+    {
+    _WIMTRACE ( _L( "CWimSecModule::PinNrEntriesL()" ) );
+    TInt status = KErrNone;
+    
+    if( !iPinNRsInit )
+	    {
+	    status = GetPINModulesL( aStatus );	
+	    }
+    else
+        {
+    	aPinNRs = iPinNRs;
+    	iClientStatus = &aStatus;
+    	User::RequestComplete( iClientStatus, KErrNone );
+    	return status;
+        }
+    
+    if ( status == KErrNone )
+        {
+        aPinNRs = iPinNRs;
+        }
+    else
+        {
+        aPinNRs = NULL;
+        }
+    return status;
+    }
+
+// -----------------------------------------------------------------------------
+// CWimSecModule::PinNrEntriesL()
+// Returns WIM Security Module's keys' PIN-NR objects in array.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CWimSecModule::PinNrEntriesL( 
+                                      const CArrayPtrFlat<CWimPin>*& aPinNRs ) 
+    {
+    _WIMTRACE ( _L( "CWimSecModule::PinNrEntriesL()" ) );
+    TInt status = KErrNone;
+   
+   if( !iPinNRsInit )
+       {
+   	   status = GetPINModulesL();
+       }
+    
+    if ( status == KErrNone )
+        {
+        aPinNRs = iPinNRs;
+        }
+    else
+        {
+        aPinNRs = NULL;
+        }
+    return status;
+    }
+
+// -----------------------------------------------------------------------------
+// CWimSecModule::Label()
+// Returns WIM's label.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TPtrC CWimSecModule::Label()
+    {
+    _WIMTRACE ( _L( "CWimSecModule::Label()" ) );
+    TInt status = KErrNone;
+    TRAPD( err, status = GetWIMInfoL() );
+    if ( status == KErrNone && !err )
+        {
+        return iLabel->Des();
+        }
+    else
+        {
+        return TPtrC( NULL, 0 );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CWimSecModule::Manufacturer()
+// Returns WIM's manufacturer.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& CWimSecModule::Manufacturer()
+    {
+    _WIMTRACE ( _L( "CWimSecModule::Manufacturer()" ) );
+    TInt status = KErrNone;
+    TRAPD( err, status = GetWIMInfoL() );
+    if ( status == KErrNone && !err )
+        {
+        return *iManufacturer;
+        }
+    else
+        {
+        return KNullDesC;
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CWimSecModule::Version()
+// Returns WIM's version.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& CWimSecModule::Version()
+    { 
+    _WIMTRACE ( _L( "CWimSecModule::Version()" ) );
+    TInt status = KErrNone;
+    TRAPD( err, status = GetWIMInfoL() );
+    if ( status == KErrNone && !err )
+        {
+        return *iVersion;
+        }
+    else
+        {
+        return KNullDesC;   
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CWimSecModule::SerialNumber()
+// Returns WIM's serial number which identifies it.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& CWimSecModule::SerialNumber()
+    {
+    _WIMTRACE ( _L( "CWimSecModule::SerialNumber()" ) );
+    TInt status = KErrNone;
+    TRAPD( err, status = GetWIMInfoL() );
+    if ( status == KErrNone && !err )
+        {
+        return *iSerialNumber; 
+        }
+    else
+        {
+        return KNullDesC;
+        }
+    }
+ 
+
+
+// -----------------------------------------------------------------------------
+// CWimSecModule::Close()
+// Closes the parts of WIM which is opened with PIN-G.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CWimSecModule::Close()
+    {
+    _WIMTRACE ( _L( "CWimSecModule::Close()" ) );
+    
+    iWimInfoConstructed = EFalse;
+    iPinNRsInit = EFalse;
+    
+    if ( iReference )
+        {
+        return iClientSession->CloseWIM( iReference );
+        }
+    else
+        {
+        return KWimSMInfoError;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CWimSecModule::SetCloseAfter()
+// Sets the timeout which defines the time after WIM is automatically closed.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CWimSecModule::SetCloseAfter( const TUint aTimeout )
+    {
+    _WIMTRACE ( _L( "CWimSecModule::SetCloseAfter()" ) );
+    iClientSession->SetCloseAfter( aTimeout );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CWimSecModule::~CWimSecModule()
+// Destructor, all allocated memory is released.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CWimSecModule::~CWimSecModule()
+    {
+    _WIMTRACE ( _L( "CWimSecModule::~CWimSecModule()()" ) );
+    Cancel();
+    
+    if( iPinInfoLst )
+        {
+    	iPinInfoLst->Reset();
+    	delete iPinInfoLst;
+        }
+    if ( iPinLstAddr )
+        {
+        iClientSession->FreeAddrLst( iPinLstAddr );
+        }
+    if ( iPinNRs )
+        {
+        iPinNRs->ResetAndDestroy();/* Destroy  */
+        delete iPinNRs;    /* Array of pointers to PIN-NRs. */
+        }
+    if ( iRefPing )
+        {
+        iClientSession->FreeWIMAddr( iRefPing );
+        }
+    delete iLabel;
+    delete iManufacturer;
+    delete iSerialNumber;
+    if ( iVersion )
+        {
+        delete iVersion;
+        iVersion = NULL;
+        }
+   
+    }
+
+// -----------------------------------------------------------------------------
+// CWimSecModule::TokenNumber()
+// Returns TUint8 iReader which identifies the slot 
+// where the WIM card is actually.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TUint8 CWimSecModule::TokenNumber()
+    {
+    _WIMTRACE ( _L( "CWimSecModule::TokenNumber()" ) );
+    return iReader;
+    }
+
+// -----------------------------------------------------------------------------
+// CWimSecModule::NotifyOnRemoval()
+// Notifies the client when the token has been removed.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CWimSecModule::NotifyOnRemoval( TRequestStatus& aStatus )
+    {
+    _WIMTRACE ( _L( "CWimSecModule::NotifyOnRemoval()" ) );
+
+    TIpcArgs args;
+    iClientSession->SendReceiveData( ENotifyOnRemoval, args, aStatus );
+    }
+
+// -----------------------------------------------------------------------------
+// CWimSecModule::CancelNotifyOnRemoval()
+// Cancels the NotifyOnRemoval request.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CWimSecModule::CancelNotifyOnRemoval()
+    {
+    _WIMTRACE ( _L( "CWimSecModule::CancelNotifyOnRemoval()" ) );
+
+    TIpcArgs args;
+    iClientSession->SendReceiveData( ECancelNotifyOnRemoval, args );
+    }
+
+// -----------------------------------------------------------------------------
+// CWimSecModule::GetWIMInfoL()
+// Gets label,manufacturer,serialnumber and the number of the slot 
+// where card is.
+// -----------------------------------------------------------------------------
+//
+TInt CWimSecModule::GetWIMInfoL()
+    {
+    _WIMTRACE ( _L( "CWimSecModule::GetWIMInfoL()" ) );
+
+    TBuf<KVersionNumberLen> temporalVersionNum;   
+
+    TInt status = KErrNone;
+    if ( !iWimInfoConstructed )
+        {
+        HBufC* temporalSerialNumber = HBufC::NewLC( KSerialNumberLen );                
+        TWimSecModuleStruct wimSecModuleStruct;
+        TPtr label = iLabel->Des();
+        TPtr manufacturer = iManufacturer->Des();
+        TPtr serialnumber = temporalSerialNumber->Des();
+        wimSecModuleStruct.iLabel = label;
+        wimSecModuleStruct.iManufacturer = manufacturer;
+        wimSecModuleStruct.iSerialNumber = serialnumber;
+        status = iClientSession->WIMInfo( iReference, wimSecModuleStruct );
+        if ( status == KErrNone ) 
+            {
+            temporalVersionNum.Num( ( TInt )wimSecModuleStruct.iVersion );
+            iVersion = temporalVersionNum.AllocL();
+            iReader = wimSecModuleStruct.iReader;
+            label.Copy( wimSecModuleStruct.iLabel );
+            manufacturer.Copy( wimSecModuleStruct.iManufacturer );
+            serialnumber.Copy( wimSecModuleStruct.iSerialNumber );
+            label.ZeroTerminate();
+            manufacturer.ZeroTerminate();
+            serialnumber.ZeroTerminate();
+            iRefPing = wimSecModuleStruct.iRefPinG;
+            
+            //status = GetPINModulesL( aStatus );
+            
+            if ( status == KErrNone )
+                {
+                if ( iReader != KSoftId )
+                    {
+                    ConvertSerialNumberL( temporalSerialNumber );                    
+                    }
+                else
+                    {
+                    TBuf<KVersionNumberLen> newSerialNumber;
+                    TPtr ptr = temporalSerialNumber->Des();
+                    newSerialNumber.Copy( ptr ); 
+                    delete iSerialNumber;
+                    iSerialNumber = NULL;
+                    iSerialNumber = newSerialNumber.AllocL();
+                    }
+                iWimInfoConstructed = ETrue;                
+                }
+            }                       //temporalSerialNumber
+        CleanupStack::PopAndDestroy( temporalSerialNumber );               
+        }
+    return status;
+    }
+
+// -----------------------------------------------------------------------------
+// CWimSecModule::ConvertSerialNumberL()
+// Converts serialnumber. 
+// -----------------------------------------------------------------------------
+//
+void CWimSecModule::ConvertSerialNumberL( HBufC*& aSerialNumber )
+    {
+    _WIMTRACE ( _L( "CWimSecModule::ConvertSerialNumberL()" ) );
+
+    TBuf<KVersionNumberLen> orginalVersionNumber;
+    TBuf<KVersionNumberLen> newSerialNumber;
+    TPtr ptr = aSerialNumber->Des();
+    orginalVersionNumber.Copy( ptr );
+    TInt len = orginalVersionNumber.Length(); 
+    TInt i;
+    TUint item;
+    for ( i = 0; i<len; i++ )
+        {
+        item = orginalVersionNumber.operator[]( i ); 
+        if ( item <= KSerialNumberMask )
+            {
+            //In this case we need to add an extra zero before actual value.
+            newSerialNumber.AppendFormat( KZeroHex, 
+                TUint( orginalVersionNumber.operator[]( i ) ) );
+            }
+        else
+            {
+            //No need for further processing, simply append. 
+            newSerialNumber.AppendFormat( KHex, 
+                TUint( orginalVersionNumber.operator[]( i ) ) );            
+            }
+        }
+    delete iSerialNumber;
+    iSerialNumber = NULL;
+    iSerialNumber = newSerialNumber.AllocL();
+    }
+
+// -----------------------------------------------------------------------------
+// CWimSecModule::GetPINModulesL( ) Asynchronous
+// Gets PIN references and creates new CWimPin objects.
+// -----------------------------------------------------------------------------
+//
+TInt CWimSecModule::GetPINModulesL( TRequestStatus& aStatus )
+    {
+    _WIMTRACE ( _L( "CWimSecModule::GetPINModulesL()" ) );
+
+    TInt status = KErrNone;
+    TUint pinCount= iClientSession->PINCount( iReference );
+    iPinCount = pinCount;
+    iPinInfoLst->Reset();
+    
+    if ( pinCount )
+        {
+        TPinAddress* pinLst = new( ELeave ) TPinAddress[pinCount];  
+        CleanupStack::PushL( TCleanupItem( Cleanup, pinLst ) );
+        
+        status = iClientSession->PINRefs( iReference, iPinLstAddr, pinLst,
+                                        ( TText8 )pinCount );
+        if ( status == KErrNone ) 
+            {
+            if( iPinNRs == NULL )
+	            {
+	            iPinNRs = new( ELeave ) CArrayPtrFlat<CWimPin>( pinCount );	
+	            }
+            else
+	            {
+	            iPinNRs->Reset();
+	            iPinNRs->ResizeL( pinCount );	
+	            }
+            /* Construct PIN  modules */
+            TUint8 index;
+            for ( index = 0; index < pinCount; index++ )
+                {
+                CWimPin* pinModule = CWimPin::NewL( EWimPinNR, 
+                                                    pinLst[index],
+                                                    *iLabel );
+                CleanupStack::PushL( pinModule );
+                pinModule->SetClientSession( iClientSession );
+                iPinNRs->AppendL( pinModule );
+                CleanupStack::Pop( pinModule );/* Pop pinModule  */
+                }
+              
+            if(iPinInfoLst->Count() != pinCount )
+                {
+            	iPinInfoLst->ResizeL( pinCount );
+                }
+            
+            iClientStatus = &aStatus;
+            
+            iStatus = KRequestPending;
+            
+            SetActive();
+ 
+            iClientSession->PINsInfo( iReference, *iPinInfoLst,(TText8)pinCount, iStatus);
+             
+            }
+        
+        CleanupStack::PopAndDestroy( pinLst );/* pinLst */   
+        
+        }
+    return status;
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CWimSecModule::GetPINModulesL( ) Synchronous
+// Gets PIN references and creates new CWimPin objects.
+// -----------------------------------------------------------------------------
+//
+TInt CWimSecModule::GetPINModulesL()
+    {
+    _WIMTRACE ( _L( "CWimSecModule::GetPINModulesL()" ) );
+
+    TInt status = KErrNone;
+    TUint pinCount= iClientSession->PINCount( iReference );
+    iPinCount = pinCount;
+    iPinInfoLst->Reset();
+    
+    if ( pinCount )
+        {
+        TPinAddress* pinLst = new( ELeave ) TPinAddress[pinCount];  
+        
+        CleanupStack::PushL( TCleanupItem( Cleanup, pinLst ) );
+        
+        status = iClientSession->PINRefs( iReference, iPinLstAddr, pinLst,
+                                        ( TText8 )pinCount );
+        if ( status == KErrNone ) 
+            {
+            if( iPinNRs == NULL )
+	            {
+	            iPinNRs = new( ELeave ) CArrayPtrFlat<CWimPin>( pinCount );	
+	            }
+            else
+	            {
+	            iPinNRs->Reset();
+	            iPinNRs->ResizeL( pinCount );	
+	            }
+            /* Construct PIN  modules */
+            TUint8 index;
+            for ( index = 0; index < pinCount; index++ )
+                {
+                CWimPin* pinModule = CWimPin::NewL( EWimPinNR, 
+                                                    pinLst[index],
+                                                    *iLabel );
+                CleanupStack::PushL( pinModule );
+                pinModule->SetClientSession( iClientSession );
+                iPinNRs->AppendL( pinModule );
+                CleanupStack::Pop( pinModule );/* Pop pinModule  */
+                }
+            
+            if(iPinInfoLst->Count() != pinCount )
+                {
+            	iPinInfoLst->ResizeL( pinCount );
+                }
+          
+          TInt err = iClientSession->PINsInfo( iReference, *iPinInfoLst,(TText8)pinCount );
+           
+          if( err != KErrNone )
+             {
+             User::LeaveIfError( KErrGeneral );	
+             }
+          
+          for(TInt i=0; i<iPinCount; i++ )
+	          {
+	          ( *iPinNRs )[ i]->SetLabel( (*iPinInfoLst)[ i].iLabel );
+	    	  ( *iPinNRs )[ i]->SetPinStatus( (*iPinInfoLst)[ i].iStatus );
+	          ( *iPinNRs )[ i]->SetPinNumber( (*iPinInfoLst)[ i].iPinNumber );	
+	          }
+            
+            iPinNRsInit = ETrue;
+            iPinInfoLst->Reset();    
+            }
+            
+        CleanupStack::PopAndDestroy( pinLst );/* pinLst */
+        }
+    return status;
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CWimSecModule::Cleanup()
+// Handles cleanup for an object which is not derived from CBase
+// -----------------------------------------------------------------------------
+//
+void CWimSecModule::Cleanup( TAny* aObject )
+    {
+    _WIMTRACE ( _L( "CWimSecModule::Cleanup()" ) );
+    delete aObject;
+    aObject = NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CWimSecModule::SetClientSession()
+// Sets pointer RWimMgmt object to modifier iClientSession
+// -----------------------------------------------------------------------------
+//
+void CWimSecModule::SetClientSession( RWimMgmt* aClientSession )
+    {
+    _WIMTRACE ( _L( "CWimSecModule::SetClientSession()" ) );
+    iClientSession = aClientSession;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CWimSecModule::RunL()
+// -----------------------------------------------------------------------------
+//
+void CWimSecModule::RunL()
+    {
+    _WIMTRACE ( _L( "CWimSecModule::RunL()" ) );
+    
+    if( iStatus.Int() != KErrNone )
+        {
+    	return;
+        } 
+        
+    for(TInt i=0; i<iPinCount; i++ )
+        {
+    	( *iPinNRs )[ i]->SetLabel( (*iPinInfoLst)[ i].iLabel );
+    	( *iPinNRs )[ i]->SetPinStatus( (*iPinInfoLst)[ i].iStatus );
+        ( *iPinNRs )[ i]->SetPinNumber( (*iPinInfoLst)[ i].iPinNumber );
+        }
+    
+    iPinNRsInit = ETrue;
+     
+    iPinInfoLst->Reset();    
+    User::RequestComplete( iClientStatus, KErrNone );
+    }
+        
+// -----------------------------------------------------------------------------
+// CWimSecModule::DoCancel()
+// -----------------------------------------------------------------------------
+//
+void CWimSecModule::DoCancel()
+    {
+	_WIMTRACE ( _L( "CWimSecModule::DoCancel() " ) );
+	User::RequestComplete( iClientStatus, KErrCancel );
+    }
+
+// -----------------------------------------------------------------------------
+// CWimSecModule::RunError()
+// -----------------------------------------------------------------------------
+//
+TInt CWimSecModule::RunError( TInt aError )
+    {
+	_WIMTRACE ( _L( "CWimSecModule::RunError() " ) );
+	User::RequestComplete( iClientStatus, aError );
+	return KErrNone;
+    }
+
+// End of File