|
libaccounts-qt
1.1
|
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 * 00007 * Contact: Alberto Mardegan <alberto.mardegan@nokia.com> 00008 * 00009 * This library is free software; you can redistribute it and/or 00010 * modify it under the terms of the GNU Lesser General Public License 00011 * version 2.1 as published by the Free Software Foundation. 00012 * 00013 * This library is distributed in the hope that it will be useful, but 00014 * WITHOUT ANY WARRANTY; without even the implied warranty of 00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00016 * Lesser General Public License for more details. 00017 * 00018 * You should have received a copy of the GNU Lesser General Public 00019 * License along with this library; if not, write to the Free Software 00020 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 00021 * 02110-1301 USA 00022 */ 00023 00024 #include <QtCore> 00025 00026 #include "service.h" 00027 #include "manager.h" 00028 00029 #undef signals 00030 #include <libaccounts-glib/ag-manager.h> 00031 #include <libaccounts-glib/ag-account.h> 00032 00033 00034 namespace Accounts { 00035 00092 class Manager::Private 00093 { 00094 Q_DECLARE_PUBLIC(Manager) 00095 00096 typedef QHash<AgProvider *, Provider *> ProviderHash; 00097 typedef QHash<AgService *, Service *> ServiceHash; 00098 typedef QHash<const QString, ServiceType *> ServiceTypeHash; 00099 public: 00100 Private(): 00101 q_ptr(0), 00102 m_manager(0), 00103 providers(), 00104 services(), 00105 serviceTypes() 00106 { 00107 } 00108 00109 ~Private() { 00110 foreach (Provider *provider, providers) 00111 { 00112 delete provider; 00113 } 00114 providers.clear(); 00115 foreach (Service *service, services) 00116 { 00117 delete service; 00118 } 00119 services.clear(); 00120 00121 foreach (ServiceType *serviceType, serviceTypes) 00122 { 00123 delete serviceType; 00124 } 00125 serviceTypes.clear(); 00126 } 00127 00128 void init(Manager *q, AgManager *manager); 00129 00130 mutable Manager *q_ptr; 00131 AgManager *m_manager; //real manager 00132 ProviderHash providers; 00133 ServiceHash services; 00134 ServiceTypeHash serviceTypes; 00135 Error lastError; 00136 00137 static void on_account_created(Manager *self, AgAccountId id); 00138 static void on_account_deleted(Manager *self, AgAccountId id); 00139 static void on_account_updated(Manager *self, AgAccountId id); 00140 static void on_enabled_event(Manager *self, AgAccountId id); 00141 }; 00142 00143 } //namespace Accounts 00144 00145 using namespace Accounts; 00146 00147 void Manager::Private::init(Manager *q, AgManager *manager) 00148 { 00149 Q_ASSERT(q_ptr == 0); 00150 Q_ASSERT(m_manager == 0); 00151 00152 q_ptr = q; 00153 m_manager = manager; 00154 00155 if (manager) { 00156 g_signal_connect_swapped 00157 (manager, "account-created", 00158 G_CALLBACK(&Private::on_account_created), q); 00159 g_signal_connect_swapped 00160 (manager, "account-deleted", 00161 G_CALLBACK(&Private::on_account_deleted), q); 00162 g_signal_connect_swapped 00163 (manager, "account-updated", 00164 G_CALLBACK(&Private::on_account_updated), q); 00165 g_signal_connect_swapped 00166 (manager, "enabled-event", 00167 G_CALLBACK(&Private::on_enabled_event), q); 00168 } else { 00169 qWarning() << Q_FUNC_INFO << "Initializing with NULL AgManager!"; 00170 } 00171 } 00172 00173 void Manager::Private::on_account_created(Manager *self, AgAccountId id) 00174 { 00175 TRACE() << "id =" << id; 00176 00177 emit self->accountCreated(id); 00178 } 00179 00180 void Manager::Private::on_account_deleted(Manager *self, AgAccountId id) 00181 { 00182 TRACE() << "id =" << id; 00183 00184 emit self->accountRemoved(id); 00185 } 00186 00187 void Manager::Private::on_account_updated(Manager *self, AgAccountId id) 00188 { 00189 TRACE() << "id =" << id; 00190 00191 emit self->accountUpdated(id); 00192 } 00193 00194 void Manager::Private::on_enabled_event(Manager *self, AgAccountId id) 00195 { 00196 TRACE() << "id =" << id; 00197 00198 emit self->enabledEvent(id); 00199 } 00200 00206 Manager::Manager(QObject *parent) 00207 : QObject(parent), d(new Private) 00208 { 00209 g_type_init(); 00210 00211 AgManager *manager = ag_manager_new(); 00212 00213 if (manager != 0) { 00214 d->init(this, manager); 00215 } else { 00216 qWarning() << "Manager could not be created. DB is locked"; 00217 d->lastError = Error::DatabaseLocked; 00218 } 00219 00220 } 00221 00234 Manager::Manager(const QString &serviceType, QObject *parent) 00235 : QObject(parent), d(new Private) 00236 { 00237 g_type_init(); 00238 00239 AgManager *manager = 00240 ag_manager_new_for_service_type(serviceType.toUtf8().constData()); 00241 00242 if (manager != 0) { 00243 d->init(this, manager); 00244 } else { 00245 qWarning() << "Manager could not be created, DB is locked"; 00246 d->lastError = Error::DatabaseLocked; 00247 } 00248 00249 } 00250 00254 Manager::~Manager() 00255 { 00256 TRACE(); 00257 00258 g_signal_handlers_disconnect_by_func 00259 (d->m_manager, (void *)&Private::on_enabled_event, this); 00260 g_signal_handlers_disconnect_by_func 00261 (d->m_manager, (void *)&Private::on_account_updated, this); 00262 g_signal_handlers_disconnect_by_func 00263 (d->m_manager, (void *)&Private::on_account_deleted, this); 00264 g_signal_handlers_disconnect_by_func 00265 (d->m_manager, (void *)&Private::on_account_created, this); 00266 g_object_unref(d->m_manager); 00267 00268 delete d; 00269 d = 0; 00270 } 00271 00279 Account *Manager::account(const AccountId &id) const 00280 { 00281 TRACE() << "get account id: " << id; 00282 00283 GError *error = NULL; 00284 AgAccount *account = ag_manager_load_account(d->m_manager, id, &error); 00285 00286 if (account != NULL) { 00287 Q_ASSERT(error == NULL); 00288 Account *tmp = new Account(account, const_cast<Manager*>(this)); 00289 g_object_unref(account); 00290 return tmp; 00291 } else { 00292 Q_ASSERT(error != NULL); 00293 d->lastError = Error(error); 00294 g_error_free(error); 00295 } 00296 return NULL; 00297 } 00298 00308 AccountIdList Manager::accountList(const QString &serviceType) const 00309 { 00310 GList *list = NULL; 00311 00312 if (serviceType.isEmpty()) { 00313 list = ag_manager_list(d->m_manager); 00314 } else { 00315 list = ag_manager_list_by_service_type(d->m_manager, 00316 serviceType.toUtf8().constData()); 00317 } 00318 00319 /* convert glist -> AccountIdList */ 00320 AccountIdList idList; 00321 GList *iter; 00322 00323 for (iter = list; iter; iter = g_list_next(iter)) 00324 { 00325 idList.append((AccountId)GPOINTER_TO_INT(iter->data)); 00326 } 00327 00328 ag_manager_list_free(list); 00329 00330 return idList; 00331 } 00332 00343 AccountIdList Manager::accountListEnabled(const QString &serviceType) const 00344 { 00345 GList *list = NULL; 00346 if (serviceType.isEmpty()) { 00347 list = ag_manager_list_enabled(d->m_manager); 00348 } else { 00349 list = ag_manager_list_enabled_by_service_type(d->m_manager, 00350 serviceType.toUtf8().constData()); 00351 } 00352 00353 /* convert glist -> AccountIdList */ 00354 AccountIdList idList; 00355 GList *iter; 00356 00357 for (iter = list; iter; iter = g_list_next(iter)) 00358 { 00359 idList.append((AccountId)GPOINTER_TO_INT(iter->data)); 00360 } 00361 00362 ag_manager_list_free(list); 00363 00364 return idList; 00365 } 00366 00373 Account *Manager::createAccount(const QString &providerName) 00374 { 00375 TRACE() << providerName; 00376 00377 AgAccount *account = 00378 ag_manager_create_account(d->m_manager, 00379 providerName.toUtf8().constData()); 00380 00381 if (account != NULL) { 00382 /* convert gaccount into qaccount */ 00383 Account *tmp = new Account(account, this); 00384 g_object_unref(account); 00385 return tmp; 00386 } 00387 00388 return NULL; 00389 } 00390 00391 Service *Manager::serviceInstance(AgService *service) const 00392 { 00393 Service *ret; 00394 00395 ret = d->services.value(service); 00396 if (!ret) 00397 { 00398 ret = new Service(service); 00399 d->services.insert(service, ret); 00400 } 00401 return ret; 00402 } 00403 00410 Service *Manager::service(const QString &serviceName) const 00411 { 00412 TRACE() << serviceName; 00413 AgService *service = 00414 ag_manager_get_service(d->m_manager, 00415 serviceName.toUtf8().constData()); 00416 if (!service) 00417 return NULL; 00418 00419 Service *serv= serviceInstance(service); 00420 ag_service_unref(service); 00421 return serv; 00422 } 00423 00434 ServiceList Manager::serviceList(const QString &serviceType) const 00435 { 00436 TRACE() << serviceType; 00437 GList *list; 00438 00439 if (serviceType.isEmpty()) { 00440 list = ag_manager_list_services(d->m_manager); 00441 } else { 00442 list = ag_manager_list_services_by_type(d->m_manager, 00443 serviceType.toUtf8().constData()); 00444 } 00445 TRACE() << "found:" << g_list_length(list); 00446 00447 /* convert glist -> ServiceList */ 00448 ServiceList servList; 00449 GList *iter; 00450 00451 for (iter = list; iter; iter = g_list_next(iter)) 00452 { 00453 Service *serv = serviceInstance((AgService*)(iter->data)); 00454 servList.append(serv); 00455 } 00456 00457 ag_service_list_free(list); 00458 00459 return servList; 00460 } 00461 00462 Provider *Manager::providerInstance(AgProvider *provider) const 00463 { 00464 Provider *ret; 00465 00466 ret = d->providers.value(provider); 00467 if (!ret) 00468 { 00469 ret = new Provider(provider); 00470 d->providers.insert(provider, ret); 00471 } 00472 return ret; 00473 } 00474 00481 Provider *Manager::provider(const QString &providerName) const 00482 { 00483 TRACE() << providerName; 00484 AgProvider *provider; 00485 00486 provider = ag_manager_get_provider(d->m_manager, 00487 providerName.toUtf8().constData()); 00488 if (!provider) 00489 return NULL; 00490 00491 Provider *prov = providerInstance(provider); 00492 ag_provider_unref(provider); 00493 return prov; 00494 } 00495 00501 ProviderList Manager::providerList() const 00502 { 00503 GList *list; 00504 00505 list = ag_manager_list_providers(d->m_manager); 00506 00507 /* convert glist -> ProviderList */ 00508 ProviderList provList; 00509 GList *iter; 00510 00511 for (iter = list; iter; iter = g_list_next(iter)) 00512 { 00513 Provider *prov = providerInstance((AgProvider*)(iter->data)); 00514 provList.append(prov); 00515 } 00516 00517 ag_provider_list_free(list); 00518 00519 return provList; 00520 } 00521 00528 ServiceType *Manager::serviceType(const QString &name) const 00529 { 00530 ServiceType *serviceType = d->serviceTypes.value(name, NULL); 00531 if (serviceType == 0) { 00532 AgServiceType *type; 00533 type = ag_manager_load_service_type(d->m_manager, 00534 name.toUtf8().constData()); 00535 if (type == NULL) 00536 return NULL; 00537 00538 serviceType = new ServiceType(type); 00539 d->serviceTypes.insert(name, serviceType); 00540 ag_service_type_unref(type); 00541 } 00542 return serviceType; 00543 } 00544 00550 QString Manager::serviceType() const 00551 { 00552 return UTF8(ag_manager_get_service_type (d->m_manager)); 00553 } 00554 00564 void Manager::setTimeout(quint32 timeout) 00565 { 00566 ag_manager_set_db_timeout(d->m_manager, timeout); 00567 } 00568 00573 quint32 Manager::timeout() 00574 { 00575 return ag_manager_get_db_timeout(d->m_manager); 00576 } 00577 00582 void Manager::setAbortOnTimeout(bool abort) 00583 { 00584 ag_manager_set_abort_on_db_timeout(d->m_manager, abort); 00585 } 00586 00591 bool Manager::abortOnTimeout() const 00592 { 00593 return ag_manager_get_abort_on_db_timeout(d->m_manager); 00594 } 00595 00605 Error Manager::lastError() const 00606 { 00607 return d->lastError; 00608 } 00609