--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/genericopenlibs/openenvcore/backend/src/signalserver/client/signalclient.cpp Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,139 @@
+// Copyright (c) 2008-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:
+// Name : signalclient.cpp
+// Part of : signal server
+//
+//
+
+#include "signalclient.h"
+#include "signalcommon.h"
+#include <e32std.h>
+
+// A version must be specified when creating a session with the server
+
+const TUint KIpcServerMajorVersionNumber = 1;
+const TUint KIpcServerMinorVersionNumber = 0;
+const TUint KIpcServerBuildVersionNumber = 0;
+
+_LIT(KServerName,"SignalServer");
+const TUid KServerUid3={0x2001F3C8};
+
+static TInt StartServer()
+ {
+ const TUidType serverUid(KNullUid,KNullUid,KServerUid3);
+ RProcess server;
+ TInt r = server.Create(KServerName,KNullDesC);
+ if ( r != KErrNone )
+ {
+ return r;
+ }
+ TRequestStatus stat;
+ server.Rendezvous(stat);
+ if ( stat != KRequestPending )
+ {
+ server.Kill(0); // abort startup
+ }
+ else
+ {
+ 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
+
+ r = ( server.ExitType() == EExitPanic ) ? KErrGeneral : stat.Int();
+ server.Close();
+ return r;
+ }
+
+TInt RSignalSession::Connect()
+ {
+ TInt retry = 2; // A maximum of two iterations of the loop required
+ for(;;)
+ {
+ TInt r = CreateSession(KServerName,TVersion(KIpcServerMajorVersionNumber,
+ KIpcServerMinorVersionNumber,
+ KIpcServerBuildVersionNumber), -1,
+ EIpcSession_Sharable);
+
+ if ( (KErrNotFound != r) && (KErrServerTerminated != r) )
+ {
+ return r;
+ }
+ if ( --retry == 0 )
+ {
+ return r;
+ }
+ r = StartServer();
+ if ( (KErrNone != r) && (KErrAlreadyExists != r) )
+ {
+ return r;
+ }
+ }
+ }
+
+TInt RSignalSession::OnDemandConnection()
+ {
+ TInt err = KErrNone;
+ //On Demand connection
+ if ( !iIsConnected )
+ {
+ Lock();
+ if ( !iIsConnected )
+ {
+ err = Connect ();
+ if ( KErrNone == err)
+ {
+ iIsConnected = ETrue;
+ }
+ }
+ UnLock();
+ }
+ return err;
+ }
+
+TInt RSignalSession::SendSignal(TInt aPid,TInt aSignal)
+ {
+ TInt err = KErrNone;
+ if (KErrNone != OnDemandConnection())
+ {
+ return KErrGeneral;
+ }
+ err = SendReceive(ESendSignal, TIpcArgs(aPid,aSignal));
+ return err;
+ }
+
+TInt RSignalSession::SendSignalValue(TInt aPid,TInt aSignal,TInt aValue)
+ {
+ TInt err = KErrNone;
+ if (KErrNone != OnDemandConnection())
+ {
+ return KErrGeneral;
+ }
+ err = SendReceive(ESendSignalValue, TIpcArgs(aPid,aSignal,aValue));
+ return err;
+ }
+
+TInt RSignalSession::SendPipe(RPipe& aPipe)
+ {
+ TInt err = KErrNone;
+ if (KErrNone != OnDemandConnection())
+ {
+ return KErrGeneral;
+ }
+ err = SendReceive(ESendPipe, TIpcArgs(aPipe));
+ return err;
+ }