--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/supl/locationsuplfw/nwinitiationapi/src/epos_suplneworkstartserver.cpp Tue Feb 02 01:06:48 2010 +0200
@@ -0,0 +1,106 @@
+/*
+* Copyright (c) 2002-2005 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: SUPL Server startup code
+*
+*/
+
+
+
+#include <e32base.h>
+#include <e32math.h>
+
+#include "epos_suplnetworkipc.h"
+#include "epos_suplnetworkserverstart.h"
+#include "epos_suplnetwork.h"
+
+#ifdef _DEBUG
+#include <e32debug.h>
+#endif
+_LIT(KSuplServerStartupSemaphoreName, "SuplServerStartupSem");
+
+/**
+ * Start the server process/thread which lives in an EPOCEXE object.
+ *
+ * \internal
+ * @return KErrNone if successful, any other error code otherwise
+ */
+TInt RSuplNetworkServer::StartServer()
+ {
+ TRequestStatus started;
+ TInt ret;
+
+ RSemaphore startupSemaphore;
+ ret = startupSemaphore.CreateGlobal( KSuplServerStartupSemaphoreName, 0 );
+
+ if ( ret == KErrAlreadyExists )
+ {
+ // The server is starting up, but has not yet started
+ startupSemaphore.OpenGlobal( KSuplServerStartupSemaphoreName );
+ // wait until the server has started up, Max 5 secs.
+ TInt err = startupSemaphore.Wait(5000000);
+ startupSemaphore.Close();
+ if (err != KErrNone)
+ return err;
+ else
+ return ret;
+ }
+
+#ifdef _DEBUG
+ RDebug::Print(_L("SuplNetworkApi: Starting SUPL Server..."));
+#endif
+ const TUidType serverUid(KNullUid, KNullUid, KSuplServerUid3);
+
+ // Simultaneous launching of two such processes should be detected
+ // when the second one attempts to create the server object,
+ // failing with KErrAlreadyExists.
+ //
+ RProcess server;
+ ret = server.Create(KSuplServerImg, KNullDesC, serverUid);
+
+ if (ret != KErrNone)
+ {
+#ifdef _DEBUG
+ RDebug::Print(_L("SuplApi: server start failed %d"), ret);
+#endif
+ startupSemaphore.Close();
+ return ret;
+ }
+
+ TRequestStatus died;
+ server.Rendezvous(died);
+
+ if (died != KRequestPending)
+ {
+ // logon failed - server is not yet running, so cannot have terminated
+ User::WaitForRequest(died); // eat signal
+ server.Kill(0); // abort startup
+ }
+ else
+ {
+ server.Resume();
+ }
+ User::WaitForRequest(died); // wait for start or death
+
+ // we can't use the 'exit reason' if the server panicked as this
+ // is the panic 'reason' and may be '0' which cannot be distinguished
+ // from KErrNone
+ ret = (server.ExitType() == EExitPanic) ? KErrGeneral : died.Int();
+ server.Close();
+ startupSemaphore.Wait();
+ startupSemaphore.Close();
+ return ret;
+ }
+
+//
+// End of file