summaryrefslogtreecommitdiff
path: root/hostmanagerconn.cc
diff options
context:
space:
mode:
authorJavier <dev.git@javispedro.com>2014-10-19 18:45:03 +0200
committerJavier <dev.git@javispedro.com>2014-10-19 18:45:03 +0200
commitd8d8fc7a0d139e7b864eee3b573bd208f823ad4f (patch)
treea9b54d6e6e6941c620f4f10cef4b5def9be86f82 /hostmanagerconn.cc
downloadsapd-d8d8fc7a0d139e7b864eee3b573bd208f823ad4f.tar.gz
sapd-d8d8fc7a0d139e7b864eee3b573bd208f823ad4f.zip
initial import, no crypto
Diffstat (limited to 'hostmanagerconn.cc')
-rw-r--r--hostmanagerconn.cc155
1 files changed, 155 insertions, 0 deletions
diff --git a/hostmanagerconn.cc b/hostmanagerconn.cc
new file mode 100644
index 0000000..de1c61a
--- /dev/null
+++ b/hostmanagerconn.cc
@@ -0,0 +1,155 @@
+#include <QtCore/QDateTime>
+#include <QtCore/QDebug>
+#include <QtCore/QXmlStreamWriter>
+
+#include "qtjson/json.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()));
+ Q_ASSERT(_socket);
+ connect(_socket, SIGNAL(connected()), SLOT(handleConnected()));
+ connect(_socket, SIGNAL(messageReceived()), SLOT(handleMessageReceived()));
+}
+
+void HostManagerConn::sendMessage(const QString &json)
+{
+ qDebug() << "Send JSON:" << json;
+ _socket->send(QByteArray(3,0) + json.toUtf8());
+}
+
+void HostManagerConn::sendMessage(const QVariantMap &msg)
+{
+ sendMessage(QtJson::serializeStr(msg));
+}
+
+void HostManagerConn::handleMessage(const QVariantMap &msg)
+{
+ QString msgId = msg["msgId"].toString();
+ qDebug() << "Got JSON msg" << msgId;
+ if (msgId == "mgr_watch_info_res") {
+ sendMessage("{\"timestamp\":\"1407542281196=B:L>:<=LAMO\",\"type\":\"connect\",\"msgId\":\"mgr_wearable_status_req\"}");
+ } else if (msgId == "mgr_host_status_req") {
+ sendMessage(QString("{\"type\":\"connect\",\"data\":%1,\"msgId\":\"mgr_host_status_res\",\"preinstalled\":\"true\"}")
+ .arg(QtJson::sanitizeString(generateHostXml())));
+
+ } else if (msgId == "mgr_status_exchange_done") {
+ performTimeSync();
+ sendMessage(QString("{\"btMac\":\"%1\",\"msgId\":\"mgr_setupwizard_eula_finished_req\",\"isOld\":1}")
+ .arg(_conn->peer()->localName()));
+ }
+}
+
+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"}
+
+ QVariantMap msg;
+ msg["msgId"] = "mgr_sync_init_setting_req";
+
+ msg["safety_declared"] = "0";
+ msg["safety_voice"] = "0";
+ msg["safetyVersion"] = "0";
+ msg["safety"] = "false";
+ msg["tablet"] = "true";
+ msg["incomingCall"] = "false";
+ msg["usingCamera"] = "false";
+ msg["safety_cam"] = "0";
+
+ msg["locale"] = QLocale::system().name(); // ie es_ES
+ msg["data1224"] = "24"; // TODO
+ msg["dateformat"] = QLocale::system().dateFormat(QLocale::ShortFormat);
+ msg["timezone"] = "Europe/Madrid";
+
+ 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", "EvilPhone");
+ w.writeTextElement("swVersion", "1.0");
+
+ w.writeEmptyElement("connectivity");
+ w.writeEmptyElement("apps");
+
+ w.writeStartElement("deviceFeature");
+ w.writeTextElement("telephony", "true");
+ w.writeTextElement("messaging", "true");
+ w.writeTextElement("tablet", "true");
+ 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!";
+ QString msg = QString("{\"btMac\":\"%1\",\"msgId\":\"mgr_watch_info_req\",\"hmVer\":\"2.0.14041404\"}").arg(_conn->peer()->localName());
+ qDebug() << msg;
+ QByteArray data = QByteArray(3,0) + msg.toUtf8();
+ _socket->send(data);
+}
+
+void HostManagerConn::handleMessageReceived()
+{
+ QByteArray data = _socket->receive();
+
+ if (data.size() < 5) {
+ qWarning() << "Invalid HostManager message received";
+ return;
+ }
+
+ data.remove(0, 3); // First two bytes contain something related to ???
+
+ QString str = QString::fromUtf8(data);
+ bool success = false;
+ QVariant json = QtJson::parse(str, success);
+
+ if (success) {
+ qDebug() << "Got JSON:" << str;
+ handleMessage(json.toMap());
+ } else {
+ qWarning() << "Cannot parse JSON msg:" << str;
+ return;
+ }
+}