accounts-qt
1.13
|
00001 /* vi: set et sw=4 ts=4 cino=t0,(0: */ 00002 /* 00003 * This file is part of libaccounts-qt 00004 * 00005 * Copyright (C) 2009-2011 Nokia Corporation. 00006 * Copyright (C) 2012-2013 Canonical Ltd. 00007 * 00008 * Contact: Alberto Mardegan <alberto.mardegan@canonical.com> 00009 * 00010 * This library is free software; you can redistribute it and/or 00011 * modify it under the terms of the GNU Lesser General Public License 00012 * version 2.1 as published by the Free Software Foundation. 00013 * 00014 * This library is distributed in the hope that it will be useful, but 00015 * WITHOUT ANY WARRANTY; without even the implied warranty of 00016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00017 * Lesser General Public License for more details. 00018 * 00019 * You should have received a copy of the GNU Lesser General Public 00020 * License along with this library; if not, write to the Free Software 00021 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 00022 * 02110-1301 USA 00023 */ 00024 00025 #include "application.h" 00026 #include "service.h" 00027 #include "manager.h" 00028 #include "manager_p.h" 00029 00030 #include <libaccounts-glib/ag-account.h> 00031 00032 00033 namespace Accounts { 00034 00091 } //namespace Accounts 00092 00093 using namespace Accounts; 00094 00095 void Manager::Private::init(Manager *q, AgManager *manager) 00096 { 00097 Q_ASSERT(q_ptr == 0); 00098 Q_ASSERT(m_manager == 0); 00099 00100 q_ptr = q; 00101 m_manager = manager; 00102 00103 if (manager) { 00104 g_signal_connect_swapped 00105 (manager, "account-created", 00106 G_CALLBACK(&Private::on_account_created), q); 00107 g_signal_connect_swapped 00108 (manager, "account-deleted", 00109 G_CALLBACK(&Private::on_account_deleted), q); 00110 g_signal_connect_swapped 00111 (manager, "account-updated", 00112 G_CALLBACK(&Private::on_account_updated), q); 00113 g_signal_connect_swapped 00114 (manager, "enabled-event", 00115 G_CALLBACK(&Private::on_enabled_event), q); 00116 } else { 00117 qWarning() << Q_FUNC_INFO << "Initializing with NULL AgManager!"; 00118 } 00119 } 00120 00121 void Manager::Private::on_account_created(Manager *self, AgAccountId id) 00122 { 00123 Q_EMIT self->accountCreated(id); 00124 } 00125 00126 void Manager::Private::on_account_deleted(Manager *self, AgAccountId id) 00127 { 00128 Q_EMIT self->accountRemoved(id); 00129 } 00130 00131 void Manager::Private::on_account_updated(Manager *self, AgAccountId id) 00132 { 00133 Q_EMIT self->accountUpdated(id); 00134 } 00135 00136 void Manager::Private::on_enabled_event(Manager *self, AgAccountId id) 00137 { 00138 Q_EMIT self->enabledEvent(id); 00139 } 00140 00146 Manager::Manager(QObject *parent): 00147 QObject(parent), 00148 d(new Private) 00149 { 00150 AgManager *manager = ag_manager_new(); 00151 00152 if (manager != 0) { 00153 d->init(this, manager); 00154 } else { 00155 qWarning() << "Manager could not be created. DB is locked"; 00156 d->lastError = Error::DatabaseLocked; 00157 } 00158 00159 } 00160 00173 Manager::Manager(const QString &serviceType, QObject *parent): 00174 QObject(parent), 00175 d(new Private) 00176 { 00177 AgManager *manager = 00178 ag_manager_new_for_service_type(serviceType.toUtf8().constData()); 00179 00180 if (manager != 0) { 00181 d->init(this, manager); 00182 } else { 00183 qWarning() << "Manager could not be created, DB is locked"; 00184 d->lastError = Error::DatabaseLocked; 00185 } 00186 00187 } 00188 00194 Manager::Manager(Options options, QObject *parent): 00195 QObject(parent), 00196 d(new Private) 00197 { 00198 bool disableNotifications = options.testFlag(DisableNotifications); 00199 00200 GError *error = NULL; 00201 AgManager *manager = 00202 (AgManager *)g_initable_new(AG_TYPE_MANAGER, NULL, &error, 00203 "use-dbus", !disableNotifications, 00204 NULL); 00205 if (Q_LIKELY(manager)) { 00206 d->init(this, manager); 00207 } else { 00208 qWarning() << "Manager could not be created." << error->message; 00209 d->lastError = Error(error); 00210 g_error_free(error); 00211 } 00212 } 00213 00217 Manager::~Manager() 00218 { 00219 g_signal_handlers_disconnect_by_func 00220 (d->m_manager, (void *)&Private::on_enabled_event, this); 00221 g_signal_handlers_disconnect_by_func 00222 (d->m_manager, (void *)&Private::on_account_updated, this); 00223 g_signal_handlers_disconnect_by_func 00224 (d->m_manager, (void *)&Private::on_account_deleted, this); 00225 g_signal_handlers_disconnect_by_func 00226 (d->m_manager, (void *)&Private::on_account_created, this); 00227 g_object_unref(d->m_manager); 00228 00229 delete d; 00230 d = 0; 00231 } 00232 00245 Account *Manager::account(const AccountId &id) const 00246 { 00247 Account *account = d->m_accounts.value(id, 0); 00248 if (account == 0) { 00249 /* Create a new account object */ 00250 account = Account::fromId(const_cast<Manager*>(this), id, 00251 const_cast<Manager*>(this)); 00252 d->m_accounts[id] = account; 00253 } 00254 return account; 00255 } 00256 00266 AccountIdList Manager::accountList(const QString &serviceType) const 00267 { 00268 GList *list = NULL; 00269 00270 if (serviceType.isEmpty()) { 00271 list = ag_manager_list(d->m_manager); 00272 } else { 00273 list = ag_manager_list_by_service_type(d->m_manager, 00274 serviceType.toUtf8().constData()); 00275 } 00276 00277 /* convert glist -> AccountIdList */ 00278 AccountIdList idList; 00279 GList *iter; 00280 00281 for (iter = list; iter; iter = g_list_next(iter)) 00282 { 00283 idList.append((AccountId)GPOINTER_TO_INT(iter->data)); 00284 } 00285 00286 ag_manager_list_free(list); 00287 00288 return idList; 00289 } 00290 00301 AccountIdList Manager::accountListEnabled(const QString &serviceType) const 00302 { 00303 GList *list = NULL; 00304 if (serviceType.isEmpty()) { 00305 list = ag_manager_list_enabled(d->m_manager); 00306 } else { 00307 list = ag_manager_list_enabled_by_service_type(d->m_manager, 00308 serviceType.toUtf8().constData()); 00309 } 00310 00311 /* convert glist -> AccountIdList */ 00312 AccountIdList idList; 00313 GList *iter; 00314 00315 for (iter = list; iter; iter = g_list_next(iter)) 00316 { 00317 idList.append((AccountId)GPOINTER_TO_INT(iter->data)); 00318 } 00319 00320 ag_manager_list_free(list); 00321 00322 return idList; 00323 } 00324 00331 Account *Manager::createAccount(const QString &providerName) 00332 { 00333 return new Account(this, providerName, this); 00334 } 00335 00342 Service Manager::service(const QString &serviceName) const 00343 { 00344 AgService *service = 00345 ag_manager_get_service(d->m_manager, 00346 serviceName.toUtf8().constData()); 00347 return Service(service, StealReference); 00348 } 00349 00360 ServiceList Manager::serviceList(const QString &serviceType) const 00361 { 00362 GList *list; 00363 00364 if (serviceType.isEmpty()) { 00365 list = ag_manager_list_services(d->m_manager); 00366 } else { 00367 list = ag_manager_list_services_by_type(d->m_manager, 00368 serviceType.toUtf8().constData()); 00369 } 00370 00371 /* convert glist -> ServiceList */ 00372 ServiceList servList; 00373 GList *iter; 00374 00375 for (iter = list; iter; iter = g_list_next(iter)) 00376 { 00377 AgService *service = (AgService*)iter->data; 00378 servList.append(Service(service, StealReference)); 00379 } 00380 00381 g_list_free(list); 00382 00383 return servList; 00384 } 00385 00392 Provider Manager::provider(const QString &providerName) const 00393 { 00394 AgProvider *provider; 00395 00396 provider = ag_manager_get_provider(d->m_manager, 00397 providerName.toUtf8().constData()); 00398 return Provider(provider, StealReference); 00399 } 00400 00406 ProviderList Manager::providerList() const 00407 { 00408 GList *list; 00409 00410 list = ag_manager_list_providers(d->m_manager); 00411 00412 /* convert glist -> ProviderList */ 00413 ProviderList provList; 00414 GList *iter; 00415 00416 for (iter = list; iter; iter = g_list_next(iter)) 00417 { 00418 AgProvider *provider = (AgProvider*)iter->data; 00419 provList.append(Provider(provider, StealReference)); 00420 } 00421 00422 g_list_free(list); 00423 00424 return provList; 00425 } 00426 00433 ServiceType Manager::serviceType(const QString &name) const 00434 { 00435 AgServiceType *type; 00436 type = ag_manager_load_service_type(d->m_manager, 00437 name.toUtf8().constData()); 00438 return ServiceType(type, StealReference); 00439 } 00440 00448 Application Manager::application(const QString &applicationName) const 00449 { 00450 QByteArray ba = applicationName.toUtf8(); 00451 AgApplication *application = 00452 ag_manager_get_application(d->m_manager, ba.constData()); 00453 return Application(application); 00454 } 00455 00462 ApplicationList Manager::applicationList(const Service &service) const 00463 { 00464 ApplicationList ret; 00465 GList *applications, *list; 00466 00467 applications = ag_manager_list_applications_by_service(d->m_manager, 00468 service.service()); 00469 for (list = applications; list != NULL; list = list->next) { 00470 AgApplication *application = (AgApplication *)list->data; 00471 ret.append(Application(application)); 00472 } 00473 g_list_free (applications); 00474 return ret; 00475 } 00476 00482 QString Manager::serviceType() const 00483 { 00484 return UTF8(ag_manager_get_service_type (d->m_manager)); 00485 } 00486 00496 void Manager::setTimeout(quint32 timeout) 00497 { 00498 ag_manager_set_db_timeout(d->m_manager, timeout); 00499 } 00500 00505 quint32 Manager::timeout() 00506 { 00507 return ag_manager_get_db_timeout(d->m_manager); 00508 } 00509 00514 void Manager::setAbortOnTimeout(bool abort) 00515 { 00516 ag_manager_set_abort_on_db_timeout(d->m_manager, abort); 00517 } 00518 00523 bool Manager::abortOnTimeout() const 00524 { 00525 return ag_manager_get_abort_on_db_timeout(d->m_manager); 00526 } 00527 00531 Manager::Options Manager::options() const 00532 { 00533 gboolean useDBus = true; 00534 g_object_get(d->m_manager, 00535 "use-dbus", &useDBus, 00536 NULL); 00537 00538 Options opts; 00539 if (!useDBus) { 00540 opts |= DisableNotifications; 00541 } 00542 return opts; 00543 } 00544 00554 Error Manager::lastError() const 00555 { 00556 return d->lastError; 00557 } 00558