diff options
author | Michael Zanetti <michael.zanetti@nokia.com> | 2012-04-12 09:35:42 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-04-26 02:48:16 +0200 |
commit | d2ca81e42d20534ebf541d28501b076353c91a47 (patch) | |
tree | f488acde814f72606f6779f1209841738f6f4cae /src | |
parent | 90002adc45f7104b71142473c193373af9bbc69d (diff) | |
download | qtconnectivity-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.pro | 9 | ||||
-rw-r--r-- | src/bluetooth/qbluetoothservicediscoveryagent_bluez.cpp | 8 | ||||
-rw-r--r-- | src/bluetooth/qbluetoothserviceinfo_bluez.cpp | 23 | ||||
-rw-r--r-- | src/bluetooth/qbluetoothsocket_bluez.cpp | 87 | ||||
-rw-r--r-- | src/bluetooth/qbluetoothsocket_p.h | 9 | ||||
-rw-r--r-- | src/bluetooth/ql2capserver_bluez.cpp | 4 | ||||
-rw-r--r-- | src/bluetooth/qrfcommserver_bluez.cpp | 31 |
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; } |