// Copyright (c) 2005-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://#include <obex/transport/mobextransportnotify.h>#include <obexbttransportinfo.h>#include "ObexRfcommConnector.h"#include "ObexActiveRfcommConnector.h"#include "ObexListenerRfcommConnector.h"#include "logger.h"#include "obexbtfaults.h"#ifdef __FLOG_ACTIVE_LIT8(KLogComponent, "RFCOMM");#endif#ifdef _DEBUG_LIT(KPanicCat, "RfcommConnector");#endifCObexRfcommConnector* CObexRfcommConnector::NewL(MObexTransportNotify& aOwner, TBTSockAddr& aAddr) { LOG_STATIC_FUNC_ENTRY CObexRfcommConnector* self = new(ELeave) CObexRfcommConnector(aOwner, aAddr); CleanupStack::PushL(self); self->ConstructL(); CleanupStack::Pop(self); return self; }CObexRfcommConnector::CObexRfcommConnector(MObexTransportNotify& aObserver, TBTSockAddr& aAddr) : CObexConnector(aObserver), iAddr(aAddr) { LOG_FUNC LOG(_L8("\taAddr:")); LOGHEXDESC(aAddr); }void CObexRfcommConnector::ConstructL() { LOG_FUNC LEAVEIFERRORL(iSocketServ.Connect()); LEAVEIFERRORL(iSocketServ.FindProtocol(_L("RFCOMM"), iProtocolDesc)); iConnector = new(ELeave) CObexActiveRfcommConnector(*this, iSocketServ, iSocket, iProtocolDesc, iAddr); iReceiver = new(ELeave) CObexListenerRfcommConnector(*this, iSocketServ, iSocket, iProtocolDesc, iAddr); BaseConstructL(); }CObexRfcommConnector::~CObexRfcommConnector() { LOG_FUNC delete iConnector; delete iReceiver; iSocket.Close(); iSocketServ.Close(); }void CObexRfcommConnector::ConnectL() { LOG_FUNC __ASSERT_DEBUG(iConnector, PANIC(KPanicCat, ERfcommConnectorInternalError)); iConnector->ConnectL(); }void CObexRfcommConnector::CancelConnect() { LOG_FUNC __ASSERT_DEBUG(iConnector, PANIC(KPanicCat, ERfcommConnectorInternalError)); iConnector->Cancel(); }void CObexRfcommConnector::AcceptL() { LOG_FUNC __ASSERT_DEBUG(iReceiver, PANIC(KPanicCat, ERfcommConnectorInternalError)); iReceiver->AcceptL(); }void CObexRfcommConnector::CancelAccept() { LOG_FUNC __ASSERT_DEBUG(iReceiver, PANIC(KPanicCat, ERfcommConnectorInternalError)); iReceiver->Cancel(); }TBool CObexRfcommConnector::BringTransportDown() { LOG_FUNC // There's a nasty contract going on here- at most, only one of these AOs // should be active at any time. They each use this object's iSocket, // opening and closing it, and asserting its SubSessionHandle at various // points. They may be better designed as a single AO state machine. __ASSERT_DEBUG(iConnector, PANIC(KPanicCat, ERfcommConnectorInternalError)); iConnector->Cancel(); __ASSERT_DEBUG(iReceiver, PANIC(KPanicCat, ERfcommConnectorInternalError)); iReceiver->Cancel(); // For cases where the underlying transport has gone we'll // do an Immediate Shutdown to prevent Close() from blocking. // This should stop dialogs from "freezing". //returns true as this transport proceeds with taking down the transport if ( iTransportUp ) { TRequestStatus status; iSocket.Shutdown(RSocket::EImmediate, status); User::WaitForRequest(status); iTransportUp = EFalse; } iSocket.Close(); return ETrue; }/** Used to set any link layer specific error condition flags. Bluetooth has none, so the function is a stub. */void CObexRfcommConnector::SignalTransportError() { LOG_FUNC }/**Returns the socket instance iSocket@return RSocket*/RSocket& CObexRfcommConnector::GetSocket() { LOG_LINE LOG_FUNC return iSocket; }/**This method is used to field completed connections from both the active connector and the listen/acceptor.*/void CObexRfcommConnector::ConnectComplete(TInt aError, TObexConnectionInfo& aSockinfo) { LOG_FUNC LOG1(_L8("\taError = %d"), aError); if ( aError == KErrNone ) { Observer().TransportUp(aSockinfo); iTransportUp = ETrue; } else { Observer().Error(aError); __ASSERT_DEBUG(!iTransportUp, PANIC(KPanicCat, ERfcommConnectorInternalError)); } }