30 #include <libaccounts-glib/ag-manager.h>
31 #include <libaccounts-glib/ag-account.h>
75 class Account::Private
80 m_cancellable(g_cancellable_new())
86 g_cancellable_cancel(m_cancellable);
87 g_object_unref(m_cancellable);
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 void Account::Private::on_display_name_changed(
Account *
self)
142 const gchar *name = ag_account_get_display_name(self->d->m_account);
144 Q_EMIT
self->displayNameChanged(UTF8(name));
147 void Account::Private::on_enabled(
Account *
self,
const gchar *service_name,
150 Q_EMIT
self->enabledChanged(UTF8(service_name), enabled);
153 void Account::Private::on_deleted(
Account *
self)
157 Q_EMIT
self->removed();
166 Account::Account(AgAccount *account, QObject *parent):
171 g_object_ref(account);
173 g_signal_connect_swapped(account,
"display-name-changed",
174 G_CALLBACK(&Private::on_display_name_changed),
176 g_signal_connect_swapped(account,
"enabled",
177 G_CALLBACK(&Private::on_enabled),
this);
178 g_signal_connect_swapped(account,
"deleted",
179 G_CALLBACK(&Private::on_deleted),
this);
187 QObjectList list = children();
188 for (
int i = 0; i < list.count(); i++)
190 QObject *o = list.at(i);
191 if (qobject_cast<Watch *>(o))
195 g_signal_handlers_disconnect_by_func
196 (d->m_account, (
void *)&Private::on_display_name_changed,
this);
197 g_signal_handlers_disconnect_by_func
198 (d->m_account, (
void *)&Private::on_enabled,
this);
199 g_signal_handlers_disconnect_by_func
200 (d->m_account, (
void *)&Private::on_deleted,
this);
201 g_object_unref(d->m_account);
212 return d->m_account ? d->m_account->id : 0;
220 return qobject_cast<
Manager *>(QObject::parent());
228 return ag_account_supports_service(d->m_account,
229 serviceType.toUtf8().constData());
243 if (serviceType.isEmpty()) {
244 list = ag_account_list_services(d->m_account);
246 list = ag_account_list_services_by_type(d->m_account,
247 serviceType.toUtf8().constData());
251 ServiceList servList;
253 for (iter = list; iter; iter = iter->next)
255 AgService *service = (AgService*)iter->data;
256 servList.append(
Service(service, StealReference));
272 list = ag_account_list_enabled_services(d->m_account);
275 ServiceList servList;
277 for (iter = list; iter; iter = g_list_next(iter))
279 AgService *service = (AgService*)iter->data;
280 servList.append(
Service(service, StealReference));
296 return ag_account_get_enabled(d->m_account);
308 ag_account_set_enabled(d->m_account, enabled);
318 return UTF8(ag_account_get_display_name(d->m_account));
327 ag_account_set_display_name(d->m_account,
328 displayName.toUtf8().constData());
336 return UTF8(ag_account_get_provider_name(d->m_account));
354 AgService *agService = NULL;
357 agService = service.service();
359 ag_account_select_service(d->m_account, agService);
360 d->prefix = QString();
368 AgService *agService = ag_account_get_selected_service(d->m_account);
380 AgAccountSettingIter iter;
385 QByteArray tmp = d->prefix.toLatin1();
386 ag_account_settings_iter_init(d->m_account, &iter, tmp.constData());
387 while (ag_account_settings_iter_get_next(&iter, &key, &val))
389 allKeys.append(QString(ASCII(key)));
402 d->prefix += prefix + slash;
412 QStringList groups, all_keys;
415 Q_FOREACH (QString key, all_keys)
417 if (key.contains(slash)) {
418 QString
group = key.section(slash, 0, 0);
419 if (!groups.contains(group))
420 groups.append(group);
433 QStringList keys, all_keys;
436 Q_FOREACH (QString key, all_keys)
438 if (!key.contains(slash))
452 QString saved_prefix = d->prefix;
453 d->prefix = QString();
455 d->prefix = saved_prefix;
476 d->prefix = d->prefix.section(slash, 0, -3,
477 QString::SectionIncludeTrailingSep);
478 if (d->prefix[0] == slash) d->prefix.remove(0, 1);
488 if (d->prefix.endsWith(slash))
489 return d->prefix.left(d->prefix.size() - 1);
514 Q_FOREACH (QString key, keys)
522 QString full_key = d->prefix + key;
523 QByteArray tmpkey = full_key.toLatin1();
524 ag_account_set_variant(d->m_account, tmpkey.constData(), NULL);
537 GVariant *variant = qVariantToGVariant(value);
542 QString full_key = d->prefix + key;
543 QByteArray tmpkey = full_key.toLatin1();
544 ag_account_set_variant(d->m_account, tmpkey.constData(), variant);
547 void Account::Private::account_store_cb(AgAccount *account,
551 TRACE() <<
"Saved accunt ID:" << account->id;
553 GError *error = NULL;
554 ag_account_store_finish(account, res, &error);
556 if (error->domain == G_IO_ERROR &&
557 error->code == G_IO_ERROR_CANCELLED) {
558 TRACE() <<
"Account destroyed, operation cancelled";
560 Q_EMIT
self->error(
Error(error));
564 Q_EMIT
self->synced();
583 SettingSource *source)
const
585 QString full_key = d->prefix + key;
586 QByteArray ba = full_key.toLatin1();
587 AgSettingSource settingSource;
589 ag_account_get_variant(d->m_account, ba.constData(), &settingSource);
591 switch (settingSource) {
592 case AG_SETTING_SOURCE_ACCOUNT: *source = ACCOUNT;
break;
593 case AG_SETTING_SOURCE_PROFILE: *source = TEMPLATE;
break;
594 default: *source = NONE;
break;
598 return (variant != 0) ? gVariantToQVariant(variant) : defaultValue;
618 SettingSource source;
619 QVariant variant = this->
value(key, QVariant(), &source);
620 if (variant.isValid()) {
621 if (value.type() != variant.type()) {
622 if (!variant.convert(value.type())) source = NONE;
640 QString default_value,
641 SettingSource *source)
const
643 QVariant var = default_value;
644 SettingSource src =
value(key, var);
647 return var.toString();
661 SettingSource *source)
const
663 QVariant var = default_value;
664 SettingSource src =
value(key, var);
680 quint64 default_value,
681 SettingSource *source)
const
683 QVariant var = default_value;
684 SettingSource src =
value(key, var);
687 return var.toULongLong();
701 SettingSource *source)
const
703 QVariant var = default_value;
704 SettingSource src =
value(key, var);
710 void Watch::Private::account_notify_cb(AgAccount *account,
const gchar *key,
713 Q_EMIT watch->
notify(key);
730 AgAccountWatch ag_watch;
735 QString full_key = d->prefix + key;
736 ag_watch = ag_account_watch_key
737 (d->m_account, full_key.toLatin1().constData(),
738 (AgAccountNotifyCb)&Watch::Private::account_notify_cb, watch);
742 ag_watch = ag_account_watch_dir
743 (d->m_account, d->prefix.toLatin1().constData(),
744 (AgAccountNotifyCb)&Watch::Private::account_notify_cb, watch);
753 watch->setWatch(ag_watch);
771 ag_account_store_async(d->m_account,
773 (GAsyncReadyCallback)&Private::account_store_cb,
786 GError *error = NULL;
789 ret = ag_account_store_blocking(d->m_account, &error);
792 qWarning() <<
"Store operation failed: " << error->message;
805 ag_account_delete(d->m_account);
819 ag_account_sign (d->m_account, key.toUtf8().constData(), token);
835 return ag_account_verify(d->m_account, key.toUtf8().constData(), token);
852 int tokensCount = tokens.count();
854 const char *tmp[tokensCount + 1];
856 for (
int i = 0; i < tokensCount; ++i)
858 tmp[i] = tokens.at(i);
860 tmp[tokensCount] = NULL;
862 return ag_account_verify_with_tokens(d->m_account, key.toUtf8().constData(), tmp);
867 QString key = ACCOUNTS_KEY_CREDENTIALS_ID;
868 QVariant val(QVariant::Int);
870 if (
value(key, val) != NONE)
877 if (
value(key, val) != NONE)
884 AgAccount *Account::account()