diff -r 28479eeba3fb -r 83036355c0f3 bthci/hci2implementations/corehcis/symbian/src/HciCorePluginImpl.cpp --- 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#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(iHCTLPlugin->Interface(TUid::Uid(KHCTLInterfaceUid))); - __ASSERT_ALWAYS(hctl, PANIC(KCoreHciPanicCat, EUninitialisedInterface)); - - iHCTLHardResetPerformer = static_cast(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 - (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(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(static_cast(this)); - break; - } - - case KHCIDataFramerInterfaceUid: - { - ret = reinterpret_cast(static_cast(this)); - break; - } - - case KHCICommandAllocatorInterfaceUid: - { - ret = reinterpret_cast(static_cast(this)); - break; - } - - case KHCHardResetUid: - { - ret = reinterpret_cast(static_cast(this)); - break; - } - - case KHCTLInterfaceUid: - { - ret = iHCTLPlugin->Interface(aUid); - break; - } - - case KControllerInitialisationInterfaceUid: - { - if (iInitialisationPlugin != NULL) - { - ret = iInitialisationPlugin->Interface(aUid); - } - break; - } - - case KHCIClientUsageCallbackUid: - { - ret = reinterpret_cast(static_cast(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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#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(iHCTLPlugin->Interface(TUid::Uid(KHCTLInterfaceUid))); + __ASSERT_ALWAYS(hctl, PANIC(KCoreHciPanicCat, EUninitialisedInterface)); + + iHCTLHardResetPerformer = static_cast(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 + (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(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(static_cast(this)); + break; + } + + case KHCIDataFramerInterfaceUid: + { + ret = reinterpret_cast(static_cast(this)); + break; + } + + case KHCICommandAllocatorInterfaceUid: + { + ret = reinterpret_cast(static_cast(this)); + break; + } + + case KHCHardResetUid: + { + ret = reinterpret_cast(static_cast(this)); + break; + } + + case KHCTLInterfaceUid: + { + ret = iHCTLPlugin->Interface(aUid); + break; + } + + case KControllerInitialisationInterfaceUid: + { + if (iInitialisationPlugin != NULL) + { + ret = iInitialisationPlugin->Interface(aUid); + } + break; + } + + case KHCIClientUsageCallbackUid: + { + ret = reinterpret_cast(static_cast(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 +