wim/WimPlugin/src/WimTokenType.cpp
changeset 0 164170e6151a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wim/WimPlugin/src/WimTokenType.cpp	Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,251 @@
+/*
+* 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:  This class is instantiated via ECom for a particular token type
+*
+*/
+
+
+// INCLUDE FILES
+
+#include "WimTokenType.h"
+#include "WimToken.h"
+#include "WimImplementationUID.hrh"
+#include <ecom/implementationproxy.h>
+#include "WimTrace.h"
+//#include "WimDebug.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CWimTokenType::CWimTokenType()
+// Default constructor
+// -----------------------------------------------------------------------------
+//
+CWimTokenType::CWimTokenType()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CWimTokenType::ConstructL()
+// Second phase constructor
+// -----------------------------------------------------------------------------
+//
+void CWimTokenType::ConstructL()
+    {
+    _WIMTRACE ( _L( "CWimTokenType::ConstructL()" ) );
+    iWimSecModuleMgr = CWimSecModuleMgr::NewL(); 
+    }
+
+// -----------------------------------------------------------------------------
+// CWimTokenType::NewL()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CWimTokenType* CWimTokenType::NewL() 
+    {
+    CWimTokenType* self = new( ELeave ) CWimTokenType();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CWimTokenType::~CWimTokenType()
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CWimTokenType::~CWimTokenType()
+    {
+    _WIMTRACE ( _L( "CWimTokenType::~CWimTokenType()" ) );
+    delete iWimSecModuleMgr;
+    }
+
+// -----------------------------------------------------------------------------
+// CWimTokenType::List()
+// List all the tokens of this type.
+// -----------------------------------------------------------------------------
+//
+void CWimTokenType::List( RCPointerArray<HBufC>& aTokens,  
+                          TRequestStatus& aStatus )
+    {
+    _WIMTRACE ( _L( "CWimTokenType::List" ) );
+    aStatus = KRequestPending;
+    iWimSecModuleMgr->GetEntries( aTokens, aStatus );
+    }
+
+// -----------------------------------------------------------------------------
+// CWimTokenType::CancelList()
+// Cancel a list operation.
+// -----------------------------------------------------------------------------
+//
+void CWimTokenType::CancelList()
+    {
+    _WIMTRACE ( _L( "CWimTokenType::CancelList" ) );
+    iWimSecModuleMgr->CancelList();
+    }
+
+// -----------------------------------------------------------------------------
+// CTokenTypeImplementation::OpenToken() 
+// Opens new token, which name is specified in aTokenInfo
+// This is not true asynchronous function.
+// -----------------------------------------------------------------------------
+//
+void CWimTokenType::OpenToken( const TDesC& aTokenInfo, 
+                               MCTToken*& aToken,
+                               TRequestStatus& aStatus )
+    { 
+    _WIMTRACE ( _L( "CWimTokenType::OpenToken with name" ) );
+    TInt err   = KErrNone;
+    TInt i     = 0;
+
+    aStatus    = KRequestPending;
+
+    // Get the right Wim and pass it to CWimToken to be created.
+    // Stack Wim count for efficiency reasons
+    TInt count = iWimSecModuleMgr->WimCount(); 
+    for ( i = 0; i < count && err == KErrNone; i++ ) 
+        {
+        HBufC* label = NULL;    // from heap
+        // Get Wim label
+        TRAP( err, label = iWimSecModuleMgr->WimLabelByIndexL( i ).AllocL() );
+        if ( err == KErrNone ) 
+            {
+            // If labels match...
+            if ( !aTokenInfo.Compare( label->Des() ) )
+                {
+                // Create token
+                TRAP( err, aToken = CWimToken::NewL( iWimSecModuleMgr->GetWimSecModuleByIndexL( i ), *this ) );
+                i = count + 1; // This completes for loop and separates
+                               // from normal for loop end (i == count)
+                if ( err == KErrNone )
+                    {
+                    IncReferenceCount();
+                    }
+                }
+            }
+        delete label;
+        }
+
+    if ( i == count && err == KErrNone ) // Not match found
+        {
+        err = KErrNotFound;
+        }
+
+    TRequestStatus* r = &aStatus;
+    User::RequestComplete( r, err );
+
+    }
+
+// -----------------------------------------------------------------------------
+// CWimTokenType::OpenToken()
+// Open new token, The handle of the required token is used to get needed 
+// information. Before opening new token we need to compare token numbers.
+// This is not true asynchronous function.
+// -----------------------------------------------------------------------------
+//
+void CWimTokenType::OpenToken( TCTTokenHandle aHandle,
+                               MCTToken*& aToken,
+                               TRequestStatus& aStatus )
+    {
+    _WIMTRACE ( _L( "CWimTokenType::OpenToken with handle" ) );
+    TInt err   = KErrNone;
+    TInt i     = 0;
+    TInt count = 0;
+
+    aStatus = KRequestPending; 
+
+    // Current tokentype and requested token's tokentype must be the same
+    if ( Type() == aHandle.iTokenTypeUid )
+        {
+        // Count of security modules:
+        count = iWimSecModuleMgr->WimCount();
+        // For effectivity reasons, stack the given handle
+        TInt mytokennumber = aHandle.iTokenId;      
+        // Let's go through all Wims and try to match handles
+        for ( i = 0; i < count && err == KErrNone; i++ )
+            {
+            // Stack Wim handle
+            TInt histokennumber = 0;    
+            TRAP( err, histokennumber = iWimSecModuleMgr->
+                                        WimTokenNumberByIndexL( i ) );
+            if ( err == KErrNone )
+                {
+                if ( mytokennumber == histokennumber )
+                    {   
+                    HBufC* label = NULL;// From heap
+                    // Let's get Wim label and use another 
+                    // API function to get token info
+                    TRAP( err, label = iWimSecModuleMgr->
+                                       WimLabelByIndexL( i ).AllocL() );
+                    if ( err == KErrNone )
+                        {
+                        // The completion of the next statement is handled 
+                        // in the associated function
+                        OpenToken( label->Des(), aToken, aStatus );
+                        delete label;
+                        return; // Must quit here, RequestComplete is done
+                        }
+                    delete label;   // Here we go if error in last TRAP
+                    i = count + 1;  // This completes for loop and
+                                    // separates from normal for loop end
+                    }
+                }
+            } // for loop...
+        } // if ( Type()...
+
+    if ( i == count && err == KErrNone ) // No match found 
+        {
+        err = KErrNotFound;
+        }
+
+    TRequestStatus* r = &aStatus;
+    User::RequestComplete( r, err );
+
+    }
+// -----------------------------------------------------------------------------
+// CWimTokenType::CancelOpenToken()
+// Cancel an OpenToken operation.
+// -----------------------------------------------------------------------------
+//
+void CWimTokenType::CancelOpenToken()
+    {
+    _WIMTRACE ( _L( "CWimTokenType::CancelOpenToken" ) );
+    // It's not really async, so you can't cancel.
+    }
+
+// -----------------------------------------------------------------------------
+// TImplementationProxy ImplementationTable[] 
+// An array listing the NewL functions of all the plugins.
+// -----------------------------------------------------------------------------
+//
+const TImplementationProxy ImplementationTable[] = 
+    {
+    {{WIM_IMPLEMENTATION_UID},     (TProxyNewLPtr) CWimTokenType::NewL} //CARD-WIM
+    };
+
+// -----------------------------------------------------------------------------
+// TImplementationProxy* ImplementationGroupProxy()
+// This function is needed by ECom and is the only one exported function
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TImplementationProxy* 
+                ImplementationGroupProxy( TInt& aTableCount )
+    {
+    aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy );
+
+    return ImplementationTable;
+    }
+
+