stif/TestEngine/src/SettingServer.cpp
branchRCL_3
changeset 59 8ad140f3dd41
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stif/TestEngine/src/SettingServer.cpp	Wed Oct 13 16:17:58 2010 +0300
@@ -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 <e32std.h>
+#include <e32svr.h>
+
+#include "SettingServerClient.h"
+#include "SettingServer.h"
+
+#include <StifLogger.h>
+#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