libaccounts-qt  1.1
manager.cpp
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