Add USB HCTL to bt package default
authorjontanne
Thu, 14 Oct 2010 11:30:12 +0100
changeset 27 83036355c0f3
parent 4 28479eeba3fb
Add USB HCTL to bt package
bluetooth/btlogger/generic/public/components.h
bthci/hci2implementations/corehcis/symbian/group/bld.inf
bthci/hci2implementations/corehcis/symbian/group/corehci_symbian.iby
bthci/hci2implementations/corehcis/symbian/group/corehci_symbian_usboriginal.ini
bthci/hci2implementations/corehcis/symbian/inc/HciCorePluginImpl.h
bthci/hci2implementations/corehcis/symbian/src/HciCorePluginImpl.cpp
bthci/hci2implementations/corehcis/symbian/src/hciserverrequestmgr.cpp
bthci/hci2implementations/group/bld.inf
bthci/hci2implementations/group/hci_implementation_reference.iby
bthci/hci2implementations/hctls/usb_original/fdc/group/distribution.policy.s60
bthci/hci2implementations/hctls/usb_original/fdc/group/fdc_hctl_original.mmp
bthci/hci2implementations/hctls/usb_original/fdc/inc/distribution.policy.s60
bthci/hci2implementations/hctls/usb_original/fdc/inc/fdchctloriginal.h
bthci/hci2implementations/hctls/usb_original/fdc/inc/fdchctloriginalpolicy.h
bthci/hci2implementations/hctls/usb_original/fdc/inc/fdchctloriginalserver.h
bthci/hci2implementations/hctls/usb_original/fdc/inc/fdchctloriginalutils.h
bthci/hci2implementations/hctls/usb_original/fdc/public/distribution.policy.s60
bthci/hci2implementations/hctls/usb_original/fdc/public/fdchctloriginalcli.h
bthci/hci2implementations/hctls/usb_original/fdc/public/fdchctloriginalipc.h
bthci/hci2implementations/hctls/usb_original/fdc/src/distribution.policy.s60
bthci/hci2implementations/hctls/usb_original/fdc/src/fdc_hctl_original.rss
bthci/hci2implementations/hctls/usb_original/fdc/src/fdchctloriginal.cpp
bthci/hci2implementations/hctls/usb_original/fdc/src/fdchctloriginalmain.cpp
bthci/hci2implementations/hctls/usb_original/fdc/src/fdchctloriginalserver.cpp
bthci/hci2implementations/hctls/usb_original/group/bld.inf
bthci/hci2implementations/hctls/usb_original/group/distribution.policy.s60
bthci/hci2implementations/hctls/usb_original/group/hctl_usb_original.iby
bthci/hci2implementations/hctls/usb_original/hctl/group/distribution.policy.s60
bthci/hci2implementations/hctls/usb_original/hctl/group/hctl_usb_original.mmp
bthci/hci2implementations/hctls/usb_original/hctl/inc/controllermanager.h
bthci/hci2implementations/hctls/usb_original/hctl/inc/devicestatemanager.h
bthci/hci2implementations/hctls/usb_original/hctl/inc/distribution.policy.s60
bthci/hci2implementations/hctls/usb_original/hctl/inc/hctlusboriginal.h
bthci/hci2implementations/hctls/usb_original/hctl/inc/hctlusboriginalaclin.h
bthci/hci2implementations/hctls/usb_original/hctl/inc/hctlusboriginalaclout.h
bthci/hci2implementations/hctls/usb_original/hctl/inc/hctlusboriginalcommand.h
bthci/hci2implementations/hctls/usb_original/hctl/inc/hctlusboriginalevent.h
bthci/hci2implementations/hctls/usb_original/hctl/inc/hctlusboriginalpolicy.h
bthci/hci2implementations/hctls/usb_original/hctl/inc/hctlusboriginalserver.h
bthci/hci2implementations/hctls/usb_original/hctl/inc/hctlusboriginalutils.h
bthci/hci2implementations/hctls/usb_original/hctl/public/distribution.policy.s60
bthci/hci2implementations/hctls/usb_original/hctl/public/hctlusboriginalcli.h
bthci/hci2implementations/hctls/usb_original/hctl/public/hctlusboriginalipc.h
bthci/hci2implementations/hctls/usb_original/hctl/src/controllermanager.cpp
bthci/hci2implementations/hctls/usb_original/hctl/src/devicestatemanager.cpp
bthci/hci2implementations/hctls/usb_original/hctl/src/distribution.policy.s60
bthci/hci2implementations/hctls/usb_original/hctl/src/hctl_usb_original.rss
bthci/hci2implementations/hctls/usb_original/hctl/src/hctlusboriginal.cpp
bthci/hci2implementations/hctls/usb_original/hctl/src/hctlusboriginalaclin.cpp
bthci/hci2implementations/hctls/usb_original/hctl/src/hctlusboriginalaclout.cpp
bthci/hci2implementations/hctls/usb_original/hctl/src/hctlusboriginalcommand.cpp
bthci/hci2implementations/hctls/usb_original/hctl/src/hctlusboriginalevent.cpp
bthci/hci2implementations/hctls/usb_original/hctl/src/hctlusboriginalmain.cpp
bthci/hci2implementations/hctls/usb_original/hctl/src/hctlusboriginalserver.cpp
bthci/hci2implementations/hctls/usb_original/readme.txt
--- a/bluetooth/btlogger/generic/public/components.h	Tue Feb 02 01:12:20 2010 +0200
+++ b/bluetooth/btlogger/generic/public/components.h	Thu Oct 14 11:30:12 2010 +0100
@@ -1,139 +1,138 @@
-// 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
- @internalTechnology
-*/
-
-#ifndef BLUETOOTH_LOGGER_COMPONENTS_H
-#define BLUETOOTH_LOGGER_COMPONENTS_H
-
-// This file provides a centralised place for the definition
-// of log component strings for use with the Bluetooth logger.
-
-// The Bluetooth PRT
-#define LOG_COMPONENT_BT_PRT				"BtPrt"
-
-// Class of Device (CoD) Service Manager
-#define LOG_COMPONENT_BT_COD				"CoD"
-
-// Incoming connection listener
-#define LOG_COMPONENT_IN_CONN_LISTENER		"InConnListener"
-
-// The Bluetooth Logger
-#define LOG_COMPONENT_LOGGER				"LogEngine"
-
-// HCIv2 Framework
-#define LOG_COMPONENT_HCICMDQ				"HciCmdQ"
-#define LOG_COMPONENT_COREHCI_BASE			"CoreHciBase"
-#define LOG_COMPONENT_HCTL_BASE				"HctlBase"
-#define LOG_COMPONENT_QDP_BASE				"QdpBase"
-#define LOG_COMPONENT_BTPOWERCONTROL		"PowerControl"
-#define LOG_COMPONENT_DUT_MODE				"DutMode"
-#define LOG_COMPONENT_HCISERVERCLIENT		"HciServerClient"
-#define LOG_COMPONENT_HCIUTIL				"HciUtil"
-
-// Symbian Reference HCIv2 Implementations
-#define LOG_COMPONENT_COREHCI_SYMBIAN		"CoreHciSymbian"
-#define LOG_COMPONENT_HCISERVER				"HciServer"
-#define LOG_COMPONENT_COMMANDSEVENTS_SYMBIAN "CommandsEvents"
-#define LOG_COMPONENT_QDP_SYMBIAN			"QdpSymbian"
-#define LOG_COMPONENT_INITIALISOR_SYMBIAN	"InitSymbian"
-#define LOG_COMPONENT_INITIALISOR_TI		"InitTi"
-#define LOG_COMPONENT_HCTL_UART_ORIGINAL	"HctlUartOriginal"
-#define LOG_COMPONENT_HCTL_TI				"HctlTi"
-#define LOG_COMPONENT_HCTL_BCSP				"HctlBcsp"
-#define LOG_COMPONENT_HCI_FACADE			"HciFacade"
-#define LOG_COMPONENT_HCI_CSCOLINK			"CSCOLink"
-#define LOG_COMPONENT_HCI_WATCHDOG			"HciWatchdog"
-
-// Bluetooth Stack Components
-#define LOG_COMPONENT_SECMAN				"SecMan"
-#define LOG_COMPONENT_HOSTRESOLVER			"HostResolver"
-#define LOG_COMPONENT_LINKMGR				"LinkMgr"
-#define LOG_COMPONENT_PAIRING_SERVER		"PairingServer"
-#define LOG_COMPONENT_EIRMANAGER			"EirManager"
-#define LOG_COMPONENT_L2CAP					"L2Cap"
-#define LOG_COMPONENT_L2CAP_PDU				"L2CapPdu"
-#define LOG_COMPONENT_L2CAP_SDU				"L2CapSdu"
-#define LOG_COMPONENT_L2CAP_SDU_Q			"L2CapSduQ"
-#define LOG_COMPONENT_L2CAP_DATA_CONTROLLER	"L2CapDataController"
-#define LOG_COMPONENT_RFCOMM				"Rfcomm"
-#define LOG_COMPONENT_SDP					"Sdp"
-#define LOG_COMPONENT_AVDTP					"Avdtp"
-#define LOG_COMPONENT_AVCTP					"Avctp"
-
-// Bluetooth User Components
-#define LOG_COMPONENT_BTLIB					"BtLib"
-#define LOG_COMPONENT_AVLIB					"AvLib"
-#define LOG_COMPONENT_AVCTP_SERVICES		"AvctpServices"
-
-// Bluetooth SDP
-#define LOG_COMPONENT_SDPDATABASE			"SdpDatabase"
-#define LOG_COMPONENT_SDP_SERVER			"SdpServer"
-#define LOG_COMPONENT_SDP_AGENT				"SdpAgent"
-
-// Bluetooth Notifier Parameters
-#define LOG_COMPONENT_BTNOTIFIERS			"Notifiers"
-
-// btcomm component
-#define LOG_COMPONENT_BT_COMM				"BtComm"
-
-// Bluetooth Registry
-#define LOG_COMPONENT_BT_MANAGER_CLIENT		"BtManClient"
-#define LOG_COMPONENT_BT_MANAGER_SERVER		"BtManServer"
-#define LOG_COMPONENT_BT_REGISTRY			"BtRegistry"
-
-// A2DP Optimiser
-#define LOG_COMPONENT_A2DP_OPTIMISER        "A2dpOptimiser"
-
-// Bluetooth PAN profile
-#define LOG_COMPONENT_PAN_BNEP				"Bnep"
-#define LOG_COMPONENT_PAN_AGENT				"PanAgt"
-#define LOG_COMPONENT_PAN_HELPERS			"PanHelpers"
-#define LOG_COMPONENT_PAN_NAPIPHOOK			"PanNapIpHook"
-#define LOG_COMPONENT_PAN_PROVIDERS			"PanProviders"
-
-// Bluetooth Profiles
-#define LOG_COMPONENT_REMCON_REFERENCE_TSP	"RemconRefTsp"
-#define LOG_COMPONENT_REMCON_REF_SER_BEARER	"RemconRefSerBearer"
-#define LOG_COMPONENT_REMCON_SERVER			"RemconServer"
-#define LOG_COMPONENT_REMCON_UTILS			"RemconUtils"
-#define LOG_COMPONENT_REMCON_TYPES			"RemconTypes"
-#define LOG_COMPONENT_REMCON_CORE			"RemconCore"
-#define LOG_COMPONENT_REMCON_EXTAPI1		"RemconExtApi1"
-#define LOG_COMPONENT_REMCON_INNER			"RemconInner"
-#define LOG_COMPONENT_REMCON_IF_BASE		"RemconIfBase"
-#define LOG_COMPONENT_REMCON_IF_SEL			"RemconIfSel"
-#define LOG_COMPONENT_REMCON_IL_RECV		"RemconIlRecv"
-#define LOG_COMPONENT_AVRCP_BEARER			"AvrcpBearer"
-#define LOG_COMPONENT_AVRCP_STATUS			"AvrcpStatus"
-#define LOG_COMPONENT_AVRCP_BATTERY_STATUS	"AvrcpBattStat"
-#define LOG_COMPONENT_AVRCP_GROUP_NAVIGATION "AvrcpGroupNav"
-#define LOG_COMPONENT_AVRCP_MEDIA_INFO		"AvrcpMediaInfo"
-#define LOG_COMPONENT_AVRCP_PLAYER_INFO		"AvrcpPlayerInfo"
-#define LOG_COMPONENT_AVRCP_FRAME			"AvrcpFrame"
-#define LOG_COMPONENT_REMCONABSOLUTEVOLUME  "RemConAbsoluteVolumeApi"
-#define LOG_COMPONENT_REMCONMEDIABROWSEAPI  "RemConMediaBrowseApi"
-#define LOG_COMPONENT_REMCONNOWPLAYINGAPI   "RemConNowPlayingApi"
-
-// Test Components
-#define LOG_COMPONENT_BT_COMM_TCSY			"BtCommTcsy"
-#define LOG_COMPONENT_GAVDP_TAVSRC			"GavdpTavsrc"
-#define LOG_COMPONENT_TSDPSAS				"Tsdpsas"
-#define LOG_COMPONENT_BT_TESTCONSOLE		"BtTestConsole"
-
-#endif // BLUETOOTH_LOGGER_COMPONENTS_H
+// 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
+ @internalTechnology
+*/
+
+#ifndef BLUETOOTH_LOGGER_COMPONENTS_H
+#define BLUETOOTH_LOGGER_COMPONENTS_H
+
+// This file provides a centralised place for the definition
+// of log component strings for use with the Bluetooth logger.
+
+// The Bluetooth Logger
+#define LOG_COMPONENT_LOGGER				"LogEngine"
+
+// HCIv2 Framework
+#define LOG_COMPONENT_HCICMDQ				"HciCmdQ"
+#define LOG_COMPONENT_COREHCI_BASE			"CoreHciBase"
+#define LOG_COMPONENT_HCTL_BASE				"HctlBase"
+#define LOG_COMPONENT_QDP_BASE				"QdpBase"
+#define LOG_COMPONENT_BTPOWERCONTROL		"PowerControl"
+#define LOG_COMPONENT_DUT_MODE				"DutMode"
+#define LOG_COMPONENT_HCISERVERCLIENT		"HciServerClient"
+#define LOG_COMPONENT_HCIUTIL				"HciUtil"
+
+// Symbian Reference HCIv2 Implementations
+#define LOG_COMPONENT_COREHCI_SYMBIAN		"CoreHciSymbian"
+#define LOG_COMPONENT_HCISERVER				"HciServer"
+#define LOG_COMPONENT_COMMANDSEVENTS_SYMBIAN "CommandsEvents"
+#define LOG_COMPONENT_QDP_SYMBIAN			"QdpSymbian"
+#define LOG_COMPONENT_INITIALISOR_SYMBIAN	"InitSymbian"
+#define LOG_COMPONENT_INITIALISOR_TI		"InitTi"
+#define LOG_COMPONENT_HCTL_UART_ORIGINAL	"HctlUartOriginal"
+#define LOG_COMPONENT_HCTL_TI				"HctlTi"
+#define LOG_COMPONENT_HCTL_BCSP				"HctlBcsp"
+#define LOG_COMPONENT_HCTL_USB_ORIGINAL		"HctlUsbOriginal"
+
+#define LOG_COMPONENT_HCI_WATCHDOG			"HciWatchdog"
+
+// Bluetooth Stack Components
+//// The common Bluetooth protocol components
+#define LOG_COMPONENT_BT_PRT				"BtPrt"
+//// Class of Device (CoD) Service Manager
+#define LOG_COMPONENT_BT_COD				"CoD"
+//// Incoming connection listener
+#define LOG_COMPONENT_IN_CONN_LISTENER		"InConnListener"
+#define LOG_COMPONENT_SECMAN				"SecMan"
+#define LOG_COMPONENT_HOSTRESOLVER			"HostResolver"
+#define LOG_COMPONENT_LINKMGR				"LinkMgr"
+#define LOG_COMPONENT_PAIRING_SERVER		"PairingServer"
+#define LOG_COMPONENT_EIRMANAGER			"EirManager"
+#define LOG_COMPONENT_L2CAP					"L2Cap"
+#define LOG_COMPONENT_L2CAP_PDU				"L2CapPdu"
+#define LOG_COMPONENT_L2CAP_SDU				"L2CapSdu"
+#define LOG_COMPONENT_L2CAP_SDU_Q			"L2CapSduQ"
+#define LOG_COMPONENT_L2CAP_DATA_CONTROLLER	"L2CapDataController"
+#define LOG_COMPONENT_RFCOMM				"Rfcomm"
+#define LOG_COMPONENT_SDP					"Sdp"
+#define LOG_COMPONENT_AVDTP					"Avdtp"
+#define LOG_COMPONENT_AVCTP					"Avctp"
+#define LOG_COMPONENT_HCI_FACADE			"HciFacade"
+#define LOG_COMPONENT_HCI_CSCOLINK			"CSCOLink"
+
+// Bluetooth User Components
+#define LOG_COMPONENT_BTLIB					"BtLib"
+#define LOG_COMPONENT_AVLIB					"AvLib"
+#define LOG_COMPONENT_AVCTP_SERVICES		"AvctpServices"
+
+// Bluetooth SDP
+#define LOG_COMPONENT_SDPDATABASE			"SdpDatabase"
+#define LOG_COMPONENT_SDP_SERVER			"SdpServer"
+#define LOG_COMPONENT_SDP_AGENT				"SdpAgent"
+
+// Bluetooth Notifier Parameters
+#define LOG_COMPONENT_BTNOTIFIERS			"Notifiers"
+
+// btcomm component
+#define LOG_COMPONENT_BT_COMM				"BtComm"
+
+// Bluetooth Registry
+#define LOG_COMPONENT_BT_MANAGER_CLIENT		"BtManClient"
+#define LOG_COMPONENT_BT_MANAGER_SERVER		"BtManServer"
+#define LOG_COMPONENT_BT_REGISTRY			"BtRegistry"
+
+// A2DP Optimiser
+#define LOG_COMPONENT_A2DP_OPTIMISER		"A2dpOptimiser"
+
+// Bluetooth PAN profile
+#define LOG_COMPONENT_PAN_BNEP				"Bnep"
+#define LOG_COMPONENT_PAN_AGENT				"PanAgt"
+#define LOG_COMPONENT_PAN_HELPERS			"PanHelpers"
+#define LOG_COMPONENT_PAN_NAPIPHOOK			"PanNapIpHook"
+#define LOG_COMPONENT_PAN_PROVIDERS			"PanProviders"
+
+// Bluetooth Profiles
+#define LOG_COMPONENT_REMCON_REFERENCE_TSP	"RemconRefTsp"
+#define LOG_COMPONENT_REMCON_REF_SER_BEARER	"RemconRefSerBearer"
+#define LOG_COMPONENT_REMCON_SERVER			"RemconServer"
+#define LOG_COMPONENT_REMCON_UTILS			"RemconUtils"
+#define LOG_COMPONENT_REMCON_TYPES			"RemconTypes"
+#define LOG_COMPONENT_REMCON_CORE			"RemconCore"
+#define LOG_COMPONENT_REMCON_EXTAPI1		"RemconExtApi1"
+#define LOG_COMPONENT_REMCON_INNER			"RemconInner"
+#define LOG_COMPONENT_REMCON_IF_BASE		"RemconIfBase"
+#define LOG_COMPONENT_REMCON_IF_SEL			"RemconIfSel"
+#define LOG_COMPONENT_REMCON_IL_RECV		"RemconIlRecv"
+#define LOG_COMPONENT_AVRCP_BEARER			"AvrcpBearer"
+#define LOG_COMPONENT_AVRCP_STATUS			"AvrcpStatus"
+#define LOG_COMPONENT_AVRCP_BATTERY_STATUS	"AvrcpBattStat"
+#define LOG_COMPONENT_AVRCP_GROUP_NAVIGATION "AvrcpGroupNav"
+#define LOG_COMPONENT_AVRCP_MEDIA_INFO		"AvrcpMediaInfo"
+#define LOG_COMPONENT_AVRCP_PLAYER_INFO		"AvrcpPlayerInfo"
+#define LOG_COMPONENT_AVRCP_FRAME			"AvrcpFrame"
+#define LOG_COMPONENT_REMCONABSOLUTEVOLUME	"RemConAbsoluteVolumeApi"
+#define LOG_COMPONENT_REMCONMEDIABROWSEAPI	"RemConMediaBrowseApi"
+#define LOG_COMPONENT_REMCONNOWPLAYINGAPI	"RemConNowPlayingApi"
+
+// Test Components
+#define LOG_COMPONENT_BT_COMM_TCSY			"BtCommTcsy"
+#define LOG_COMPONENT_GAVDP_TAVSRC			"GavdpTavsrc"
+#define LOG_COMPONENT_TSDPSAS				"Tsdpsas"
+#define LOG_COMPONENT_BT_TESTCONSOLE		"BtTestConsole"
+
+#endif // BLUETOOTH_LOGGER_COMPONENTS_H
--- a/bthci/hci2implementations/corehcis/symbian/group/bld.inf	Tue Feb 02 01:12:20 2010 +0200
+++ b/bthci/hci2implementations/corehcis/symbian/group/bld.inf	Thu Oct 14 11:30:12 2010 +0100
@@ -1,29 +1,31 @@
-// 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:
-// bld.inf for symbian core hci plugin
-// 
-//
-
-PRJ_EXPORTS
-corehci_symbian.ini /epoc32/data/z/private/101f7989/bluetooth/corehci_symbian.ini
-corehci_symbian.ini /epoc32/release/winscw/udeb/z/private/101f7989/bluetooth/corehci_symbian.ini // For WINSCW debugging
-corehci_symbian.ini /epoc32/release/winscw/urel/z/private/101f7989/bluetooth/corehci_symbian.ini
-
-corehci_symbian_ti.ini /epoc32/data/z/private/101f7989/bluetooth/corehci_symbian_ti.ini // Preconfigured for TI hardware
-
-corehci_symbian.iby		/epoc32/rom/include/corehci_symbian.iby
-
-
-PRJ_MMPFILES
-corehci_symbian.mmp
+// 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:
+// bld.inf for symbian core hci plugin
+// 
+//
+
+PRJ_EXPORTS
+corehci_symbian.ini /epoc32/data/z/private/101f7989/bluetooth/corehci_symbian.ini
+corehci_symbian.ini /epoc32/release/winscw/udeb/z/private/101f7989/bluetooth/corehci_symbian.ini // For WINSCW debugging
+corehci_symbian.ini /epoc32/release/winscw/urel/z/private/101f7989/bluetooth/corehci_symbian.ini
+
+corehci_symbian_ti.ini /epoc32/data/z/private/101f7989/bluetooth/corehci_symbian_ti.ini // Preconfigured for TI hardware
+
+corehci_symbian_usboriginal.ini /epoc32/data/z/private/101f7989/bluetooth/corehci_symbian_usboriginal.ini // Preconfigured for USB
+
+corehci_symbian.iby		/epoc32/rom/include/corehci_symbian.iby
+
+
+PRJ_MMPFILES
+corehci_symbian.mmp
--- a/bthci/hci2implementations/corehcis/symbian/group/corehci_symbian.iby	Tue Feb 02 01:12:20 2010 +0200
+++ b/bthci/hci2implementations/corehcis/symbian/group/corehci_symbian.iby	Thu Oct 14 11:30:12 2010 +0100
@@ -1,30 +1,33 @@
-// 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:
-//
-
-#ifndef  COREHCI_SYMBIAN_IBY
-#define  COREHCI_SYMBIAN_IBY
-
-REM Symbian CoreHCI reference implementation
-HCI_PLUGIN(corehci_symbian.dll, corehci_symbian.rsc)
-
-#if defined(HCI_TI)
-REM CoreHCI using TI onboard Bluetooth configuration
-data=ZPRIVATE\101F7989\Bluetooth\corehci_symbian_ti.ini	Private\101F7989\Bluetooth\corehci_symbian.ini
-debugport -2
-#else
-data=ZPRIVATE\101F7989\Bluetooth\corehci_symbian.ini	Private\101F7989\Bluetooth\corehci_symbian.ini
-#endif
-
-#endif //  COREHCI_SYMBIAN_IBY
+// Copyright (c) 2006-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:
+//
+
+#ifndef  COREHCI_SYMBIAN_IBY
+#define  COREHCI_SYMBIAN_IBY
+
+REM Symbian CoreHCI reference implementation
+HCI_PLUGIN(corehci_symbian.dll, corehci_symbian.rsc)
+
+#if defined(HCI_TI)
+REM CoreHCI using TI onboard Bluetooth configuration
+data=ZPRIVATE\101F7989\Bluetooth\corehci_symbian_ti.ini	Private\101F7989\Bluetooth\corehci_symbian.ini
+debugport -2
+#elif defined(HCI_USB)
+REM CoreHCI using USB Original "H2" Bluetooth configuration
+data=ZPRIVATE\101F7989\Bluetooth\corehci_symbian_usboriginal.ini	Private\101F7989\Bluetooth\corehci_symbian.ini
+#else
+data=ZPRIVATE\101F7989\Bluetooth\corehci_symbian.ini	Private\101F7989\Bluetooth\corehci_symbian.ini
+#endif
+
+#endif //  COREHCI_SYMBIAN_IBY
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/corehcis/symbian/group/corehci_symbian_usboriginal.ini	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,39 @@
+; Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
+; All rights reserved.
+; This component and the accompanying materials are made available
+; under the terms of the License "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:
+;
+
+; UIDs for the HCTL and Initialisation plug-ins should be specified below.
+; These UIDs to are found in the implementation_uid field of the .rss file corresponding to the plug-in.
+
+[Plugins]
+;UART TI
+;hctl_uid= 0x102736ED
+
+;UART Original
+;hctl_uid= 0x102056BC
+
+;BCSP
+;hctl_uid= 0x102056BE
+
+;USB Original
+hctl_uid= 0x200345E7
+
+;TI Initialisor
+;initialisation_uid= 0x1027407B
+
+;Symbian Initialisor
+initialisation_uid= 0x1027407D
+
+
+
--- a/bthci/hci2implementations/corehcis/symbian/inc/HciCorePluginImpl.h	Tue Feb 02 01:12:20 2010 +0200
+++ b/bthci/hci2implementations/corehcis/symbian/inc/HciCorePluginImpl.h	Thu Oct 14 11:30:12 2010 +0100
@@ -1,218 +1,223 @@
-// 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
-*/
-
-#ifndef HCICOREPLUGINIMPL_H
-#define HCICOREPLUGINIMPL_H
-
-// Includes for parent classes
-#include <bluetooth/hci/corehciplugin.h>
-#include <bluetooth/hci/qdpplugininterfacefinder.h>
-#include <bluetooth/hci/hcicommandallocator.h>
-#include <bluetooth/hci/hcidataframer.h>
-#include <bluetooth/hci/hctldataobserver.h>
-#include <bluetooth/hci/hctleventobserver.h>
-#include <bluetooth/hci/controllerstateobserver.h>
-#include <bluetooth/hci/corehci.h>
-#include <bluetooth/hci/hctlchannelobserver.h>
-#include <bluetooth/hci/hciclientusage.h>
-
-#include <bluetooth/hardresetinitiator.h>
-
-class MHCTLPowerInterface;
-class CHCIServer;
-class CHCTLBase;
-class CControllerInitialisationPlugin;
-class MHCTLInterface;
-class CHciUtil;
-
-/**
-An implementation of the CHCICorePlugin.
-This also directly implements the interfaces it "exports" 
-through the CHCICorePlugin::Interface function.
-*/
-class CCoreHCIPluginImpl : public CCoreHCIPlugin,
-						   public MHardResetInitiator,
-						   public MQdpPluginInterfaceFinder,
-						   public MHCICommandAllocator,
-						   public MHCIDataFramer,
-						   public MHCTLDataObserver,
-						   public MHCTLEventObserver,
-						   public MControllerStateObserver,
-						   public MCoreHci,
-						   public MHCTLChannelObserver,
-						   public MHCIClientUsageCallback
-	{
-public:
-	static CCoreHCIPluginImpl* NewL();
-	virtual TAny* Interface(TUid aUid);
-	~CCoreHCIPluginImpl();
-
-	TInt SetPower(TBTPowerState aState, TDesC8* aBuf);
-	TInt GetPower(TBTPowerState& aState, TDesC8* aBuf);
-
-	void OpenClientReference();
-	void CloseClientReference();
-	
-private:
-	// MHardResetInitiator
-	virtual void MhriStartHardReset();
-	
-	// MHCICommandAllocator
-	virtual CHctlCommandFrame* MhcaNewFrameL();
-
-	// MHCIDataFramer
-	virtual CHctlAclDataFrame* MhdfNewAclDataFrameL(TUint16 aSize);
-	virtual void MhdfFormatAclData(CHctlAclDataFrame& aFrame, THCIConnHandle aConnH, TAclPacketBoundaryFlag aBoundaryFlag, TAclPacketBroadcastFlag aBroadcastFlag, const TDesC8& aData);
-	virtual CHctlSynchronousDataFrame* MhdfNewSynchronousDataFrameL(TUint8 aSize);
-	virtual void MhdfFormatSynchronousData(CHctlSynchronousDataFrame& aFrame, THCIConnHandle aConnH, const TDesC8& aData);
-
-	// MHCTLDataObserver
-	virtual void MhdoProcessAclData(const TDesC8& aData);
-	virtual void MhdoProcessSynchronousData(const TDesC8& aData);
-
-	// MHCTLEventObserver
-	virtual void MheoProcessEvent(const TDesC8& aEvent);
-
-	// MControllerStateObserver
-	virtual void McsoProcessPowerChange(TInt aError, TControllerChangeType aChangeType, TBTPowerState aState);
-	virtual void McsoProcessHardResetPhaseChange(TInt aError, TControllerChangeType aChangeType, TBTHardResetState aState);
-
-	// MQdpPluginInterfaceFinder
-	virtual TAny* MqpifQdpPluginInterface(const TUid aUid);
-
-	// MCoreHci
-	virtual TInt MchSetOption(TUint aName, const TDesC8& aData);
-	virtual TInt MchGetOption(TUint aName, TDes8& aData);
-	virtual void MchIoctl(TUint aLevel, TUint aName, TDes8* aOption, TAny* aStackSAP);
-	virtual void MchCancelIoctl(TUint aLevel, TUint aName, TAny* aStackSAP) ;
-	virtual void MchSetHCICommandQueue(MHCICommandQueue& aHCICommandQueue);
-	virtual void MchSetPhysicalLinksState(MPhysicalLinksState& aPhysicalLinksState) ;
-	virtual void MchSetHardResetInitiator(MHardResetInitiator& aHcHardResetInitiator) ;
-	virtual void MchSetDataEventObserver(MHCIDataEventObserver& aHCIDataEventObserver) ;
-	virtual void MchSetDataObserver(MHCIDataObserver& aHCIDataObserver) ;
-	virtual void MchSetCommandEventObserver(MHCICommandEventObserver& aHCICommandEventObserver) ;
-	virtual void MchSetChannelObserver(MHCTLChannelObserver& aHCIChannelObserver) ;
-	virtual void MchSetControllerStateObserver(MControllerStateObserver& aHCIPowerStateObserver) ;
-	virtual TAny* MchHctlPluginInterface(TUid aUid);
-	
-	// MHCTLChannelObserver
-	virtual void MhcoChannelOpen(THCITransportChannel aChannels);
-	virtual void MhcoChannelClosed(THCITransportChannel aChannels);
-
-	// MHCIClientUsageCallback
-	virtual void MhcucSetClientUsage(MHCIClientUsage& aClientUsage);
-	
-private:
-	void ConstructL();
-
-private:	
-	void RequestHardResetFromStack();
-	
-private:
-	/**
-	The instance that will be used to request a hard reset from the stack
-	(Stack will call back CoreHci method to actaully perform the hard reset once it has done all the preparations).
-	*/
-	MHardResetInitiator* iStackHardResetRequester;
-	
-	/**
-	The instance that will be pass onto the HCTL a request to perform a hard reset on the host controller.
-	*/
-	MHardResetInitiator* iHCTLHardResetPerformer;
-
-	/**
-	The instance that will be sent the details of Controller State Events received by the HCI Layer.
-	*/
-	MControllerStateObserver* iControllerStateObserver;
-
-	/**
-	The instance that will be sent the details of Data Events received by the HCI Layer.
-	*/
-	MHCIDataEventObserver* iDataEventObserver;
-
-	/**
-	The instance that will be sent the data of Command Events received by the HCI Layer.
-	*/
-	MHCICommandEventObserver* iCommandEventObserver;
-
-	/**
-	The instance that will be used to communicate with the command queue.
-	*/
-	MHCICommandQueue* iHCICommandQueue;
-
-	/**
-	The instance that will be used to communicate with the HCTL's power controller.
-	*/
-	MHCTLPowerInterface* iHCTLPowerInterface;
-
-	/**
-	The instance used to communicate changes in the state of the HCTL channel.
-	*/
-	MHCTLChannelObserver* iHCTLChannelObserver;
-
-	/**
-	Used to forward user plane data to the stack.
-	*/
-	MHCIDataObserver* iHCIDataObserver;
-
-	/**
-	Provides access to physical link information from the stack.
-	*/ 
-	MPhysicalLinksState* iPhysicalLinksState;
-
-	/**
-	The instance of the HCI server that is used in this implementation
-	*/
-	CHCIServer*	iHCIServer;
-	
-	/**
-	The HCTL plugin loaded by this core HCI instance
-	*/
-	CHCTLBase* iHCTLPlugin;
-
-	/**
-	The initialisation plugin loaded by this core HCI instance
-	*/
-	CControllerInitialisationPlugin* iInitialisationPlugin;		
-
-	/**
-	Used to indicate when an external client is using the HCI
-	*/
-	MHCIClientUsage* iClientUsage;
-	
-	/**
-	HCI Utility Library
-	*/
-	CHciUtil* iHciUtil;
-	
-	/**
-	Size of HCTL header / trailer (octets)
-	*/
-	TUint iHCTLCommandHeaderSize;
-	TUint iHCTLCommandTrailerSize;
-
-	TUint iHCTLACLHeaderSize;
-	TUint iHCTLACLTrailerSize;
-	
-	TUint iHCTLSyncDataHeaderSize;
-	TUint iHCTLSyncDataTrailerSize;
-	};
-
-#endif //HCICOREPLUGINIMPL_H
+// Copyright (c) 2006-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:
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#ifndef HCICOREPLUGINIMPL_H
+#define HCICOREPLUGINIMPL_H
+
+// Includes for parent classes
+#include <bluetooth/hci/corehciplugin.h>
+#include <bluetooth/hci/qdpplugininterfacefinder.h>
+#include <bluetooth/hci/hcicommandallocator.h>
+#include <bluetooth/hci/hcidataframer.h>
+#include <bluetooth/hci/hctldataobserver.h>
+#include <bluetooth/hci/hctleventobserver.h>
+#include <bluetooth/hci/controllerstateobserver.h>
+#include <bluetooth/hci/corehci.h>
+#include <bluetooth/hci/hctlchannelobserver.h>
+#include <bluetooth/hci/hciclientusage.h>
+
+#include <bluetooth/hardresetinitiator.h>
+
+class MHCTLPowerInterface;
+class CHCIServer;
+class CHCTLBase;
+class CControllerInitialisationPlugin;
+class MHCTLInterface;
+class CHciUtil;
+
+/**
+An implementation of the CHCICorePlugin.
+This also directly implements the interfaces it "exports" 
+through the CHCICorePlugin::Interface function.
+*/
+class CCoreHCIPluginImpl : public CCoreHCIPlugin,
+						   public MHardResetInitiator,
+						   public MQdpPluginInterfaceFinder,
+						   public MHCICommandAllocator,
+						   public MHCIDataFramer,
+						   public MHCTLDataObserver,
+						   public MHCTLEventObserver,
+						   public MControllerStateObserver,
+						   public MCoreHci,
+						   public MHCTLChannelObserver,
+						   public MHCIClientUsageCallback
+	{
+public:
+	static CCoreHCIPluginImpl* NewL();
+	virtual TAny* Interface(TUid aUid);
+	~CCoreHCIPluginImpl();
+
+	TInt SetPower(TBTPowerState aState, TDesC8* aBuf);
+	TInt GetPower(TBTPowerState& aState, TDesC8* aBuf);
+
+	void OpenClientReference();
+	void CloseClientReference();
+	
+private:
+	// MHardResetInitiator
+	virtual void MhriStartHardReset();
+	
+	// MHCICommandAllocator
+	virtual CHctlCommandFrame* MhcaNewFrameL();
+
+	// MHCIDataFramer
+	virtual CHctlAclDataFrame* MhdfNewAclDataFrameL(TUint16 aSize);
+	virtual void MhdfFormatAclData(CHctlAclDataFrame& aFrame, THCIConnHandle aConnH, TAclPacketBoundaryFlag aBoundaryFlag, TAclPacketBroadcastFlag aBroadcastFlag, const TDesC8& aData);
+	virtual CHctlSynchronousDataFrame* MhdfNewSynchronousDataFrameL(TUint8 aSize);
+	virtual void MhdfFormatSynchronousData(CHctlSynchronousDataFrame& aFrame, THCIConnHandle aConnH, const TDesC8& aData);
+
+	// MHCTLDataObserver
+	virtual void MhdoProcessAclData(const TDesC8& aData);
+	virtual void MhdoProcessSynchronousData(const TDesC8& aData);
+
+	// MHCTLEventObserver
+	virtual void MheoProcessEvent(const TDesC8& aEvent);
+
+	// MControllerStateObserver
+	virtual void McsoProcessPowerChange(TInt aError, TControllerChangeType aChangeType, TBTPowerState aState);
+	virtual void McsoProcessHardResetPhaseChange(TInt aError, TControllerChangeType aChangeType, TBTHardResetState aState);
+
+	// MQdpPluginInterfaceFinder
+	virtual TAny* MqpifQdpPluginInterface(const TUid aUid);
+
+	// MCoreHci
+	virtual TInt MchSetOption(TUint aName, const TDesC8& aData);
+	virtual TInt MchGetOption(TUint aName, TDes8& aData);
+	virtual void MchIoctl(TUint aLevel, TUint aName, TDes8* aOption, TAny* aStackSAP);
+	virtual void MchCancelIoctl(TUint aLevel, TUint aName, TAny* aStackSAP) ;
+	virtual void MchSetHCICommandQueue(MHCICommandQueue& aHCICommandQueue);
+	virtual void MchSetPhysicalLinksState(MPhysicalLinksState& aPhysicalLinksState) ;
+	virtual void MchSetHardResetInitiator(MHardResetInitiator& aHcHardResetInitiator) ;
+	virtual void MchSetDataEventObserver(MHCIDataEventObserver& aHCIDataEventObserver) ;
+	virtual void MchSetDataObserver(MHCIDataObserver& aHCIDataObserver) ;
+	virtual void MchSetCommandEventObserver(MHCICommandEventObserver& aHCICommandEventObserver) ;
+	virtual void MchSetChannelObserver(MHCTLChannelObserver& aHCIChannelObserver) ;
+	virtual void MchSetControllerStateObserver(MControllerStateObserver& aHCIPowerStateObserver) ;
+	virtual TAny* MchHctlPluginInterface(TUid aUid);
+	
+	// MHCTLChannelObserver
+	virtual void MhcoChannelOpen(THCITransportChannel aChannels);
+	virtual void MhcoChannelClosed(THCITransportChannel aChannels);
+
+	// MHCIClientUsageCallback
+	virtual void MhcucSetClientUsage(MHCIClientUsage& aClientUsage);
+	
+private:
+	void ConstructL();
+
+private:	
+	void RequestHardResetFromStack();
+	
+private:
+	/**
+	The instance that will be used to request a hard reset from the stack
+	(Stack will call back CoreHci method to actaully perform the hard reset once it has done all the preparations).
+	*/
+	MHardResetInitiator* iStackHardResetRequester;
+	
+	/**
+	The instance that will be pass onto the HCTL a request to perform a hard reset on the host controller.
+	*/
+	MHardResetInitiator* iHCTLHardResetPerformer;
+
+	/**
+	The instance that will be sent the details of Controller State Events received by the HCI Layer.
+	*/
+	MControllerStateObserver* iControllerStateObserver;
+
+	/**
+	The instance that will be sent the details of Data Events received by the HCI Layer.
+	*/
+	MHCIDataEventObserver* iDataEventObserver;
+
+	/**
+	The instance that will be sent the data of Command Events received by the HCI Layer.
+	*/
+	MHCICommandEventObserver* iCommandEventObserver;
+
+	/**
+	The instance that will be used to communicate with the command queue.
+	*/
+	MHCICommandQueue* iHCICommandQueue;
+
+	/**
+	The instance that will be used to communicate with the HCTL's power controller.
+	*/
+	MHCTLPowerInterface* iHCTLPowerInterface;
+
+	/**
+	The instance used to communicate changes in the state of the HCTL channel.
+	*/
+	MHCTLChannelObserver* iHCTLChannelObserver;
+	
+	/**
+	Used to keep track of the channel state until an observer is registered.
+	*/
+	THCITransportChannel iHCTLChannelState;
+
+	/**
+	Used to forward user plane data to the stack.
+	*/
+	MHCIDataObserver* iHCIDataObserver;
+
+	/**
+	Provides access to physical link information from the stack.
+	*/ 
+	MPhysicalLinksState* iPhysicalLinksState;
+
+	/**
+	The instance of the HCI server that is used in this implementation
+	*/
+	CHCIServer*	iHCIServer;
+	
+	/**
+	The HCTL plugin loaded by this core HCI instance
+	*/
+	CHCTLBase* iHCTLPlugin;
+
+	/**
+	The initialisation plugin loaded by this core HCI instance
+	*/
+	CControllerInitialisationPlugin* iInitialisationPlugin;		
+
+	/**
+	Used to indicate when an external client is using the HCI
+	*/
+	MHCIClientUsage* iClientUsage;
+	
+	/**
+	HCI Utility Library
+	*/
+	CHciUtil* iHciUtil;
+	
+	/**
+	Size of HCTL header / trailer (octets)
+	*/
+	TUint iHCTLCommandHeaderSize;
+	TUint iHCTLCommandTrailerSize;
+
+	TUint iHCTLACLHeaderSize;
+	TUint iHCTLACLTrailerSize;
+	
+	TUint iHCTLSyncDataHeaderSize;
+	TUint iHCTLSyncDataTrailerSize;
+	};
+
+#endif //HCICOREPLUGINIMPL_H
--- a/bthci/hci2implementations/corehcis/symbian/src/HciCorePluginImpl.cpp	Tue Feb 02 01:12:20 2010 +0200
+++ b/bthci/hci2implementations/corehcis/symbian/src/HciCorePluginImpl.cpp	Thu Oct 14 11:30:12 2010 +0100
@@ -1,516 +1,529 @@
-// 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 "HciCorePluginImpl.h"
-#include "hciserver.h"
-#include "hciserverrequestmgr.h"
-#include "corehciutil.h"
-
-#include <bluetooth/hci/hctlbase.h>
-#include <bluetooth/hci/hctlinterface.h>
-#include <bluetooth/hci/controllerinitialisationplugin.h>
-#include <bluetooth/hci/controllerinitialisationinterface.h>
-#include <bluetooth/hci/hctlpowerinterface.h>
-#include <bluetooth/hci/hciframe.h>
-#include <bluetooth/hci/aclpacketconsts.h>
-#include <bluetooth/hci/hcidataobserver.h>
-#include <bluetooth/hci/hciutil.h>
-#include <bluetooth/hci/hciipc.h>
-#include <bluetooth/hci/event.h>
-
-#include <bluetooth/hcicommandqueue.h>
-#include <bluetooth/logger.h>
-
-#ifdef __FLOG_ACTIVE
-_LIT8(KLogComponent, LOG_COMPONENT_COREHCI_SYMBIAN);
-#endif
-
-_LIT(KHciUtilComponentName, "corehci_symbian");
-
-/*static*/ CCoreHCIPluginImpl* CCoreHCIPluginImpl::NewL()
-	{
-	LOG_STATIC_FUNC
-	
-	CCoreHCIPluginImpl* p = new(ELeave) CCoreHCIPluginImpl;
-	CleanupStack::PushL(p);
-	p->ConstructL();
-	CleanupStack::Pop();
-	return p;
-	}
-
-void CCoreHCIPluginImpl::ConstructL()
-/*
-Start up the HCTL plugin, then the initialisation plugin, as per the information
-in section 2.3 of PREQ750_Improvements document.
-*/
-	{
-	LOG_FUNC
-	
-	// Create HCI Utility library
-	iHciUtil = CHciUtil::NewL(KHciUtilComponentName);
-
-	// If we can't open the ini file then this will be treated in the same way
-	// as not reading a valid UID from the ini file.
-	TRAP_IGNORE(iHciUtil->OpenIniFileL());
-	
-	// Create Core HCI plugin
-	_LIT(KSection, "Plugins");
-	_LIT(KHCTLUid, "hctl_uid");
-
-	TUid hctlImplUid = TUid::Null();
-	TRAPD(err, hctlImplUid = iHciUtil->GetUidFromFileL(KSection, KHCTLUid));
-
-	if (err == KErrNone)
-		{
-		// Valid UID found, load it
-		iHCTLPlugin = CHCTLBase::NewL(hctlImplUid);
-		}
-	else
-		{
-		// No UID found in ini file, attempt to load single instance of 
-		// implementation
-		iHCTLPlugin = CHCTLBase::NewL();
-		}
-
-	// Add this as the event observer.
-	MHCTLInterface* hctl = static_cast<MHCTLInterface*>(iHCTLPlugin->Interface(TUid::Uid(KHCTLInterfaceUid)));
-	__ASSERT_ALWAYS(hctl, PANIC(KCoreHciPanicCat, EUninitialisedInterface));
-	
-	iHCTLHardResetPerformer = static_cast<MHardResetInitiator*>(iHCTLPlugin->Interface(TUid::Uid(KHCHardResetUid)));
-	__ASSERT_ALWAYS(iHCTLHardResetPerformer, PANIC(KCoreHciPanicCat, EUninitialisedInterface));				
-
-	// Setup observers on the HCTL.
-	hctl->MhiSetEventObserver(*this);
-	hctl->MhiSetChannelObserver(*this);
-	hctl->MhiSetDataObserver(*this);
-	hctl->MhiSetControllerStateObserver(*this);
-	
-	// Create the initialisor. The initialisor is optional so don't worry if
-	// we can't load it.
-	_LIT(KInitialisorUid, "initialisation_uid");
-
-	TUid initImplUid = TUid::Null();
-	TRAP(err, initImplUid = iHciUtil->GetUidFromFileL(KSection, KInitialisorUid));
-
-	if (err == KErrNone)
-		{
-		// Valid UID found, load it
-		iInitialisationPlugin = CControllerInitialisationPlugin::NewL(initImplUid);
-		}
-	else
-		{
-		// No UID found in ini file, attempt to load single instance of 
-		// implementation
-		TRAP_IGNORE(iInitialisationPlugin = CControllerInitialisationPlugin::NewL());
-		}
-
-	if(iInitialisationPlugin)
-		{
-		MControllerInitialisationInterface* initialisor = 
-			static_cast<MControllerInitialisationInterface*>
-				(iInitialisationPlugin->Interface(TUid::Uid(KControllerInitialisationInterfaceUid)));
-		
-		__ASSERT_ALWAYS(initialisor, PANIC(KCoreHciPanicCat, EUninitialisedInterface));
-
-		initialisor->MciiSetCoreHci(*this);
-		}
-
-	iHCIServer = CHCIServer::NewL(*this);
-
-	// The power interface is not required so iHCTLPowerInterface can be NULL after
-	// the following call. Check for NULL before using iHCTLPowerInterface elsewhere.
-	iHCTLPowerInterface = static_cast<MHCTLPowerInterface*>(iHCTLPlugin->Interface(TUid::Uid(KHCTLPowerInterfaceUid)));
-
-	// Get the HCTL specific frame header and trailer octet sizes.
-	hctl->MhiGetCommandTransportOverhead(iHCTLCommandHeaderSize, iHCTLCommandTrailerSize);
-	hctl->MhiGetAclDataTransportOverhead(iHCTLACLHeaderSize, iHCTLACLTrailerSize);
-	hctl->MhiGetSynchronousDataTransportOverhead(iHCTLSyncDataHeaderSize, iHCTLSyncDataTrailerSize);
-	}
-
-CCoreHCIPluginImpl::~CCoreHCIPluginImpl()
-	{
-	LOG_FUNC
-	
-	//delete in the order given in section 2.4 of PREQ750_Improvements document
-	delete iInitialisationPlugin;
-	delete iHCTLPlugin;	
-	delete iHCIServer;
-	delete iHciUtil;
-	}
-	
-//Request hard reset from the stack - stack will do all the required preparation - such as notify QDP and so on, and call us back via MHardResetInitiator interface
-void CCoreHCIPluginImpl::RequestHardResetFromStack()
-	{
-	LOG_FUNC
-	__ASSERT_ALWAYS(iStackHardResetRequester, PANIC(KCoreHciPanicCat, EUninitialisedInterface));	
-	iStackHardResetRequester->MhriStartHardReset();
-	}
-	
-// Set Power received from the HCI server
-TInt CCoreHCIPluginImpl::SetPower(TBTPowerState aState, TDesC8* /*aBuf*/)
-	{
-	LOG_FUNC
-	
-	if(iHCTLPowerInterface)
-		{
-		return iHCTLPowerInterface->MhpiSetPower(aState);
-		}
-	else
-		{
-		return KErrNotSupported;
-		}
-	}
-	
-// Get Power received from the HCI server
-TInt CCoreHCIPluginImpl::GetPower(TBTPowerState& aState, TDesC8* /*aBuf*/)
-	{
-	LOG_FUNC
-	
-	if(iHCTLPowerInterface)
-		{
-		return iHCTLPowerInterface->MhpiGetPower(aState);
-		}
-	else
-		{
-		return KErrNotSupported;
-		}
-	}
-	
-TAny* CCoreHCIPluginImpl::Interface(TUid aUid)
-	{
-	LOG_FUNC
-	
-	TAny* ret = NULL;
-	
-	switch(aUid.iUid)
-		{		
-	case KCoreHciInterfaceUid:
-		{		
-		ret = reinterpret_cast<TAny*>(static_cast<MCoreHci*>(this));
-		break;
-		}
-	
-	case KHCIDataFramerInterfaceUid:
-		{		
-		ret = reinterpret_cast<TAny*>(static_cast<MHCIDataFramer*>(this));
-		break;
-		}
-		
-	case KHCICommandAllocatorInterfaceUid:
-		{		
-		ret = reinterpret_cast<TAny*>(static_cast<MHCICommandAllocator*>(this));
-		break;
-		}
-
-	case KHCHardResetUid:
-		{		
-		ret = reinterpret_cast<TAny*>(static_cast<MHardResetInitiator*>(this));
-		break;
-		}
-	
-	case KHCTLInterfaceUid:
-		{		
-		ret = iHCTLPlugin->Interface(aUid);
-		break;
-		}
-		
-	case KControllerInitialisationInterfaceUid:
-		{
-		if (iInitialisationPlugin != NULL)
-			{
-			ret = iInitialisationPlugin->Interface(aUid);
-			}
-		break;
-		}
-					
-	case KHCIClientUsageCallbackUid:
-		{
-		ret = reinterpret_cast<TAny*>(static_cast<MHCIClientUsageCallback*>(this));
-		break;
-		}
-
-	default:	
-		break;
-		}
-	
-	return ret;
-	}
-	
-void CCoreHCIPluginImpl::MhriStartHardReset()
-	{
-	LOG_FUNC	
-
-	iHCTLHardResetPerformer->MhriStartHardReset();
-	}
-	
-CHctlCommandFrame* CCoreHCIPluginImpl::MhcaNewFrameL()
-	{
-	LOG_FUNC
-	
-	return (CHctlCommandFrame::NewL(iHCTLCommandHeaderSize, iHCTLCommandTrailerSize));
-	}
-
-
-CHctlAclDataFrame* CCoreHCIPluginImpl::MhdfNewAclDataFrameL(TUint16 aSize)
-	{
-	LOG_FUNC
-	
-	return CHctlAclDataFrame::NewL(aSize, iHCTLACLHeaderSize, iHCTLACLTrailerSize);
-	}
-
-CHctlSynchronousDataFrame* CCoreHCIPluginImpl::MhdfNewSynchronousDataFrameL(TUint8 aSize)
-	{
-	LOG_FUNC
-	
-	return CHctlSynchronousDataFrame::NewL(aSize, iHCTLSyncDataHeaderSize, iHCTLSyncDataTrailerSize);
-	}
-
-/*virtual*/ void CCoreHCIPluginImpl::MhdfFormatAclData(CHctlAclDataFrame& aFrame, THCIConnHandle aConnH,
-									TAclPacketBoundaryFlag aBoundaryFlag, TAclPacketBroadcastFlag aBroadcastFlag, 
-									const TDesC8& aData)
-	{
-	LOG_FUNC
-	
-	THCIConnHandle handle = aConnH;
-
-	if(aBroadcastFlag != EPointToPointOnly)
-		{
-		handle = 0xbca; //TODO KHCIBroadcastHandle;
-		}
-
-	aFrame.SetConnectionHandle(handle);
-	aFrame.SetFlags(aBoundaryFlag, aBroadcastFlag);
-	aFrame.SetDataPayload(aData); // also sets DataLength
-	}
-
-void CCoreHCIPluginImpl::MhdfFormatSynchronousData(CHctlSynchronousDataFrame& aFrame, 
-												   THCIConnHandle aConnH, const TDesC8& aData)
-	{
-	LOG_FUNC
-	
-	THCIConnHandle handle = aConnH;
-	aFrame.SetConnectionHandle(handle);
-	aFrame.SetDataPayload(aData); // also sets DataLength
-	}
-
-void CCoreHCIPluginImpl::MhdoProcessAclData(const TDesC8& aData)
-	{
-	LOG_FUNC
-
-	TAclPacketBoundaryFlag pbFlag = CHctlAclDataFrame::PacketBoundaryFlag(aData);
-    TAclPacketBroadcastFlag bcFlag = CHctlAclDataFrame::PacketBroadcastFlag(aData);
-	THCIConnHandle handle = CHctlDataFrameBase::ConnectionHandle(aData);
-	iHCIDataObserver->MhdoProcessAclData(handle, pbFlag, bcFlag,
-						aData.Right(aData.Length() - CHctlAclDataFrame::KHCIACLDataPacketHeaderLength));
-	}
-
-void CCoreHCIPluginImpl::MhdoProcessSynchronousData(const TDesC8& aData)
-	{
-	LOG_FUNC
-	
-	THCIConnHandle handle = CHctlDataFrameBase::ConnectionHandle(aData);
-	iHCIDataObserver->MhdoProcessSynchronousData(handle, 0,
-						aData.Right(aData.Length() - CHctlSynchronousDataFrame::KHCISynchronousDataPacketHeaderLength));
-	}
-
-void CCoreHCIPluginImpl::MheoProcessEvent(const TDesC8& aEvent)
-	{
-	LOG_FUNC
-
-	if (THCIEventBase::CreateAndSendEvent(aEvent, *iCommandEventObserver, *iDataEventObserver) != KErrNone)
-		{
-		// If we got an error processing the event, reset the controller
-		RequestHardResetFromStack();
-		}
-	}
-
-void CCoreHCIPluginImpl::McsoProcessPowerChange(TInt aError, TControllerChangeType aChangeType,
-												TBTPowerState aState)
-	{
-	LOG_FUNC
-	
-	iHCIServer->PowerControlManager().CompleteRequest(aError);
-	iControllerStateObserver->McsoProcessPowerChange(aError, aChangeType, aState); //pass on up
-	}
-
-void CCoreHCIPluginImpl::McsoProcessHardResetPhaseChange(TInt aError, TControllerChangeType aChangeType,
-														 TBTHardResetState aState)
-	{
-	LOG_FUNC
-	
-	iControllerStateObserver->McsoProcessHardResetPhaseChange(aError, aChangeType, aState); //pass on up
-	}
-
-TAny* CCoreHCIPluginImpl::MqpifQdpPluginInterface(const TUid aUid)
-	{
-	LOG_FUNC
-	
-	if(iHCICommandQueue)
-		{
-		return (iHCICommandQueue->MhcqQdpPluginInterface(aUid));
-		}
-		
-	return NULL;
-	}
-
-TInt CCoreHCIPluginImpl::MchSetOption(TUint /*aName*/, const TDesC8& /*aData*/)
-	{
-	LOG_FUNC
-	
-	return KErrNotSupported;
-	}
-
-TInt CCoreHCIPluginImpl::MchGetOption(TUint /*aName*/, TDes8& /*aData*/)
-	{
-	LOG_FUNC
-	
-	return KErrNotSupported;
-	}
-
-void CCoreHCIPluginImpl::MchIoctl(TUint /*aLevel*/,TUint /*aName*/, TDes8* /*aOption*/, TAny* /*aStackSAP*/)
-	{
-	LOG_FUNC
-	}
-
-void CCoreHCIPluginImpl::MchCancelIoctl(TUint /*aLevel*/,TUint /*aName*/, TAny* /*aStackSAP*/)
-	{
-	LOG_FUNC
-	}
-
-void CCoreHCIPluginImpl::MchSetHCICommandQueue(MHCICommandQueue& aHCICommandQueue)
-	{
-	LOG_FUNC
-	__ASSERT_DEBUG(!iHCICommandQueue, PANIC(KCoreHciPanicCat, EInterfaceAlreadyInitialised));
-
-	iHCICommandQueue = &aHCICommandQueue;
-	iHCIServer->DirectAccessManager().SetHCICommandQueue(*iHCICommandQueue);
-	}
-
-void CCoreHCIPluginImpl::MchSetPhysicalLinksState(MPhysicalLinksState& aPhysicalLinksState)
-	{
-	LOG_FUNC
-	__ASSERT_DEBUG(!iPhysicalLinksState, PANIC(KCoreHciPanicCat, EInterfaceAlreadyInitialised));
-	
-	iPhysicalLinksState = &aPhysicalLinksState;
-	}
-
-void CCoreHCIPluginImpl::MchSetHardResetInitiator(MHardResetInitiator& aHardResetInitiator)
-	{
-	LOG_FUNC
-	__ASSERT_DEBUG(!iStackHardResetRequester, PANIC(KCoreHciPanicCat, EInterfaceAlreadyInitialised));
-	
-	iStackHardResetRequester = &aHardResetInitiator;
-	}
-
-void CCoreHCIPluginImpl::MchSetDataEventObserver(MHCIDataEventObserver& aHCIDataEventObserver)
-	{
-	LOG_FUNC
-	__ASSERT_DEBUG(!iDataEventObserver, PANIC(KCoreHciPanicCat, EInterfaceAlreadyInitialised));
-	
-	iDataEventObserver = &aHCIDataEventObserver;
-	}
-
-void CCoreHCIPluginImpl::MchSetDataObserver(MHCIDataObserver& aHCIDataObserver)
-	{
-	LOG_FUNC
-	__ASSERT_DEBUG(!iHCIDataObserver, PANIC(KCoreHciPanicCat, EInterfaceAlreadyInitialised));
-	
-	iHCIDataObserver = &aHCIDataObserver;
-	}
-
-void CCoreHCIPluginImpl::MchSetCommandEventObserver(MHCICommandEventObserver& aHCICommandEventObserver)
-	{
-	LOG_FUNC
-	__ASSERT_DEBUG(!iCommandEventObserver, PANIC(KCoreHciPanicCat, EInterfaceAlreadyInitialised));
-	
-	iCommandEventObserver = &aHCICommandEventObserver;
-	}
-
-void CCoreHCIPluginImpl::MchSetChannelObserver(MHCTLChannelObserver& aHCIChannelObserver)
-	{
-	LOG_FUNC
-	__ASSERT_DEBUG(!iHCTLChannelObserver, PANIC(KCoreHciPanicCat, EInterfaceAlreadyInitialised));
-	
-	iHCTLChannelObserver = &aHCIChannelObserver;
-	}
-
-void CCoreHCIPluginImpl::MchSetControllerStateObserver(MControllerStateObserver& aControllerStateObserver)
-	{
-	LOG_FUNC
-	__ASSERT_DEBUG(!iControllerStateObserver, PANIC(KCoreHciPanicCat, EInterfaceAlreadyInitialised));
-	
-	iControllerStateObserver = &aControllerStateObserver;
-	}
-
-TAny* CCoreHCIPluginImpl::MchHctlPluginInterface(const TUid aUid)
-	{
-	LOG_FUNC
-	
-	return iHCTLPlugin->Interface(aUid);
-	}
-
-void CCoreHCIPluginImpl::MhcoChannelOpen(THCITransportChannel aChannels)
-	{
-	LOG_FUNC
-	
-	// Just pass on to the upper HCLT channel observer. 
-	iHCTLChannelObserver->MhcoChannelOpen(aChannels);
-	}
-	
-void CCoreHCIPluginImpl::MhcoChannelClosed(THCITransportChannel aChannels)
-	{
-	LOG_FUNC
-	
-	// Just pass on to the upper HCTL channel observer. 
-	iHCTLChannelObserver->MhcoChannelClosed(aChannels);
-	}
-
-void CCoreHCIPluginImpl::MhcucSetClientUsage(MHCIClientUsage& aClientUsage)
-	{
-	LOG_FUNC
-	__ASSERT_DEBUG(!iClientUsage, PANIC(KCoreHciPanicCat, EInterfaceAlreadyInitialised));
-	
-	iClientUsage = &aClientUsage;
-	}
-
-void CCoreHCIPluginImpl::OpenClientReference()
-	{
-	LOG_FUNC
-	__ASSERT_DEBUG(iClientUsage, PANIC(KCoreHciPanicCat, EUninitialisedInterface));
-	
-	if (iClientUsage)
-		{
-		iClientUsage->MhcuOpenClientReference();
-		}
-	}
-
-void CCoreHCIPluginImpl::CloseClientReference()
-	{
-	LOG_FUNC
-	__ASSERT_DEBUG(iClientUsage, PANIC(KCoreHciPanicCat, EUninitialisedInterface));
-
-	if (iClientUsage)
-		{
-		iClientUsage->MhcuCloseClientReference();
-		}
-	}
-
-// EOF
-
+// Copyright (c) 2006-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:
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include "HciCorePluginImpl.h"
+#include "hciserver.h"
+#include "hciserverrequestmgr.h"
+#include "corehciutil.h"
+
+#include <bluetooth/hci/hctlbase.h>
+#include <bluetooth/hci/hctlinterface.h>
+#include <bluetooth/hci/controllerinitialisationplugin.h>
+#include <bluetooth/hci/controllerinitialisationinterface.h>
+#include <bluetooth/hci/hctlpowerinterface.h>
+#include <bluetooth/hci/hciframe.h>
+#include <bluetooth/hci/aclpacketconsts.h>
+#include <bluetooth/hci/hcidataobserver.h>
+#include <bluetooth/hci/hciutil.h>
+#include <bluetooth/hci/hciipc.h>
+#include <bluetooth/hci/event.h>
+
+#include <bluetooth/hcicommandqueue.h>
+#include <bluetooth/logger.h>
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, LOG_COMPONENT_COREHCI_SYMBIAN);
+#endif
+
+_LIT(KHciUtilComponentName, "corehci_symbian");
+
+/*static*/ CCoreHCIPluginImpl* CCoreHCIPluginImpl::NewL()
+	{
+	LOG_STATIC_FUNC
+	
+	CCoreHCIPluginImpl* p = new(ELeave) CCoreHCIPluginImpl;
+	CleanupStack::PushL(p);
+	p->ConstructL();
+	CleanupStack::Pop();
+	return p;
+	}
+
+void CCoreHCIPluginImpl::ConstructL()
+/*
+Start up the HCTL plugin, then the initialisation plugin.
+*/
+	{
+	LOG_FUNC
+	
+	// Create HCI Utility library
+	iHciUtil = CHciUtil::NewL(KHciUtilComponentName);
+
+	// If we can't open the ini file then this will be treated in the same way
+	// as not reading a valid UID from the ini file.
+	TRAP_IGNORE(iHciUtil->OpenIniFileL());
+	
+	// Create Core HCI plugin
+	_LIT(KSection, "Plugins");
+	_LIT(KHCTLUid, "hctl_uid");
+
+	TUid hctlImplUid = TUid::Null();
+	TRAPD(err, hctlImplUid = iHciUtil->GetUidFromFileL(KSection, KHCTLUid));
+
+	if (err == KErrNone)
+		{
+		// Valid UID found, load it
+		iHCTLPlugin = CHCTLBase::NewL(hctlImplUid);
+		}
+	else
+		{
+		// No UID found in ini file, attempt to load single instance of 
+		// implementation
+		iHCTLPlugin = CHCTLBase::NewL();
+		}
+
+	// Add this as the event observer.
+	MHCTLInterface* hctl = static_cast<MHCTLInterface*>(iHCTLPlugin->Interface(TUid::Uid(KHCTLInterfaceUid)));
+	__ASSERT_ALWAYS(hctl, PANIC(KCoreHciPanicCat, EUninitialisedInterface));
+	
+	iHCTLHardResetPerformer = static_cast<MHardResetInitiator*>(iHCTLPlugin->Interface(TUid::Uid(KHCHardResetUid)));
+	__ASSERT_ALWAYS(iHCTLHardResetPerformer, PANIC(KCoreHciPanicCat, EUninitialisedInterface));				
+
+	// Setup observers on the HCTL.
+	hctl->MhiSetEventObserver(*this);
+	hctl->MhiSetChannelObserver(*this);
+	hctl->MhiSetDataObserver(*this);
+	hctl->MhiSetControllerStateObserver(*this);
+	
+	// Create the initialisor. The initialisor is optional so don't worry if
+	// we can't load it.
+	_LIT(KInitialisorUid, "initialisation_uid");
+
+	TUid initImplUid = TUid::Null();
+	TRAP(err, initImplUid = iHciUtil->GetUidFromFileL(KSection, KInitialisorUid));
+
+	if (err == KErrNone)
+		{
+		// Valid UID found, load it
+		iInitialisationPlugin = CControllerInitialisationPlugin::NewL(initImplUid);
+		}
+	else
+		{
+		// No UID found in ini file, attempt to load single instance of 
+		// implementation
+		TRAP_IGNORE(iInitialisationPlugin = CControllerInitialisationPlugin::NewL());
+		}
+
+	if(iInitialisationPlugin)
+		{
+		MControllerInitialisationInterface* initialisor = 
+			static_cast<MControllerInitialisationInterface*>
+				(iInitialisationPlugin->Interface(TUid::Uid(KControllerInitialisationInterfaceUid)));
+		
+		__ASSERT_ALWAYS(initialisor, PANIC(KCoreHciPanicCat, EUninitialisedInterface));
+
+		initialisor->MciiSetCoreHci(*this);
+		}
+
+	iHCIServer = CHCIServer::NewL(*this);
+
+	// The power interface is not required so iHCTLPowerInterface can be NULL after
+	// the following call. Check for NULL before using iHCTLPowerInterface elsewhere.
+	iHCTLPowerInterface = static_cast<MHCTLPowerInterface*>(iHCTLPlugin->Interface(TUid::Uid(KHCTLPowerInterfaceUid)));
+
+	// Get the HCTL specific frame header and trailer octet sizes.
+	hctl->MhiGetCommandTransportOverhead(iHCTLCommandHeaderSize, iHCTLCommandTrailerSize);
+	hctl->MhiGetAclDataTransportOverhead(iHCTLACLHeaderSize, iHCTLACLTrailerSize);
+	hctl->MhiGetSynchronousDataTransportOverhead(iHCTLSyncDataHeaderSize, iHCTLSyncDataTrailerSize);
+	}
+
+CCoreHCIPluginImpl::~CCoreHCIPluginImpl()
+	{
+	LOG_FUNC
+	
+	//delete in the correct order
+	delete iInitialisationPlugin;
+	delete iHCTLPlugin;	
+	delete iHCIServer;
+	delete iHciUtil;
+	}
+	
+//Request hard reset from the stack - stack will do all the required preparation - such as notify QDP and so on, and call us back via MHardResetInitiator interface
+void CCoreHCIPluginImpl::RequestHardResetFromStack()
+	{
+	LOG_FUNC
+	__ASSERT_ALWAYS(iStackHardResetRequester, PANIC(KCoreHciPanicCat, EUninitialisedInterface));	
+	iStackHardResetRequester->MhriStartHardReset();
+	}
+	
+// Set Power received from the HCI server
+TInt CCoreHCIPluginImpl::SetPower(TBTPowerState aState, TDesC8* /*aBuf*/)
+	{
+	LOG_FUNC
+	
+	if(iHCTLPowerInterface)
+		{
+		return iHCTLPowerInterface->MhpiSetPower(aState);
+		}
+	else
+		{
+		return KErrNotSupported;
+		}
+	}
+	
+// Get Power received from the HCI server
+TInt CCoreHCIPluginImpl::GetPower(TBTPowerState& aState, TDesC8* /*aBuf*/)
+	{
+	LOG_FUNC
+	
+	if(iHCTLPowerInterface)
+		{
+		return iHCTLPowerInterface->MhpiGetPower(aState);
+		}
+	else
+		{
+		return KErrNotSupported;
+		}
+	}
+	
+TAny* CCoreHCIPluginImpl::Interface(TUid aUid)
+	{
+	LOG_FUNC
+	
+	TAny* ret = NULL;
+	
+	switch(aUid.iUid)
+		{		
+	case KCoreHciInterfaceUid:
+		{		
+		ret = reinterpret_cast<TAny*>(static_cast<MCoreHci*>(this));
+		break;
+		}
+	
+	case KHCIDataFramerInterfaceUid:
+		{		
+		ret = reinterpret_cast<TAny*>(static_cast<MHCIDataFramer*>(this));
+		break;
+		}
+		
+	case KHCICommandAllocatorInterfaceUid:
+		{		
+		ret = reinterpret_cast<TAny*>(static_cast<MHCICommandAllocator*>(this));
+		break;
+		}
+
+	case KHCHardResetUid:
+		{		
+		ret = reinterpret_cast<TAny*>(static_cast<MHardResetInitiator*>(this));
+		break;
+		}
+	
+	case KHCTLInterfaceUid:
+		{
+		ret = iHCTLPlugin->Interface(aUid);
+		break;
+		}
+		
+	case KControllerInitialisationInterfaceUid:
+		{
+		if (iInitialisationPlugin != NULL)
+			{
+			ret = iInitialisationPlugin->Interface(aUid);
+			}
+		break;
+		}
+		
+	case KHCIClientUsageCallbackUid:
+		{
+		ret = reinterpret_cast<TAny*>(static_cast<MHCIClientUsageCallback*>(this));
+		break;
+		}
+
+	default:	
+		break;
+		}
+	
+	return ret;
+	}
+	
+void CCoreHCIPluginImpl::MhriStartHardReset()
+	{
+	LOG_FUNC	
+
+	iHCTLHardResetPerformer->MhriStartHardReset();
+	}
+	
+CHctlCommandFrame* CCoreHCIPluginImpl::MhcaNewFrameL()
+	{
+	LOG_FUNC
+	
+	return (CHctlCommandFrame::NewL(iHCTLCommandHeaderSize, iHCTLCommandTrailerSize));
+	}
+
+
+CHctlAclDataFrame* CCoreHCIPluginImpl::MhdfNewAclDataFrameL(TUint16 aSize)
+	{
+	LOG_FUNC
+	
+	return CHctlAclDataFrame::NewL(aSize, iHCTLACLHeaderSize, iHCTLACLTrailerSize);
+	}
+
+CHctlSynchronousDataFrame* CCoreHCIPluginImpl::MhdfNewSynchronousDataFrameL(TUint8 aSize)
+	{
+	LOG_FUNC
+	
+	return CHctlSynchronousDataFrame::NewL(aSize, iHCTLSyncDataHeaderSize, iHCTLSyncDataTrailerSize);
+	}
+
+/*virtual*/ void CCoreHCIPluginImpl::MhdfFormatAclData(CHctlAclDataFrame& aFrame, THCIConnHandle aConnH,
+									TAclPacketBoundaryFlag aBoundaryFlag, TAclPacketBroadcastFlag aBroadcastFlag, 
+									const TDesC8& aData)
+	{
+	LOG_FUNC
+	
+	THCIConnHandle handle = aConnH;
+
+	if(aBroadcastFlag != EPointToPointOnly)
+		{
+		handle = 0xbca; //TODO KHCIBroadcastHandle;
+		}
+
+	aFrame.SetConnectionHandle(handle);
+	aFrame.SetFlags(aBoundaryFlag, aBroadcastFlag);
+	aFrame.SetDataPayload(aData); // also sets DataLength
+	}
+
+void CCoreHCIPluginImpl::MhdfFormatSynchronousData(CHctlSynchronousDataFrame& aFrame, 
+												   THCIConnHandle aConnH, const TDesC8& aData)
+	{
+	LOG_FUNC
+	
+	THCIConnHandle handle = aConnH;
+	aFrame.SetConnectionHandle(handle);
+	aFrame.SetDataPayload(aData); // also sets DataLength
+	}
+
+void CCoreHCIPluginImpl::MhdoProcessAclData(const TDesC8& aData)
+	{
+	LOG_FUNC
+
+	TAclPacketBoundaryFlag pbFlag = CHctlAclDataFrame::PacketBoundaryFlag(aData);
+    TAclPacketBroadcastFlag bcFlag = CHctlAclDataFrame::PacketBroadcastFlag(aData);
+	THCIConnHandle handle = CHctlDataFrameBase::ConnectionHandle(aData);
+	iHCIDataObserver->MhdoProcessAclData(handle, pbFlag, bcFlag,
+						aData.Right(aData.Length() - CHctlAclDataFrame::KHCIACLDataPacketHeaderLength));
+	}
+
+void CCoreHCIPluginImpl::MhdoProcessSynchronousData(const TDesC8& aData)
+	{
+	LOG_FUNC
+	
+	THCIConnHandle handle = CHctlDataFrameBase::ConnectionHandle(aData);
+	iHCIDataObserver->MhdoProcessSynchronousData(handle, 0,
+						aData.Right(aData.Length() - CHctlSynchronousDataFrame::KHCISynchronousDataPacketHeaderLength));
+	}
+
+void CCoreHCIPluginImpl::MheoProcessEvent(const TDesC8& aEvent)
+	{
+	LOG_FUNC
+
+	if (THCIEventBase::CreateAndSendEvent(aEvent, *iCommandEventObserver, *iDataEventObserver) != KErrNone)
+		{
+		// If we got an error processing the event, reset the controller
+		RequestHardResetFromStack();
+		}
+	}
+
+void CCoreHCIPluginImpl::McsoProcessPowerChange(TInt aError, TControllerChangeType aChangeType,
+												TBTPowerState aState)
+	{
+	LOG_FUNC
+	
+	iHCIServer->PowerControlManager().CompleteRequest(aError);
+	iControllerStateObserver->McsoProcessPowerChange(aError, aChangeType, aState); //pass on up
+	}
+
+void CCoreHCIPluginImpl::McsoProcessHardResetPhaseChange(TInt aError, TControllerChangeType aChangeType,
+														 TBTHardResetState aState)
+	{
+	LOG_FUNC
+	
+	iControllerStateObserver->McsoProcessHardResetPhaseChange(aError, aChangeType, aState); //pass on up
+	}
+
+TAny* CCoreHCIPluginImpl::MqpifQdpPluginInterface(const TUid aUid)
+	{
+	LOG_FUNC
+	
+	if(iHCICommandQueue)
+		{
+		return (iHCICommandQueue->MhcqQdpPluginInterface(aUid));
+		}
+		
+	return NULL;
+	}
+
+TInt CCoreHCIPluginImpl::MchSetOption(TUint /*aName*/, const TDesC8& /*aData*/)
+	{
+	LOG_FUNC
+	
+	return KErrNotSupported;
+	}
+
+TInt CCoreHCIPluginImpl::MchGetOption(TUint /*aName*/, TDes8& /*aData*/)
+	{
+	LOG_FUNC
+	
+	return KErrNotSupported;
+	}
+
+void CCoreHCIPluginImpl::MchIoctl(TUint /*aLevel*/,TUint /*aName*/, TDes8* /*aOption*/, TAny* /*aStackSAP*/)
+	{
+	LOG_FUNC
+	}
+
+void CCoreHCIPluginImpl::MchCancelIoctl(TUint /*aLevel*/,TUint /*aName*/, TAny* /*aStackSAP*/)
+	{
+	LOG_FUNC
+	}
+
+void CCoreHCIPluginImpl::MchSetHCICommandQueue(MHCICommandQueue& aHCICommandQueue)
+	{
+	LOG_FUNC
+	__ASSERT_DEBUG(!iHCICommandQueue, PANIC(KCoreHciPanicCat, EInterfaceAlreadyInitialised));
+
+	iHCICommandQueue = &aHCICommandQueue;
+	iHCIServer->DirectAccessManager().SetHCICommandQueue(*iHCICommandQueue);
+	}
+
+void CCoreHCIPluginImpl::MchSetPhysicalLinksState(MPhysicalLinksState& aPhysicalLinksState)
+	{
+	LOG_FUNC
+	__ASSERT_DEBUG(!iPhysicalLinksState, PANIC(KCoreHciPanicCat, EInterfaceAlreadyInitialised));
+	
+	iPhysicalLinksState = &aPhysicalLinksState;
+	}
+
+void CCoreHCIPluginImpl::MchSetHardResetInitiator(MHardResetInitiator& aHardResetInitiator)
+	{
+	LOG_FUNC
+	__ASSERT_DEBUG(!iStackHardResetRequester, PANIC(KCoreHciPanicCat, EInterfaceAlreadyInitialised));
+	
+	iStackHardResetRequester = &aHardResetInitiator;
+	}
+
+void CCoreHCIPluginImpl::MchSetDataEventObserver(MHCIDataEventObserver& aHCIDataEventObserver)
+	{
+	LOG_FUNC
+	__ASSERT_DEBUG(!iDataEventObserver, PANIC(KCoreHciPanicCat, EInterfaceAlreadyInitialised));
+	
+	iDataEventObserver = &aHCIDataEventObserver;
+	}
+
+void CCoreHCIPluginImpl::MchSetDataObserver(MHCIDataObserver& aHCIDataObserver)
+	{
+	LOG_FUNC
+	__ASSERT_DEBUG(!iHCIDataObserver, PANIC(KCoreHciPanicCat, EInterfaceAlreadyInitialised));
+	
+	iHCIDataObserver = &aHCIDataObserver;
+	}
+
+void CCoreHCIPluginImpl::MchSetCommandEventObserver(MHCICommandEventObserver& aHCICommandEventObserver)
+	{
+	LOG_FUNC
+	__ASSERT_DEBUG(!iCommandEventObserver, PANIC(KCoreHciPanicCat, EInterfaceAlreadyInitialised));
+	
+	iCommandEventObserver = &aHCICommandEventObserver;
+	}
+
+void CCoreHCIPluginImpl::MchSetChannelObserver(MHCTLChannelObserver& aHCIChannelObserver)
+	{
+	LOG_FUNC
+	__ASSERT_DEBUG(!iHCTLChannelObserver, PANIC(KCoreHciPanicCat, EInterfaceAlreadyInitialised));
+
+	iHCTLChannelObserver = &aHCIChannelObserver;
+	// Inform observer of current state (if one is ready).
+	if(iHCTLChannelState)
+		{
+		iHCTLChannelObserver->MhcoChannelOpen(iHCTLChannelState);
+		}
+	}
+
+void CCoreHCIPluginImpl::MchSetControllerStateObserver(MControllerStateObserver& aControllerStateObserver)
+	{
+	LOG_FUNC
+	__ASSERT_DEBUG(!iControllerStateObserver, PANIC(KCoreHciPanicCat, EInterfaceAlreadyInitialised));
+	
+	iControllerStateObserver = &aControllerStateObserver;
+	}
+
+TAny* CCoreHCIPluginImpl::MchHctlPluginInterface(const TUid aUid)
+	{
+	LOG_FUNC
+	
+	return iHCTLPlugin->Interface(aUid);
+	}
+
+void CCoreHCIPluginImpl::MhcoChannelOpen(THCITransportChannel aChannels)
+	{
+	LOG_FUNC
+	
+	iHCTLChannelState |= aChannels;
+	LOG1(_L("\tiHCTLChannelObserver = 0x%08x"), iHCTLChannelObserver)
+	if(iHCTLChannelObserver)
+		{
+		iHCTLChannelObserver->MhcoChannelOpen(aChannels);
+		}
+
+	}
+	
+void CCoreHCIPluginImpl::MhcoChannelClosed(THCITransportChannel aChannels)
+	{
+	LOG_FUNC
+	
+	iHCTLChannelState &= ~aChannels;
+	LOG1(_L("\tiHCTLChannelObserver = 0x%08x"), iHCTLChannelObserver)
+	if(iHCTLChannelObserver)
+		{
+		iHCTLChannelObserver->MhcoChannelClosed(aChannels);
+		}
+	}
+
+void CCoreHCIPluginImpl::MhcucSetClientUsage(MHCIClientUsage& aClientUsage)
+	{
+	LOG_FUNC
+	__ASSERT_DEBUG(!iClientUsage, PANIC(KCoreHciPanicCat, EInterfaceAlreadyInitialised));
+	
+	iClientUsage = &aClientUsage;
+	}
+
+void CCoreHCIPluginImpl::OpenClientReference()
+	{
+	LOG_FUNC
+	__ASSERT_DEBUG(iClientUsage, PANIC(KCoreHciPanicCat, EUninitialisedInterface));
+	
+	if (iClientUsage)
+		{
+		iClientUsage->MhcuOpenClientReference();
+		}
+	}
+
+void CCoreHCIPluginImpl::CloseClientReference()
+	{
+	LOG_FUNC
+	__ASSERT_DEBUG(iClientUsage, PANIC(KCoreHciPanicCat, EUninitialisedInterface));
+
+	if (iClientUsage)
+		{
+		iClientUsage->MhcuCloseClientReference();
+		}
+	}
+
+// EOF
+
--- a/bthci/hci2implementations/corehcis/symbian/src/hciserverrequestmgr.cpp	Tue Feb 02 01:12:20 2010 +0200
+++ b/bthci/hci2implementations/corehcis/symbian/src/hciserverrequestmgr.cpp	Thu Oct 14 11:30:12 2010 +0100
@@ -1,658 +1,658 @@
-// 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 "hciserverrequestmgr.h"
-#include "HciCorePluginImpl.h"
-#include "corehciutil.h"
-
-#include <bluetooth/hci/hciipc.h>
-#include <bluetooth/hci/vendordebugcommand.h>
-#include <bluetooth/hci/vendordebugcompleteevent.h>
-#include <bluetooth/hci/vendordebugevent.h>
-
-#include <bluetooth/hcicommandqueueclient.h>
-#include <bluetooth/hcicommandqueue.h>
-#include <bluetooth/btpowercontrol.h>
-#include <bluetooth/dutmode.h>
-#include <bluetooth/a2dpoptimisation.h>
-#include <bluetooth/a2dpoptimisationparams.h>
-
-#include <bluetooth/logger.h>
-#include <bluetooth/btpowercontrolmessages.h>
-
-#include <es_sock.h>
-#include <bt_sock.h>
-
-#ifdef __FLOG_ACTIVE
-_LIT8(KLogComponent, LOG_COMPONENT_HCISERVER);
-#endif
-
-const TInt KHCIServerIpcDesOutParam = 2;
-
-void CHCIServerRequestManager::BlockAsync(CHCISession& aSession, const RMessage2& aMessage)
-	{
-	LOG_FUNC
-
-	iAsyncTaskMessage = aMessage;
-	iAsyncTaskSession = &aSession;
-	iBlockMask |= MaskBit();
-	}
-	
-void CHCIServerRequestManager::CompleteAsyncTask(TInt aError)
-	{
-	LOG_FUNC
-	
-	//check message is not already complete
-	if(iAsyncTaskMessage.Handle())
-		{
-		iAsyncTaskMessage.Complete(aError);
-		}
-	else
-		{
-		__ASSERT_DEBUG(EFalse, PANIC(KHciServerPanicCat, EMessageAlreadyCompleted));
-		}
-
-	// Remove Async block		
-	iAsyncTaskSession = 0;
-	iBlockMask &= ~MaskBit();
-	}
-	
-TBool CHCIServerRequestManager::IsAsyncBlocked()
-	{
-	LOG_FUNC
-	
-	return (iBlockMask & MaskBit());
-	}
-	
-CHCIServerRequestManager::CHCIServerRequestManager(CCoreHCIPluginImpl& aHCI)
- :	iHCI(aHCI)
-	{
-	LOG_FUNC
-	}
-	
-void CHCIServerRequestManager::ConstructL()
-	{
-	LOG_FUNC
-	}
-
-void CHCIServerRequestManager::ServiceL(CHCISession& aSession, const RMessage2& aMessage)
-	{
-	if(aMessage.Function() == EServiceSpecificRequest)
-		{
-		if(HasCapabilities(aMessage))
-			{
-			DoServiceL(aSession, aMessage);
-			}
-		// else HasCapabilities failed (and has dealt with aMessage).
-		}
-	else
-		{
-		// The client has issued a bad HCI Server request, we only expect a server specific
-		// request to be made (the specific request being encoded in the TIpcArgs).
-		PanicClient(aMessage, EUnknownHciServerFunction);
-		}
-	}
-
-//
-// HCI Direct Access Service
-//
-CHCIDirectAccessManager* CHCIDirectAccessManager::NewL(CCoreHCIPluginImpl& aHCI)
-	{
-	LOG_STATIC_FUNC
-	
-	CHCIDirectAccessManager* self = new (ELeave) CHCIDirectAccessManager(aHCI);
-	CleanupStack::PushL(self);
-	self->ConstructL();
-	CleanupStack::Pop(self);
-	return self;
-	}
-	
-void CHCIDirectAccessManager::SetHCICommandQueue(MHCICommandQueue& aHCICommandQueue)
-	{
-	LOG_FUNC
-	
-	__ASSERT_ALWAYS(!iHCICommandQueue, PANIC(KCoreHciPanicCat, EInterfaceAlreadyInitialised));
-	iHCICommandQueue = &aHCICommandQueue;
-	}
-
-/*virtual*/ TBool CHCIDirectAccessManager::HasCapabilities(const RMessage2& aMessage)
-	{
-	LOG_FUNC
-	
-	TBool allowed = EFalse;
-	
-	switch (aMessage.Int0())
-		{
-	case KHCIDirectAccessVendorCommand:
-		// Drop through
-	case KHCIDirectAccessCancel: // requires Network Control + Local Services
-		allowed = aMessage.HasCapability(ECapabilityNetworkControl) && aMessage.HasCapability(ECapabilityLocalServices);
-		break;
-
-	default:
-		PanicClient(aMessage, EUnknownDirectAccessFunction);
-		return EFalse;
-		}
-	
-	if(!allowed)
-		{
-		aMessage.Complete(KErrPermissionDenied);
-		}
-		
-	return allowed;
-	}
-
-/*virtual*/ void CHCIDirectAccessManager::DoServiceL(CHCISession& aSession, const RMessage2& aMessage)
-	{
-	LOG_FUNC
-	
-	TInt request = aMessage.Int0();
-
-	switch (request)
-		{
-	case KHCIDirectAccessCancel:
-		if (iAsyncTaskSession != &aSession)
-			{
-			return; //drop - not for current async task
-			}
-
-		// clear cache
-		iMessage = NULL;
-		
-		// perform cancellation procedure
-		CompleteAsyncTask(KErrCancel);
-		break;
-
-	case KHCIDirectAccessVendorCommand:
-		{
-		if (IsAsyncBlocked())
-			{
-			aMessage.Complete(KErrInUse);
-			return;
-			}
-
-		const TInt len = User::LeaveIfError(aMessage.GetDesLength(1));
-		
-		// Check the Vendor Command is at least 3 bytes long for the opcode
-		// and the length
-		if (len < 3)
-			{
-			PanicClient(aMessage, EInvalidVendorCommand);
-			break;
-			}
-		
-		HBufC8* buf = HBufC8::NewLC(len);
-		TPtr8 params(buf->Des());
-		aMessage.ReadL(1, params);
-		
-		// Extract the opcode and create the new command
-		TUint16 opcode = LittleEndian::Get16(params.Ptr());
-		
-		if (iHCICommandQueue)
-			{
-			CVendorDebugCommand* cmd = CVendorDebugCommand::NewL(opcode);
-
-			// Remove the opcode and length from the Vendor Command parameters,
-			// these will be added again to the command frame once it has been
-			// formatted
-			cmd->Command() = params.RightTPtr(params.Length() - 3);
-			
-			// cmd will be deleted in MhcqAddCommandL if Leaves.
-			TUint qid = iHCICommandQueue->MhcqAddCommandL(cmd, *this);
-
-			// Block only after we succeed in adding a command.
-			BlockAsync(aSession, aMessage);
-
-			// Cache to return completion data to client
-			iMessage = &aMessage;
-			}
-		else
-			{
-			// Slight possible race that a request is made before we have been
-			// given the command queue to work with - so don't panic just error.
-			aMessage.Complete(KErrNotReady);
-			}
-		CleanupStack::PopAndDestroy(buf);
-		}
-		break;
-
-	default:
-		// Unknown message, panic client
-		PanicClient(aMessage, EUnknownDirectAccessFunction);
-		break;
-		}
-	}
-
-/*virtual*/ void CHCIDirectAccessManager::MhcqcCommandErrored(TInt aErrorCode, const CHCICommandBase* /*aCommand*/)
-	{
-	LOG_FUNC
-
-	// clear cache
-	iMessage = NULL;
-
-	CompleteAsyncTask(aErrorCode);
-	}
-
-/*virtual*/ void CHCIDirectAccessManager::MhcqcCommandEventReceived(const THCIEventBase& aEvent, const CHCICommandBase* aCommand)
-	{
-	LOG_FUNC
-
-	// We are not the unmatched event observer therefore we must always get a
-	// command
-	__ASSERT_DEBUG(aCommand, PANIC(KCoreHciPanicCat, EReceivedUnmatchedEvent));
-	
-	// It is possible to receive an event but not have a message to complete. This
-	// could happen if a request was cancelled after a Vendor Specific command was
-	// sent, in this case we do nothing.
-	if (iMessage)
-		{
-		TInt err = KErrNone;
-		
-		const THCIEventCode eventcode(aEvent.EventCode());
-		switch(eventcode)
-			{
-		case ECommandCompleteEvent:
-			{
-			if ((aCommand->Opcode() & KVendorDebugOGF) == KVendorDebugOGF)
-				{
-				const TVendorDebugCompleteEvent& event = TVendorDebugCompleteEvent::Cast(aEvent);
-				
-				// Return the event
-				err = iMessage->Write(KHCIServerIpcDesOutParam, event.VendorDebugData());
-				}
-			else
-				{
-				__ASSERT_DEBUG(EFalse, PANIC(KHciServerPanicCat, ENonVendorOpcodeCompleted));
-				}
-			}
-			break;
-
-		case EVendorDebugEvent:
-			{
-			const TVendorDebugEvent& event = TVendorDebugEvent::Cast(aEvent);
-
-			// Return the event
-			err = iMessage->Write(KHCIServerIpcDesOutParam, event.VendorDebugData());
-			}
-			break;
-			
-		default:
-			__ASSERT_DEBUG(EFalse, PANIC(KCoreHciPanicCat, EReceivedUnknownEvent));
-			break;
-			}
-
-		CompleteAsyncTask(err);
-		}
-	}
-
-/*virtual*/ void CHCIDirectAccessManager::CompleteAsyncTask(TInt aError)
-	{
-	LOG_FUNC
-
-	if (!IsAsyncBlocked())
-		{
-		return; //drop
-		}
-
-	CHCIServerRequestManager::CompleteAsyncTask(aError);
-	}
-
-CHCIDirectAccessManager::CHCIDirectAccessManager(CCoreHCIPluginImpl& aHCI)
-:	CHCIServerRequestManager(aHCI)
-	{
-	LOG_FUNC
-	}
-	
-
-TUint CHCIDirectAccessManager::MaskBit() const
-	{
-	LOG_FUNC
-	
-	return EHCIDirectAccessMaskBit;
-	}
-			
-//
-// Power Control Service
-//
-CBTPowerControlManager* CBTPowerControlManager::NewL(CCoreHCIPluginImpl& aHCI)
-	{
-	LOG_STATIC_FUNC
-	
-	CBTPowerControlManager* self = new (ELeave) CBTPowerControlManager(aHCI);
-	CleanupStack::PushL(self);
-	self->ConstructL();
-	CleanupStack::Pop(self);
-	return self;
-	}
-
-TBool CBTPowerControlManager::HasCapabilities(const RMessage2& aMessage)
-	{
-	LOG_FUNC
-	
-	TBool allowed(EFalse);
-	
-	switch (aMessage.Int0())
-		{
-	case KHCICancelPower:
-		// fall through
-	case EHCISetPower: // requires Network Control + Local Services
-		allowed = aMessage.HasCapability(ECapabilityNetworkControl) && aMessage.HasCapability(ECapabilityLocalServices);
-		break;
-	
-	case EHCIGetPower: // requires Local Services
-		allowed = aMessage.HasCapability(ECapabilityLocalServices);
-		break;
-
-	default:
-		PanicClient(aMessage, EUnknownPowerControlFunction);
-		return EFalse;
-		}
-		
-	if(!allowed)
-		{
-		aMessage.Complete(KErrPermissionDenied);
-		}
-		
-	return allowed;
-	}
-
-/*virtual*/ void CBTPowerControlManager::DoServiceL(CHCISession& aSession, const RMessage2& aMessage)
-	{
-	LOG_FUNC
-
-	TInt request = aMessage.Int0();
-	TInt err;
-	TBTPowerState state;
-	
-	switch (request)
-		{
-	case KHCICancelPower:
-		if(iAsyncTaskSession!=&aSession)
-			{
-			return; //drop - not for current async task
-			}
-
-		//perform cancellation procedure
-		CompleteAsyncTask(KErrCancel);
-		break;
-
-	case EHCISetPower:
-		if(IsAsyncBlocked())
-			{
-			aMessage.Complete(KErrInUse);
-			return;
-			}
-		
-		//Should be called before set power because it could complete synchronously
-		BlockAsync(aSession, aMessage);		
-		state = static_cast<TBTPowerState>(aMessage.Int3());
-		err = iHCI.SetPower(state, NULL);
-		if(err != KErrNone)
-			{
-			aMessage.Complete(err);
-			return;
-			}
-		break;
-
-	case EHCIGetPower:
-		{
-		err = iHCI.GetPower(state, NULL);
-		if(err != KErrNone)
-			{
-			aMessage.Complete(err);
-			return;
-			}
-		
-		TPckg<TBTPowerState> pckg(state);
-		TRAP(err, aMessage.WriteL(EPSStateReturnSlot, pckg));
-		aMessage.Complete(err);
-		}
-		break; //synchronous so do not block
-	
-	default:
-		// Unknown message
-		PanicClient(aMessage, EUnknownPowerControlFunction);
-		break;
-		}
-	}
-
-/*virtual*/ void CBTPowerControlManager::CompleteAsyncTask(TInt aError)
-	{
-	LOG_FUNC
-	
-	if(!IsAsyncBlocked())
-		{
-		return; //drop
-		}
-
-	CHCIServerRequestManager::CompleteAsyncTask(aError);
-	}
-
-void CBTPowerControlManager::CompleteRequest(TInt aError)
-	{
-	CompleteAsyncTask(aError);
-	}
-
-CBTPowerControlManager::CBTPowerControlManager(CCoreHCIPluginImpl& aHCI)
-:	CHCIServerRequestManager(aHCI)
-	{
-	LOG_FUNC
-	}
-	
-
-TUint CBTPowerControlManager::MaskBit() const
-	{
-	LOG_FUNC
-	
-	return EBTPowerControlMaskBit;
-	}
-
-//
-// Bluetooth HCI Utils Service
-//
-CBluetoothDutModeManager* CBluetoothDutModeManager::NewL(CCoreHCIPluginImpl& aHCI)
-	{
-	LOG_STATIC_FUNC
-	
-	CBluetoothDutModeManager* self = new (ELeave) CBluetoothDutModeManager(aHCI);
-	CleanupStack::PushL(self);
-	self->ConstructL();
-	CleanupStack::Pop(self);
-	return self;
-	}
-
-TBool CBluetoothDutModeManager::HasCapabilities(const RMessage2& aMessage)
-	{
-	LOG_FUNC
-	
-	TBool allowed(EFalse);
-	
-	switch (aMessage.Int0())
-		{
-	case RBluetoothDutMode::EHCIActivateDutMode:
-		// fall through
-	case RBluetoothDutMode::EHCIDeactivateDutMode: // requires Network Control + Local Services
-		allowed = aMessage.HasCapability(ECapabilityNetworkControl) && aMessage.HasCapability(ECapabilityLocalServices);
-		break;
-
-	default:
-		PanicClient(aMessage, EUnknownBluetoothDutModeFunction);
-		return EFalse;
-		}
-		
-	if(!allowed)
-		{
-		aMessage.Complete(KErrPermissionDenied);
-		}
-		
-	return allowed;
-	}
-
-/*virtual*/ void CBluetoothDutModeManager::DoServiceL(CHCISession& /*aSession*/, const RMessage2& aMessage)
-	{
-	LOG_FUNC
-
-	TInt request = aMessage.Int0();
-	TInt err = KErrNotSupported;
-
-	switch (request)
-		{
-	case RBluetoothDutMode::EHCIActivateDutMode:
-		// Implementation is adaptation specific and therefore not supported in our reference HCI Server
-		LOG(_L("EHCIActivateDutMode"));
-		aMessage.Complete(err);
-		break;
-
-	case RBluetoothDutMode::EHCIDeactivateDutMode:
-		// Implementation is adaptation specific and therefore not supported in our reference HCI Server
-		LOG(_L("EHCIDeactivateDutMode"));
-		aMessage.Complete(err);
-		break;
-
-	default:
-		// Unknown message
-		PanicClient(aMessage, EUnknownBluetoothDutModeFunction);
-		break;
-		}
-	}
-
-CBluetoothDutModeManager::CBluetoothDutModeManager(CCoreHCIPluginImpl& aHCI)
-:	CHCIServerRequestManager(aHCI)
-	{
-	LOG_FUNC
-	}
-	
-
-TUint CBluetoothDutModeManager::MaskBit() const
-	{
-	LOG_FUNC
-	
-	return EBluetoothDutModeMaskBit;
-	}
-
-//
-// A2DP Optimiser Service
-//
-CA2dpOptimiserManager* CA2dpOptimiserManager::NewL(CCoreHCIPluginImpl& aHCI)
-	{
-	LOG_STATIC_FUNC
-	
-	CA2dpOptimiserManager* self = new (ELeave) CA2dpOptimiserManager(aHCI);
-	CleanupStack::PushL(self);
-	self->ConstructL();
-	CleanupStack::Pop(self);
-	return self;
-	}
-
-TBool CA2dpOptimiserManager::HasCapabilities(const RMessage2& aMessage)
-	{
-	LOG_FUNC
-	
-	TBool allowed(EFalse);
-	
-	switch (aMessage.Int0())
-		{
-	case RA2dpOptimiser::EHCIA2dpOptimiseAcl:
-		// fall through
-	case RA2dpOptimiser::EHCIA2dpRemoveAclOptimisation: // requires Network Control + Local Services
-		allowed = aMessage.HasCapability(ECapabilityNetworkControl) && aMessage.HasCapability(ECapabilityLocalServices);
-		break;
-
-	default:
-		PanicClient(aMessage, EUnknownA2dpOptimiserFunction);
-		return EFalse;
-		}
-		
-	if(!allowed)
-		{
-		aMessage.Complete(KErrPermissionDenied);
-		}
-		
-	return allowed;
-	}
-
-/*virtual*/ void CA2dpOptimiserManager::DoServiceL(CHCISession& /*aSession*/, const RMessage2& aMessage)
-	{
-	LOG_FUNC
-
-	TInt request = aMessage.Int0();
-	TInt err = KErrNotSupported;
-	TBuf<20> targetAddrBuf;
-	
-	switch (request)
-		{
-	case RA2dpOptimiser::EHCIA2dpOptimiseAcl:
-		// Implementation is adaptation specific and therefore not supported in our reference HCI Server
-		if (aMessage.GetDesLength(1) == sizeof(TA2dpOptimisationParams))
-			{
-			TPckgBuf<TA2dpOptimisationParams> args;
-	
-			aMessage.ReadL(1, args);
-			args().RemoteDeviceAddress().GetReadable(targetAddrBuf);
-			LOG3(_L("EHCIA2dpOptimiseAcl BT Addr: %S, Peak Bandwidth: %d, Access Latency: %d\n"), 
-						&targetAddrBuf, args().PeakBandwidth(), args().AccessLatency());
-	
-			aMessage.Complete(err);
-			}
-		else
-			{
-			PanicClient(aMessage, EInvalidArgument);
-			}
-		break;
-
-	case RA2dpOptimiser::EHCIA2dpRemoveAclOptimisation:
-		// Implementation is adaptation specific and therefore not supported in our reference HCI Server
-		if (aMessage.GetDesLength(1) == sizeof(TBTDevAddr))
-			{
-			TPckgBuf<TBTDevAddr> addrBuf;
-	
-			aMessage.ReadL(1, addrBuf);
-			addrBuf().GetReadable(targetAddrBuf);
-			LOG1(_L("EHCIA2dpRemoveAclOptimisation BT Addr: %S\n"), &targetAddrBuf);
-	
-			aMessage.Complete(err);
-			}
-		else
-			{
-			PanicClient(aMessage, EInvalidArgument);
-			}
-		break;
-
-	default:
-		// Unknown message
-		PanicClient(aMessage, EUnknownA2dpOptimiserFunction);
-		break;
-		}
-	}
-
-CA2dpOptimiserManager::CA2dpOptimiserManager(CCoreHCIPluginImpl& aHCI)
-:	CHCIServerRequestManager(aHCI)
-	{
-	LOG_FUNC
-	}
-	
-
-TUint CA2dpOptimiserManager::MaskBit() const
-	{
-	LOG_FUNC
-	
-	return EA2dpOptimiserMaskBit;
-	}
-
+// Copyright (c) 2006-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:
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include "hciserverrequestmgr.h"
+#include "HciCorePluginImpl.h"
+#include "corehciutil.h"
+
+#include <bluetooth/hci/hciipc.h>
+#include <bluetooth/hci/vendordebugcommand.h>
+#include <bluetooth/hci/vendordebugcompleteevent.h>
+#include <bluetooth/hci/vendordebugevent.h>
+
+#include <bluetooth/hcicommandqueueclient.h>
+#include <bluetooth/hcicommandqueue.h>
+#include <bluetooth/btpowercontrol.h>
+#include <bluetooth/dutmode.h>
+#include <bluetooth/a2dpoptimisation.h>
+#include <bluetooth/a2dpoptimisationparams.h>
+
+#include <bluetooth/logger.h>
+#include <bluetooth/btpowercontrolmessages.h>
+
+#include <es_sock.h>
+#include <bt_sock.h>
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, LOG_COMPONENT_HCISERVER);
+#endif
+
+const TInt KHCIServerIpcDesOutParam = 2;
+
+void CHCIServerRequestManager::BlockAsync(CHCISession& aSession, const RMessage2& aMessage)
+	{
+	LOG_FUNC
+
+	iAsyncTaskMessage = aMessage;
+	iAsyncTaskSession = &aSession;
+	iBlockMask |= MaskBit();
+	}
+	
+void CHCIServerRequestManager::CompleteAsyncTask(TInt aError)
+	{
+	LOG_FUNC
+	
+	//check message is not already complete
+	if(iAsyncTaskMessage.Handle())
+		{
+		iAsyncTaskMessage.Complete(aError);
+		}
+	else
+		{
+		__ASSERT_DEBUG(EFalse, PANIC(KHciServerPanicCat, EMessageAlreadyCompleted));
+		}
+
+	// Remove Async block		
+	iAsyncTaskSession = 0;
+	iBlockMask &= ~MaskBit();
+	}
+	
+TBool CHCIServerRequestManager::IsAsyncBlocked()
+	{
+	LOG_FUNC
+	
+	return (iBlockMask & MaskBit());
+	}
+	
+CHCIServerRequestManager::CHCIServerRequestManager(CCoreHCIPluginImpl& aHCI)
+ :	iHCI(aHCI)
+	{
+	LOG_FUNC
+	}
+	
+void CHCIServerRequestManager::ConstructL()
+	{
+	LOG_FUNC
+	}
+
+void CHCIServerRequestManager::ServiceL(CHCISession& aSession, const RMessage2& aMessage)
+	{
+	if(aMessage.Function() == EServiceSpecificRequest)
+		{
+		if(HasCapabilities(aMessage))
+			{
+			DoServiceL(aSession, aMessage);
+			}
+		// else HasCapabilities failed (and has dealt with aMessage).
+		}
+	else
+		{
+		// The client has issued a bad HCI Server request, we only expect a server specific
+		// request to be made (the specific request being encoded in the TIpcArgs).
+		PanicClient(aMessage, EUnknownHciServerFunction);
+		}
+	}
+
+//
+// HCI Direct Access Service
+//
+CHCIDirectAccessManager* CHCIDirectAccessManager::NewL(CCoreHCIPluginImpl& aHCI)
+	{
+	LOG_STATIC_FUNC
+	
+	CHCIDirectAccessManager* self = new (ELeave) CHCIDirectAccessManager(aHCI);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+	
+void CHCIDirectAccessManager::SetHCICommandQueue(MHCICommandQueue& aHCICommandQueue)
+	{
+	LOG_FUNC
+	
+	__ASSERT_ALWAYS(!iHCICommandQueue, PANIC(KCoreHciPanicCat, EInterfaceAlreadyInitialised));
+	iHCICommandQueue = &aHCICommandQueue;
+	}
+
+/*virtual*/ TBool CHCIDirectAccessManager::HasCapabilities(const RMessage2& aMessage)
+	{
+	LOG_FUNC
+	
+	TBool allowed = EFalse;
+	
+	switch (aMessage.Int0())
+		{
+	case KHCIDirectAccessVendorCommand:
+		// Drop through
+	case KHCIDirectAccessCancel: // requires Network Control + Local Services
+		allowed = aMessage.HasCapability(ECapabilityNetworkControl) && aMessage.HasCapability(ECapabilityLocalServices);
+		break;
+
+	default:
+		PanicClient(aMessage, EUnknownDirectAccessFunction);
+		return EFalse;
+		}
+	
+	if(!allowed)
+		{
+		aMessage.Complete(KErrPermissionDenied);
+		}
+		
+	return allowed;
+	}
+
+/*virtual*/ void CHCIDirectAccessManager::DoServiceL(CHCISession& aSession, const RMessage2& aMessage)
+	{
+	LOG_FUNC
+	
+	TInt request = aMessage.Int0();
+
+	switch (request)
+		{
+	case KHCIDirectAccessCancel:
+		if (iAsyncTaskSession != &aSession)
+			{
+			return; //drop - not for current async task
+			}
+
+		// clear cache
+		iMessage = NULL;
+		
+		// perform cancellation procedure
+		CompleteAsyncTask(KErrCancel);
+		break;
+
+	case KHCIDirectAccessVendorCommand:
+		{
+		if (IsAsyncBlocked())
+			{
+			aMessage.Complete(KErrInUse);
+			return;
+			}
+
+		const TInt len = User::LeaveIfError(aMessage.GetDesLength(1));
+		
+		// Check the Vendor Command is at least 3 bytes long for the opcode
+		// and the length
+		if (len < 3)
+			{
+			PanicClient(aMessage, EInvalidVendorCommand);
+			break;
+			}
+		
+		HBufC8* buf = HBufC8::NewLC(len);
+		TPtr8 params(buf->Des());
+		aMessage.ReadL(1, params);
+		
+		// Extract the opcode and create the new command
+		TUint16 opcode = LittleEndian::Get16(params.Ptr());
+		
+		if (iHCICommandQueue)
+			{
+			CVendorDebugCommand* cmd = CVendorDebugCommand::NewL(opcode);
+
+			// Remove the opcode and length from the Vendor Command parameters,
+			// these will be added again to the command frame once it has been
+			// formatted
+			cmd->Command() = params.RightTPtr(params.Length() - 3);
+			
+			// cmd will be deleted in MhcqAddCommandL if Leaves.
+			TUint qid = iHCICommandQueue->MhcqAddCommandL(cmd, *this);
+
+			// Block only after we succeed in adding a command.
+			BlockAsync(aSession, aMessage);
+
+			// Cache to return completion data to client
+			iMessage = &aMessage;
+			}
+		else
+			{
+			// Slight possible race that a request is made before we have been
+			// given the command queue to work with - so don't panic just error.
+			aMessage.Complete(KErrNotReady);
+			}
+		CleanupStack::PopAndDestroy(buf);
+		}
+		break;
+
+	default:
+		// Unknown message, panic client
+		PanicClient(aMessage, EUnknownDirectAccessFunction);
+		break;
+		}
+	}
+
+/*virtual*/ void CHCIDirectAccessManager::MhcqcCommandErrored(TInt aErrorCode, const CHCICommandBase* /*aCommand*/)
+	{
+	LOG_FUNC
+
+	// clear cache
+	iMessage = NULL;
+
+	CompleteAsyncTask(aErrorCode);
+	}
+
+/*virtual*/ void CHCIDirectAccessManager::MhcqcCommandEventReceived(const THCIEventBase& aEvent, const CHCICommandBase* aCommand)
+	{
+	LOG_FUNC
+
+	// We are not the unmatched event observer therefore we must always get a
+	// command
+	__ASSERT_DEBUG(aCommand, PANIC(KCoreHciPanicCat, EReceivedUnmatchedEvent));
+	
+	// It is possible to receive an event but not have a message to complete. This
+	// could happen if a request was cancelled after a Vendor Specific command was
+	// sent, in this case we do nothing.
+	if (iMessage)
+		{
+		TInt err = KErrNone;
+		
+		const THCIEventCode eventcode(aEvent.EventCode());
+		switch(eventcode)
+			{
+		case ECommandCompleteEvent:
+			{
+			if ((aCommand->Opcode() & KVendorDebugOGF) == KVendorDebugOGF)
+				{
+				const TVendorDebugCompleteEvent& event = TVendorDebugCompleteEvent::Cast(aEvent);
+				
+				// Return the event
+				err = iMessage->Write(KHCIServerIpcDesOutParam, event.VendorDebugData());
+				}
+			else
+				{
+				__ASSERT_DEBUG(EFalse, PANIC(KHciServerPanicCat, ENonVendorOpcodeCompleted));
+				}
+			}
+			break;
+
+		case EVendorDebugEvent:
+			{
+			const TVendorDebugEvent& event = TVendorDebugEvent::Cast(aEvent);
+
+			// Return the event
+			err = iMessage->Write(KHCIServerIpcDesOutParam, event.VendorDebugData());
+			}
+			break;
+			
+		default:
+			__ASSERT_DEBUG(EFalse, PANIC(KCoreHciPanicCat, EReceivedUnknownEvent));
+			break;
+			}
+
+		CompleteAsyncTask(err);
+		}
+	}
+
+/*virtual*/ void CHCIDirectAccessManager::CompleteAsyncTask(TInt aError)
+	{
+	LOG_FUNC
+
+	if (!IsAsyncBlocked())
+		{
+		return; //drop
+		}
+
+	CHCIServerRequestManager::CompleteAsyncTask(aError);
+	}
+
+CHCIDirectAccessManager::CHCIDirectAccessManager(CCoreHCIPluginImpl& aHCI)
+:	CHCIServerRequestManager(aHCI)
+	{
+	LOG_FUNC
+	}
+	
+
+TUint CHCIDirectAccessManager::MaskBit() const
+	{
+	LOG_FUNC
+	
+	return EHCIDirectAccessMaskBit;
+	}
+			
+//
+// Power Control Service
+//
+CBTPowerControlManager* CBTPowerControlManager::NewL(CCoreHCIPluginImpl& aHCI)
+	{
+	LOG_STATIC_FUNC
+	
+	CBTPowerControlManager* self = new (ELeave) CBTPowerControlManager(aHCI);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+TBool CBTPowerControlManager::HasCapabilities(const RMessage2& aMessage)
+	{
+	LOG_FUNC
+	
+	TBool allowed(EFalse);
+	
+	switch (aMessage.Int0())
+		{
+	case KHCICancelPower:
+		// fall through
+	case EHCISetPower: // requires Network Control + Local Services
+		allowed = aMessage.HasCapability(ECapabilityNetworkControl) && aMessage.HasCapability(ECapabilityLocalServices);
+		break;
+	
+	case EHCIGetPower: // requires Local Services
+		allowed = aMessage.HasCapability(ECapabilityLocalServices);
+		break;
+
+	default:
+		PanicClient(aMessage, EUnknownPowerControlFunction);
+		return EFalse;
+		}
+		
+	if(!allowed)
+		{
+		aMessage.Complete(KErrPermissionDenied);
+		}
+		
+	return allowed;
+	}
+
+/*virtual*/ void CBTPowerControlManager::DoServiceL(CHCISession& aSession, const RMessage2& aMessage)
+	{
+	LOG_FUNC
+
+	TInt request = aMessage.Int0();
+	TInt err;
+	TBTPowerState state;
+	
+	switch (request)
+		{
+	case KHCICancelPower:
+		if(iAsyncTaskSession!=&aSession)
+			{
+			return; //drop - not for current async task
+			}
+
+		//perform cancellation procedure
+		CompleteAsyncTask(KErrCancel);
+		break;
+
+	case EHCISetPower:
+		if(IsAsyncBlocked())
+			{
+			aMessage.Complete(KErrInUse);
+			return;
+			}
+		
+		//Should be called before set power because it could complete synchronously
+		BlockAsync(aSession, aMessage);		
+		state = static_cast<TBTPowerState>(aMessage.Int3());
+		err = iHCI.SetPower(state, NULL);
+		if(err != KErrNone)
+			{
+			CompleteAsyncTask(err);
+			return;
+			}
+		break;
+
+	case EHCIGetPower:
+		{
+		err = iHCI.GetPower(state, NULL);
+		if(err != KErrNone)
+			{
+			aMessage.Complete(err);
+			return;
+			}
+		
+		TPckg<TBTPowerState> pckg(state);
+		TRAP(err, aMessage.WriteL(EPSStateReturnSlot, pckg));
+		aMessage.Complete(err);
+		}
+		break; //synchronous so do not block
+	
+	default:
+		// Unknown message
+		PanicClient(aMessage, EUnknownPowerControlFunction);
+		break;
+		}
+	}
+
+/*virtual*/ void CBTPowerControlManager::CompleteAsyncTask(TInt aError)
+	{
+	LOG_FUNC
+	
+	if(!IsAsyncBlocked())
+		{
+		return; //drop
+		}
+
+	CHCIServerRequestManager::CompleteAsyncTask(aError);
+	}
+
+void CBTPowerControlManager::CompleteRequest(TInt aError)
+	{
+	CompleteAsyncTask(aError);
+	}
+
+CBTPowerControlManager::CBTPowerControlManager(CCoreHCIPluginImpl& aHCI)
+:	CHCIServerRequestManager(aHCI)
+	{
+	LOG_FUNC
+	}
+	
+
+TUint CBTPowerControlManager::MaskBit() const
+	{
+	LOG_FUNC
+	
+	return EBTPowerControlMaskBit;
+	}
+
+//
+// Bluetooth HCI Utils Service
+//
+CBluetoothDutModeManager* CBluetoothDutModeManager::NewL(CCoreHCIPluginImpl& aHCI)
+	{
+	LOG_STATIC_FUNC
+	
+	CBluetoothDutModeManager* self = new (ELeave) CBluetoothDutModeManager(aHCI);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+TBool CBluetoothDutModeManager::HasCapabilities(const RMessage2& aMessage)
+	{
+	LOG_FUNC
+	
+	TBool allowed(EFalse);
+	
+	switch (aMessage.Int0())
+		{
+	case RBluetoothDutMode::EHCIActivateDutMode:
+		// fall through
+	case RBluetoothDutMode::EHCIDeactivateDutMode: // requires Network Control + Local Services
+		allowed = aMessage.HasCapability(ECapabilityNetworkControl) && aMessage.HasCapability(ECapabilityLocalServices);
+		break;
+
+	default:
+		PanicClient(aMessage, EUnknownBluetoothDutModeFunction);
+		return EFalse;
+		}
+		
+	if(!allowed)
+		{
+		aMessage.Complete(KErrPermissionDenied);
+		}
+		
+	return allowed;
+	}
+
+/*virtual*/ void CBluetoothDutModeManager::DoServiceL(CHCISession& /*aSession*/, const RMessage2& aMessage)
+	{
+	LOG_FUNC
+
+	TInt request = aMessage.Int0();
+	TInt err = KErrNotSupported;
+
+	switch (request)
+		{
+	case RBluetoothDutMode::EHCIActivateDutMode:
+		// Implementation is adaptation specific and therefore not supported in our reference HCI Server
+		LOG(_L("EHCIActivateDutMode"));
+		aMessage.Complete(err);
+		break;
+
+	case RBluetoothDutMode::EHCIDeactivateDutMode:
+		// Implementation is adaptation specific and therefore not supported in our reference HCI Server
+		LOG(_L("EHCIDeactivateDutMode"));
+		aMessage.Complete(err);
+		break;
+
+	default:
+		// Unknown message
+		PanicClient(aMessage, EUnknownBluetoothDutModeFunction);
+		break;
+		}
+	}
+
+CBluetoothDutModeManager::CBluetoothDutModeManager(CCoreHCIPluginImpl& aHCI)
+:	CHCIServerRequestManager(aHCI)
+	{
+	LOG_FUNC
+	}
+	
+
+TUint CBluetoothDutModeManager::MaskBit() const
+	{
+	LOG_FUNC
+	
+	return EBluetoothDutModeMaskBit;
+	}
+
+//
+// A2DP Optimiser Service
+//
+CA2dpOptimiserManager* CA2dpOptimiserManager::NewL(CCoreHCIPluginImpl& aHCI)
+	{
+	LOG_STATIC_FUNC
+	
+	CA2dpOptimiserManager* self = new (ELeave) CA2dpOptimiserManager(aHCI);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+TBool CA2dpOptimiserManager::HasCapabilities(const RMessage2& aMessage)
+	{
+	LOG_FUNC
+	
+	TBool allowed(EFalse);
+	
+	switch (aMessage.Int0())
+		{
+	case RA2dpOptimiser::EHCIA2dpOptimiseAcl:
+		// fall through
+	case RA2dpOptimiser::EHCIA2dpRemoveAclOptimisation: // requires Network Control + Local Services
+		allowed = aMessage.HasCapability(ECapabilityNetworkControl) && aMessage.HasCapability(ECapabilityLocalServices);
+		break;
+
+	default:
+		PanicClient(aMessage, EUnknownA2dpOptimiserFunction);
+		return EFalse;
+		}
+		
+	if(!allowed)
+		{
+		aMessage.Complete(KErrPermissionDenied);
+		}
+		
+	return allowed;
+	}
+
+/*virtual*/ void CA2dpOptimiserManager::DoServiceL(CHCISession& /*aSession*/, const RMessage2& aMessage)
+	{
+	LOG_FUNC
+
+	TInt request = aMessage.Int0();
+	TInt err = KErrNotSupported;
+	TBuf<20> targetAddrBuf;
+	
+	switch (request)
+		{
+	case RA2dpOptimiser::EHCIA2dpOptimiseAcl:
+		// Implementation is adaptation specific and therefore not supported in our reference HCI Server
+		if (aMessage.GetDesLength(1) == sizeof(TA2dpOptimisationParams))
+			{
+			TPckgBuf<TA2dpOptimisationParams> args;
+	
+			aMessage.ReadL(1, args);
+			args().RemoteDeviceAddress().GetReadable(targetAddrBuf);
+			LOG3(_L("EHCIA2dpOptimiseAcl BT Addr: %S, Peak Bandwidth: %d, Access Latency: %d\n"), 
+						&targetAddrBuf, args().PeakBandwidth(), args().AccessLatency());
+	
+			aMessage.Complete(err);
+			}
+		else
+			{
+			PanicClient(aMessage, EInvalidArgument);
+			}
+		break;
+
+	case RA2dpOptimiser::EHCIA2dpRemoveAclOptimisation:
+		// Implementation is adaptation specific and therefore not supported in our reference HCI Server
+		if (aMessage.GetDesLength(1) == sizeof(TBTDevAddr))
+			{
+			TPckgBuf<TBTDevAddr> addrBuf;
+	
+			aMessage.ReadL(1, addrBuf);
+			addrBuf().GetReadable(targetAddrBuf);
+			LOG1(_L("EHCIA2dpRemoveAclOptimisation BT Addr: %S\n"), &targetAddrBuf);
+	
+			aMessage.Complete(err);
+			}
+		else
+			{
+			PanicClient(aMessage, EInvalidArgument);
+			}
+		break;
+
+	default:
+		// Unknown message
+		PanicClient(aMessage, EUnknownA2dpOptimiserFunction);
+		break;
+		}
+	}
+
+CA2dpOptimiserManager::CA2dpOptimiserManager(CCoreHCIPluginImpl& aHCI)
+:	CHCIServerRequestManager(aHCI)
+	{
+	LOG_FUNC
+	}
+	
+
+TUint CA2dpOptimiserManager::MaskBit() const
+	{
+	LOG_FUNC
+	
+	return EA2dpOptimiserMaskBit;
+	}
+
--- a/bthci/hci2implementations/group/bld.inf	Tue Feb 02 01:12:20 2010 +0200
+++ b/bthci/hci2implementations/group/bld.inf	Thu Oct 14 11:30:12 2010 +0100
@@ -1,30 +1,31 @@
-// 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:
-//
-
-#include "../corehcis/symbian/group/bld.inf"
-
-#include "../hctls/bcsp/group/bld.inf"
-#include "../hctls/ti/group/bld.inf"
-#include "../hctls/uart_original/group/bld.inf"
-
-#include "../initialisors/ti/group/bld.inf"
-#include "../initialisors/symbian/group/bld.inf"
-
-#include "../qdps/symbian/group/bld.inf"
-
-#include "../CommandsEvents/symbian/group/bld.inf"
-
-PRJ_EXPORTS
-hci_implementation.iby  /epoc32/rom/include/hci_implementation.iby
+// Copyright (c) 2006-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:
+//
+
+#include "../corehcis/symbian/group/bld.inf"
+
+#include "../hctls/bcsp/group/bld.inf"
+#include "../hctls/ti/group/bld.inf"
+#include "../hctls/uart_original/group/bld.inf"
+#include "../hctls/usb_original/group/bld.inf"
+
+#include "../initialisors/ti/group/bld.inf"
+#include "../initialisors/symbian/group/bld.inf"
+
+#include "../qdps/symbian/group/bld.inf"
+
+#include "../CommandsEvents/symbian/group/bld.inf"
+
+PRJ_EXPORTS
+hci_implementation_reference.iby  /epoc32/rom/include/hci_implementation_reference.iby
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/group/hci_implementation_reference.iby	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,50 @@
+// Copyright (c) 2006-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:
+//
+
+#ifndef  HCI_IMPLEMENTATION_REFERENCE_IBY
+#define  HCI_IMPLEMENTATION_REFERENCE_IBY
+
+// If __HCI_DEBUG__ is defined pull in debug versions of the
+// HCI DLLs and Plugins regardless of the ROM type
+#ifdef __HCI_DEBUG__
+define HCI_DIR UDEB
+#define HCI_PLUGIN ECOM_PLUGIN_UDEB
+#else
+define HCI_DIR BUILD_DIR
+#define HCI_PLUGIN ECOM_PLUGIN
+#endif
+
+#include <corehci_symbian.iby>
+#include <commandsevents_symbian.iby>
+#include <hci_qdp_symbian.iby>
+
+#ifdef HCI_TI
+
+#include <hctl_ti.iby>
+#include <hci_initialisor_ti.iby>
+
+#elif HCI_USB
+
+#include <hctl_usb_original.iby>
+#include <initialisor_symbian.iby>
+
+#else // CSR + Default
+
+#include <hctl_bcsp.iby>
+#include <initialisor_symbian.iby>
+
+#endif
+
+#endif //  HCI_IMPLEMENTATION_REFERENCE_IBY
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/fdc/group/distribution.policy.s60	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,1 @@
+7
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/fdc/group/fdc_hctl_original.mmp	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,59 @@
+// Copyright (c) 2007-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:
+// Function Driver Controller for Bluetooth USB (H2) HCTL.
+//
+
+/** 
+@file
+@internalComponent
+*/
+
+// The following macro defines whether the FDC will attempt to
+// retrieve the Device Firmware Update interface.  Some controllers
+// provide this (and so to enable "fully" successful driver loading
+// it needs to be claimed by something.  Nothing is done with the
+// interface - it is simply claimed from the FDF.
+macro SYMBIAN_FDC_HCTL_ORIGINAL_ACCEPT_FIRMWARE_UPDATE
+
+target fdc_hctl_original.dll
+targettype plugin
+// UID2 = 0x10009d8d for ECOM plugins.
+// UID3 = the 'DLL UID' (see resource file)
+uid 0x10009d8d 0x200345E8
+vendorid 0x70000001
+
+#include <usbhost/internal/fdfcaps.mmh>
+
+noexportlibrary
+
+userinclude ../inc
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+systeminclude ../../fdc/public
+systeminclude ../../hctl/public
+
+sourcepath ../src
+source fdchctloriginalmain.cpp
+source fdchctloriginal.cpp
+source fdchctloriginalserver.cpp
+
+resource fdc_hctl_original.rss
+
+library euser.lib
+library fdcbase.lib
+library usbdescriptors.lib
+library esock.lib
+
+#include <bluetooth/btlogger.mmh>
+
+smpsafe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/fdc/inc/distribution.policy.s60	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,1 @@
+7
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/fdc/inc/fdchctloriginal.h	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,64 @@
+// Copyright (c) 2007-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:
+// 
+
+/**
+@file
+@internalComponent
+*/
+
+#ifndef FDCHCTLORIGINAL_H
+#define FDCHCTLORIGINAL_H
+
+#include <e32base.h>
+#include <usbhost/internal/fdcplugin.h>
+#include <usbhost/internal/fdcinterface.h>
+#include <hctlusboriginalcli.h>
+
+class CFdcHctlOriginalServer;
+
+NONSHARABLE_CLASS(CFdcHctlOriginal)
+	: public CFdcPlugin
+	, public MFdcInterfaceV1
+	{
+public:
+	static CFdcHctlOriginal* NewL(MFdcPluginObserver& aObserver);
+	~CFdcHctlOriginal();
+	
+public:
+	void RequestConnection();
+	
+private:
+	CFdcHctlOriginal(MFdcPluginObserver& aObserver);
+	void ConstructL();
+	
+private: // from CFdcPlugin
+	virtual TAny* GetInterface(TUid aUid);
+	
+private: // from MFdcInterfaceV1
+	virtual TInt Mfi1NewFunction(TUint aDeviceId,
+		const TArray<TUint>& aInterfaces,
+		const TUsbDeviceDescriptor& aDeviceDescriptor,
+		const TUsbConfigurationDescriptor& aConfigurationDescriptor);
+	virtual void Mfi1DeviceDetached(TUint aDeviceId);
+	
+private:
+	CFdcHctlOriginalServer*	iServer;
+	RHCTLUsbOriginal		iHctlSession;
+	TBool					iReady;
+	TUint32					iAclToken;
+	TUint32					iScoToken;
+	};
+
+#endif // FDCHCTLORIGINAL_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/fdc/inc/fdchctloriginalpolicy.h	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,62 @@
+// Copyright (c) 2007-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:
+// 
+
+/**
+@file
+@internalComponent
+*/
+ 
+#ifndef FDCHCTLORIGINALPOLICY_H
+#define FDCHCTLORIGINALPOLICY_H
+
+#include <e32def.h>
+#include <fdchctloriginalipc.h>
+
+/** FDC HCTL Original Server Security Policy Definition */
+const TUint KFdcHctlOriginalRangeCount = 2;
+
+const TInt KFdcHctlOriginalRanges[KFdcHctlOriginalRangeCount] =
+	{
+	EFunctionRequestConnection,			// ESock SID
+	ENumFdcHctlOriginalSrvFuncs,		// not supported
+	};
+
+/** Index numbers into KFdcHctlOriginalElements[] */
+const TInt KPolicyEsockSid = 0;
+
+/** Mapping IPCs to policy element */
+const TUint8 KFdcHctlOriginalElementsIndex[KFdcHctlOriginalRangeCount] =
+	{
+	KPolicyEsockSid,				// All (valid) APIs
+	CPolicyServer::ENotSupported	// Undefined functions
+	};
+
+/** Individual policy elements */
+const CPolicyServer::TPolicyElement KFdcHctlOriginalElements[] = 
+	{
+		{ _INIT_SECURITY_POLICY_S0(0x101f7989) },
+	};
+
+/** Main policy */
+const CPolicyServer::TPolicy KFdcHctlOriginalPolicy =
+	{
+	KPolicyEsockSid, // connection requirements
+	KFdcHctlOriginalRangeCount,
+	KFdcHctlOriginalRanges,
+	KFdcHctlOriginalElementsIndex,
+	KFdcHctlOriginalElements,
+	};
+
+#endif // FDCHCTLORIGINALPOLICY_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/fdc/inc/fdchctloriginalserver.h	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,63 @@
+// Copyright (c) 2007-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:
+// 
+
+/**
+@file
+@internalComponent
+*/
+
+#ifndef FDCHCTLORIGINALSERVER_H
+#define FDCHCTLORIGINALSERVER_H
+
+#include <e32base.h>
+
+class CFdcHctlOriginal;
+
+NONSHARABLE_CLASS(CFdcHctlOriginalSession)
+	: public CSession2
+	{
+public:
+	CFdcHctlOriginalSession(CFdcHctlOriginal& aHctlOriginal);
+	~CFdcHctlOriginalSession();
+	
+private:
+	void ServiceL(const RMessage2& aMessage);
+	
+private:
+	CFdcHctlOriginal& iHctlOriginal;
+	};
+
+
+NONSHARABLE_CLASS(CFdcHctlOriginalServer)
+	: public CPolicyServer
+	{
+public:
+	static CFdcHctlOriginalServer* NewL(CFdcHctlOriginal& aHctlOriginal);
+	~CFdcHctlOriginalServer();
+	
+	void DropSession(CFdcHctlOriginalSession* aSession) const;
+	
+private:
+	CFdcHctlOriginalServer(CFdcHctlOriginal& aHctlOriginal);
+	void ConstructL();
+	
+	CSession2* NewSessionL(const TVersion& aVersion, const RMessage2& aMessage) const;
+	
+private:
+	CFdcHctlOriginal& iHctlOriginal;
+	mutable CFdcHctlOriginalSession* iSession;
+	};
+
+#endif // FDCHCTLORIGINALSERVER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/fdc/inc/fdchctloriginalutils.h	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,41 @@
+// Copyright (c) 2007-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:
+// 
+
+/** 
+@file
+@internalComponent
+*/
+
+
+#ifndef FDCHCTLORIGINALUTILS_H
+#define FDCHCTLORIGINALUTILS_H
+
+#include <e32base.h>
+
+/**
+The panic category for the USB Original HCTL FDC.
+*/
+_LIT(KFdcHctlOriginalPanic, "FdcHctlOrigPanic");
+
+/**
+Panic codes for USB Original HCTL FDC.
+*/
+enum TFdcHctlOriginalPanic
+	{
+	EBadSessionPointer	= 0,
+	};
+
+#endif // FDCHCTLORIGINALUTILS_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/fdc/public/distribution.policy.s60	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,1 @@
+7
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/fdc/public/fdchctloriginalcli.h	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,72 @@
+// Copyright (c) 2007-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:
+// 
+
+/**
+@file
+@internalComponent
+*/
+
+#ifndef FDCHCTLORIGINALCLI_H
+#define FDCHCTLORIGINALCLI_H
+
+#include <e32base.h>
+#include <fdchctloriginalipc.h>
+
+NONSHARABLE_CLASS(RFdcHctlOriginal)
+	: public RSessionBase
+	{
+public:
+	inline RFdcHctlOriginal();
+	
+	inline TInt Connect();
+	inline void Close();
+	
+	inline void RequestConnection();
+	
+private:
+	TAny* iExtension;
+	};
+
+inline RFdcHctlOriginal::RFdcHctlOriginal()
+	: iExtension(NULL)
+	{}
+
+inline TInt RFdcHctlOriginal::Connect()
+	{
+	// We are not able to "start" the server, as it is set running when the function driver
+	// is loaded. Instead we just want to try and connect and ask for the provision of any
+	// hardware that is available.
+	return CreateSession(
+						KFdcHctlOrigSrvName,
+						TVersion(
+							KFdcHctlOrigSrvMajorVersionNumber,
+							KFdcHctlOrigSrvMinorVersionNumber,
+							KFdcHctlOrigSrvBuildNumber
+							)
+						);
+	}
+
+inline void RFdcHctlOriginal::Close()
+	{
+	RSessionBase::Close();
+	}
+
+inline void RFdcHctlOriginal::RequestConnection()
+	{
+	// We can always fail here - this is a best effort request.
+	Send(EFunctionRequestConnection);
+	}
+
+#endif // FDCHCTLORIGINALCLI_H
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/fdc/public/fdchctloriginalipc.h	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,52 @@
+// Copyright (c) 2007-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:
+// 
+
+/**
+@file
+@internalComponent
+*/
+
+#ifndef FDCHCTLORIGINALIPC_H
+#define FDCHCTLORIGINALIPC_H
+
+#include <e32base.h>
+
+//
+// FDC Server IPC
+//
+
+_LIT(KFdcHctlOrigSrvName, "!FdcHctlOriginal");
+
+/** Version numbers. */
+const TInt8 KFdcHctlOrigSrvMajorVersionNumber = 1;
+const TInt8 KFdcHctlOrigSrvMinorVersionNumber = 0;
+const TInt16 KFdcHctlOrigSrvBuildNumber = 0;
+
+enum TFdcHctlOriginalSrvFuncs
+	{
+	EFunctionRequestConnection = 0,
+	/* Add new server functions before this */
+	ENumFdcHctlOriginalSrvFuncs // Never use as an actual function number
+	};
+
+
+_LIT(KFdcHctlOriginalSrvPanicCat, "FdcHctlOriginalSrv");
+
+enum TFdcHctlOriginalSrvPanics
+	{
+	EFdcHctlInvalidFunction	= 0,
+	};
+
+#endif // FDCHCTLORIGINALIPC_H
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/fdc/src/distribution.policy.s60	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,1 @@
+7
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/fdc/src/fdc_hctl_original.rss	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,45 @@
+// Copyright (c) 2007-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:
+// 
+
+/**
+@file
+@internalComponent
+*/
+
+#include <ecom/RegistryInfo.rh>
+#include <usbhost/internal/fdcplugin.hrh>
+
+RESOURCE REGISTRY_INFO theInfo
+	{
+	dll_uid = 0x200345E8;
+	interfaces =
+		{
+		INTERFACE_INFO
+			{
+			interface_uid = KFdcEcomInterfaceUid;
+			implementations =
+				{
+				IMPLEMENTATION_INFO
+					{
+					implementation_uid = 0x200345EA;
+					version_no = 1;
+					display_name = "HCTL USB Original";
+					default_data = "DC0xe0DSC0x01DP0x01";
+					opaque_data = "";
+					}
+				};
+			}
+		};
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/fdc/src/fdchctloriginal.cpp	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,248 @@
+// Copyright (c) 2007-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:
+// 
+
+/**
+@file
+@internalComponent
+*/
+
+#include "fdchctloriginal.h"
+
+#include <d32usbdescriptors.h>
+#include <usbhost/internal/fdcpluginobserver.h>
+#include <usbhosterrors.h>
+#include <bluetooth/logger.h>
+
+#include "fdchctloriginalserver.h"
+
+#include <bluetooth/logger.h>
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, "fdchctloriginal");
+#endif
+
+
+CFdcHctlOriginal* CFdcHctlOriginal::NewL(MFdcPluginObserver& aObserver)
+	{
+	LOG_STATIC_FUNC
+	CFdcHctlOriginal* self = new(ELeave) CFdcHctlOriginal(aObserver);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+CFdcHctlOriginal::CFdcHctlOriginal(MFdcPluginObserver& aObserver)
+	: CFdcPlugin(aObserver)
+	{
+	LOG_FUNC
+	}
+
+CFdcHctlOriginal::~CFdcHctlOriginal()
+	{
+	LOG_FUNC
+	iHctlSession.Close();
+	delete iServer;
+	}
+
+void CFdcHctlOriginal::ConstructL()
+	{
+	LOG_FUNC
+	iServer = CFdcHctlOriginalServer::NewL(*this);
+	}
+
+TAny* CFdcHctlOriginal::GetInterface(TUid aUid)
+	{
+	LOG_FUNC
+	LOG1(_L8("\taUid = 0x%08x"), aUid);
+	
+	TAny* ret = NULL;
+	if(aUid == TUid::Uid(KFdcInterfaceV1))
+		{
+		ret = reinterpret_cast<TAny*>(static_cast<MFdcInterfaceV1*>(this));
+		}
+	
+	LOG1(_L8("\tret = [0x%08x]"), ret);
+	return ret;
+	}
+
+TInt CFdcHctlOriginal::Mfi1NewFunction(TUint aDeviceId,
+		const TArray<TUint>& aInterfaces,
+		const TUsbDeviceDescriptor& aDeviceDescriptor,
+		const TUsbConfigurationDescriptor& aConfigurationDescriptor)
+	{
+	LOG_FUNC
+	
+	// Normally an FDC is required to claim it's interfaces first.  In this
+	// case we need to parse the descriptor tree to determine if the device
+	// firmware update interface is present. (We don't do firmware updates but
+	// we claim it until to provide successful device attachments. If a
+	// firmware update FDC is provided this should be removed.)
+#ifdef SYMBIAN_FDC_HCTL_ORIGINAL_ACCEPT_FIRMWARE_UPDATE
+	TBool firmwareIntFound = EFalse;
+	TUint8 firmwareIntNum = 0xff;
+	
+	TUint8 KDfuInterfaceClass = 0xfe;
+	TUint8 KDfuInterfaceSubClass = 0x01;
+	
+	// Drop down a level from the configuration descriptor.
+	TUsbGenericDescriptor* descriptor = aConfigurationDescriptor.iFirstChild;
+	// Search across the interface tier (note doesn't handle DFU in IAD).
+	while(descriptor)
+		{
+		TUsbInterfaceDescriptor* interface;
+		if (interface = TUsbInterfaceDescriptor::Cast(descriptor), interface)
+			{
+			if(	interface->InterfaceClass() == KDfuInterfaceClass &&
+				interface->InterfaceSubClass() == KDfuInterfaceSubClass)
+				{
+				firmwareIntNum = interface->InterfaceNumber();
+				firmwareIntFound = ETrue;
+				break;
+				}
+			}
+		descriptor = descriptor->iNextPeer;
+		}
+#endif // SYMBIAN_FDC_HCTL_ORIGINAL_ACCEPT_FIRMWARE_UPDATE
+	
+	// We claim the interfaces we are to represent, we must claim the
+	// first interface given to us as FDF has already determined that
+	// we are to use it.
+	const TUint KNumOfHctlInterfaces = 2;
+	const TUint8 KAclInterfaceNum = 0x00, KScoInterfaceNum = 0x01;
+	TBool gotAcl = EFalse, gotSco = EFalse, fatalError = EFalse;
+	
+	for(TInt i=0; i<aInterfaces.Count(); ++i)
+		{
+		TUint intNum = aInterfaces[i];
+		if(intNum == KAclInterfaceNum)
+			{
+			fatalError = (fatalError || gotAcl); // The USB device should only report one ACL interface
+			iAclToken = Observer().TokenForInterface(intNum);
+			gotAcl = ETrue;
+			}
+		else if(intNum == KScoInterfaceNum)
+			{
+			fatalError = (fatalError || gotSco); // The USB device should only report one ACL interface
+			iScoToken = Observer().TokenForInterface(intNum);
+			gotSco = ETrue;
+			}
+		else if(i == 0)
+			{
+			// We always need to claim the first interface, this should have
+			// been claimed already, but if we have a funny device then this
+			// might not be the case.  We will need to error.
+			TUint32 unknownToken = Observer().TokenForInterface(intNum);
+			return KErrCorrupt;
+			}
+#ifdef SYMBIAN_FDC_HCTL_ORIGINAL_ACCEPT_FIRMWARE_UPDATE
+		else if(firmwareIntFound && intNum == firmwareIntNum)
+			{
+			TUint32 dfuToken = Observer().TokenForInterface(intNum);
+			}
+#endif // SYMBIAN_FDC_HCTL_ORIGINAL_ACCEPT_FIRMWARE_UPDATE
+		}
+	// At this point we will have claimed to the interface mandated by FDF and
+	// so we are at liberty to return an error.
+	
+	// firstly, check to see if a fatal error occured.
+	if(fatalError)
+		{
+		LOG(_L8("\tFatal error when retrieving interfaces for driver instance..."));
+		return KErrGeneral;
+		}
+	
+	// Now we perform some validation that the function is what we expect.
+	// There should be two interfaces as part of the function. One is
+	// the standard data and control planes.  The other for the sync-
+	// chronous connections.
+	if(aConfigurationDescriptor.NumInterfaces() < KNumOfHctlInterfaces)
+		{
+		LOG(_L8("\tInsufficent interfaces in USB config. descriptor..."));
+		return KErrUsbBadDescriptor;
+		}
+	if(aInterfaces.Count() < KNumOfHctlInterfaces)
+		{
+		LOG(_L8("\tInsufficient interfaces provided to FDC..."));
+		return KErrUnderflow;
+		}
+	
+	// Ensure that we got both interfaces, otherwise the device is malformed.
+	if(!gotAcl || !gotSco)
+		{
+		LOG2(_L8("\tMissing Token [ACL=%d] [SCO=%d]"), gotAcl, gotSco);
+		return KErrNotFound;
+		}
+	
+	// At this point we are set-up to use the device.
+	iReady = ETrue;
+	
+	// We try our best; the Bluetooth stack may not be running, it may not be even using
+	// the USB HCTL.  So we accept the tokens and try the best to set-up the HCTL.
+	// If we fail now the HCTL should later inform us to try again.
+	RequestConnection();
+	
+	return KErrNone;
+	}
+
+void CFdcHctlOriginal::Mfi1DeviceDetached(TUint aDeviceId)
+	{
+	LOG_FUNC
+	
+	iReady = EFalse;
+	
+	if(iHctlSession.Handle())
+		{
+		// Inform of disconnection.
+		iHctlSession.DeviceDetached();
+		}
+	// Close Hctl Handle
+	iHctlSession.Close();
+	}
+
+void CFdcHctlOriginal::RequestConnection()
+	{
+	LOG_FUNC
+	// Trigger the attempt to connect to the USB HCTL Server.
+	
+	if(!iReady)
+		{
+		// For whatever reason, we have not got the tokens for the USB interfaces.
+		LOG(_L8("\tFDC is not ready"));
+		return;
+		}
+	
+	// Note that this will error if, the bt thread or usb hctl is not running;
+	// or if there is another FDC already connected to it.
+	TInt err = iHctlSession.Connect();
+	if(err != KErrNone)
+		{
+		LOG1(_L8("\tRHCTLUsbOriginal::Connect error = %d"), err);
+		return;
+		}
+	
+	// Now inform the stack that we have a connected device.
+	err = iHctlSession.DeviceAttached(iAclToken, iScoToken);
+	if(err != KErrNone)
+		{
+		LOG1(_L8("\tRHCTLUsbOriginal::DeviceAttached error = %d"), err);
+		iHctlSession.Close();
+		return;
+		}
+	}
+	
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/fdc/src/fdchctloriginalmain.cpp	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,33 @@
+// Copyright (c) 2007-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:
+// 
+
+/** 
+@file
+@internalComponent
+*/
+
+#include <ECom/ImplementationProxy.h>
+#include "fdchctloriginal.h"
+
+const TImplementationProxy ImplementationTable[] =
+	{
+	IMPLEMENTATION_PROXY_ENTRY(0x200345EA, CFdcHctlOriginal::NewL)
+	};
+
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+	{
+	aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+	return ImplementationTable;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/fdc/src/fdchctloriginalserver.cpp	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,120 @@
+// Copyright (c) 2007-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:
+// 
+
+/**
+@file
+@internalComponent
+*/
+
+#include "fdchctloriginalserver.h"
+
+#include "fdchctloriginal.h"
+#include "fdchctloriginalutils.h"
+#include "fdchctloriginalpolicy.h"
+
+#include <bluetooth/logger.h>
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, "fdchctloriginal");
+#endif
+
+
+CFdcHctlOriginalServer::CFdcHctlOriginalServer(CFdcHctlOriginal& aHctlOriginal)
+	: CPolicyServer(CActive::EPriorityStandard, KFdcHctlOriginalPolicy)
+	, iHctlOriginal(aHctlOriginal)
+	{
+	LOG_FUNC
+	}
+
+void CFdcHctlOriginalServer::ConstructL()
+	{
+	LOG_FUNC
+	StartL(KFdcHctlOrigSrvName);
+	}
+
+CFdcHctlOriginalServer* CFdcHctlOriginalServer::NewL(CFdcHctlOriginal& aHctlOriginal)
+	{
+	LOG_STATIC_FUNC
+	CFdcHctlOriginalServer* self = new(ELeave) CFdcHctlOriginalServer(aHctlOriginal);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+CFdcHctlOriginalServer::~CFdcHctlOriginalServer()
+	{
+	LOG_FUNC
+	}
+
+CSession2* CFdcHctlOriginalServer::NewSessionL(const TVersion& aVersion, const RMessage2& /*aMessage*/) const
+	{
+	LOG_FUNC
+	LOG3(_L8("\taVersion = (%d,%d,%d)"), aVersion.iMajor, aVersion.iMinor, aVersion.iBuild);
+		
+	// Version number check...
+	TVersion v(KFdcHctlOrigSrvMajorVersionNumber,
+			   KFdcHctlOrigSrvMinorVersionNumber,
+			   KFdcHctlOrigSrvBuildNumber);
+	
+	if(!User::QueryVersionSupported(v, aVersion))
+		{
+		LEAVEIFERRORL(KErrNotSupported);
+		}
+	
+	if(iSession)
+		{
+		LEAVEIFERRORL(KErrInUse);
+		}
+	
+	iSession = new(ELeave) CFdcHctlOriginalSession(iHctlOriginal);
+	return iSession;
+	}
+
+void CFdcHctlOriginalServer::DropSession(CFdcHctlOriginalSession* aSession) const
+	{
+	LOG_FUNC
+	__ASSERT_DEBUG(iSession == aSession, PANIC(KFdcHctlOriginalPanic, EBadSessionPointer));
+	iSession = NULL;
+	}
+
+
+CFdcHctlOriginalSession::CFdcHctlOriginalSession(CFdcHctlOriginal& aHctlOriginal)
+	: iHctlOriginal(aHctlOriginal)
+	{
+	LOG_FUNC
+	}
+
+CFdcHctlOriginalSession::~CFdcHctlOriginalSession()
+	{
+	LOG_FUNC
+	static_cast<const CFdcHctlOriginalServer*>(Server())->DropSession(this);
+	}
+
+void CFdcHctlOriginalSession::ServiceL(const RMessage2& aMessage)
+	{
+	LOG_FUNC
+	switch(aMessage.Function())
+		{
+	case EFunctionRequestConnection:
+		iHctlOriginal.RequestConnection();
+		break;
+	default:
+		PANIC_MSG(aMessage, KFdcHctlOriginalSrvPanicCat, EFdcHctlInvalidFunction);
+		return;
+		}
+	aMessage.Complete(KErrNone);
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/group/bld.inf	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,34 @@
+// Copyright (c) 2007-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:
+// 
+
+#if defined(SYMBIAN_ENABLE_USB_OTG_HOST)
+
+PRJ_EXPORTS
+
+hctl_usb_original.iby /epoc32/rom/include/hctl_usb_original.iby
+
+#if !defined(WINS)
+#if !defined(X86)
+
+PRJ_MMPFILES
+
+../hctl/group/hctl_usb_original
+
+../fdc/group/fdc_hctl_original
+
+#endif // X86
+#endif // WINS
+
+#endif // SYMBIAN_ENABLE_USB_OTG_HOST
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/group/distribution.policy.s60	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,1 @@
+7
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/group/hctl_usb_original.iby	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,25 @@
+// Copyright (c) 2007-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:
+// 
+
+#ifndef HCTL_USB_ORIGINAL_IBY
+#define HCTL_USB_ORIGINAL_IBY
+
+REM H2 HCTL implementation
+
+HCI_PLUGIN(hctl_usb_original.dll, hctl_usb_original.rsc)
+
+HCI_PLUGIN(fdc_hctl_original.dll, fdc_hctl_original.rsc)
+
+#endif // HCTL_UART_ORIGINAL_IBY
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/group/distribution.policy.s60	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,1 @@
+7
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/group/hctl_usb_original.mmp	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,62 @@
+// Copyright (c) 2007-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:
+// 
+
+/**
+@file
+@internalComponent
+*/
+
+target hctl_usb_original.dll
+targettype plugin
+// UID2 = 0x10009d8d for ECOM plugins.
+// UID3 = the 'DLL UID' (see resource file)
+uid 0x10009d8d 0x200345E5
+vendorid 0x70000001
+
+capability CommDD PowerMgmt ReadDeviceData WriteDeviceData TrustedUI ProtServ NetworkControl NetworkServices LocalServices ReadUserData WriteUserData
+
+noexportlibrary
+
+userinclude ../inc
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+systeminclude ../../hctl/public
+systeminclude ../../fdc/public
+
+sourcepath ../src
+source hctlusboriginalmain.cpp
+source hctlusboriginal.cpp
+source hctlusboriginalcommand.cpp
+source hctlusboriginalevent.cpp
+source hctlusboriginalaclout.cpp
+source hctlusboriginalaclin.cpp
+source controllermanager.cpp
+source devicestatemanager.cpp
+source hctlusboriginalserver.cpp
+
+resource hctl_usb_original.rss
+
+library esock.lib
+library euser.lib
+library hctl_base.lib
+library usbdi_utils.lib
+library usbdescriptors.lib
+
+#include <bluetooth/btlogger.mmh>
+
+macro ENABLE_HCI_FRAME_LOGGING  // Enable the HCI logging
+
+unpaged
+
+smpsafe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/inc/controllermanager.h	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,58 @@
+// Copyright (c) 2007-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:
+// 
+
+/** 
+@file
+@internalComponent
+*/
+
+#ifndef HOSTCONTROLLERMANAGER_H
+#define HOSTCONTROLLERMANAGER_H
+
+#include <e32base.h>
+#include <bluetooth/hci/hctlpowerinterface.h>
+
+class MControllerStateObserver;
+class CHCTLUsbOriginal;
+
+/**
+This is the class that implements a controller manager.
+This is a class which provides a framework for managing the
+power management and reset of the host controller.
+*/
+NONSHARABLE_CLASS(CControllerManager)
+	: public CBase
+	, public MHCTLPowerInterface
+	{
+public:
+	static CControllerManager* NewL(CHCTLUsbOriginal& aHctl);
+	~CControllerManager();
+	
+	void SetControllerStateObserver(MControllerStateObserver& aControllerStateObserver);
+	void HardReset();
+	
+private:
+	CControllerManager(CHCTLUsbOriginal& aHctl);
+	
+private: // from MHCTLPowerInterface
+	virtual TInt MhpiGetPower(TBTPowerState& aState);
+	virtual TInt MhpiSetPower(const TBTPowerState aState);
+	
+private:
+	MControllerStateObserver* iControllerStateObserver;
+	CHCTLUsbOriginal& iHctl;
+	};
+
+#endif // HOSTCONTROLLERMANAGER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/inc/devicestatemanager.h	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,74 @@
+// Copyright (c) 2007-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:
+// 
+
+/**
+@file
+@internalComponent
+*/
+
+#ifndef DEVICESTATEMANAGER_H
+#define DEVICESTATEMANAGER_H
+
+#include <e32base.h>
+
+class RUsbInterface;
+
+NONSHARABLE_CLASS(CInterfaceStateManager)
+	: public CActive
+	{
+public:
+	static CInterfaceStateManager* NewL(RUsbInterface& aInterface);
+	~CInterfaceStateManager();
+	
+	void Suspend();
+	void Resume();
+	
+private:
+	CInterfaceStateManager(RUsbInterface& aInterface);
+	
+	void RequestSuspend();
+	
+private: // from CActive
+	void DoCancel();
+	void RunL();
+	
+private:
+	RUsbInterface& iInterface;
+	};
+
+
+/**
+This is the class to control the state of the USB Device.
+*/
+NONSHARABLE_CLASS(CDeviceStateManager) 
+	: public CBase
+	{
+public:
+	static CDeviceStateManager* NewL(RUsbInterface& aAclInterface, RUsbInterface& aScoInterface);
+	~CDeviceStateManager();
+	
+	void Suspend();
+	void Resume();
+	
+private:
+	CDeviceStateManager();
+	void ConstructL(RUsbInterface& aAclInterface, RUsbInterface& aScoInterface);
+	
+private:
+	CInterfaceStateManager* iAclManager;
+	CInterfaceStateManager* iScoManager;
+	};
+
+#endif // DEVICESTATEMANAGER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/inc/distribution.policy.s60	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,1 @@
+7
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/inc/hctlusboriginal.h	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,147 @@
+// Copyright (c) 2007-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:
+// 
+
+/** 
+@file
+@internalComponent
+*/
+
+#ifndef HCTLUSBORIGINAL_H
+#define HCTLUSBORIGINAL_H
+
+#include <bluetooth/hci/hctlbase.h>
+#include <bluetooth/hciframelogger.h>
+#include <bluetooth/hci/hcitypes.h>
+#include <bluetooth/hci/hctlinterface.h>
+#include <bluetooth/hardresetinitiator.h>
+#include <d32usbdi.h>
+#include <fdchctloriginalcli.h>
+
+
+class CHCTLUsbOriginalCommand;
+class CHCTLUsbOriginalAclOut;
+class CHCTLUsbOriginalAclIn;
+class CHCTLUsbOriginalEvent;
+class CControllerManager;
+class CDeviceStateManager;
+class CHCTLUsbOriginalServer;
+class MHCTLChannelObserver;
+class MHCTLDataObserver;
+class MHCTLEventObserver;
+class MControllerStateObserver;
+class MQdpPluginInterfaceFinder;
+
+
+/**USB Original HCI Framing constants for command frames */
+static const TInt KHCTLCommandHeaderSize	= 0;
+static const TInt KHCTLCommandTrailerSize	= 0;
+
+/**USB Original HCI Framing constants for ACL data frames */
+static const TInt KHCTLAclDataHeaderSize	= 0;
+static const TInt KHCTLAclDataTrailerSize	= 0;
+
+/**USB Original HCI Framing constants for Synchronous data frames */
+static const TInt KHCTLSynchronousDataHeaderSize	= 0;
+static const TInt KHCTLSynchronousDataTrailerSize	= 0;
+
+/**
+This is the class that implements the USB specific HCTL.
+*/
+NONSHARABLE_CLASS(CHCTLUsbOriginal)
+	: public CHCTLBase
+	, public MHCTLInterface
+	, public MHardResetInitiator
+	{
+public:
+	static CHCTLUsbOriginal* NewL();
+	~CHCTLUsbOriginal();
+	
+	void ProcessACLData(const TDesC8& aData);
+	void ProcessSynchronousData(const TDesC8& aData);
+	void ProcessEvent(const TDesC8& aEvent);
+	
+	MQdpPluginInterfaceFinder* QdpPluginInterfaceFinder();
+
+	// Called from the Controller Manager
+	void HandlePowerOff();
+	void HandlePowerOn();
+	TBTPowerState CurrentPowerState() const;
+
+	// Called from Server Session.
+	void DeviceAttachedL(TUint32 aStandardIf, TUint32 aScoIf);
+	void DeviceRemoved();
+	
+	TBool DevicePresent() const;
+
+private:
+	CHCTLUsbOriginal();
+	void ConstructL();
+	TAny* Interface(TUid aUid);
+
+	static TInt AsyncCallBackSecondStage(TAny* aUsbOriginal);
+	static void Rollback(TAny* aPtr);
+
+	void HandleChannelStateChange();
+	TInt SetPower(TBTPowerState aState);
+
+private: // from MHCTLInterface
+	virtual TInt MhiWriteCommand(const TDesC8& aData);
+	virtual TInt MhiWriteAclData(const TDesC8& aData);
+	virtual TInt MhiWriteSynchronousData(const TDesC8& aData);
+	virtual void MhiGetAclDataTransportOverhead(TUint& aHeaderSize, TUint& aTrailerSize) const;
+	virtual void MhiGetSynchronousDataTransportOverhead(TUint& aHeaderSize, TUint& aTrailerSize) const;
+	virtual void MhiGetCommandTransportOverhead(TUint& aHeaderSize, TUint& aTrailerSize) const;
+	virtual void MhiSetChannelObserver(MHCTLChannelObserver& aChannelObserver);
+	virtual void MhiSetDataObserver(MHCTLDataObserver& aDataObserver);
+	virtual void MhiSetEventObserver(MHCTLEventObserver& aEventObserver);
+	virtual void MhiSetControllerStateObserver(MControllerStateObserver& aControllerStateObserver);
+	virtual void MhiSetQdpPluginInterfaceFinder(MQdpPluginInterfaceFinder& aQdpPluginInterfaceFinder);
+	
+public: // from MHardResetInitiator
+	virtual void MhriStartHardReset();
+	
+private:
+	RUsbInterface iInterface;
+	RUsbInterface iScoInterface;
+	
+	// Senders
+	CHCTLUsbOriginalCommand* iControl;
+	CHCTLUsbOriginalAclOut* iAclOut;
+	// Receivers
+	CHCTLUsbOriginalAclIn* iAclIn;
+	CHCTLUsbOriginalEvent* iEvent;
+	
+	MQdpPluginInterfaceFinder* iQdpPluginInterfaceFinder;
+	MHCTLChannelObserver* iChannelObserver;
+	MHCTLEventObserver* iEventObserver;
+	MHCTLDataObserver* iDataObserver;
+	MControllerStateObserver* iControllerStateObserver;
+	
+	TBTPowerState iCurrentPowerState;
+	
+	CControllerManager* iControllerMan;
+	CDeviceStateManager* iDeviceStateMan;
+	CHCTLUsbOriginalServer* iServer;
+	
+	CAsyncCallBack* iSecondStageCallBack;
+	
+	RFdcHctlOriginal iFdc;
+	
+	DECLARE_HCI_LOGGER
+	};
+
+
+#endif // HCTLUSBORIGINAL_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/inc/hctlusboriginalaclin.h	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,64 @@
+// Copyright (c) 2007-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:
+// 
+
+/** 
+@file
+@internalComponent
+*/
+
+#ifndef HCTLUSBORIGINALACLIN_H
+#define HCTLUSBORIGINALACLIN_H
+
+#include <e32base.h>
+#include <bluetooth/hci/hcievents.h>
+#include <d32usbdi.h>
+#include <d32usbtransfers.h>
+
+class CHCTLUsbOriginal;
+
+NONSHARABLE_CLASS(CHCTLUsbOriginalAclIn)
+	: public CActive
+	{
+private:
+	static const TInt KEndpointNumber = 0x82;
+	
+public:
+	static CHCTLUsbOriginalAclIn* NewL(CHCTLUsbOriginal& aHCTLUsbOriginal, RUsbInterface& aInterface);
+	~CHCTLUsbOriginalAclIn();
+	
+	// Called to initiate the initial read on the port.
+	void Start();
+	
+private:
+	CHCTLUsbOriginalAclIn(CHCTLUsbOriginal& aHCTLUsbOriginal, RUsbInterface& aInterface);
+	void ConstructL();
+	
+	// Helper methods
+	void QueueRead();
+	
+private: // from CActive
+	virtual void RunL();
+	virtual void DoCancel();
+	virtual TInt RunError(TInt aError);
+	
+private:
+	CHCTLUsbOriginal& iHCTLUsbOriginal;
+	RUsbInterface& iInterface;
+	RUsbPipe iPipe;
+	RUsbBulkTransferDescriptor iTransfer;
+	};
+
+#endif // HCTLUSBORIGINALACLIN_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/inc/hctlusboriginalaclout.h	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,57 @@
+// Copyright (c) 2007-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:
+// 
+
+/**
+@file
+@internalComponent
+*/
+
+#ifndef HCTLUSBORIGINALACLOUT_H
+#define HCTLUSBORIGINALACLOUT_H
+
+#include <e32base.h>
+#include <d32usbdi.h>
+#include <d32usbtransfers.h>
+
+class MHCTLChannelObserver;
+
+NONSHARABLE_CLASS(CHCTLUsbOriginalAclOut)
+	: public CActive
+	{
+private:
+	static const TInt KEndpointNumber = 0x02;
+	
+public:
+	static CHCTLUsbOriginalAclOut* NewL(RUsbInterface& aInterface);
+	~CHCTLUsbOriginalAclOut();
+	
+	TInt Write(const TDesC8& aData);
+	void SetChannelObserver(MHCTLChannelObserver& aObserver);
+	
+private: // from CActive
+	virtual void RunL();
+	virtual void DoCancel();
+	
+	CHCTLUsbOriginalAclOut(RUsbInterface& aInterface);
+	void ConstructL();
+	
+private:
+	MHCTLChannelObserver* iChannelObserver;
+	RUsbInterface& iInterface;
+	RUsbPipe iPipe;
+	RUsbBulkTransferDescriptor iTransfer;
+	};
+
+#endif // HCTLUSBORIGINALACLOUT_H
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/inc/hctlusboriginalcommand.h	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,57 @@
+// Copyright (c) 2007-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:
+// 
+
+/**
+@file
+@internalComponent
+*/
+
+#ifndef HCTLUSBORIGINALCONTROL_H
+#define HCTLUSBORIGINALCONTROL_H
+
+#include <e32base.h>
+#include <d32usbdi.h>
+
+class MHCTLChannelObserver;
+
+/**
+Control pipe in the spec. defined USB transport is one way.
+*/
+NONSHARABLE_CLASS(CHCTLUsbOriginalCommand)
+	: public CActive
+	{
+public:
+	static CHCTLUsbOriginalCommand* NewL(RUsbInterface& aInterface);
+	~CHCTLUsbOriginalCommand();
+	
+	TInt Write(const TDesC8& aData);
+	void SetChannelObserver(MHCTLChannelObserver& aObserver);
+	
+private:
+	CHCTLUsbOriginalCommand(RUsbInterface& aInterface);
+	
+private: // from CActive
+	virtual void RunL();
+	virtual void DoCancel();
+	
+private:
+	MHCTLChannelObserver* iChannelObserver;
+	RUsbInterface& iInterface;
+	RUsbInterface::TUsbTransferRequestDetails iEp0Details;
+	TBuf8<255> iRecvData; // TODO test if we can remove this.
+    };
+
+#endif // HCTLUSBORIGINALCONTROL_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/inc/hctlusboriginalevent.h	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,63 @@
+// Copyright (c) 2007-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:
+// 
+
+/** 
+@file
+@internalComponent
+*/
+
+#ifndef HCTLUSBORIGINALEVENT_H
+#define HCTLUSBORIGINALEVENT_H
+
+#include <e32base.h>
+#include <bluetooth/hci/hcievents.h>
+#include <d32usbdi.h>
+#include <d32usbtransfers.h>
+
+class CHCTLUsbOriginal;
+
+NONSHARABLE_CLASS(CHCTLUsbOriginalEvent)
+	: public CActive
+	{
+private:
+	static const TInt KEndpointNumber = 0x81;
+	
+public:
+	static CHCTLUsbOriginalEvent* NewL(CHCTLUsbOriginal& aHCTLUsbOriginal, RUsbInterface& aInterface);
+	~CHCTLUsbOriginalEvent();
+	
+	// Called to initiate the initial read on the port.
+	void Start();
+	
+private:
+	CHCTLUsbOriginalEvent(CHCTLUsbOriginal& aHCTLUsbOriginal, RUsbInterface& aInterface);
+	void ConstructL();
+	
+	void QueueRead();
+	
+private: // from CActive
+	virtual void RunL();
+	virtual void DoCancel();
+	virtual TInt RunError(TInt aError);
+	
+private:
+	CHCTLUsbOriginal& iHCTLUsbOriginal;
+	RUsbInterface& iInterface;
+	RUsbPipe iPipe;
+	RUsbIntrTransferDescriptor iTransfer;
+	};
+
+#endif // HCTLUSBORIGINALEVENT_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/inc/hctlusboriginalpolicy.h	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,63 @@
+// Copyright (c) 2007-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:
+// 
+
+/**
+@file
+@internalComponent
+*/
+ 
+#ifndef HCTLUSBORIGINALPOLICY_H
+#define HCTLUSBORIGINALPOLICY_H
+
+#include <e32def.h>
+#include <hctlusboriginalipc.h>
+
+/** HCTL USB Original Server Security Policy Definition */
+const TUint KHCTLUsbOriginalRangeCount = 2;
+
+const TInt KHCTLUsbOriginalRanges[KHCTLUsbOriginalRangeCount] =
+	{
+	EFunctionAttached,					// FDF SID
+//	EFunctionDetached,
+	ENumHctlUsbOriginalSrvFuncs,		// not supported
+	};
+
+/** Index numbers into KHCTLUsbOriginalElements[] */
+const TInt KPolicyFdfSid = 0;
+
+/** Mapping IPCs to policy element */
+const TUint8 KHCTLUsbOriginalElementsIndex[KHCTLUsbOriginalRangeCount] =
+    {
+    KPolicyFdfSid,					// All (valid) APIs
+    CPolicyServer::ENotSupported	// Undefined functions
+    };
+
+/** Individual policy elements */
+const CPolicyServer::TPolicyElement KHCTLUsbOriginalElements[] =
+    {
+        { _INIT_SECURITY_POLICY_S0(0x10282b48) },
+    };
+
+/** Main policy */
+const CPolicyServer::TPolicy KHCTLUsbOriginalPolicy =
+    {
+    KPolicyFdfSid, // connection requirements
+    KHCTLUsbOriginalRangeCount,
+    KHCTLUsbOriginalRanges,
+    KHCTLUsbOriginalElementsIndex,
+    KHCTLUsbOriginalElements,
+    };
+    
+#endif // HCTLUSBORIGINALPOLICY_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/inc/hctlusboriginalserver.h	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,64 @@
+// Copyright (c) 2007-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:
+// 
+
+/**
+@file
+@internalComponent
+*/
+
+#ifndef HCTLUSBORIGINALSERVER_H
+#define HCTLUSBORIGINALSERVER_H
+
+#include <e32base.h>
+
+class CHCTLUsbOriginal;
+
+NONSHARABLE_CLASS(CHCTLUsbOriginalSession)
+	: public CSession2
+	{
+public:
+	CHCTLUsbOriginalSession(CHCTLUsbOriginal& aUsbOriginal);
+	~CHCTLUsbOriginalSession();
+	
+private:
+	void ServiceL(const RMessage2& aMessage);
+	
+private:
+	CHCTLUsbOriginal& iUsbOriginal;
+	TBool iDeviceAttached;
+	};
+
+
+NONSHARABLE_CLASS(CHCTLUsbOriginalServer)
+	: public CPolicyServer
+	{
+public:
+	static CHCTLUsbOriginalServer* NewL(CHCTLUsbOriginal& aUsbOriginal);
+	~CHCTLUsbOriginalServer();
+	
+	void DropSession(CHCTLUsbOriginalSession* aSession) const;
+	
+private:
+	CHCTLUsbOriginalServer(CHCTLUsbOriginal& aUsbOriginal);
+	void ConstructL();
+	
+	CSession2* NewSessionL(const TVersion& aVersion, const RMessage2& aMessage) const;
+	
+private:
+	CHCTLUsbOriginal& iUsbOriginal;
+	mutable CHCTLUsbOriginalSession* iSession;
+	};
+
+#endif // HCTLUSBORIGINALSERVER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/inc/hctlusboriginalutils.h	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,48 @@
+// Copyright (c) 2007-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:
+// 
+
+/** 
+@file
+@internalComponent
+*/
+
+
+#ifndef HCTLUSBORIGINALUTILS_H
+#define HCTLUSBORIGINALUTILS_H
+
+#include <e32base.h>
+
+/**
+The panic category for the USB Original HCTL.
+*/
+_LIT(KUsbOriginalPanic, "HctlUsbOrigPanic");
+
+/**
+Panic codes for USB Original HCTL.
+*/
+enum TUsbOriginalPanic
+	{
+	EUnexpectedCtrlMgrPowerState		= 0,
+	EReadAttemptWhenReadOutstanding		= 1,
+	EStateObserverNotAvailable			= 2,
+	EStartCalledWhenReadOutstanding		= 3,
+	ENoChannelObserver					= 4,
+	EPartiallyOpenedInterface			= 5,
+	EBadSessionPointer					= 6,
+	EStackOnWhenNoDeviceConnected		= 7,
+	};
+
+#endif // HCTLUSBORIGINALUTILS_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/public/distribution.policy.s60	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,1 @@
+7
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/public/hctlusboriginalcli.h	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,76 @@
+// Copyright (c) 2007-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:
+// 
+
+/**
+@file
+@internalComponent
+*/
+
+#ifndef HCTLUSBORIGINALCLI_H
+#define HCTLUSBORIGINALCLI_H
+
+#include <e32base.h>
+#include <hctlusboriginalipc.h>
+
+NONSHARABLE_CLASS(RHCTLUsbOriginal) : public RSessionBase
+	{
+public:
+	inline RHCTLUsbOriginal();
+
+	inline TInt Connect();
+	inline void Close();
+
+	inline TInt DeviceAttached(TUint32 aAclToken, TUint32 aScoToken);
+	inline void DeviceDetached();
+
+private:
+	TAny* iExtension;
+	};
+
+
+inline RHCTLUsbOriginal::RHCTLUsbOriginal()
+	: iExtension(NULL)
+	{}
+
+inline TInt RHCTLUsbOriginal::Connect()
+	{
+	// We don't want to start the server - that is a function of loading the bluetooth
+	// stack.  Instead we just want to try and connect and report on whether we succeeded.
+	return CreateSession(
+						KHCTLUsbOrginalSrvName,
+						TVersion(
+							KHCTLUsbOriginalSrvMajorVersionNumber,
+							KHCTLUsbOriginalSrvMinorVersionNumber,
+							KHCTLUsbOriginalSrvBuildNumber
+							)
+						);
+	}
+
+inline void RHCTLUsbOriginal::Close()
+	{
+	RSessionBase::Close();
+	}
+
+inline TInt RHCTLUsbOriginal::DeviceAttached(TUint32 aAclToken, TUint32 aScoToken)
+	{
+	return SendReceive(EFunctionAttached, TIpcArgs(aAclToken, aScoToken));
+	}
+
+inline void RHCTLUsbOriginal::DeviceDetached()
+	{
+	Send(EFunctionDetached);
+	}
+
+#endif // HCTLUSBORIGINALCLI_H
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/public/hctlusboriginalipc.h	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,54 @@
+// Copyright (c) 2007-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:
+// 
+
+/**
+@file
+@internalComponent
+*/
+
+#ifndef HCTLUSBORIGINALIPC_H
+#define HCTLUSBORIGINALIPC_H
+
+#include <e32base.h>
+
+//
+// HCTL Server IPC
+//
+
+_LIT(KHCTLUsbOrginalSrvName, "!HctlUsbOriginal");
+
+/** Version numbers. */
+const TInt8 KHCTLUsbOriginalSrvMajorVersionNumber = 1;
+const TInt8 KHCTLUsbOriginalSrvMinorVersionNumber = 0;
+const TInt16 KHCTLUsbOriginalSrvBuildNumber = 0;
+
+enum THCTLUsbOriginalSrvFuncs
+	{
+	EFunctionAttached = 0,
+	EFunctionDetached = 1,
+	/* Add new server functions before this */
+	ENumHctlUsbOriginalSrvFuncs // Never use as an actual function number
+	};
+	
+_LIT(KHCTLUsbOriginalServerPanicCat, "HCTLUsbOriginalServer");
+
+enum THCTLUsbOriginalServerPanics
+	{
+	EInvalidFunction		= 0,
+	EDeviceAlreadyAttached	= 1,
+	EDeviceNotAttached		= 2,
+	};
+
+#endif // HCTLUSBORIGINALIPC_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/src/controllermanager.cpp	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,133 @@
+// Copyright (c) 2007-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:
+// 
+
+/** 
+@file
+@internalComponent
+*/
+
+#include "controllermanager.h"
+
+#include <bluetooth/hci/controllerstateobserver.h>
+#include <bluetooth/hci/hctlchannelobserver.h>
+
+#include "hctlusboriginal.h"
+#include "hctlusboriginalutils.h"
+
+#include <bluetooth/logger.h>
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, LOG_COMPONENT_HCTL_USB_ORIGINAL);
+#endif
+
+
+CControllerManager* CControllerManager::NewL(CHCTLUsbOriginal& aHctl)
+	{
+	LOG_STATIC_FUNC
+	CControllerManager* self = new(ELeave) CControllerManager(aHctl);
+	return self;
+	}
+
+CControllerManager::CControllerManager(CHCTLUsbOriginal& aHctl)
+	: iHctl(aHctl)
+	{
+	LOG_FUNC
+	}
+
+CControllerManager::~CControllerManager()
+	{
+	LOG_FUNC
+	}
+
+TInt CControllerManager::MhpiGetPower(TBTPowerState& aState)
+	{
+	LOG_FUNC
+	
+	__ASSERT_DEBUG(iHctl.CurrentPowerState() == EBTOff || iHctl.DevicePresent(),
+		PANIC(KUsbOriginalPanic, EStackOnWhenNoDeviceConnected));
+	
+	// Return current state.
+	aState = iHctl.CurrentPowerState();
+	return KErrNone;
+	}
+
+TInt CControllerManager::MhpiSetPower(TBTPowerState aState)
+	{
+	LOG_FUNC
+	
+	TInt rerr = KErrAlreadyExists;
+	// Check that the requested state differs from the current state.
+	if(aState != iHctl.CurrentPowerState())
+		{
+		__ASSERT_ALWAYS(aState == EBTOff || aState == EBTOn,
+			PANIC(KUsbOriginalPanic, EUnexpectedCtrlMgrPowerState));
+		__ASSERT_ALWAYS(iControllerStateObserver,
+			PANIC(KUsbOriginalPanic, EStateObserverNotAvailable));
+		
+		rerr = KErrNotReady;
+		if(aState == EBTOff || iHctl.DevicePresent())
+			{
+			iControllerStateObserver->McsoProcessPowerChange(KErrNone,
+															 MControllerStateObserver::EBTFatalChange,
+															 aState);
+			
+			if(aState == EBTOff)
+				{
+				// Cancel any reads / writes.
+				iHctl.HandlePowerOff();
+				}
+			else
+				{
+				// Re-start the sender and receiver.
+				iHctl.HandlePowerOn();
+				}
+			
+			rerr = KErrNone;
+			}
+		}
+	
+	return rerr;
+	}
+
+void CControllerManager::HardReset()
+	{
+	LOG_FUNC
+	
+	// Check if the power is currently switched off.  This takes priority over
+	// hard reset.
+	if(iHctl.CurrentPowerState() == EBTOn)
+		{
+		__ASSERT_ALWAYS(iControllerStateObserver, 
+			PANIC(KUsbOriginalPanic, EStateObserverNotAvailable));
+		__ASSERT_DEBUG(iHctl.DevicePresent(),
+			PANIC(KUsbOriginalPanic, EStackOnWhenNoDeviceConnected));
+		
+		// Switch the power off then on to perform the reset.
+		iControllerStateObserver->McsoProcessHardResetPhaseChange(KErrNone, MControllerStateObserver::EBTFatalChange, EBTResetStarted);
+		
+		iHctl.HandlePowerOff();
+		// TODO should there be an asynchronous break here, or are we good?
+		iHctl.HandlePowerOn();
+		
+		// Reset is complete.
+		iControllerStateObserver->McsoProcessHardResetPhaseChange(KErrNone, MControllerStateObserver::EBTFatalChange, EBTResetComplete);
+		}
+	}
+
+void CControllerManager::SetControllerStateObserver(MControllerStateObserver& aControllerStateObserver)
+	{
+	LOG_FUNC
+	iControllerStateObserver = &aControllerStateObserver;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/src/devicestatemanager.cpp	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,128 @@
+// Copyright (c) 2007-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:
+// 
+
+#include "devicestatemanager.h"
+
+#include <d32usbdi.h>
+
+#include <bluetooth/logger.h>
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, LOG_COMPONENT_HCTL_USB_ORIGINAL);
+#endif
+
+CDeviceStateManager* CDeviceStateManager::NewL(RUsbInterface& aAclInterface, RUsbInterface& aScoInterface)
+	{
+	LOG_STATIC_FUNC
+	CDeviceStateManager* self = new(ELeave) CDeviceStateManager;
+	CleanupStack::PushL(self);
+	self->ConstructL(aAclInterface, aScoInterface);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CDeviceStateManager::~CDeviceStateManager()
+	{
+	LOG_FUNC
+	delete iScoManager;
+	delete iAclManager;
+	}
+
+void CDeviceStateManager::Suspend()
+	{
+	LOG_FUNC
+	iAclManager->Suspend();
+	iScoManager->Suspend();
+	}
+
+void CDeviceStateManager::Resume()
+	{
+	LOG_FUNC
+	iAclManager->Resume();
+	iScoManager->Resume();
+	}
+
+CDeviceStateManager::CDeviceStateManager()
+	{
+	LOG_FUNC
+	}
+
+void CDeviceStateManager::ConstructL(RUsbInterface& aAclInterface, RUsbInterface& aScoInterface)
+	{
+	LOG_FUNC
+	iAclManager = CInterfaceStateManager::NewL(aAclInterface);
+	iScoManager = CInterfaceStateManager::NewL(aScoInterface);
+	}
+	
+
+
+CInterfaceStateManager* CInterfaceStateManager::NewL(RUsbInterface& aInterface)
+	{
+	LOG_STATIC_FUNC
+	return new(ELeave) CInterfaceStateManager(aInterface);
+	}
+
+CInterfaceStateManager::~CInterfaceStateManager()
+	{
+	LOG_FUNC
+	Cancel();
+	}
+
+CInterfaceStateManager::CInterfaceStateManager(RUsbInterface& aInterface)
+	: CActive(EPriorityStandard)
+	, iInterface(aInterface)
+	{
+	LOG_FUNC
+	CActiveScheduler::Add(this);
+	}
+
+void CInterfaceStateManager::DoCancel()
+	{
+	LOG_FUNC
+	iInterface.CancelPermitSuspend();
+	}
+
+void CInterfaceStateManager::RunL()
+	{
+	LOG_FUNC
+	if(iStatus.Int() == KErrNone)
+		{
+		RequestSuspend();
+		}
+	// Ignore error - we'll try again on the next explict resume
+	}
+
+void CInterfaceStateManager::RequestSuspend()
+	{
+	iInterface.PermitSuspendAndWaitForResume(iStatus);
+	SetActive();
+	}
+
+void CInterfaceStateManager::Suspend()
+	{
+	LOG_FUNC
+	if(!IsActive()) // Only suspend if we aren't already suspended.
+		{
+		RequestSuspend();
+		}
+	}
+
+void CInterfaceStateManager::Resume()
+	{
+	LOG_FUNC
+	Cancel();
+	}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/src/distribution.policy.s60	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,1 @@
+7
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/src/hctl_usb_original.rss	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,46 @@
+// Copyright (c) 2007-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:
+//
+
+/** 
+@file
+@internalComponent
+*/
+
+#include <ecom/registryinfo.rh>
+#include <bluetooth/hci/hctlbase.hrh>
+
+RESOURCE REGISTRY_INFO theInfo
+	{
+	dll_uid = 0x200345E5;
+	interfaces =
+		{
+		INTERFACE_INFO
+			{
+			interface_uid = KHCTLBaseEcomInterfaceUid;
+			implementations =
+				{
+				IMPLEMENTATION_INFO
+					{
+					implementation_uid = 0x200345E7;
+					version_no = 1;
+					display_name = "USB (ORIGINAL)";
+					default_data = "";
+					opaque_data = "";
+					}
+				};
+			}
+		};
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/src/hctlusboriginal.cpp	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,436 @@
+// Copyright (c) 2007-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:
+// 
+
+/** 
+@file
+@internalComponent
+*/
+
+#include "hctlusboriginal.h"
+
+#include "hctlusboriginalcommand.h"
+#include "hctlusboriginalaclout.h"
+#include "hctlusboriginalaclin.h"
+#include "hctlusboriginalevent.h"
+#include "controllermanager.h"
+#include "devicestatemanager.h"
+#include "hctlusboriginalserver.h"
+
+#include "hctlusboriginalutils.h"
+
+#include <bluetooth/hci/hctleventobserver.h>
+#include <bluetooth/hci/hctldataobserver.h>
+#include <bluetooth/hci/hctlchannelobserver.h>
+#include <bluetooth/logger.h>
+
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, LOG_COMPONENT_HCTL_USB_ORIGINAL);
+#endif
+
+_LIT(KUsbdiLddFileName, "usbdi");
+
+CHCTLUsbOriginal* CHCTLUsbOriginal::NewL()
+	{
+	LOG_STATIC_FUNC
+	CHCTLUsbOriginal* self = new(ELeave) CHCTLUsbOriginal();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+CHCTLUsbOriginal::CHCTLUsbOriginal()
+	{
+	LOG_FUNC
+	}
+
+CHCTLUsbOriginal::~CHCTLUsbOriginal()
+	{
+	LOG_FUNC
+	
+	delete iControl;
+	delete iAclOut;
+	delete iAclIn;
+	delete iEvent;
+	
+	iInterface.Close();
+	iScoInterface.Close();
+	
+	iFdc.Close();
+	
+	delete iSecondStageCallBack;
+	
+	delete iServer;
+	delete iControllerMan;
+	HCI_LOG_UNLOAD(this);
+	
+	// User::FreeLogicalDevice(RUsbInterface::Name()); // TODO Maybe this affects others
+	}
+
+void CHCTLUsbOriginal::ConstructL()
+	{
+	LOG_FUNC
+	
+	LOG(_L("\tLoading USBDI LDD"));
+	TInt err = User::LoadLogicalDevice(KUsbdiLddFileName);
+	if(err != KErrNone && err != KErrAlreadyExists)
+		{
+		LEAVEIFERRORL(err);
+		}
+	
+	HCI_LOG_LOADL(this, KHCILoggerDatalinkTypeH1); // no frame information - so use the H1 encoding.
+	iControllerMan = CControllerManager::NewL(*this);
+	iDeviceStateMan = CDeviceStateManager::NewL(iInterface, iScoInterface);
+	iServer = CHCTLUsbOriginalServer::NewL(*this);
+	
+	// We need an asynchronous break from the synchronous creation path to complete the set-up.
+	// This is due to the behaviour of the Bluetooth stack.
+	TCallBack secondStageCallBack(AsyncCallBackSecondStage, this);
+	iSecondStageCallBack = new(ELeave) CAsyncCallBack(secondStageCallBack, CActive::EPriorityStandard);
+	iSecondStageCallBack->CallBack();
+	}
+
+TInt CHCTLUsbOriginal::AsyncCallBackSecondStage(TAny* aUsbOriginal)
+	{
+	LOG_STATIC_FUNC
+	
+	CHCTLUsbOriginal* usbOriginal = static_cast<CHCTLUsbOriginal*>(aUsbOriginal);
+	static_cast<void>(usbOriginal->SetPower(EBTOff)); // Can't handle the error, it shouldn't affect operation.
+	
+	TInt err = usbOriginal->iFdc.Connect();
+	LOG1(_L("\tFDC Connection result = %d"), err);
+	if(err == KErrNone)
+		{
+		// Here we are passive on errors, a failure to connect indicates
+		// that the FDC isn't loaded yet.  When it is it will attach to
+		// us.
+		usbOriginal->iFdc.RequestConnection(); // Causes the FDC to call back with tokens.
+		}
+	
+	return EFalse;	// Don't call back any more.
+	}
+
+
+
+TAny* CHCTLUsbOriginal::Interface(TUid aUid)
+	{
+	LOG_FUNC
+	
+	TAny* ret = NULL;
+	switch(aUid.iUid)
+		{
+		case KHCTLInterfaceUid:
+			ret = reinterpret_cast<TAny*>(static_cast<MHCTLInterface*>(this));
+			break;
+		
+		case KHCTLPowerInterfaceUid:
+			ret = reinterpret_cast<TAny*>(static_cast<MHCTLPowerInterface*>(iControllerMan));
+			break;
+		
+		case KHCHardResetUid:
+			ret = reinterpret_cast<TAny*>(static_cast<MHardResetInitiator*>(this));   
+			break;
+		default:
+			break;
+		}
+	
+	return ret;
+	}
+
+//Implementation of pure virtuals from MHCTLInterface
+TInt CHCTLUsbOriginal::MhiWriteAclData(const TDesC8& aData)
+	{
+	LOG_FUNC
+	__ASSERT_DEBUG(iChannelObserver, PANIC(KUsbOriginalPanic, ENoChannelObserver));
+	
+	TInt rerr = KErrNotReady;
+	// Send if the power is on.
+	if(iCurrentPowerState == EBTOn && DevicePresent())
+		{
+		rerr = iAclOut->Write(aData);
+		HCI_LOG_FRAME_IF_NO_ERROR(rerr, this, KHCILoggerHostToController | KHCILoggerACLDataFrame, aData);
+		}
+		
+	return rerr;
+	}
+
+TInt CHCTLUsbOriginal::MhiWriteSynchronousData(const TDesC8& aData)
+	{
+	LOG_FUNC
+	__ASSERT_DEBUG(iChannelObserver, PANIC(KUsbOriginalPanic, ENoChannelObserver));
+	
+	ASSERT(EFalse); // TODO Not supported yet
+	
+	TInt rerr = KErrNotReady;
+	// Send if the power is on.
+	if(iCurrentPowerState == EBTOn && DevicePresent())
+		{
+		// TODO insert code here :)
+		HCI_LOG_FRAME_IF_NO_ERROR(rerr, this, KHCILoggerHostToController | KHCILoggerSynchronousDataFrame, aData);
+		}
+	
+	return rerr;
+	}
+
+TInt CHCTLUsbOriginal::MhiWriteCommand(const TDesC8& aData)
+	{
+	LOG_FUNC
+	__ASSERT_DEBUG(iChannelObserver, PANIC(KUsbOriginalPanic, ENoChannelObserver));
+	
+	TInt rerr = KErrNotReady;
+	// Send if the power is on.
+	if(iCurrentPowerState == EBTOn && DevicePresent())
+		{
+		rerr = iControl->Write(aData);
+		HCI_LOG_FRAME_IF_NO_ERROR(rerr, this, KHCILoggerHostToController | KHCILoggerCommandOrEvent, aData);
+		}
+	
+	return rerr;
+	}
+
+void CHCTLUsbOriginal::MhiSetQdpPluginInterfaceFinder(MQdpPluginInterfaceFinder& aQdpPluginInterfaceFinder)
+	{
+	iQdpPluginInterfaceFinder = &aQdpPluginInterfaceFinder;
+	}
+
+void CHCTLUsbOriginal::MhriStartHardReset()
+	{
+	LOG_FUNC
+	iControllerMan->HardReset();
+	}
+
+void CHCTLUsbOriginal::MhiGetAclDataTransportOverhead(TUint& aHeaderSize, TUint& aTrailerSize) const
+	{
+	// Return the transport overhead for ACL data.
+	aHeaderSize = KHCTLAclDataHeaderSize;
+	aTrailerSize = KHCTLAclDataTrailerSize;
+	}
+
+void CHCTLUsbOriginal::MhiGetSynchronousDataTransportOverhead(TUint& aHeaderSize, TUint& aTrailerSize) const
+	{
+	// Return the transport overhead for Synchronous data.
+	aHeaderSize = KHCTLSynchronousDataHeaderSize;
+	aTrailerSize = KHCTLSynchronousDataTrailerSize;
+	}
+
+void CHCTLUsbOriginal::MhiGetCommandTransportOverhead(TUint& aHeaderSize, TUint& aTrailerSize) const
+	{
+	// Return the transport overhead for HCI commands data.
+	aHeaderSize = KHCTLCommandHeaderSize;
+	aTrailerSize = KHCTLCommandTrailerSize;
+	}
+
+/**
+This function is used by the receiver for informing HCI that ACL data has been received
+The receiver doesn't have reference to iDataObserver. So this is merely a wrapper for iDataObserver
+*/
+void CHCTLUsbOriginal::ProcessACLData(const TDesC8& aData)
+	{
+	HCI_LOG_FRAME(this, KHCILoggerControllerToHost | KHCILoggerACLDataFrame, aData);
+	iDataObserver->MhdoProcessAclData(aData);
+	}
+
+/**
+This function is used by the receiver for informing HCI that Synchronous data has been received
+The receiver doesn't have reference to iDataObserver. So this is merely a wrapper for iDataObserver
+*/
+void CHCTLUsbOriginal::ProcessSynchronousData(const TDesC8& aData)
+	{
+	HCI_LOG_FRAME(this, KHCILoggerControllerToHost | KHCILoggerSynchronousDataFrame, aData);
+	iDataObserver->MhdoProcessSynchronousData(aData);
+	}
+
+/**
+This function is used by the receiver for informing HCI that event has been received
+The receiver doesn't have reference to iEventObserver. So this is merely a wrapper for iDataObserver
+*/	
+void CHCTLUsbOriginal::ProcessEvent(const TDesC8& aEvent)
+	{
+	HCI_LOG_FRAME(this, KHCILoggerControllerToHost | KHCILoggerCommandOrEvent, aEvent);
+	iEventObserver->MheoProcessEvent(aEvent);
+	}
+
+/**
+QdpPluginInterfaceFinder getter.
+
+@return returns iQdpPluginInterfaceFinder which could be NULL 
+if it has not been given one.
+*/
+MQdpPluginInterfaceFinder* CHCTLUsbOriginal::QdpPluginInterfaceFinder()
+	{
+	return iQdpPluginInterfaceFinder;
+	}
+
+void CHCTLUsbOriginal::MhiSetDataObserver(MHCTLDataObserver& aDataObserver)
+	{
+	iDataObserver = &aDataObserver;
+	}
+
+void CHCTLUsbOriginal::MhiSetEventObserver(MHCTLEventObserver& aEventObserver)
+	{
+	iEventObserver = &aEventObserver;
+	}
+
+void CHCTLUsbOriginal::MhiSetChannelObserver(MHCTLChannelObserver& aChannelObserver)
+	{
+	iChannelObserver = &aChannelObserver;
+	if(DevicePresent())
+		{
+		iControl->SetChannelObserver(aChannelObserver);
+		iAclOut->SetChannelObserver(aChannelObserver);
+		}
+	HandleChannelStateChange();
+	}
+
+void CHCTLUsbOriginal::MhiSetControllerStateObserver(MControllerStateObserver& aControllerStateObserver)
+	{
+	iControllerStateObserver = &aControllerStateObserver;
+	iControllerMan->SetControllerStateObserver(aControllerStateObserver);
+	}
+
+void CHCTLUsbOriginal::HandleChannelStateChange()
+	{
+	if(iCurrentPowerState == EBTOn && iChannelObserver && DevicePresent())
+		{
+		iDeviceStateMan->Resume();
+		iChannelObserver->MhcoChannelOpen(KHCITransportAllChannels);
+		iAclIn->Start();
+		iEvent->Start();
+		// The senders will be activated when the first frame needs to be sent.
+		}
+	else
+		{
+		if(iChannelObserver)
+			{
+			iChannelObserver->MhcoChannelClosed(KHCITransportAllChannels);
+			}
+		if(DevicePresent())
+			{
+			// abort communication with the hardware
+			iControl->Cancel();
+			iAclOut->Cancel();
+			iAclIn->Cancel();
+			iEvent->Cancel();
+			
+			// try to suspend the device
+			iDeviceStateMan->Suspend();
+			}
+		}
+	}
+
+void CHCTLUsbOriginal::HandlePowerOff()
+	{
+	iCurrentPowerState = EBTOff;
+	HandleChannelStateChange();
+	}
+
+void CHCTLUsbOriginal::HandlePowerOn()
+	{
+	iCurrentPowerState = EBTOn;
+	HandleChannelStateChange();
+	}
+
+TBTPowerState CHCTLUsbOriginal::CurrentPowerState() const
+	{
+	return iCurrentPowerState;
+	}
+
+TInt CHCTLUsbOriginal::SetPower(TBTPowerState aState)
+	{
+	return static_cast<MHCTLPowerInterface*>(iControllerMan)->MhpiSetPower(aState);
+	}
+
+TBool CHCTLUsbOriginal::DevicePresent() const
+	{
+	if(iControl)
+		{
+		__ASSERT_DEBUG(iAclOut && iAclIn && iEvent, PANIC(KUsbOriginalPanic, EPartiallyOpenedInterface));
+		return ETrue;
+		}
+	return EFalse;
+	}
+
+void CHCTLUsbOriginal::DeviceAttachedL(TUint32 aStandardIf, TUint32 aScoIf)
+	{
+	if(iCurrentPowerState == EBTOn)
+		{
+		// If the stack is already powered up then we cannot handle the attach.
+		// Ideally we would inform the user to disconnect and connect the device again.
+		LEAVEL(KErrAlreadyExists);
+		}
+	
+	CleanupStack::PushL(TCleanupItem(CHCTLUsbOriginal::Rollback, this));
+	
+	// Open interface (there should be only 1 setting).
+	LEAVEIFERRORL(iInterface.Open(aStandardIf));
+	TInt aclAltIfCount = iInterface.GetAlternateInterfaceCount();
+	if(aclAltIfCount != 1)
+		{
+		LEAVEIFERRORL(aclAltIfCount); // if it's an error then leave with that
+		LOG1(_L8("ACL interface has %d alternate interfaces instead of 1"), aclAltIfCount);
+		LEAVEL(KErrTotalLossOfPrecision);
+		}
+	
+	// We don't do SCO yet, so just set alt. int. setting 0
+	LEAVEIFERRORL(iScoInterface.Open(aScoIf));
+	LEAVEIFERRORL(iScoInterface.SelectAlternateInterface(0));
+	
+	// Initialise pipe AOs
+	iControl = CHCTLUsbOriginalCommand::NewL(iInterface);
+	iAclOut = CHCTLUsbOriginalAclOut::NewL(iInterface);
+	iAclIn = CHCTLUsbOriginalAclIn::NewL(*this, iInterface);
+	iEvent = CHCTLUsbOriginalEvent::NewL(*this, iInterface);
+	
+	// Pipe AOs should have registered their trans. descriptors so initialise.
+	LEAVEIFERRORL(iInterface.InitialiseTransferDescriptors());
+	
+	// Finally set-up channel observers, if needed
+	if(iChannelObserver)
+		{
+		iControl->SetChannelObserver(*iChannelObserver);
+		iAclOut->SetChannelObserver(*iChannelObserver);
+		}
+	
+	// Ensure we tell everyone what has just happened.
+	TInt err = SetPower(EBTOn);
+	if(err != KErrNone && err != KErrAlreadyExists)
+		{
+		LEAVEIFERRORL(err);
+		}
+	
+	CleanupStack::Pop(this);
+	}
+
+void CHCTLUsbOriginal::DeviceRemoved()
+	{
+	// Cleanup resources.
+	delete iEvent,	iEvent = NULL;
+	delete iAclIn,	iAclIn = NULL;
+	delete iAclOut,	iAclOut = NULL;
+	delete iControl,iControl = NULL;
+	
+	iScoInterface.Close();
+	iInterface.Close();
+	
+	// Ensure we tell everyone what has just happened.
+	static_cast<void>(SetPower(EBTOff));
+	}
+
+void CHCTLUsbOriginal::Rollback(TAny* aPtr)
+	{
+	CHCTLUsbOriginal* self = reinterpret_cast<CHCTLUsbOriginal*>(aPtr);
+	self->DeviceRemoved();
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/src/hctlusboriginalaclin.cpp	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,120 @@
+// Copyright (c) 2007-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:
+// 
+
+/** 
+@file
+@internalComponent
+*/
+
+#include "hctlusboriginalaclin.h"
+
+#include "hctlusboriginal.h"
+#include "hctlusboriginalutils.h"
+
+// These files are included to get HCI specification defined constants.
+#include <bluetooth/hci/hciframe.h>
+#include <bluetooth/hci/event.h>
+
+#include <bluetooth/logger.h>
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, LOG_COMPONENT_HCTL_USB_ORIGINAL);
+#endif
+
+
+CHCTLUsbOriginalAclIn::CHCTLUsbOriginalAclIn(CHCTLUsbOriginal& aHCTLUsbOriginal, RUsbInterface& aInterface)
+	: CActive(EPriorityStandard)
+	, iHCTLUsbOriginal(aHCTLUsbOriginal)
+	, iInterface(aInterface)
+	, iTransfer(CHctlAclDataFrame::KHCTLMaxACLDataSize)
+	{
+	LOG_FUNC
+	CActiveScheduler::Add(this);
+	}
+
+CHCTLUsbOriginalAclIn::~CHCTLUsbOriginalAclIn()
+	{
+	LOG_FUNC
+	Cancel();
+	iPipe.Close();
+	iTransfer.Close();
+	}
+
+CHCTLUsbOriginalAclIn* CHCTLUsbOriginalAclIn::NewL(CHCTLUsbOriginal& aHCTLUsbOriginal, RUsbInterface& aInterface)
+	{
+	LOG_STATIC_FUNC
+	CHCTLUsbOriginalAclIn* self = new(ELeave) CHCTLUsbOriginalAclIn(aHCTLUsbOriginal, aInterface);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+void CHCTLUsbOriginalAclIn::ConstructL()
+	{
+	LOG_FUNC
+	LEAVEIFERRORL(iInterface.RegisterTransferDescriptor(iTransfer));
+	LEAVEIFERRORL(iInterface.OpenPipeForEndpoint(iPipe, KEndpointNumber, EFalse));
+	}
+
+void CHCTLUsbOriginalAclIn::QueueRead()
+	{
+	LOG_FUNC
+	
+	__ASSERT_DEBUG(!IsActive(), PANIC(KUsbOriginalPanic, EReadAttemptWhenReadOutstanding));
+	
+	// I think the spec states that a single ACL packet is contained in a single USB
+	// transaction.  As such we don't need to mess around working out how much to read
+	// we just need to issue a transfer big enough to get all the data possible.
+	// Of course it is unlikely that a controller would batch up that much data - it might be
+	// better to just expect a 3 DH-5 payload size instead...
+	
+	iTransfer.SaveData(iTransfer.WritableBuffer().MaxLength());
+	
+	SetActive();
+	iPipe.Transfer(iTransfer, iStatus);
+	}
+
+void CHCTLUsbOriginalAclIn::RunL()
+	{
+	LOG_FUNC
+	// Only process the read if it has completed successfully.
+	LEAVEIFERRORL(iStatus.Int());
+	iHCTLUsbOriginal.ProcessACLData(iTransfer.Buffer());
+	QueueRead();
+	}
+
+void CHCTLUsbOriginalAclIn::DoCancel()
+	{
+	LOG_FUNC
+	iPipe.CancelAllTransfers();
+	}
+
+TInt CHCTLUsbOriginalAclIn::RunError(TInt aError)
+	{
+	LOG_FUNC
+	LOG1(_L8("\taError = %d"), aError);
+	// The HCTL can not recover from this.  Reset the controller and restart the host.
+	// TODO we should try to handle the case where the device is unpluged.
+	iHCTLUsbOriginal.MhriStartHardReset();
+	return KErrNone;
+	}
+
+void CHCTLUsbOriginalAclIn::Start()
+	{
+	LOG_FUNC
+	__ASSERT_DEBUG(!IsActive(), PANIC(KUsbOriginalPanic, EStartCalledWhenReadOutstanding));
+	QueueRead();
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/src/hctlusboriginalaclout.cpp	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,108 @@
+// Copyright (c) 2007-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:
+// 
+
+/** 
+@file
+@internalComponent
+*/
+
+#include "hctlusboriginalaclout.h"
+
+#include <bluetooth/hci/hctlchannelobserver.h>
+#include <bluetooth/hci/hciframe.h>
+
+#include <bluetooth/logger.h>
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, LOG_COMPONENT_HCTL_USB_ORIGINAL);
+#endif
+
+CHCTLUsbOriginalAclOut::CHCTLUsbOriginalAclOut(RUsbInterface& aInterface)
+	: CActive(EPriorityStandard)
+	, iInterface(aInterface)
+	, iTransfer(CHctlAclDataFrame::KHCTLMaxACLDataSize)
+	{
+	LOG_FUNC
+	CActiveScheduler::Add(this);
+	}
+
+void CHCTLUsbOriginalAclOut::ConstructL()
+	{
+	LOG_FUNC
+	LEAVEIFERRORL(iInterface.RegisterTransferDescriptor(iTransfer));
+	LEAVEIFERRORL(iInterface.OpenPipeForEndpoint(iPipe, KEndpointNumber, EFalse));
+	}
+
+CHCTLUsbOriginalAclOut::~CHCTLUsbOriginalAclOut()
+	{
+	LOG_FUNC
+	Cancel();
+	iPipe.Close();
+	iTransfer.Close();
+	}
+
+CHCTLUsbOriginalAclOut* CHCTLUsbOriginalAclOut::NewL(RUsbInterface& aInterface)
+	{
+	LOG_STATIC_FUNC
+	CHCTLUsbOriginalAclOut* self = new(ELeave) CHCTLUsbOriginalAclOut(aInterface);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+TInt CHCTLUsbOriginalAclOut::Write(const TDesC8& aData)
+	{
+	LOG_FUNC
+	TInt rerr = KErrNone;
+	//Check whether we finished with the previous write
+	if(!IsActive())
+		{
+		// Currently we only support sending one transfer at a time, so close off the channel after a write
+		iChannelObserver->MhcoChannelClosed(KHCITransportACLDataChannel);
+		
+		iTransfer.WritableBuffer() = aData;
+		iTransfer.SaveData(aData.Length());
+		
+		SetActive();
+		iPipe.Transfer(iTransfer, iStatus);
+		}
+	else
+		{
+		LOG(_L8("ERROR: Sender is already active!!\r\n"));
+		rerr = KErrInUse;
+		}
+
+	return rerr;
+	}
+
+void CHCTLUsbOriginalAclOut::SetChannelObserver(MHCTLChannelObserver& aObserver)
+	{
+	LOG_FUNC
+	iChannelObserver = &aObserver;
+	}
+
+void CHCTLUsbOriginalAclOut::RunL()
+	{
+	LOG_FUNC
+	LOG1(_L8("\tiStatus = %d"), iStatus.Int());
+	iChannelObserver->MhcoChannelOpen(KHCITransportACLDataChannel);
+	}
+
+void CHCTLUsbOriginalAclOut::DoCancel()
+	{
+	LOG_FUNC
+	iPipe.CancelAllTransfers();
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/src/hctlusboriginalcommand.cpp	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,101 @@
+// Copyright (c) 2007-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:
+// 
+
+/** 
+@file
+@internalComponent
+*/
+
+#include "hctlusboriginalcommand.h"
+
+#include <bluetooth/hci/hctlchannelobserver.h>
+#include <bluetooth/logger.h>
+
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, LOG_COMPONENT_HCTL_USB_ORIGINAL);
+#endif
+
+CHCTLUsbOriginalCommand::CHCTLUsbOriginalCommand(RUsbInterface& aInterface)
+	: CActive(EPriorityStandard)
+	, iInterface(aInterface)
+	{
+	LOG_FUNC
+	CActiveScheduler::Add(this);
+	
+	// Initialise Ep0 request details.
+	iEp0Details.iRequestType	= 0x20;		// Class request
+	iEp0Details.iRequest		= 0x00;		// All HCI commands are req 0x00.
+	iEp0Details.iValue			= 0x0000;	// N/a for HCI
+	iEp0Details.iIndex			= 0x0000;	// N/a for HCI
+	iEp0Details.iFlags			= 0x04;		// Short transfer OK
+	}
+
+
+CHCTLUsbOriginalCommand::~CHCTLUsbOriginalCommand()
+	{
+	LOG_FUNC
+	Cancel();
+	}
+
+CHCTLUsbOriginalCommand* CHCTLUsbOriginalCommand::NewL(RUsbInterface& aInterface)
+	{
+	LOG_STATIC_FUNC
+	CHCTLUsbOriginalCommand* self = new(ELeave)CHCTLUsbOriginalCommand(aInterface);
+	return self;
+	}
+
+TInt CHCTLUsbOriginalCommand::Write(const TDesC8& aData)
+	{
+	LOG_FUNC
+	TInt rerr = KErrNone;
+	//Check whether we finished with the previous write
+	if(!IsActive())
+		{
+		// We want to send Ep0 commands in a serial fashion (we only use one active object).
+		iChannelObserver->MhcoChannelClosed(KHCITransportCommandChannel);
+		
+		iRecvData.SetLength(0); // We don't receive any data via Ep0 (events come in on a separate pipe).
+		
+		SetActive();
+		iInterface.Ep0Transfer(iEp0Details, aData, iRecvData, iStatus);
+		}
+	else
+		{
+		LOG(_L8("ERROR: Sender is already active!!\r\n"));
+		rerr = KErrInUse;
+		}
+	
+	return rerr;
+	}
+
+void CHCTLUsbOriginalCommand::SetChannelObserver(MHCTLChannelObserver& aObserver)
+	{
+	LOG_FUNC
+	iChannelObserver = &aObserver;
+	}
+
+void CHCTLUsbOriginalCommand::RunL()
+	{
+	LOG_FUNC
+	LOG1(_L8("\tiStatus = %d"), iStatus.Int());
+	iChannelObserver->MhcoChannelOpen(KHCITransportCommandChannel);
+	}
+
+void CHCTLUsbOriginalCommand::DoCancel()
+	{
+	LOG_FUNC
+	// TODO can't do this yet, there is no API available for this...
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/src/hctlusboriginalevent.cpp	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,120 @@
+// Copyright (c) 2007-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:
+// 
+
+/** 
+@file
+@internalComponent
+*/
+
+#include "hctlusboriginalevent.h"
+
+#include "hctlusboriginal.h"
+#include "hctlusboriginalutils.h"
+
+// These files are included to get HCI specification defined constants.
+#include <bluetooth/hci/hciframe.h>
+#include <bluetooth/hci/event.h>
+
+#include <bluetooth/logger.h>
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, LOG_COMPONENT_HCTL_USB_ORIGINAL);
+#endif
+
+static const TInt KMaxEventPacketSize = 0xff + 2; // 8bit code + 8bit total "payload" field
+
+
+CHCTLUsbOriginalEvent::CHCTLUsbOriginalEvent(CHCTLUsbOriginal& aHCTLUsbOriginal, RUsbInterface& aInterface)
+	: CActive(EPriorityStandard)
+	, iHCTLUsbOriginal(aHCTLUsbOriginal)
+	, iInterface(aInterface)
+	, iTransfer(KMaxEventPacketSize)
+	{
+	LOG_FUNC
+	CActiveScheduler::Add(this);
+	}
+
+CHCTLUsbOriginalEvent::~CHCTLUsbOriginalEvent()
+	{
+	LOG_FUNC
+	Cancel();
+	iPipe.Close();
+	iTransfer.Close();
+	}
+
+CHCTLUsbOriginalEvent* CHCTLUsbOriginalEvent::NewL(CHCTLUsbOriginal& aHCTLUsbOriginal, RUsbInterface& aInterface)
+	{
+	LOG_STATIC_FUNC
+	CHCTLUsbOriginalEvent* self = new(ELeave) CHCTLUsbOriginalEvent(aHCTLUsbOriginal, aInterface);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+void CHCTLUsbOriginalEvent::ConstructL()
+	{
+	LOG_FUNC
+	LEAVEIFERRORL(iInterface.RegisterTransferDescriptor(iTransfer));
+	LEAVEIFERRORL(iInterface.OpenPipeForEndpoint(iPipe, KEndpointNumber, EFalse));
+	}
+
+void CHCTLUsbOriginalEvent::QueueRead()
+	{
+	LOG_FUNC
+	
+	__ASSERT_DEBUG(!IsActive(), PANIC(KUsbOriginalPanic, EReadAttemptWhenReadOutstanding));
+	
+	// I think the spec states that a single ACL packet is contained in a single USB
+	// transaction.  As such we don't need to mess around working out how much to read
+	// we just need to issue a transfer big enough to get all the data possible.
+	
+	iTransfer.SaveData(iTransfer.WritableBuffer().MaxLength());
+	
+	SetActive();
+	iPipe.Transfer(iTransfer, iStatus);
+	}
+
+void CHCTLUsbOriginalEvent::RunL()
+	{
+	LOG_FUNC
+	// Only process the read if it has completed successfully.
+	LEAVEIFERRORL(iStatus.Int());
+	iHCTLUsbOriginal.ProcessEvent(iTransfer.Buffer());
+	QueueRead();
+	}
+
+void CHCTLUsbOriginalEvent::DoCancel()
+	{
+	LOG_FUNC
+	iPipe.CancelAllTransfers();
+	}
+
+TInt CHCTLUsbOriginalEvent::RunError(TInt aError)
+	{
+	LOG_FUNC
+	LOG1(_L8("\taError = %d"), aError);
+	// The HCTL can not recover from this.  Reset the controller and restart the host.
+	// TODO we should try to handle the case where the device is unpluged.
+	iHCTLUsbOriginal.MhriStartHardReset();
+	return KErrNone;
+	}
+
+void CHCTLUsbOriginalEvent::Start()
+	{
+	LOG_FUNC
+	__ASSERT_DEBUG(!IsActive(), PANIC(KUsbOriginalPanic, EStartCalledWhenReadOutstanding));
+	QueueRead();
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/src/hctlusboriginalmain.cpp	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,35 @@
+// Copyright (c) 2007-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:
+// 
+
+/** 
+@file
+@internalComponent
+*/
+
+#include <ecom/implementationproxy.h>
+#include "hctlusboriginal.h"
+
+// Define the private interface UIDs
+const TImplementationProxy ImplementationTable[] =
+	{
+	IMPLEMENTATION_PROXY_ENTRY(0x200345E7, CHCTLUsbOriginal::NewL),
+	};
+
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+	{
+	aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+	return ImplementationTable;
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/hctl/src/hctlusboriginalserver.cpp	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,145 @@
+// Copyright (c) 2007-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:
+// 
+
+/**
+@file
+@internalComponent
+*/
+
+#include "hctlusboriginalserver.h"
+
+#include "hctlusboriginal.h"
+#include "hctlusboriginalutils.h"
+#include "hctlusboriginalpolicy.h"
+
+#include <bluetooth/logger.h>
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, LOG_COMPONENT_HCTL_USB_ORIGINAL);
+#endif
+
+
+CHCTLUsbOriginalServer::CHCTLUsbOriginalServer(CHCTLUsbOriginal& aUsbOriginal)
+	: CPolicyServer(CActive::EPriorityStandard, KHCTLUsbOriginalPolicy)
+	, iUsbOriginal(aUsbOriginal)
+	{
+	LOG_FUNC
+	}
+
+void CHCTLUsbOriginalServer::ConstructL()
+	{
+	LOG_FUNC
+	StartL(KHCTLUsbOrginalSrvName);
+	}
+
+CHCTLUsbOriginalServer* CHCTLUsbOriginalServer::NewL(CHCTLUsbOriginal& aUsbOriginal)
+	{
+	LOG_STATIC_FUNC
+	CHCTLUsbOriginalServer* self = new(ELeave) CHCTLUsbOriginalServer(aUsbOriginal);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+CHCTLUsbOriginalServer::~CHCTLUsbOriginalServer()
+	{
+	LOG_FUNC
+	}
+
+CSession2* CHCTLUsbOriginalServer::NewSessionL(const TVersion& aVersion, const RMessage2& /*aMessage*/) const
+	{
+	LOG_FUNC
+	LOG3(_L8("\taVersion = (%d,%d,%d)"), aVersion.iMajor, aVersion.iMinor, aVersion.iBuild);
+		
+	// Version number check...
+	TVersion v(KHCTLUsbOriginalSrvMajorVersionNumber,
+			   KHCTLUsbOriginalSrvMinorVersionNumber,
+			   KHCTLUsbOriginalSrvBuildNumber);
+	
+	if(!User::QueryVersionSupported(v, aVersion))
+		{
+		LEAVEIFERRORL(KErrNotSupported);
+		}
+	
+	if(iSession)
+		{
+		LEAVEIFERRORL(KErrInUse);
+		}
+	
+	iSession = new(ELeave) CHCTLUsbOriginalSession(iUsbOriginal);
+	return iSession;
+	}
+
+void CHCTLUsbOriginalServer::DropSession(CHCTLUsbOriginalSession* aSession) const
+	{
+	__ASSERT_DEBUG(iSession == aSession, PANIC(KUsbOriginalPanic, EBadSessionPointer));
+	iSession = NULL;
+	}
+
+
+
+CHCTLUsbOriginalSession::CHCTLUsbOriginalSession(CHCTLUsbOriginal& aUsbOriginal)
+	: iUsbOriginal(aUsbOriginal)
+	{
+	LOG_FUNC
+	}
+
+CHCTLUsbOriginalSession::~CHCTLUsbOriginalSession()
+	{
+	LOG_FUNC
+	static_cast<const CHCTLUsbOriginalServer*>(Server())->DropSession(this);
+	}
+
+void CHCTLUsbOriginalSession::ServiceL(const RMessage2& aMessage)
+	{
+	LOG_FUNC
+	LOG1(_L("\taMessage.Function() = %d"), aMessage.Function());
+	
+	switch(aMessage.Function())
+		{
+	case EFunctionAttached:
+			{
+			if(iDeviceAttached)
+				{
+				PANIC_MSG(aMessage, KHCTLUsbOriginalServerPanicCat, EDeviceAlreadyAttached);
+				return;
+				}
+			TUint32 aclToken = static_cast<TUint32>(aMessage.Int0());
+			TUint32 scoToken = static_cast<TUint32>(aMessage.Int1());
+			iUsbOriginal.DeviceAttachedL(aclToken, scoToken);
+			iDeviceAttached = ETrue;
+			}
+		break;
+	
+	case EFunctionDetached:
+			{
+			if(!iDeviceAttached)
+				{
+				PANIC_MSG(aMessage, KHCTLUsbOriginalServerPanicCat, EDeviceNotAttached);
+				return;
+				}
+			iUsbOriginal.DeviceRemoved();
+			iDeviceAttached = EFalse;
+			}
+		break;
+	
+	default:
+		PANIC_MSG(aMessage, KHCTLUsbOriginalServerPanicCat, EInvalidFunction);
+		return;
+		}
+	aMessage.Complete(KErrNone);
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/usb_original/readme.txt	Thu Oct 14 11:30:12 2010 +0100
@@ -0,0 +1,51 @@
+This is an implementation of the Bluetooth USB HCTL for the Symbian
+USB Host driver interface.
+
+Note that this implementation is based on the classic "H2" 
+specification, as such it is not completely compatible with the 
+updated version published with the Bluetooth Core Specification 
+3.0+HS (and onwards).
+
+There are two distinct components:
+	* The HCTL Plugin - this provides the Bluetooth transport 
+	  layer adaptation implementation through the USB driver 
+	  interface.
+	* The FDC Plugin - this is receives the driver information 
+	  from the USB Function Driver Framework, it validates the 
+	  device before supplying the notifications of device
+	  attachment/detachment to the HCTL.
+
+Both these components must be present for the system to be
+functional, they can be included in a ROM image with the provided
+iby file:
+	hctl_usb_original.iby
+
+If the reference CoreHCI is in use then a simple macro definition
+is all that is required to include the iby file.  The macro to use
+is HCI_USB; below is an example of its use:
+	buildrom ... -DHCI_USB
+
+To configure the Bluetooth stack to use this driver, the CoreHCI
+implementation must be appropriately configured to use this
+implementation.  Typically this is through an ini file in the
+ESock data cage - in the Symbian file system this would be located:
+
+	z:\private\101f7989\bluetooth\corehci_symbian.ini
+
+In this file you should indicate the HCTL Plugin implementation
+UID (0x200345E7):
+
+	hctl_uid= 0x200345E7
+
+An example configuration is provided in the Symbian reference
+CoreHCI:
+
+	corehci_symbian_usboriginal.ini
+
+This should be all that is required to configure the use of the
+driver.  The FDF should automatically load the FDC plugin when
+a Bluetooth device is attached to the USB bus.  When no device is
+attached then behaviour of the Bluetooth stack is the same as if
+Bluetooth controllers power had been switched off (i.e. through the
+power control API).
+