bthci/bthci2/hcicmdq/src/HciCommandQItem.cpp
changeset 0 29b1cd4cb562
child 51 20ac952a623c
--- /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 <bluetooth/hcicommandqitem.h>
+#include "HciCmdQTimer.h"
+#include "HciCmdQUtil.h"
+
+#include <bluetooth/hci/hcicommandallocator.h>
+#include <bluetooth/hci/hciframe.h>
+#include <bluetooth/hcicmdqcontroller.h>
+#include <bluetooth/hci/command.h>
+#include <bluetooth/logger.h>
+
+#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();
+	}