diff -r 000000000000 -r d0791faffa3f obex/obexprotocol/obexbttransport/src/ObexRfcommConnector.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/obex/obexprotocol/obexbttransport/src/ObexRfcommConnector.cpp Tue Feb 02 01:11:40 2010 +0200 @@ -0,0 +1,176 @@ +// 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 +#include +#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"); +#endif + +CObexRfcommConnector* 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)); + } + }