summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomasz Sterna <tomek@xiaoka.com>2014-06-30 01:59:14 +0200
committerTomasz Sterna <tomek@xiaoka.com>2014-06-30 01:59:14 +0200
commit3c52767b24f27ac166f9c68e2fc73811527bafe1 (patch)
treed4a4050de526967ac4c3407f643b51d616cc31fe
parent1d5e1b8dbb04d1ba916ff90445d22e0a145fd041 (diff)
Reworked WatchConnector connection/disconnection handling
Fixed crash after Pebble disconnecting
-rw-r--r--daemon/dbusconnector.cpp23
-rw-r--r--daemon/dbusconnector.h10
-rw-r--r--daemon/manager.cpp18
-rw-r--r--daemon/manager.h2
-rw-r--r--lib/watchconnector.cpp61
-rw-r--r--lib/watchconnector.h16
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;