27 #include <libaccounts-glib/ag-manager.h>
28 #include <libaccounts-glib/ag-account.h>
32 class Account::Private
45 static void on_display_name_changed(
Account *
self);
46 static void on_enabled(
Account *
self,
const gchar *service_name,
48 static void account_store_cb(
AgAccount *account,
const GError *
error,
50 static void on_deleted(
Account *
self);
56 static void account_notify_cb(
AgAccount *account,
const gchar *key,
62 using namespace Accounts;
64 static QChar slash = QChar::fromLatin1(
'/');
66 Watch::Watch(QObject *parent)
77 Q_ASSERT(account != NULL);
78 ag_account_remove_watch(account->d->m_account, watch);
81 void Account::Private::on_display_name_changed(
Account *
self)
84 const gchar *name = ag_account_get_display_name(self->d->m_account);
86 emit
self->displayNameChanged(UTF8(name));
89 void Account::Private::on_enabled(
Account *
self,
const gchar *service_name,
94 emit
self->enabledChanged(UTF8(service_name), enabled);
97 void Account::Private::on_deleted(
Account *
self)
101 emit
self->removed();
104 Account::Account(
AgAccount *account, QObject *parent)
105 : QObject(parent), d(new Private)
108 d->m_account = account;
109 g_object_ref(account);
111 g_signal_connect_swapped(account,
"display-name-changed",
112 G_CALLBACK(&Private::on_display_name_changed),
114 g_signal_connect_swapped(account,
"enabled",
115 G_CALLBACK(&Private::on_enabled),
this);
116 g_signal_connect_swapped(account,
"deleted",
117 G_CALLBACK(&Private::on_deleted),
this);
124 QObjectList list = children();
125 for (
int i = 0; i < list.count(); i++)
127 QObject *o = list.at(i);
128 if (qobject_cast<Watch *>(o))
132 g_signal_handlers_disconnect_by_func
133 (d->m_account, (
void *)&Private::on_display_name_changed,
this);
134 g_signal_handlers_disconnect_by_func
135 (d->m_account, (
void *)&Private::on_enabled,
this);
136 g_signal_handlers_disconnect_by_func
137 (d->m_account, (
void *)&Private::on_deleted,
this);
138 g_object_unref(d->m_account);
145 return d->m_account ? d->m_account->id : 0;
150 return qobject_cast<
Manager *>(QObject::parent());
155 TRACE() << serviceType;
157 return ag_account_supports_service(d->m_account,
158 serviceType.toUtf8().constData());
163 TRACE() << serviceType;
166 if (serviceType.isEmpty()) {
167 list = ag_account_list_services(d->m_account);
169 list = ag_account_list_services_by_type(d->m_account,
170 serviceType.toUtf8().constData());
178 for (iter = list; iter; iter = g_list_next(iter))
181 servList.append(serv);
184 ag_service_list_free(list);
192 list = ag_account_list_enabled_services(d->m_account);
199 for (iter = list; iter; iter = g_list_next(iter))
202 servList.append(serv);
205 ag_service_list_free(list);
212 return ag_account_get_enabled(d->m_account);
217 ag_account_set_enabled(d->m_account, enabled);
222 return UTF8(ag_account_get_display_name(d->m_account));
227 ag_account_set_display_name(d->m_account,
228 displayName.toUtf8().constData());
233 return UTF8(ag_account_get_provider_name(d->m_account));
241 agService = service->service();
243 ag_account_select_service(d->m_account, agService);
244 d->prefix = QString();
249 AgService *agService = ag_account_get_selected_service(d->m_account);
250 if (agService == NULL)
255 Service *service = mgr->serviceInstance(agService);
263 AgAccountSettingIter iter;
268 QByteArray tmp = d->prefix.toLatin1();
269 ag_account_settings_iter_init(d->m_account, &iter, tmp.constData());
270 while (ag_account_settings_iter_next(&iter, &key, &val))
272 allKeys.append(QString(ASCII(key)).mid(d->prefix.size()));
279 d->prefix += prefix + slash;
284 QStringList groups, all_keys;
287 foreach (QString key, all_keys)
289 if (key.contains(slash)) {
290 QString
group = key.section(slash, 0, 0);
291 if (!groups.contains(group))
292 groups.append(group);
300 QStringList keys, all_keys;
303 foreach (QString key, all_keys)
305 if (!key.contains(slash))
315 QString saved_prefix = d->prefix;
316 d->prefix = QString();
318 d->prefix = saved_prefix;
328 d->prefix = d->prefix.section(slash, 0, -3,
329 QString::SectionIncludeTrailingSep);
330 if (d->prefix[0] == slash) d->prefix.remove(0, 1);
335 if (d->prefix.endsWith(slash))
336 return d->prefix.left(d->prefix.size() - 1);
351 foreach (QString key, keys)
359 QString full_key = d->prefix + key;
360 QByteArray tmpkey = full_key.toLatin1();
361 ag_account_set_value(d->m_account, tmpkey.constData(), NULL);
368 GValue val= {0, {{0}}};
371 switch (value.type())
373 case QVariant::String:
374 g_value_init(&val, G_TYPE_STRING);
375 tmpvalue = value.toString().toUtf8();
376 g_value_set_static_string(&val, tmpvalue.constData());
379 g_value_init(&val, G_TYPE_INT);
380 g_value_set_int(&val, value.toInt());
383 g_value_init(&val, G_TYPE_UINT);
384 g_value_set_uint(&val, value.toUInt());
386 case QVariant::LongLong:
387 g_value_init(&val, G_TYPE_INT64);
388 g_value_set_int64(&val, value.toLongLong());
390 case QVariant::ULongLong:
391 g_value_init(&val, G_TYPE_UINT64);
392 g_value_set_uint64(&val, value.toULongLong());
395 g_value_init(&val, G_TYPE_BOOLEAN);
396 g_value_set_boolean(&val, value.toBool());
399 qWarning(
"unsupproted datatype %s", value.typeName());
403 QString full_key = d->prefix + key;
404 QByteArray tmpkey = full_key.toLatin1();
405 ag_account_set_value(d->m_account, tmpkey.constData(), &val);
409 void Account::Private::account_store_cb(
AgAccount *account,
const GError *err,
412 TRACE() <<
"Saved accunt ID:" << account->id;
427 ag_account_store(d->m_account,
428 (AgAccountStoreCb)&Private::account_store_cb,
436 GError *
error = NULL;
439 ret = ag_account_store_blocking(d->m_account, &error);
442 qWarning() <<
"Store operation failed: " << error->message;
453 switch (value.type())
455 case QVariant::String:
456 type = G_TYPE_STRING;
464 case QVariant::LongLong:
467 case QVariant::ULongLong:
468 type = G_TYPE_UINT64;
471 type = G_TYPE_BOOLEAN;
474 qWarning(
"Unsupported type %s", value.typeName());
478 GValue val= {0, {{0}}};
479 g_value_init(&val, type);
480 QString full_key = d->prefix + key;
481 AgSettingSource source =
482 ag_account_get_value(d->m_account,
483 full_key.toLatin1().constData(), &val);
484 if (source == AG_SETTING_SOURCE_NONE)
490 value = UTF8(g_value_get_string(&val));
493 value = g_value_get_int(&val);
496 value = g_value_get_uint(&val);
499 value = qint64(g_value_get_int64(&val));
502 value = quint64(g_value_get_uint64(&val));
505 value = g_value_get_boolean(&val);
518 QString default_value,
521 QVariant var = default_value;
525 return var.toString();
532 QVariant var = default_value;
540 quint64 default_value,
543 QVariant var = default_value;
547 return var.toULongLong();
554 QVariant var = default_value;
561 void Watch::Private::account_notify_cb(
AgAccount *account,
const gchar *key,
576 QString full_key = d->prefix + key;
577 ag_watch = ag_account_watch_key
578 (d->m_account, full_key.toLatin1().constData(),
579 (AgAccountNotifyCb)&Watch::Private::account_notify_cb, watch);
583 ag_watch = ag_account_watch_dir
584 (d->m_account, d->prefix.toLatin1().constData(),
585 (AgAccountNotifyCb)&Watch::Private::account_notify_cb, watch);
594 watch->setWatch(ag_watch);
601 ag_account_delete(d->m_account);
606 ag_account_sign (d->m_account, key.toUtf8().constData(), token);
611 return ag_account_verify(d->m_account, key.toUtf8().constData(), token);
616 int tokensCount = tokens.count();
618 const char *tmp[tokensCount + 1];
620 for (
int i = 0; i < tokensCount; ++i)
622 tmp[i] = tokens.at(i);
624 tmp[tokensCount] = NULL;
626 return ag_account_verify_with_tokens(d->m_account, key.toUtf8().constData(), tmp);
632 QVariant val(QVariant::Int);