diff -r 000000000000 -r a03f92240627 stif/TestEngine/src/SettingServer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/stif/TestEngine/src/SettingServer.cpp Tue Feb 02 01:57:15 2010 +0200 @@ -0,0 +1,571 @@ +/* +* 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 CSettingServer +* class member functions. +* +*/ + +// INCLUDE FILES +#include +#include + +#include "SettingServerClient.h" +#include "SettingServer.h" + +#include +#include "Logging.h" + +// EXTERNAL DATA STRUCTURES + +// EXTERNAL FUNCTION PROTOTYPES + +// CONSTANTS + +// MACROS + +// LOCAL CONSTANTS AND MACROS + +// MODULE DATA STRUCTURES + +// Struct to pass parameters to server thread +struct TThreadStartSetting + { + TFileName iName; // Server name + RThread iServerThread; // The server thread + RSemaphore iStarted; // Startup syncronisation semaphore + TInt iStartupResult;// Start-up result + }; + +// LOCAL FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS + +// ==================== LOCAL FUNCTIONS ======================================= +// None + +#undef LOGGER +#define LOGGER iSettingServerLogger + +// ================= MEMBER FUNCTIONS ========================================= + +/* +------------------------------------------------------------------------------- + + Class: CSettingServer + + Method: PanicServer + + Description: Panics the server. + + Parameters: const TSettingServerPanic aPanic :in: Panic code + + Return Values: None + + Errors/Exceptions: None + + Status: Proposal + +------------------------------------------------------------------------------- +*/ +void CSettingServer::PanicServer( const TSettingServerPanic aPanic ) + { + +/*#ifdef USE_LOGGER + // Check if logger is available, if so, use it. + CStifLogger* log = (CStifLogger*) Dll::Tls(); + if (log) + { + log->Log(_L("SettingServer.DLL Panic %d"), aPanic); + } +#endif +*/ + RDebug::Print( _L( "CSettingServer::PanicServer" ) ); + _LIT( KTxtServer,"CSettingServer" ); + User::Panic( KTxtServer,aPanic ); + + } + +/* +------------------------------------------------------------------------------- + + Class: CSettingServer + + Method: NewL + + Description: Returns new CSettingServer object + + Parameters: const TName& aName: in: Server name + + Return Values: None + + Errors/Exceptions: Leaves if memory allocation, ConstructL or StartL + leaves. + + Status: Proposal + +------------------------------------------------------------------------------- +*/ +CSettingServer* CSettingServer::NewL( const TName& aName ) + + { + CSettingServer* self = new( ELeave ) CSettingServer(); + CleanupStack::PushL( self ); + + // Construct the server + self->ConstructL(); + + // Start the server + self->StartL( aName ); + + CleanupStack::Pop( self ); + + return self; + + } + +/* +------------------------------------------------------------------------------- + + Class: CSettingServer + + Method: ConstructL + + Description: Second level constructor. + + Parameters: None + + Return Values: None + + Errors/Exceptions: None + + Status: Proposal + +------------------------------------------------------------------------------- +*/ +void CSettingServer::ConstructL() + { + // Create logger, in Wins use HTML in HW default logger + TLoggerSettings loggerSettings; + // Directory must create by hand if test engine 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 SettingServer logging forced to RDebug" ) ); + loggerSettings.iEmulatorFormat = CStifLogger::ETxt; + loggerSettings.iHardwareOutput = CStifLogger::ERDebug; + loggerSettings.iEmulatorOutput = CStifLogger::ERDebug; +#endif + loggerSettings.iUnicode = EFalse; + loggerSettings.iAddTestCaseTitle = EFalse; + iSettingServerLogger = CStifLogger::NewL( + _L( "C:\\logs\\testframework\\testengine\\"), + _L( "SettingServer" ), + loggerSettings ); + + // iLoggerSettings initializations to indicate is setting in use + iLoggerSettings.iIsDefined.iCreateLogDir = EFalse; + iLoggerSettings.iEmulatorPath.Copy( _L( "" ) ); + iLoggerSettings.iEmulatorFormat = CStifLogger::ETxt; + iLoggerSettings.iEmulatorOutput = CStifLogger::EFile; + iLoggerSettings.iHardwarePath.Copy( _L( "" ) ); + iLoggerSettings.iHardwareFormat = CStifLogger::ETxt; + iLoggerSettings.iHardwareOutput = CStifLogger::EFile; + iLoggerSettings.iOverwrite = ETrue; + iLoggerSettings.iTimeStamp = ETrue; + iLoggerSettings.iLineBreak = ETrue; + iLoggerSettings.iEventRanking = EFalse; + iLoggerSettings.iThreadId = EFalse; + iLoggerSettings.iUnicode = EFalse; + iLoggerSettings.iAddTestCaseTitle = EFalse; + + iLoggerSettings.iIsDefined.iPath = EFalse; + iLoggerSettings.iIsDefined.iHwPath = EFalse; + iLoggerSettings.iIsDefined.iFormat = EFalse; + iLoggerSettings.iIsDefined.iHwFormat = EFalse; + iLoggerSettings.iIsDefined.iOutput = EFalse; + iLoggerSettings.iIsDefined.iHwOutput = EFalse; + iLoggerSettings.iIsDefined.iOverwrite = EFalse; + iLoggerSettings.iIsDefined.iLineBreak = EFalse; + iLoggerSettings.iIsDefined.iTimeStamp = EFalse; + iLoggerSettings.iIsDefined.iEventRanking = EFalse; + iLoggerSettings.iIsDefined.iThreadId = EFalse; + iLoggerSettings.iIsDefined.iUnicode = EFalse; + iLoggerSettings.iIsDefined.iAddTestCaseTitle = EFalse; + + __TRACE( KInit,( _L( "-.-.-.-.-.-.-.-.-.- SettingServer log starts -.-.-.-.-.-.-.-.-.-" ) ) ); + __TRACE( KInit,( _L( "CSettingServer::ConstructL()" ) ) ); + + } + +/* +------------------------------------------------------------------------------- + + Class: CSettingServer + + Method: CSettingServer + + Description: Constructor. + + Initialises non-zero member variables and base class with correct + priority. + + Parameters: None + + Return Values: None + + Errors/Exceptions: None + + Status: Proposal + +------------------------------------------------------------------------------- +*/ +CSettingServer::CSettingServer() : + CServer2( CSettingServer::ESettingServerSchedulerPriority ) + { + + } + +/* +------------------------------------------------------------------------------- + + Class: CSettingServer + + Method: ~CSettingServer + + Description: Destructor. + + Parameters: None + + Return Values: None + + Errors/Exceptions: None + + Status: Proposal + +------------------------------------------------------------------------------- +*/ +CSettingServer::~CSettingServer() + { + delete iSettingServerLogger; + + } + +/* +------------------------------------------------------------------------------- + + Class: CSettingServer + + Method: NewSessionL + + Description: Returns new session. + + Parameters: const TVersion &aVersion:in :Version required + + Return Values: CSharableSession* New session + + Errors/Exceptions: Leaves if invalid version + Leaves if CSettingServer construction leaves + + Status: Proposal + +------------------------------------------------------------------------------- +*/ +CSession2* CSettingServer::NewSessionL( const TVersion& aVersion, + const RMessage2& /*aMessage*/ ) const + + { + // check version is ok + TVersion v( KSettingServerMajorVersionNumber, + KSettingServerMinorVersionNumber, + KSettingServerVersionNumber + ); + + if( !User::QueryVersionSupported( v, aVersion ) ) + { + User::Leave( KErrNotSupported ); + } + + return CLoggerSetting::NewL( ( CSettingServer* ) this ); + } +/* +------------------------------------------------------------------------------- + + Class: CSettingServer + + Method: OpenSession + + Description: Opens session. Session calls calls this when session is + properly constructed. + + Parameters: None + + Return Values: None + + Errors/Exceptions: None + + Status: Proposal + +------------------------------------------------------------------------------- +*/ +void CSettingServer::OpenSession() + { + iSessions++; + + } + +/* +------------------------------------------------------------------------------- + + Class: CSettingServer + + Method: Logger + + Description: Return pointer to the Logger(iSettingServerLogger) + + Parameters: None + + Return Values: CStifLogger*: Pointer to Logger + + Errors/Exceptions: None + + Status: Proposal + +------------------------------------------------------------------------------- +*/ +CStifLogger* CSettingServer::Logger() + { + return iSettingServerLogger; + + } + +/* +------------------------------------------------------------------------------- + + Class: CSettingServer + + Method: CloseSession + + Description: Closes session. CLoggerSetting::CloseSession calls this + to inform server class. + + If there are not any active sessions, then stop active scheduler and + close whole server. + + Parameters: None + + Return Values: None + + Errors/Exceptions: Function panics if OpenSessions() and CloseSessions() + does not match. + + Status: Proposal + +------------------------------------------------------------------------------- +*/ +void CSettingServer::CloseSession() + { + __ASSERT_ALWAYS ( iSessions > 0, CSettingServer::PanicServer(ETooManyCloseSessions)); + iSessions--; + + if ( iSessions == 0 ) + { + // Stop the active scheduler if no-one is using server anymore + CActiveScheduler::Stop(); + } + + } + +/* +------------------------------------------------------------------------------- + + Class: CSettingServer + + Method: ThreadFunction + + Description: The thread function, where Setting Server lives in + + Parameters: TAny* aStartInfo aName: in: Start-up information + + Return Values: TInt: Result from server start + + Errors/Exceptions: Panics current thread if: + Invalid start-up information + Clean-up stack can't be created + Setting Server can't be started + + Status: Proposal + +------------------------------------------------------------------------------- +*/ +TInt CSettingServer::ThreadFunction( TAny* aStarted ) + { + __UHEAP_MARK; + + // Get start-up information + TThreadStartSetting* startInfo = ( TThreadStartSetting* ) aStarted; + __ASSERT_ALWAYS( startInfo,PanicServer( ENoStartupInformation ) ); + + // Create clean-up stack + CTrapCleanup* tc = CTrapCleanup::New(); + __ASSERT_ALWAYS( tc, PanicServer(ECreateTrapCleanup)); + + // Construct and install active scheduler + CActiveScheduler* scheduler = new CActiveScheduler; + __ASSERT_ALWAYS( scheduler, PanicServer( EMainSchedulerError ) ); + CActiveScheduler::Install( scheduler ); + + // Construct server + CSettingServer* server = NULL; + RDebug::Print( startInfo->iName ); + TRAPD( err, server = CSettingServer::NewL( startInfo->iName ) ); + __ASSERT_ALWAYS( !err, PanicServer( ESvrCreateServer ) ); + + // Inform that we are up and running + startInfo->iStartupResult = KErrNone; + startInfo->iStarted.Signal(); + + // Start handling requests + CActiveScheduler::Start(); + + // Execution continues from here after CActiveScheduler::Stop + + // Delete the server. This should be deleted before scheduler, + // if server still has any active objects + delete server; + server = NULL; + + // Delete scheduler. + delete scheduler; + scheduler = NULL; + + // Delete clean-up stack + delete tc; + tc = NULL; + + __UHEAP_MARKEND; + + return KErrNone; + + } + +// ================= 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: TName& aServerName: inout: The name of the server + + Return Values: TInt: Symbian error code + + Errors/Exceptions: None + + Status: Proposal + +------------------------------------------------------------------------------- +*/ +EXPORT_C TInt StartNewServer( TName& aServerName ) + { + __UHEAP_MARK; + + _LIT(KServerName, "SettingServer"); + + //Ccheck server not already started + TFindServer findServer( KServerName ); + TFullName name; + if( findServer.Next( name ) == KErrNone ) + { + // Server already started, nothing to do + aServerName = KServerName; + __UHEAP_MARKEND; + return KErrAlreadyExists; + } + + // Construct start-up information object + TThreadStartSetting* startInfo = new TThreadStartSetting(); + if( startInfo == NULL ) + { + __UHEAP_MARKEND; + return KErrNoMemory; + } + + // Fill the start-up information + startInfo->iName = KServerName; + startInfo->iStartupResult = KErrNone; + startInfo->iStarted.CreateLocal( 0 ); + + // Create thread + TInt res = startInfo->iServerThread.Create( + startInfo->iName , // Name of thread + CSettingServer::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 ) + + + // Set server name + aServerName = KServerName; + + // Free memory + TInt r = startInfo->iStartupResult; + startInfo->iServerThread.Close(); + startInfo->iStarted.Close(); + delete startInfo; + startInfo = NULL; + + __UHEAP_MARKEND; + + // Return start-up result. + return r; + + } + +// End of File