/*
* Copyright 2013 Canonical Ltd.
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 3, as published
* by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranties of
* MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* version 3 along with this program. If not, see
*
*
* Authored by: Michael Terry
*/
#include "PropertiesServer.h"
#include "AccountsService.h"
// Qt
#include
#include
#include
#define IFACE_ACCOUNTS_USER QStringLiteral("org.freedesktop.Accounts.User")
PropertiesServer::PropertiesServer(QObject *parent)
: QObject(parent)
{
qDBusRegisterMetaType>();
qDBusRegisterMetaType();
qDBusRegisterMetaType();
Reset();
}
QDBusVariant PropertiesServer::Get(const QString &interface, const QString &property) const
{
if (m_properties.contains(interface) && m_properties[interface].contains(property)) {
return QDBusVariant(m_properties[interface][property]);
} else {
sendErrorReply(QDBusError::InvalidArgs, "Bad interface or property");
return QDBusVariant(QVariant());
}
}
QVariantMap PropertiesServer::GetAll(const QString &interface) const
{
if (m_properties.contains(interface)) {
return m_properties[interface];
} else {
sendErrorReply(QDBusError::InvalidArgs, "Bad interface");
return QVariantMap();
}
}
void PropertiesServer::Set(const QString &interface, const QString &property, const QDBusVariant &variant)
{
QVariant newValue = variant.variant();
if (interface == IFACE_ACCOUNTS_USER) {
sendErrorReply(QDBusError::InvalidArgs, QStringLiteral("Property is not writable"));
return;
}
internalSet(interface, property, newValue);
}
void PropertiesServer::SetBackgroundFile(const QString &backgroundFile)
{
internalSet(IFACE_ACCOUNTS_USER, QStringLiteral("BackgroundFile"), backgroundFile);
}
void PropertiesServer::SetEmail(const QString &email)
{
internalSet(IFACE_ACCOUNTS_USER, QStringLiteral("Email"), email);
}
void PropertiesServer::SetInputSources(const StringMapList &inputSources)
{
internalSet(IFACE_ACCOUNTS_USER, QStringLiteral("InputSources"), QVariant::fromValue(inputSources));
}
void PropertiesServer::SetRealName(const QString &realName)
{
internalSet(IFACE_ACCOUNTS_USER, QStringLiteral("RealName"), realName);
}
void PropertiesServer::internalSet(const QString &interface, const QString &property, const QVariant &variant)
{
QVariant newValue = variant;
if (m_properties[interface].contains(property)) {
QVariant& oldValue = m_properties[interface][property];
if (oldValue != newValue) {
// complex types have an extra layer of wrapping via QDBusArgument
if (interface == QStringLiteral("com.canonical.unity.AccountsService") &&
property == QStringLiteral("LauncherItems")) {
newValue = QVariant::fromValue(qdbus_cast>(newValue.value()));
}
oldValue = newValue;
// Special case for user properties.
if (interface == IFACE_ACCOUNTS_USER) {
Q_EMIT Changed();
} else {
QVariantMap propertyChanges;
propertyChanges[property] = newValue;
Q_EMIT PropertiesChanged(interface, propertyChanges, QStringList());
// FIXME: Here to replicate current behaviour
// Not sure why accounts-service is triggering Changed when we're
// emitting PropertyChanges from org.freedesktop.DBus.Properties as well.
Q_EMIT Changed();
}
}
} else {
sendErrorReply(QDBusError::InvalidArgs, "Bad interface or property");
}
}
void PropertiesServer::Reset()
{
m_properties["com.canonical.unity.AccountsService"]["demo-edges"] = false;
m_properties["com.canonical.unity.AccountsService"]["DemoEdgesCompleted"] = QStringList();
m_properties["com.canonical.unity.AccountsService"]["LauncherItems"] = QVariant::fromValue(QList());
m_properties["com.canonical.unity.AccountsService.Private"]["FailedLogins"] = 0;
m_properties["com.ubuntu.touch.AccountsService.SecurityPrivacy"]["StatsWelcomeScreen"] = true;
m_properties["com.ubuntu.AccountsService.Input"]["MousePrimaryButton"] = "right";
m_properties["com.ubuntu.AccountsService.SecurityPrivacy"]["EnableLauncherWhileLocked"] = true;
m_properties["com.ubuntu.AccountsService.SecurityPrivacy"]["EnableIndicatorsWhileLocked"] = true;
m_properties["com.ubuntu.AccountsService.SecurityPrivacy"]["PasswordDisplayHint"] = AccountsService::Keyboard;
m_properties["com.ubuntu.location.providers.here.AccountsService"]["LicenseAccepted"] = false;
m_properties["com.ubuntu.location.providers.here.AccountsService"]["LicenseBasePath"] = "";
m_properties["org.freedesktop.Accounts.User"]["BackgroundFile"] = "";
m_properties["org.freedesktop.Accounts.User"]["Email"] = "";
m_properties["org.freedesktop.Accounts.User"]["InputSources"] = QVariant::fromValue(StringMapList());
m_properties["org.freedesktop.Accounts.User"]["RealName"] = "";
}