summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Zanetti <michael.zanetti@nokia.com>2012-04-12 09:35:42 +0200
committerQt by Nokia <qt-info@nokia.com>2012-04-26 02:48:16 +0200
commitd2ca81e42d20534ebf541d28501b076353c91a47 (patch)
treef488acde814f72606f6779f1209841738f6f4cae /src
parent90002adc45f7104b71142473c193373af9bbc69d (diff)
downloadqtconnectivity-d2ca81e42d20534ebf541d28501b076353c91a47.tar.gz
Extend SPP profile to be used with NOKIA_BT_SERVICES
Change-Id: Ide681b442f50d7b126d93b891b58aba75832b881 Reviewed-by: Alex <alex.blasche@nokia.com>
Diffstat (limited to 'src')
-rw-r--r--src/bluetooth/bluetooth.pro9
-rw-r--r--src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp8
-rw-r--r--src/bluetooth/qbluetoothserviceinfo_bluez.cpp23
-rw-r--r--src/bluetooth/qbluetoothsocket_bluez.cpp87
-rw-r--r--src/bluetooth/qbluetoothsocket_p.h9
-rw-r--r--src/bluetooth/ql2capserver_bluez.cpp4
-rw-r--r--src/bluetooth/qrfcommserver_bluez.cpp31
7 files changed, 161 insertions, 10 deletions
diff --git a/src/bluetooth/bluetooth.pro b/src/bluetooth/bluetooth.pro
index 1de556a3..01597d83 100644
--- a/src/bluetooth/bluetooth.pro
+++ b/src/bluetooth/bluetooth.pro
@@ -82,6 +82,15 @@ contains(config_test_bluez, yes):contains(QT_CONFIG, dbus) {
qbluetoothtransfermanager_bluez.cpp \
ql2capserver_bluez.cpp
+ contains(DEFINES,NOKIA_BT_SERVICES) {
+ message("Enabling Nokia BT services")
+ QT += serviceframework
+ }
+ contains(DEFINES,NOKIA_BT_PATCHES) {
+ message("Enabling Nokia BT patches")
+ LIBS += -lbluetooth
+ }
+
} else {
message("Unsupported bluetooth platform, will not build a working QBluetooth library")
message("Either no Qt dBus found or no Bluez headers")
diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp b/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp
index d46b6c32..fe8e24be 100644
--- a/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp
+++ b/src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp
@@ -166,8 +166,12 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_createdDevice(QDBusPendingCallWa
QDBusPendingReply<QVariantMap> deviceReply = device->GetProperties();
deviceReply.waitForFinished();
- if(deviceReply.isError())
+ if (deviceReply.isError()) {
+#ifdef QT_SERVICEDISCOVERY_DEBUG
+ qDebug() << "GetProperties error: " << error << deviceObjectPath.error().name();
+#endif
return;
+ }
QVariantMap v = deviceReply.value();
QStringList device_uuids = v.value(QLatin1String("UUIDs")).toStringList();
@@ -217,7 +221,7 @@ void QBluetoothServiceDiscoveryAgentPrivate::_q_discoveredServices(QDBusPendingC
QXmlStreamReader xml(record);
#ifdef QT_SERVICEDISCOVERY_DEBUG
- // qDebug() << "Service xml" << record;
+ qDebug() << "Service xml" << record;
#endif
QBluetoothServiceInfo serviceInfo;
diff --git a/src/bluetooth/qbluetoothserviceinfo_bluez.cpp b/src/bluetooth/qbluetoothserviceinfo_bluez.cpp
index 5591403f..9a422f56 100644
--- a/src/bluetooth/qbluetoothserviceinfo_bluez.cpp
+++ b/src/bluetooth/qbluetoothserviceinfo_bluez.cpp
@@ -247,8 +247,10 @@ bool QBluetoothServiceInfoPrivate::ensureSdpConnection() const
bool QBluetoothServiceInfoPrivate::registerService() const
{
- if (!ensureSdpConnection())
+ if (!ensureSdpConnection()) {
+ qDebug() << "SDP not connected. Cannot register";
return false;
+ }
QString xmlServiceRecord;
@@ -263,10 +265,8 @@ bool QBluetoothServiceInfoPrivate::registerService() const
QMap<quint16, QVariant>::ConstIterator i = attributes.constBegin();
while (i != attributes.constEnd()) {
- QString t = unsignedFormat.arg(i.key(), 4, QLatin1Char('0'));
stream.writeStartElement(QLatin1String("attribute"));
- stream.writeAttribute(QLatin1String("id"),
- unsignedFormat.arg(i.key(), 4, 16, QLatin1Char('0')));
+ stream.writeAttribute(QLatin1String("id"), unsignedFormat.arg(i.key(), 4, 16, QLatin1Char('0')));
writeAttribute(&stream, i.value());
stream.writeEndElement();
@@ -282,15 +282,26 @@ bool QBluetoothServiceInfoPrivate::registerService() const
if (!registered) {
QDBusPendingReply<uint> reply = service->AddRecord(xmlServiceRecord);
reply.waitForFinished();
- if (reply.isError())
+ if (reply.isError()) {
+ qDebug() << "AddRecord returned error" << reply.error();
return false;
+ }
serviceRecord = reply.value();
} else {
+#ifndef NOKIA_BT_PATCHES
QDBusPendingReply<> reply = service->UpdateRecord(serviceRecord, xmlServiceRecord);
+#else
+ QDBusPendingReply<uint> reply = service->UpdateRecord(serviceRecord, xmlServiceRecord);
+#endif
reply.waitForFinished();
- if (reply.isError())
+ if (reply.isError()) {
+ qDebug() << "UpdateRecord returned error" << reply.error();
return false;
+ }
+#ifdef NOKIA_BT_PATCHES
+ serviceRecord = reply.value();
+#endif
}
registered = true;
diff --git a/src/bluetooth/qbluetoothsocket_bluez.cpp b/src/bluetooth/qbluetoothsocket_bluez.cpp
index f15d5425..2c4ae9f1 100644
--- a/src/bluetooth/qbluetoothsocket_bluez.cpp
+++ b/src/bluetooth/qbluetoothsocket_bluez.cpp
@@ -58,6 +58,12 @@
#include <QtCore/QSocketNotifier>
+#ifdef NOKIA_BT_PATCHES
+extern "C" {
+#include <bluetooth/brcm-rfcomm.h>
+}
+#endif
+
QTBLUETOOTH_BEGIN_NAMESPACE
QBluetoothSocketPrivate::QBluetoothSocketPrivate()
@@ -69,6 +75,9 @@ QBluetoothSocketPrivate::QBluetoothSocketPrivate()
connecting(false),
discoveryAgent(0)
{
+#ifdef NOKIA_BT_PATCHES
+ brcm_rfcomm_init();
+#endif
}
QBluetoothSocketPrivate::~QBluetoothSocketPrivate()
@@ -77,6 +86,10 @@ QBluetoothSocketPrivate::~QBluetoothSocketPrivate()
readNotifier = 0;
delete connectWriteNotifier;
connectWriteNotifier = 0;
+
+#ifdef NOKIA_BT_PATCHES
+ brcm_rfcomm_exit();
+#endif
}
bool QBluetoothSocketPrivate::ensureNativeSocket(QBluetoothSocket::SocketType type)
@@ -96,10 +109,18 @@ bool QBluetoothSocketPrivate::ensureNativeSocket(QBluetoothSocket::SocketType ty
switch (type) {
case QBluetoothSocket::L2capSocket:
+#ifndef NOKIA_BT_PATCHES
socket = ::socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
+#else
+ socket = -1; // Raw L2cap sockets not supported
+#endif
break;
case QBluetoothSocket::RfcommSocket:
+#ifndef NOKIA_BT_PATCHES
socket = ::socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
+#else
+ socket = brcm_rfcomm_socket();
+#endif
break;
default:
socket = -1;
@@ -142,8 +163,19 @@ void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address,
connectWriteNotifier->setEnabled(true);
readNotifier->setEnabled(true);QString();
+#ifndef NOKIA_BT_PATCHES
result = ::connect(socket, (sockaddr *)&addr, sizeof(addr));
+#else
+ brcm_rfcomm_socket_bind(socket, (sockaddr*)&addr, sizeof(addr));
+ result = brcm_rfcomm_socket_connect(socket, (sockaddr *)&addr, sizeof(addr));
+ qDebug() << "BRCM: connect result:" << result;
+#endif
} else if (socketType == QBluetoothSocket::L2capSocket) {
+#ifndef NOKIA_BT_PATCHES
+ errorString = "Raw L2Cap sockets are not supported on this platform";
+ q->setSocketError(QBluetoothSocket::UnknownSocketError);
+ return;
+#endif
sockaddr_l2 addr;
memset(&addr, 0, sizeof(addr));
@@ -173,7 +205,11 @@ void QBluetoothSocketPrivate::_q_writeNotify()
if(connecting && state == QBluetoothSocket::ConnectingState){
int errorno, len;
len = sizeof(errorno);
+#ifndef NOKIA_BT_PATCHES
::getsockopt(socket, SOL_SOCKET, SO_ERROR, &errorno, (socklen_t*)&len);
+#else
+ brcm_rfcomm_socket_getsockopt(socket, SOL_SOCKET, SO_ERROR, &errorno, (socklen_t*)&len);
+#endif
if(errorno) {
errorString = QString::fromLocal8Bit(strerror(errorno));
emit q->error(QBluetoothSocket::UnknownSocketError);
@@ -197,7 +233,11 @@ void QBluetoothSocketPrivate::_q_writeNotify()
int size = txBuffer.read(buf, 1024);
+#ifndef NOKIA_BT_PATCHES
if (::write(socket, buf, size) != size) {
+#else
+ if (brcm_rfcomm_socket_write(socket, buf, size) != size) {
+#endif
socketError = QBluetoothSocket::NetworkError;
emit q->error(socketError);
}
@@ -222,7 +262,11 @@ void QBluetoothSocketPrivate::_q_readNotify()
Q_Q(QBluetoothSocket);
char *writePointer = buffer.reserve(QPRIVATELINEARBUFFER_BUFFERSIZE);
// qint64 readFromDevice = q->readData(writePointer, QPRIVATELINEARBUFFER_BUFFERSIZE);
+#ifndef NOKIA_BT_PATCHES
int readFromDevice = ::read(socket, writePointer, QPRIVATELINEARBUFFER_BUFFERSIZE);
+#else
+ int readFromDevice = brcm_rfcomm_socket_read(socket, writePointer, QPRIVATELINEARBUFFER_BUFFERSIZE);
+#endif
if(readFromDevice <= 0){
int errsv = errno;
readNotifier->setEnabled(false);
@@ -296,12 +340,19 @@ QBluetoothAddress QBluetoothSocketPrivate::localAddress() const
sockaddr_rc addr;
socklen_t addrLength = sizeof(addr);
+#ifndef NOKIA_BT_PATCHES
if (::getsockname(socket, reinterpret_cast<sockaddr *>(&addr), &addrLength) == 0) {
+#else
+ if (brcm_rfcomm_socket_getsockname(socket, reinterpret_cast<sockaddr *>(&addr), &addrLength) == 0) {
+#endif
quint64 bdaddr;
convertAddress(addr.rc_bdaddr.b, bdaddr);
return QBluetoothAddress(bdaddr);
}
} else if (socketType == QBluetoothSocket::L2capSocket) {
+#ifndef NOKIA_BT_PATCHES
+ return QBluetoothAddress(); // Raw L2cap sockets not supported
+#endif
sockaddr_l2 addr;
socklen_t addrLength = sizeof(addr);
@@ -321,9 +372,16 @@ quint16 QBluetoothSocketPrivate::localPort() const
sockaddr_rc addr;
socklen_t addrLength = sizeof(addr);
+#ifndef NOKIA_BT_PATCHES
if (::getsockname(socket, reinterpret_cast<sockaddr *>(&addr), &addrLength) == 0)
+#else
+ if (brcm_rfcomm_socket_getsockname(socket, reinterpret_cast<sockaddr *>(&addr), &addrLength) == 0)
+#endif
return addr.rc_channel;
} else if (socketType == QBluetoothSocket::L2capSocket) {
+#ifdef NOKIA_BT_PATCHES
+ return 0; // Raw L2cap sockets not supported
+#endif
sockaddr_l2 addr;
socklen_t addrLength = sizeof(addr);
@@ -345,11 +403,18 @@ QString QBluetoothSocketPrivate::peerName() const
sockaddr_rc addr;
socklen_t addrLength = sizeof(addr);
+#ifndef NOKIA_BT_PATCHES
if (::getpeername(socket, reinterpret_cast<sockaddr *>(&addr), &addrLength) < 0)
+#else
+ if (brcm_rfcomm_socket_getpeername(socket, reinterpret_cast<sockaddr *>(&addr), &addrLength) < 0)
+#endif
return QString();
convertAddress(addr.rc_bdaddr.b, bdaddr);
} else if (socketType == QBluetoothSocket::L2capSocket) {
+#ifdef NOKIA_BT_PATCHES
+ return QString(); // Raw L2cap sockets not supported
+#endif
sockaddr_l2 addr;
socklen_t addrLength = sizeof(addr);
@@ -406,12 +471,19 @@ QBluetoothAddress QBluetoothSocketPrivate::peerAddress() const
sockaddr_rc addr;
socklen_t addrLength = sizeof(addr);
+#ifndef NOKIA_BT_PATCHES
if (::getpeername(socket, reinterpret_cast<sockaddr *>(&addr), &addrLength) == 0) {
+#else
+ if (brcm_rfcomm_socket_getpeername(socket, reinterpret_cast<sockaddr *>(&addr), &addrLength) == 0) {
+#endif
quint64 bdaddr;
convertAddress(addr.rc_bdaddr.b, bdaddr);
return QBluetoothAddress(bdaddr);
}
} else if (socketType == QBluetoothSocket::L2capSocket) {
+#ifdef NOKIA_BT_PATCHES
+ return QBluetoothAddress(); // Raw L2cap sockets not supported
+#endif
sockaddr_l2 addr;
socklen_t addrLength = sizeof(addr);
@@ -431,9 +503,16 @@ quint16 QBluetoothSocketPrivate::peerPort() const
sockaddr_rc addr;
socklen_t addrLength = sizeof(addr);
+#ifndef NOKIA_BT_PATCHES
if (::getpeername(socket, reinterpret_cast<sockaddr *>(&addr), &addrLength) == 0)
+#else
+ if (brcm_rfcomm_socket_getpeername(socket, reinterpret_cast<sockaddr *>(&addr), &addrLength) == 0)
+#endif
return addr.rc_channel;
} else if (socketType == QBluetoothSocket::L2capSocket) {
+#ifdef NOKIA_BT_PATCHES
+ return 0; // Raw L2cap sockets not supported
+#endif
sockaddr_l2 addr;
socklen_t addrLength = sizeof(addr);
@@ -448,7 +527,11 @@ qint64 QBluetoothSocketPrivate::writeData(const char *data, qint64 maxSize)
{
Q_Q(QBluetoothSocket);
if (q->openMode() & QIODevice::Unbuffered) {
+#ifndef NOKIA_BT_PATCHES
if (::write(socket, data, maxSize) != maxSize) {
+#else
+ if (brcm_rfcomm_socket_write(socket, (void*)data, maxSize) != maxSize) {
+#endif
socketError = QBluetoothSocket::NetworkError;
emit q->error(socketError);
}
@@ -506,7 +589,11 @@ void QBluetoothSocketPrivate::close()
// We are disconnected now, so go to unconnected.
q->setSocketState(QBluetoothSocket::UnconnectedState);
emit q->disconnected();
+#ifndef NOKIA_BT_PATCHES
::close(socket);
+#else
+ brcm_rfcomm_socket_close(socket);
+#endif
}
}
diff --git a/src/bluetooth/qbluetoothsocket_p.h b/src/bluetooth/qbluetoothsocket_p.h
index 7058a0b6..4769c080 100644
--- a/src/bluetooth/qbluetoothsocket_p.h
+++ b/src/bluetooth/qbluetoothsocket_p.h
@@ -144,12 +144,21 @@ private:
static inline void convertAddress(quint64 from, quint8 (&to)[6])
{
+#ifndef NOKIA_BT_PATCHES
to[0] = (from >> 0) & 0xff;
to[1] = (from >> 8) & 0xff;
to[2] = (from >> 16) & 0xff;
to[3] = (from >> 24) & 0xff;
to[4] = (from >> 32) & 0xff;
to[5] = (from >> 40) & 0xff;
+#else
+ to[5] = (from >> 0) & 0xff;
+ to[4] = (from >> 8) & 0xff;
+ to[3] = (from >> 16) & 0xff;
+ to[2] = (from >> 24) & 0xff;
+ to[1] = (from >> 32) & 0xff;
+ to[0] = (from >> 40) & 0xff;
+#endif
}
static inline void convertAddress(quint8 (&from)[6], quint64 &to)
diff --git a/src/bluetooth/ql2capserver_bluez.cpp b/src/bluetooth/ql2capserver_bluez.cpp
index 00558dab..21d2a475 100644
--- a/src/bluetooth/ql2capserver_bluez.cpp
+++ b/src/bluetooth/ql2capserver_bluez.cpp
@@ -97,6 +97,10 @@ bool QL2capServer::listen(const QBluetoothAddress &address, quint16 port)
{
Q_D(QL2capServer);
+#ifdef NOKIA_BT_PATCHES
+ return false; // Raw L2Cap not supported
+#endif
+
int sock = d->socket->socketDescriptor();
if (sock < 0)
return false;
diff --git a/src/bluetooth/qrfcommserver_bluez.cpp b/src/bluetooth/qrfcommserver_bluez.cpp
index d214e197..f0a2b6ba 100644
--- a/src/bluetooth/qrfcommserver_bluez.cpp
+++ b/src/bluetooth/qrfcommserver_bluez.cpp
@@ -52,6 +52,12 @@
#include <errno.h>
+#ifdef NOKIA_BT_PATCHES
+extern "C" {
+#include <bluetooth/brcm-rfcomm.h>
+}
+#endif
+
QTBLUETOOTH_BEGIN_NAMESPACE
static inline void convertAddress(quint64 from, quint8 (&to)[6])
@@ -113,10 +119,18 @@ bool QRfcommServer::listen(const QBluetoothAddress &address, quint16 port)
else
convertAddress(Q_UINT64_C(0), addr.rc_bdaddr.b);
+#ifndef NOKIA_BT_PATCHES
if (::bind(sock, reinterpret_cast<sockaddr *>(&addr), sizeof(sockaddr_rc)) < 0)
+#else
+ if (brcm_rfcomm_socket_bind(sock, reinterpret_cast<sockaddr *>(&addr), sizeof(sockaddr_rc)) < 0)
+#endif
return false;
+#ifndef NOKIA_BT_PATCHES
if (::listen(sock, d->maxPendingConnections) < 0)
+#else
+ if (brcm_rfcomm_socket_listen(sock, d->maxPendingConnections) < 0)
+#endif
return false;
d->socket->setSocketState(QBluetoothSocket::ListeningState);
@@ -159,8 +173,13 @@ QBluetoothSocket *QRfcommServer::nextPendingConnection()
sockaddr_rc addr;
socklen_t length = sizeof(sockaddr_rc);
+#ifndef NOKIA_BT_PATCHES
int pending = ::accept(d->socket->socketDescriptor(),
reinterpret_cast<sockaddr *>(&addr), &length);
+#else
+ int pending = brcm_rfcomm_socket_accept(d->socket->socketDescriptor(),
+ reinterpret_cast<sockaddr *>(&addr), &length);
+#endif
if (pending >= 0) {
QBluetoothSocket *newSocket = new QBluetoothSocket;
newSocket->setSocketDescriptor(pending, QBluetoothSocket::RfcommSocket);
@@ -213,7 +232,11 @@ void QRfcommServer::setSecurityFlags(QBluetooth::SecurityFlags security)
qDebug() << hex << "Setting lm to" << lm << security;
- if(setsockopt(d->socket->socketDescriptor(), SOL_RFCOMM, RFCOMM_LM, &lm, sizeof(lm)) < 0){
+#ifndef NOKIA_BT_PATCHES
+ if (setsockopt(d->socket->socketDescriptor(), SOL_RFCOMM, RFCOMM_LM, &lm, sizeof(lm)) < 0){
+#else
+ if (brcm_rfcomm_socket_setsockopt(d->socket->socketDescriptor(), SOL_RFCOMM, RFCOMM_LM, &lm, sizeof(lm)) < 0){
+#endif
qWarning() << "Failed to set socket option, closing socket for safety" << errno;
qWarning() << "Error: " << strerror(errno);
d->socket->close();
@@ -228,7 +251,11 @@ QBluetooth::SecurityFlags QRfcommServer::securityFlags() const
int len = sizeof(lm);
int security = QBluetooth::NoSecurity;
- if(getsockopt(d->socket->socketDescriptor(), SOL_RFCOMM, RFCOMM_LM, &lm, (socklen_t *)&len) < 0) {
+#ifndef NOKIA_BT_PATCHES
+ if (getsockopt(d->socket->socketDescriptor(), SOL_RFCOMM, RFCOMM_LM, &lm, (socklen_t *)&len) < 0) {
+#else
+ if (brcm_rfcomm_socket_getsockopt(d->socket->socketDescriptor(), SOL_RFCOMM, RFCOMM_LM, &lm, (socklen_t *)&len) < 0) {
+#endif
qWarning() << "Failed to get security flags" << strerror(errno);
return QBluetooth::NoSecurity;
}