bluetoothengine/bthid/common/src/genericclient.cpp
changeset 0 f63038272f30
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/bthid/common/src/genericclient.cpp	Mon Jan 18 20:28:57 2010 +0200
@@ -0,0 +1,90 @@
+/*
+* Copyright (c) 2008 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 is the implementation of application class
+ *
+*/
+
+
+#include <e32math.h>
+
+#include "genericclient.h"
+#include "genericserver.h"
+
+// ----------------------------------------------------------------------
+
+TInt RGenericSession::StartSession(const TDesC& aServer,
+        const TVersion& aVersion, const TDesC& aFilename,
+        const TUidType& aUid, TInt aAsyncMessageSlots)
+    {
+    // The server may be running already, so try connecting immediately
+    TInt error = CreateSession(aServer, aVersion, aAsyncMessageSlots);
+
+    if (KErrNone != error)
+        {
+        // Failed to connect so create a new server instance and try again.
+        // If creating the server fails, it may be due to another client
+        // creating a server in the meantime, so ignore any error here.
+        DBG(RDebug::Print(_L("RGenericSession::StartSession(): calling CreateServer()...")));
+        CreateServer(aServer, aFilename, aUid);
+        DBG(RDebug::Print(_L("RGenericSession::StartSession(): calling CreateSession()...")));
+        error = CreateSession(aServer, aVersion, aAsyncMessageSlots);
+        }
+
+    DBG(RDebug::Print(_L("RGenericSession::StartSession(): returning %d"),error));
+
+    return error;
+    }
+
+TInt RGenericSession::CreateServer(const TDesC& /*aServer*/,
+        const TDesC& aFilename, const TUidType& aUid)
+    {
+    TInt result;
+    TRequestStatus startup = KRequestPending;
+    TStartupRequest startupRequest(&startup, RThread().Id());
+
+    RProcess server;
+    TPtrC startupPtr(reinterpret_cast<TText*> (&startupRequest),
+            KStartupTextLength);
+
+    DBG(RDebug::Print(_L("RGenericSession::CreateServer(): calling server.Create()")));
+    result = server.Create(aFilename, startupPtr, aUid);
+
+    DBG(RDebug::Print(_L("RGenericSession::CreateServer(): server.Create() result: %d"),result));
+
+    if (KErrNone == result)
+        {
+        TRequestStatus stat;
+        server.Rendezvous(stat);
+        if (stat != KRequestPending)
+            {
+            DBG(RDebug::Print(_L("RGenericSession::CreateServer(): __SECURE_API__ ClientStart, stat != KRequestPending, Kill process ")));
+            server.Kill(0); // abort startup
+            }
+        else
+            {
+            DBG(RDebug::Print(_L("RGenericSession::CreateServer(): __SECURE_API__ ClientStart, logon OK - start the server ")));
+            server.Resume(); // logon OK - start the server
+            }
+        User::WaitForRequest(stat); // 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
+        result = (server.ExitType() == EExitPanic) ? KErrGeneral : stat.Int();
+        DBG(RDebug::Print(_L("RGenericSession::CreateServer(): __SECURE_API__ ClientStart, server exit result: %d"),result));
+
+        server.Close();
+        }
+
+    return result;
+    }