summaryrefslogtreecommitdiff
path: root/agents/hostmanagerconn.cc
diff options
context:
space:
mode:
authorJavier <dev.git@javispedro.com>2016-01-01 22:05:42 +0100
committerJavier <dev.git@javispedro.com>2016-01-01 22:05:42 +0100
commita45977185a485624095bff1a15024e9199eee676 (patch)
tree6cc57d085bdd01e493477c870dbe0548137998e1 /agents/hostmanagerconn.cc
parenta24034bdfea259cdc09c74217be75d4f9de0dce5 (diff)
downloadsapd-a45977185a485624095bff1a15024e9199eee676.tar.gz
sapd-a45977185a485624095bff1a15024e9199eee676.zip
reorganize source files into SAP and agents
Diffstat (limited to 'agents/hostmanagerconn.cc')
-rw-r--r--agents/hostmanagerconn.cc233
1 files changed, 233 insertions, 0 deletions
diff --git a/agents/hostmanagerconn.cc b/agents/hostmanagerconn.cc
new file mode 100644
index 0000000..0e1f7bb
--- /dev/null
+++ b/agents/hostmanagerconn.cc
@@ -0,0 +1,233 @@
+#include <QtCore/QDebug>
+#include <QtCore/QDateTime>
+#include <QtCore/QTimeZone>
+#include <QtCore/QXmlStreamReader>
+#include <QtCore/QXmlStreamWriter>
+#include <QtCore/QJsonDocument>
+#include <QtCore/QJsonObject>
+
+#if SAILFISH
+#include <libwatchfish/walltimemonitor.h>
+static watchfish::WallTimeMonitor *monitor = 0;
+#endif
+
+#include "sapmanager.h"
+#include "sappeer.h"
+#include "hostmanagerconn.h"
+
+HostManagerConn::HostManagerConn(SAPConnection *conn, QObject *parent)
+ : QObject(parent), _conn(conn), _socket(conn->getSocket(103))
+{
+ connect(_conn, SIGNAL(disconnected()), SLOT(deleteLater()));
+ connect(_conn, SIGNAL(destroyed()), SLOT(deleteLater()));
+ Q_ASSERT(_socket);
+ connect(_socket, SIGNAL(connected()), SLOT(handleConnected()));
+ connect(_socket, SIGNAL(messageReceived()), SLOT(handleMessageReceived()));
+}
+
+HostManagerConn::DeviceInfo HostManagerConn::parseDeviceInfo(const QString &xmlData)
+{
+ QXmlStreamReader r(xmlData);
+ DeviceInfo info;
+
+ // TODO
+
+ return info;
+}
+
+void HostManagerConn::sendMessage(const QJsonObject &msg)
+{
+ QJsonDocument doc(msg);
+ QByteArray data = doc.toJson(QJsonDocument::Compact);
+ qDebug() << "Send JSON:" << data;
+ _socket->send(QByteArray(2, '\0') + data);
+}
+
+void HostManagerConn::handleMessage(const QJsonObject &msg)
+{
+ const QString msgId = msg["msgId"].toString();
+ qDebug() << "Got JSON msg" << msgId;
+ if (msgId == "mgr_watch_info_res") {
+ QJsonObject reply;
+ QDateTime timestamp = QLocale("C").toDateTime(QString::fromLatin1(__DATE__ " " __TIME__).simplified(),
+ "MMM d yyyy HH:mm:ss");
+ reply["timestamp"] = QString("%1_%2").arg(timestamp.toTime_t())
+ .arg(_conn->peer()->localName().right(2));
+ reply["type"] = QLatin1String("connect");
+ reply["msgId"] = QLatin1String("mgr_wearable_status_req");
+ sendMessage(reply);
+ } else if (msgId == "mgr_wearable_status_res") {
+ // Do nothing; watch will next ask for host status
+ } else if (msgId == "mgr_host_status_req") {
+ QJsonObject reply;
+ reply["type"] = QLatin1String("connect");
+ reply["msgId"] = QLatin1String("mgr_host_status_res");
+ reply["preinstalled"] = QLatin1String("true");
+ reply["data"] = generateHostXml();
+ sendMessage(reply);
+ } else if (msgId == "mgr_status_exchange_done") {
+ performTimeSync();
+ QJsonObject reply;
+ reply["btMac"] = _conn->peer()->localName();
+ reply["msgId"] = QLatin1String("mgr_setupwizard_eula_finished_req");
+ reply["isOld"] = 1;
+ sendMessage(reply);
+ }
+}
+
+void HostManagerConn::performTimeSync()
+{
+ //{"date1224":"24","datetimeepoch":"1409343828044","safety_declared":"0","locale":"es_ES","safety_voice":"1",
+ // "safetyVersion":0,"timezone":"Europe\/Madrid","safety":"false","tablet":"true","dateformat":"dd-MM-yyyy",
+ // "isfrominitial":true,"msgId":"mgr_sync_init_setting_req","usingCamera":"false","safety_cam":"0",
+ // "datetime":"2014 08 29 22 23 48","incomingCall":"false"}
+
+ QJsonObject msg;
+ msg["msgId"] = QLatin1String("mgr_sync_init_setting_req");
+
+ msg["safety_declared"] = QLatin1String("0");
+ msg["safety_voice"] = QLatin1String("0");
+ msg["safetyVersion"] = QLatin1String("0");
+ msg["safety"] = QLatin1String("false");
+ msg["tablet"] = QLatin1String("false");
+ msg["incomingCall"] = QLatin1String("false");
+ msg["usingCamera"] = QLatin1String("false");
+ msg["safety_cam"] = QLatin1String("0");
+
+ QLocale l = QLocale::system();
+ msg["locale"] = l.name(); // i.e. es_ES
+ msg["date1224"] = l.timeFormat().contains('a', Qt::CaseInsensitive) ? QLatin1String("12") : QLatin1String("24");
+ msg["dateformat"] = QLocale::system().dateFormat(QLocale::ShortFormat);
+
+#if SAILFISH
+ // QTimeZone does not seem to work on Sailfish; use timed.
+ msg["timezone"] = monitor->timezone();
+#else
+ msg["timezone"] = QString::fromLatin1(QTimeZone::systemTimeZoneId());
+#endif
+
+ QDateTime dt = QDateTime::currentDateTime();
+ msg["datetimeepoch"] = QString::number(dt.currentMSecsSinceEpoch());
+ msg["datetime"] = dt.toString("yyyy MM dd hh mm ss");
+
+ sendMessage(msg);
+}
+
+QString HostManagerConn::generateHostXml()
+{
+ QString xml;
+ QXmlStreamWriter w(&xml);
+
+ w.setCodec("UTF-8");
+ w.setAutoFormatting(true);
+
+ w.writeStartDocument();
+
+ w.writeStartElement("DeviceStatus");
+ w.writeStartElement("device");
+ w.writeTextElement("deviceID", _conn->peer()->localName());
+ w.writeTextElement("deviceName", "none");
+ w.writeTextElement("devicePlatform", "android");
+ w.writeTextElement("devicePlatformVersion", "4.4.2");
+ w.writeTextElement("deviceType", "Host");
+ w.writeTextElement("modelNumber", "GT-I9500");
+ w.writeTextElement("swVersion", "android 4.4.2");
+
+ w.writeEmptyElement("connectivity");
+
+#if 0
+ w.writeStartElement("apps");
+ SAPManager *manager = SAPManager::instance();
+ foreach (const SAPManager::RegisteredApplication &app, manager->allPackages()) {
+ w.writeStartElement("app");
+ w.writeTextElement("name", app.name);
+ w.writeTextElement("packagename", app.package);
+ w.writeTextElement("version", QString::number(app.version));
+ w.writeTextElement("preloaded", app.preinstalled ? QLatin1String("true") : QLatin1String("false"));
+ w.writeTextElement("isAppWidget", "false");
+ w.writeStartElement("features");
+ w.writeTextElement("Installed", "true");
+ w.writeEndElement();
+ w.writeEndElement();
+ }
+ w.writeEndElement();
+#else
+ xml.append(QString::fromLatin1("<apps>"
+ "<app><name>Actualizar el software del Gear</name><packagename>com.sec.android.fotaprovider</packagename><version>2</version><preloaded>false</preloaded><isAppWidget>false</isAppWidget><features/></app>"
+ "<app><name>ConnectionManager</name><packagename>com.sec.android.service.connectionmanager</packagename><version>1004</version><preloaded>false</preloaded><isAppWidget>false</isAppWidget><features/></app>"
+ "<app><name>goproviders</name><packagename>com.samsung.accessory.goproviders</packagename><version>61</version><preloaded>false</preloaded><isAppWidget>false</isAppWidget><features/></app>"
+ "<app><name>SAFileTransferCore</name><packagename>com.samsung.accessory.safiletransfer</packagename><version>1</version><preloaded>false</preloaded><isAppWidget>false</isAppWidget><features/></app>"
+ "<app><name>SANotiProvider</name><packagename>com.samsung.accessory.sanotiprovider</packagename><version>1</version><preloaded>false</preloaded><isAppWidget>false</isAppWidget><features/></app>"
+ "<app><name>saproviders</name><packagename>com.samsung.accessory.saproviders</packagename><version>64</version><preloaded>false</preloaded><isAppWidget>false</isAppWidget><features/></app><app><name>TextTemplateProvider</name><packagename>com.samsung.accessory.texttemplateprovider</packagename><version>1300</version><preloaded>false</preloaded><isAppWidget>false</isAppWidget><features/></app>"
+ "<app><packagename>com.samsung.accessory.saproviders</packagename><version>64</version><features><RequiringPackage>com.samsung.w-calendar2</RequiringPackage><Installed>true</Installed></features></app><app><packagename>com.samsung.accessory.goproviders</packagename><version>61</version><features><RequiringPackage>com.samsung.wfmd</RequiringPackage><Installed>true</Installed></features></app>"
+ "<app><packagename>com.sec.android.weatherprovider</packagename><features><RequiringPackage>com.samsung.weather</RequiringPackage><Installed>false</Installed></features></app>"
+ "<app><packagename>com.samsung.accessory.goproviders</packagename><version>61</version><features><RequiringPackage>com.samsung.w-contacts2</RequiringPackage><Installed>true</Installed></features></app><app><packagename>com.samsung.accessory.saproviders</packagename><version>64</version><features><RequiringPackage>com.samsung.w-media-controller</RequiringPackage><Installed>true</Installed></features></app>"
+ "<app><packagename>com.samsung.accessory.saproviders</packagename><version>64</version><features><RequiringPackage>com.samsung.alarm</RequiringPackage><Installed>true</Installed></features></app><app><packagename>com.samsung.accessory.saproviders</packagename><version>64</version><features><RequiringPackage>com.samsung.message</RequiringPackage><Installed>true</Installed></features></app>"
+ "<app><packagename>com.samsung.accessory.saproviders</packagename><version>64</version><features><RequiringPackage>com.samsung.w-logs2</RequiringPackage><Installed>true</Installed></features></app><app><packagename>com.samsung.accessory.saproviders</packagename><version>64</version><features><RequiringPackage>com.samsung.idle-clock-event</RequiringPackage><Installed>true</Installed></features></app>"
+ "<app><packagename>com.sec.android.weatherprovider</packagename><features><RequiringPackage>com.samsung.w-idle-clock-weather2</RequiringPackage><Installed>false</Installed></features></app><app><packagename>com.samsung.accessory.saproviders</packagename><version>64</version><features><RequiringPackage>com.samsung.idle-clock-dual</RequiringPackage><Installed>true</Installed></features></app>"
+ "<app><packagename>com.samsung.accessory.saproviders</packagename><version>64</version><features><RequiringPackage>com.samsung.svoice-w</RequiringPackage><Installed>true</Installed></features></app>"
+ "</apps>"));
+#endif
+
+ w.writeStartElement("deviceFeature");
+ w.writeTextElement("telephony", "true");
+ w.writeTextElement("messaging", "true");
+ w.writeTextElement("tablet", "false");
+ w.writeTextElement("autolock", "true");
+ w.writeTextElement("smartrelay", "true");
+ w.writeTextElement("safetyassistance", "false");
+ w.writeTextElement("vendor", "Samsung");
+ w.writeEndElement();
+
+ w.writeEmptyElement("security");
+ w.writeEmptyElement("notification");
+ w.writeEmptyElement("settings");
+
+ w.writeEndElement();
+
+ w.writeEndElement();
+
+ w.writeEndDocument();
+
+ return xml;
+}
+
+void HostManagerConn::handleConnected()
+{
+ qDebug() << "Manager socket now connected!";
+
+#if SAILFISH
+ if (!monitor) {
+ monitor = new watchfish::WallTimeMonitor;
+ }
+#endif
+
+ QJsonObject obj;
+ obj["btMac"] = _conn->peer()->localName();
+ obj["msgId"] = QLatin1String("mgr_watch_info_req");
+ obj["hmVer"] = QLatin1String("2.0.14041404");
+ sendMessage(obj);
+}
+
+void HostManagerConn::handleMessageReceived()
+{
+ QByteArray data = _socket->receive();
+
+ if (data.size() < 4) {
+ qWarning() << "Invalid HostManager message received";
+ return;
+ }
+
+ data.remove(0, 2); // Remove still-unknown header
+
+ qDebug() << "Got JSON:" << QString::fromUtf8(data);
+
+ QJsonParseError error;
+ QJsonDocument json = QJsonDocument::fromJson(data, &error);
+
+ if (json.isObject()) {
+ handleMessage(json.object());
+ } else {
+ qWarning() << "Cannot parse JSON msg:" << error.errorString();
+ }
+}