bthci/bthci2/hciserverclient/src/hciserverclient.cpp
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/bthci2/hciserverclient/src/hciserverclient.cpp	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,171 @@
+// Copyright (c) 2006-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:
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include <bluetooth/hciserverclient.h>
+
+#include <bt_sock.h>
+#include <bluetooth/hci/hciipc.h>
+#include <bluetooth/logger.h>
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, LOG_COMPONENT_HCISERVERCLIENT);
+#endif
+
+// Don't allocate memory for dedicated message slots, just use the ones from
+// the global pool.
+const TInt KAsyncMessageSlots = -1;
+
+EXPORT_C RHCIServerSession::RHCIServerSession() 
+	{
+	}
+
+/**
+Connect the handle to the server.
+Must be called before all other methods (except Version and Close).
+@return KErrNone if successful, a system-wide error code otherwise.
+*/
+EXPORT_C TInt RHCIServerSession::Open(TInt aInterfaceUid)
+	{
+	TRAPD(err, OpenL(aInterfaceUid));
+	return err;
+	}
+
+void RHCIServerSession::OpenL(TInt aInterfaceUid)
+	{
+	// Attempt to connect to the latest version number
+	TVersion hciSvrVersion2(KHCISrvVersion2MajorVersionNumber, 
+							KHCISrvVersion2MinorVersionNumber, 
+							KHCISrvVersion2BuildNumber);
+
+	TInt err = CreateSession(KHCIServerName, hciSvrVersion2, KAsyncMessageSlots);
+	
+	if (err != KErrNone)
+		{
+		// The connection failed for some reason, this could be due to the version number not
+		// being supported, the server not being loaded or another reason. First attempt
+		// to load the Bluetooth stack and in turn the server.
+		LEAVEIFERRORL(iSocketServer.Connect());
+		CleanupClosePushL(iSocketServer);
+
+		TRequestStatus status;
+		iSocketServer.StartProtocol(KBTAddrFamily,KSockSeqPacket,KBTLinkManager,status);
+		User::WaitForRequest(status);
+		TInt err = status.Int();
+		if (err != KErrNone && err != KErrAlreadyExists)
+			{
+			LEAVEIFERRORL(err);
+			}
+
+		// Now attempt the connection again.
+		err = CreateSession(KHCIServerName, hciSvrVersion2, KAsyncMessageSlots);
+
+		if (err != KErrNone)
+			{
+			// Finally try reverting to the old version number.
+			TVersion hciSvrVersion1(KHCISrvMajorVersionNumber, 
+									KHCISrvMinorVersionNumber, 
+									KHCISrvBuildNumber);
+			
+			LEAVEIFERRORL(CreateSession(KHCIServerName, hciSvrVersion1, KAsyncMessageSlots));
+			}
+		
+		// Now we have a server side session setup, so now we will cleanup the socketserver
+		// on Close
+		CleanupStack::Pop();
+		}
+
+	// Now try and connect to the requested service.
+	CleanupClosePushL(*this);
+	LEAVEIFERRORL(SendReceive(EConnectToService, TIpcArgs(aInterfaceUid)));
+	CleanupStack::Pop();
+	}
+
+/**
+Close the session.
+*/
+EXPORT_C void RHCIServerSession::Close()
+	{
+	if (iSocketServer.Handle())
+		{
+		// Release handle on the Bluetooth stack if we loaded it in OpenL
+		TRequestStatus status;
+		iSocketServer.StopProtocol(KBTAddrFamily,KSockSeqPacket,KBTLinkManager,status);
+		User::WaitForRequest(status);
+		
+		iSocketServer.Close();
+		}
+
+	// Close the session
+	RSessionBase::Close();
+	}
+
+/**
+Synchronous request to be sent to HCI.
+
+@param aInterfaceUid The type of request, for example power control, or direct access
+@param aCommand The actual request, for example SetPower
+@return KErrNone if successful, a system-wide error code otherwise.
+*/
+EXPORT_C TInt RHCIServerSession::SendSync(TUint aCommand)
+	{
+	return SendSync(aCommand, NULL, NULL, 0);
+	}
+
+/**
+Asynchronous request to be sent to HCI.
+	
+@param aInterfaceUid The type of request, for example power control, or direct access
+@param aCommand The actual request, for example SetPower
+@param aStatus Used to alert user of completion of request.
+*/
+EXPORT_C void RHCIServerSession::SendAsync(TUint aCommand, TRequestStatus &aStatus)
+	{
+	SendAsync(aCommand, NULL, NULL, 0, aStatus);
+	}
+
+/**
+Synchronous request to be sent to HCI.
+	
+@param aInterfaceUid The type of request, for example power control, or direct access
+@param aCommand The actual request, for example SetPower
+@param aDescIn The descriptor carries input information
+@param aDescOut The descriptor carries output information
+@param aValue A value for use with the command.
+@return KErrNone if successful, a system-wide error code otherwise.
+	*/
+EXPORT_C TInt RHCIServerSession::SendSync(TUint aCommand, TDes8* aDescIn, TDes8* aDescOut, TUint aValue)
+	{
+	return SendReceive(EServiceSpecificRequest,TIpcArgs(aCommand,aDescIn,aDescOut,aValue));
+	}
+
+/**
+Asynchronous request to be sent to HCI.
+	
+@param aInterfaceUid The type of request, for example power control, or direct access
+@param aCommand The actual request, for example SetPower
+@param aDescIn The descriptor carries input information
+@param aDescOut The descriptor carries output information
+@param aValue A value for use with the command.
+@param aStatus Used to alert user of completion of request.
+*/
+EXPORT_C void RHCIServerSession::SendAsync(TUint aCommand, TDes8* aDescIn, TDes8* aDescOut, TUint aValue, TRequestStatus& aStatus)
+	{
+	SendReceive(EServiceSpecificRequest,TIpcArgs(aCommand,aDescIn,aDescOut,aValue),aStatus);
+	}