--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/gba/gbaapi/src/GbaServerSession.cpp Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,189 @@
+/*
+* Copyright (c) 2007 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 of RGbaServerSession
+*
+*/
+
+
+#include "GbaCommon.h"
+#include "GbaServerSession.h"
+#include "GBALogger.h"
+
+// Number of message slots to reserve for this client server session.
+// In this example we can have one asynchronous request outstanding
+// and one synchronous request in progress.
+static const TUint KDefaultMessageSlots = 2;
+static const TUid KServerUid3 = {0x20029F0A};
+
+
+static TInt StartServer();
+static TInt CreateServerProcess();
+
+// -----------------------------------------------------------------------------
+// RGbaServerSession::RGbaServerSession()
+// -----------------------------------------------------------------------------
+//
+RGbaServerSession::RGbaServerSession()
+: RSessionBase(), iGbaInputBuffer(NULL, 0, 0), iGbaOutputBuffer(NULL, 0, 0)
+ {
+ // No implementation required.
+ }
+
+// -----------------------------------------------------------------------------
+// RGbaServerSession::Connect()
+// -----------------------------------------------------------------------------
+//
+TInt RGbaServerSession::Connect()
+ {
+ TInt error = ::StartServer();
+ GBA_TRACE_DEBUG(("RGbaServerSession::Connect"));
+ if (KErrNone == error)
+ {
+ GBA_TRACE_DEBUG(("RGbaServerSession::Connect 1"));
+ error = CreateSession(KGbaServerName,
+ Version(),
+ KDefaultMessageSlots);
+ }
+
+ return error;
+ }
+
+
+// -----------------------------------------------------------------------------
+// RGbaServerSession::Version()
+// -----------------------------------------------------------------------------
+//
+TVersion RGbaServerSession::Version() const
+ {
+ return(TVersion(KGbaServMajorVersionNumber,
+ KGbaServMinorVersionNumber,
+ KGbaServBuildVersionNumber));
+ }
+
+
+// -----------------------------------------------------------------------------
+// RGbaServerSession::RequestBootstrap()
+// -----------------------------------------------------------------------------
+//
+void RGbaServerSession::RequestBootstrap( TGBABootstrapInputParams& aInput, TGBABootstrapOutputParams& aOutput, TRequestStatus& aStatus)
+ {
+ iGbaInputBuffer.Set(reinterpret_cast <TUint8*>(&aInput), sizeof(TGBABootstrapInputParams), sizeof(TGBABootstrapInputParams));
+ iGbaOutputBuffer.Set(reinterpret_cast <TUint8*>(&aOutput), sizeof(TGBABootstrapOutputParams), sizeof(TGBABootstrapOutputParams));
+ TIpcArgs messageParameters(&iGbaInputBuffer, &iGbaOutputBuffer);
+ SendReceive(EGbaServRequestBootstrap, messageParameters, aStatus);
+ }
+
+
+// -----------------------------------------------------------------------------
+// RGbaServerSession::CancelBootstrap()
+// -----------------------------------------------------------------------------
+//
+TInt RGbaServerSession::CancelBootstrap() const
+ {
+ return SendReceive(EGbaServCancelRequestBootstrap);
+ }
+
+// -----------------------------------------------------------------------------
+// RGbaServerSession::WriteOption()
+// -----------------------------------------------------------------------------
+//
+TInt RGbaServerSession::WriteOption(TUid optionUid, const TDesC8& aValue) const
+ {
+ TIpcArgs messageParameters(optionUid.iUid,&aValue);
+ return SendReceive(EGbaServWriteOption,messageParameters);
+ }
+
+
+// -----------------------------------------------------------------------------
+// RGbaServerSession::IsGBAUSupported()
+// -----------------------------------------------------------------------------
+//
+TInt RGbaServerSession::IsGBAUSupported( TBool& aIsGBAUSupported )
+ {
+
+ TPckg<TBool> pckg( aIsGBAUSupported );
+ TIpcArgs messageParameters( &pckg );
+ TInt err = SendReceive(EGbaServIsGBAUSupported,messageParameters);
+ GBA_TRACE_DEBUG_NUM(("returned error is %d"), err );
+ return err;
+ }
+
+
+// -----------------------------------------------------------------------------
+// StartServer()
+// -----------------------------------------------------------------------------
+//
+static TInt StartServer()
+ {
+ TInt result;
+
+ TFindServer findGbaServer(KGbaServerName);
+ TFullName name;
+
+ result = findGbaServer.Next(name);
+ if ( result == KErrNone )
+ {
+ return KErrNone;
+ }
+
+ result = CreateServerProcess();
+ if ( result != KErrNone )
+ {
+ return result;
+ }
+
+ return KErrNone;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CreateServerProcess()
+// -----------------------------------------------------------------------------
+//
+static TInt CreateServerProcess()
+ {
+ TInt result;
+ const TUidType serverUid(KNullUid, KNullUid, KServerUid3);
+ RProcess server;
+ result = server.Create( KGbaServerName, _L(""), serverUid );
+ if ( result != KErrNone )
+ {
+ return result;
+ }
+
+ TRequestStatus stat;
+ server.Rendezvous(stat);
+ if (stat!=KRequestPending)
+ {
+ // abort startup
+ server.Kill(0);
+ }
+ else
+ {
+ // logon OK - start the server
+ server.Resume();
+ }
+ // wait for start or death
+ User::WaitForRequest(stat);
+ // 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
+ TInt r=(server.ExitType()==EExitPanic) ? KErrGeneral : stat.Int();
+ server.Close();
+
+ return r;
+ }
+
+
+//EOF