diff -r 000000000000 -r 29b1cd4cb562 bthci/hci2implementations/CommandsEvents/symbian/src/Event.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bthci/hci2implementations/CommandsEvents/symbian/src/Event.cpp Fri Jan 15 08:13:17 2010 +0200 @@ -0,0 +1,1703 @@ +// 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 +#include +#include +#include + +#include +#include +#include +#include + +// Complete Event Class Headers +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +// Event Class Headers +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "symbiancommandseventsutils.h" + + + +#ifdef __FLOG_ACTIVE +_LIT8(KLogComponent, LOG_COMPONENT_COMMANDSEVENTS_SYMBIAN); +#endif + +THCIEventBase::THCIEventBase(THCIEventCode aEventCode, TUint8 aParameterTotalLength, + TDes8& aEventData) + : + iErrorCode(EOK) + { + PutEventCode(aEventCode, aEventData); // Event code + PutTUint8(aParameterTotalLength, aEventData); // Parameter_Total_Length (in octets) + + // It is the responsibility of the most derived class to set iEventData + // from aEventData after event-specific data has been added in. + } + +EXPORT_C THCIEventBase::THCIEventBase(const TDesC8& aEventData) + : + iErrorCode(EOK), + iEventData(aEventData) + { + } + +EXPORT_C THCIEventCode THCIEventBase::EventCode() const + { + return(static_cast(iEventData[0])); + } + +EXPORT_C THCIErrorCode THCIEventBase::ErrorCode() const + { + return(iErrorCode); + } + +TInt THCIEventBase::CreateAndSendCommandCompleteEvent(const TDesC8& aEventData, + MHCICommandEventObserver& aEventObserver) + { + // Switch on Op Code. + __ASSERT_ALWAYS(aEventData.Length() >= KEventCommonFieldsLength + THCICommandCompleteEvent::KCommandCompleteCommonFieldsLength, + PANIC(KSymbianCommandsEventsPanicCat, EInvalidReceivedEventLength)); + THCIOpcode opcode((aEventData[4] << 8) | aEventData[3]); + + if ((opcode & KVendorDebugOGF) == KVendorDebugOGF) + { + // We don't know anything else about the opcode other than it + // corresponds to a vendor command + TVendorDebugCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + return KErrNone; + } + + switch(opcode) + { + // Nop + + case KNopOpcode: + { + TNopCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + + case KInquiryCancelOpcode: + { + TInquiryCancelCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KPeriodicInquiryModeOpcode: + { + TPeriodicInquiryModeCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KExitPeriodicInquiryModeOpcode: + { + TExitPeriodicInquiryModeCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KCreateConnectionCancelOpcode: + { + TCreateConnectionCancelCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KLinkKeyRequestReplyOpcode: + { + TLinkKeyRequestReplyCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KLinkKeyRequestReplyNegativeOpcode: + { + TLinkKeyRequestReplyNegativeCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KPINCodeRequestReplyOpcode: + { + TPINCodeRequestReplyCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KPINCodeRequestReplyNegativeOpcode: + { + TPINCodeRequestReplyNegativeCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KRemoteNameRequestCancelOpcode: + { + TRemoteNameRequestCancelCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadLMPHandleOpcode: + { + TReadLMPHandleCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KIOCapabilityRequestReplyOpcode: + { + TIOCapabilityRequestReplyCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KUserConfirmationRequestReplyOpcode: + { + TUserConfirmationRequestReplyCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KUserConfirmationRequestNegativeReplyOpcode: + { + TUserConfirmationRequestNegativeReplyCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KUserPasskeyRequestReplyOpcode: + { + TUserPasskeyRequestReplyCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KUserPasskeyRequestNegativeReplyOpcode: + { + TUserPasskeyRequestNegativeReplyCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KRemoteOOBDataRequestReplyOpcode: + { + TRemoteOOBDataRequestReplyCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KRemoteOOBDataRequestNegativeReplyOpcode: + { + TRemoteOOBDataRequestNegativeReplyCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KIOCapabilityRequestNegativeReplyOpcode: + { + TIOCapabilityRequestNegativeReplyCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + + // Link Policy + + case KRoleDiscoveryOpcode: + { + TRoleDiscoveryCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadLinkPolicySettingsOpcode: + { + TReadLinkPolicySettingsCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteLinkPolicySettingsOpcode: + { + TWriteLinkPolicySettingsCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadDefaultLinkPolicySettingsOpcode: + { + TReadDefaultLinkPolicySettingsCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteDefaultLinkPolicySettingsOpcode: + { + TWriteDefaultLinkPolicySettingsCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KSniffSubratingOpcode: + { + TSniffSubratingCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + + // Controller and Baseband + + case KSetEventMaskOpcode: + { + TSetEventMaskCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KResetOpcode: + { + TResetCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KSetEventFilterOpcode: + { + TSetEventFilterCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KFlushOpcode: + { + TFlushCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadPINTypeOpcode: + { + TReadPINTypeCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWritePINTypeOpcode: + { + TWritePINTypeCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KCreateNewUnitKeyOpcode: + { + TCreateNewUnitKeyCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadStoredLinkKeyOpcode: + { + TReadStoredLinkKeyCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteStoredLinkKeyOpcode: + { + TWriteStoredLinkKeyCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KDeleteStoredLinkKeyOpcode: + { + TDeleteStoredLinkKeyCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteLocalNameOpcode: + { + TWriteLocalNameCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadLocalNameOpcode: + { + TReadLocalNameCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadConnectionAcceptTimeoutOpcode: + { + TReadConnectionAcceptTimeoutCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteConnectionAcceptTimeoutOpcode: + { + TWriteConnectionAcceptTimeoutCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadPageTimeoutOpcode: + { + TReadPageTimeoutCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWritePageTimeoutOpcode: + { + TWritePageTimeoutCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadScanEnableOpcode: + { + TReadScanEnableCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteScanEnableOpcode: + { + TWriteScanEnableCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadPageScanActivityOpcode: + { + TReadPageScanActivityCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWritePageScanActivityOpcode: + { + TWritePageScanActivityCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadInquiryScanActivityOpcode: + { + TReadInquiryScanActivityCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteInquiryScanActivityOpcode: + { + TWriteInquiryScanActivityCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadAuthenticationEnableOpcode: + { + TReadAuthenticationEnableCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteAuthenticationEnableOpcode: + { + TWriteAuthenticationEnableCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadClassOfDeviceOpcode: + { + TReadClassOfDeviceCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteClassOfDeviceOpcode: + { + TWriteClassOfDeviceCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadVoiceSettingOpcode: + { + TReadVoiceSettingCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteVoiceSettingOpcode: + { + TWriteVoiceSettingCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadAutomaticFlushTimeoutOpcode: + { + TReadAutomaticFlushTimeoutCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteAutomaticFlushTimeoutOpcode: + { + TWriteAutomaticFlushTimeoutCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadNumBroadcastRetransmissionsOpcode: + { + TReadNumBroadcastRetransmissionsCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteNumBroadcastRetransmissionsOpcode: + { + TWriteNumBroadcastRetransmissionsCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadHoldModeActivityOpcode: + { + TReadHoldModeActivityCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteHoldModeActivityOpcode: + { + TWriteHoldModeActivityCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadTransmitPowerLevelOpcode: + { + TReadTransmitPowerLevelCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadSynchronousFlowControlEnableOpcode: + { + TReadSynchronousFlowControlEnableCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteSynchronousFlowControlEnableOpcode: + { + TWriteSynchronousFlowControlEnableCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KSetControllerToHostFlowControlOpcode: + { + TSetControllerToHostFlowControlCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KHostBufferSizeOpcode: + { + THostBufferSizeCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KHostNumberOfCompletedPacketsOpcode: + { + THostNumberOfCompletedPacketsCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadLinkSupervisionTimeoutOpcode: + { + TReadLinkSupervisionTimeoutCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteLinkSupervisionTimeoutOpcode: + { + TWriteLinkSupervisionTimeoutCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadNumberOfSupportedIACOpcode: + { + TReadNumberOfSupportedIACCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadCurrentIACLAPOpcode: + { + TReadCurrentIACLAPCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteCurrentIACLAPOpcode: + { + TWriteCurrentIACLAPCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KSetAFHHostChannelClassificationOpcode: + { + TSetAFHHostChannelClassificationCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadInquiryScanTypeOpcode: + { + TReadInquiryScanTypeCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteInquiryScanTypeOpcode: + { + TWriteInquiryScanTypeCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadInquiryModeOpcode: + { + TReadInquiryModeCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteInquiryModeOpcode: + { + TWriteInquiryModeCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadPageScanTypeOpcode: + { + TReadPageScanTypeCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWritePageScanTypeOpcode: + { + TWritePageScanTypeCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadAFHChannelAssessmentModeOpcode: + { + TReadAFHChannelAssessmentModeCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteAFHChannelAssessmentModeOpcode: + { + TWriteAFHChannelAssessmentModeCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadExtendedInquiryResponseOpcode: + { + TReadExtendedInquiryResponseCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteExtendedInquiryResponseOpcode: + { + TWriteExtendedInquiryResponseCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadSimplePairingModeOpcode: + { + TReadSimplePairingModeCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteSimplePairingModeOpcode: + { + TWriteSimplePairingModeCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadLocalOOBDataOpcode: + { + TReadLocalOOBDataCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadInquiryResponseTransmitPowerLevelOpcode: + { + TReadInquiryResponseTransmitPowerLevelCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteInquiryResponseTransmitPowerLevelOpcode: + { + TWriteInquiryResponseTransmitPowerLevelCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KSendKeypressNotificationOpcode: + { + TSendKeypressNotificationCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadDefaultErroneousDataReportingOpcode: + { + TReadDefaultErroneousDataReportingCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteDefaultErroneousDataReportingOpcode: + { + TWriteDefaultErroneousDataReportingCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + + // Informational Parameters + + case KReadLocalVersionInfoOpcode: + { + TReadLocalVersionInfoCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadLocalSupportedCommandsOpcode: + { + TReadLocalSupportedCommandsCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadLocalSupportedFeaturesOpcode: + { + TReadLocalSupportedFeaturesCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadLocalExtendedFeaturesOpcode: + { + TReadLocalExtendedFeaturesCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadBufferSizeOpcode: + { + TReadBufferSizeCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadBdaddrOpcode: + { + TReadBdaddrCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + + // Status Parameters + + case KReadFailedContactCounterOpcode: + { + TReadFailedContactCounterCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KResetFailedContactCounterOpcode: + { + TResetFailedContactCounterCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadLinkQualityOpcode: + { + TReadLinkQualityCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadRSSIOpcode: + { + TReadRSSICompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadAFHChannelMapOpcode: + { + TReadAFHChannelMapCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadClockOpcode: + { + TReadClockCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + + // Testing Commmands + + case KReadLoopbackModeOpcode: + { + TReadLoopbackModeCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteLoopbackModeOpcode: + { + TWriteLoopbackModeCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KEnableDeviceUnderTestModeOpcode: + { + TEnableDeviceUnderTestModeCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteSimplePairingDebugModeOpcode: + { + TWriteSimplePairingDebugModeCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + // Deprecated (in the Bluetooth specification) + + case KReadPageScanPeriodOpcode: + { + TReadPageScanPeriodCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWritePageScanPeriodOpcode: + { + TWritePageScanPeriodCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KReadEncryptionModeOpcode: + { + TReadEncryptionModeCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case KWriteEncryptionModeOpcode: + { + TWriteEncryptionModeCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + // Unknown command complete event. + default: + return KErrNotFound; + }; + + return KErrNone; + } + +EXPORT_C /*static*/ TInt THCIEventBase::CreateAndSendEvent(const TDesC8& aEventData, + MHCICommandEventObserver& aEventObserver, + MHCIDataEventObserver& aDataEventObserver, + TAny* /*aObserver*/) + { + TInt rerr = KErrNone; + + if(aEventData.Length() >= KEventCommonFieldsLength + && aEventData.Length() >= KEventCommonFieldsLength + aEventData[KTotalParameterLengthOffset]) + { + // Switch on the event code. + switch(aEventData[KEventCodeOffset]) + { + case EInquiryCompleteEvent: + { + TInquiryCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EInquiryResultEvent: + { + TInquiryResultEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EConnectionCompleteEvent: + { + TConnectionCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EConnectionRequestEvent: + { + TConnectionRequestEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EDisconnectionCompleteEvent: + { + TDisconnectionCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EAuthenticationCompleteEvent: + { + TAuthenticationCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case ERemoteNameReqCompleteEvent: + { + TRemoteNameReqCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EEncryptionChangeEvent: + { + TEncryptionChangeEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EChangeLinkKeyEvent: + { + TChangeLinkKeyEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EMasterLinkKeyEvent: + { + TMasterLinkKeyEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EReadRemSuppFeatCompleteEvent: + { + TReadRemSuppFeatCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EReadRemVerInfoCompleteEvent: + { + TReadRemVerInfoCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EQOSSetupCompleteEvent: + { + TQOSSetupCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case ECommandCompleteEvent: + { + rerr = CreateAndSendCommandCompleteEvent(aEventData, + aEventObserver); + } + break; + + case ECommandStatusEvent: + { + TCommandStatusEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EHardwareErrorEvent: + { + THardwareErrorEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EFlushOccurredEvent: + { + TFlushOccurredEvent event(aEventData); + aDataEventObserver.MhdeoEventNotification(event); + } + break; + + case ERoleChangeEvent: + { + TRoleChangeEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case ENumberOfCompletedPacketsEvent: + { + TNumberOfCompletedPacketsEvent event(aEventData); + aDataEventObserver.MhdeoEventNotification(event); + } + break; + + case EModeChangeEvent: + { + TModeChangeEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EReturnLinkKeysEvent: + { + TReturnLinkKeysEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EPINCodeRequestEvent: + { + TPINCodeRequestEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case ELinkKeyRequestEvent: + { + TLinkKeyRequestEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case ELinkKeyNotificationEvent: + { + TLinkKeyNotificationEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case ELoopbackCommandEvent: + { + TLoopbackCommandEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EDataBufferOverflowEvent: + { + TDataBufferOverflowEvent event(aEventData); + aDataEventObserver.MhdeoEventNotification(event); + } + break; + + case EMaxSlotsChangeEvent: + { + TMaxSlotsChangeEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EReadClockOffsetEvent: + { + TReadClockOffsetEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EConnectionPacketTypeChangedEvent: + { + TConnectionPacketTypeChangedEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EQOSViolationEvent: + { + TQOSViolationEvent event(aEventData); + aDataEventObserver.MhdeoEventNotification(event); + } + break; + + case EPageScanRepetitionModeChangeEvent: + { + TPageScanRepetitionModeChangeEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EFlowSpecificationCompleteEvent: + { + TFlowSpecificationCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EInquiryResultwithRSSIEvent: + { + TInquiryResultwithRSSIEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EReadRemoteExtendedFeaturesCompleteEvent: + { + TReadRemoteExtendedFeaturesCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case ESynchronousConnectionCompleteEvent: + { + TSynchronousConnectionCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case ESynchronousConnectionChangedEvent: + { + TSynchronousConnectionChangedEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case ESniffSubratingEvent: + { + TSniffSubratingEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EExtendedInquiryResultEvent: + { + TExtendedInquiryResultEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EEncryptionKeyRefreshCompleteEvent: + { + TEncryptionKeyRefreshCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EIOCapabilityRequestEvent: + { + TIOCapabilityRequestEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EIOCapabilityResponseEvent: + { + TIOCapabilityResponseEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EUserConfirmationRequestEvent: + { + TUserConfirmationRequestEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EUserPasskeyRequestEvent: + { + TUserPasskeyRequestEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case ERemoteOOBDataRequestEvent: + { + TRemoteOOBDataRequestEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case ESimplePairingCompleteEvent: + { + TSimplePairingCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case ELinkSupervisionTimeoutChangedEvent: + { + TLinkSupervisionTimeoutChangedEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EEnhancedFlushCompleteEvent: + { + TEnhancedFlushCompleteEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EUserPasskeyNotificationEvent: + { + TUserPasskeyNotificationEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EKeypressNotificationEvent: + { + TKeypressNotificationEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case ERemoteHostSupportedFeaturesNotificationEvent: + { + TRemoteHostSupportedFeaturesNotificationEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + // Deprecated (in the Bluetooth specification) events + case EPageScanModeChangeEvent: + { + TPageScanModeChangeEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + // Special case events + case EVendorDebugEvent: + { + TVendorDebugEvent event(aEventData); + aEventObserver.MhceoEventNotification(event); + } + break; + + case EBTLogoTestingEvent: + break; + + // Unknown event + default: + rerr = KErrUnknown; + break; + }; + } + else + { + rerr = KErrCorrupt; + } + return rerr; + } + +EXPORT_C TUint8 THCIEventBase::AsTUint8(TInt aOffset) const + { + return iEventData[aOffset]; + } + +EXPORT_C TUint8 THCIEventBase::AsTUint8(TInt aOffset, TInt aArrayBlockSize, TInt aIndex) const + { + return AsTUint8(aOffset + (aIndex * aArrayBlockSize)); + } + +EXPORT_C TUint16 THCIEventBase::AsTUint16(TInt aOffset) const + { + return TUint16((iEventData[aOffset + 1] << 8) + iEventData[aOffset]); + } + +EXPORT_C TUint16 THCIEventBase::AsTUint16(TInt aOffset, TInt aArrayBlockSize, TInt aIndex) const + { + return AsTUint16(aOffset + (aIndex * aArrayBlockSize)); + } + +EXPORT_C TUint32 THCIEventBase::AsTUint32(TInt aOffset, TUint8 aSize) const + { + TUint32 value = 0; + + switch (aSize) + { + case 4: + value = iEventData[aOffset + 3] << 24; // Fallthrough + case 3: + value += iEventData[aOffset + 2] << 16; + value += iEventData[aOffset + 1] << 8; + value += iEventData[aOffset]; + break; + default: + PANIC(KSymbianCommandsEventsPanicCat, EParameterOutOfBounds); + break; + } + + return value; + } + +EXPORT_C TUint32 THCIEventBase::AsTUint32(TInt aOffset, TInt aArrayBlockSize, TInt aIndex, TUint8 aSize) const + { + return AsTUint32(aOffset + (aIndex * aArrayBlockSize), aSize); + } + +EXPORT_C TUint64 THCIEventBase::AsTUint64(TInt aOffset) const + { + TUint tmp = 0; + tmp = AsTUint32(aOffset, 4); + TUint64 value = tmp; + tmp = AsTUint32(aOffset + 4, 4); + value |= static_cast(tmp) << 32; + return value; + } + +EXPORT_C TUint64 THCIEventBase::AsTUint64(TInt aOffset, TInt aArrayBlockSize, TInt aIndex) const + { + return AsTUint64(aOffset + (aIndex * aArrayBlockSize)); + } + +EXPORT_C TPtrC8 THCIEventBase::AsString(TInt aOffset) const + { + return TPtrC8(iEventData.Right(iEventData.Length() - aOffset)); + } + +EXPORT_C TPtrC8 THCIEventBase::AsNullTerminatedString(TInt aOffset) const + { + TPtrC8 fullPtr(iEventData.Right(iEventData.Length() - aOffset)); + TPtrC8 retPtr(fullPtr.Ptr()); + __ASSERT_ALWAYS(retPtr.Length() <= fullPtr.Length(), PANIC(KSymbianCommandsEventsPanicCat, ENullTerminatedStringWasNotNullTerminated)); + return retPtr; + } + +EXPORT_C TPtrC8 THCIEventBase::AsBluetoothDeviceName(TInt aOffset) const + { + TPtrC8 fullPtr(iEventData.Right(iEventData.Length() - aOffset)); + TInt len = 0; + const TUint8* pS = fullPtr.Ptr(); + while(*pS && len < KHCILocalDeviceNameMaxLength) + { + pS++; + len++; + } + TPtrC8 retPtr(fullPtr.Left(len)); + __ASSERT_ALWAYS(retPtr.Length() <= fullPtr.Length(), PANIC(KSymbianCommandsEventsPanicCat, ENullTerminatedStringWasNotNullTerminated)); + return retPtr; + } + +EXPORT_C TBTDevAddr THCIEventBase::AsDevAddr(TInt aOffset) const + { + TBTDevAddr addr; + for (TInt i=0;i(AsTUint16(aOffset))); + } + +EXPORT_C THCIConnectionHandle THCIEventBase::AsConnectionHandle(TInt aOffset, TInt aArrayBlockSize, TInt aIndex) const + { + return AsConnectionHandle(aOffset + (aIndex * aArrayBlockSize)); + } + +EXPORT_C TInt8 THCIEventBase::AsTInt8(TInt aOffset) const + { + return iEventData[aOffset]; + } + +EXPORT_C TInt8 THCIEventBase::AsTInt8(TInt aOffset, TInt aArrayBlockSize, TInt aIndex) const + { + return AsTInt8(aOffset + (aIndex * aArrayBlockSize)); + } + +void THCIEventBase::PutEventCode(const THCIEventCode aValue, TDes8& aEventData) + { + TUint8 eventCode = TUint8(aValue); // the event code is a one octet quantity. + aEventData.Append(&eventCode, 1); + } + +void THCIEventBase::PutTUint8(TUint8 aValue, TDes8& aEventData) + { + aEventData.Append(&aValue, 1); + } + +void THCIEventBase::PutTInt8(TInt8 aValue, TDes8& aEventData) + { + aEventData.Append(*reinterpret_cast(&aValue)); + } + +void THCIEventBase::PutTUint16(TUint16 aValue, TDes8& aEventData) + { + TUint8 val[2] = {aValue & 0xff, aValue >> 8}; + aEventData.Append(val, 2); + } + +void THCIEventBase::PutTUint32(TUint32 aValue, TUint8 aSize, TDes8& aEventData) + { + TUint8 val[4]; + switch (aSize) + { + // deliberate fallthroughs... + case 4: + val[3] = TUint8(aValue>>24); + case 3: + val[2] = TUint8(aValue>>16 & 0xff); + case 2: + val[1] = TUint8(aValue>>8 & 0xff); + case 1: + val[0] = TUint8(aValue & 0xff); + break; + default: + PANIC(KSymbianCommandsEventsPanicCat, EParameterOutOfBounds); + } + aEventData.Append(val, aSize); + } + +void THCIEventBase::PutTUint64(TUint64 aValue, TDes8& aEventData) + { + const TUint32 K32BitMask = 0xFFFFFFFF; + PutTUint32(aValue & K32BitMask, 4, aEventData); + PutTUint32((aValue >> 32) & K32BitMask, 4, aEventData); + } + +void THCIEventBase::PutString(const TDesC8& aString, TDes8& aEventData) + { + aEventData.Append(aString); + } + +void THCIEventBase::PutPaddedString(const TDesC8& aString, TInt aRequiredLength, TDes8& aEventData) + { + __ASSERT_DEBUG(aRequiredLength >= aString.Length(), PANIC(KSymbianCommandsEventsPanicCat, EMoreEventDataThanRequired)); + PutString(aString, aEventData); + const TChar padByte = '\0'; + aEventData.AppendFill(padByte, aRequiredLength - aString.Length()); + } + +void THCIEventBase::PutDevAddr(const TBTDevAddr& aBdaddr, TDes8& aEventData) + { + for (TUint i=0;i