--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/CommandsEvents/symbian/src/Command.cpp Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,194 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include <bluetooth/hci/command.h>
+#include <bluetooth/hci/commandstatusevent.h>
+#include <bluetooth/hci/event.h>
+#include <bluetooth/hci/commandcompleteevent.h>
+#include <bluetooth/hci/hcievents.h>
+#include <bluetooth/hci/hciframe.h>
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, LOG_COMPONENT_COMMANDSEVENTS_SYMBIAN);
+#endif
+
+
+/*************** CHCICommandBase *******************************************/
+
+EXPORT_C THCIOpcode CHCICommandBase::Opcode() const
+ {
+ return(iOpcode);
+ }
+
+CHCICommandBase::CHCICommandBase(THCIOpcode aOpcode)
+ : iOpcode(aOpcode)
+ , iCreditsConsumed(1) // Default is 1 consumed credit.
+ , iExpectsCommandStatusEvent(ETrue) // Default is command status event is expected
+ , iExpectsCommandCompleteEvent(ETrue) // Default is command complete event is expected
+ {
+ }
+
+/**
+Method to get the number of credits consumed by command.
+@return The number of credits consumed by issuing this command.
+*/
+
+EXPORT_C TUint CHCICommandBase::CreditsConsumed() const
+ {
+ return iCreditsConsumed;
+ }
+
+/**
+Method to say whether the command will normally result in a corresponding
+Command Status event in response.
+@return ETrue if a command status event is expected, otherwise EFalse.
+*/
+
+EXPORT_C TBool CHCICommandBase::ExpectsCommandStatusEvent() const
+ {
+ return iExpectsCommandStatusEvent;
+ }
+
+/**
+Method to say whether the command will normally result in a corresponding
+Command Complete event in response.
+@return ETrue if a command complete event is expected, otherwise EFalse.
+*/
+
+EXPORT_C TBool CHCICommandBase::ExpectsCommandCompleteEvent() const
+ {
+ return iExpectsCommandCompleteEvent;
+ }
+
+/**
+Method to change the number of command credits consumed by the command.
+Note: This will typically only be called in a constructor as it is a static
+property of a command.
+@param aConsumedCredits The number of credits the command consumes.
+*/
+void CHCICommandBase::SetCreditsConsumed(TUint aConsumedCredits)
+ {
+ iCreditsConsumed = aConsumedCredits;
+ }
+
+/**
+Method to change whether a command status event is expected by the command.
+Note: This will typically only be called in a constructor as it is a static
+property of a command.
+@param aExpectsCmdStatus ETrue if a command status event is expected, otherwise EFalse
+*/
+void CHCICommandBase::SetExpectsCommandStatusEvent(TBool aExpectsCmdStatus)
+ {
+ iExpectsCommandStatusEvent = aExpectsCmdStatus;
+ }
+
+/**
+Method to change whether a command complete event is expected by the command.
+Note: This will typically only be called in a constructor as it is a static
+property of a command.
+@param aExpectsCmdComplete ETrue if a command complete event is expected, otherwise EFalse
+*/
+void CHCICommandBase::SetExpectsCommandCompleteEvent(TBool aExpectsCmdComplete)
+ {
+ iExpectsCommandCompleteEvent = aExpectsCmdComplete;
+ }
+
+/**
+Baseclass method to say whether the command is matched by the specified event. Can be called
+from the derived class method as a first attempt to establish a match before using more
+command-specific logic in the derived class.
+*/
+
+/* virtual */ void CHCICommandBase::Match(const THCIEventBase& aEvent, TBool& aMatchesCmd, TBool& aConcludesCmd, TBool& aContinueMatching) const
+ {
+ THCIEventCode eventCode(aEvent.EventCode());
+
+ if (eventCode == ECommandCompleteEvent)
+ {
+ THCICommandCompleteEvent& event = THCICommandCompleteEvent::Cast(aEvent);
+ aMatchesCmd = (event.CommandOpcode() == Opcode());
+ aConcludesCmd = aMatchesCmd;
+ aContinueMatching = !aMatchesCmd;
+ }
+ else if (eventCode == ECommandStatusEvent)
+ {
+ TCommandStatusEvent& event = TCommandStatusEvent::Cast(aEvent);
+ aMatchesCmd = (event.CommandOpcode() == Opcode());
+ // If the status is an error then this event concludes the command
+ aConcludesCmd = (aMatchesCmd && (event.ErrorCode() != EOK));
+ aContinueMatching = !aMatchesCmd;
+ }
+ else
+ {
+ aMatchesCmd = EFalse;
+ aConcludesCmd = EFalse;
+ aContinueMatching = EFalse;
+ }
+ }
+
+CHCICommandBase::~CHCICommandBase()
+ {
+ delete iCommandBaseExtension;
+ }
+
+/**
+Method to format the command into the format required by the HCTL. Delegates
+most of the work to the pure virtual Format implementation in the derived class
+*/
+EXPORT_C void CHCICommandBase::FormatCommand(CHctlCommandFrame& aCommandFrame)
+ {
+ // Write the Command Op code into the string.
+ aCommandFrame.SetOpcode(iOpcode);
+
+ // Format the rest of the command.
+ Format(aCommandFrame);
+ aCommandFrame.FinaliseCommand();
+ }
+
+/**
+This function should be called to initialise the CHCICommandBase completely.
+As such it should always be called by the factory function (NewL) of any class
+that derives from CHCICommandBase.
+*/
+void CHCICommandBase::BaseConstructL()
+ {
+ // gain access to completing event methods
+ iCommandBaseExtension = CHCICommandBaseExtension::NewL();
+ }
+
+/**
+Extension function. Use this to retrieve any extension interfaces to CHCICommandBase.
+It is essential that any class that derives from this class overload and then call
+this function.
+*/
+TInt CHCICommandBase::Extension_(TUint aExtensionId, TAny*& aInterface, TAny* aData)
+ {
+ if (aExtensionId == KCompletingEventExpectUid && iCommandBaseExtension)
+ {
+ if (iCommandBaseExtension->CompletingEventQueryHelper())
+ {
+ aInterface = static_cast<MHCICompletingEventQuery*>(iCommandBaseExtension->CompletingEventQueryHelper());
+ return KErrNone;
+ }
+ }
+
+ return CBase::Extension_(aExtensionId, aInterface, aData);
+ }
+