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());
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;
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);
506 QStringList Account::childKeys()
const 508 QStringList keys, all_keys;
511 Q_FOREACH (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 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)
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);
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.
QString group() const
Return the name of the current group.
Manager of accounts, services and providers.
bool enabled() const
Check whether the account service is enabled.
Monitors an account key or group of keys.
bool isEnabled() const
Check whether the account service is enabled.
Representation of an account provider.
QVariant value(const QString &key, const QVariant &defaultValue, SettingSource *source=0) const
Retrieves the value of an account setting, as a QVariant.
Representation of an account service.
QStringList allKeys() const
Return all the keys in the current group.
Base object definition for accounts error handling.
QStringList childKeys() const
Return all the keys which are direct children of the current group.
Provider provider(const QString &providerName) const
Gets an object representing a provider.
Error lastError() const
Gets the last error.
Account * account() const
Return the Account.
Service service() const
Return the Service.