stif/TestServer/src/TestServer.cpp
branchRCL_3
changeset 19 07b41fa8d1dd
parent 18 3406c99bc375
child 20 ca8a1b6995f6
--- a/stif/TestServer/src/TestServer.cpp	Thu Jul 15 20:25:38 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,976 +0,0 @@
-/*
-* Copyright (c) 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: This module contains implementation of CTestServer 
-* class member functions.
-*
-*/
-
-// INCLUDE FILES
-#include <e32std.h>
-#include <e32svr.h>
-#include "TestEngineClient.h"
-#include <StifTestModule.h>
-#include <stifinternal/TestServerClient.h>
-#include "TestServer.h"
-#include "TestServerCommon.h"
-#include <stifinternal/TestThreadContainerRunnerFactory.h>
-
-// EXTERNAL DATA STRUCTURES
-
-// EXTERNAL FUNCTION PROTOTYPES  
-
-// CONSTANTS
-
-// MACROS
-
-// LOCAL CONSTANTS AND MACROS
-
-// MODULE DATA STRUCTURES
-
-// Struct to pass parameters to server thread
-struct TThreadStartTestServer
-    {
-    TFileName  iName;         // Server name
-    RThread    iServerThread; // The server thread
-    RSemaphore iStarted;      // Startup syncronisation semaphore   
-    TBool      iInNewThread;  // Is thread running in new process?
-    TInt       iStartupResult;// Start-up result
-    TBool      iUiTesting;    // Is it testserver for UI testing
-    CTestThreadContainerRunnerFactory* iTestThreadContainerRunnerFactory; // Pointer to CTestThreadContainerRunner. Defined when
-																		  // iUiTesting is true
-    };
-
-// LOCAL FUNCTION PROTOTYPES
-
-// FORWARD DECLARATIONS
-
-// ==================== LOCAL FUNCTIONS =======================================
-
-// None
-
-// ================= MEMBER FUNCTIONS =========================================
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestServer
-
-    Method: PanicServer
-
-    Description: Panics the server. 
-
-    Parameters: const TTestServerPanic aPanic: in: Panic code
-
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CTestServer::PanicServer( const TTestServerPanic aPanic )
-    {
-    
-#ifdef USE_LOGGER
-    // Check if logger is available, if so, use it.
-    CStifLogger* log = (CStifLogger*) Dll::Tls();
-    if ( log )
-        {
-        log->Log( CStifLogger::ERed, _L("TestServer.DLL Panic %d"), aPanic);
-        }
-#endif
-
-    RDebug::Print( _L( "CTestServer::PanicServer" ) );
-    _LIT( KTxtTestServer,"CTestServer" );
-    User::Panic( KTxtTestServer,aPanic );
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestServer
-
-    Method: NewL
-
-    Description: Returns new CTestServer object
-
-    Parameters: const TFileName& aName: in: Server name
-
-    Return Values: None
-
-    Errors/Exceptions: Leaves if memory allocation, ConstructL or StartL leaves.
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-CTestServer* CTestServer::NewL( const TFileName& aName )
-    {
-
-    CTestServer* self = new( ELeave ) CTestServer();
-    CleanupStack::PushL( self );
-
-    // Construct the server
-    self->ConstructL( aName );
-
-    // Start the server
-    self->StartL( aName );
-
-    CleanupStack::Pop( self );
-
-    return self;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestServer
-
-    Method: ConstructL
-
-    Description: Second level constructor. Obtains pointer to library
-    entrypoint.
-
-    Parameters: const TFileName& aName: in: Server name
-
-    Return Values: None
-
-    Errors/Exceptions: Leaves if entrypoint can't be obtained.
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CTestServer::ConstructL( const TFileName& aName )
-    {
-    // Construct heap buffer for configuration file
-    iModuleNameBuffer = HBufC::NewL( aName.Length() );
-    iModuleName.Set ( iModuleNameBuffer->Des() );
-    iModuleName.Copy ( aName );
-
-    iContainerIndex = CObjectConIx::NewL();
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestServer
-
-    Method: CTestServer
-
-    Description: Constructor.
-
-    Initialises non-zero member variables and base class with correct
-    priority.
-
-    Parameters: None
-
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-CTestServer::CTestServer() : CServer2( CTestServer::ETestServerPriority ),
-                             iModuleName(0, 0),
-                             iSessionCount( 0 )
-    {
-    iFirstTime = ETrue;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestServer
-
-    Method: ~CTestServer
-
-    Description: Destructor
-    Frees memory.
-
-    Parameters: None
-
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-CTestServer::~CTestServer()
-    {
-
-    delete iModuleNameBuffer;
-    iModuleNameBuffer = NULL;
-
-    delete iContainerIndex;
-    iContainerIndex = NULL;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestServer
-
-    Method: NewContainerL
-
-    Description: Returns new container. Used to store subsessions
-
-    Parameters: None
-
-    Return Values: CObjectCon* New object container
-
-    Errors/Exceptions: None
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-CObjectCon* CTestServer::NewContainerL()
-    {
-     
-    CObjectCon* container = iContainerIndex->CreateL();
-
-    iSessionCount++;
-
-    return container;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestServer
-
-    Method: DeleteContainer
-
-    Description: Deletes a container.
-
-    Parameters: CObjectCon* aContainer: in: Container to be removed
-
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CTestServer::DeleteContainer( CObjectCon* aContainer )
-    {
-    iContainerIndex->Remove( aContainer );
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestServer
-
-    Method: SessionClosed
-
-    Description: Inform Server that session is closed.
-
-    Parameters: None
-
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CTestServer::SessionClosed()
-    {
-    // Decrease session count
-    iSessionCount--;
-
-    // Check if last session is closed
-    if ( iSessionCount <= 0 )
-        {
-        // Stop the active scheduler
-        // Execution will continue in ThreadFunction()
-        CActiveScheduler::Stop();
-        }
-
-    }
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestServer
-
-    Method: NewSessionL
-
-    Description: Returns new session.
-    
-    Parameters: const TVersion &aVersion: in: Version required
-
-    Return Values: CSharableSession* New session
-
-    Errors/Exceptions: Leaves if invalid version or CTestModule construction
-                       leaves
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-CSession2* CTestServer::NewSessionL( const TVersion& aVersion,
-                                        const RMessage2& /*aMessage*/ ) const
-    {
-    // check version is ok
-    TVersion v( KTestServerMajorVersionNumber,
-                KTestServerMinorVersionNumber,
-                KTestServerBuildVersionNumber
-               );
-    if( !User::QueryVersionSupported( v,aVersion ) )
-        {
-        User::Leave( KErrNotSupported );
-        }
-
-    return CTestModule::NewL( ( CTestServer* ) this );
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestServer
-
-    Method: ModuleName
-
-    Description: Returns module name
-
-    Parameters: None
-
-    Return Values: const TDesC&* Module name
-
-    Errors/Exceptions: None
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-const TDesC& CTestServer::ModuleName() const
-    {
-    return iModuleName;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestServer
-
-    Method: FirstTime
-
-    Description: Is module already once initialised.
-
-    Parameters: None
-
-    Return Values: TBool Has module initialized?
-
-    Errors/Exceptions: None
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-//@spe const TBool CTestServer::FirstTime() const
-TBool CTestServer::FirstTime() const
-    {
-    return iFirstTime;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestServer
-
-    Method: ClearFirstTime
-
-    Description: Clear module first time flag. 
-
-    Parameters: None
-
-    Return Values: None
-
-    Errors/Exceptions: None
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CTestServer::ClearFirstTime()
-    {
-    iFirstTime = EFalse;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestServer
-
-    Method: ThreadFunction
-
-    Description: The thread function, where Test Server lives in
-    
-    Parameters: TAny* aStarted: in: Start-up information
-    
-    Return Values: TInt Result from test module
-
-    Errors/Exceptions: Clean-up stack can't be created because cannot
-                       leave, error checks are done locally.
-                       Panics if:
-                       invalid start-up information
-                       Test Server can't be started
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-TInt CTestServer::ThreadFunction( TAny* aStarted )
-    {
-
-    __UHEAP_MARK;
-
-    TInt error( KErrNone );
-
-    // Get start-up information
-    TThreadStartTestServer* startInfo = ( TThreadStartTestServer* ) aStarted;
-    __ASSERT_ALWAYS( startInfo,PanicServer( ENoStartupInformation ) );
-
-    // Create clean-up stack
-    CTrapCleanup* tc = CTrapCleanup::New();
-    __ASSERT_ALWAYS( tc, PanicServer(ECreateTrapCleanup));
-
-    // Construct the logger
-    TName path = _L("C:\\logs\\testframework\\testserver\\");
-    TFileName name = _L("testserver_");
-    name.Append ( startInfo->iName );
-
-    // Create logger, in Wins use HTML in HW default logger
-    TLoggerSettings loggerSettings;
-
-    // Directory must create by hand if test server log wanted
-    loggerSettings.iCreateLogDirectories = EFalse;
-
-    loggerSettings.iOverwrite = ETrue;
-    loggerSettings.iTimeStamp = ETrue;
-    loggerSettings.iLineBreak = ETrue;
-    loggerSettings.iEventRanking = EFalse;
-    loggerSettings.iThreadId = EFalse;
-    loggerSettings.iHardwareFormat = CStifLogger::ETxt;
-#ifndef FORCE_STIF_INTERNAL_LOGGING_TO_RDEBUG
-    loggerSettings.iEmulatorFormat = CStifLogger::EHtml;
-    loggerSettings.iHardwareOutput = CStifLogger::EFile;
-    loggerSettings.iEmulatorOutput = CStifLogger::EFile;
-#else
-    RDebug::Print( _L( "STIF Test Server logging forced to RDebug" ) );
-    loggerSettings.iEmulatorFormat = CStifLogger::ETxt;
-    loggerSettings.iHardwareOutput = CStifLogger::ERDebug;
-    loggerSettings.iEmulatorOutput = CStifLogger::ERDebug;
-#endif
-    loggerSettings.iUnicode = EFalse;
-    loggerSettings.iAddTestCaseTitle = EFalse;
-
-    CStifLogger* logger = NULL;
-    TRAP ( error, logger = CStifLogger::NewL( path, name, loggerSettings ) );
-
-    // Thread Local Storage is used for get pointer to logger.
-    Dll::SetTls ( logger );
-
-    __TRACE( KInit,( _L( "TestServer.DLL server starting" ) ) );
-    __TRACE( KInit,( CStifLogger::EBold, _L( "Loading module: %S"), &startInfo->iName ) );
-
-    RLibrary module;
-    TInt ret = KErrNone;
-
-    TFileName newNameBuffer;
-    TInt check = CheckModuleName( startInfo->iName, newNameBuffer );
-    if( check == KErrNone )
-        {
-        // Load the module(TestScripter)
-        ret = module.Load( newNameBuffer );
-        }
-    else
-        {
-        RemoveOptionalIndex(startInfo->iName, newNameBuffer);
-        __TRACE(KInit, (CStifLogger::EBold, _L( "Valid module name is [%S] (extracted from [%S])"), &newNameBuffer, &startInfo->iName));
-        // Load the module(Others)
-        ret = module.Load(newNameBuffer);
-        }
-
-    // If test module loading fails, do not start server
-    if( ret != KErrNone )
-        {
-         __TRACE( KError,( CStifLogger::ERed, _L( "Test module loading failed, code = %d" ), ret ) );
-         __TRACE( KError,( _L( "Check that module is compiled properly and stored to correct directory and all DLLs that it requires are available" ) ) );                  
-
-         // Error will be handled in StartNewServer
-        startInfo->iStartupResult = ret;
-        startInfo->iStarted.Signal();
-        if ( !startInfo->iInNewThread )
-            {
-            startInfo->iStarted.Close();
-            }
-        module.Close();
-        Dll::FreeTls();
-        // Delete logger
-        delete logger;
-        logger = NULL;
-        // Delete clean-up stack
-        delete tc;
-        tc = NULL;
-        __UHEAP_MARKEND;
-        return ret;
-        }
-    else
-        {
-        __TRACE( KInit,( _L( "Test module loaded correctly" ) ) );
-        }
-
-    // Verify that there is function
-    CTestInterfaceFactory libEntry = ( CTestInterfaceFactory ) module.Lookup( 1 );
-    if( libEntry == NULL )
-        {
-         // Error will be handled in StartNewServer
-        __TRACE( KError,( CStifLogger::ERed, _L( "Can't find entrypoint from test module" ) ) );
-
-        startInfo->iStartupResult = KErrNotFound;
-        startInfo->iStarted.Signal();
-        if ( !startInfo->iInNewThread )
-            {
-            startInfo->iStarted.Close();
-            }
-        module.Close();
-        Dll::FreeTls();
-        // Delete logger
-        delete logger;
-        logger = NULL;
-        // Delete clean-up stack
-        delete tc;
-        tc = NULL;
-        __UHEAP_MARKEND;
-        return KErrNotFound;
-        }
-
-    module.Close();
-
-    // Construct and install active scheduler
-    CActiveScheduler* scheduler = new CActiveScheduler;
-    __ASSERT_ALWAYS( scheduler, PanicServer( EMainSchedulerError ) );
-    CActiveScheduler::Install( scheduler );
-
-    // Construct server
-    CTestServer* server = NULL;
-    TRAPD( err, server = CTestServer::NewL( startInfo->iName ) );
-    __ASSERT_ALWAYS( !err, PanicServer( ESvrCreateServer ) );
-
-    server->iUiTesting = startInfo->iUiTesting;
-    server->iTestThreadContainerRunnerFactory = startInfo->iTestThreadContainerRunnerFactory;
-    
-    // Inform that we are up and running
-    startInfo->iStartupResult = KErrNone;
-    startInfo->iStarted.Signal();
-    if ( !startInfo->iInNewThread )
-        {
-        startInfo->iStarted.Close();
-        }
-
-    // Start handling requests
-    CActiveScheduler::Start();
-
-    // Execution continues from here after CActiveScheduler::Stop
-
-    __TRACE( KVerbose,( _L( "TestServer.DLL active scheduler stopped" ) ) );
-
-    // Delete the server
-    delete server;
-    server = NULL;
-    __TRACE( KVerbose,( _L( "TestServer.DLL server object deleted" ) ) );
-
-    delete scheduler;
-    scheduler = NULL;
-    __TRACE( KVerbose,( _L( "Active scheduler deleted" ) ) );
-
-    __TRACE ( KInit, (_L("TestServer.DLL ThreadFunction exiting, server closing")) );
-
-    Dll::FreeTls();
-    // Delete logger
-    delete logger;
-    logger = NULL;
-    // Delete clean-up stack
-    delete tc;
-    tc = NULL;
-
-    __UHEAP_MARKEND;
-
-    return KErrNone;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestServer
-
-    Method: GetServerThreadId
-
-    Description: Returns server thread id
-
-    Parameters: None
-
-    Return Values: TInt : thread id
-
-    Errors/Exceptions: None
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-TInt CTestServer::GetServerThreadId()
-    {
-    RThread thread; 
-    return thread.Id();
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestServer
-
-    Method: GetTestThreadContainerRunnerFactory
-
-    Description: Returns server thread id
-
-    Parameters: None
-
-    Return Values: TInt : thread id
-
-    Errors/Exceptions: None
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-CTestThreadContainerRunnerFactory* CTestServer::GetTestThreadContainerRunnerFactory()
-	{
-	
-	return iTestThreadContainerRunnerFactory;
-	}
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestServer
-
-    Method: UiTesting
-
-    Description: Gets information if testserver supports UI testing
-
-    Parameters: None
-
-    Return Values: True if testserver supports UI testing, False if not.
-
-    Errors/Exceptions: None
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-TBool CTestServer::UiTesting()
-	{
-	
-	return iUiTesting;
-	}
-
-/*
--------------------------------------------------------------------------------
-
-    Class: CTestServer
-
-    Method: GetUiEnvProxy
-
-    Description: Gets UIEnvProxy
-
-    Parameters: None
-
-    Return Values: Pointer to UIEnvProxy.
-
-    Errors/Exceptions: None
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-CUiEnvProxy* CTestServer::GetUiEnvProxy()
-	{
-	
-	return iTestThreadContainerRunnerFactory->GetUiEnvProxy();
-	}
-
-
-// ================= OTHER EXPORTED FUNCTIONS =================================
-
-/*
--------------------------------------------------------------------------------
-
-    Class: -
-
-    Method: StartNewServer
-
-    Description: Starts a new server. Server will be running its own
-    thread and this functions returns when server is up and running or
-    server start-up fails.
-
-    Parameters: const TFileName& aModuleFileName: in: Module name
-                TFileName& aServerName: in: Server name
-                const TBool aInNewThread: in: Is new thread
-                RSemaphore aSynchronisation: in: For synchronisation
-                TBool aUiTestingServer: in: Indicates if testserver should support UI testing
-                CTestThreadContainerRunnerFactory* aTestThreadContainerRunnerFactory: in: Pointer to runner factory
-
-    Return Values: TInt: Symbian error code
-
-    Errors/Exceptions: None
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-EXPORT_C TInt StartNewServer( const TFileName& aModuleFileName,
-                              TFileName& aServerName,
-                              const TBool aInNewThread,
-                              RSemaphore aSynchronisation,
-                              TBool aUiTestingServer,
-                              CTestThreadContainerRunnerFactory* aTestThreadContainerRunnerFactory
-                            )
-    {
-
-    __UHEAP_MARK;
-
-    //Check server not already started
-    TFindServer findServer( aModuleFileName );
-    TFullName name;
-    if( findServer.Next( name ) == KErrNone )
-        {   
-        // Server already started, nothing to do
-        aServerName = aModuleFileName;
-        __UHEAP_MARKEND;
-        return KErrAlreadyExists;
-        }
-
-    // Construct start-up information object
-    TThreadStartTestServer* startInfo = new TThreadStartTestServer();
-    if( startInfo == NULL )
-        {
-        __UHEAP_MARKEND;
-        return KErrNoMemory;
-        }
-
-    // Fill the start-up information
-    startInfo->iName = aModuleFileName;
-    startInfo->iStartupResult = KErrNone;
-    startInfo->iStarted = aSynchronisation;
-    startInfo->iInNewThread = aInNewThread;
-	startInfo->iUiTesting = aUiTestingServer;
-	startInfo->iTestThreadContainerRunnerFactory = aTestThreadContainerRunnerFactory;
-
-    // EKA1
-    if ( aInNewThread )
-        {
-        // Create thread    
-        TInt res = startInfo->iServerThread.Create( 
-            startInfo->iName ,                       // Name of thread
-            CTestServer::ThreadFunction,             // Thread function
-            KDefaultStackSize,                       // Stack size
-            KDefaultHeapSize,                        // Heap initial size
-            KMaxHeapSize,                            // Heap start max size
-            startInfo                                // Parameter to thread function
-            );
-
-        // If thread creation failed
-        if( res != KErrNone )
-            {
-            startInfo->iStarted.Close();             // Close semaphore
-            delete startInfo;
-            startInfo = NULL;
-            __UHEAP_MARKEND;
-            return res;
-            }
-
-         // Now start thread
-        startInfo->iServerThread.SetPriority( EPriorityMuchMore ); 
-        startInfo->iServerThread.Resume();
-
-        // Wait until the thread is started
-        startInfo->iStarted.Wait();
-
-        // Server is started( or it has returned error )
-    
-
-        }
-
-    // EKA2 and EKA1's HW
-    else
-        {
-        // Call directly thread function, this starts server and
-        // blocks this thread.
-        // Priority is default, not known reason why should be greater
-        // than default priority (Work over a year).
-        CTestServer::ThreadFunction( startInfo );
-        }
-
-    // Set server name
-    aServerName = aModuleFileName;
-
-    // Free memory
-    TInt r = startInfo->iStartupResult;
-    startInfo->iServerThread.Close();
-    startInfo->iStarted.Close();
-    delete startInfo;
-    startInfo = NULL;
-
-    __UHEAP_MARKEND;
-
-    // Return start-up result.
-    return r;
-
-    }
-
-/*
--------------------------------------------------------------------------------
-
-    Class: -
-
-    Method: StartNewServer
-
-    Description: Starts a new server. Server will be running its own
-    thread and this functions returns when server is up and running or
-    server start-up fails.
-
-    Parameters: const TFileName& aModuleFileName: in: Module name
-                TFileName& aServerName: in: Server name
-                const TBool aInNewThread: in: Is new thread
-                RSemaphore aSynchronisation: in: For synchronisation
-
-    Return Values: TInt: Symbian error code
-
-    Errors/Exceptions: None
-
-    Status: Approved
-
--------------------------------------------------------------------------------
-*/
-EXPORT_C TInt StartNewServer( const TFileName& aModuleFileName,
-                              TFileName& aServerName,
-                              const TBool aInNewThread,
-                              RSemaphore aSynchronisation
-                            )
-	{
-	
-	return StartNewServer( aModuleFileName, aServerName, aInNewThread, aSynchronisation, false, NULL );
-	}
-
-
-/*
--------------------------------------------------------------------------------
-
-    Class: -
-
-    Method: StartNewServer
-
-    Description: Starts a new server. Server will be running its own
-    thread and this functions returns when server is up and running or
-    server start-up fails.
-
-    Parameters: const TFileName& aName: in: Module name to be used
-                TFileName& aServerName: out: The name of the server
-
-    Return Values: TInt Error code / KErrNone
-
-    Errors/Exceptions: None
-
-    Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-EXPORT_C TInt StartNewServer( const TFileName& aModuleFileName,
-                              TFileName& aServerName
-                            )
-    {
-
-    __UHEAP_MARK;
-
-    RMutex startupMutex;
-    TInt ret( KErrNone );
-    // Global mutex already created(see CTestEngineServer::ThreadFunction).
-    // Open global mutex.
-    ret = startupMutex.OpenGlobal( KStifTestServerStartupMutex );
-    if( ret != KErrNone )
-        {
-        // Not able to open mutex
-        return ret;
-        }
-
-    startupMutex.Wait();
-
-    //Check server not already started
-    TFindServer findServer( aModuleFileName );
-    TFullName name;
-    if( findServer.Next( name ) == KErrNone )
-        {
-        // Server already started, nothing to do
-        aServerName = aModuleFileName;
-        
-        // release startupmutex
-        startupMutex.Signal();
-        startupMutex.Close();
-
-        __UHEAP_MARKEND;
-        return KErrAlreadyExists;
-        }
-
-    RSemaphore startupSemaphore;
-    startupSemaphore.CreateLocal( 0 );
-
-    // Start server in new thread
-    TInt r = StartNewServer ( aModuleFileName, aServerName, ETrue, startupSemaphore );
-
-    // startupSemaphore will be closed inside StartNewServer when start-up is done.
-
-    // release startupmutex
-    startupMutex.Signal();
-    startupMutex.Close();
-
-    __UHEAP_MARKEND;
-
-    // Return start-up result.
-    return r;
-
-    }
-
-// End of File