--- /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 <e32svr.h>
+#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));
+}
+