diff -r 000000000000 -r 7f656887cf89 libraries/btserial/src/client/btserialclient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libraries/btserial/src/client/btserialclient.cpp Wed Jun 23 15:52:26 2010 +0100 @@ -0,0 +1,116 @@ +// btserialclient.cpp +// +// Copyright (c) 2008 - 2010 Accenture. All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the "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: +// Accenture - Initial contribution +// + +// Transient server example - client interface implementation + +#include +#include "btserialclientserver.h" +#include "..\connection\btdebug.h" + +_LIT(KSubThreadName, "btconsolethread"); +static const TInt KMaxHeapSize = 0x100000; // 1M + +TInt RBtSerialSession::StartServer() +// +// Start the server process. Simultaneous launching +// of two such processes should be detected when the second one attempts to +// create the server object, failing with KErrAlreadyExists. +// + { + TInt err = iSubThread.Create(KSubThreadName, &ServerThread, KDefaultStackSize, KMinHeapSize, KMaxHeapSize, &iServer); + + if (err != KErrNone) + { + return err; + } + + TRequestStatus rendezvous; + iSubThread.Rendezvous(rendezvous); + + iSubThread.Resume(); + User::WaitForRequest(rendezvous); + + return rendezvous.Int(); + } + +//______________________________________________________________________________ +// RBtSerialSession +EXPORT_C TInt RBtSerialSession::Connect() + { + TInt err = StartServer(); + if (err == KErrNone) + { + TVersion ver; + err = CreateSession(iServer, ver); + } + return err; + } + +EXPORT_C void RBtSerialSession::Close() + { + TRACE1("RBtSerialSession::Close closing IPC session"); + RSessionBase::Close(); + // when we close the session (above) the server thread will exit. + // logon and wait for it + TRequestStatus stat; + iSubThread.Logon(stat); + TRACE1("RBtSerialSession::Close waiting for thread to exit"); + User::WaitForRequest(stat); + iSubThread.Close(); + TRACE2("RBtSerialSession::Close done (%d)", stat.Int()); + } + +EXPORT_C void RBtSerialSession::WaitForConnection(TRequestStatus& aStatus) + { + SendReceive(EBtSerialWaitForConnection, aStatus); + } + +EXPORT_C void RBtSerialSession::CancelWaitForConnection() + { + SendReceive(EBtSerialCancelWaitForConnection); + } + +EXPORT_C TInt RBtSerialSession::IsConnected() const + { + return SendReceive(EBtSerialIsConnected); + } + +EXPORT_C void RBtSerialSession::Write(const TDesC8& aData, TRequestStatus& aStatus) + { + SendReceive(EBtSerialWrite, TIpcArgs(&aData), aStatus); + } + +EXPORT_C void RBtSerialSession::CancelWrite() + { + SendReceive(EBtSerialCancelWrite); + } + +EXPORT_C void RBtSerialSession::Read(TDes8& aData, TRequestStatus& aStatus) const + { + SendReceive(EBtSerialRead, TIpcArgs(&aData), aStatus); + } + +EXPORT_C void RBtSerialSession::CancelRead() const + { + SendReceive(EBtSerialCancelRead); + } + +EXPORT_C TInt RBtSerialSession::GetConnectedDeviceName(TDes& aName) + { + return SendReceive(EBtSerialGetConnectedDeviceName, TIpcArgs(&aName)); + } + +EXPORT_C TInt RBtSerialSession::GetConnectedDeviceAddr(TBTDevAddr& aAddr) + { + TPckg pckg(aAddr); + return SendReceive(EBtSerialGetConnectedDeviceAddr, TIpcArgs(&pckg)); + }