summaryrefslogtreecommitdiffstats
path: root/src/connectivity
diff options
context:
space:
mode:
Diffstat (limited to 'src/connectivity')
-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
-rw-r--r--src/connectivity/nfc/maemo6/socketrequestor.cpp16
-rw-r--r--src/connectivity/nfc/nfc.pri14
-rw-r--r--src/connectivity/nfc/qdeclarativendefrecord.h2
-rw-r--r--src/connectivity/nfc/qllcpserver.cpp1
-rw-r--r--src/connectivity/nfc/qllcpsocket.cpp1
-rw-r--r--src/connectivity/nfc/qndeffilter.cpp1
-rw-r--r--src/connectivity/nfc/qndefmessage.cpp1
-rw-r--r--src/connectivity/nfc/qndefnfctextrecord.cpp1
-rw-r--r--src/connectivity/nfc/qndefnfcurirecord.cpp1
-rw-r--r--src/connectivity/nfc/qndefrecord.cpp1
-rw-r--r--src/connectivity/nfc/qnearfieldmanager.cpp1
-rw-r--r--src/connectivity/nfc/qnearfieldmanager_maemo6.cpp2
-rw-r--r--src/connectivity/nfc/qnearfieldtagmifare_symbian.cpp11
-rw-r--r--src/connectivity/nfc/qnearfieldtagmifare_symbian_p.h4
-rw-r--r--src/connectivity/nfc/qnearfieldtagtype1.cpp55
-rw-r--r--src/connectivity/nfc/qnearfieldtagtype1.h4
-rw-r--r--src/connectivity/nfc/qnearfieldtagtype1_symbian.cpp8
-rw-r--r--src/connectivity/nfc/qnearfieldtagtype1_symbian_p.h4
-rw-r--r--src/connectivity/nfc/qnearfieldtagtype2.cpp14
-rw-r--r--src/connectivity/nfc/qnearfieldtagtype2.h6
-rw-r--r--src/connectivity/nfc/qnearfieldtagtype2_symbian.cpp9
-rw-r--r--src/connectivity/nfc/qnearfieldtagtype2_symbian_p.h4
-rw-r--r--src/connectivity/nfc/qnearfieldtagtype3.cpp1
-rw-r--r--src/connectivity/nfc/qnearfieldtagtype3_symbian.cpp11
-rw-r--r--src/connectivity/nfc/qnearfieldtagtype3_symbian_p.h4
-rw-r--r--src/connectivity/nfc/qnearfieldtagtype4.cpp1
-rw-r--r--src/connectivity/nfc/qnearfieldtagtype4_symbian.cpp8
-rw-r--r--src/connectivity/nfc/qnearfieldtagtype4_symbian_p.h4
-rw-r--r--src/connectivity/nfc/qnearfieldtarget.cpp36
-rw-r--r--src/connectivity/nfc/qnearfieldtarget.h6
-rw-r--r--src/connectivity/nfc/qnearfieldtarget_maemo6.cpp41
-rw-r--r--src/connectivity/nfc/qnearfieldtarget_maemo6_p.h25
-rw-r--r--src/connectivity/nfc/symbian/debug.h19
-rw-r--r--src/connectivity/nfc/symbian/llcpsockettype1_symbian.cpp2
-rw-r--r--src/connectivity/nfc/symbian/llcpsockettype2_symbian.h2
-rw-r--r--src/connectivity/nfc/symbian/nearfieldmanager_symbian.cpp1
-rw-r--r--src/connectivity/nfc/symbian/nearfieldndeftarget_symbian.cpp1
-rw-r--r--src/connectivity/nfc/symbian/nearfieldtag_symbian.cpp1
-rw-r--r--src/connectivity/nfc/symbian/nearfieldtagimpl_symbian.h26
-rw-r--r--src/connectivity/nfc/symbian/nearfieldtagimplcommon_symbian.cpp14
-rw-r--r--src/connectivity/nfc/symbian/nearfieldtagimplcommon_symbian.h7
-rw-r--r--src/connectivity/nfc/symbian/nearfieldtagndefrequest_symbian.cpp6
-rw-r--r--src/connectivity/nfc/symbian/nearfieldtargetfactory_symbian.cpp1
83 files changed, 1053 insertions, 620 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();
diff --git a/src/connectivity/nfc/maemo6/socketrequestor.cpp b/src/connectivity/nfc/maemo6/socketrequestor.cpp
index 5961f5bd47..37fcd936d3 100644
--- a/src/connectivity/nfc/maemo6/socketrequestor.cpp
+++ b/src/connectivity/nfc/maemo6/socketrequestor.cpp
@@ -505,14 +505,14 @@ void SocketRequestorPrivate::sendRequestAccess(const QString &adaptor, const QSt
return;
dbus_message_iter_init_append(message, &args);
- const char *cdata = path.toUtf8().constData();
- if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_OBJECT_PATH, &cdata)) {
+ const QByteArray p = path.toUtf8();
+ if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_OBJECT_PATH, p.constData())) {
dbus_message_unref(message);
return;
}
- cdata = kind.toUtf8().constData();
- if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &cdata)) {
+ const QByteArray k = kind.toUtf8();
+ if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, k.constData())) {
dbus_message_unref(message);
return;
}
@@ -543,14 +543,14 @@ void SocketRequestorPrivate::sendCancelAccessRequest(const QString &adaptor, con
return;
dbus_message_iter_init_append(message, &args);
- const char *cdata = path.toUtf8().constData();
- if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_OBJECT_PATH, &cdata)) {
+ const QByteArray p = path.toUtf8();
+ if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_OBJECT_PATH, p.constData())) {
dbus_message_unref(message);
return;
}
- cdata = kind.toUtf8().constData();
- if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &cdata)) {
+ const QByteArray k = kind.toUtf8();
+ if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, k.constData())) {
dbus_message_unref(message);
return;
}
diff --git a/src/connectivity/nfc/nfc.pri b/src/connectivity/nfc/nfc.pri
index faab00e302..49da2a65dd 100644
--- a/src/connectivity/nfc/nfc.pri
+++ b/src/connectivity/nfc/nfc.pri
@@ -13,7 +13,8 @@ PUBLIC_HEADERS += \
nfc/qllcpsocket.h \
nfc/qnearfieldtagtype3.h \
nfc/qnearfieldtagtype4.h \
- nfc/qllcpserver.h
+ nfc/qllcpserver.h \
+ nfc/qdeclarativendefrecord.h
PRIVATE_HEADERS += \
nfc/qndefrecord_p.h \
@@ -36,15 +37,8 @@ SOURCES += \
nfc/qllcpsocket.cpp \
nfc/qnearfieldtagtype4.cpp \
nfc/qtlv.cpp \
- nfc/qllcpserver.cpp
-
-contains(QT_CONFIG,declarative) {
- PUBLIC_HEADERS += \
- nfc/qdeclarativendefrecord.h
-
- SOURCES += \
- nfc/qdeclarativendefrecord.cpp
-}
+ nfc/qllcpserver.cpp \
+ nfc/qdeclarativendefrecord.cpp
maemo6|meego {
NFC_BACKEND_AVAILABLE = yes
diff --git a/src/connectivity/nfc/qdeclarativendefrecord.h b/src/connectivity/nfc/qdeclarativendefrecord.h
index e554198adf..709b0e2e9b 100644
--- a/src/connectivity/nfc/qdeclarativendefrecord.h
+++ b/src/connectivity/nfc/qdeclarativendefrecord.h
@@ -62,7 +62,7 @@ class Q_CONNECTIVITY_EXPORT QDeclarativeNdefRecord : public QObject
public:
explicit QDeclarativeNdefRecord(QObject *parent = 0);
- QDeclarativeNdefRecord(const QNdefRecord &record, QObject *parent = 0);
+ explicit QDeclarativeNdefRecord(const QNdefRecord &record, QObject *parent = 0);
QString recordType() const;
void setRecordType(const QString &t);
diff --git a/src/connectivity/nfc/qllcpserver.cpp b/src/connectivity/nfc/qllcpserver.cpp
index 4ba9fd40c4..97d5f1c3ec 100644
--- a/src/connectivity/nfc/qllcpserver.cpp
+++ b/src/connectivity/nfc/qllcpserver.cpp
@@ -59,6 +59,7 @@ QTM_BEGIN_NAMESPACE
\ingroup connectivity-nfc
\inmodule QtConnectivity
+ \since 1.2
This class makes it possible to accept incoming LLCP socket connections.
diff --git a/src/connectivity/nfc/qllcpsocket.cpp b/src/connectivity/nfc/qllcpsocket.cpp
index 60baeaa376..8285666bbe 100644
--- a/src/connectivity/nfc/qllcpsocket.cpp
+++ b/src/connectivity/nfc/qllcpsocket.cpp
@@ -56,6 +56,7 @@ QTM_BEGIN_NAMESPACE
/*!
\class QLlcpSocket
\brief The QLlcpSocket class provides an NFC LLCP socket.
+ \since 1.2
\ingroup connectivity-nfc
\inmodule QtConnectivity
diff --git a/src/connectivity/nfc/qndeffilter.cpp b/src/connectivity/nfc/qndeffilter.cpp
index ccc4e38558..cf22e4e2b2 100644
--- a/src/connectivity/nfc/qndeffilter.cpp
+++ b/src/connectivity/nfc/qndeffilter.cpp
@@ -51,6 +51,7 @@ QTM_BEGIN_NAMESPACE
\ingroup connectivity-nfc
\inmodule QtConnectivity
+ \since 1.2
The QNdefFilter encapsulates the structure of an NDEF message and is used by
QNearFieldManager::registerNdefMessageHandler() to match NDEF message that have a particular
diff --git a/src/connectivity/nfc/qndefmessage.cpp b/src/connectivity/nfc/qndefmessage.cpp
index 05e5409559..6e8c5b9f4a 100644
--- a/src/connectivity/nfc/qndefmessage.cpp
+++ b/src/connectivity/nfc/qndefmessage.cpp
@@ -50,6 +50,7 @@ QTM_BEGIN_NAMESPACE
\ingroup connectivity-nfc
\inmodule QtConnectivity
+ \since 1.2
A QNdefMessage is a collection of 0 or more QNdefRecords. QNdefMessage inherits from
QList<QNdefRecord> and therefore the standard QList functions can be used to manipulate the
diff --git a/src/connectivity/nfc/qndefnfctextrecord.cpp b/src/connectivity/nfc/qndefnfctextrecord.cpp
index cb1bedd632..91b9ff04b4 100644
--- a/src/connectivity/nfc/qndefnfctextrecord.cpp
+++ b/src/connectivity/nfc/qndefnfctextrecord.cpp
@@ -52,6 +52,7 @@ QTM_BEGIN_NAMESPACE
\ingroup connectivity-nfc
\inmodule QtConnectivity
+ \since 1.2
RTD-Text encapsulates a user displayable text record.
*/
diff --git a/src/connectivity/nfc/qndefnfcurirecord.cpp b/src/connectivity/nfc/qndefnfcurirecord.cpp
index a4657abcf0..d5413a6c29 100644
--- a/src/connectivity/nfc/qndefnfcurirecord.cpp
+++ b/src/connectivity/nfc/qndefnfcurirecord.cpp
@@ -54,6 +54,7 @@ QTM_BEGIN_NAMESPACE
\ingroup connectivity-nfc
\inmodule QtConnectivity
+ \since 1.2
RTD-URI encapsulates a URI.
*/
diff --git a/src/connectivity/nfc/qndefrecord.cpp b/src/connectivity/nfc/qndefrecord.cpp
index cb4b441e56..777666e0db 100644
--- a/src/connectivity/nfc/qndefrecord.cpp
+++ b/src/connectivity/nfc/qndefrecord.cpp
@@ -53,6 +53,7 @@ QTM_BEGIN_NAMESPACE
\ingroup connectivity-nfc
\inmodule QtConnectivity
+ \since 1.2
QNdefRecord and derived classes are used to parse the contents of
\l {QNdefMessage}{NDEF messages} and create new NDEF messages.
diff --git a/src/connectivity/nfc/qnearfieldmanager.cpp b/src/connectivity/nfc/qnearfieldmanager.cpp
index 2f7c88b4e8..46b7fbfedc 100644
--- a/src/connectivity/nfc/qnearfieldmanager.cpp
+++ b/src/connectivity/nfc/qnearfieldmanager.cpp
@@ -63,6 +63,7 @@ QTM_BEGIN_NAMESPACE
\ingroup connectivity-nfc
\inmodule QtConnectivity
+ \since 1.2
NFC Forum devices support two modes of communications. The first mode, peer-to-peer
communications, is used to communicate between two NFC Forum devices. The second mode,
diff --git a/src/connectivity/nfc/qnearfieldmanager_maemo6.cpp b/src/connectivity/nfc/qnearfieldmanager_maemo6.cpp
index 0fc6f35a04..795b466c01 100644
--- a/src/connectivity/nfc/qnearfieldmanager_maemo6.cpp
+++ b/src/connectivity/nfc/qnearfieldmanager_maemo6.cpp
@@ -440,7 +440,7 @@ void QNearFieldManagerPrivateImpl::_q_targetLost(const QDBusObjectPath &targetPa
// haven't seen target so just drop this event
if (!nearFieldTarget) {
// We either haven't seen target (started after target was detected by system) or the
- // application deleted the target. Remove from map and dont emit anything.
+ // application deleted the target. Remove from map and don't emit anything.
m_targets.remove(targetPath.path());
return;
}
diff --git a/src/connectivity/nfc/qnearfieldtagmifare_symbian.cpp b/src/connectivity/nfc/qnearfieldtagmifare_symbian.cpp
index eb7238555a..bc90ff9b20 100644
--- a/src/connectivity/nfc/qnearfieldtagmifare_symbian.cpp
+++ b/src/connectivity/nfc/qnearfieldtagmifare_symbian.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)
**
@@ -52,7 +52,6 @@ QNearFieldTagMifareSymbian::QNearFieldTagMifareSymbian(CNearFieldNdefTarget *tag
QNearFieldTagMifareSymbian::~QNearFieldTagMifareSymbian()
{
- delete mTag;
}
QByteArray QNearFieldTagMifareSymbian::uid() const
@@ -65,14 +64,14 @@ bool QNearFieldTagMifareSymbian::hasNdefMessage()
return _hasNdefMessage();
}
-void QNearFieldTagMifareSymbian::readNdefMessages()
+QNearFieldTarget::RequestId QNearFieldTagMifareSymbian::readNdefMessages()
{
- _ndefMessages();
+ return _ndefMessages();
}
-void QNearFieldTagMifareSymbian::writeNdefMessages(const QList<QNdefMessage> &messages)
+QNearFieldTarget::RequestId QNearFieldTagMifareSymbian::writeNdefMessages(const QList<QNdefMessage> &messages)
{
- _setNdefMessages(messages);
+ return _setNdefMessages(messages);
}
QNearFieldTarget::RequestId QNearFieldTagMifareSymbian::sendCommand(const QByteArray &command)
diff --git a/src/connectivity/nfc/qnearfieldtagmifare_symbian_p.h b/src/connectivity/nfc/qnearfieldtagmifare_symbian_p.h
index 73eb6d2736..5e595bf84f 100644
--- a/src/connectivity/nfc/qnearfieldtagmifare_symbian_p.h
+++ b/src/connectivity/nfc/qnearfieldtagmifare_symbian_p.h
@@ -77,8 +77,8 @@ public:
}
// NdefAccess
bool hasNdefMessage();
- void readNdefMessages();
- void writeNdefMessages(const QList<QNdefMessage> &messages);
+ RequestId readNdefMessages();
+ RequestId writeNdefMessages(const QList<QNdefMessage> &messages);
// TagTypeSpecificAccess
RequestId sendCommand(const QByteArray &command);
diff --git a/src/connectivity/nfc/qnearfieldtagtype1.cpp b/src/connectivity/nfc/qnearfieldtagtype1.cpp
index e2c64e5d55..8ff5d2290c 100644
--- a/src/connectivity/nfc/qnearfieldtagtype1.cpp
+++ b/src/connectivity/nfc/qnearfieldtagtype1.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)
**
@@ -55,6 +55,7 @@ QTM_BEGIN_NAMESPACE
\class QNearFieldTagType1
\brief The QNearFieldTagType1 class provides an interface for communicating with an NFC Tag
Type 1 tag.
+ \since 1.2
\ingroup connectivity-nfc
\inmodule QtConnectivity
@@ -99,6 +100,7 @@ public:
void progressToNextNdefReadMessageState();
ReadNdefMessageState m_readNdefMessageState;
+ QNearFieldTarget::RequestId m_readNdefRequestId;
QTlvReader *m_tlvReader;
QNearFieldTarget::RequestId m_nextExpectedRequestId;
@@ -114,6 +116,7 @@ public:
void progressToNextNdefWriteMessageState();
WriteNdefMessageState m_writeNdefMessageState;
+ QNearFieldTarget::RequestId m_writeNdefRequestId;
QList<QNdefMessage> m_ndefWriteMessages;
QTlvWriter *m_tlvWriter;
@@ -137,7 +140,8 @@ void QNearFieldTagType1Private::progressToNextNdefReadMessageState()
if (data.isEmpty()) {
m_readNdefMessageState = NotReadingNdefMessage;
m_nextExpectedRequestId = QNearFieldTarget::RequestId();
- emit q->error(QNearFieldTarget::NdefReadError, QNearFieldTarget::RequestId());
+ emit q->error(QNearFieldTarget::NdefReadError, m_readNdefRequestId);
+ m_readNdefRequestId = QNearFieldTarget::RequestId();
break;
}
@@ -147,7 +151,8 @@ void QNearFieldTagType1Private::progressToNextNdefReadMessageState()
if (!(hr0 & 0x10)) {
m_readNdefMessageState = NotReadingNdefMessage;
m_nextExpectedRequestId = QNearFieldTarget::RequestId();
- emit q->error(QNearFieldTarget::NdefReadError, QNearFieldTarget::RequestId());
+ emit q->error(QNearFieldTarget::NdefReadError, m_readNdefRequestId);
+ m_readNdefRequestId = QNearFieldTarget::RequestId();
break;
}
@@ -161,7 +166,8 @@ void QNearFieldTagType1Private::progressToNextNdefReadMessageState()
if (ndefMagicNumber != 0xe1) {
m_readNdefMessageState = NotReadingNdefMessage;
- emit q->error(QNearFieldTarget::NdefReadError, QNearFieldTarget::RequestId());
+ emit q->error(QNearFieldTarget::NdefReadError, m_readNdefRequestId);
+ m_readNdefRequestId = QNearFieldTarget::RequestId();
break;
}
@@ -188,6 +194,8 @@ void QNearFieldTagType1Private::progressToNextNdefReadMessageState()
delete m_tlvReader;
m_tlvReader = 0;
m_readNdefMessageState = NotReadingNdefMessage;
+ emit q->requestCompleted(m_readNdefRequestId);
+ m_readNdefRequestId = QNearFieldTarget::RequestId();
}
break;
}
@@ -208,7 +216,8 @@ void QNearFieldTagType1Private::progressToNextNdefWriteMessageState()
if (data.isEmpty()) {
m_writeNdefMessageState = NotWritingNdefMessage;
m_nextExpectedRequestId = QNearFieldTarget::RequestId();
- emit q->error(QNearFieldTarget::NdefWriteError, QNearFieldTarget::RequestId());
+ emit q->error(QNearFieldTarget::NdefWriteError, m_writeNdefRequestId);
+ m_writeNdefRequestId = QNearFieldTarget::RequestId();
break;
}
@@ -218,7 +227,8 @@ void QNearFieldTagType1Private::progressToNextNdefWriteMessageState()
if (!(hr0 & 0x10)) {
m_writeNdefMessageState = NotWritingNdefMessage;
m_nextExpectedRequestId = QNearFieldTarget::RequestId();
- emit q->error(QNearFieldTarget::NdefWriteError, QNearFieldTarget::RequestId());
+ emit q->error(QNearFieldTarget::NdefWriteError, m_writeNdefRequestId);
+ m_writeNdefRequestId = QNearFieldTarget::RequestId();
break;
}
@@ -232,7 +242,8 @@ void QNearFieldTagType1Private::progressToNextNdefWriteMessageState()
if (ndefMagicNumber != 0xe1) {
m_writeNdefMessageState = NotWritingNdefMessage;
- emit q->error(QNearFieldTarget::NdefWriteError, QNearFieldTarget::RequestId());
+ emit q->error(QNearFieldTarget::NdefWriteError, m_writeNdefRequestId);
+ m_writeNdefRequestId = QNearFieldTarget::RequestId();
break;
}
@@ -285,13 +296,16 @@ void QNearFieldTagType1Private::progressToNextNdefWriteMessageState()
delete m_tlvWriter;
m_tlvWriter = 0;
emit q->ndefMessagesWritten();
+ emit q->requestCompleted(m_writeNdefRequestId);
+ m_writeNdefRequestId = QNearFieldTarget::RequestId();
} else {
m_nextExpectedRequestId = m_tlvWriter->requestId();
if (!m_nextExpectedRequestId.isValid()) {
m_writeNdefMessageState = NotWritingNdefMessage;
delete m_tlvWriter;
m_tlvWriter = 0;
- emit q->error(QNearFieldTarget::NdefWriteError, QNearFieldTarget::RequestId());
+ emit q->error(QNearFieldTarget::NdefWriteError, m_writeNdefRequestId);
+ m_writeNdefRequestId = QNearFieldTarget::RequestId();
}
}
break;
@@ -412,30 +426,43 @@ bool QNearFieldTagType1::hasNdefMessage()
/*!
\reimp
*/
-void QNearFieldTagType1::readNdefMessages()
+QNearFieldTarget::RequestId QNearFieldTagType1::readNdefMessages()
{
Q_D(QNearFieldTagType1);
- if (d->m_readNdefMessageState == QNearFieldTagType1Private::NotReadingNdefMessage)
+ d->m_readNdefRequestId = RequestId(new RequestIdPrivate);
+
+ if (d->m_readNdefMessageState == QNearFieldTagType1Private::NotReadingNdefMessage) {
d->progressToNextNdefReadMessageState();
- else
- emit error(NdefReadError, RequestId());
+ } else {
+ QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
+ Q_ARG(QNearFieldTarget::Error, NdefReadError),
+ Q_ARG(QNearFieldTarget::RequestId, d->m_readNdefRequestId));
+ }
+
+ return d->m_readNdefRequestId;
}
/*!
\reimp
*/
-void QNearFieldTagType1::writeNdefMessages(const QList<QNdefMessage> &messages)
+QNearFieldTarget::RequestId QNearFieldTagType1::writeNdefMessages(const QList<QNdefMessage> &messages)
{
Q_D(QNearFieldTagType1);
+ d->m_writeNdefRequestId = RequestId(new RequestIdPrivate);
+
if (d->m_readNdefMessageState == QNearFieldTagType1Private::NotReadingNdefMessage &&
d->m_writeNdefMessageState == QNearFieldTagType1Private::NotWritingNdefMessage) {
d->m_ndefWriteMessages = messages;
d->progressToNextNdefWriteMessageState();
} else {
- emit error(NdefWriteError, RequestId());
+ QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
+ Q_ARG(QNearFieldTarget::Error, NdefWriteError),
+ Q_ARG(QNearFieldTarget::RequestId, d->m_readNdefRequestId));
}
+
+ return d->m_writeNdefRequestId;
}
/*!
diff --git a/src/connectivity/nfc/qnearfieldtagtype1.h b/src/connectivity/nfc/qnearfieldtagtype1.h
index 40b8849f15..78610270d6 100644
--- a/src/connectivity/nfc/qnearfieldtagtype1.h
+++ b/src/connectivity/nfc/qnearfieldtagtype1.h
@@ -68,8 +68,8 @@ public:
Type type() const { return NfcTagType1; }
bool hasNdefMessage();
- void readNdefMessages();
- void writeNdefMessages(const QList<QNdefMessage> &messages);
+ RequestId readNdefMessages();
+ RequestId writeNdefMessages(const QList<QNdefMessage> &messages);
quint8 version();
virtual int memorySize();
diff --git a/src/connectivity/nfc/qnearfieldtagtype1_symbian.cpp b/src/connectivity/nfc/qnearfieldtagtype1_symbian.cpp
index a7e25a4edc..520dc5f2ba 100644
--- a/src/connectivity/nfc/qnearfieldtagtype1_symbian.cpp
+++ b/src/connectivity/nfc/qnearfieldtagtype1_symbian.cpp
@@ -342,18 +342,18 @@ bool QNearFieldTagType1Symbian::hasNdefMessage()
return _hasNdefMessage();
}
-void QNearFieldTagType1Symbian::readNdefMessages()
+QNearFieldTarget::RequestId QNearFieldTagType1Symbian::readNdefMessages()
{
BEGIN
- _ndefMessages();
END
+ return _ndefMessages();
}
-void QNearFieldTagType1Symbian::writeNdefMessages(const QList<QNdefMessage> &messages)
+QNearFieldTarget::RequestId QNearFieldTagType1Symbian::writeNdefMessages(const QList<QNdefMessage> &messages)
{
BEGIN
- _setNdefMessages(messages);
END
+ return _setNdefMessages(messages);
}
/*
diff --git a/src/connectivity/nfc/qnearfieldtagtype1_symbian_p.h b/src/connectivity/nfc/qnearfieldtagtype1_symbian_p.h
index 2228eaaadd..3832cb05c6 100644
--- a/src/connectivity/nfc/qnearfieldtagtype1_symbian_p.h
+++ b/src/connectivity/nfc/qnearfieldtagtype1_symbian_p.h
@@ -78,8 +78,8 @@ public:
WriteMode mode = EraseAndWrite);
bool hasNdefMessage();
- void readNdefMessages();
- void writeNdefMessages(const QList<QNdefMessage> &messages);
+ RequestId readNdefMessages();
+ RequestId writeNdefMessages(const QList<QNdefMessage> &messages);
bool isProcessingCommand() const { return _isProcessingRequest(); }
RequestId sendCommand(const QByteArray &command);
diff --git a/src/connectivity/nfc/qnearfieldtagtype2.cpp b/src/connectivity/nfc/qnearfieldtagtype2.cpp
index d76dcf384a..89ca022424 100644
--- a/src/connectivity/nfc/qnearfieldtagtype2.cpp
+++ b/src/connectivity/nfc/qnearfieldtagtype2.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)
**
@@ -40,6 +40,7 @@
****************************************************************************/
#include "qnearfieldtagtype2.h"
+#include "qnearfieldtarget_p.h"
#include <QtCore/QVariant>
#include <QtCore/QCoreApplication>
@@ -53,6 +54,7 @@ QTM_BEGIN_NAMESPACE
\class QNearFieldTagType2
\brief The QNearFieldTagType2 class provides an interface for communicating with an NFC Tag
Type 2 tag.
+ \since 1.2
\ingroup connectivity-nfc
\inmodule QtConnectivity
@@ -122,21 +124,19 @@ bool QNearFieldTagType2::hasNdefMessage()
/*!
\reimp
*/
-void QNearFieldTagType2::readNdefMessages()
+QNearFieldTarget::RequestId QNearFieldTagType2::readNdefMessages()
{
- qDebug() << Q_FUNC_INFO << "is unimplemeted";
- emit error(QNearFieldTarget::UnsupportedError, RequestId());
+ return RequestId();
}
/*!
\reimp
*/
-void QNearFieldTagType2::writeNdefMessages(const QList<QNdefMessage> &messages)
+QNearFieldTarget::RequestId QNearFieldTagType2::writeNdefMessages(const QList<QNdefMessage> &messages)
{
Q_UNUSED(messages);
- qDebug() << Q_FUNC_INFO << "is unimplemeted";
- emit error(QNearFieldTarget::UnsupportedError, RequestId());
+ return RequestId();
}
/*!
diff --git a/src/connectivity/nfc/qnearfieldtagtype2.h b/src/connectivity/nfc/qnearfieldtagtype2.h
index 54c6eb4277..3c7c7ed111 100644
--- a/src/connectivity/nfc/qnearfieldtagtype2.h
+++ b/src/connectivity/nfc/qnearfieldtagtype2.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,8 +63,8 @@ public:
Type type() const { return NfcTagType2; }
bool hasNdefMessage();
- void readNdefMessages();
- void writeNdefMessages(const QList<QNdefMessage> &messages);
+ RequestId readNdefMessages();
+ RequestId writeNdefMessages(const QList<QNdefMessage> &messages);
quint8 version();
int memorySize();
diff --git a/src/connectivity/nfc/qnearfieldtagtype2_symbian.cpp b/src/connectivity/nfc/qnearfieldtagtype2_symbian.cpp
index e12dd10cc8..c6342c9ffa 100644
--- a/src/connectivity/nfc/qnearfieldtagtype2_symbian.cpp
+++ b/src/connectivity/nfc/qnearfieldtagtype2_symbian.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)
**
@@ -38,6 +38,7 @@
** $QT_END_LICENSE$
**
****************************************************************************/
+
#include <nfctag.h>
#include <QVariant>
#include "qnearfieldtagtype2_symbian_p.h"
@@ -206,18 +207,18 @@ bool QNearFieldTagType2Symbian::hasNdefMessage()
return _hasNdefMessage();
}
-void QNearFieldTagType2Symbian::readNdefMessages()
+QNearFieldTarget::RequestId QNearFieldTagType2Symbian::readNdefMessages()
{
BEGIN
END
return _ndefMessages();
}
-void QNearFieldTagType2Symbian::writeNdefMessages(const QList<QNdefMessage> &messages)
+QNearFieldTarget::RequestId QNearFieldTagType2Symbian::writeNdefMessages(const QList<QNdefMessage> &messages)
{
BEGIN
END
- _setNdefMessages(messages);
+ return _setNdefMessages(messages);
}
QByteArray QNearFieldTagType2Symbian::uid() const
diff --git a/src/connectivity/nfc/qnearfieldtagtype2_symbian_p.h b/src/connectivity/nfc/qnearfieldtagtype2_symbian_p.h
index df3768fbc6..fef3a5877b 100644
--- a/src/connectivity/nfc/qnearfieldtagtype2_symbian_p.h
+++ b/src/connectivity/nfc/qnearfieldtagtype2_symbian_p.h
@@ -70,8 +70,8 @@ public:
bool isProcessingCommand() const { return _isProcessingRequest(); }
bool hasNdefMessage();
- void readNdefMessages();
- void writeNdefMessages(const QList<QNdefMessage> &messages);
+ RequestId readNdefMessages();
+ RequestId writeNdefMessages(const QList<QNdefMessage> &messages);
void setAccessMethods(const QNearFieldTarget::AccessMethods& accessMethods)
{
diff --git a/src/connectivity/nfc/qnearfieldtagtype3.cpp b/src/connectivity/nfc/qnearfieldtagtype3.cpp
index 0583a645af..0dc54ccd01 100644
--- a/src/connectivity/nfc/qnearfieldtagtype3.cpp
+++ b/src/connectivity/nfc/qnearfieldtagtype3.cpp
@@ -47,6 +47,7 @@ QTM_BEGIN_NAMESPACE
\class QNearFieldTagType3
\brief The QNearFieldTagType3 class provides an interface for communicating with an NFC Tag
Type 3 tag.
+ \since 1.2
\ingroup connectivity-nfc
\inmodule QtConnectivity
diff --git a/src/connectivity/nfc/qnearfieldtagtype3_symbian.cpp b/src/connectivity/nfc/qnearfieldtagtype3_symbian.cpp
index c40a6e8590..76971ffbf6 100644
--- a/src/connectivity/nfc/qnearfieldtagtype3_symbian.cpp
+++ b/src/connectivity/nfc/qnearfieldtagtype3_symbian.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)
**
@@ -38,6 +38,7 @@
** $QT_END_LICENSE$
**
****************************************************************************/
+
#include <nfctag.h>
#include "qnearfieldtagtype3_symbian_p.h"
#include <nfctype3connection.h>
@@ -193,14 +194,14 @@ bool QNearFieldTagType3Symbian::hasNdefMessage()
return _hasNdefMessage();
}
-void QNearFieldTagType3Symbian::readNdefMessages()
+QNearFieldTarget::RequestId QNearFieldTagType3Symbian::readNdefMessages()
{
- _ndefMessages();
+ return _ndefMessages();
}
-void QNearFieldTagType3Symbian::writeNdefMessages(const QList<QNdefMessage> &messages)
+QNearFieldTarget::RequestId QNearFieldTagType3Symbian::writeNdefMessages(const QList<QNdefMessage> &messages)
{
- _setNdefMessages(messages);
+ return _setNdefMessages(messages);
}
QNearFieldTarget::RequestId QNearFieldTagType3Symbian::sendCommand(const QByteArray &command)
diff --git a/src/connectivity/nfc/qnearfieldtagtype3_symbian_p.h b/src/connectivity/nfc/qnearfieldtagtype3_symbian_p.h
index e42f7ed875..c77096b6f1 100644
--- a/src/connectivity/nfc/qnearfieldtagtype3_symbian_p.h
+++ b/src/connectivity/nfc/qnearfieldtagtype3_symbian_p.h
@@ -71,8 +71,8 @@ public:
}
bool hasNdefMessage();
- void readNdefMessages();
- void writeNdefMessages(const QList<QNdefMessage> &messages);
+ RequestId readNdefMessages();
+ RequestId writeNdefMessages(const QList<QNdefMessage> &messages);
#if 0
quint16 systemCode();
diff --git a/src/connectivity/nfc/qnearfieldtagtype4.cpp b/src/connectivity/nfc/qnearfieldtagtype4.cpp
index 8e6df27f68..6d18f01f34 100644
--- a/src/connectivity/nfc/qnearfieldtagtype4.cpp
+++ b/src/connectivity/nfc/qnearfieldtagtype4.cpp
@@ -47,6 +47,7 @@ QTM_BEGIN_NAMESPACE
\class QNearFieldTagType4
\brief The QNearFieldTagType4 class provides an interface for communicating with an NFC Tag
Type 4 tag.
+ \since 1.2
\ingroup connectivity-nfc
\inmodule QtConnectivity
diff --git a/src/connectivity/nfc/qnearfieldtagtype4_symbian.cpp b/src/connectivity/nfc/qnearfieldtagtype4_symbian.cpp
index 44b40067c4..0d18236822 100644
--- a/src/connectivity/nfc/qnearfieldtagtype4_symbian.cpp
+++ b/src/connectivity/nfc/qnearfieldtagtype4_symbian.cpp
@@ -261,14 +261,14 @@ bool QNearFieldTagType4Symbian::hasNdefMessage()
return ( (nLen > 0) && (nLen < maxNdefLen -2) );
}
-void QNearFieldTagType4Symbian::readNdefMessages()
+QNearFieldTarget::RequestId QNearFieldTagType4Symbian::readNdefMessages()
{
- _ndefMessages();
+ return _ndefMessages();
}
-void QNearFieldTagType4Symbian::writeNdefMessages(const QList<QNdefMessage> &messages)
+QNearFieldTarget::RequestId QNearFieldTagType4Symbian::writeNdefMessages(const QList<QNdefMessage> &messages)
{
- _setNdefMessages(messages);
+ return _setNdefMessages(messages);
}
QNearFieldTarget::RequestId QNearFieldTagType4Symbian::sendCommand(const QByteArray &command)
diff --git a/src/connectivity/nfc/qnearfieldtagtype4_symbian_p.h b/src/connectivity/nfc/qnearfieldtagtype4_symbian_p.h
index 0ec06de261..34d9233c86 100644
--- a/src/connectivity/nfc/qnearfieldtagtype4_symbian_p.h
+++ b/src/connectivity/nfc/qnearfieldtagtype4_symbian_p.h
@@ -69,8 +69,8 @@ public:
quint8 version();
bool hasNdefMessage();
- void readNdefMessages();
- void writeNdefMessages(const QList<QNdefMessage> &messages);
+ RequestId readNdefMessages();
+ RequestId writeNdefMessages(const QList<QNdefMessage> &messages);
RequestId sendCommand(const QByteArray &command);
RequestId sendCommands(const QList<QByteArray> &commands);
diff --git a/src/connectivity/nfc/qnearfieldtarget.cpp b/src/connectivity/nfc/qnearfieldtarget.cpp
index 0e44fa58a7..cabf257a50 100644
--- a/src/connectivity/nfc/qnearfieldtarget.cpp
+++ b/src/connectivity/nfc/qnearfieldtarget.cpp
@@ -58,6 +58,7 @@ QTM_BEGIN_NAMESPACE
\ingroup connectivity-nfc
\inmodule QtConnectivity
+ \since 1.2
QNearFieldTarget provides a generic interface for communicating with an NFC target device.
Both NFC Forum devices and NFC Forum Tag targets are supported by this class. All target
@@ -236,6 +237,14 @@ bool QNearFieldTarget::RequestId::operator==(const RequestId &other) const
}
/*!
+ \internal
+*/
+bool QNearFieldTarget::RequestId::operator!=(const RequestId &other) const
+{
+ return d != other.d;
+}
+
+/*!
Assigns a copy of \a other to this request id and returns a reference to this request id.
*/
QNearFieldTarget::RequestId &QNearFieldTarget::RequestId::operator=(const RequestId &other)
@@ -251,6 +260,7 @@ QNearFieldTarget::QNearFieldTarget(QObject *parent)
: QObject(parent), d_ptr(new QNearFieldTargetPrivate)
{
qRegisterMetaType<RequestId>("QNearFieldTarget::RequestId");
+ qRegisterMetaType<Error>("QNearFieldTarget::Error");
}
/*!
@@ -305,29 +315,37 @@ bool QNearFieldTarget::hasNdefMessage()
}
/*!
- Starts reading NDEF messages stored on the near field target. An ndefMessageRead() signal will
- be emitted for each NDEF message. If an error occurs the error() signal will be emitted.
+ Starts reading NDEF messages stored on the near field target. Returns a request id which can
+ be used to track the completion status of the request. An invalid request id will be returned
+ if the target does not support reading NDEF messages.
+
+ An ndefMessageRead() signal will be emitted for each NDEF message. The requestCompleted()
+ signal will be emitted was all NDEF messages have been read. The error() signal is emitted if
+ an error occurs.
\note Symbian^3 and Maemo 6 only support read one NDEF message.
*/
-void QNearFieldTarget::readNdefMessages()
+QNearFieldTarget::RequestId QNearFieldTarget::readNdefMessages()
{
- emit error(UnsupportedError, RequestId());
+ return RequestId();
}
/*!
- Writes the NDEF messages in \a messages to the target. The ndefMessagesWritten() signal will be
- emitted when the write operation completes successfully; otherwise the error() signal is
- emitted.
+ Writes the NDEF messages in \a messages to the target. Returns a request id which can be used
+ to track the completion status of the request. An invalid request id will be returned if the
+ target does not support reading NDEF messages.
+
+ The ndefMessagesWritten() signal will be emitted when the write operation completes
+ successfully; otherwise the error() signal is emitted.
\note Symbian^3 and Maemo 6 only support writing one NDEF message. Only the first NDEF message
in the list will be written, others are silently dropped.
*/
-void QNearFieldTarget::writeNdefMessages(const QList<QNdefMessage> &messages)
+QNearFieldTarget::RequestId QNearFieldTarget::writeNdefMessages(const QList<QNdefMessage> &messages)
{
Q_UNUSED(messages);
- emit error(UnsupportedError, RequestId());
+ return RequestId();
}
/*!
diff --git a/src/connectivity/nfc/qnearfieldtarget.h b/src/connectivity/nfc/qnearfieldtarget.h
index 9a79ef05a8..070fd1bf04 100644
--- a/src/connectivity/nfc/qnearfieldtarget.h
+++ b/src/connectivity/nfc/qnearfieldtarget.h
@@ -87,6 +87,7 @@ public:
enum Error {
NoError,
+ UnknownError,
UnsupportedError,
TargetOutOfRangeError,
NoResponseError,
@@ -111,6 +112,7 @@ public:
bool operator<(const RequestId &other) const;
bool operator==(const RequestId &other) const;
+ bool operator!=(const RequestId &other) const;
RequestId &operator=(const RequestId &other);
QSharedDataPointer<RequestIdPrivate> d;
@@ -129,8 +131,8 @@ public:
// NdefAccess
virtual bool hasNdefMessage();
- virtual void readNdefMessages();
- virtual void writeNdefMessages(const QList<QNdefMessage> &messages);
+ virtual RequestId readNdefMessages();
+ virtual RequestId writeNdefMessages(const QList<QNdefMessage> &messages);
// TagTypeSpecificAccess
virtual RequestId sendCommand(const QByteArray &command);
diff --git a/src/connectivity/nfc/qnearfieldtarget_maemo6.cpp b/src/connectivity/nfc/qnearfieldtarget_maemo6.cpp
index 391da696fa..0a5850cbe8 100644
--- a/src/connectivity/nfc/qnearfieldtarget_maemo6.cpp
+++ b/src/connectivity/nfc/qnearfieldtarget_maemo6.cpp
@@ -53,35 +53,39 @@ void PendingCallWatcher::addSendCommand(const QDBusPendingReply<QByteArray> &rep
m_pendingCommands.insert(watcher, id);
}
-void PendingCallWatcher::addReadNdefMessages(const QDBusPendingReply<QList<QByteArray> > &reply)
+void PendingCallWatcher::addReadNdefMessages(const QDBusPendingReply<QList<QByteArray> > &reply,
+ const QNearFieldTarget::RequestId &id)
{
QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(reply, this);
connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
this, SLOT(readNdefMessagesFinished(QDBusPendingCallWatcher*)));
- m_pendingNdefReads.append(watcher);
+ m_pendingNdefReads.insert(watcher, id);
}
-void PendingCallWatcher::addWriteNdefMessages(const QDBusPendingReply<> &reply)
+void PendingCallWatcher::addWriteNdefMessages(const QDBusPendingReply<> &reply,
+ const QNearFieldTarget::RequestId &id)
{
QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(reply, this);
connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
this, SLOT(writeNdefMessages(QDBusPendingCallWatcher*)));
- m_pendingNdefWrites.append(watcher);
+ m_pendingNdefWrites.insert(watcher, id);
}
void PendingCallWatcher::sendCommandFinished(QDBusPendingCallWatcher *watcher)
{
QNearFieldTarget::RequestId id = m_pendingCommands.take(watcher);
- if (!id.isValid())
+ if (!id.isValid()) {
+ watcher->deleteLater();
return;
+ }
QDBusPendingReply<QByteArray> reply = *watcher;
if (reply.isError()) {
QMetaObject::invokeMethod(parent(), "error",
- Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::NoError),
+ Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::UnknownError),
Q_ARG(QNearFieldTarget::RequestId, id));
} else {
const QByteArray data = reply.argumentAt<0>();
@@ -95,11 +99,18 @@ void PendingCallWatcher::sendCommandFinished(QDBusPendingCallWatcher *watcher)
void PendingCallWatcher::readNdefMessagesFinished(QDBusPendingCallWatcher *watcher)
{
+ QNearFieldTarget::RequestId id = m_pendingNdefReads.take(watcher);
+
+ if (!id.isValid()) {
+ watcher->deleteLater();
+ return;
+ }
+
QDBusPendingReply<QList<QByteArray> > reply = *watcher;
if (reply.isError()) {
QMetaObject::invokeMethod(parent(), "error",
Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::NdefReadError),
- Q_ARG(QNearFieldTarget::RequestId, QNearFieldTarget::RequestId()));
+ Q_ARG(QNearFieldTarget::RequestId, id));
} else {
const QList<QByteArray> data = reply.argumentAt<0>();
foreach (const QByteArray &m, data) {
@@ -112,24 +123,34 @@ void PendingCallWatcher::readNdefMessagesFinished(QDBusPendingCallWatcher *watch
QMetaObject::invokeMethod(parent(), "ndefMessageRead", Q_ARG(QNdefMessage, message));
}
+
+ QMetaObject::invokeMethod(parent(), "requestCompleted",
+ Q_ARG(QNearFieldTarget::RequestId, id));
}
- m_pendingNdefReads.removeOne(watcher);
watcher->deleteLater();
}
void PendingCallWatcher::writeNdefMessages(QDBusPendingCallWatcher *watcher)
{
+ QNearFieldTarget::RequestId id = m_pendingNdefWrites.take(watcher);
+
+ if (!id.isValid()) {
+ watcher->deleteLater();
+ return;
+ }
+
QDBusPendingReply<> reply = *watcher;
if (reply.isError()) {
QMetaObject::invokeMethod(parent(), "error",
Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::NdefWriteError),
- Q_ARG(QNearFieldTarget::RequestId, QNearFieldTarget::RequestId()));
+ Q_ARG(QNearFieldTarget::RequestId, id));
} else {
QMetaObject::invokeMethod(parent(), "ndefMessagesWritten");
+ QMetaObject::invokeMethod(parent(), "requestCompleted",
+ Q_ARG(QNearFieldTarget::RequestId, id));
}
- m_pendingNdefWrites.removeOne(watcher);
watcher->deleteLater();
}
diff --git a/src/connectivity/nfc/qnearfieldtarget_maemo6_p.h b/src/connectivity/nfc/qnearfieldtarget_maemo6_p.h
index 7919076ade..6cb07cac29 100644
--- a/src/connectivity/nfc/qnearfieldtarget_maemo6_p.h
+++ b/src/connectivity/nfc/qnearfieldtarget_maemo6_p.h
@@ -73,8 +73,10 @@ public:
void addSendCommand(const QDBusPendingReply<QByteArray> &reply,
const QNearFieldTarget::RequestId &id);
- void addReadNdefMessages(const QDBusPendingReply<QList<QByteArray> > &reply);
- void addWriteNdefMessages(const QDBusPendingReply<> &reply);
+ void addReadNdefMessages(const QDBusPendingReply<QList<QByteArray> > &reply,
+ const QNearFieldTarget::RequestId &id);
+ void addWriteNdefMessages(const QDBusPendingReply<> &reply,
+ const QNearFieldTarget::RequestId &id);
private slots:
void sendCommandFinished(QDBusPendingCallWatcher *watcher);
@@ -83,8 +85,8 @@ private slots:
private:
QMap<QDBusPendingCallWatcher *, QNearFieldTarget::RequestId> m_pendingCommands;
- QList<QDBusPendingCallWatcher *> m_pendingNdefReads;
- QList<QDBusPendingCallWatcher *> m_pendingNdefWrites;
+ QMap<QDBusPendingCallWatcher *, QNearFieldTarget::RequestId> m_pendingNdefReads;
+ QMap<QDBusPendingCallWatcher *, QNearFieldTarget::RequestId> m_pendingNdefWrites;
};
template <typename T>
@@ -134,21 +136,28 @@ public:
return true;
}
- void readNdefMessages()
+ QNearFieldTarget::RequestId readNdefMessages()
{
+ QNearFieldTarget::RequestId id(new QNearFieldTarget::RequestIdPrivate);
+
QDBusPendingReply<QList<QByteArray> > reply = m_tag->ReadNDEFData();
- m_callWatcher->addReadNdefMessages(reply);
+ m_callWatcher->addReadNdefMessages(reply, id);
+
+ return id;
}
- void writeNdefMessages(const QList<QNdefMessage> &messages)
+ QNearFieldTarget::RequestId writeNdefMessages(const QList<QNdefMessage> &messages)
{
+ QNearFieldTarget::RequestId id(new QNearFieldTarget::RequestIdPrivate);
QList<QByteArray> rawMessages;
foreach (const QNdefMessage &message, messages)
rawMessages.append(message.toByteArray());
QDBusPendingReply<> reply = m_tag->WriteNDEFData(rawMessages);
- m_callWatcher->addWriteNdefMessages(reply);
+ m_callWatcher->addWriteNdefMessages(reply, id);
+
+ return id;
}
QNearFieldTarget::RequestId sendCommand(const QByteArray &command)
diff --git a/src/connectivity/nfc/symbian/debug.h b/src/connectivity/nfc/symbian/debug.h
index 236b675c6f..6dbd9204a2 100644
--- a/src/connectivity/nfc/symbian/debug.h
+++ b/src/connectivity/nfc/symbian/debug.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)
**
@@ -43,11 +43,18 @@
#define DEBUG_H_
#include <QDebug>
-#define SYMBIAN_NFC_DEBUG
+//#define SYMBIAN_NFC_DEBUG
-#define BEGIN qDebug()<<__PRETTY_FUNCTION__<<" Line: "<<__LINE__ <<" Begin";
-#define END qDebug()<<__PRETTY_FUNCTION__<<" Line: "<<__LINE__ <<" End";
-#define BEGIN_END qDebug()<<__PRETTY_FUNCTION__<<" Line: "<<__LINE__ <<" BEGIN_End";
-#define LOG(a) qDebug()<<__PRETTY_FUNCTION__<<" Line: "<<__LINE__ <<a;
+#ifdef SYMBIAN_NFC_DEBUG
+# define BEGIN qDebug()<<__PRETTY_FUNCTION__<<" Line: "<<__LINE__ <<" Begin";
+# define END qDebug()<<__PRETTY_FUNCTION__<<" Line: "<<__LINE__ <<" End";
+# define BEGIN_END qDebug()<<__PRETTY_FUNCTION__<<" Line: "<<__LINE__ <<" BEGIN_End";
+# define LOG(a) qDebug()<<__PRETTY_FUNCTION__<<" Line: "<<__LINE__ <<a;
+#else
+# define BEGIN
+# define END
+# define BEGIN_END
+# define LOG(a)
+#endif
#endif /* DEBUG_H_ */
diff --git a/src/connectivity/nfc/symbian/llcpsockettype1_symbian.cpp b/src/connectivity/nfc/symbian/llcpsockettype1_symbian.cpp
index a2913cf258..3f73cbd990 100644
--- a/src/connectivity/nfc/symbian/llcpsockettype1_symbian.cpp
+++ b/src/connectivity/nfc/symbian/llcpsockettype1_symbian.cpp
@@ -238,7 +238,6 @@ void CLlcpSocketType1::FrameReceived(MLlcpConnLessTransporter* aConnection)
{
BEGIN
iRemotePort = aConnection->SsapL();
- qDebug() << "FrameReceived " << iRemotePort;
// StartTransportAndReceive(aConnection);
// Only accepting one incoming remote connection
TInt error = KErrNone;
@@ -349,7 +348,6 @@ TInt CLlcpSocketType1::CreateConnection(TUint8 portNum)
if (error == KErrNone)
{
iRemotePort = portNum;
- qDebug() << "CreateConnection " << iRemotePort;
error = StartTransportAndReceive(llcpConnection);
}
END
diff --git a/src/connectivity/nfc/symbian/llcpsockettype2_symbian.h b/src/connectivity/nfc/symbian/llcpsockettype2_symbian.h
index 30ced1b3e2..7ba20995fb 100644
--- a/src/connectivity/nfc/symbian/llcpsockettype2_symbian.h
+++ b/src/connectivity/nfc/symbian/llcpsockettype2_symbian.h
@@ -93,7 +93,7 @@ public:
void AttachCallbackHandler(QtMobility::QLlcpSocketPrivate* aCallback);
private:
// Constructor
- CLlcpSocketType2(MLlcpConnOrientedTransporter* aTransporter = NULL,QtMobility::QLlcpSocketPrivate* aCallback = NULL);
+ explicit CLlcpSocketType2(MLlcpConnOrientedTransporter* aTransporter = NULL,QtMobility::QLlcpSocketPrivate* aCallback = NULL);
// Second phase constructor
void ConstructL();
void ConnectToServiceL( const TDesC8& aServiceName);
diff --git a/src/connectivity/nfc/symbian/nearfieldmanager_symbian.cpp b/src/connectivity/nfc/symbian/nearfieldmanager_symbian.cpp
index 62c785e2bc..cb9a9ea5ac 100644
--- a/src/connectivity/nfc/symbian/nearfieldmanager_symbian.cpp
+++ b/src/connectivity/nfc/symbian/nearfieldmanager_symbian.cpp
@@ -53,6 +53,7 @@
\ingroup connectivity-nfc
\inmodule QtConnectivity
+ \since 1.2
\internal
A Symbian implementation class to support symbian NFC backend.
diff --git a/src/connectivity/nfc/symbian/nearfieldndeftarget_symbian.cpp b/src/connectivity/nfc/symbian/nearfieldndeftarget_symbian.cpp
index 20a0dffc5a..89fc82bc7b 100644
--- a/src/connectivity/nfc/symbian/nearfieldndeftarget_symbian.cpp
+++ b/src/connectivity/nfc/symbian/nearfieldndeftarget_symbian.cpp
@@ -238,6 +238,7 @@ void CNearFieldNdefTarget::HandleError( TInt aError )
//TODO: consider it carefully
//iMessages = 0;
}
+ iCurrentOperation = ENull;
END
}
diff --git a/src/connectivity/nfc/symbian/nearfieldtag_symbian.cpp b/src/connectivity/nfc/symbian/nearfieldtag_symbian.cpp
index 7e08630d64..8355008248 100644
--- a/src/connectivity/nfc/symbian/nearfieldtag_symbian.cpp
+++ b/src/connectivity/nfc/symbian/nearfieldtag_symbian.cpp
@@ -52,6 +52,7 @@
\ingroup connectivity-nfc
\inmodule QtConnectivity
\internal
+ \since 1.2
*/
CNearFieldTag::CNearFieldTag(MNfcTag * aNfcTag, RNfcServer& aNfcServer) : CActive(EPriorityStandard),
diff --git a/src/connectivity/nfc/symbian/nearfieldtagimpl_symbian.h b/src/connectivity/nfc/symbian/nearfieldtagimpl_symbian.h
index 883e5c6f69..31946f7204 100644
--- a/src/connectivity/nfc/symbian/nearfieldtagimpl_symbian.h
+++ b/src/connectivity/nfc/symbian/nearfieldtagimpl_symbian.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)
**
@@ -86,6 +86,7 @@ public: // From MNearFieldTargetOperation
void EmitNdefMessageRead(const QNdefMessage &message);
void EmitNdefMessagesWritten();
+ void EmitRequestCompleted(const QNearFieldTarget::RequestId &id);
void EmitError(int error, const QNearFieldTarget::RequestId &id);
public:
@@ -149,12 +150,31 @@ void QNearFieldTagImpl<TAGTYPE>::EmitNdefMessagesWritten()
}
template<typename TAGTYPE>
-void QNearFieldTagImpl<TAGTYPE>::EmitError(int error, const QNearFieldTarget::RequestId &id)
+void QNearFieldTagImpl<TAGTYPE>::EmitRequestCompleted(const QNearFieldTarget::RequestId &id)
{
BEGIN
TAGTYPE * tag = static_cast<TAGTYPE *>(this);
int err;
- QT_TRYCATCH_ERROR(err, emit tag->error(SymbianError2QtError(error), id));
+ QT_TRYCATCH_ERROR(err, emit tag->requestCompleted(id));
+ Q_UNUSED(err);
+ END
+}
+
+template<typename TAGTYPE>
+void QNearFieldTagImpl<TAGTYPE>::EmitError(int error, const QNearFieldTarget::RequestId &id)
+{
+ BEGIN
+ TAGTYPE * tag = static_cast<TAGTYPE *>(this);
+
+ int err = KErrNone;
+ try {
+ QMetaObject::invokeMethod(tag, "error", Qt::QueuedConnection,
+ Q_ARG(QNearFieldTarget::Error, SymbianError2QtError(error)),
+ Q_ARG(QNearFieldTarget::RequestId, id));
+ } catch (const std::exception &ex) {
+ err = qt_symbian_exception2Error(ex);
+ }
+
Q_UNUSED(err);
END
}
diff --git a/src/connectivity/nfc/symbian/nearfieldtagimplcommon_symbian.cpp b/src/connectivity/nfc/symbian/nearfieldtagimplcommon_symbian.cpp
index 48ecc4bcf3..ccd434ae1c 100644
--- a/src/connectivity/nfc/symbian/nearfieldtagimplcommon_symbian.cpp
+++ b/src/connectivity/nfc/symbian/nearfieldtagimplcommon_symbian.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)
**
@@ -274,7 +274,7 @@ bool QNearFieldTagImplCommon::_hasNdefMessage()
}
-void QNearFieldTagImplCommon::_ndefMessages()
+QNearFieldTarget::RequestId QNearFieldTagImplCommon::_ndefMessages()
{
BEGIN
NearFieldTagNdefRequest * readNdefRequest = new NearFieldTagNdefRequest(*this);
@@ -301,13 +301,15 @@ void QNearFieldTagImplCommon::_ndefMessages()
}
else
{
- EmitError(KErrNoMemory, QNearFieldTarget::RequestId());
+ EmitError(KErrNoMemory, requestId);
}
END
+
+ return requestId;
}
-void QNearFieldTagImplCommon::_setNdefMessages(const QList<QNdefMessage> &messages)
+QNearFieldTarget::RequestId QNearFieldTagImplCommon::_setNdefMessages(const QList<QNdefMessage> &messages)
{
BEGIN
NearFieldTagNdefRequest * writeNdefRequest = new NearFieldTagNdefRequest(*this);
@@ -335,9 +337,11 @@ void QNearFieldTagImplCommon::_setNdefMessages(const QList<QNdefMessage> &messag
}
else
{
- EmitError(KErrNoMemory, QNearFieldTarget::RequestId());
+ EmitError(KErrNoMemory, requestId);
}
END
+
+ return requestId;
}
diff --git a/src/connectivity/nfc/symbian/nearfieldtagimplcommon_symbian.h b/src/connectivity/nfc/symbian/nearfieldtagimplcommon_symbian.h
index 4aefa988b3..1d5aec7fc6 100644
--- a/src/connectivity/nfc/symbian/nearfieldtagimplcommon_symbian.h
+++ b/src/connectivity/nfc/symbian/nearfieldtagimplcommon_symbian.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)
**
@@ -72,6 +72,7 @@ public:
virtual void EmitNdefMessageRead(const QNdefMessage &message) = 0;
virtual void EmitNdefMessagesWritten() = 0;
+ virtual void EmitRequestCompleted(const QNearFieldTarget::RequestId &id) = 0;
virtual void EmitError(int error, const QNearFieldTarget::RequestId &id) = 0;
virtual void HandleResponse(const QNearFieldTarget::RequestId &id, const QByteArray &command, const QByteArray &response, bool emitRequestCompleted) = 0;
virtual void HandleResponse(const QNearFieldTarget::RequestId &id, const QVariantList& response, int error) = 0;
@@ -83,8 +84,8 @@ public:
protected:
bool _hasNdefMessage();
- void _ndefMessages();
- void _setNdefMessages(const QList<QNdefMessage> &messages);
+ QNearFieldTarget::RequestId _ndefMessages();
+ QNearFieldTarget::RequestId _setNdefMessages(const QList<QNdefMessage> &messages);
void _setAccessMethods(const QNearFieldTarget::AccessMethods& accessMethods)
{
diff --git a/src/connectivity/nfc/symbian/nearfieldtagndefrequest_symbian.cpp b/src/connectivity/nfc/symbian/nearfieldtagndefrequest_symbian.cpp
index 974c593fab..7b73c0a76b 100644
--- a/src/connectivity/nfc/symbian/nearfieldtagndefrequest_symbian.cpp
+++ b/src/connectivity/nfc/symbian/nearfieldtagndefrequest_symbian.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)
**
@@ -123,7 +123,7 @@ void NearFieldTagNdefRequest::ProcessEmitSignal(TInt aError)
LOG("error code is "<<aError<<" request type is "<<iType);
if (aError != KErrNone)
{
- iOperator.EmitError(aError, QNearFieldTarget::RequestId());
+ iOperator.EmitError(aError, iId);
}
else
{
@@ -137,10 +137,12 @@ void NearFieldTagNdefRequest::ProcessEmitSignal(TInt aError)
LOG("emit signal ndef message read");
iOperator.EmitNdefMessageRead(iReadMessages.at(i));
}
+ iOperator.EmitRequestCompleted(iId);
}
else if (EWriteRequest == iType)
{
iOperator.EmitNdefMessagesWritten();
+ iOperator.EmitRequestCompleted(iId);
}
}
END
diff --git a/src/connectivity/nfc/symbian/nearfieldtargetfactory_symbian.cpp b/src/connectivity/nfc/symbian/nearfieldtargetfactory_symbian.cpp
index 19a1a34c84..f62d568d13 100644
--- a/src/connectivity/nfc/symbian/nearfieldtargetfactory_symbian.cpp
+++ b/src/connectivity/nfc/symbian/nearfieldtargetfactory_symbian.cpp
@@ -60,6 +60,7 @@
\ingroup connectivity-nfc
\inmodule QtConnectivity
+ \since 1.2
*/
/*