diff options
| author | Tomasz Sterna <tomek@xiaoka.com> | 2014-06-30 01:59:14 +0200 |
|---|---|---|
| committer | Tomasz Sterna <tomek@xiaoka.com> | 2014-06-30 01:59:14 +0200 |
| commit | 3c52767b24f27ac166f9c68e2fc73811527bafe1 (patch) | |
| tree | d4a4050de526967ac4c3407f643b51d616cc31fe | |
| parent | 1d5e1b8dbb04d1ba916ff90445d22e0a145fd041 (diff) | |
Reworked WatchConnector connection/disconnection handling
Fixed crash after Pebble disconnecting
| -rw-r--r-- | daemon/dbusconnector.cpp | 23 | ||||
| -rw-r--r-- | daemon/dbusconnector.h | 10 | ||||
| -rw-r--r-- | daemon/manager.cpp | 18 | ||||
| -rw-r--r-- | daemon/manager.h | 2 | ||||
| -rw-r--r-- | lib/watchconnector.cpp | 61 | ||||
| -rw-r--r-- | lib/watchconnector.h | 16 |
6 files changed, 73 insertions, 57 deletions
diff --git a/daemon/dbusconnector.cpp b/daemon/dbusconnector.cpp index 8cf5713..e5bed8f 100644 --- a/daemon/dbusconnector.cpp +++ b/daemon/dbusconnector.cpp @@ -7,18 +7,14 @@ #include <QDBusArgument> #include <QDBusObjectPath> -DBusConnector::DBusConnector(QObject *parent) : - QObject(parent) -{ //dbus-send --system --dest=org.bluez --print-reply / org.bluez.Manager.ListAdapters //dbus-send --system --dest=org.bluez --print-reply $path org.bluez.Adapter.GetProperties //dbus-send --system --dest=org.bluez --print-reply $devpath org.bluez.Device.GetProperties //dbus-send --system --dest=org.bluez --print-reply $devpath org.bluez.Input.Connect - QDBusConnection session = QDBusConnection::sessionBus(); - - findPebble(); -} +DBusConnector::DBusConnector(QObject *parent) : + QObject(parent) +{} bool DBusConnector::findPebble() { @@ -70,15 +66,12 @@ bool DBusConnector::findPebble() QString tmp = dict["Name"].toString(); qDebug() << "Found BT device:" << tmp; if (tmp.startsWith("Pebble")) { - name = tmp; - address = dict["Address"].toString(); - qDebug() << "Found Pebble:" << name << address; + qDebug() << "Found Pebble:" << tmp; + pebbleProps = dict; + emit pebbleChanged(); + return true; } } - if (name.isEmpty() or address.isEmpty()) return false; - - pebbleName = name; - pebbleAddress = address; - return true; + return false; } diff --git a/daemon/dbusconnector.h b/daemon/dbusconnector.h index 8dadb5a..e166238 100644 --- a/daemon/dbusconnector.h +++ b/daemon/dbusconnector.h @@ -2,17 +2,23 @@ #define DBUSCONNECTOR_H #include <QObject> +#include <QVariantMap> class DBusConnector : public QObject { Q_OBJECT + + Q_PROPERTY(QVariantMap pebble READ pebble NOTIFY pebbleChanged) + + QVariantMap pebbleProps; + public: explicit DBusConnector(QObject *parent = 0); - QString pebbleName; - QString pebbleAddress; + QVariantMap pebble() { return pebbleProps; } signals: + void pebbleChanged(); public slots: bool findPebble(); diff --git a/daemon/manager.cpp b/daemon/manager.cpp index 5e09c75..691d7a5 100644 --- a/daemon/manager.cpp +++ b/daemon/manager.cpp @@ -5,7 +5,8 @@ #include <QtContacts/QContactPhoneNumber> Manager::Manager(watch::WatchConnector *watch, DBusConnector *dbus, VoiceCallManager *voice) : - QObject(0), watch(watch), dbus(dbus), voice(voice) + QObject(0), watch(watch), dbus(dbus), voice(voice), + notification(MNotification::DeviceEvent) { // We don't need to handle presence changes, so report them separately and ignore them QMap<QString, QString> parameters; @@ -26,10 +27,23 @@ Manager::Manager(watch::WatchConnector *watch, DBusConnector *dbus, VoiceCallMan // Watch instantiated hangup, follow the orders connect(watch, SIGNAL(hangup()), SLOT(hangupAll())); + connect(watch, SIGNAL(connectedChanged()), SLOT(onConnectedChanged())); if (btDevice.isValid()) { qDebug() << "BT local name:" << btDevice.name(); - watch->deviceConnect(dbus->pebbleName, dbus->pebbleAddress); + connect(dbus, SIGNAL(pebbleChanged()), SLOT(onPebbleChanged())); + dbus->findPebble(); + } +} + +void Manager::onPebbleChanged() +{ + const QVariantMap & pebble = dbus->pebble(); + QString name = pebble["Name"].toString(); + if (name.isEmpty()) { + qDebug() << "Pebble gone"; + } else { + watch->deviceConnect(name, pebble["Address"].toString()); } } diff --git a/daemon/manager.h b/daemon/manager.h index 0d6e8ac..a1b206e 100644 --- a/daemon/manager.h +++ b/daemon/manager.h @@ -40,6 +40,8 @@ public slots: void hangupAll(); protected slots: + void onPebbleChanged(); + void onConnectedChanged(); void onActiveVoiceCallChanged(); void onVoiceError(const QString &message); void onActiveVoiceCallStatusChanged(); diff --git a/lib/watchconnector.cpp b/lib/watchconnector.cpp index e987cce..15fd97f 100644 --- a/lib/watchconnector.cpp +++ b/lib/watchconnector.cpp @@ -4,13 +4,11 @@ using namespace watch; -static int __reconnect_timeout = 1000; +static int __reconnect_timeout = 5000; //ms WatchConnector::WatchConnector(QObject *parent) : - QObject(parent) -{ - socket = nullptr; -} + QObject(parent), socket(nullptr), is_connected(false) +{} WatchConnector::~WatchConnector() { @@ -21,47 +19,47 @@ void WatchConnector::deviceDiscovered(const QBluetoothDeviceInfo &device) //FIXME TODO: Configurable if (device.name().startsWith("Pebble")) { qDebug() << "Found Pebble:" << device.name() << '(' << device.address().toString() << ')'; - handleWatch(device); + handleWatch(device.name(), device.address().toString()); } else { qDebug() << "Found other device:" << device.name() << '(' << device.address().toString() << ')'; } } -void WatchConnector::deviceConnect(const QString name, const QString address) +void WatchConnector::deviceConnect(const QString &name, const QString &address) { - if (name.startsWith("Pebble")) { - _last_name = name; - _last_address = address; - QBluetoothDeviceInfo device(QBluetoothAddress(address), name, 0); - deviceDiscovered(device); - } + if (name.startsWith("Pebble")) handleWatch(name, address); } void WatchConnector::reconnect() { - if (_last_name != "" && _last_address != "") { + qDebug() << "reconnect" << _last_name; + if (!_last_name.isEmpty() && !_last_address.isEmpty()) { deviceConnect(_last_name, _last_address); } } -void WatchConnector::handleWatch(const QBluetoothDeviceInfo &device) +void WatchConnector::handleWatch(const QString &name, const QString &address) { - qDebug() << "handleWatch" << device.name(); - if (socket != nullptr) { + qDebug() << "handleWatch" << name << (socket != nullptr); + if (socket != nullptr && socket->isOpen()) { socket->close(); socket->deleteLater(); - socket = nullptr; } - socket = new QBluetoothSocket(QBluetoothSocket::RfcommSocket); + bool emit_name = (_last_name != name); + _last_name = name; + _last_address = address; + if (emit_name) emit nameChanged(); + qDebug() << "Creating socket"; + socket = new QBluetoothSocket(QBluetoothSocket::RfcommSocket); // FIXME: Assuming port 1 (with Pebble) - socket->connectToService(device.address(), 1); + socket->connectToService(QBluetoothAddress(address), 1); - connect(socket, SIGNAL(readyRead()), this, SLOT(readSocket())); - connect(socket, SIGNAL(connected()), this, SLOT(connected())); - connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected())); + connect(socket, SIGNAL(readyRead()), SLOT(onReadSocket())); + connect(socket, SIGNAL(connected()), SLOT(onConnected())); + connect(socket, SIGNAL(disconnected()), SLOT(onDisconnected())); } QString WatchConnector::decodeEndpoint(unsigned int val) @@ -133,7 +131,7 @@ void WatchConnector::decodeMsg(QByteArray data) } } -void WatchConnector::readSocket() +void WatchConnector::onReadSocket() { qDebug() << "read"; @@ -147,26 +145,27 @@ void WatchConnector::readSocket() } } -void WatchConnector::connected() +void WatchConnector::onConnected() { qDebug() << "Connected!"; + bool was_connected = is_connected; is_connected = true; - emit nameChanged(); - emit connectedChanged(); + if (not was_connected) emit connectedChanged(); } -void WatchConnector::disconnected() +void WatchConnector::onDisconnected() { qDebug() << "Disconnected!"; + + bool was_connected = is_connected; is_connected = false; QBluetoothSocket *socket = qobject_cast<QBluetoothSocket *>(sender()); if (!socket) return; + if (was_connected) emit connectedChanged(); + socket->deleteLater(); - socket = nullptr; - emit connectedChanged(); - emit nameChanged(); // Try to connect again after a timeout QTimer::singleShot(__reconnect_timeout, this, SLOT(reconnect())); diff --git a/lib/watchconnector.h b/lib/watchconnector.h index 616b9f5..bf404e6 100644 --- a/lib/watchconnector.h +++ b/lib/watchconnector.h @@ -31,6 +31,7 @@ #define WATCHCONNECTOR_H #include <QObject> +#include <QPointer> #include <QStringList> #include <QBluetoothDeviceInfo> #include <QBluetoothSocket> @@ -45,7 +46,7 @@ class WatchConnector : public QObject { Q_OBJECT Q_PROPERTY(QString name READ name NOTIFY nameChanged) - Q_PROPERTY(QString isConnected READ isConnected NOTIFY connectedChanged) + Q_PROPERTY(QString connected READ isConnected NOTIFY connectedChanged) public: enum { watchTIME = 11, @@ -109,17 +110,18 @@ public slots: void startPhoneCall(unsigned int cookie=0); void endPhoneCall(unsigned int cookie=0); - void deviceConnect(const QString name, const QString address); + void deviceConnect(const QString &name, const QString &address); void deviceDiscovered(const QBluetoothDeviceInfo&); - void handleWatch(const QBluetoothDeviceInfo&); - void readSocket(); - void connected(); - void disconnected(); + void handleWatch(const QString &name, const QString &address); + void onReadSocket(); + void onConnected(); + void onDisconnected(); void reconnect(); private: void decodeMsg(QByteArray data); - QBluetoothSocket *socket; + + QPointer<QBluetoothSocket> socket; bool is_connected; QString _last_name; QString _last_address; |
