27 #include "manager_p.h"
31 #include <libaccounts-glib/ag-account.h>
75 class Account::Private
83 g_cancellable_cancel(m_cancellable);
84 g_object_unref(m_cancellable);
90 QPointer<Manager> m_manager;
92 GCancellable *m_cancellable;
95 static void on_display_name_changed(
Account *
self);
96 static void on_enabled(
Account *
self,
const gchar *service_name,
98 static void account_store_cb(AgAccount *account,
101 static void on_deleted(
Account *
self);
107 static void account_notify_cb(AgAccount *account,
const gchar *key,
113 using namespace Accounts;
115 static QChar slash = QChar::fromLatin1(
'/');
126 Watch::Watch(QObject *parent):
136 Q_ASSERT(account != NULL);
137 ag_account_remove_watch(account->d->m_account, watch);
140 Account::Private::Private(
Manager *manager,
const QString &providerName,
143 m_cancellable(g_cancellable_new())
145 m_account = ag_manager_create_account(manager->d->m_manager,
146 providerName.toUtf8().constData());
150 Account::Private::Private(
Manager *manager, AgAccount *agAccount):
152 m_account(agAccount),
153 m_cancellable(g_cancellable_new())
157 void Account::Private::init(
Account *account)
159 if (m_account == 0)
return;
160 g_signal_connect_swapped(m_account,
"display-name-changed",
161 G_CALLBACK(&Private::on_display_name_changed),
163 g_signal_connect_swapped(m_account,
"enabled",
164 G_CALLBACK(&Private::on_enabled), account);
165 g_signal_connect_swapped(m_account,
"deleted",
166 G_CALLBACK(&Private::on_deleted), account);
169 void Account::Private::on_display_name_changed(
Account *
self)
171 const gchar *name = ag_account_get_display_name(self->d->m_account);
173 Q_EMIT
self->displayNameChanged(UTF8(name));
176 void Account::Private::on_enabled(
Account *
self,
const gchar *service_name,
179 Q_EMIT
self->enabledChanged(UTF8(service_name), enabled);
182 void Account::Private::on_deleted(
Account *
self)
186 Q_EMIT
self->removed();
207 d(new Private(manager, providerName, this))
230 AgAccount *account = ag_manager_load_account(manager->d->m_manager,
id,
233 Q_ASSERT(error != 0);
238 Q_ASSERT(error == 0);
239 return new Account(
new Private(manager, account), parent);
247 QObjectList list = children();
248 for (
int i = 0; i < list.count(); i++)
250 QObject *o = list.at(i);
251 if (qobject_cast<Watch *>(o))
255 g_signal_handlers_disconnect_by_func
256 (d->m_account, (
void *)&Private::on_display_name_changed,
this);
257 g_signal_handlers_disconnect_by_func
258 (d->m_account, (
void *)&Private::on_enabled,
this);
259 g_signal_handlers_disconnect_by_func
260 (d->m_account, (
void *)&Private::on_deleted,
this);
261 g_object_unref(d->m_account);
272 return d->m_account ? d->m_account->id : 0;
288 return ag_account_supports_service(d->m_account,
289 serviceType.toUtf8().constData());
303 if (serviceType.isEmpty()) {
304 list = ag_account_list_services(d->m_account);
306 list = ag_account_list_services_by_type(d->m_account,
307 serviceType.toUtf8().constData());
311 ServiceList servList;
313 for (iter = list; iter; iter = iter->next)
315 AgService *service = (AgService*)iter->data;
316 servList.append(
Service(service, StealReference));
332 list = ag_account_list_enabled_services(d->m_account);
335 ServiceList servList;
337 for (iter = list; iter; iter = g_list_next(iter))
339 AgService *service = (AgService*)iter->data;
340 servList.append(
Service(service, StealReference));
371 return ag_account_get_enabled(d->m_account);
383 ag_account_set_enabled(d->m_account, enabled);
393 return UTF8(ag_account_get_display_name(d->m_account));
402 ag_account_set_display_name(d->m_account,
403 displayName.toUtf8().constData());
411 return UTF8(ag_account_get_provider_name(d->m_account));
429 AgService *agService = NULL;
432 agService = service.service();
434 ag_account_select_service(d->m_account, agService);
435 d->prefix = QString();
443 AgService *agService = ag_account_get_selected_service(d->m_account);
455 AgAccountSettingIter iter;
460 QByteArray tmp = d->prefix.toLatin1();
461 ag_account_settings_iter_init(d->m_account, &iter, tmp.constData());
462 while (ag_account_settings_iter_get_next(&iter, &key, &val))
464 allKeys.append(QString(ASCII(key)));
477 d->prefix += prefix + slash;
487 QStringList groups, all_keys;
490 Q_FOREACH (QString key, all_keys)
492 if (key.contains(slash)) {
493 QString
group = key.section(slash, 0, 0);
494 if (!groups.contains(group))
495 groups.append(group);
508 QStringList keys, all_keys;
511 Q_FOREACH (QString key, all_keys)
513 if (!key.contains(slash))
527 QString saved_prefix = d->prefix;
528 d->prefix = QString();
530 d->prefix = saved_prefix;
551 d->prefix = d->prefix.section(slash, 0, -3,
552 QString::SectionIncludeTrailingSep);
553 if (d->prefix[0] == slash) d->prefix.remove(0, 1);
563 if (d->prefix.endsWith(slash))
564 return d->prefix.left(d->prefix.size() - 1);
589 Q_FOREACH (QString key, keys)
597 QString full_key = d->prefix + key;
598 QByteArray tmpkey = full_key.toLatin1();
599 ag_account_set_variant(d->m_account, tmpkey.constData(), NULL);
612 GVariant *variant = qVariantToGVariant(value);
617 QString full_key = d->prefix + key;
618 QByteArray tmpkey = full_key.toLatin1();
619 ag_account_set_variant(d->m_account, tmpkey.constData(), variant);
622 void Account::Private::account_store_cb(AgAccount *account,
626 TRACE() <<
"Saved accunt ID:" << account->id;
628 GError *error = NULL;
629 ag_account_store_finish(account, res, &error);
631 if (error->domain == G_IO_ERROR &&
632 error->code == G_IO_ERROR_CANCELLED) {
633 TRACE() <<
"Account destroyed, operation cancelled";
635 Q_EMIT
self->error(
Error(error));
639 Q_EMIT
self->synced();
658 SettingSource *source)
const
660 QString full_key = d->prefix + key;
661 QByteArray ba = full_key.toLatin1();
662 AgSettingSource settingSource;
664 ag_account_get_variant(d->m_account, ba.constData(), &settingSource);
666 switch (settingSource) {
667 case AG_SETTING_SOURCE_ACCOUNT: *source = ACCOUNT;
break;
668 case AG_SETTING_SOURCE_PROFILE: *source = TEMPLATE;
break;
669 default: *source = NONE;
break;
673 return (variant != 0) ? gVariantToQVariant(variant) : defaultValue;
693 SettingSource source;
694 QVariant variant = this->
value(key, QVariant(), &source);
695 if (variant.isValid()) {
696 if (value.type() != variant.type()) {
697 if (!variant.convert(value.type())) source = NONE;
715 QString default_value,
716 SettingSource *source)
const
718 QVariant var = default_value;
719 SettingSource src =
value(key, var);
722 return var.toString();
736 SettingSource *source)
const
738 QVariant var = default_value;
739 SettingSource src =
value(key, var);
755 quint64 default_value,
756 SettingSource *source)
const
758 QVariant var = default_value;
759 SettingSource src =
value(key, var);
762 return var.toULongLong();
776 SettingSource *source)
const
778 QVariant var = default_value;
779 SettingSource src =
value(key, var);
785 void Watch::Private::account_notify_cb(AgAccount *account,
const gchar *key,
788 Q_EMIT watch->
notify(key);
805 AgAccountWatch ag_watch;
810 QString full_key = d->prefix + key;
811 ag_watch = ag_account_watch_key
812 (d->m_account, full_key.toLatin1().constData(),
813 (AgAccountNotifyCb)&Watch::Private::account_notify_cb, watch);
817 ag_watch = ag_account_watch_dir
818 (d->m_account, d->prefix.toLatin1().constData(),
819 (AgAccountNotifyCb)&Watch::Private::account_notify_cb, watch);
828 watch->setWatch(ag_watch);
846 ag_account_store_async(d->m_account,
848 (GAsyncReadyCallback)&Private::account_store_cb,
861 GError *error = NULL;
864 ret = ag_account_store_blocking(d->m_account, &error);
867 qWarning() <<
"Store operation failed: " << error->message;
880 ag_account_delete(d->m_account);
894 ag_account_sign (d->m_account, key.toUtf8().constData(), token);
910 return ag_account_verify(d->m_account, key.toUtf8().constData(), token);
927 int tokensCount = tokens.count();
929 const char *tmp[tokensCount + 1];
931 for (
int i = 0; i < tokensCount; ++i)
933 tmp[i] = tokens.at(i);
935 tmp[tokensCount] = NULL;
937 return ag_account_verify_with_tokens(d->m_account, key.toUtf8().constData(), tmp);
942 QString key = ACCOUNTS_KEY_CREDENTIALS_ID;
943 QVariant val(QVariant::Int);
945 if (
value(key, val) != NONE)
952 if (
value(key, val) != NONE)
959 AgAccount *Account::account()