diff -r 000000000000 -r 164170e6151a gba/gbaapi/src/GbaServerSession.cpp --- /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 (&aInput), sizeof(TGBABootstrapInputParams), sizeof(TGBABootstrapInputParams)); + iGbaOutputBuffer.Set(reinterpret_cast (&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 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