diff -r 000000000000 -r 164170e6151a wim/WimPlugin/src/WimTokenType.cpp --- /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 +#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& 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; + } + +