diff -r 000000000000 -r 29b1cd4cb562 bluetooth/btstack/linkmgr/RawConduit.cpp --- /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 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 + } +