bthci/hciextensioninterface/inc/hciproxy.h
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hciextensioninterface/inc/hciproxy.h	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,145 @@
+// Copyright (c) 2001-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:
+//
+
+#ifndef HCIPROXY_H__
+#define HCIPROXY_H__
+
+#include <es_sock.h>
+#include <bt_sock.h>
+#include <e32test.h>
+#include <c32comm.h>
+#include <f32file.h>
+#include <e32std.h>
+
+//
+// Forward declarations
+//
+struct THCIWriteVendorSpecificFrameIoctl;
+
+//
+// Package for sending a THCIWriteVendorSpecificFrameIoctl via IPC
+//
+typedef TPckgBuf<THCIWriteVendorSpecificFrameIoctl> THCIWriteVendorSpecificFrameBuf;
+
+// Category name for panics
+_LIT(KHciExtConduitPanicCat, "CHciExtensionConduit");
+
+enum THciProxyPanics
+	{
+	EAlreadyActive		= 1,
+	EInvalidParamSize,
+	EInvalidIoctl,
+	EUnexpectedCce,
+	};
+
+/**
+This class provides a mixin interface for reception of command completions for vendor
+specific commands and vendor specific events.
+@publishedPartner
+@released
+**/
+class MVendorSpecificHciConduit
+	{
+public:	
+/**
+This is the callback for both CHciExtensionConduit::IssueCommand and 
+CHciExtensionConduit::IssueCommandExpectingCompleteEventL
+If CHciExtensionConduit::IssueCommandL was called CommandComplete will be 
+called when the Bluetooth stack receives the associated Ioctl.
+If CHciExtensionConduit::IssueCommandExpectingCompleteEventL was called 
+CommandComplete will be called when a command complete event with a 
+vendor specific opcode is received from the hardware.
+
+@see CHciExtensionConduit::IssueCommandL
+@see CHciExtensionConduit::IssueCommandExpectingCompleteEventL
+@param aError	:	The error code with which the command completed. See 'WARNING' above.
+**/	
+	virtual void CommandCompleted(TInt aError)=0;
+/**
+CommandCompleted is called when a vendor specific command issued through the conduit
+receives a completion from the hardware.
+
+@param aEvent	:	Returns raw vendor specific debug event data generated from the hardware 
+(with no HCTL framing)
+@param aError	:	An error indicating that the conduit did not successfully receive the event.
+@return If ETrue, the conduit will continue to listen for vendor specific debug events, 
+If EFalse, the conduit stops listening for these events.
+**/	
+	virtual TBool ReceiveEvent(TDesC8& aEvent, TInt aError)=0;
+	};
+
+/**
+This class acts as a wrapper for a group of Ioctls which used together provide a means 
+for licensees to pass proprietary commands direct to the hardware at the bottom of the 
+stack, and to receive events elicited by these commands back from the hardware.
+
+On construction, the CHciExtensionConduit registers itself with the Bluetooth stack,
+which  ensures that there can be only one HCI Extension Conduit in existance on a machine 
+at one time. This means that the first such conduit constructed after bootup has sole
+access to issue vendor specific commands and more importantly receive back vendor specific
+events.
+
+It works in conjunction with the MVendorSpecificHciConduit class, which provides a mixin
+interface for reception of command completions for vendor specific commands and vendor 
+specific events.
+@publishedPartner
+@released
+**/
+NONSHARABLE_CLASS(CHciExtensionConduit) : public CActive
+	{
+public:
+  	// Construct/destruct
+	IMPORT_C static CHciExtensionConduit* NewL(MVendorSpecificHciConduit& aConduit);
+	IMPORT_C ~CHciExtensionConduit();
+
+	// Commands
+	IMPORT_C TInt IssueCommandL(const TUint16 aOpcode, const TDesC8& aParameters);
+	IMPORT_C TInt IssueCommandExpectingCompleteEventL(const TUint16 aOpcode, const TDesC8& aParameters);
+	IMPORT_C TInt WaitForEvent();
+	IMPORT_C void StopWaitingForEvent();
+	IMPORT_C void CommandCompleteEventData(TPtrC8& aOutPtrToData);
+
+protected:
+	IMPORT_C void ConstructL();
+
+private:
+	// Construct/destruct
+	CHciExtensionConduit(MVendorSpecificHciConduit& aConduit);
+
+	// Command engine
+	TInt IssueCommandL(const TUint16 aOpcode, const TDesC8& aParameters, TUint aName);
+	
+
+	// From CActive
+	void RunL();
+	void DoCancel();
+
+private:
+	TUint								iCurrentIoctl;
+	TBool								iWaitForEvent;
+	RSocketServ							iSocketServ;
+	RSocket								iSocket;
+	MVendorSpecificHciConduit&			iConduit;
+	TProtocolDesc						iL2CapProtoDesc;
+	TBuf8<255>							iBuf;
+	// On the downcall of the Ioctl iVSIoctl is a pointer to a package buffer of the command to send.
+	// Upon return the pointer is (of course) to a descriptor which is now raw command complete event data.
+	// There's a 'gotcha' related to this (ab)use of the buffer: the maximum size of the data returned
+	// is 2 bytes more than that of the data written (more headers), which means we can really handle
+	// only 253 bytes of user data in the Command Completion Event.
+	THCIWriteVendorSpecificFrameBuf*	iVSIoctl;
+	};
+
+#endif