30 #include <libaccounts-glib/ag-manager.h>
31 #include <libaccounts-glib/ag-account.h>
75 class Account::Private
88 static void on_display_name_changed(
Account *
self);
89 static void on_enabled(
Account *
self,
const gchar *service_name,
91 static void account_store_cb(AgAccount *account,
const GError *
error,
93 static void on_deleted(
Account *
self);
99 static void account_notify_cb(AgAccount *account,
const gchar *key,
105 using namespace Accounts;
107 static QChar slash = QChar::fromLatin1(
'/');
118 Watch::Watch(QObject *parent):
129 Q_ASSERT(account != NULL);
130 ag_account_remove_watch(account->d->m_account, watch);
133 void Account::Private::on_display_name_changed(
Account *
self)
136 const gchar *name = ag_account_get_display_name(self->d->m_account);
138 emit
self->displayNameChanged(UTF8(name));
141 void Account::Private::on_enabled(
Account *
self,
const gchar *service_name,
146 emit
self->enabledChanged(UTF8(service_name), enabled);
149 void Account::Private::on_deleted(
Account *
self)
153 emit
self->removed();
162 Account::Account(AgAccount *account, QObject *parent):
168 g_object_ref(account);
170 g_signal_connect_swapped(account,
"display-name-changed",
171 G_CALLBACK(&Private::on_display_name_changed),
173 g_signal_connect_swapped(account,
"enabled",
174 G_CALLBACK(&Private::on_enabled),
this);
175 g_signal_connect_swapped(account,
"deleted",
176 G_CALLBACK(&Private::on_deleted),
this);
186 QObjectList list = children();
187 for (
int i = 0; i < list.count(); i++)
189 QObject *o = list.at(i);
190 if (qobject_cast<Watch *>(o))
194 g_signal_handlers_disconnect_by_func
195 (d->m_account, (
void *)&Private::on_display_name_changed,
this);
196 g_signal_handlers_disconnect_by_func
197 (d->m_account, (
void *)&Private::on_enabled,
this);
198 g_signal_handlers_disconnect_by_func
199 (d->m_account, (
void *)&Private::on_deleted,
this);
200 g_object_unref(d->m_account);
211 return d->m_account ? d->m_account->id : 0;
219 return qobject_cast<
Manager *>(QObject::parent());
227 TRACE() << serviceType;
229 return ag_account_supports_service(d->m_account,
230 serviceType.toUtf8().constData());
243 TRACE() << serviceType;
246 if (serviceType.isEmpty()) {
247 list = ag_account_list_services(d->m_account);
249 list = ag_account_list_services_by_type(d->m_account,
250 serviceType.toUtf8().constData());
254 ServiceList servList;
256 for (iter = list; iter; iter = iter->next)
258 AgService *service = (AgService*)iter->data;
259 servList.append(
Service(service, StealReference));
275 list = ag_account_list_enabled_services(d->m_account);
278 ServiceList servList;
280 for (iter = list; iter; iter = g_list_next(iter))
282 AgService *service = (AgService*)iter->data;
283 servList.append(
Service(service, StealReference));
299 return ag_account_get_enabled(d->m_account);
311 ag_account_set_enabled(d->m_account, enabled);
321 return UTF8(ag_account_get_display_name(d->m_account));
330 ag_account_set_display_name(d->m_account,
331 displayName.toUtf8().constData());
339 return UTF8(ag_account_get_provider_name(d->m_account));
349 AgService *agService = NULL;
352 agService = service.service();
354 ag_account_select_service(d->m_account, agService);
355 d->prefix = QString();
363 AgService *agService = ag_account_get_selected_service(d->m_account);
375 AgAccountSettingIter iter;
380 QByteArray tmp = d->prefix.toLatin1();
381 ag_account_settings_iter_init(d->m_account, &iter, tmp.constData());
382 while (ag_account_settings_iter_next(&iter, &key, &val))
384 allKeys.append(QString(ASCII(key)));
397 d->prefix += prefix + slash;
407 QStringList groups, all_keys;
410 foreach (QString key, all_keys)
412 if (key.contains(slash)) {
413 QString
group = key.section(slash, 0, 0);
414 if (!groups.contains(group))
415 groups.append(group);
428 QStringList keys, all_keys;
431 foreach (QString key, all_keys)
433 if (!key.contains(slash))
447 QString saved_prefix = d->prefix;
448 d->prefix = QString();
450 d->prefix = saved_prefix;
471 d->prefix = d->prefix.section(slash, 0, -3,
472 QString::SectionIncludeTrailingSep);
473 if (d->prefix[0] == slash) d->prefix.remove(0, 1);
483 if (d->prefix.endsWith(slash))
484 return d->prefix.left(d->prefix.size() - 1);
509 foreach (QString key, keys)
517 QString full_key = d->prefix + key;
518 QByteArray tmpkey = full_key.toLatin1();
519 ag_account_set_value(d->m_account, tmpkey.constData(), NULL);
533 GValue val= {0, {{0}}};
535 if (!variantToGValue(value, &val)) {
539 QString full_key = d->prefix + key;
540 QByteArray tmpkey = full_key.toLatin1();
541 ag_account_set_value(d->m_account, tmpkey.constData(), &val);
545 void Account::Private::account_store_cb(AgAccount *account,
const GError *err,
548 TRACE() <<
"Saved accunt ID:" << account->id;
551 emit
self->error(
Error(err));
576 switch (value.type())
578 case QVariant::String:
579 type = G_TYPE_STRING;
587 case QVariant::LongLong:
590 case QVariant::ULongLong:
591 type = G_TYPE_UINT64;
594 type = G_TYPE_BOOLEAN;
597 qWarning(
"Unsupported type %s", value.typeName());
601 GValue val= {0, {{0}}};
602 g_value_init(&val, type);
603 QString full_key = d->prefix + key;
604 AgSettingSource source =
605 ag_account_get_value(d->m_account,
606 full_key.toLatin1().constData(), &val);
607 if (source == AG_SETTING_SOURCE_NONE)
610 value = gvalueToVariant(&val);
613 return (source == AG_SETTING_SOURCE_ACCOUNT) ? ACCOUNT : TEMPLATE;
626 QString default_value,
627 SettingSource *source)
const
629 QVariant var = default_value;
630 SettingSource src =
value(key, var);
633 return var.toString();
647 SettingSource *source)
const
649 QVariant var = default_value;
650 SettingSource src =
value(key, var);
666 quint64 default_value,
667 SettingSource *source)
const
669 QVariant var = default_value;
670 SettingSource src =
value(key, var);
673 return var.toULongLong();
687 SettingSource *source)
const
689 QVariant var = default_value;
690 SettingSource src =
value(key, var);
696 void Watch::Private::account_notify_cb(AgAccount *account,
const gchar *key,
716 AgAccountWatch ag_watch;
721 QString full_key = d->prefix + key;
722 ag_watch = ag_account_watch_key
723 (d->m_account, full_key.toLatin1().constData(),
724 (AgAccountNotifyCb)&Watch::Private::account_notify_cb, watch);
728 ag_watch = ag_account_watch_dir
729 (d->m_account, d->prefix.toLatin1().constData(),
730 (AgAccountNotifyCb)&Watch::Private::account_notify_cb, watch);
739 watch->setWatch(ag_watch);
759 ag_account_store(d->m_account,
760 (AgAccountStoreCb)&Private::account_store_cb,
775 GError *
error = NULL;
778 ret = ag_account_store_blocking(d->m_account, &error);
781 qWarning() <<
"Store operation failed: " << error->message;
795 ag_account_delete(d->m_account);
809 ag_account_sign (d->m_account, key.toUtf8().constData(), token);
825 return ag_account_verify(d->m_account, key.toUtf8().constData(), token);
842 int tokensCount = tokens.count();
844 const char *tmp[tokensCount + 1];
846 for (
int i = 0; i < tokensCount; ++i)
848 tmp[i] = tokens.at(i);
850 tmp[tokensCount] = NULL;
852 return ag_account_verify_with_tokens(d->m_account, key.toUtf8().constData(), tmp);
857 QString key = ACCOUNTS_KEY_CREDENTIALS_ID;
858 QVariant val(QVariant::Int);
860 if (
value(key, val) != NONE)
867 if (
value(key, val) != NONE)
874 AgAccount *Account::account()