bluetooth/btstack/avdtp/avdtpSignallingTransaction.cpp
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btstack/avdtp/avdtpSignallingTransaction.cpp	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,197 @@
+// Copyright (c) 2003-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:
+// Implements the avdtp signalling transaction
+// 
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include <bluetooth/logger.h>
+#include "btsockettimer.h"
+#include "avdtpSignallingTransaction.h"
+#include "avdtpSignallingChannel.h"
+#include "avdtpServiceInterface.h"
+#include "avdtputil.h"
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, LOG_COMPONENT_AVDTP);
+#endif
+
+#ifdef _DEBUG
+PANICCATEGORY("avdtpsigtr");
+#endif
+
+CSignallingTransaction::CSignallingTransaction(CSignallingChannel& aSignallingChannel,
+												TAvdtpMessage aSignal)
+: iSignal(aSignal), iSigCh(aSignallingChannel),
+  iTimerSet(EFalse), iPostSendAction(EDiscard)
+	{
+	LOG_FUNC
+	}
+	
+/*static*/ CSignallingTransaction* CSignallingTransaction::New(CSignallingChannel& aSignallingChannel,
+												TAvdtpMessage aSignal,
+												TAvdtpMessageType aMessageType)
+	{
+	LOG_STATIC_FUNC
+	CSignallingTransaction* self = new CSignallingTransaction(aSignallingChannel, aSignal);
+	if (self)
+		{
+		TInt res = self->Construct(aMessageType);
+		if (res!=KErrNone)
+			{
+			delete self;
+			self = NULL;
+			}
+		}
+	return self;
+	}
+	
+TInt CSignallingTransaction::Construct(TAvdtpMessageType aMessageType)
+	{
+	LOG_FUNC
+	iMessage = new CAvdtpOutboundSignallingMessage();
+	if (iMessage)
+		{
+		iMessage->SetType(aMessageType, iSignal);
+		}
+	return iMessage ? KErrNone : KErrNoMemory;
+	}
+
+CSignallingTransaction::~CSignallingTransaction()
+	{
+	LOG_FUNC
+	// might be on queue, so dequeue (safe for double queues)
+	iLink.Deque();
+	CancelTimer();
+	delete iMessage;
+	}
+
+void CSignallingTransaction::StartTimer()
+	{
+	LOG_FUNC
+	CancelTimer();
+	
+	TCallBack cb(TimerExpired, this);
+	iTimerEntry.Set(cb);
+	BTSocketTimer::Queue(KAvdtpSigRTXTimeout, iTimerEntry);
+	iTimerSet=ETrue;
+	}
+	
+void CSignallingTransaction::CancelTimer()
+	{
+	LOG_FUNC
+	if (iTimerSet)
+		{
+		BTSocketTimer::Remove(iTimerEntry);
+		iTimerSet = EFalse;
+		}
+	}
+
+/*static*/ TInt CSignallingTransaction::TimerExpired(TAny* aTransaction)
+	{
+	LOG_STATIC_FUNC
+	CSignallingTransaction* transaction = reinterpret_cast<CSignallingTransaction*>(aTransaction);
+	ASSERT_DEBUG(transaction->SentAction()==EKeepSetRTX);
+	transaction->Error(KErrAvdtpRequestTimeout);
+	return EFalse;
+	}
+
+// error the transaction => tell user
+// will be due to timeout or signalling channel error etc	
+void CSignallingTransaction::Error(TInt aError)
+	{
+	// remove this transaction from the pending queue
+	iLink.Deque();
+	
+	// get acp seid from cookie - all cookies are the same at the moment
+	TSEID seid(reinterpret_cast<TUint>(Cookie()));
+	
+	switch (Signal())
+		{
+		case EAvdtpDiscover:
+			{
+			// no timeout specified in avdtp for Discover
+			__ASSERT_DEBUG(aError!=KErrAvdtpRequestTimeout, Panic(EAvdtpInvalidTimeout));
+			User()->DiscoverConfirm(aError, NULL);			
+			break;			
+			}
+		case EAvdtpGetCapabilities:
+			{
+			// no timeout specified in avdtp for GetCaps
+			__ASSERT_DEBUG(aError!=KErrAvdtpRequestTimeout, Panic(EAvdtpInvalidTimeout));
+			User()->GetCapsConfirm(aError, seid, NULL);			
+			break;			
+			}
+		case EAvdtpSecurityControl:
+			{
+			// no timeout specified in avdtp for SecurityControl
+			__ASSERT_DEBUG(aError!=KErrAvdtpRequestTimeout, Panic(EAvdtpInvalidTimeout));
+			User()->SecurityControlConfirm(aError, seid, KNullDesC8);			
+			break;			
+			}
+		case EAvdtpAbort:
+			{
+			// Abort is special as the spec doesn't allow errors in the Confirm,
+			// so signal anyway = assume it worked as semantics of Abort allow this
+			User()->AbortConfirm(seid);
+			break;
+			}
+		case EAvdtpSetConfiguration:
+			{			
+			User()->SetConfigConfirm(aError, seid, EServiceCategoryNull);
+			break;
+			}
+		case EAvdtpOpen:
+			{
+			User()->OpenConfirm(aError, seid);
+			break;
+			}
+		case EAvdtpReconfigure:
+			{
+			User()->ReconfigConfirm(aError, seid, EServiceCategoryNull);
+			break;
+			}
+		case EAvdtpSuspend:
+			{
+			User()->SuspendConfirm(aError, seid);
+			break;
+			}
+		case EAvdtpStart:
+			{
+			User()->StartConfirm(aError, seid);
+			break;
+			}
+		case EAvdtpRelease:
+			{
+			User()->ReleaseConfirm(aError, seid);
+			break;
+			}
+		default:
+			{
+			// note we never send GetConfiguration
+			__DEBUGGER();
+			}
+		}
+	// will delete us:
+	SignallingChannel().RemoveTransaction(*this);
+	}
+	
+ void CSignallingTransaction::SetSentAction()
+	{
+	iPostSendAction = Message().PostSendAction();
+	}