diff options
-rw-r--r-- | capabilitypeer.cc | 2 | ||||
-rw-r--r-- | hostmanagerconn.cc | 64 | ||||
-rw-r--r-- | hostmanagerconn.h | 35 | ||||
-rw-r--r-- | main.cc | 5 | ||||
-rw-r--r-- | rpm/sapd.yaml | 2 | ||||
-rw-r--r-- | sapmanager.cc | 30 | ||||
-rw-r--r-- | sapmanager.h | 19 |
7 files changed, 144 insertions, 13 deletions
diff --git a/capabilitypeer.cc b/capabilitypeer.cc index 0290b69..8dfe603 100644 --- a/capabilitypeer.cc +++ b/capabilitypeer.cc @@ -169,7 +169,7 @@ void CapabilityPeer::handleMessageReceived() break; } default: - qWarning() << "Unknown message to capability socket"; + qWarning() << "Unknown message" << int(data[0]) << "to capability socket"; break; } } diff --git a/hostmanagerconn.cc b/hostmanagerconn.cc index 1f87ef2..0e1f7bb 100644 --- a/hostmanagerconn.cc +++ b/hostmanagerconn.cc @@ -1,6 +1,7 @@ #include <QtCore/QDebug> #include <QtCore/QDateTime> #include <QtCore/QTimeZone> +#include <QtCore/QXmlStreamReader> #include <QtCore/QXmlStreamWriter> #include <QtCore/QJsonDocument> #include <QtCore/QJsonObject> @@ -10,6 +11,7 @@ static watchfish::WallTimeMonitor *monitor = 0; #endif +#include "sapmanager.h" #include "sappeer.h" #include "hostmanagerconn.h" @@ -23,6 +25,16 @@ HostManagerConn::HostManagerConn(SAPConnection *conn, QObject *parent) 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); @@ -37,10 +49,15 @@ void HostManagerConn::handleMessage(const QJsonObject &msg) qDebug() << "Got JSON msg" << msgId; if (msgId == "mgr_watch_info_res") { QJsonObject reply; - reply["timestamp"] = QLatin1String("1407542281196=B:L>:<=LAMO"); + 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"); @@ -72,14 +89,14 @@ void HostManagerConn::performTimeSync() msg["safety_voice"] = QLatin1String("0"); msg["safetyVersion"] = QLatin1String("0"); msg["safety"] = QLatin1String("false"); - msg["tablet"] = QLatin1String("true"); + 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["data1224"] = l.timeFormat().contains('a', Qt::CaseInsensitive) ? QLatin1String("12") : QLatin1String("24"); + msg["date1224"] = l.timeFormat().contains('a', Qt::CaseInsensitive) ? QLatin1String("12") : QLatin1String("24"); msg["dateformat"] = QLocale::system().dateFormat(QLocale::ShortFormat); #if SAILFISH @@ -113,16 +130,49 @@ QString HostManagerConn::generateHostXml() w.writeTextElement("devicePlatform", "android"); w.writeTextElement("devicePlatformVersion", "4.4.2"); w.writeTextElement("deviceType", "Host"); - w.writeTextElement("modelNumber", "EvilPhone"); - w.writeTextElement("swVersion", "1.0"); + w.writeTextElement("modelNumber", "GT-I9500"); + w.writeTextElement("swVersion", "android 4.4.2"); w.writeEmptyElement("connectivity"); - w.writeEmptyElement("apps"); + +#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", "true"); + w.writeTextElement("tablet", "false"); w.writeTextElement("autolock", "true"); w.writeTextElement("smartrelay", "true"); w.writeTextElement("safetyassistance", "false"); diff --git a/hostmanagerconn.h b/hostmanagerconn.h index 6b89add..3543a6c 100644 --- a/hostmanagerconn.h +++ b/hostmanagerconn.h @@ -12,6 +12,41 @@ class HostManagerConn : public QObject public: HostManagerConn(SAPConnection *conn, QObject *parent = 0); +protected: + struct AppInfo { + QString name; + QString packageName; + QString version; + bool preloaded; + bool isAppWidget; + + QStringList requiredPackages; + QStringList requiringPackages; + bool installed; + }; + + struct DeviceInfo { + QString deviceId; + QString deviceName; + QString devicePlatform; + QString devicePlatformVersion; + QString deviceType; + QString modelNumber; + QString swVersion; + + QList<AppInfo> apps; + + bool telephony; + bool messaging; + bool tablet; + bool autolock; + bool smartrelay; + bool safetyassistence; + QString vendor; + }; + + static DeviceInfo parseDeviceInfo(const QString &xmlData); + private: void sendMessage(const QJsonObject &obj); @@ -44,6 +44,11 @@ int main(int argc, char *argv[]) SAPManager *manager = SAPManager::instance(); + manager->registerApplicationPackage("com.samsung.accessory.goproviders"); + manager->registerApplicationPackage("com.samsung.accessory.saproviders", "saproviders", 62); + manager->registerApplicationPackage("com.sec.android.weatherprovider"); + manager->registerApplicationPackage("com.sec.android.fotaprovider"); + CapabilityAgent::registerServices(manager); HostManagerAgent::registerServices(manager); WebProxyAgent::registerServices(manager); diff --git a/rpm/sapd.yaml b/rpm/sapd.yaml index 4c45974..c3c5a53 100644 --- a/rpm/sapd.yaml +++ b/rpm/sapd.yaml @@ -1,6 +1,6 @@ Name: sapd Summary: Accesory protocol daemon -Version: 0.1.1 +Version: 0.1.2 Release: 1 Group: Communications/Bluetooth URL: https://gitorious.org/javispedro-jolla-misc/sapd/ diff --git a/sapmanager.cc b/sapmanager.cc index ab3fcd0..9d72433 100644 --- a/sapmanager.cc +++ b/sapmanager.cc @@ -91,13 +91,13 @@ SAPServiceInfo SAPManager::serviceInfo(int agentId) const return _agents.value(agentId).info; } -QSet<QString> SAPManager::allProfiles() +QSet<QString> SAPManager::allProfiles() const { return QSet<QString>::fromList(_consumerProfiles.keys()) + QSet<QString>::fromList(_providerProfiles.keys()); } -QSet<SAPAgent*> SAPManager::allAgents() +QSet<SAPAgent*> SAPManager::allAgents() const { QSet<SAPAgent*> agents; foreach (const RegisteredAgent &ragent, _agents) { @@ -106,6 +106,32 @@ QSet<SAPAgent*> SAPManager::allAgents() return agents; } +void SAPManager::registerApplicationPackage(const RegisteredApplication &app) +{ + _pkgs.insert(app.package, app); +} + +void SAPManager::registerApplicationPackage(const QString &package, const QString &name, int version, bool preinstalled) +{ + RegisteredApplication app; + app.package = package; + app.name = name; + if (app.name.isEmpty()) app.name = package; + app.version = version; + app.preinstalled = preinstalled; + registerApplicationPackage(app); +} + +void SAPManager::unregisterApplicationPackage(const QString &package) +{ + _pkgs.remove(package); +} + +QList<SAPManager::RegisteredApplication> SAPManager::allPackages() const +{ + return _pkgs.values(); +} + int SAPManager::findUnusedAgentId() const { if (_agents.size() > 20000) { diff --git a/sapmanager.h b/sapmanager.h index 31b84a0..5619e54 100644 --- a/sapmanager.h +++ b/sapmanager.h @@ -28,8 +28,21 @@ public: SAPAgent *agent(int agentId); SAPServiceInfo serviceInfo(int agentId) const; - QSet<QString> allProfiles(); - QSet<SAPAgent*> allAgents(); + QSet<QString> allProfiles() const; + QSet<SAPAgent*> allAgents() const; + + struct RegisteredApplication { + QString package; + QString name; + int version; + bool preinstalled; + }; + + void registerApplicationPackage(const RegisteredApplication &app); + void registerApplicationPackage(const QString &package, const QString &name = QString(), int version = 1, bool preinstalled = false); + void unregisterApplicationPackage(const QString &package); + + QList<RegisteredApplication> allPackages() const; private: int findUnusedAgentId() const; @@ -46,6 +59,8 @@ private: QHash<QString, int> _consumerProfiles; QHash<QString, int> _providerProfiles; + + QHash<QString, RegisteredApplication> _pkgs; }; #endif // SAPMANAGER_H |