bluetooth/btstack/linkmgr/RawConduit.cpp
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btstack/linkmgr/RawConduit.cpp	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,171 @@
+// 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:
+// Implementation of rawconduit
+// 
+//
+
+#include "RawConduit.h"
+#include "ProxySAP.h"
+#include "physicallinksmanager.h"
+#include "ACLSAP.h"
+#include "linkutil.h"
+
+// a bit like a "signaller" for raw data
+
+CACLRawConduit* CACLRawConduit::NewL(CBTProxySAP& aParent)
+	{
+	CACLRawConduit* s = new (ELeave) CACLRawConduit(aParent);
+	CleanupStack::PushL(s);
+	s->ConstructL();
+	CleanupStack::Pop(s);
+	return s;
+	}
+
+void CACLRawConduit::ConstructL()
+	{
+	// get our link
+	iACLLink = CACLLink::NewL(iParent.iLinksMan,
+							  iParent.iPhysicalLink,
+							  iParent.iLinksMan.LinkManagerProtocol());
+	
+	TPckgBuf<TInt> buf;
+	TInt err = iACLLink->GetOption(KSolBtACL, ELMInboundACLSize, buf);
+	__ASSERT_ALWAYS(!err, Panic(EBTACLRawConduitError));
+
+	TInt MRU = buf();
+
+	iReceiveBuf = HBufC8::NewL(MRU);
+
+	iACLLink->SetNotify(this);
+
+	TACLSockAddr rawSockAddr;
+	rawSockAddr.SetPort(EACLPortRaw);
+	iACLLink->SetLocalName(rawSockAddr);
+
+	TBTSockAddr remoteAddr;
+	remoteAddr.SetBTAddr(iParent.iPhysicalLink->BDAddr());
+	iACLLink->SetRemName(remoteAddr);
+
+	iACLLink->ActiveOpen(); // to attach us - should be there
+	__ASSERT_DEBUG(iReady, Panic(EBTACLRawConduitError));
+	
+	if (!iReady)
+		{
+		User::Leave(KErrProxyWriteNotAvailable);
+		}
+	}
+
+CACLRawConduit::CACLRawConduit(CBTProxySAP& aParent)
+: iParent(aParent), iReady(EFalse)
+	{
+	}
+
+CACLRawConduit::~CACLRawConduit()
+	{
+	delete iReceiveBuf;
+ 	//Don't know the state of the iACLLink. We assume it will have been closed by a call from the
+ 	//PHY before our owner deletes us, but if our owner performed an immediate shutdown that might
+ 	//not be the case. If we try to delete the iACLLink while it's still open it'll panic. So to be
+ 	//sure, do an immediate shutdown on it.
+ 	iACLLink->Shutdown(CServProviderBase::EImmediate);
+	delete iACLLink;
+	}
+
+TInt CACLRawConduit::Write(const TDesC8& aData, TUint aOptions)
+	{
+	return iACLLink->Write(aData, aOptions, NULL);
+	}
+
+void CACLRawConduit::NewData(TUint aCount)
+	{
+	// get it out of the SAP
+	// try our best - but it's unreliable tranport
+	TPtr8 ptr = iReceiveBuf->Des();
+
+	while (aCount--)
+		{
+		iACLLink->GetData(ptr, 0); // no options
+		iParent.DataReceived();
+		}
+	}
+
+void CACLRawConduit::GetData(TDes8& aData)
+	{
+	aData = *iReceiveBuf;
+	}
+
+void CACLRawConduit::CanSend()
+	{
+	// don't care - unreliable, so haven't stored anything to send
+	}
+
+void CACLRawConduit::ConnectComplete()
+	{
+	// as expected!
+	iReady = ETrue;
+	}
+
+void CACLRawConduit::ConnectComplete(const TDesC8& /*aConnectData*/)
+	{
+	// don't care
+	}
+
+void CACLRawConduit::ConnectComplete(CServProviderBase& /*aSSP*/)
+	{
+	// don't care
+	}
+
+void CACLRawConduit::ConnectComplete(CServProviderBase& /*aSSP*/,const TDesC8& /*aConnectData*/)
+	{
+	// don't care
+	}
+
+void CACLRawConduit::CanClose(TDelete /*aDelete*/)
+	{
+	}
+
+void CACLRawConduit::CanClose(const TDesC8& /*aDisconnectData*/,TDelete /*aDelete*/)
+	{
+	}
+
+void CACLRawConduit::Error(TInt /*aError*/,TUint /*aOperationMask*/)
+	{
+	// our parent will be told by other means - this is just a data path
+	}
+
+void CACLRawConduit::Disconnect()
+	{
+	// our parent will be told by other means - this is just a data path
+	}
+
+void CACLRawConduit::Disconnect(TDesC8& /*aDisconnectData*/)
+	{
+	// don't care
+	}
+
+void CACLRawConduit::IoctlComplete(TDesC8* /*aBuf*/)
+	{
+	// not used
+	}
+
+void CACLRawConduit::NoBearer(const TDesC8& /*aConnectionInfo*/)
+	{
+	// don't care
+	}
+
+void CACLRawConduit::Bearer(const TDesC8& /*aConnectionInfo*/)
+	{
+	// don't care
+	}
+