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/bluetooth/qbluetoothsocket_bluez.cpp | |
parent | 90002adc45f7104b71142473c193373af9bbc69d (diff) |
Extend SPP profile to be used with NOKIA_BT_SERVICES
Change-Id: Ide681b442f50d7b126d93b891b58aba75832b881
Reviewed-by: Alex <alex.blasche@nokia.com>
Diffstat (limited to 'src/bluetooth/qbluetoothsocket_bluez.cpp')
-rw-r--r-- | src/bluetooth/qbluetoothsocket_bluez.cpp | 87 |
1 files changed, 87 insertions, 0 deletions
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 } } |