summaryrefslogtreecommitdiff
path: root/daemon
diff options
context:
space:
mode:
Diffstat (limited to 'daemon')
-rw-r--r--daemon/daemon.pro6
-rw-r--r--daemon/datalogmanager.cpp42
-rw-r--r--daemon/datalogmanager.h25
-rw-r--r--daemon/manager.cpp9
-rw-r--r--daemon/manager.h2
-rw-r--r--daemon/watchconnector.cpp7
-rw-r--r--daemon/watchconnector.h13
7 files changed, 97 insertions, 7 deletions
diff --git a/daemon/daemon.pro b/daemon/daemon.pro
index 768b50e..d4d7dbf 100644
--- a/daemon/daemon.pro
+++ b/daemon/daemon.pro
@@ -22,7 +22,8 @@ SOURCES += \
dbusconnector.cpp \
dbusadaptor.cpp \
appmanager.cpp \
- musicmanager.cpp
+ musicmanager.cpp \
+ datalogmanager.cpp
HEADERS += \
manager.h \
@@ -35,7 +36,8 @@ HEADERS += \
settings.h \
appmanager.h \
musicmanager.h \
- unpacker.h
+ unpacker.h \
+ datalogmanager.h
OTHER_FILES += \
org.pebbled.xml \
diff --git a/daemon/datalogmanager.cpp b/daemon/datalogmanager.cpp
new file mode 100644
index 0000000..8026e15
--- /dev/null
+++ b/daemon/datalogmanager.cpp
@@ -0,0 +1,42 @@
+#include "datalogmanager.h"
+#include "unpacker.h"
+
+DataLogManager::DataLogManager(WatchConnector *watch, QObject *parent) :
+ QObject(parent), watch(watch)
+{
+ watch->setEndpointHandler(WatchConnector::watchDATA_LOGGING, [this](const QByteArray& data) {
+ if (data.size() < 2) {
+ logger()->warn() << "small data_logging packet";
+ return false;
+ }
+
+ const char command = data[0];
+ const int session = data[1];
+
+ switch (command) {
+ case WatchConnector::datalogOPEN:
+ logger()->debug() << "open datalog session" << session;
+ return true;
+ case WatchConnector::datalogCLOSE:
+ logger()->debug() << "close datalog session" << session;
+ return true;
+ case WatchConnector::datalogTIMEOUT:
+ logger()->debug() << "timeout datalog session" << session;
+ return true;
+ case WatchConnector::datalogDATA:
+ handleDataCommand(session, data.mid(2));
+ return true;
+ default:
+ return false;
+ }
+ });
+}
+
+void DataLogManager::handleDataCommand(int session, const QByteArray &data)
+{
+ Unpacker u(data);
+
+ // TODO Seemingly related to analytics, so not important.
+
+ logger()->debug() << "got datalog data" << session << data.size();
+}
diff --git a/daemon/datalogmanager.h b/daemon/datalogmanager.h
new file mode 100644
index 0000000..47fc948
--- /dev/null
+++ b/daemon/datalogmanager.h
@@ -0,0 +1,25 @@
+#ifndef DATALOGMANAGER_H
+#define DATALOGMANAGER_H
+
+#include "watchconnector.h"
+
+class DataLogManager : public QObject
+{
+ Q_OBJECT
+ LOG4QT_DECLARE_QCLASS_LOGGER
+
+public:
+ explicit DataLogManager(WatchConnector *watch, QObject *parent = 0);
+
+signals:
+
+public slots:
+
+private:
+ void handleDataCommand(int session, const QByteArray &data);
+
+private:
+ WatchConnector *watch;
+};
+
+#endif // DATALOGMANAGER_H
diff --git a/daemon/manager.cpp b/daemon/manager.cpp
index 8a8acf4..7a02c86 100644
--- a/daemon/manager.cpp
+++ b/daemon/manager.cpp
@@ -12,6 +12,7 @@ Manager::Manager(Settings *settings, QObject *parent) :
voice(new VoiceCallManager(settings, this)),
notifications(new NotificationManager(settings, this)),
music(new MusicManager(watch, this)),
+ datalog(new DataLogManager(watch, this)),
apps(new AppManager(this)),
notification(MNotification::DeviceEvent)
{
@@ -35,15 +36,15 @@ Manager::Manager(Settings *settings, QObject *parent) :
return true;
});
watch->setEndpointHandler(WatchConnector::watchPHONE_CONTROL,
- [this](const QByteArray& data) {
+ [this](const QByteArray &data) {
if (data.at(0) == WatchConnector::callHANGUP) {
voice->hangupAll();
}
return true;
});
- watch->setEndpointHandler(WatchConnector::watchDATA_LOGGING,
- [this](const QByteArray& data) {
- //logger()->debug() << data.toHex();
+ watch->setEndpointHandler(WatchConnector::watchLAUNCHER,
+ [this](const QByteArray &data) {
+ logger()->debug() << "LAUNCHER msg:" << data.toHex();
return true;
});
diff --git a/daemon/manager.h b/daemon/manager.h
index b210700..8b2fd96 100644
--- a/daemon/manager.h
+++ b/daemon/manager.h
@@ -6,6 +6,7 @@
#include "voicecallmanager.h"
#include "notificationmanager.h"
#include "musicmanager.h"
+#include "datalogmanager.h"
#include "appmanager.h"
#include "settings.h"
@@ -42,6 +43,7 @@ class Manager :
VoiceCallManager *voice;
NotificationManager *notifications;
MusicManager *music;
+ DataLogManager *datalog;
AppManager *apps;
MNotification notification;
diff --git a/daemon/watchconnector.cpp b/daemon/watchconnector.cpp
index 61eeb67..a3ea181 100644
--- a/daemon/watchconnector.cpp
+++ b/daemon/watchconnector.cpp
@@ -160,6 +160,13 @@ void WatchConnector::onReadSocket()
message_length = qFromBigEndian<quint16>(&header[0]);
endpoint = qFromBigEndian<quint16>(&header[sizeof(quint16)]);
+ if (message_length > 8 * 1024) {
+ // Protocol does not allow messages more than 8K long, seemingly.
+ logger()->warn() << "received message size too long: " << message_length;
+ socket->readAll(); // drop input buffer
+ return;
+ }
+
// Now wait for the entire message
if (socket->bytesAvailable() < header_length + message_length) {
logger()->debug() << "incomplete msg body in read buffer";
diff --git a/daemon/watchconnector.h b/daemon/watchconnector.h
index 01c3dac..c5ec332 100644
--- a/daemon/watchconnector.h
+++ b/daemon/watchconnector.h
@@ -109,7 +109,18 @@ public:
appmgrGET_APPBANK_STATUS = 1,
appmgrGET_APPBANK_UUIDS = 5
};
-
+ enum AppMessage {
+ appmsgPUSH = 1,
+ appmsgREQUEST = 2,
+ appmsgACK = 0xFF,
+ appmsgNACK = 0x7F
+ };
+ enum DataLogMessage {
+ datalogOPEN = 1,
+ datalogDATA = 2,
+ datalogCLOSE = 3,
+ datalogTIMEOUT = 7
+ };
enum {
leadEMAIL = 0,
leadSMS = 1,