summaryrefslogtreecommitdiffstats
path: root/src/connectivity/bluetooth
diff options
context:
space:
mode:
Diffstat (limited to 'src/connectivity/bluetooth')
-rw-r--r--src/connectivity/bluetooth/qbluetooth.cpp1
-rw-r--r--src/connectivity/bluetooth/qbluetoothaddress.cpp5
-rw-r--r--src/connectivity/bluetooth/qbluetoothdevicediscoveryagent.cpp3
-rw-r--r--src/connectivity/bluetooth/qbluetoothdevicediscoveryagent.h1
-rw-r--r--src/connectivity/bluetooth/qbluetoothdevicediscoveryagent_bluez.cpp2
-rw-r--r--src/connectivity/bluetooth/qbluetoothdevicediscoveryagent_p.h6
-rw-r--r--src/connectivity/bluetooth/qbluetoothdevicediscoveryagent_symbian.cpp73
-rw-r--r--src/connectivity/bluetooth/qbluetoothdeviceinfo.cpp1
-rw-r--r--src/connectivity/bluetooth/qbluetoothdeviceinfo.h10
-rw-r--r--src/connectivity/bluetooth/qbluetoothlocaldevice.cpp7
-rw-r--r--src/connectivity/bluetooth/qbluetoothlocaldevice.h4
-rw-r--r--src/connectivity/bluetooth/qbluetoothlocaldevice_symbian.cpp6
-rw-r--r--src/connectivity/bluetooth/qbluetoothservicediscoveryagent.cpp1
-rw-r--r--src/connectivity/bluetooth/qbluetoothservicediscoveryagent.h4
-rw-r--r--src/connectivity/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp3
-rw-r--r--src/connectivity/bluetooth/qbluetoothservicediscoveryagent_symbian.cpp9
-rw-r--r--src/connectivity/bluetooth/qbluetoothserviceinfo.cpp1
-rw-r--r--src/connectivity/bluetooth/qbluetoothserviceinfo_symbian.cpp4
-rw-r--r--src/connectivity/bluetooth/qbluetoothsocket.cpp13
-rw-r--r--src/connectivity/bluetooth/qbluetoothsocket.h4
-rw-r--r--src/connectivity/bluetooth/qbluetoothsocket_p.h15
-rw-r--r--src/connectivity/bluetooth/qbluetoothsocket_symbian.cpp411
-rw-r--r--src/connectivity/bluetooth/qbluetoothtransfermanager.cpp1
-rw-r--r--src/connectivity/bluetooth/qbluetoothtransferreply.cpp1
-rw-r--r--src/connectivity/bluetooth/qbluetoothtransferreply_bluez_p.h4
-rw-r--r--src/connectivity/bluetooth/qbluetoothtransferrequest.cpp11
-rw-r--r--src/connectivity/bluetooth/qbluetoothuuid.cpp1
-rw-r--r--src/connectivity/bluetooth/ql2capserver.cpp1
-rw-r--r--src/connectivity/bluetooth/ql2capserver.h7
-rw-r--r--src/connectivity/bluetooth/ql2capserver_p.h23
-rw-r--r--src/connectivity/bluetooth/ql2capserver_symbian.cpp215
-rw-r--r--src/connectivity/bluetooth/qrfcommserver.cpp1
-rw-r--r--src/connectivity/bluetooth/qrfcommserver.h7
-rw-r--r--src/connectivity/bluetooth/qrfcommserver_p.h19
-rw-r--r--src/connectivity/bluetooth/qrfcommserver_symbian.cpp226
-rw-r--r--src/connectivity/bluetooth/symbian/bluetoothlinkmanagerdevicediscoverer.cpp165
-rw-r--r--src/connectivity/bluetooth/symbian/bluetoothlinkmanagerdevicediscoverer.h17
-rw-r--r--src/connectivity/bluetooth/symbian/bluetoothsymbianpairingadapter.cpp4
-rw-r--r--src/connectivity/bluetooth/symbian/bluetoothsymbianpairingadapter.h4
-rw-r--r--src/connectivity/bluetooth/symbian/bluetoothsymbianregistryadapter.h4
40 files changed, 805 insertions, 490 deletions
diff --git a/src/connectivity/bluetooth/qbluetooth.cpp b/src/connectivity/bluetooth/qbluetooth.cpp
index a835822cbc..13268b8d3f 100644
--- a/src/connectivity/bluetooth/qbluetooth.cpp
+++ b/src/connectivity/bluetooth/qbluetooth.cpp
@@ -44,6 +44,7 @@
/*!
\namespace QBluetooth
\brief The QBluetooth namespace contains functions and definitions related to Bluetooth.
+ \since 1.2
\ingroup connectivity-bluetooth
\inmodule QtConnectivity
diff --git a/src/connectivity/bluetooth/qbluetoothaddress.cpp b/src/connectivity/bluetooth/qbluetoothaddress.cpp
index 97f4c6d9a0..052c687184 100644
--- a/src/connectivity/bluetooth/qbluetoothaddress.cpp
+++ b/src/connectivity/bluetooth/qbluetoothaddress.cpp
@@ -47,6 +47,7 @@ QTM_BEGIN_NAMESPACE
/*!
\class QBluetoothAddress
\brief The QBluetoothAddress class provides a Bluetooth address.
+ \since 1.2
\ingroup connectivity-bluetooth
\inmodule QtConnectivity
@@ -134,7 +135,7 @@ QBluetoothAddress::QBluetoothAddress(const QBluetoothAddress &other)
/*!
Assigns \a other to this Bluetooth address.
*/
-QBluetoothAddress &QBluetoothAddress::operator=(const QBluetoothAddress &other)
+QBluetoothAddress &QBluetoothAddress::operator=(const QBluetoothAddress &other)
{
d_ptr = other.d_ptr;
return *this;
@@ -176,7 +177,7 @@ bool QBluetoothAddress::operator<(const QBluetoothAddress &other) const
Returns true if the Bluetooth address are equal, otherwise returns false.
*/
bool QBluetoothAddress::operator==(const QBluetoothAddress &other) const
-{
+{
Q_D(const QBluetoothAddress);
return d->m_address == other.d_func()->m_address;
}
diff --git a/src/connectivity/bluetooth/qbluetoothdevicediscoveryagent.cpp b/src/connectivity/bluetooth/qbluetoothdevicediscoveryagent.cpp
index e80c2b5e2f..fe30bfbc35 100644
--- a/src/connectivity/bluetooth/qbluetoothdevicediscoveryagent.cpp
+++ b/src/connectivity/bluetooth/qbluetoothdevicediscoveryagent.cpp
@@ -48,6 +48,7 @@ QTM_BEGIN_NAMESPACE
\class QBluetoothDeviceDiscoveryAgent
\brief The QBluetoothDeviceDiscoveryAgent class provides an API for discovering nearby
Bluetooth devices.
+ \since 1.2
\ingroup connectivity-bluetooth
\inmodule QtConnectivity
@@ -69,7 +70,7 @@ QTM_BEGIN_NAMESPACE
\value NoError No error has occurred.
\value PoweredOff Bluetooth adaptor is powered off, power it on before doing discovery.
\value IOFailure Writing or reading from device resulted in an error.
- \value UnknownError An unknown error has occurred.
+ \value UnknownError An unknown error has occurred.
*/
/*!
diff --git a/src/connectivity/bluetooth/qbluetoothdevicediscoveryagent.h b/src/connectivity/bluetooth/qbluetoothdevicediscoveryagent.h
index c61d3291d7..a95c467962 100644
--- a/src/connectivity/bluetooth/qbluetoothdevicediscoveryagent.h
+++ b/src/connectivity/bluetooth/qbluetoothdevicediscoveryagent.h
@@ -108,6 +108,7 @@ private:
#ifdef QTM_SYMBIAN_BLUETOOTH
Q_PRIVATE_SLOT(d_func(), void _q_newDeviceFound(const QBluetoothDeviceInfo &device))
+ Q_PRIVATE_SLOT(d_func(), void _q_setError(QBluetoothDeviceDiscoveryAgent::Error errorCode, QString errorDescription))
#endif // QTM_SYMBIAN_BLUETOOTH
};
diff --git a/src/connectivity/bluetooth/qbluetoothdevicediscoveryagent_bluez.cpp b/src/connectivity/bluetooth/qbluetoothdevicediscoveryagent_bluez.cpp
index 68d7162675..370d061757 100644
--- a/src/connectivity/bluetooth/qbluetoothdevicediscoveryagent_bluez.cpp
+++ b/src/connectivity/bluetooth/qbluetoothdevicediscoveryagent_bluez.cpp
@@ -166,7 +166,7 @@ void QBluetoothDeviceDiscoveryAgentPrivate::_q_deviceFound(const QString &addres
if(dict.value(QLatin1String("RSSI")).isValid())
device.setRssi(dict.value(QLatin1String("RSSI")).toInt());
QList<QBluetoothUuid> uuids;
- foreach (QString u, dict.value(QLatin1String("UUIDs")).toStringList()) {
+ foreach (const QString &u, dict.value(QLatin1String("UUIDs")).toStringList()) {
uuids.append(QBluetoothUuid(u));
}
device.setServiceUuids(uuids, QBluetoothDeviceInfo::DataIncomplete);
diff --git a/src/connectivity/bluetooth/qbluetoothdevicediscoveryagent_p.h b/src/connectivity/bluetooth/qbluetoothdevicediscoveryagent_p.h
index 16b78ebed2..0e34e057f6 100644
--- a/src/connectivity/bluetooth/qbluetoothdevicediscoveryagent_p.h
+++ b/src/connectivity/bluetooth/qbluetoothdevicediscoveryagent_p.h
@@ -74,8 +74,10 @@ public:
bool isActive() const;
#ifdef QTM_SYMBIAN_BLUETOOTH
- // private slot
+// private slots
void _q_newDeviceFound(const QBluetoothDeviceInfo &device);
+ void _q_setError(QBluetoothDeviceDiscoveryAgent::Error errorCode,
+ QString errorDescription);
#endif
#ifndef QT_NO_DBUS
@@ -85,8 +87,8 @@ public:
private:
#ifdef QTM_SYMBIAN_BLUETOOTH
+ void allocate();
uint inquiryTypeToIAC() const;
- void setError(int errorCode, QString errorDescription);
#endif
QList<QBluetoothDeviceInfo> discoveredDevices;
diff --git a/src/connectivity/bluetooth/qbluetoothdevicediscoveryagent_symbian.cpp b/src/connectivity/bluetooth/qbluetoothdevicediscoveryagent_symbian.cpp
index e4afbf220c..99564164bf 100644
--- a/src/connectivity/bluetooth/qbluetoothdevicediscoveryagent_symbian.cpp
+++ b/src/connectivity/bluetooth/qbluetoothdevicediscoveryagent_symbian.cpp
@@ -56,70 +56,75 @@ QBluetoothDeviceDiscoveryAgentPrivate::QBluetoothDeviceDiscoveryAgentPrivate()
{
/* connect to socker server */
TInt result = m_socketServer.Connect();
- setError(result, QString("RSocketServ.Connect() failed with error"));
+ if (result != KErrNone)
+ _q_setError(QBluetoothDeviceDiscoveryAgent::UnknownError,
+ QString("RSocketServ.Connect() failed with error"));
}
QBluetoothDeviceDiscoveryAgentPrivate::~QBluetoothDeviceDiscoveryAgentPrivate()
{
delete m_deviceDiscovery;
- m_socketServer.Close();
+ if (m_socketServer.Handle() != NULL)
+ m_socketServer.Close();
}
-void QBluetoothDeviceDiscoveryAgentPrivate::start()
+void QBluetoothDeviceDiscoveryAgentPrivate::allocate()
{
- // we need to delete previous discovery as only one query could be active a one time
- if (m_deviceDiscovery) {
- delete m_deviceDiscovery;
- m_deviceDiscovery = NULL;
- }
- // clear list of found devices
- discoveredDevices.clear();
+ Q_Q(QBluetoothDeviceDiscoveryAgent);
+ // create link manager device discoverer
if (m_socketServer.Handle() != NULL) {
// create new active object for querying devices
m_deviceDiscovery = new BluetoothLinkManagerDeviceDiscoverer(m_socketServer);
- //bind signals on public interface
- Q_Q(QBluetoothDeviceDiscoveryAgent);
- QObject::connect(m_deviceDiscovery, SIGNAL(deviceDiscoveryComplete(int)), q, SIGNAL(finished()));
- QObject::connect(m_deviceDiscovery, SIGNAL(deviceDiscovered(const QBluetoothDeviceInfo&)),
- q, SLOT(_q_newDeviceFound(const QBluetoothDeviceInfo&)));
- QObject::connect(m_deviceDiscovery, SIGNAL(linkManagerError(QBluetoothDeviceDiscoveryAgent::Error)),
- q, SIGNAL(error(QBluetoothDeviceDiscoveryAgent::Error)));
- QObject::connect(m_deviceDiscovery, SIGNAL(canceled()),
- q, SIGNAL(canceled()));
- // startup the device discovery. Discovery results are obtained from signal connected above.
- if (!m_deviceDiscovery->startDiscovery(inquiryTypeToIAC()))
- setError(KErrNotReady, "Discovery is still active");
- } else {
- setError(KErrBadHandle, QString("RSocketServ.Connect() failed with error"));
- }
+ if (m_deviceDiscovery) {
+ QObject::connect(m_deviceDiscovery, SIGNAL(deviceDiscoveryComplete()), q, SIGNAL(finished()));
+ QObject::connect(m_deviceDiscovery, SIGNAL(deviceDiscovered(const QBluetoothDeviceInfo&)),
+ q, SLOT(_q_newDeviceFound(const QBluetoothDeviceInfo&)));
+ QObject::connect(m_deviceDiscovery, SIGNAL(linkManagerError(QBluetoothDeviceDiscoveryAgent::Error,QString)),
+ q, SLOT(_q_setError(QBluetoothDeviceDiscoveryAgent::Error,QString)));
+ QObject::connect(m_deviceDiscovery, SIGNAL(canceled()), q, SIGNAL(canceled()));
+ } else {
+ _q_setError(QBluetoothDeviceDiscoveryAgent::UnknownError,
+ QString("Cannot allocate BluetoothLinkManagerDeviceDiscoverer: failed with error"));
+ }
+ }
+}
+
+void QBluetoothDeviceDiscoveryAgentPrivate::start()
+{
+
+ // clear list of found devices
+ discoveredDevices.clear();
+ if (!m_deviceDiscovery) {
+ allocate();
+ }
+ m_deviceDiscovery->startDiscovery(inquiryTypeToIAC());
+
}
void QBluetoothDeviceDiscoveryAgentPrivate::stop()
{
- delete m_deviceDiscovery;
- m_deviceDiscovery = NULL;
+ if (m_deviceDiscovery)
+ m_deviceDiscovery->stopDiscovery();
}
bool QBluetoothDeviceDiscoveryAgentPrivate::isActive() const
{
if (m_deviceDiscovery)
- return m_deviceDiscovery->IsActive();
+ return m_deviceDiscovery->isReallyActive();
return false;
}
-void QBluetoothDeviceDiscoveryAgentPrivate::setError(int errorCode, QString errorDescription)
+void QBluetoothDeviceDiscoveryAgentPrivate::_q_setError(QBluetoothDeviceDiscoveryAgent::Error errorCode,
+ QString errorDescription)
{
+ qDebug() << __PRETTY_FUNCTION__ << errorCode << errorDescription;
if (errorCode == KErrNone)
return;
Q_Q(QBluetoothDeviceDiscoveryAgent);
errorString = errorDescription;
- if (errorCode == KErrCancel)
- emit q->canceled();
- else
- emit q->error(QBluetoothDeviceDiscoveryAgent::UnknownError);
-
+ emit q->error(errorCode);
}
void QBluetoothDeviceDiscoveryAgentPrivate::_q_newDeviceFound(const QBluetoothDeviceInfo &device)
diff --git a/src/connectivity/bluetooth/qbluetoothdeviceinfo.cpp b/src/connectivity/bluetooth/qbluetoothdeviceinfo.cpp
index d26c44e29b..b44bd63052 100644
--- a/src/connectivity/bluetooth/qbluetoothdeviceinfo.cpp
+++ b/src/connectivity/bluetooth/qbluetoothdeviceinfo.cpp
@@ -52,6 +52,7 @@ QTM_BEGIN_NAMESPACE
\ingroup connectivity-bluetooth
\inmodule QtConnectivity
+ \since 1.2
QBluetoothDeviceInfo provides information about a Bluetooth device's name, address and class of device.
*/
diff --git a/src/connectivity/bluetooth/qbluetoothdeviceinfo.h b/src/connectivity/bluetooth/qbluetoothdeviceinfo.h
index 990193962c..ad2cb021ac 100644
--- a/src/connectivity/bluetooth/qbluetoothdeviceinfo.h
+++ b/src/connectivity/bluetooth/qbluetoothdeviceinfo.h
@@ -122,9 +122,9 @@ public:
Camcorder = 13,
VideoMonitor = 14,
VideoDisplayAndLoudspeaker = 15,
- VideoConferencing = 17,
- // reserved = 18,
- GamingDevice = 19,
+ VideoConferencing = 16,
+ // reserved = 17,
+ GamingDevice = 18,
};
enum MinorPeripheralClass {
@@ -174,8 +174,8 @@ public:
HealthWeightScale = 0x3,
HealthGlucoseMeter = 0x4,
HealthPulseOximeter = 0x5,
- HealthDataDisplay = 0x6,
- HealthStepCounter = 0x7
+ HealthDataDisplay = 0x7,
+ HealthStepCounter = 0x8
};
enum ServiceClass {
diff --git a/src/connectivity/bluetooth/qbluetoothlocaldevice.cpp b/src/connectivity/bluetooth/qbluetoothlocaldevice.cpp
index 94c420a0b9..a20307dc6a 100644
--- a/src/connectivity/bluetooth/qbluetoothlocaldevice.cpp
+++ b/src/connectivity/bluetooth/qbluetoothlocaldevice.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
@@ -54,6 +54,7 @@ QTM_BEGIN_NAMESPACE
\ingroup connectivity-bluetooth
\inmodule QtConnectivity
+ \since 1.2
QBluetoothLocalDevice provides functions for getting and setting the state of local Bluetooth
devices.
@@ -131,7 +132,7 @@ QBluetoothLocalDevice::~QBluetoothLocalDevice()
otherwise return false.
*/
bool QBluetoothLocalDevice::isValid() const
-{
+{
return d_ptr;
}
@@ -226,7 +227,7 @@ bool QBluetoothLocalDevice::isValid() const
/*!
\fn QBluetoothLocalDevice::error(QBluetoothLocalDevice::Error error)
- Signal emited for pairing if there's an exceptional \a error
+ Signal emitted for pairing if there's an exceptional \a error
*/
diff --git a/src/connectivity/bluetooth/qbluetoothlocaldevice.h b/src/connectivity/bluetooth/qbluetoothlocaldevice.h
index 660323d900..657d430ec0 100644
--- a/src/connectivity/bluetooth/qbluetoothlocaldevice.h
+++ b/src/connectivity/bluetooth/qbluetoothlocaldevice.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
@@ -105,7 +105,7 @@ public:
UnknownError = 100
};
QBluetoothLocalDevice(QObject *parent = 0);
- QBluetoothLocalDevice(const QBluetoothAddress &address, QObject *parent = 0);
+ explicit QBluetoothLocalDevice(const QBluetoothAddress &address, QObject *parent = 0);
virtual ~QBluetoothLocalDevice();
bool isValid() const;
diff --git a/src/connectivity/bluetooth/qbluetoothlocaldevice_symbian.cpp b/src/connectivity/bluetooth/qbluetoothlocaldevice_symbian.cpp
index 6047b3f905..94b6d6fe72 100644
--- a/src/connectivity/bluetooth/qbluetoothlocaldevice_symbian.cpp
+++ b/src/connectivity/bluetooth/qbluetoothlocaldevice_symbian.cpp
@@ -78,7 +78,6 @@ QString QBluetoothLocalDevicePrivate::name()
TRAPD(err, settings = CBTEngSettings::NewL());
if (err != KErrNone)
return QString();
- QString name = QString();
HBufC *localName = NULL;
TRAPD(error, localName = HBufC::NewL(256));
if (error != KErrNone) {
@@ -87,9 +86,10 @@ QString QBluetoothLocalDevicePrivate::name()
}
TPtr localPtr = localName->Des();
TInt errorCode = settings->GetLocalName(localPtr);
- if (errorCode == KErrNone) {
+ QString name;
+ if (errorCode == KErrNone)
name = s60DescToQString(localPtr);
- }
+
delete localName;
delete settings;
return name;
diff --git a/src/connectivity/bluetooth/qbluetoothservicediscoveryagent.cpp b/src/connectivity/bluetooth/qbluetoothservicediscoveryagent.cpp
index 613691bb75..308c40653b 100644
--- a/src/connectivity/bluetooth/qbluetoothservicediscoveryagent.cpp
+++ b/src/connectivity/bluetooth/qbluetoothservicediscoveryagent.cpp
@@ -53,6 +53,7 @@ QTM_BEGIN_NAMESPACE
\ingroup connectivity-bluetooth
\inmodule QtConnectivity
+ \since 1.2
To query the services provided by all contactable Bluetooth devices create an instance of
QBluetoothServiceDiscoveryAgent, connect to either the serviceDiscovered() or finished()
diff --git a/src/connectivity/bluetooth/qbluetoothservicediscoveryagent.h b/src/connectivity/bluetooth/qbluetoothservicediscoveryagent.h
index 02f9739eb8..6279432ffe 100644
--- a/src/connectivity/bluetooth/qbluetoothservicediscoveryagent.h
+++ b/src/connectivity/bluetooth/qbluetoothservicediscoveryagent.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
@@ -74,7 +74,7 @@ public:
};
QBluetoothServiceDiscoveryAgent(QObject *parent = 0);
- QBluetoothServiceDiscoveryAgent(const QBluetoothAddress &remoteAddress, QObject *parent = 0);
+ explicit QBluetoothServiceDiscoveryAgent(const QBluetoothAddress &remoteAddress, QObject *parent = 0);
~QBluetoothServiceDiscoveryAgent();
bool isActive() const;
diff --git a/src/connectivity/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp b/src/connectivity/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp
index 43b1a06aa2..e6042c15ba 100644
--- a/src/connectivity/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp
+++ b/src/connectivity/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp
@@ -58,7 +58,8 @@ QTM_BEGIN_NAMESPACE
QBluetoothServiceDiscoveryAgentPrivate::QBluetoothServiceDiscoveryAgentPrivate(const QBluetoothAddress &address)
: error(QBluetoothServiceDiscoveryAgent::NoError), state(Inactive), deviceAddress(address),
- deviceDiscoveryAgent(0), mode(QBluetoothServiceDiscoveryAgent::MinimalDiscovery), manager(0), device(0), singleDevice(false)
+ deviceDiscoveryAgent(0), mode(QBluetoothServiceDiscoveryAgent::MinimalDiscovery),
+ singleDevice(false), manager(0), device(0)
{
qRegisterMetaType<ServiceMap>("ServiceMap");
qDBusRegisterMetaType<ServiceMap>();
diff --git a/src/connectivity/bluetooth/qbluetoothservicediscoveryagent_symbian.cpp b/src/connectivity/bluetooth/qbluetoothservicediscoveryagent_symbian.cpp
index 002a8168f6..df98d3a345 100644
--- a/src/connectivity/bluetooth/qbluetoothservicediscoveryagent_symbian.cpp
+++ b/src/connectivity/bluetooth/qbluetoothservicediscoveryagent_symbian.cpp
@@ -55,10 +55,10 @@ QBluetoothServiceDiscoveryAgentPrivate::QBluetoothServiceDiscoveryAgentPrivate(c
, deviceAddress(address)
, deviceDiscoveryAgent(0)
, mode(QBluetoothServiceDiscoveryAgent::MinimalDiscovery)
+ , singleDevice(false)
, m_sdpAgent(NULL)
, m_filter(NULL)
, m_attributes(NULL)
- , singleDevice(false)
{
}
@@ -191,6 +191,10 @@ void QBluetoothServiceDiscoveryAgentPrivate::AttributeRequestComplete(TSdpServRe
m_serviceInfo.setDevice(discoveredDevices.at(0));
discoveredServices.append(m_serviceInfo);
m_serviceInfo = QBluetoothServiceInfo();
+ if (discoveredServices.last().isValid())
+ {
+ emit q->serviceDiscovered(discoveredServices.last());
+ }
TRAPD(err, m_sdpAgent->NextRecordRequestL());
if (err != KErrNone) {
error = QBluetoothServiceDiscoveryAgent::UnknownError;
@@ -201,9 +205,6 @@ void QBluetoothServiceDiscoveryAgentPrivate::AttributeRequestComplete(TSdpServRe
emit q->error(error);
}
- // emit found service.
- if (discoveredServices.last().isValid())
- emit q->serviceDiscovered(discoveredServices.last());
}
diff --git a/src/connectivity/bluetooth/qbluetoothserviceinfo.cpp b/src/connectivity/bluetooth/qbluetoothserviceinfo.cpp
index 5e925b55e1..c3d269c18b 100644
--- a/src/connectivity/bluetooth/qbluetoothserviceinfo.cpp
+++ b/src/connectivity/bluetooth/qbluetoothserviceinfo.cpp
@@ -50,6 +50,7 @@ QTM_BEGIN_NAMESPACE
\class QBluetoothServiceInfo::Sequence
\brief The Sequence class provides a data type for Bluetooth Data
Element Sequence attributes.
+ \since 1.2
\ingroup connectivity-bluetooth
\inmodule QtConnectivity
diff --git a/src/connectivity/bluetooth/qbluetoothserviceinfo_symbian.cpp b/src/connectivity/bluetooth/qbluetoothserviceinfo_symbian.cpp
index 8b684f3006..3346cf33fd 100644
--- a/src/connectivity/bluetooth/qbluetoothserviceinfo_symbian.cpp
+++ b/src/connectivity/bluetooth/qbluetoothserviceinfo_symbian.cpp
@@ -289,7 +289,9 @@ bool QBluetoothServiceInfo::registerService() const
bool QBluetoothServiceInfo::unregisterService() const
{
Q_D(const QBluetoothServiceInfo);
-
+ if(d->serviceRecord == 0)
+ return true;
+
if (!d->ensureSdpConnection())
return false;
diff --git a/src/connectivity/bluetooth/qbluetoothsocket.cpp b/src/connectivity/bluetooth/qbluetoothsocket.cpp
index 5397a35548..db61211afe 100644
--- a/src/connectivity/bluetooth/qbluetoothsocket.cpp
+++ b/src/connectivity/bluetooth/qbluetoothsocket.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
@@ -58,6 +58,7 @@ QTM_BEGIN_NAMESPACE
\ingroup connectivity-bluetooth
\inmodule QtConnectivity
+ \since 1.2
QBluetoothSocket supports two socket types, \l {QBluetoothSocket::L2capSocket}{L2CAP} and
\l {QBluetoothSocket::RfcommSocket}{RFCOMM}.
@@ -247,7 +248,7 @@ QBluetoothSocket::QBluetoothSocket(QObject *parent)
Destroys the Bluetooth socket.
*/
QBluetoothSocket::~QBluetoothSocket()
-{
+{
delete d_ptr;
d_ptr = 0;
}
@@ -422,7 +423,7 @@ void QBluetoothSocket::setSocketState(QBluetoothSocket::SocketState state)
}
/*!
- Returns true if you can read atleast one line from the device
+ Returns true if you can read at least one line from the device
*/
bool QBluetoothSocket::canReadLine() const
@@ -450,7 +451,7 @@ void QBluetoothSocket::setSocketError(QBluetoothSocket::SocketError error_)
void QBluetoothSocket::doDeviceDiscovery(const QBluetoothServiceInfo &service, OpenMode openMode)
{
Q_D(QBluetoothSocket);
-
+
qDebug() << "Starting discovery";
if(d->discoveryAgent) {
@@ -458,7 +459,7 @@ void QBluetoothSocket::doDeviceDiscovery(const QBluetoothServiceInfo &service, O
}
d->discoveryAgent = new QBluetoothServiceDiscoveryAgent(service.device().address(),this);
-
+
qDebug() << "Got agent";
connect(d->discoveryAgent, SIGNAL(serviceDiscovered(QBluetoothServiceInfo)), this, SLOT(serviceDiscovered(QBluetoothServiceInfo)));
@@ -474,7 +475,7 @@ void QBluetoothSocket::doDeviceDiscovery(const QBluetoothServiceInfo &service, O
// we have to ID the service somehow
Q_ASSERT(!d->discoveryAgent->uuidFilter().isEmpty());
-
+
qDebug() << "UUID filter" << d->discoveryAgent->uuidFilter();
d->discoveryAgent->start(QBluetoothServiceDiscoveryAgent::FullDiscovery);
diff --git a/src/connectivity/bluetooth/qbluetoothsocket.h b/src/connectivity/bluetooth/qbluetoothsocket.h
index ae9f4b94e0..09df6d5482 100644
--- a/src/connectivity/bluetooth/qbluetoothsocket.h
+++ b/src/connectivity/bluetooth/qbluetoothsocket.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
@@ -94,7 +94,7 @@ public:
NetworkError = QAbstractSocket::NetworkError
};
- QBluetoothSocket(SocketType socketType, QObject *parent = 0); // create socket of type socketType
+ explicit QBluetoothSocket(SocketType socketType, QObject *parent = 0); // create socket of type socketType
QBluetoothSocket(QObject *parent = 0); // create a blank socket
virtual ~QBluetoothSocket();
diff --git a/src/connectivity/bluetooth/qbluetoothsocket_p.h b/src/connectivity/bluetooth/qbluetoothsocket_p.h
index 9369e6cbca..585329e967 100644
--- a/src/connectivity/bluetooth/qbluetoothsocket_p.h
+++ b/src/connectivity/bluetooth/qbluetoothsocket_p.h
@@ -54,6 +54,7 @@
#ifdef QTM_SYMBIAN_BLUETOOTH
#include <es_sock.h>
#include <bt_sock.h>
+#include <bttypes.h>
#endif
QT_FORWARD_DECLARE_CLASS(QSocketNotifier)
@@ -125,10 +126,11 @@ public:
void startReceive();
void startServerSideReceive();
void receive();
- void ensureBlankNativeSocket();
+ bool ensureBlankNativeSocket(QBluetoothSocket::SocketType type);
+ bool tryToSend();
/* MBluetoothSocketNotifier virtual functions */
- void HandleActivateBasebandEventNotifierCompleteL(TInt aErr, TBTBasebandEventNotification &aEventNotification);
+ void HandleActivateBasebandEventNotifierCompleteL(TInt aErr, TBTBasebandEventNotification& aEventNotification);
void HandleAcceptCompleteL(TInt aErr);
void HandleConnectCompleteL(TInt aErr);
void HandleIoctlCompleteL(TInt aErr);
@@ -154,18 +156,19 @@ public:
// QByteArray rxBuffer;
// qint64 rxOffset;
-// QByteArray txBuffer;
QString errorString;
#ifdef QTM_SYMBIAN_BLUETOOTH
CBluetoothSocket *iSocket;
- CBluetoothSocket *iBlankSocket;
TPtr8 rxDescriptor;
TPtrC8 txDescriptor;
+ QByteArray txArray;
TSockXfrLength rxLength;
- bool receiving;
TInt recvMTU;
- QByteArray txTempBuffer;
+ TInt txMTU;
+ char* bufPtr;
+ bool transmitting;
+ quint64 writeSize;
#endif
// private slots
diff --git a/src/connectivity/bluetooth/qbluetoothsocket_symbian.cpp b/src/connectivity/bluetooth/qbluetoothsocket_symbian.cpp
index 411f91b224..d5daf5d2fc 100644
--- a/src/connectivity/bluetooth/qbluetoothsocket_symbian.cpp
+++ b/src/connectivity/bluetooth/qbluetoothsocket_symbian.cpp
@@ -64,29 +64,40 @@ QBluetoothSocketPrivate::QBluetoothSocketPrivate()
, connectWriteNotifier(0)
, discoveryAgent(0)
, iSocket(0)
- , iBlankSocket(0)
, rxDescriptor(0, 0)
, txDescriptor(0, 0)
- , receiving(false)
-
+ , recvMTU(0)
+ , txMTU(0)
+ , transmitting(false)
+ , writeSize(0)
{
}
QBluetoothSocketPrivate::~QBluetoothSocketPrivate()
{
- delete iBlankSocket;
delete iSocket;
}
void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode)
{
Q_Q(QBluetoothSocket);
+ Q_UNUSED(openMode);
+
TBTSockAddr a;
- a.SetBTAddr(TBTDevAddr(address.toUInt64()));
+ if(address.isNull())
+ {
+ socketError = QBluetoothSocket::UnknownSocketError;
+ emit q->error(socketError);
+ return;
+ }
+ TInt err = KErrNone;
a.SetPort(port);
-
- if (iSocket->Connect(a) == KErrNone) {
+ // Trap TBTDevAddr constructor which may panic
+ TRAP(err, a.SetBTAddr(TBTDevAddr(address.toUInt64())));
+ if(err == KErrNone)
+ err = iSocket->Connect(a);
+ if (err == KErrNone) {
q->setSocketState(QBluetoothSocket::ConnectingState);
} else {
socketError = QBluetoothSocket::UnknownSocketError;
@@ -98,9 +109,14 @@ bool QBluetoothSocketPrivate::ensureNativeSocket(QBluetoothSocket::SocketType ty
{
if (iSocket) {
if (socketType == type)
+ {
return true;
+ }
else
+ {
delete iSocket;
+ iSocket = 0;
+ }
}
socketType = type;
@@ -118,56 +134,58 @@ bool QBluetoothSocketPrivate::ensureNativeSocket(QBluetoothSocket::SocketType ty
}
default:
iSocket = 0;
- return false;
}
if (iSocket)
return true;
-
- return false;
+ else
+ return false;
}
-void QBluetoothSocketPrivate::ensureBlankNativeSocket()
+bool QBluetoothSocketPrivate::ensureBlankNativeSocket(QBluetoothSocket::SocketType type)
{
- if (iBlankSocket) {
- delete iBlankSocket;
- iBlankSocket = NULL;
+ if (iSocket) {
+ delete iSocket;
+ iSocket = 0;
}
-
- TRAPD(err, iBlankSocket = CBluetoothSocket::NewL(*this, getSocketServer()->socketServer));
+ socketType = type;
+ TRAPD(err, iSocket = CBluetoothSocket::NewL(*this, getSocketServer()->socketServer));
Q_UNUSED(err);
+ if(iSocket)
+ return true;
+ else
+ return false;
}
void QBluetoothSocketPrivate::startReceive()
{
- if (receiving)
- return;
-
Q_Q(QBluetoothSocket);
- if (!iSocket) {
+ if (!iSocket || state != QBluetoothSocket::ConnectedState) {
emit q->error(QBluetoothSocket::UnknownSocketError);
return;
}
- receiving = true;
- TInt err;
- recvMTU = 0;
- err = iSocket->GetOpt(KL2CAPInboundMTU, KSolBtL2CAP, recvMTU);
+ TInt err = iSocket->GetOpt(KL2CAPInboundMTU, KSolBtL2CAP, recvMTU);
if(err != KErrNone)
+ {
+ emit q->error(QBluetoothSocket::UnknownSocketError);
return;
- receive();
-}
-void QBluetoothSocketPrivate::startServerSideReceive()
-{
- Q_Q(QBluetoothSocket);
- if (!iBlankSocket) {
+ }
+ err = iSocket->GetOpt(KL2CAPNegotiatedOutboundMTU, KSolBtL2CAP, txMTU);
+ if(err != KErrNone)
+ {
emit q->error(QBluetoothSocket::UnknownSocketError);
return;
}
- TInt err;
- recvMTU = 0;
- err = iBlankSocket->GetOpt(KL2CAPInboundMTU, KSolBtL2CAP, recvMTU);
+ bufPtr = buffer.reserve(recvMTU);
+ // enable automatic power saving mode
+ iSocket->SetAutomaticSniffMode(ETrue);
+ // enable link down and link error notifications for proper disconnection
+ err = iSocket->ActivateBasebandEventNotifier(ENotifyPhysicalLinkDown |ENotifyPhysicalLinkError );
if(err != KErrNone)
- return;
+ {
+ emit q->error(QBluetoothSocket::UnknownSocketError);
+ return;
+ }
receive();
}
@@ -175,44 +193,65 @@ void QBluetoothSocketPrivate::receive()
{
Q_Q(QBluetoothSocket);
TInt err = KErrNone;
- if (!iSocket && !iBlankSocket)
- {
+
+ if(!iSocket || bufPtr == 0 || recvMTU == 0 || socketType < 0 || state != QBluetoothSocket::ConnectedState)
+ {
emit q->error(QBluetoothSocket::UnknownSocketError);
return;
- }
- char *bufPtr = buffer.reserve(recvMTU);
- rxDescriptor.Set(reinterpret_cast<unsigned char *>(bufPtr), 0,recvMTU);
- if (socketType == QBluetoothSocket::RfcommSocket) {
- if(iBlankSocket)
- err = iBlankSocket->RecvOneOrMore(rxDescriptor, 0, rxLength);
- else
- err = iSocket->RecvOneOrMore(rxDescriptor, 0, rxLength);
- if (err != KErrNone) {
- socketError = QBluetoothSocket::NetworkError;
- emit q->error(socketError);
}
- } else if (socketType == QBluetoothSocket::L2capSocket) {
- if(iBlankSocket)
- err = iBlankSocket->Recv(rxDescriptor, 0);
- else
- err = iSocket->Recv(rxDescriptor, 0);
- if (err != KErrNone) {
- socketError = QBluetoothSocket::NetworkError;
- emit q->error(socketError);
+
+ TRAP(err, rxDescriptor.Set(reinterpret_cast<unsigned char *>(bufPtr), 0,recvMTU));
+ if(err != KErrNone)
+ {
+ emit q->error(QBluetoothSocket::UnknownSocketError);
+ return;
}
+ if (socketType == QBluetoothSocket::RfcommSocket) {
+ // cancel any pending recv operation
+ iSocket->CancelRecv();
+ err = iSocket->RecvOneOrMore(rxDescriptor, 0, rxLength);
+ if (err != KErrNone) {
+ socketError = QBluetoothSocket::UnknownSocketError;
+ emit q->error(socketError);
+ }
+ } else if (socketType == QBluetoothSocket::L2capSocket) {
+ // cancel any pending read operation
+ iSocket->CancelRead();
+ err = iSocket->Read(rxDescriptor);
+ if (err != KErrNone) {
+ socketError = QBluetoothSocket::UnknownSocketError;
+ emit q->error(socketError);
+ }
+ }
}
-}
void QBluetoothSocketPrivate::HandleAcceptCompleteL(TInt aErr)
{
qDebug() << __PRETTY_FUNCTION__ << ">> aErr=" << aErr;
Q_Q(QBluetoothSocket);
+ if(aErr != KErrNone)
+ {
+ socketError = QBluetoothSocket::UnknownSocketError;
+ emit q->error(socketError);
+ return;
+ }
emit q->connected();
}
-void QBluetoothSocketPrivate::HandleActivateBasebandEventNotifierCompleteL(TInt aErr, TBTBasebandEventNotification &aEventNotification)
+void QBluetoothSocketPrivate::HandleActivateBasebandEventNotifierCompleteL(TInt aErr, TBTBasebandEventNotification& aEventNotification)
{
qDebug() << __PRETTY_FUNCTION__;
+ Q_Q(QBluetoothSocket);
+ if(aErr != KErrNone)
+ {
+ socketError = QBluetoothSocket::UnknownSocketError;
+ emit q->error(socketError);
+ }
+ if(ENotifyPhysicalLinkDown & aEventNotification.EventType() || ENotifyPhysicalLinkError & aEventNotification.EventType())
+ {
+ q->setSocketState(QBluetoothSocket::ClosingState);
+ emit q->disconnected();
+ }
}
void QBluetoothSocketPrivate::HandleConnectCompleteL(TInt aErr)
@@ -243,69 +282,77 @@ void QBluetoothSocketPrivate::HandleConnectCompleteL(TInt aErr)
void QBluetoothSocketPrivate::HandleIoctlCompleteL(TInt aErr)
{
qDebug() << __PRETTY_FUNCTION__;
+ Q_Q(QBluetoothSocket);
+ if(aErr != KErrNone)
+ {
+ socketError = QBluetoothSocket::UnknownSocketError;
+ emit q->error(socketError);
+ }
}
void QBluetoothSocketPrivate::HandleReceiveCompleteL(TInt aErr)
{
- receiving = false;
Q_Q(QBluetoothSocket);
if (aErr == KErrNone) {
- buffer.chop(recvMTU-rxDescriptor.Length());
+ if(buffer.size() == 0)
+ bufPtr = buffer.reserve(recvMTU);
+ if(bufPtr <= 0)
+ {
+ socketError = QBluetoothSocket::UnknownSocketError;
+ emit q->error(socketError);
+ return;
+ }
+ buffer.chop(recvMTU - rxDescriptor.Length());
emit q->readyRead();
} else {
- socketError = QBluetoothSocket::UnknownSocketError;
- emit q->error(socketError);
+ // ignore disconnection it will be handled in baseband notification
+ if(aErr != KErrDisconnected)
+ {
+ socketError = QBluetoothSocket::UnknownSocketError;
+ writeSize = 0;
+ emit q->error(socketError);
+ }
}
}
void QBluetoothSocketPrivate::HandleSendCompleteL(TInt aErr)
{
Q_Q(QBluetoothSocket);
+ transmitting = false;
if (aErr == KErrNone) {
-// qint64 writeSize = txBuffer.size();
- qint64 writeSize = txDescriptor.Length();
- txBuffer.skip(writeSize);
- txTempBuffer.clear();
+ txArray.remove(0, writeSize);
emit q->bytesWritten(writeSize);
-
- if (state == QBluetoothSocket::ClosingState && txBuffer.size() == 0) {
- q->close();
- }
- else if (txBuffer.size()){
- txTempBuffer = txBuffer.readAll();
-
- txDescriptor.Set(reinterpret_cast<const unsigned char *>(txTempBuffer.constData()), txTempBuffer.length());
- TInt err = KErrNone;
- if(iBlankSocket)
- err = iBlankSocket->Send(txDescriptor, 0);
- else
- err = iSocket->Send(txDescriptor, 0);
-
- if (err != KErrNone) {
+ if (state == QBluetoothSocket::ClosingState)
+ {
+ writeSize = 0;
+ q->close();
+ }
+ else
+ {
+ if(!tryToSend())
+ {
socketError = QBluetoothSocket::UnknownSocketError;
- Q_Q(QBluetoothSocket);
+ writeSize = 0;
emit q->error(socketError);
- txTempBuffer.clear();
- return;
+ }
}
- }
} else {
- socketError = QBluetoothSocket::UnknownSocketError;
- emit q->error(socketError);
+ socketError = QBluetoothSocket::UnknownSocketError;
+ writeSize = 0;
+ emit q->error(socketError);
}
}
void QBluetoothSocketPrivate::HandleShutdownCompleteL(TInt aErr)
{
- qDebug() << __PRETTY_FUNCTION__ << ">> aErr=" << aErr;
Q_Q(QBluetoothSocket);
- if (aErr == KErrNone) {
- q->setSocketState(QBluetoothSocket::UnconnectedState);
- emit q->disconnected();
- } else {
- socketError = QBluetoothSocket::UnknownSocketError;
- emit q->error(socketError);
- }
+ // It doesn't matter if aErr is KErrNone or something else
+ // we consider the socket to be closed.
+ q->setSocketState(QBluetoothSocket::UnconnectedState);
+ transmitting = false;
+ writeSize = 0;
+ iSocket->AsyncDelete();
+ emit q->disconnected();
}
QSocketServerPrivate::QSocketServerPrivate()
@@ -332,124 +379,158 @@ QString QBluetoothSocketPrivate::localName() const
QBluetoothAddress QBluetoothSocketPrivate::localAddress() const
{
TBTSockAddr address;
-
+ if(!iSocket)
+ {
+ // need to return something anyway
+ return QBluetoothAddress();
+ }
iSocket->LocalName(address);
-
return qTBTDevAddrToQBluetoothAddress(address.BTAddr());
}
quint16 QBluetoothSocketPrivate::localPort() const
{
+ if(!iSocket)
+ {
+ // need to return something anyway
+ return 0;
+ }
return iSocket->LocalPort();
}
QString QBluetoothSocketPrivate::peerName() const
{
- RHostResolver resolver;
-
+ RHostResolver resolver;
+
+ if(getSocketServer()->socketServer.Handle()== 0 || !iSocket || state != QBluetoothSocket::ConnectedState )
+ {
+ // need to return something anyway
+ return QString();
+ }
TInt err = resolver.Open(getSocketServer()->socketServer, KBTAddrFamily, KBTLinkManager);
- if (err==KErrNone) {
+ if (err==KErrNone)
+ {
TNameEntry nameEntry;
TBTSockAddr sockAddr;
- if(iBlankSocket)
- iBlankSocket->RemoteName(sockAddr);
- else
- iSocket->RemoteName(sockAddr);
-
+ iSocket->RemoteName(sockAddr);
TInquirySockAddr address(sockAddr);
address.SetBTAddr(sockAddr.BTAddr());
address.SetAction(KHostResName|KHostResIgnoreCache); // ignore name stored in cache
err = resolver.GetByAddress(address, nameEntry);
- if(err == KErrNone) {
- TNameRecord name = nameEntry();
- m_peerName = QString((QChar*)name.iName.Ptr(),name.iName.Length());
- }
- }
+ if(err == KErrNone)
+ {
+ TNameRecord name = nameEntry();
+ QString qString((QChar*)name.iName.Ptr(),name.iName.Length());
+ m_peerName = qString;
+ }
+ }
resolver.Close();
-
- if (err != KErrNone) {
+
+ if(err != KErrNone)
+ {
+ // What is best? return an empty string or return the MAC address?
+ // In Symbian if we can't get the remote name we usually replace it with the MAC address
+ // but since Bluez implementation return an empty string we do the same here.
return QString();
- }
+ }
+
return m_peerName;
}
QBluetoothAddress QBluetoothSocketPrivate::peerAddress() const
{
TBTSockAddr address;
-
+ if(!iSocket)
+ {
+ // need to return something anyway
+ return QBluetoothAddress();
+ }
iSocket->RemoteName(address);
-
return qTBTDevAddrToQBluetoothAddress(address.BTAddr());
}
quint16 QBluetoothSocketPrivate::peerPort() const
{
TBTSockAddr address;
-
+ if(!iSocket)
+ {
+ // need to return something anyway
+ return 0;
+ }
iSocket->RemoteName(address);
-
return address.Port();
}
void QBluetoothSocketPrivate::close()
{
- if (state != QBluetoothSocket::ConnectedState && state != QBluetoothSocket::ListeningState)
- return;
Q_Q(QBluetoothSocket);
+ if(!iSocket || (state != QBluetoothSocket::ConnectedState && state != QBluetoothSocket::ListeningState))
+ {
+ socketError = QBluetoothSocket::UnknownSocketError;
+ emit q->error(socketError);
+ return;
+ }
+ iSocket->CancelBasebandEventNotifier();
q->setSocketState(QBluetoothSocket::ClosingState);
-
iSocket->Shutdown(RSocket::ENormal);
}
void QBluetoothSocketPrivate::abort()
{
+ Q_Q(QBluetoothSocket);
+ if(!iSocket)
+ {
+ socketError = QBluetoothSocket::UnknownSocketError;
+ emit q->error(socketError);
+ return;
+ }
iSocket->CancelWrite();
-
+ transmitting = false;
+ writeSize = 0;
+ iSocket->CancelBasebandEventNotifier();
iSocket->Shutdown(RSocket::EImmediate);
-
// force active object to run and shutdown socket.
qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
}
qint64 QBluetoothSocketPrivate::readData(char *data, qint64 maxSize)
{
- qint64 size = buffer.read(data, maxSize);
-
Q_Q(QBluetoothSocket);
+ if(data == 0 || maxSize <= 0)
+ {
+ return -1;
+ }
+ qint64 size = buffer.read(data, maxSize);
QMetaObject::invokeMethod(q, "_q_startReceive", Qt::QueuedConnection);
-
return size;
}
qint64 QBluetoothSocketPrivate::writeData(const char *data, qint64 maxSize)
{
- if(txBuffer.size() > 32768)
- return 0;
-
- if(txBuffer.size()){
- char *buf = txBuffer.reserve(maxSize);
- memcpy(buf, data, maxSize);
- return maxSize;
+ if(!iSocket || data == 0 || maxSize <= 0 || txMTU <= 0) {
+ return -1;
}
-
- char *buf = txBuffer.reserve(maxSize);
- memcpy(buf, data, maxSize);
-
- txDescriptor.Set(reinterpret_cast<const unsigned char *>(buf), maxSize);
- TInt err = KErrNone;
- if(iBlankSocket)
- err = iBlankSocket->Send(txDescriptor, 0);
+ if (!txArray.isEmpty())
+ {
+ txArray.append(QByteArray(data, maxSize));
+ }
else
- err = iSocket->Send(txDescriptor, 0);
-
- if (err != KErrNone) {
- socketError = QBluetoothSocket::NetworkError;
- Q_Q(QBluetoothSocket);
- emit q->error(socketError);
- return 0;
- }
-
- return maxSize;
+ {
+ txArray = QByteArray(data, maxSize);
+ }
+ // we try to send the data to the remote device
+ if(tryToSend())
+ {
+ // Warning : It doesn't mean the data have been sent
+ // to the remote device, it means that the data was
+ // at least stored in a local buffer.
+ return maxSize;
+ }
+ else
+ {
+ writeSize = 0;
+ return -1;
+ }
}
void QBluetoothSocketPrivate::_q_readNotify()
@@ -464,6 +545,10 @@ void QBluetoothSocketPrivate::_q_writeNotify()
bool QBluetoothSocketPrivate::setSocketDescriptor(int socketDescriptor, QBluetoothSocket::SocketType socketType,
QBluetoothSocket::SocketState socketState, QBluetoothSocket::OpenMode openMode)
{
+ Q_UNUSED(socketDescriptor);
+ Q_UNUSED(socketType);
+ Q_UNUSED(socketState);
+ Q_UNUSED(openMode);
return false;
}
@@ -477,6 +562,34 @@ qint64 QBluetoothSocketPrivate::bytesAvailable() const
return buffer.size();
}
+bool QBluetoothSocketPrivate::tryToSend()
+{
+ if(txArray.isEmpty())
+ return true;
+
+ if(transmitting)
+ return transmitting;
+
+ // we cannot write more than txMTU otherwise the extra data will just be lost
+ TInt dataLen = qMin(txArray.length(),txMTU);
+
+ TRAPD(err, txDescriptor.Set(reinterpret_cast<const unsigned char *>(txArray.constData()),dataLen));
+ if(err != KErrNone)
+ {
+ transmitting = false;
+ }
+ else
+ {
+ err = iSocket->Write(txDescriptor);
+ if (err != KErrNone)
+ {
+ transmitting = false;
+ }
+ writeSize = dataLen;
+ transmitting = true;
+ }
+ return transmitting;
+}
QTM_END_NAMESPACE
diff --git a/src/connectivity/bluetooth/qbluetoothtransfermanager.cpp b/src/connectivity/bluetooth/qbluetoothtransfermanager.cpp
index 8f32870320..af45655ca5 100644
--- a/src/connectivity/bluetooth/qbluetoothtransfermanager.cpp
+++ b/src/connectivity/bluetooth/qbluetoothtransfermanager.cpp
@@ -51,6 +51,7 @@ QTM_BEGIN_NAMESPACE
\ingroup connectivity-bluetooth
\inmodule QtConnectivity
+ \since 1.2
QBluetoothTransferManager uses OBEX to send get and put commands to remote devices.
*/
diff --git a/src/connectivity/bluetooth/qbluetoothtransferreply.cpp b/src/connectivity/bluetooth/qbluetoothtransferreply.cpp
index 9bdffa569c..cf4f8f5d70 100644
--- a/src/connectivity/bluetooth/qbluetoothtransferreply.cpp
+++ b/src/connectivity/bluetooth/qbluetoothtransferreply.cpp
@@ -53,6 +53,7 @@ QTM_BEGIN_NAMESPACE
\ingroup connectivity-bluetooth
\inmodule QtConnectivity
+ \since 1.2
In additional to a copy of the QBluetoothTransferRequest object used to create the request,
QBluetoothTransferReply contains the contents of the reply itself.
diff --git a/src/connectivity/bluetooth/qbluetoothtransferreply_bluez_p.h b/src/connectivity/bluetooth/qbluetoothtransferreply_bluez_p.h
index 2274efb70c..0a7c2fa7bb 100644
--- a/src/connectivity/bluetooth/qbluetoothtransferreply_bluez_p.h
+++ b/src/connectivity/bluetooth/qbluetoothtransferreply_bluez_p.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
@@ -63,7 +63,7 @@ class Q_CONNECTIVITY_EXPORT QBluetoothTransferReplyBluez : public QBluetoothTran
Q_OBJECT
public:
- QBluetoothTransferReplyBluez(QIODevice *input, QObject *parent = 0);
+ explicit QBluetoothTransferReplyBluez(QIODevice *input, QObject *parent = 0);
~QBluetoothTransferReplyBluez();
QVariant attribute(QBluetoothTransferRequest::Attribute code) const;
diff --git a/src/connectivity/bluetooth/qbluetoothtransferrequest.cpp b/src/connectivity/bluetooth/qbluetoothtransferrequest.cpp
index 5e1ac9e82f..d8aff3731a 100644
--- a/src/connectivity/bluetooth/qbluetoothtransferrequest.cpp
+++ b/src/connectivity/bluetooth/qbluetoothtransferrequest.cpp
@@ -53,6 +53,7 @@ QTM_BEGIN_NAMESPACE
\ingroup connectivity-bluetooth
\inmodule QtConnectivity
+ \since 1.2
QBluetoothTransferRequest is part of the Bluetooth Transfer API and is the class holding the
information necessary to initiate a transfer over Bluetooth.
@@ -81,7 +82,7 @@ QBluetoothTransferRequest::QBluetoothTransferRequest(const QBluetoothAddress &ad
:d_ptr(new QBluetoothTransferRequestPrivate)
{
Q_D(QBluetoothTransferRequest);
-
+
d->m_address = address;
}
@@ -111,7 +112,7 @@ QBluetoothTransferRequest::~QBluetoothTransferRequest()
QVariant QBluetoothTransferRequest::attribute(Attribute code, const QVariant &defaultValue) const
{
Q_D(const QBluetoothTransferRequest);
-
+
if (d->m_parameters.contains((int)code)) {
return d->m_parameters.value((int)code);
} else {
@@ -129,7 +130,7 @@ QVariant QBluetoothTransferRequest::attribute(Attribute code, const QVariant &de
void QBluetoothTransferRequest::setAttribute(Attribute code, const QVariant &value)
{
Q_D(QBluetoothTransferRequest);
-
+
d->m_parameters.insert((int)code, value);
}
@@ -139,7 +140,7 @@ void QBluetoothTransferRequest::setAttribute(Attribute code, const QVariant &val
QBluetoothAddress QBluetoothTransferRequest::address() const
{
Q_D(const QBluetoothTransferRequest);
-
+
return d->m_address;
}
@@ -160,7 +161,7 @@ bool QBluetoothTransferRequest::operator!=(const QBluetoothTransferRequest &othe
QBluetoothTransferRequest &QBluetoothTransferRequest::operator=(const QBluetoothTransferRequest &other)
{
Q_D(QBluetoothTransferRequest);
-
+
d->m_address = other.d_func()->m_address;
d->m_parameters = other.d_func()->m_parameters;
diff --git a/src/connectivity/bluetooth/qbluetoothuuid.cpp b/src/connectivity/bluetooth/qbluetoothuuid.cpp
index a4dbc6549a..1ab1f9f7f6 100644
--- a/src/connectivity/bluetooth/qbluetoothuuid.cpp
+++ b/src/connectivity/bluetooth/qbluetoothuuid.cpp
@@ -60,6 +60,7 @@ Q_GLOBAL_STATIC_WITH_ARGS(QUuid, baseUuid, ("{00000000-0000-1000-8000-00805F9B34
/*!
\class QBluetoothUuid
\brief The QBluetoothUuid class provides a Bluetooth UUID.
+ \since 1.2
\ingroup connectivity-bluetooth
\inmodule QtConnectivity
diff --git a/src/connectivity/bluetooth/ql2capserver.cpp b/src/connectivity/bluetooth/ql2capserver.cpp
index 0b47f2a03e..1490c9e015 100644
--- a/src/connectivity/bluetooth/ql2capserver.cpp
+++ b/src/connectivity/bluetooth/ql2capserver.cpp
@@ -51,6 +51,7 @@ QTM_BEGIN_NAMESPACE
\ingroup connectivity-bluetooth
\inmodule QtConnectivity
+ \since 1.2
QL2capServer is used to implement Bluetooth services over L2CAP.
diff --git a/src/connectivity/bluetooth/ql2capserver.h b/src/connectivity/bluetooth/ql2capserver.h
index 652a019455..99c20a582b 100644
--- a/src/connectivity/bluetooth/ql2capserver.h
+++ b/src/connectivity/bluetooth/ql2capserver.h
@@ -48,6 +48,7 @@
#include <qbluetoothaddress.h>
#include <qbluetooth.h>
+#include <qbluetoothsocket.h>
QT_BEGIN_HEADER
@@ -90,6 +91,12 @@ protected:
private:
Q_DECLARE_PRIVATE(QL2capServer)
+#ifdef QTM_SYMBIAN_BLUETOOTH
+ Q_PRIVATE_SLOT(d_func(), void _q_connected())
+ Q_PRIVATE_SLOT(d_func(), void _q_socketError(QBluetoothSocket::SocketError err))
+ Q_PRIVATE_SLOT(d_func(), void _q_disconnected())
+#endif //QTM_SYMBIAN_BLUETOOTH
+
#ifndef QT_NO_DBUS
Q_PRIVATE_SLOT(d_func(), void _q_newConnection())
#endif
diff --git a/src/connectivity/bluetooth/ql2capserver_p.h b/src/connectivity/bluetooth/ql2capserver_p.h
index c073af649e..b5e76d95f2 100644
--- a/src/connectivity/bluetooth/ql2capserver_p.h
+++ b/src/connectivity/bluetooth/ql2capserver_p.h
@@ -43,6 +43,7 @@
#define QL2CAPSERVER_P_H
#include <qmobilityglobal.h>
+#include <qbluetoothsocket.h>
#ifdef QTM_SYMBIAN_BLUETOOTH
#include <es_sock.h>
@@ -67,10 +68,6 @@ class QBluetoothSocketPrivate;
class QL2capServer;
class QL2capServerPrivate
-#ifdef QTM_SYMBIAN_BLUETOOTH
-: public MBluetoothSocketNotifier
-#endif //QTM_SYMBIAN_BLUETOOTH
-
{
Q_DECLARE_PUBLIC(QL2capServer)
@@ -78,20 +75,17 @@ public:
QL2capServerPrivate();
~QL2capServerPrivate();
+#ifdef QTM_SYMBIAN_BLUETOOTH
+ // private slots
+ void _q_connected();
+ void _q_socketError(QBluetoothSocket::SocketError err);
+ void _q_disconnected();
+#endif //QTM_SYMBIAN_BLUETOOTH
+
#ifndef QT_NO_DBUS
void _q_newConnection();
#endif
-#ifdef QTM_SYMBIAN_BLUETOOTH
- /* MBluetoothSocketNotifier virtual functions */
- void HandleAcceptCompleteL(TInt aErr);
- void HandleActivateBasebandEventNotifierCompleteL(TInt aErr, TBTBasebandEventNotification &aEventNotification);
- void HandleConnectCompleteL(TInt aErr);
- void HandleIoctlCompleteL(TInt aErr);
- void HandleReceiveCompleteL(TInt aErr);
- void HandleSendCompleteL(TInt aErr);
- void HandleShutdownCompleteL(TInt aErr);
-#endif //QTM_SYMBIAN_BLUETOOTH
public:
QBluetoothSocket *socket;
@@ -101,7 +95,6 @@ public:
QBluetooth::SecurityFlags securityFlags;
#ifdef QTM_SYMBIAN_BLUETOOTH
- QBluetoothSocket *pendingSocket;
mutable QList<QBluetoothSocket *> activeSockets;
QBluetoothSocketPrivate *ds;
#endif //QTM_SYMBIAN_BLUETOOTH
diff --git a/src/connectivity/bluetooth/ql2capserver_symbian.cpp b/src/connectivity/bluetooth/ql2capserver_symbian.cpp
index 2b5a765310..38e9f2b959 100644
--- a/src/connectivity/bluetooth/ql2capserver_symbian.cpp
+++ b/src/connectivity/bluetooth/ql2capserver_symbian.cpp
@@ -53,11 +53,8 @@
QTM_BEGIN_NAMESPACE
QL2capServerPrivate::QL2capServerPrivate()
-: pending(false),maxPendingConnections(1)
+: socket(0),pending(false),maxPendingConnections(1),securityFlags(QBluetooth::NoSecurity)
{
- socket = new QBluetoothSocket(QBluetoothSocket::L2capSocket);
- ds = socket->d_ptr;
- ds->iSocket->SetNotifier(*this);
}
QL2capServerPrivate::~QL2capServerPrivate()
@@ -68,9 +65,14 @@ QL2capServerPrivate::~QL2capServerPrivate()
void QL2capServer::close()
{
Q_D(QL2capServer);
-
+ if(!d->socket)
+ {
+ // there is no way to propagate the error to user
+ // so just ignore the problem.
+ return;
+ }
+ d->socket->setSocketState(QBluetoothSocket::ClosingState);
d->socket->close();
-
// force active object (socket) to run and shutdown socket.
qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
}
@@ -78,8 +80,40 @@ void QL2capServer::close()
bool QL2capServer::listen(const QBluetoothAddress &address, quint16 port)
{
Q_D(QL2capServer);
-
+ // listen has already been called before
+ if(d->socket)
+ return true;
+
+ d->socket = new QBluetoothSocket(QBluetoothSocket::L2capSocket,this);
+
+ if(!d->socket)
+ {
+ return false;
+ }
+
+ d->ds = d->socket->d_ptr;
+
+ if(!d->ds)
+ {
+ delete d->socket;
+ d->socket = 0;
+ return false;
+ }
+
TL2CAPSockAddr addr;
+
+ if(!address.isNull())
+ {
+ // TBTDevAddr constructor may panic
+ TRAPD(err,addr.SetBTAddr(TBTDevAddr(address.toUInt64())));
+ if(err != KErrNone)
+ {
+ delete d->socket;
+ d->socket = 0;
+ return false;
+ }
+ }
+
if (port == 0)
addr.SetPort(KL2CAPPassiveAutoBind);
else
@@ -88,12 +122,16 @@ bool QL2capServer::listen(const QBluetoothAddress &address, quint16 port)
TBTServiceSecurity security;
switch (d->securityFlags) {
case QBluetooth::Authentication:
- security.SetAuthentication(ETrue);
+ security.SetAuthentication(EMitmDesired);
break;
case QBluetooth::Authorization:
security.SetAuthorisation(ETrue);
break;
case QBluetooth::Encryption:
+ // "Secure" is BlueZ specific we just make sure the code remain compatible
+ case QBluetooth::Secure:
+ // authentication required
+ security.SetAuthentication(EMitmDesired);
security.SetEncryption(ETrue);
break;
case QBluetooth::NoSecurity:
@@ -101,35 +139,59 @@ bool QL2capServer::listen(const QBluetoothAddress &address, quint16 port)
break;
}
addr.SetSecurity(security);
- d->ds->iSocket->Bind(addr);
- d->socket->setSocketState(QBluetoothSocket::BoundState);
-
- d->ds->iSocket->Listen(d->maxPendingConnections);
-
- d->pendingSocket = new QBluetoothSocket(QBluetoothSocket::L2capSocket, this);
-
- QBluetoothSocketPrivate *pd = d->pendingSocket->d_ptr;
- pd->ensureBlankNativeSocket();
- if (d->ds->iSocket->Accept(*pd->iBlankSocket) == KErrNone)
+ if(d->ds->iSocket->Bind(addr) == KErrNone)
+ {
+ d->socket->setSocketState(QBluetoothSocket::BoundState);
+ }
+ else
+ {
+ delete d->socket;
+ d->socket = 0;
+ return false;
+ }
+
+ if(d->ds->iSocket->Listen(d->maxPendingConnections) != KErrNone)
+ {
+ delete d->socket;
+ d->socket = 0;
+ return false;
+ }
+ // unknown socket type is used for blank socket
+ QBluetoothSocket *pendingSocket = new QBluetoothSocket(QBluetoothSocket::UnknownSocketType, this);
+ if(!pendingSocket)
+ {
+ delete d->socket;
+ d->socket = 0;
+ return false;
+ }
+ QBluetoothSocketPrivate *pd = pendingSocket->d_ptr;
+ pd->ensureBlankNativeSocket(QBluetoothSocket::L2capSocket);
+ connect(d->socket, SIGNAL(disconnected()), this, SLOT(disconnected()));
+ connect(d->socket, SIGNAL(connected()), this, SLOT(connected()));
+ connect(d->socket, SIGNAL(error(QBluetoothSocket::SocketError)), this, SLOT(socketError(QBluetoothSocket::SocketError)));
+ if (d->ds->iSocket->Accept(*pd->iSocket) == KErrNone)
+ {
d->socket->setSocketState(QBluetoothSocket::ListeningState);
+ d->activeSockets.append(pendingSocket);
+ return true;
+ }
else
- d->socket->close();
-
- return d->socket->state() == QBluetoothSocket::ListeningState;
+ {
+ delete d->socket, pendingSocket;
+ d->socket = 0;
+ return false;
+ }
}
void QL2capServer::setMaxPendingConnections(int numConnections)
{
Q_D(QL2capServer);
-
- if (d->socket->state() == QBluetoothSocket::UnconnectedState)
- d->maxPendingConnections = numConnections;
+ d->maxPendingConnections = numConnections;
}
bool QL2capServer::hasPendingConnections() const
{
Q_D(const QL2capServer);
-
return !d->activeSockets.isEmpty();
}
@@ -141,98 +203,87 @@ QBluetoothSocket *QL2capServer::nextPendingConnection()
return 0;
QBluetoothSocket *next = d->activeSockets.takeFirst();
- QBluetoothSocketPrivate *n = next->d_ptr;
-
- n->startServerSideReceive();
-
return next;
}
QBluetoothAddress QL2capServer::serverAddress() const
{
Q_D(const QL2capServer);
-
- return d->socket->localAddress();
+ if(d->socket)
+ return d->socket->localAddress();
+ else
+ return QBluetoothAddress();
}
quint16 QL2capServer::serverPort() const
{
Q_D(const QL2capServer);
-
- return d->socket->localPort();
+ if(d->socket)
+ return d->socket->localPort();
+ else
+ return 0;
}
-void QL2capServerPrivate::HandleAcceptCompleteL(TInt aErr)
+void QL2capServerPrivate::_q_connected()
{
Q_Q(QL2capServer);
-
- if (aErr == KErrNone) {
- pendingSocket->setSocketState(QBluetoothSocket::ConnectedState);
+ if(!activeSockets.isEmpty())
+ {
+ // update state of the pending socket and start receiving
+ (activeSockets.last())->setSocketState(QBluetoothSocket::ConnectedState);
+ (activeSockets.last())->d_ptr->startReceive();
+ }
+ else
+ return;
+ emit q->newConnection();
+ QBluetoothSocket *pendingSocket = new QBluetoothSocket(QBluetoothSocket::UnknownSocketType);
+ if(!pendingSocket)
+ {
+ delete socket;
+ socket = 0;
+ return;
+ }
+ QBluetoothSocketPrivate *pd = pendingSocket->d_ptr;
+ pd->ensureBlankNativeSocket(QBluetoothSocket::L2capSocket);
+ if (ds->iSocket->Accept(*pd->iSocket) == KErrNone)
+ {
+ socket->setSocketState(QBluetoothSocket::ListeningState);
activeSockets.append(pendingSocket);
-
- QBluetoothSocketPrivate *pd = pendingSocket->d_ptr;
-
- pd->iSocket->Accept(*pd->iBlankSocket);
-
- emit q->newConnection();
- } else if (aErr == KErrCancel) {
- // server is closing
- delete pendingSocket;
- pendingSocket = 0;
- socket->setSocketState(QBluetoothSocket::BoundState);
- } else {
- qDebug() << __PRETTY_FUNCTION__ << aErr;
return;
- }
-}
-
-void QL2capServerPrivate::HandleActivateBasebandEventNotifierCompleteL(TInt aErr, TBTBasebandEventNotification &aEventNotification)
-{
- qDebug() << __PRETTY_FUNCTION__ << aErr;
-}
-
-void QL2capServerPrivate::HandleConnectCompleteL(TInt aErr)
-{
- qDebug() << __PRETTY_FUNCTION__ << aErr;
-}
-
-void QL2capServerPrivate::HandleIoctlCompleteL(TInt aErr)
-{
- qDebug() << __PRETTY_FUNCTION__ << aErr;
-}
-
-void QL2capServerPrivate::HandleReceiveCompleteL(TInt aErr)
-{
- qDebug() << __PRETTY_FUNCTION__ << aErr;
+ }
+ else
+ {
+ // we might reach this statement if we have reach
+ // maxPendingConnections
+ qDebug() << "QL2capServer::connected accept failed";
+ delete socket, pendingSocket;
+ socket = 0;
+ return;
+ }
}
-void QL2capServerPrivate::HandleSendCompleteL(TInt aErr)
+void QL2capServerPrivate::_q_disconnected()
{
- qDebug() << __PRETTY_FUNCTION__ << aErr;
+ delete socket;
+ socket = 0;
}
-void QL2capServerPrivate::HandleShutdownCompleteL(TInt aErr)
+void QL2capServerPrivate::_q_socketError(QBluetoothSocket::SocketError err)
{
- if (aErr == KErrNone)
- socket->setSocketState(QBluetoothSocket::UnconnectedState);
- else
- qDebug() << __PRETTY_FUNCTION__ << aErr;
+ delete socket;
+ socket = 0;
}
void QL2capServer::setSecurityFlags(QBluetooth::SecurityFlags security)
{
Q_D(QL2capServer);
-
d->securityFlags = security;
}
QBluetooth::SecurityFlags QL2capServer::securityFlags() const
{
Q_D(const QL2capServer);
-
return d->securityFlags;
}
-
-
QTM_END_NAMESPACE
diff --git a/src/connectivity/bluetooth/qrfcommserver.cpp b/src/connectivity/bluetooth/qrfcommserver.cpp
index 76fa17c8da..d16e73d662 100644
--- a/src/connectivity/bluetooth/qrfcommserver.cpp
+++ b/src/connectivity/bluetooth/qrfcommserver.cpp
@@ -51,6 +51,7 @@ QTM_BEGIN_NAMESPACE
\ingroup connectivity-bluetooth
\inmodule QtConnectivity
+ \since 1.2
QRfcommServer is used to implement Bluetooth services over RFCOMM.
diff --git a/src/connectivity/bluetooth/qrfcommserver.h b/src/connectivity/bluetooth/qrfcommserver.h
index 49dc71bf83..3f348dddb1 100644
--- a/src/connectivity/bluetooth/qrfcommserver.h
+++ b/src/connectivity/bluetooth/qrfcommserver.h
@@ -48,6 +48,7 @@
#include <qbluetoothaddress.h>
#include <qbluetooth.h>
+#include <qbluetoothsocket.h>
QT_BEGIN_HEADER
@@ -90,6 +91,12 @@ protected:
private:
Q_DECLARE_PRIVATE(QRfcommServer)
+#ifdef QTM_SYMBIAN_BLUETOOTH
+ Q_PRIVATE_SLOT(d_func(), void _q_connected())
+ Q_PRIVATE_SLOT(d_func(), void _q_socketError(QBluetoothSocket::SocketError err))
+ Q_PRIVATE_SLOT(d_func(), void _q_disconnected())
+#endif //QTM_SYMBIAN_BLUETOOTH
+
#ifndef QT_NO_DBUS
Q_PRIVATE_SLOT(d_func(), void _q_newConnection())
#endif
diff --git a/src/connectivity/bluetooth/qrfcommserver_p.h b/src/connectivity/bluetooth/qrfcommserver_p.h
index 7a7cbfb6df..da6e28b9ad 100644
--- a/src/connectivity/bluetooth/qrfcommserver_p.h
+++ b/src/connectivity/bluetooth/qrfcommserver_p.h
@@ -44,6 +44,7 @@
#include <QtGlobal>
#include <QList>
+#include <qbluetoothsocket.h>
#ifdef QTM_SYMBIAN_BLUETOOTH
#include <es_sock.h>
@@ -68,9 +69,6 @@ class QBluetoothSocketPrivate;
class QRfcommServer;
class QRfcommServerPrivate
-#ifdef QTM_SYMBIAN_BLUETOOTH
-: public MBluetoothSocketNotifier
-#endif
{
Q_DECLARE_PUBLIC(QRfcommServer)
@@ -79,15 +77,11 @@ public:
~QRfcommServerPrivate();
#ifdef QTM_SYMBIAN_BLUETOOTH
- /* MBluetoothSocketNotifier virtual functions */
- void HandleAcceptCompleteL(TInt aErr);
- void HandleActivateBasebandEventNotifierCompleteL(TInt aErr, TBTBasebandEventNotification &aEventNotification);
- void HandleConnectCompleteL(TInt aErr);
- void HandleIoctlCompleteL(TInt aErr);
- void HandleReceiveCompleteL(TInt aErr);
- void HandleSendCompleteL(TInt aErr);
- void HandleShutdownCompleteL(TInt aErr);
-#endif
+ // private slots
+ void _q_connected();
+ void _q_socketError(QBluetoothSocket::SocketError err);
+ void _q_disconnected();
+#endif //QTM_SYMBIAN_BLUETOOTH
#ifndef QT_NO_DBUS
void _q_newConnection();
@@ -97,7 +91,6 @@ public:
QBluetoothSocket *socket;
#ifdef QTM_SYMBIAN_BLUETOOTH
- QBluetoothSocket *pendingSocket;
mutable QList<QBluetoothSocket *> activeSockets;
QBluetoothSocketPrivate *ds;
#endif
diff --git a/src/connectivity/bluetooth/qrfcommserver_symbian.cpp b/src/connectivity/bluetooth/qrfcommserver_symbian.cpp
index d020958fd5..77cdd3da6a 100644
--- a/src/connectivity/bluetooth/qrfcommserver_symbian.cpp
+++ b/src/connectivity/bluetooth/qrfcommserver_symbian.cpp
@@ -54,11 +54,8 @@
QTM_BEGIN_NAMESPACE
QRfcommServerPrivate::QRfcommServerPrivate()
-: pendingSocket(0), maxPendingConnections(1), securityFlags(QBluetooth::NoSecurity)
+: socket(0),maxPendingConnections(1),securityFlags(QBluetooth::NoSecurity)
{
- socket = new QBluetoothSocket(QBluetoothSocket::RfcommSocket);
- ds = socket->d_ptr;
- ds->iSocket->SetNotifier(*this);
}
QRfcommServerPrivate::~QRfcommServerPrivate()
@@ -69,9 +66,14 @@ QRfcommServerPrivate::~QRfcommServerPrivate()
void QRfcommServer::close()
{
Q_D(QRfcommServer);
-
+ if(!d->socket)
+ {
+ // there is no way to propagate the error to user
+ // so just ignore the problem.
+ return;
+ }
+ d->socket->setSocketState(QBluetoothSocket::ClosingState);
d->socket->close();
-
// force active object (socket) to run and shutdown socket.
qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
}
@@ -79,186 +81,208 @@ void QRfcommServer::close()
bool QRfcommServer::listen(const QBluetoothAddress &address, quint16 port)
{
Q_D(QRfcommServer);
- qDebug() << __PRETTY_FUNCTION__ << ">> " << this << address.toString() << port;
+ // listen has already been called before
+ if(d->socket)
+ return true;
+
+ d->socket = new QBluetoothSocket(QBluetoothSocket::RfcommSocket,this);
+
+ if(!d->socket)
+ {
+ return false;
+ }
+
+ d->ds = d->socket->d_ptr;
+
+ if(!d->ds)
+ {
+ delete d->socket;
+ d->socket = 0;
+ return false;
+ }
+
+ d->ds->ensureNativeSocket(QBluetoothSocket::RfcommSocket);
TRfcommSockAddr addr;
- if (!address.isNull())
- addr.SetBTAddr(TBTDevAddr(address.toUInt64()));
- else
- addr.SetBTAddr(TBTDevAddr(Q_UINT64_C(0)));
+ if(!address.isNull())
+ {
+ // TBTDevAddr constructor may panic
+ TRAPD(err,addr.SetBTAddr(TBTDevAddr(address.toUInt64())));
+ if(err != KErrNone)
+ {
+ delete d->socket;
+ d->socket = 0;
+ return false;
+ }
+ }
if (port == 0)
addr.SetPort(KRfcommPassiveAutoBind);
else
addr.SetPort(port);
- TBTServiceSecurity security;
+ TBTServiceSecurity security;
switch (d->securityFlags) {
case QBluetooth::Authentication:
- security.SetAuthentication(ETrue);
+ security.SetAuthentication(EMitmDesired);
break;
case QBluetooth::Authorization:
security.SetAuthorisation(ETrue);
break;
case QBluetooth::Encryption:
+ // "Secure" is BlueZ specific we just make sure the code remain compatible
+ case QBluetooth::Secure:
+ // authentication required
+ security.SetAuthentication(EMitmDesired);
security.SetEncryption(ETrue);
break;
case QBluetooth::NoSecurity:
default:
break;
}
- addr.SetSecurity(security);
-
- int err;
- if ((err=d->ds->iSocket->Bind(addr)) == KErrNone) {
+ if(d->ds->iSocket->Bind(addr) == KErrNone)
+ {
d->socket->setSocketState(QBluetoothSocket::BoundState);
- } else {
- qDebug() << __PRETTY_FUNCTION__ << "Socket bind failed, err=" << err;
- d->socket->close();
+ }
+ else
+ {
+ delete d->socket;
+ d->socket = 0;
return false;
- }
+ }
- if ((err=d->ds->iSocket->Listen(d->maxPendingConnections)) != KErrNone) {
- qDebug() << __PRETTY_FUNCTION__ << "Socket listen failed, err=" << err;
- d->socket->close();
+ if(d->ds->iSocket->Listen(d->maxPendingConnections) != KErrNone)
+ {
+ delete d->socket;
+ d->socket = 0;
return false;
- }
+ }
- d->pendingSocket = new QBluetoothSocket(QBluetoothSocket::RfcommSocket, this);
-
- QBluetoothSocketPrivate *pd = d->pendingSocket->d_ptr;
-
- pd->ensureBlankNativeSocket();
-
- if (d->ds->iSocket->Accept(*pd->iBlankSocket) == KErrNone)
+ QBluetoothSocket *pendingSocket = new QBluetoothSocket(QBluetoothSocket::UnknownSocketType, this);
+ if(!pendingSocket)
+ {
+ delete d->socket;
+ d->socket = 0;
+ return false;
+ }
+ QBluetoothSocketPrivate *pd = pendingSocket->d_ptr;
+ pd->ensureBlankNativeSocket(QBluetoothSocket::RfcommSocket);
+ connect(d->socket, SIGNAL(disconnected()), this, SLOT(disconnected()));
+ connect(d->socket, SIGNAL(connected()), this, SLOT(connected()));
+ connect(d->socket, SIGNAL(error(QBluetoothSocket::SocketError)), this, SLOT(socketError(QBluetoothSocket::SocketError)));
+ if (d->ds->iSocket->Accept(*pd->iSocket) == KErrNone)
+ {
d->socket->setSocketState(QBluetoothSocket::ListeningState);
+ d->activeSockets.append(pendingSocket);
+ return true;
+ }
else
- d->socket->close();
-
- return d->socket->state() == QBluetoothSocket::ListeningState;
+ {
+ delete d->socket, pendingSocket;
+ d->socket = 0;
+ return false;
+ }
}
void QRfcommServer::setMaxPendingConnections(int numConnections)
{
Q_D(QRfcommServer);
-
- if (d->socket->state() == QBluetoothSocket::UnconnectedState)
- d->maxPendingConnections = numConnections;
+ d->maxPendingConnections = numConnections;
}
QBluetoothAddress QRfcommServer::serverAddress() const
{
Q_D(const QRfcommServer);
-
- if (d->socket->state() == QBluetoothSocket::UnconnectedState)
+ if(d->socket)
+ return d->socket->localAddress();
+ else
return QBluetoothAddress();
-
- return d->ds->localAddress();
}
quint16 QRfcommServer::serverPort() const
{
Q_D(const QRfcommServer);
-
- if (d->socket->state() == QBluetoothSocket::UnconnectedState)
+ if(d->socket)
+ return d->socket->localPort();
+ else
return 0;
-
- return d->ds->iSocket->LocalPort();
}
bool QRfcommServer::hasPendingConnections() const
{
Q_D(const QRfcommServer);
-
return !d->activeSockets.isEmpty();
}
QBluetoothSocket *QRfcommServer::nextPendingConnection()
{
Q_D(QRfcommServer);
-
if (d->activeSockets.isEmpty())
return 0;
QBluetoothSocket *next = d->activeSockets.takeFirst();
- QBluetoothSocketPrivate *n = next->d_ptr;
-
- n->startServerSideReceive();
-
return next;
}
-void QRfcommServerPrivate::HandleAcceptCompleteL(TInt aErr)
+void QRfcommServerPrivate::_q_connected()
{
Q_Q(QRfcommServer);
-
- if (aErr == KErrNone) {
- pendingSocket->setSocketState(QBluetoothSocket::ConnectedState);
+ if(!activeSockets.isEmpty())
+ {
+ // update state of the pending socket and start receiving
+ (activeSockets.last())->setSocketState(QBluetoothSocket::ConnectedState);
+ (activeSockets.last())->d_ptr->startReceive();
+ }
+ else
+ return;
+ emit q->newConnection();
+ QBluetoothSocket *pendingSocket = new QBluetoothSocket(QBluetoothSocket::UnknownSocketType);
+ if(!pendingSocket)
+ {
+ delete socket;
+ socket = 0;
+ return;
+ }
+ QBluetoothSocketPrivate *pd = pendingSocket->d_ptr;
+ pd->ensureBlankNativeSocket(QBluetoothSocket::RfcommSocket);
+ if (ds->iSocket->Accept(*pd->iSocket) == KErrNone)
+ {
+ socket->setSocketState(QBluetoothSocket::ListeningState);
activeSockets.append(pendingSocket);
-
- QBluetoothSocketPrivate *pd = pendingSocket->d_ptr; // ToDo: probably need a new socket here
-
- pd->iSocket->Accept(*pd->iBlankSocket);
- emit q->newConnection();
- } else if (aErr == KErrCancel) {
- // server is closing
- delete pendingSocket;
- pendingSocket = 0;
- socket->setSocketState(QBluetoothSocket::BoundState);
- } else {
- // accept failed for unknown reason
- socket->setSocketState(QBluetoothSocket::BoundState);
- qDebug() << __PRETTY_FUNCTION__ << aErr;
return;
- }
-}
-
-void QRfcommServerPrivate::HandleActivateBasebandEventNotifierCompleteL(TInt aErr, TBTBasebandEventNotification &aEventNotification)
-{
- qDebug() << __PRETTY_FUNCTION__ << aErr;
-}
-
-void QRfcommServerPrivate::HandleConnectCompleteL(TInt aErr)
-{
- qDebug() << __PRETTY_FUNCTION__ << aErr;
-}
-
-void QRfcommServerPrivate::HandleIoctlCompleteL(TInt aErr)
-{
- qDebug() << __PRETTY_FUNCTION__ << aErr;
-}
-
-void QRfcommServerPrivate::HandleReceiveCompleteL(TInt aErr)
-{
- qDebug() << __PRETTY_FUNCTION__ << aErr;
+ }
+ else
+ {
+ // we might reach this statement if we have reach
+ // maxPendingConnections
+ delete socket, pendingSocket;
+ socket = 0;
+ return;
+ }
}
-void QRfcommServerPrivate::HandleSendCompleteL(TInt aErr)
+void QRfcommServerPrivate::_q_disconnected()
{
- qDebug() << __PRETTY_FUNCTION__ << aErr;
+ delete socket;
+ socket = 0;
}
-void QRfcommServerPrivate::HandleShutdownCompleteL(TInt aErr)
+void QRfcommServerPrivate::_q_socketError(QBluetoothSocket::SocketError err)
{
- if (aErr == KErrNone)
- socket->setSocketState(QBluetoothSocket::UnconnectedState);
- else
- qDebug() << __PRETTY_FUNCTION__ << aErr;
+ delete socket;
+ socket = 0;
}
void QRfcommServer::setSecurityFlags(QBluetooth::SecurityFlags security)
{
Q_D(QRfcommServer);
-
d->securityFlags = security;
}
QBluetooth::SecurityFlags QRfcommServer::securityFlags() const
{
Q_D(const QRfcommServer);
-
return d->securityFlags;
}
-
QTM_END_NAMESPACE
diff --git a/src/connectivity/bluetooth/symbian/bluetoothlinkmanagerdevicediscoverer.cpp b/src/connectivity/bluetooth/symbian/bluetoothlinkmanagerdevicediscoverer.cpp
index ea2d540b48..314fc3fea3 100644
--- a/src/connectivity/bluetooth/symbian/bluetoothlinkmanagerdevicediscoverer.cpp
+++ b/src/connectivity/bluetooth/symbian/bluetoothlinkmanagerdevicediscoverer.cpp
@@ -58,6 +58,7 @@ QTM_BEGIN_NAMESPACE
/*! \internal
\class BluetoothLinkManagerDeviceDiscoverer
\brief The BluetoothLinkManagerDeviceDiscoverer class searches other bluetooth devices.
+ \since 1.2
\ingroup connectivity-bluetooth
\inmodule QtConnectivity
@@ -79,6 +80,7 @@ BluetoothLinkManagerDeviceDiscoverer::BluetoothLinkManagerDeviceDiscoverer(RSock
: QObject(parent)
, CActive(CActive::EPriorityStandard)
, m_socketServer(socketServer)
+ , m_pendingCancel(false), m_pendingStart(false), m_discoveryType (0)
{
TInt result;
@@ -107,13 +109,17 @@ BluetoothLinkManagerDeviceDiscoverer::~BluetoothLinkManagerDeviceDiscoverer()
/*!
Starts up device discovery. When devices are discovered signal deviceDiscovered is emitted.
After signal deviceDiscoveryComplete() is emitted new discovery request can be made.
- Returns false if discovery is ongoing and new discovery is started.
*/
-bool BluetoothLinkManagerDeviceDiscoverer::startDiscovery(const uint discoveryType)
+void BluetoothLinkManagerDeviceDiscoverer::startDiscovery(const uint discoveryType)
{
- bool returnValue = false;
+ m_discoveryType = discoveryType;
+
+ if(m_pendingCancel == true) {
+ m_pendingStart = true;
+ m_pendingCancel = false;
+ return;
+ }
if (!IsActive()) {
- returnValue = true;
m_addr.SetIAC( discoveryType );
#ifdef EIR_SUPPORTED
m_addr.SetAction(KHostResInquiry | KHostResName | KHostResIgnoreCache | KHostResEir);
@@ -123,24 +129,67 @@ bool BluetoothLinkManagerDeviceDiscoverer::startDiscovery(const uint discoveryTy
m_hostResolver.GetByAddress(m_addr, m_entry, iStatus);
SetActive();
}
- return returnValue;
}
+
+void BluetoothLinkManagerDeviceDiscoverer::stopDiscovery()
+{
+ m_pendingStart = false;
+ if (IsActive() && !m_pendingCancel) {
+ m_pendingCancel = true;
+ m_hostResolver.Cancel();
+ }
+}
+
/*!
Informs that our request has been prosessed and the data is available to be used.
*/
void BluetoothLinkManagerDeviceDiscoverer::RunL()
{
- if (iStatus.Int() == KErrHostResNoMoreResults) {
- emit deviceDiscoveryComplete(iStatus.Int());
- } else if (iStatus.Int() != KErrNone) {
+ qDebug() << __PRETTY_FUNCTION__ << iStatus.Int();
+ switch (iStatus.Int()) {
+ case KErrNone: // found device
+ if (m_pendingCancel && !m_pendingStart) {
+ m_pendingCancel = false;
+ emit canceled();
+ } else {
+ m_pendingCancel = false;
+ m_pendingStart = false;
+ // get next (possible) discovered device
+ m_hostResolver.Next(m_entry, iStatus);
+ SetActive();
+ emit deviceDiscovered(currentDeviceDataToQBluetoothDeviceInfo());
+ }
+ break;
+ case KErrHostResNoMoreResults: // done with search
+ if (m_pendingCancel && !m_pendingStart){ // search was canceled prior to finishing
+ m_pendingCancel = false;
+ m_pendingStart = false;
+ emit canceled();
+ }
+ else if (m_pendingStart){ // search was restarted just prior to finishing
+ m_pendingStart = false;
+ m_pendingCancel = false;
+ startDiscovery(m_discoveryType);
+ } else { // search completed normally
+ m_pendingStart = false;
+ m_pendingCancel = false;
+ emit deviceDiscoveryComplete();
+ }
+ break;
+ case KErrCancel: // user canceled search
+ if (m_pendingStart){ // user activated search after cancel
+ m_pendingStart = false;
+ m_pendingCancel = false;
+ startDiscovery(m_discoveryType);
+ } else { // standard user cancel case
+ m_pendingCancel = false;
+ emit canceled();
+ }
+ break;
+ default:
+ m_pendingStart = false;
+ m_pendingCancel = false;
setError(iStatus.Int());
- } else {
- // get next (possible) discovered device
- m_hostResolver.Next(m_entry, iStatus);
- // set this AO active ie running
- SetActive();
- // finally inform that we have found a new device
- emit deviceDiscovered(currentDeviceDataToQBluetoothDeviceInfo());
}
}
/*!
@@ -157,6 +206,15 @@ TInt BluetoothLinkManagerDeviceDiscoverer::RunError(TInt aError)
return KErrNone;
}
+bool BluetoothLinkManagerDeviceDiscoverer::isReallyActive() const
+{
+ if(m_pendingStart)
+ return true;
+ if(m_pendingCancel)
+ return false;
+ return IsActive();
+}
+
/*!
Transforms Symbian device name, address and service classes to QBluetootDeviceInfo.
*/
@@ -166,17 +224,31 @@ QBluetoothDeviceInfo BluetoothLinkManagerDeviceDiscoverer::currentDeviceDataToQB
#ifdef EIR_SUPPORTED
TBluetoothNameRecordWrapper eir(m_entry());
TInt bufferlength = 0;
+ TInt err = KErrNone;
QString deviceName;
bufferlength = eir.GetDeviceNameLength();
if (bufferlength > 0) {
TBool nameComplete;
- HBufC *deviceNameBuffer = HBufC::NewLC(bufferlength);
- TPtr ptr = deviceNameBuffer->Des();
- TInt error = eir.GetDeviceName(ptr,nameComplete);
- if (error == KErrNone && nameComplete)
- deviceName = QString::fromUtf16(ptr.Ptr(), ptr.Length()).toUpper();
- CleanupStack::PopAndDestroy(deviceNameBuffer);
+ HBufC *deviceNameBuffer = 0;
+ TRAP(err,deviceNameBuffer = HBufC::NewLC(bufferlength));
+ if(err)
+ deviceName = QString();
+ else
+ {
+ TPtr ptr = deviceNameBuffer->Des();
+ err = eir.GetDeviceName(ptr,nameComplete);
+ if (err == KErrNone /*&& nameComplete*/)
+ {
+ if(!nameComplete)
+ qWarning() << "device name incomplete";
+ // isn't it better to get an incomplete name than getting nothing?
+ deviceName = QString::fromUtf16(ptr.Ptr(), ptr.Length()).toUpper();
+ }
+ else
+ deviceName = QString();
+ CleanupStack::PopAndDestroy(deviceNameBuffer);
+ }
}
QList<QBluetoothUuid> serviceUidList;
@@ -220,11 +292,19 @@ QBluetoothDeviceInfo BluetoothLinkManagerDeviceDiscoverer::currentDeviceDataToQB
bufferlength = eir.GetVendorSpecificDataLength();
if (bufferlength > 0) {
- HBufC8 *msd = HBufC8::NewLC(bufferlength);
- TPtr8 temp = msd->Des();
- if (eir.GetVendorSpecificData(temp))
- manufacturerData = s60Desc8ToQByteArray(temp);
- CleanupStack::PopAndDestroy(msd);
+ HBufC8 *msd = 0;
+ TRAP(err,HBufC8::NewLC(bufferlength));
+ if(err)
+ manufacturerData = QByteArray();
+ else
+ {
+ TPtr8 temp = msd->Des();
+ if (eir.GetVendorSpecificData(temp))
+ manufacturerData = s60Desc8ToQByteArray(temp);
+ else
+ manufacturerData = QByteArray();
+ CleanupStack::PopAndDestroy(msd);
+ }
}
// Get transmission power level
@@ -270,30 +350,41 @@ QBluetoothDeviceInfo BluetoothLinkManagerDeviceDiscoverer::currentDeviceDataToQB
void BluetoothLinkManagerDeviceDiscoverer::setError(int errorCode)
{
- QString errorDescription;
+ qDebug() << __PRETTY_FUNCTION__ << "errorCode=" << errorCode;
+ QString errorString;
switch (errorCode) {
case KLinkManagerErrBase:
- errorDescription.append("Link manager base error value or Insufficient baseband resources error value");
+ errorString.append("Link manager base error value or Insufficient baseband resources error value");
+ emit linkManagerError(QBluetoothDeviceDiscoveryAgent::UnknownError, errorString);
break;
case KErrProxyWriteNotAvailable:
- errorDescription.append("Proxy write not available error value");
+ errorString.append("Proxy write not available error value");
+ emit linkManagerError(QBluetoothDeviceDiscoveryAgent::UnknownError, errorString);
break;
case KErrReflexiveBluetoothLink:
- errorDescription.append("Reflexive BT link error value");
+ errorString.append("Reflexive BT link error value");
+ emit linkManagerError(QBluetoothDeviceDiscoveryAgent::UnknownError, errorString);
break;
case KErrPendingPhysicalLink:
- errorDescription.append("Physical link connection already pending when trying to connect the physical link");
+ errorString.append("Physical link connection already pending when trying to connect the physical link");
+ emit linkManagerError(QBluetoothDeviceDiscoveryAgent::UnknownError, errorString);
break;
case KErrNotReady:
- errorDescription.append("KErrNotReady");
+ errorString.append("KErrNotReady");
+ emit linkManagerError(QBluetoothDeviceDiscoveryAgent::UnknownError, errorString);
+ case KErrCancel:
+ errorString.append("KErrCancel");
+ qDebug() << "emitting canceled";
+ emit canceled();
+ break;
+ case KErrNone:
+ // do nothing
+ break;
default:
- errorDescription.append("Symbian errorCode =") + errorCode;
+ errorString = QString("Symbian errorCode = %1").arg(errorCode);
+ emit linkManagerError(QBluetoothDeviceDiscoveryAgent::UnknownError, errorString);
break;
}
- if (errorCode == KErrCancel)
- emit canceled();
- else if (errorCode != KErrNone)
- emit linkManagerError(QBluetoothDeviceDiscoveryAgent::UnknownError);
}
#include "moc_bluetoothlinkmanagerdevicediscoverer.cpp"
diff --git a/src/connectivity/bluetooth/symbian/bluetoothlinkmanagerdevicediscoverer.h b/src/connectivity/bluetooth/symbian/bluetoothlinkmanagerdevicediscoverer.h
index 5d8d4fd7d2..505f1ebe75 100644
--- a/src/connectivity/bluetooth/symbian/bluetoothlinkmanagerdevicediscoverer.h
+++ b/src/connectivity/bluetooth/symbian/bluetoothlinkmanagerdevicediscoverer.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
@@ -74,12 +74,15 @@ class QBluetoothDeviceInfo;
class BluetoothLinkManagerDeviceDiscoverer : public QObject, public CActive
{
Q_OBJECT
+
public:
- BluetoothLinkManagerDeviceDiscoverer(RSocketServ& aSocketServ, QObject *parent = 0);
+ explicit BluetoothLinkManagerDeviceDiscoverer(RSocketServ& aSocketServ, QObject *parent = 0);
~BluetoothLinkManagerDeviceDiscoverer();
- bool startDiscovery(const uint discoveryType);
+ void startDiscovery(const uint discoveryType);
+ void stopDiscovery();
+ bool isReallyActive() const;
protected: // From CActive
void RunL();
@@ -87,6 +90,7 @@ protected: // From CActive
TInt RunError(TInt aError);
private:
+
void setError(int error);
private: // private helper functions
@@ -94,9 +98,9 @@ private: // private helper functions
QBluetoothDeviceInfo currentDeviceDataToQBluetoothDeviceInfo() const;
Q_SIGNALS: // SIGNALS
- void deviceDiscoveryComplete(int aError);
+ void deviceDiscoveryComplete();
void deviceDiscovered(const QBluetoothDeviceInfo &device);
- void linkManagerError(QBluetoothDeviceDiscoveryAgent::Error error);
+ void linkManagerError(QBluetoothDeviceDiscoveryAgent::Error error, QString errorString);
void canceled();
private:
@@ -109,6 +113,9 @@ private:
TNameEntry m_entry;
TBool m_LIAC;
+ bool m_pendingCancel;
+ bool m_pendingStart;
+ uint m_discoveryType;
};
QTM_END_NAMESPACE
diff --git a/src/connectivity/bluetooth/symbian/bluetoothsymbianpairingadapter.cpp b/src/connectivity/bluetooth/symbian/bluetoothsymbianpairingadapter.cpp
index f785ecd06b..47419b7fc4 100644
--- a/src/connectivity/bluetooth/symbian/bluetoothsymbianpairingadapter.cpp
+++ b/src/connectivity/bluetooth/symbian/bluetoothsymbianpairingadapter.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
@@ -125,7 +125,7 @@ void BluetoothSymbianPairingAdapter::DisconnectComplete( TBTDevAddr& aAddr, TInt
void BluetoothSymbianPairingAdapter::PairingComplete( TBTDevAddr& aAddr, TInt aErr )
{
- m_pairingErrorString = QString();
+ m_pairingErrorString.clear();
m_pairingOngoing = false;
switch (aErr) {
diff --git a/src/connectivity/bluetooth/symbian/bluetoothsymbianpairingadapter.h b/src/connectivity/bluetooth/symbian/bluetoothsymbianpairingadapter.h
index 798accc4fa..6af005652c 100644
--- a/src/connectivity/bluetooth/symbian/bluetoothsymbianpairingadapter.h
+++ b/src/connectivity/bluetooth/symbian/bluetoothsymbianpairingadapter.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
@@ -73,7 +73,7 @@ class BluetoothSymbianPairingAdapter : public QObject, public MBTEngConnObserver
Q_OBJECT
public:
- BluetoothSymbianPairingAdapter(const QBluetoothAddress &address, QObject *parent = 0);
+ explicit BluetoothSymbianPairingAdapter(const QBluetoothAddress &address, QObject *parent = 0);
~BluetoothSymbianPairingAdapter();
void startPairing(QBluetoothLocalDevice::Pairing pairing);
diff --git a/src/connectivity/bluetooth/symbian/bluetoothsymbianregistryadapter.h b/src/connectivity/bluetooth/symbian/bluetoothsymbianregistryadapter.h
index 17aee6d49a..bdea1d579e 100644
--- a/src/connectivity/bluetooth/symbian/bluetoothsymbianregistryadapter.h
+++ b/src/connectivity/bluetooth/symbian/bluetoothsymbianregistryadapter.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
@@ -74,7 +74,7 @@ class BluetoothSymbianRegistryAdapter : public QObject, public MBTEngDevManObser
Q_OBJECT
public:
- BluetoothSymbianRegistryAdapter(const QBluetoothAddress &address, QObject *parent = 0);
+ explicit BluetoothSymbianRegistryAdapter(const QBluetoothAddress &address, QObject *parent = 0);
~BluetoothSymbianRegistryAdapter();
void removePairing();