diff -r 000000000000 -r 4e1aa6a622a0 dosservices/dosserver/src/doscliserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dosservices/dosserver/src/doscliserver.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,167 @@ +/* +* 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: +* Implementation for the RDosServer class. +* +*/ + + +#include +#include "DosSvrServices.h" +#include "dosclientserver.h" +#include "dosserver.h" +#include "dos_debug.h" + +// CONSTANTS +const TUid KDosServerUid = {0x101f6efa}; +const TInt KConnectionTries = 5; +#if defined(__WINS__) +_LIT( KDosSrvLibName, "DosSrv.dll" ); +const TInt KDosSrvThreadStartPos = 103; +#endif + +// ================= MEMBER FUNCTIONS ======================= + +// ----------------------------------------------------------------------------- +// RDosServer::StartServer +// Creates the server thread/process +// ----------------------------------------------------------------------------- +EXPORT_C TInt RDosServer::StartServer() const +{ + API_TRACE_( "[DOSSERVER] RDosServer::StartServer()" ); + + TInt ret(KErrNone); + TRequestStatus status; + // IPCv2: TSignal no longer used, but still passed to threadfunction as + // otherwise API change would be required. + CDosServer::TSignal signal( status ); + + // Create startup semaphore + RSemaphore startupSemaphore; + ret = startupSemaphore.CreateGlobal( KServerStartupSemaphoreName, 0 ); + + if ( ret == KErrAlreadyExists ) + { + // The server is starting up, but has not yet started + startupSemaphore.OpenGlobal( KServerStartupSemaphoreName ); + startupSemaphore.Wait(); // wait until the server has started up. + startupSemaphore.Close(); + return ret; + } + + // launch server thread (emulator) or process (Target platform) + + RProcess server; + + ret = server.Create( KDosServerExe, signal.Get(), + TUidType( KNullUid, KNullUid, KDosServerUid ), + EOwnerThread ); + + if ( ret ) + { + startupSemaphore.Close(); + return ret; + } + + server.SetPriority(EPriorityHigh); + + server.Resume(); + server.Close(); + + startupSemaphore.Wait(); + startupSemaphore.Close(); + + return KErrNone; +} + +// ----------------------------------------------------------------------------- +// RDosServer::Connect +// ----------------------------------------------------------------------------- +EXPORT_C TInt RDosServer::Connect() +{ + API_TRACE_( "[DOSSERVER] RDosServer::Connect()" ); + + TInt err( KErrNone ); + + for ( TInt tries = 0; tries < KConnectionTries ; tries++ ) + { + COM_TRACE_1( "[DOSSERVER]\t RDosServer::Connect() tries: %d", tries ); + + err = CreateSession( KDosServerName, TVersion(1,0,0)); + COM_TRACE_1( "[DOSSERVER]\t RDosServer::Connect()-CreateSession err: %d", err ); + + // Break if connected to existing server or if the problem is + // other than missing server. + + if ( err == KErrNone || + ( err != KErrNotFound && err != KErrServerTerminated ) ) + { + break; + } + + // do not try to start server on last round (since if it failed before with KErrNone + // (i.e. failure in server side on launch), + // it is likely to fail again and reset the error code to KErrNone) + if ( tries < (KConnectionTries - 1) ) + { + err = StartServer(); // try start a new server + COM_TRACE_1( "[DOSSERVER]\t RDosServer::Connect()-StartServer err: %d", err ); + + // If server launched ok or someone else got to launch it first, + // try connect again. + + if ( err != KErrNone && err != KErrAlreadyExists ) + { + break; // server not launched: don't cycle round again + } + } + } + + return err; +} + +// FLAGS STRUCTURE (It always goes in the third (2) position of the parameter array) +// +// KAutoComplete: +// +// Position: 0 0 0 0 0 0 0 x +// Values: 0 -> AutoComplete is not active. +// 1 -> AutoComplete is active. + + +// ----------------------------------------------------------------------------- +// RDosServer::Close() +// Closes the session. +// ----------------------------------------------------------------------------- + +EXPORT_C void RDosServer::Close() +{ + API_TRACE_( "[DOSSERVER] RDosServer::Close()" ); + + RSessionBase::Close(); // deletes session object +} + + +// ----------------------------------------------------------------------------- +// RDosServer::ServerShutdown() +// Shutdowns the server +// ----------------------------------------------------------------------------- + +EXPORT_C void RDosServer::ServerShutdown() const +{ + API_TRACE_( "[DOSSERVER] RDosServer::ServerShutdown()" ); + + Send(EServerShutdown, TIpcArgs(TIpcArgs::ENothing, TIpcArgs::ENothing, KAutoComplete)); +} +