diff -r 000000000000 -r 29b1cd4cb562 bthci/bthci2/hcicmdq/src/HciCommandQItem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bthci/bthci2/hcicmdq/src/HciCommandQItem.cpp Fri Jan 15 08:13:17 2010 +0200 @@ -0,0 +1,384 @@ +// 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 "HciCmdQTimer.h" +#include "HciCmdQUtil.h" + +#include +#include +#include +#include +#include + +#ifdef __FLOG_ACTIVE +_LIT8(KLogComponent, LOG_COMPONENT_HCICMDQ); +#endif + +/** +Static factory method for HCI Command Queue items. + +@param aCommandAllocator the HCI commmand frame allocator. +@param aCmdProgressRecipient the HCI event notification client. +@param aCommand the HCI command to be processed. Ownership of the command is transferred to + the created HCI Command Queue item object. +@return ownership of a new HCI Command Queue item object +*/ +EXPORT_C /*static*/ CHCICommandQItem* CHCICommandQItem::NewL(MHCICommandAllocator& aCommandAllocator, + MHCICommandQueueClient& aCmdProgressRecipient, + CHCICommandBase* aCommand) + { + LOG_STATIC_FUNC + + CleanupStack::PushL(aCommand); // Ensure we don't leak the command until ownership is taken. + CHCICommandQItem* self = new (ELeave) CHCICommandQItem(aCmdProgressRecipient, aCommand); + CleanupStack::Pop(aCommand); + CleanupStack::PushL(self); + self->ConstructL(aCommandAllocator); + CleanupStack::Pop(self); + return self; + } + +EXPORT_C CHCICommandQItem::~CHCICommandQItem() + { + LOG_FUNC + + iLink.Deque(); + delete iCompletionTimer; + delete iCommand; + delete iCmdFrame; + delete iQdpData; + } + +/** +Const getter for the Command encapsulated in the object. + +@return Reference to the CHCICommandBase instance holding the command parameters. +*/ +EXPORT_C CHCICommandBase& CHCICommandQItem::Command() const + { + LOG_FUNC + + return *iCommand; + } + +/** +Getter for the client to be notified of the progress of the command + +@return Reference to the MHCICommandQueueClient instance to be notified + of the progress of the command +*/ +EXPORT_C MHCICommandQueueClient* CHCICommandQItem::Client() const + { + LOG_FUNC + + return iCmdProgressRecipient; + } + +/** +Getter for the pointer to the QDP specific data associated with the queue item. + +@return A pointer to an arbitrary data structure used by the QDP. +*/ +EXPORT_C TAny* CHCICommandQItem::QdpData() const + { + LOG_FUNC + + return iQdpData; + } + +/** +Setter for the pointer to the QDP specific data associated with the queue item. + +@param aQdpData A pointer to some data used by the QDP to be associated with this queue item. +*/ +EXPORT_C void CHCICommandQItem::SetQdpData(TAny* aQdpData) + { + LOG_FUNC + __ASSERT_DEBUG(!iQdpData, PANIC(KHCICmdQPanic, EPossibleQdpDataLeak)); + iQdpData = aQdpData; + } + +/** +Return if a Command Status event has been received that matches the command associated +with this command queue item. + +@return whether this command has received a command status event. +*/ +EXPORT_C TBool CHCICommandQItem::ReceivedCmdStatusEvent() const + { + LOG_FUNC + return ((iCommandState & EReceivedCmdStatusEvent)); + } + +/** +Return if the command associated with this queue item was added to the command +queue as an initialisation command. + +@return whether this command is an initialisation command. +*/ +EXPORT_C TBool CHCICommandQItem::IsInitialisation() const + { + LOG_FUNC + return ((iCommandState & EInitialisationCmd)); + } + +/** +Return if the command associated with this queue item is a Parent command, i.e. +one that has pre and/or post child commands. + +@return whether this command is a Parent command. +*/ +EXPORT_C TBool CHCICommandQItem::IsParent() const + { + LOG_FUNC + return (iType == EParent); + } + +/** +Return if the command associated with this queue item is a Pre-Child command, i.e. +one that has Parent command. + +@return whether this command is a Pre-Child command. +*/ +EXPORT_C TBool CHCICommandQItem::IsPreChild() const + { + LOG_FUNC + return (iType == EPreChild); + } + +/** +Return if the command associated with this queue item is a Post-Child command, i.e. +one that has Parent command. + +@return whether this command is a Post-Child command. +*/ +EXPORT_C TBool CHCICommandQItem::IsPostChild() const + { + LOG_FUNC + return (iType == EPostChild); + } + +/** +Return if the command associated with this queue item is a Normal command, i.e. +one that doesn't require a workaround and isn't itself a Child command. + +@return whether this command is a Normal command. +*/ +EXPORT_C TBool CHCICommandQItem::IsNormal() const + { + LOG_FUNC + return (iType == ENormal); + } + +/** +Return the total number of times the command associated with this queue item has +been sent. + +@return Number of times this command has been sent. +*/ +EXPORT_C TUint CHCICommandQItem::SentCount() const + { + LOG_FUNC + return iSentCounter; + } + +/** +This isn't exported since only the CHCICmdQController will use the Frame. +Getter for the command frame object that is associated with this queue item. +@return A reference to the command frame that this queue item "has". +*/ +CHctlCommandFrame& CHCICommandQItem::Frame() const + { + LOG_FUNC + return *iCmdFrame; + } + +/** +This isn't exported since only the CHCICmdQController will use the ID. +@return the command queue ID for this object +*/ +TUint CHCICommandQItem::CommandQId() const + { + LOG_FUNC + return iCommandQId; + } + +/** +This isn't exported since only the CHCICmdQController will use the ID. +@param aId the command queue ID for this object +*/ +void CHCICommandQItem::SetCommandQId(TUint aId) + { + LOG_FUNC + iCommandQId = aId; + } + +/** +This isn't exported since only the CHCICmdQController will use the +EReceivedCmdStatusEvent flag. +*/ +void CHCICommandQItem::SetReceivedCmdStatusEvent(TBool aReceivedCmdStatusEvent) + { + LOG_FUNC + + if (aReceivedCmdStatusEvent) + { + iCommandState |= EReceivedCmdStatusEvent; + } + else + { + iCommandState &= ~EReceivedCmdStatusEvent; + } + } + +/** +Marks the command item as being an initialisation command. +*/ +void CHCICommandQItem::SetInitialisationCmd() + { + LOG_FUNC + + iCommandState |= EInitialisationCmd; + } + +/** +This isn't exported since only the CHCICmdQController will use the +EDuplicatedOpcode flag. +@return whether this object duplicates an item on the command queue. +*/ +TBool CHCICommandQItem::DuplicatedOpcode() const + { + LOG_FUNC + return ((iCommandState & EDuplicatedOpcode)); + } + + +/** +This isn't exported since only the CHCICmdQController will use the +EDuplicatedOpcode flag. +*/ +void CHCICommandQItem::SetDuplicatedOpcode(TBool aDuplicatedOpcode) + { + LOG_FUNC + + if (aDuplicatedOpcode) + { + iCommandState |= EDuplicatedOpcode; + } + else + { + iCommandState &= ~EDuplicatedOpcode; + } + } + +/** +Starts iCompletionTimer going. +@param aMilliseconds the amount of time in milliseconds to run the timer for. +@param aController the object to inform if the timer expires. +*/ +void CHCICommandQItem::StartCompletionTimer(TUint aMilliseconds, CHCICmdQController& aController) + { + LOG_FUNC + + iCompletionTimer->Restart(aMilliseconds, CommandQId(), aController); + } + +/** +Cancels iCompletionTimer. +*/ +void CHCICommandQItem::CancelCompletionTimer() + { + LOG_FUNC + + iCompletionTimer->Cancel(); + } + +/** +Instructs this object to format iCmdFrame with the parameters in iCommand. +*/ +void CHCICommandQItem::FormatFrame() + { + LOG_FUNC + + iCommand->FormatCommand(*iCmdFrame); + } + +/** +Detaches the client callback interface from the command on the queue. +*/ +void CHCICommandQItem::DetachClient() + { + LOG_FUNC + + iCmdProgressRecipient = NULL; + } + +/** +@return Type of the command item (child, parent, normal, etc) +*/ +CHCICommandQItem::TType CHCICommandQItem::Type() const + { + LOG_FUNC + + return iType; + } + +/** +@param Type of the command item (child, parent, normal, etc) +*/ +void CHCICommandQItem::SetType(CHCICommandQItem::TType aType) + { + LOG_FUNC + + iType = aType; + } + +/** +This isn't exported since only the CHCICmdQController will set the +send status flags. +*/ +void CHCICommandQItem::CommandSent() + { + LOG_FUNC + iSentCounter++; + } + +/** +Constructor +*/ +CHCICommandQItem::CHCICommandQItem(MHCICommandQueueClient& aCmdProgressRecipient, + CHCICommandBase* aCommand) + : iCommand(aCommand), + iCmdProgressRecipient(&aCmdProgressRecipient) + { + LOG_FUNC + } + +/** +Constructor +*/ +void CHCICommandQItem::ConstructL(MHCICommandAllocator& aCommandAllocator) + { + LOG_FUNC + + iCmdFrame = aCommandAllocator.MhcaNewFrameL(); + iCompletionTimer = CHCICmdQCompletionTimer::NewL(); + }