wim/WimServer/src/WimTokenHandler.cpp
changeset 0 164170e6151a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wim/WimServer/src/WimTokenHandler.cpp	Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,231 @@
+/*
+* Copyright (c) 2002-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:  Methods for token handling
+*
+*/
+
+
+
+// INCLUDE FILES
+#include    "WimTokenHandler.h"
+#include    "WimMemMgmt.h"
+#include    "WimClsv.h"
+#include    "WimSession.h"
+#include    "WimTimer.h"
+#include    "WimSession.h"
+#include    "WimUtilityFuncs.h"
+#include    "Wimi.h"            //WIMI definitions
+#include    "WimTrace.h"
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CWimTokenHandler::CWimTokenHandler
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CWimTokenHandler::CWimTokenHandler()
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimTokenHandler::CWimTokenHandler | Begin"));
+    }
+
+// -----------------------------------------------------------------------------
+// CWimTokenHandler::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CWimTokenHandler::ConstructL()
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimTokenHandler::ConstructL | Begin"));
+    iWimUtilFuncs = CWimUtilityFuncs::NewL();
+    }
+
+// -----------------------------------------------------------------------------
+// CWimTokenHandler::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CWimTokenHandler* CWimTokenHandler::NewL()
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimTokenHandler::NewL | Begin"));
+    CWimTokenHandler* self = new( ELeave ) CWimTokenHandler;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// Destructor
+CWimTokenHandler::~CWimTokenHandler()
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimTokenHandler::~CWimTokenHandler | Begin"));
+    delete iWimUtilFuncs;
+    }
+
+// -----------------------------------------------------------------------------
+// CWimTokenHandler::GetWIMInfoL
+// Fetches WIM info from wimlib
+// -----------------------------------------------------------------------------
+//
+void CWimTokenHandler::GetWIMInfoL(
+    const RMessage2& aMessage,
+    CWimMemMgmt* const aWimMgmt ) const
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimTokenHandler::GetWIMInfoL | Begin"));
+    WIMI_Ref_pt pWimRef = const_cast<WIMI_Ref_pt>( aMessage.Ptr0() ); 
+    
+    __ASSERT_ALWAYS( pWimRef, User::Leave( KErrArgument ) );
+    __ASSERT_ALWAYS( aWimMgmt, User::Leave( KErrArgument ) );
+    if ( !aWimMgmt->ValidateWIMRefL( pWimRef ) )
+        {
+        _WIMTRACE(_L("WIM | WIMServer | CWimTokenHandler::GetWIMInfoL | KErrArgument"));
+        User::LeaveIfError( KErrArgument ); 
+        }
+    WIMI_STAT status = WIMI_Ok;
+    
+    WIMI_Ref_pt pinRef;
+    TUint16 flags;
+    TUint8 seSet;
+    TUint8 version;
+    WIMI_BinData_t ptWimID;
+    WIMI_BinData_t ptManufacturerID;
+    WIMI_BinData_t ptLabel;
+    TUint8 reader = 0; 
+    TBool sim; 
+    TPckgBuf<TWimSecModuleStruct> infoPckg;
+    aMessage.ReadL( 1, infoPckg );
+    
+    status = WIMI_GetWIMInfo( pWimRef,
+                              &flags,
+                              &seSet,
+                              &ptWimID,
+                              &ptManufacturerID,
+                              &ptLabel,
+                              &reader, 
+                              &pinRef, 
+                              &sim, 
+                              &version );
+    if ( status == WIMI_Ok )
+        {
+        // Code MAY NOT leave before ptLabel.pb_buf, ptManufacturerID.pb_buf,
+        // and ptWimID.pb_buf are deallocated. Next AppendWIMRefL() takes the
+        // ownership of pinRef struct.
+        TRAPD( err, aWimMgmt->AppendWIMRefL( pinRef ) );
+        if( err )
+            {
+            WSL_OS_Free( ptLabel.pb_buf );
+            WSL_OS_Free( ptManufacturerID.pb_buf );
+            WSL_OS_Free( ptWimID.pb_buf );
+            // Code can leave after this point.
+            User::Leave( err );
+            }
+        infoPckg().iRefPinG = reinterpret_cast< TUint32 >( pinRef );
+        
+        TBuf<KLabelLen> label;
+        label.Copy( TPtr8( 
+                ptLabel.pb_buf,
+                ptLabel.ui_buf_length,
+                ptLabel.ui_buf_length ) );
+        
+        TBuf<KManufacturerLen> manufacturer;
+        manufacturer.Copy( TPtr8(
+                ptManufacturerID.pb_buf,
+                ptManufacturerID.ui_buf_length,
+                ptManufacturerID.ui_buf_length ) );
+
+        TBuf<KSerialNumberLen> serialnumber;
+        serialnumber.Copy( TPtr8(
+                ptWimID.pb_buf,
+                ptWimID.ui_buf_length,
+                ptWimID.ui_buf_length ) );
+
+        infoPckg().iVersion = version;
+        infoPckg().iReader = reader;
+        infoPckg().iLabel = label;
+        infoPckg().iManufacturer = manufacturer;
+        infoPckg().iSerialNumber = serialnumber;
+
+        WSL_OS_Free( ptLabel.pb_buf );
+        WSL_OS_Free( ptManufacturerID.pb_buf );
+        WSL_OS_Free( ptWimID.pb_buf );
+        // Code can leave after this point.
+
+        aMessage.WriteL( 1, infoPckg );
+        }
+
+    aMessage.Complete( CWimUtilityFuncs::MapWIMError( status ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CWimTokenHandler::IsWIMOpenL
+// Checks if the WIM is already opened.
+// -----------------------------------------------------------------------------
+//
+void CWimTokenHandler::IsWIMOpenL(
+    const RMessage2& aMessage,
+    CWimTimer* const aTimer,
+    CWimMemMgmt* const aWimMgmt ) const
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimTokenHandler::IsWIMOpenL | Begin"));
+    WIMI_Ref_pt pWimRef = const_cast<WIMI_Ref_pt>( aMessage.Ptr0() );
+    
+    __ASSERT_ALWAYS( pWimRef, User::Leave( KErrArgument ) );
+    __ASSERT_ALWAYS( aTimer, User::Leave( KErrArgument ) );
+    if ( !aWimMgmt->ValidateWIMRefL( pWimRef ) ) 
+        {
+        _WIMTRACE(_L("WIM | WIMServer | CWimTokenHandler::IsWIMOpenL | KErrArgument"));
+        User::LeaveIfError( KErrArgument ); 
+        }
+
+    TPckgBuf<TBool> pckg;
+    
+    if ( WIMI_IsWIMOpened( pWimRef ) )
+        {
+        pckg() = ETrue;
+        aTimer->ResetTimer();
+        }
+    else
+        {
+        pckg() = EFalse;
+        }
+
+    aMessage.WriteL( 1, pckg );
+    aMessage.Complete( KErrNone );
+    }
+
+// -----------------------------------------------------------------------------
+// CWimTokenHandler::CloseWIM
+// Closes connection to WIM card.
+// -----------------------------------------------------------------------------
+//
+void CWimTokenHandler::CloseWIM( const RMessage2& aMessage ) const
+    {
+    _WIMTRACE(_L("WIM | WIMServer | CWimTokenHandler::CloseWIM | Begin"));
+    WIMI_STAT status = KErrNone;
+    WIMI_Ref_pt wimRef = const_cast<WIMI_Ref_pt>( aMessage.Ptr0() );
+
+    if ( wimRef )
+        {
+        status = WIMI_CloseWIM( wimRef );
+        }
+    else
+        {
+        status = WIMI_ERR_BadParameters;
+        }
+    aMessage.Complete( CWimUtilityFuncs::MapWIMError( status ) );
+    }
+
+//  End of File