--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wim/Scard/src/ScardServer.cpp Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,254 @@
+/*
+* 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: Smart card server
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "ScardBase.h"
+#include "ScardClsv.h"
+#include "ScardServerBase.h"
+#include "ScardServer.h"
+#include "WimTrace.h"
+
+// MODULE DATA STRUCTURES
+struct TThreadParameter
+ {
+ RSemaphore iSemaphore;
+ TInt iPanicCode;
+ };
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CScardServer::CScardServer
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CScardServer::CScardServer()
+ : CServer2( EPriorityStandard )
+ {
+ _WIMTRACE(_L("WIM|Scard|CScardServer::CScardServer|Begin"));
+ }
+
+// -----------------------------------------------------------------------------
+// CScardServer::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CScardServer::ConstructL()
+ {
+ _WIMTRACE(_L("WIM|Scard|CScardServer::ConstructL|Begin"));
+ iNotifyRegistry = CScardNotifyRegistry::NewL( this );
+ iControlRegistry = CScardAccessControlRegistry::NewL( this );
+ iReaderFactoryRegistry = CScardReaderRegistry::NewL( this );
+ iResourceRegistry = CScardResourceRegistry::NewL( this );
+ iConnectionRegistry = CScardConnectionRegistry::NewL( this );
+ }
+
+// -----------------------------------------------------------------------------
+// CScardServer::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CScardServer* CScardServer::NewL()
+ {
+ _WIMTRACE(_L("WIM|Scard|CScardServer::NewL|Begin"));
+ CScardServer* self = new( ELeave ) CScardServer;
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ TPtrC tempName;
+ tempName.Set( KScardServerName );
+ HBufC* pName = tempName.Alloc();
+ //Again these panics EPR
+ __ASSERT_ALWAYS( pName,
+ PanicServer( KScServerPanicSvrCreateServer ) );
+
+ self->iName = pName; // Ownership moves
+
+ // Start the server
+ TPtr name = self->iName->Des();
+ TInt r = self->Start( name );
+ __ASSERT_ALWAYS( r == KErrNone,
+ PanicServer( KScServerPanicSvrCreateServer ) );
+
+ return self;
+ }
+
+
+// Destructor
+CScardServer::~CScardServer()
+ {
+ _WIMTRACE(_L("WIM|Scard|CScardServer::~CScardServer|Begin"));
+ delete iNotifyRegistry;
+ delete iControlRegistry;
+ delete iReaderFactoryRegistry;
+ delete iResourceRegistry;
+ delete iConnectionRegistry;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CScardServer::PanicServer
+// Panics the server
+// -----------------------------------------------------------------------------
+//
+void CScardServer::PanicServer( const TInt aPanic )
+ {
+ _WIMTRACE(_L("WIM|Scard|CScardServer::PanicServer|Begin"));
+ User::Panic( _L( "ScardServer" ), aPanic );
+ }
+
+// -----------------------------------------------------------------------------
+// CScardServer::NewSessionL
+// Create a new client session for this server.
+// -----------------------------------------------------------------------------
+//
+CSession2* CScardServer::NewSessionL(
+ const TVersion& aVersion, const RMessage2& /*aMessage*/ ) const
+ {
+ _WIMTRACE(_L("WIM|Scard|CScardServer::NewSessionL|Begin"));
+ // check version is ok
+ TVersion v( KScardServMajorVersionNumber, KScardServMinorVersionNumber,
+ KScardServBuildVersionNumber );
+ if ( !User::QueryVersionSupported( v, aVersion ) )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+ // make new session
+ return CScardSession::NewL( const_cast< CScardServer* >( this ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CScardServer::ThreadFunction
+// Start active scheduler and do other new thread things
+// -----------------------------------------------------------------------------
+//
+GLDEF_C TInt CScardServer::ThreadFunction( TAny* aStarted )
+ {
+ _WIMTRACE(_L("WIM|Scard|CScardServer::ThreadFunction|Begin"));
+ // convert argument to initial data
+ TThreadParameter& data = *(static_cast< TThreadParameter* >( aStarted ) );
+ RSemaphore& started = data.iSemaphore;
+
+ data.iPanicCode = KErrNone;
+
+ // create cleanup stack
+ if ( !CTrapCleanup::New() )
+ {
+ data.iPanicCode = KScServerPanicCreateTrapCleanup;
+ started.Signal();
+ PanicServer( KScServerPanicCreateTrapCleanup );
+ }
+
+ // construct and install active scheduler
+ if ( !CActiveScheduler::Current() ) //Check if scheduler already started
+ {
+ CActiveScheduler* scheduler = new CActiveScheduler;
+ if ( !scheduler )
+ {
+ data.iPanicCode = KScServerPanicMainSchedulerError;
+ started.Signal();
+ PanicServer( KScServerPanicMainSchedulerError );
+ }
+ CActiveScheduler::Install( scheduler );
+ }
+ // construct server, an active object
+ TRAPD( err, CScardServer::NewL() );
+
+ if ( err )
+ {
+ data.iPanicCode = KScServerPanicSvrCreateServer;
+ started.Signal();
+ PanicServer( KScServerPanicSvrCreateServer );
+ }
+
+ // signal everything has started
+ started.Signal(); // now started ok
+
+ // start handling requests
+ CActiveScheduler::Start();
+ return KErrNone;
+ }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+// -----------------------------------------------------------------------------
+// StartThread Starts the server thread.
+// Returns: TInt: error code
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt StartThread()
+ {
+ _WIMTRACE(_L("WIM|Scard|CScardServer::StartThread|Begin"));
+ TInt res = KErrNone;
+
+ // check server not already started
+ TFindServer findSCardServer( KScardServerName );
+ TFullName name;
+ if ( findSCardServer.Next( name ) != KErrNone )
+ {
+ // create server thread
+ RThread thread;
+ TThreadParameter threadData;
+ threadData.iSemaphore.CreateLocal( 0 );
+
+ res = thread.Create(
+ KScardServerName, // name of thread
+ CScardServer::ThreadFunction, // thread function
+ KDefaultStackSize,
+ KDefaultMinHeapSize,
+ KDefaultMaxHeapSize,
+ &threadData // parameter to thread function
+ );
+
+ // If creation was successful, try starting the server
+ if ( res == KErrNone )
+ {
+ // now start thread
+ thread.SetPriority( EPriorityNormal ); // set its priority
+ thread.Resume(); // kick it into life
+ threadData.iSemaphore.Wait(); // wait until it's got going
+
+ if ( threadData.iPanicCode )
+ {
+ // The server did not start properly
+ thread.Kill( threadData.iPanicCode );
+ res = threadData.iPanicCode; // set the response
+ return res;
+ }
+
+ // tidy up
+ thread.Close(); // no longer interested in that thread
+ }
+ else
+ {
+ thread.Close();
+ }
+
+ threadData.iSemaphore.Close(); // or semaphore
+ }
+
+ // all well
+ return res;
+ }
+
+// End of File