27 #include "manager_p.h"
31 #include <libaccounts-glib/ag-account.h>
75 class Account::Private
78 Private(
Manager *manager,
const QString &providerName, Account *account);
79 Private(
Manager *manager, AgAccount *agAccount);
83 g_cancellable_cancel(m_cancellable);
84 g_object_unref(m_cancellable);
88 void init(Account *account);
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,
115 static QChar slash = QChar::fromLatin1(
'/');
126 Watch::Watch(QObject *parent):
133 Account *account = qobject_cast<Account *>(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();
204 Account::Account(
Manager *manager,
const QString &providerName,
207 d(new Private(manager, providerName, this))
211 Account::Account(Private *d, QObject *parent):
227 Account *Account::fromId(
Manager *manager, AccountId
id, QObject *parent)
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);
270 AccountId Account::id()
const
272 return d->m_account ? d->m_account->id : 0;
278 Manager *Account::manager()
const
286 bool Account::supportsService(
const QString &serviceType)
const
288 return ag_account_supports_service(d->m_account,
289 serviceType.toUtf8().constData());
300 ServiceList Account::services(
const QString &serviceType)
const
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));
329 ServiceList Account::enabledServices()
const
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));
358 bool Account::enabled()
const
369 bool Account::isEnabled()
const
371 return ag_account_get_enabled(d->m_account);
381 void Account::setEnabled(
bool enabled)
383 ag_account_set_enabled(d->m_account, enabled);
391 QString Account::displayName()
const
393 return UTF8(ag_account_get_display_name(d->m_account));
400 void Account::setDisplayName(
const QString &displayName)
402 ag_account_set_display_name(d->m_account,
403 displayName.toUtf8().constData());
409 QString Account::providerName()
const
411 return UTF8(ag_account_get_provider_name(d->m_account));
419 return manager()->
provider(providerName());
427 void Account::selectService(
const Service &service)
429 AgService *agService = NULL;
432 agService = service.service();
434 ag_account_select_service(d->m_account, agService);
435 d->prefix = QString();
441 Service Account::selectedService()
const
443 AgService *agService = ag_account_get_selected_service(d->m_account);
452 QStringList Account::allKeys()
const
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)));
475 void Account::beginGroup(
const QString &prefix)
477 d->prefix += prefix + slash;
485 QStringList Account::childGroups()
const
487 QStringList groups, all_keys;
489 all_keys = allKeys();
490 Q_FOREACH (
const 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);
506 QStringList Account::childKeys()
const
508 QStringList keys, all_keys;
510 all_keys = allKeys();
511 Q_FOREACH (
const QString &key, all_keys)
513 if (!key.contains(slash))
523 void Account::clear()
527 QString saved_prefix = d->prefix;
528 d->prefix = QString();
530 d->prefix = saved_prefix;
539 bool Account::contains(
const QString &key)
const
541 return childKeys().contains(key);
549 void Account::endGroup()
551 d->prefix = d->prefix.section(slash, 0, -3,
552 QString::SectionIncludeTrailingSep);
553 if (d->prefix[0] == slash) d->prefix.remove(0, 1);
561 QString Account::group()
const
563 if (d->prefix.endsWith(slash))
564 return d->prefix.left(d->prefix.size() - 1);
571 bool Account::isWritable()
const
583 void Account::remove(
const QString &key)
588 QStringList keys = allKeys();
589 Q_FOREACH (
const 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);
610 void Account::setValue(
const QString &key,
const QVariant &value)
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();
657 QVariant Account::value(
const QString &key,
const QVariant &defaultValue,
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;
691 SettingSource Account::value(
const QString &key, QVariant &value)
const
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;
714 QString Account::valueAsString(
const QString &key,
715 QString default_value,
716 SettingSource *source)
const
718 QVariant var = default_value;
719 SettingSource src = value(key, var);
722 return var.toString();
734 int Account::valueAsInt(
const QString &key,
736 SettingSource *source)
const
738 QVariant var = default_value;
739 SettingSource src = value(key, var);
754 quint64 Account::valueAsUInt64(
const QString &key,
755 quint64 default_value,
756 SettingSource *source)
const
758 QVariant var = default_value;
759 SettingSource src = value(key, var);
762 return var.toULongLong();
774 bool Account::valueAsBool(
const QString &key,
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);
803 Watch *Account::watchKey(
const QString &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,
859 bool Account::syncAndBlock()
861 GError *error = NULL;
864 ret = ag_account_store_blocking(d->m_account, &error);
867 qWarning() <<
"Store operation failed: " << error->message;
878 void Account::remove()
880 ag_account_delete(d->m_account);
892 void Account::sign(
const QString &key,
const char *token)
894 ag_account_sign (d->m_account, key.toUtf8().constData(), token);
908 bool Account::verify(
const QString &key,
const char **token)
910 return ag_account_verify(d->m_account, key.toUtf8().constData(), token);
925 bool Account::verifyWithTokens(
const QString &key, QList<const char*> tokens)
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);
940 uint Account::credentialsId()
942 QString key = ACCOUNTS_KEY_CREDENTIALS_ID;
943 QVariant val(QVariant::Int);
945 if (value(key, val) != NONE)
949 Service service = selectedService();
952 if (value(key, val) != NONE)
954 selectService(service);
959 AgAccount *Account::account()
bool isValid() const
Check whether this object represents a Service.
Manager of accounts, services and providers.
Monitors an account key or group of keys.
Representation of an account provider.
Representation of an account service.
Base object definition for accounts error handling.
Provider provider(const QString &providerName) const
Gets an object representing a provider.
Error lastError() const
Gets the last error.