summaryrefslogtreecommitdiff
path: root/daemon
diff options
context:
space:
mode:
Diffstat (limited to 'daemon')
-rw-r--r--daemon/daemon.cpp43
-rw-r--r--daemon/daemon.pro3
-rw-r--r--daemon/manager.cpp20
-rw-r--r--daemon/manager.h11
-rw-r--r--daemon/settings.h25
-rw-r--r--daemon/voicecallhandler.cpp3
-rw-r--r--daemon/watchcommands.cpp86
-rw-r--r--daemon/watchcommands.h3
-rw-r--r--daemon/watchconnector.cpp2
-rw-r--r--daemon/watchconnector.h4
10 files changed, 145 insertions, 55 deletions
diff --git a/daemon/daemon.cpp b/daemon/daemon.cpp
index cd5e781..1ab7b8c 100644
--- a/daemon/daemon.cpp
+++ b/daemon/daemon.cpp
@@ -54,18 +54,8 @@ void signalhandler(int sig)
}
}
-// For some reason exactly SystemLogAppender doesn't have a factory registered in log4qt,
-// so in order for it to be instantiatable from .conf file (or even in general?) we declare factory
-// right here and will register it in initLoggin()
-Log4Qt::Appender *create_system_log_appender() {
- return new Log4Qt::SystemLogAppender;
-}
-
void initLogging()
{
- // Should really be done in log4qt, but somehow it's missing these
- Log4Qt::Factory::registerAppender("org.apache.log4j.SystemLogAppender", create_system_log_appender);
-
// Sailfish OS-specific locations for the app settings files and app's own files
const QString logConfigFilePath(QStandardPaths::standardLocations(QStandardPaths::ConfigLocation).at(0)
+ "pebble/log4qt.conf");
@@ -74,36 +64,6 @@ void initLogging()
const QString& usedConfigFile = QFile::exists(logConfigFilePath) ? logConfigFilePath : fallbackLogConfigPath;
Log4Qt::PropertyConfigurator::configure(usedConfigFile);
- // Uglyish hack for replacing $XDG_CACHE_HOME with the proper cache directory
- // TODO: Implement replacing of $XDG_CACHE_HOME (and other vars?) with the proper values before configuring log4qt
-
- // Iterate all appenders attached to root logger and whenever a FileAppender (or its descender found), replace
- // $XDG_CACHE_HOME with the proper folder name
- QList<Log4Qt::Appender *> appenders = Log4Qt::LogManager::rootLogger()->appenders();
- QList<Log4Qt::Appender *>::iterator i;
- QDir pathCreator;
- for (i = appenders.begin(); i != appenders.end(); ++i) {
- Log4Qt::FileAppender* fa = qobject_cast<Log4Qt::FileAppender*>(*i);
- if(fa) {
- QString filename = fa->file();
-
- // As per March 2014 on emulator QStandardPaths::CacheLocation is /home/nemo/.cache
- // while on device it is /home/nemo/.cache/app-name
- // both things are fine, logging path will just be a little deeper on device
- filename.replace("$XDG_CACHE_HOME",
- QStandardPaths::standardLocations(QStandardPaths::CacheLocation).at(0)
- );
- // make sure loggin dir exists
- QFileInfo fi(filename);
- if(!pathCreator.mkpath(fi.path())) {
- Log4Qt::LogManager::rootLogger()->error("Failed to create dir for logging: %1", fi.path());
- }
-
- fa->setFile(filename);
- fa->activateOptions();
- }
- }
-
// For capturing qDebug() and console.log() messages
// Note that console.log() might fail in Sailfish OS device builds. Not sure why, but it seems like
// console.log() exactly in Sailfish OS device release builds doesn't go through the same qDebug() channel
@@ -126,8 +86,9 @@ int main(int argc, char *argv[])
DBusConnector dbus;
VoiceCallManager voice;
NotificationManager notifications;
+ Settings settings;
- Manager manager(&watch, &dbus, &voice, &notifications);
+ Manager manager(&watch, &dbus, &voice, &notifications, &settings);
signal(SIGINT, signalhandler);
signal(SIGTERM, signalhandler);
diff --git a/daemon/daemon.pro b/daemon/daemon.pro
index 9642a81..fb10771 100644
--- a/daemon/daemon.pro
+++ b/daemon/daemon.pro
@@ -31,7 +31,8 @@ HEADERS += \
watchconnector.h \
dbusconnector.h \
dbusadaptor.h \
- watchcommands.h
+ watchcommands.h \
+ settings.h
OTHER_FILES += \
org.pebbled.xml \
diff --git a/daemon/manager.cpp b/daemon/manager.cpp
index ec0d21b..efa5a28 100644
--- a/daemon/manager.cpp
+++ b/daemon/manager.cpp
@@ -5,10 +5,14 @@
#include <QtContacts/QContact>
#include <QtContacts/QContactPhoneNumber>
-Manager::Manager(watch::WatchConnector *watch, DBusConnector *dbus, VoiceCallManager *voice, NotificationManager *notifications) :
+Manager::Manager(watch::WatchConnector *watch, DBusConnector *dbus, VoiceCallManager *voice, NotificationManager *notifications, Settings *settings) :
QObject(0), watch(watch), dbus(dbus), voice(voice), notifications(notifications), commands(new WatchCommands(watch, this)),
- notification(MNotification::DeviceEvent)
+ settings(settings), notification(MNotification::DeviceEvent)
{
+ connect(settings, SIGNAL(valueChanged(QString)), SLOT(onSettingChanged(const QString&)));
+ connect(settings, SIGNAL(valuesChanged()), SLOT(onSettingsChanged()));
+ connect(settings, SIGNAL(silentWhenConnectedChanged()), SLOT(onSettingsChanged()));
+
// We don't need to handle presence changes, so report them separately and ignore them
QMap<QString, QString> parameters;
parameters.insert(QString::fromLatin1("mergePresenceChanges"), QString::fromLatin1("false"));
@@ -26,7 +30,7 @@ Manager::Manager(watch::WatchConnector *watch, DBusConnector *dbus, VoiceCallMan
connect(notifications, SIGNAL(emailNotify(const QString &,const QString &,const QString &)), SLOT(onEmailNotify(const QString &,const QString &,const QString &)));
connect(notifications, SIGNAL(smsNotify(const QString &,const QString &)), SLOT(onSmsNotify(const QString &,const QString &)));
- connect(watch, SIGNAL(messageDecoded(uint,uint,QByteArray)), commands, SLOT(processMessage(uint,uint,QByteArray)));
+ connect(watch, SIGNAL(messageDecoded(uint,QByteArray)), commands, SLOT(processMessage(uint,QByteArray)));
connect(commands, SIGNAL(hangup()), SLOT(hangupAll()));
// Set BT icon for notification
@@ -54,6 +58,16 @@ Manager::Manager(watch::WatchConnector *watch, DBusConnector *dbus, VoiceCallMan
connect(this, SIGNAL(mprisMetadataChanged(QVariantMap)), commands, SLOT(onMprisMetadataChanged(QVariantMap)));
}
+void Manager::onSettingChanged(const QString &key)
+{
+ logger()->debug() << __FUNCTION__ << key << ":" << settings->property(qPrintable(key));
+}
+
+void Manager::onSettingsChanged()
+{
+ logger()->warn() << __FUNCTION__ << "Not implemented!";
+}
+
void Manager::onPebbleChanged()
{
const QVariantMap & pebble = dbus->pebble();
diff --git a/daemon/manager.h b/daemon/manager.h
index ea24f9e..16e3cbf 100644
--- a/daemon/manager.h
+++ b/daemon/manager.h
@@ -6,6 +6,7 @@
#include "voicecallmanager.h"
#include "notificationmanager.h"
#include "watchcommands.h"
+#include "settings.h"
#include <QObject>
#include <QBluetoothLocalDevice>
@@ -26,6 +27,9 @@ class Manager :
friend class PebbledProxy;
+ Q_PROPERTY(QString mpris READ mpris)
+ Q_PROPERTY(QVariantMap mprisMetadata READ getMprisMetadata WRITE setMprisMetadata NOTIFY mprisMetadataChanged)
+
QBluetoothLocalDevice btDevice;
watch::WatchConnector *watch;
@@ -35,6 +39,8 @@ class Manager :
WatchCommands *commands;
+ Settings *settings;
+
MNotification notification;
QContactManager *contacts;
@@ -43,11 +49,12 @@ class Manager :
QString lastSeenMpris;
public:
- explicit Manager(watch::WatchConnector *watch, DBusConnector *dbus, VoiceCallManager *voice, NotificationManager *notifications);
+ explicit Manager(watch::WatchConnector *watch, DBusConnector *dbus, VoiceCallManager *voice, NotificationManager *notifications, Settings *settings);
Q_INVOKABLE QString findPersonByNumber(QString number);
Q_INVOKABLE QString mpris();
QVariantMap mprisMetadata;
+ QVariantMap getMprisMetadata() { return mprisMetadata; }
signals:
void mprisMetadataChanged(QVariantMap);
@@ -56,6 +63,8 @@ public slots:
void hangupAll();
protected slots:
+ void onSettingChanged(const QString &key);
+ void onSettingsChanged();
void onPebbleChanged();
void onConnectedChanged();
void onActiveVoiceCallChanged();
diff --git a/daemon/settings.h b/daemon/settings.h
new file mode 100644
index 0000000..50ffd86
--- /dev/null
+++ b/daemon/settings.h
@@ -0,0 +1,25 @@
+#ifndef SETTINGS_H
+#define SETTINGS_H
+
+#include <MDConfGroup>
+
+class Settings : public MDConfGroup
+{
+ Q_OBJECT
+
+ Q_PROPERTY(bool silentWhenConnected MEMBER silentWhenConnected NOTIFY silentWhenConnectedChanged)
+ bool silentWhenConnected;
+
+public:
+ explicit Settings(QObject *parent = 0) :
+ MDConfGroup("/org/pebbled/settings", parent, BindProperties)
+ { resolveMetaObject(); }
+
+signals:
+ void silentWhenConnectedChanged(bool);
+
+public slots:
+
+};
+
+#endif // SETTINGS_H
diff --git a/daemon/voicecallhandler.cpp b/daemon/voicecallhandler.cpp
index 55b7c84..d11ceb8 100644
--- a/daemon/voicecallhandler.cpp
+++ b/daemon/voicecallhandler.cpp
@@ -189,8 +189,7 @@ bool VoiceCallHandler::getProperties()
QDBusReply<QVariantMap> reply = props.call("GetAll", d->interface->interface());
if (reply.isValid()) {
QVariantMap props = reply.value();
- QString str; QDebug(&str) << props;
- logger()->debug() << str;
+ logger()->debug() << props;
d->providerId = props["providerId"].toString();
d->duration = props["duration"].toInt();
d->status = props["status"].toInt();
diff --git a/daemon/watchcommands.cpp b/daemon/watchcommands.cpp
index 1df811a..9cd95b5 100644
--- a/daemon/watchcommands.cpp
+++ b/daemon/watchcommands.cpp
@@ -1,15 +1,17 @@
#include "watchcommands.h"
+#include <QDBusConnection>
+#include <QDBusMessage>
+#include <QDBusReply>
+
using namespace watch;
WatchCommands::WatchCommands(WatchConnector *watch, QObject *parent) :
QObject(parent), watch(watch)
{}
-void WatchCommands::processMessage(uint endpoint, uint datalen, QByteArray data)
+void WatchCommands::processMessage(uint endpoint, QByteArray data)
{
- Q_UNUSED(datalen);
-
logger()->debug() << __FUNCTION__ << endpoint << "/" << data.length();
switch (endpoint) {
case WatchConnector::watchPHONE_VERSION:
@@ -22,6 +24,7 @@ void WatchCommands::processMessage(uint endpoint, uint datalen, QByteArray data)
break;
case WatchConnector::watchMUSIC_CONTROL:
logger()->debug() << "MUSIC_CONTROL" << data.toHex();
+ musicControl(WatchConnector::MusicControl(data.at(0)));
break;
default:
@@ -37,3 +40,80 @@ void WatchCommands::onMprisMetadataChanged(QVariantMap metadata)
logger()->debug() << __FUNCTION__ << track << album << artist;
watch->sendMusicNowPlaying(track, album, artist);
}
+
+void WatchCommands::musicControl(WatchConnector::MusicControl operation)
+{
+ logger()->debug() << "Operation:" << operation;
+
+ QString mpris = parent()->property("mpris").toString();
+ if (mpris.isEmpty()) {
+ logger()->debug() << "No mpris interface active";
+ return;
+ }
+
+ QString method;
+
+ switch(operation) {
+ case WatchConnector::musicPLAY_PAUSE:
+ method = "PlayPause";
+ break;
+ case WatchConnector::musicPAUSE:
+ method = "Pause";
+ break;
+ case WatchConnector::musicPLAY:
+ method = "Play";
+ break;
+ case WatchConnector::musicNEXT:
+ method = "Next";
+ break;
+ case WatchConnector::musicPREVIOUS:
+ method = "Previous";
+ break;
+ case WatchConnector::musicVOLUME_UP:
+ case WatchConnector::musicVOLUME_DOWN: {
+ QDBusReply<QDBusVariant> VolumeReply = QDBusConnection::sessionBus().call(
+ QDBusMessage::createMethodCall(mpris, "/org/mpris/MediaPlayer2", "org.freedesktop.DBus.Properties", "Get")
+ << "org.mpris.MediaPlayer2.Player" << "Volume");
+ if (VolumeReply.isValid()) {
+ double volume = VolumeReply.value().variant().toDouble();
+ if (operation == WatchConnector::musicVOLUME_UP) {
+ volume += 0.1;
+ }
+ else {
+ volume -= 0.1;
+ }
+ logger()->debug() << "Setting volume" << volume;
+ QDBusError err = QDBusConnection::sessionBus().call(
+ QDBusMessage::createMethodCall(mpris, "/org/mpris/MediaPlayer2", "org.freedesktop.DBus.Properties", "Set")
+ << "org.mpris.MediaPlayer2.Player" << "Volume" << QVariant::fromValue(QDBusVariant(volume)));
+ if (err.isValid()) {
+ logger()->error() << err.message();
+ }
+ }
+ else {
+ logger()->error() << VolumeReply.error().message();
+ }
+ }
+ return;
+ case WatchConnector::musicGET_NOW_PLAYING:
+ onMprisMetadataChanged(parent()->property("mprisMetadata").toMap());
+ return;
+
+ case WatchConnector::musicSEND_NOW_PLAYING:
+ logger()->warn() << "Operation" << operation << "not supported";
+ return;
+ }
+
+ if (method.isEmpty()) {
+ logger()->error() << "Requested unsupported operation" << operation;
+ return;
+ }
+
+ logger()->debug() << operation << "->" << method;
+
+ QDBusError err = QDBusConnection::sessionBus().call(
+ QDBusMessage::createMethodCall(mpris, "/org/mpris/MediaPlayer2", "org.mpris.MediaPlayer2.Player", method));
+ if (err.isValid()) {
+ logger()->error() << err.message();
+ }
+}
diff --git a/daemon/watchcommands.h b/daemon/watchcommands.h
index 6ce70bb..4bd8f3d 100644
--- a/daemon/watchcommands.h
+++ b/daemon/watchcommands.h
@@ -20,10 +20,11 @@ signals:
void hangup();
public slots:
- void processMessage(uint endpoint, uint datalen, QByteArray data);
+ void processMessage(uint endpoint, QByteArray data);
protected slots:
void onMprisMetadataChanged(QVariantMap metadata);
+ void musicControl(watch::WatchConnector::MusicControl operation);
};
diff --git a/daemon/watchconnector.cpp b/daemon/watchconnector.cpp
index 0ce0607..63e476f 100644
--- a/daemon/watchconnector.cpp
+++ b/daemon/watchconnector.cpp
@@ -98,7 +98,7 @@ void WatchConnector::decodeMsg(QByteArray data)
logger()->debug() << "Length:" << datalen << " Endpoint:" << decodeEndpoint(endpoint);
logger()->debug() << "Data:" << data.mid(index).toHex();
- emit messageDecoded(endpoint, datalen, data);
+ emit messageDecoded(endpoint, data.mid(index, datalen));
}
void WatchConnector::onReadSocket()
diff --git a/daemon/watchconnector.h b/daemon/watchconnector.h
index dafaa83..936deff 100644
--- a/daemon/watchconnector.h
+++ b/daemon/watchconnector.h
@@ -88,7 +88,7 @@ public:
callSTART = 8,
callEND = 9
};
- enum {
+ enum MusicControl {
musicPLAY_PAUSE = 1,
musicPAUSE = 2,
musicPLAY = 3,
@@ -137,7 +137,7 @@ public:
signals:
void messageReceived(QString peer, QString msg);
- void messageDecoded(uint endpoint, uint datalen, QByteArray data);
+ void messageDecoded(uint endpoint, QByteArray data);
void nameChanged();
void connectedChanged();