diff -r 5a06f39ad45b -r 80975da52420 mmserv/sts/stsimplementation/src/rstssession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmserv/sts/stsimplementation/src/rstssession.cpp Mon May 03 12:59:52 2010 +0300 @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2010 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: + * The file provides the implementation of the client side session + * to the STS Server. + */ + +#include "rstssession.h" +#include "stsclientservercommon.h" + +const TUint KNumSlots = 30; + +TInt RStsSession::StartServer() + { + TInt err = KErrNone; + + // Launch the server executable (i.e. in it its own process). + + // Create a new server process. Simultaneous launching of two such processes + // should be detected when the second one attempts to create the server + // object, failing with KErrAlreadyExists. + RProcess server; + err = server.Create(KStsServerFile, KNullDesC); + + if (err == KErrNone) + { + TRequestStatus rendezvousStatus; + server.Rendezvous(rendezvousStatus); + + if (rendezvousStatus != KRequestPending) + { + server.Kill(0); // abort startup + } + else + { + server.Resume(); // logon OK - start the server thread + } // end if + + User::WaitForRequest(rendezvousStatus); // 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 + err = (server.ExitType() == EExitPanic) + ? KErrGeneral + : rendezvousStatus.Int(); + server.Close(); + } + + return err; + } + +TInt RStsSession::Connect() + { + TInt result = CreateSession(KStsServerName, TVersion( + KStsServerMajorVersion, KStsServerMinorVersion, KStsServerBuild), + KNumSlots, EIpcSession_Sharable); + + if (result == KErrNotFound) + { + result = StartServer(); + if (result == KErrNone || result == KErrAlreadyExists) + { + result = CreateSession(KStsServerName, TVersion( + KStsServerMajorVersion, KStsServerMinorVersion, + KStsServerBuild), KNumSlots); + } + } + + if (result == KErrNone) + { + result = ShareAuto(); + + if (result != KErrNone) + { + Close(); + } + } + + return result; + } + +void RStsSession::Close() + { + RSessionBase::Close(); + } + +TInt RStsSession::SendPlayTone(CSystemToneService::TToneType aToneType, + unsigned int& aPlayToneContext) + { + TPckg playToneContextPckg(aPlayToneContext); + return SendReceive(StsMsg_PlayTone, TIpcArgs((TInt) aToneType, + &playToneContextPckg)); + } + +TInt RStsSession::SendStopTone(unsigned int aPlayToneContext) + { + return SendReceive(StsMsg_StopTone, TIpcArgs(aPlayToneContext)); + }