accounts-qt  1.6
manager.cpp
1 /* vi: set et sw=4 ts=4 cino=t0,(0: */
2 /*
3  * This file is part of libaccounts-qt
4  *
5  * Copyright (C) 2009-2011 Nokia Corporation.
6  * Copyright (C) 2012 Canonical Ltd.
7  *
8  * Contact: Alberto Mardegan <alberto.mardegan@canonical.com>
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public License
12  * version 2.1 as published by the Free Software Foundation.
13  *
14  * This library is distributed in the hope that it will be useful, but
15  * WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
22  * 02110-1301 USA
23  */
24 
25 #include "application.h"
26 #include "service.h"
27 #include "manager.h"
28 
29 #undef signals
30 #include <libaccounts-glib/ag-manager.h>
31 #include <libaccounts-glib/ag-account.h>
32 
33 
34 namespace Accounts {
35 
92 class Manager::Private
93 {
94  Q_DECLARE_PUBLIC(Manager)
95 
96 public:
97  Private():
98  q_ptr(0),
99  m_manager(0)
100  {
101  }
102 
103  ~Private() {
104  }
105 
106  void init(Manager *q, AgManager *manager);
107 
108  mutable Manager *q_ptr;
109  AgManager *m_manager; //real manager
111 
112  static void on_account_created(Manager *self, AgAccountId id);
113  static void on_account_deleted(Manager *self, AgAccountId id);
114  static void on_account_updated(Manager *self, AgAccountId id);
115  static void on_enabled_event(Manager *self, AgAccountId id);
116 };
117 
118 } //namespace Accounts
119 
120 using namespace Accounts;
121 
122 void Manager::Private::init(Manager *q, AgManager *manager)
123 {
124  Q_ASSERT(q_ptr == 0);
125  Q_ASSERT(m_manager == 0);
126 
127  q_ptr = q;
128  m_manager = manager;
129 
130  if (manager) {
131  g_signal_connect_swapped
132  (manager, "account-created",
133  G_CALLBACK(&Private::on_account_created), q);
134  g_signal_connect_swapped
135  (manager, "account-deleted",
136  G_CALLBACK(&Private::on_account_deleted), q);
137  g_signal_connect_swapped
138  (manager, "account-updated",
139  G_CALLBACK(&Private::on_account_updated), q);
140  g_signal_connect_swapped
141  (manager, "enabled-event",
142  G_CALLBACK(&Private::on_enabled_event), q);
143  } else {
144  qWarning() << Q_FUNC_INFO << "Initializing with NULL AgManager!";
145  }
146 }
147 
148 void Manager::Private::on_account_created(Manager *self, AgAccountId id)
149 {
150  Q_EMIT self->accountCreated(id);
151 }
152 
153 void Manager::Private::on_account_deleted(Manager *self, AgAccountId id)
154 {
155  Q_EMIT self->accountRemoved(id);
156 }
157 
158 void Manager::Private::on_account_updated(Manager *self, AgAccountId id)
159 {
160  Q_EMIT self->accountUpdated(id);
161 }
162 
163 void Manager::Private::on_enabled_event(Manager *self, AgAccountId id)
164 {
165  Q_EMIT self->enabledEvent(id);
166 }
167 
173 Manager::Manager(QObject *parent):
174  QObject(parent),
175  d(new Private)
176 {
177  g_type_init();
178 
179  AgManager *manager = ag_manager_new();
180 
181  if (manager != 0) {
182  d->init(this, manager);
183  } else {
184  qWarning() << "Manager could not be created. DB is locked";
185  d->lastError = Error::DatabaseLocked;
186  }
187 
188 }
189 
202 Manager::Manager(const QString &serviceType, QObject *parent):
203  QObject(parent),
204  d(new Private)
205 {
206  g_type_init();
207 
208  AgManager *manager =
209  ag_manager_new_for_service_type(serviceType.toUtf8().constData());
210 
211  if (manager != 0) {
212  d->init(this, manager);
213  } else {
214  qWarning() << "Manager could not be created, DB is locked";
215  d->lastError = Error::DatabaseLocked;
216  }
217 
218 }
219 
224 {
225  g_signal_handlers_disconnect_by_func
226  (d->m_manager, (void *)&Private::on_enabled_event, this);
227  g_signal_handlers_disconnect_by_func
228  (d->m_manager, (void *)&Private::on_account_updated, this);
229  g_signal_handlers_disconnect_by_func
230  (d->m_manager, (void *)&Private::on_account_deleted, this);
231  g_signal_handlers_disconnect_by_func
232  (d->m_manager, (void *)&Private::on_account_created, this);
233  g_object_unref(d->m_manager);
234 
235  delete d;
236  d = 0;
237 }
238 
246 Account *Manager::account(const AccountId &id) const
247 {
248  GError *error = NULL;
249  AgAccount *account = ag_manager_load_account(d->m_manager, id, &error);
250 
251  if (account != NULL) {
252  Q_ASSERT(error == NULL);
253  Account *tmp = new Account(account, const_cast<Manager*>(this));
254  g_object_unref(account);
255  return tmp;
256  } else {
257  Q_ASSERT(error != NULL);
258  d->lastError = Error(error);
259  g_error_free(error);
260  }
261  return NULL;
262 }
263 
273 AccountIdList Manager::accountList(const QString &serviceType) const
274 {
275  GList *list = NULL;
276 
277  if (serviceType.isEmpty()) {
278  list = ag_manager_list(d->m_manager);
279  } else {
280  list = ag_manager_list_by_service_type(d->m_manager,
281  serviceType.toUtf8().constData());
282  }
283 
284  /* convert glist -> AccountIdList */
285  AccountIdList idList;
286  GList *iter;
287 
288  for (iter = list; iter; iter = g_list_next(iter))
289  {
290  idList.append((AccountId)GPOINTER_TO_INT(iter->data));
291  }
292 
293  ag_manager_list_free(list);
294 
295  return idList;
296 }
297 
308 AccountIdList Manager::accountListEnabled(const QString &serviceType) const
309 {
310  GList *list = NULL;
311  if (serviceType.isEmpty()) {
312  list = ag_manager_list_enabled(d->m_manager);
313  } else {
314  list = ag_manager_list_enabled_by_service_type(d->m_manager,
315  serviceType.toUtf8().constData());
316  }
317 
318  /* convert glist -> AccountIdList */
319  AccountIdList idList;
320  GList *iter;
321 
322  for (iter = list; iter; iter = g_list_next(iter))
323  {
324  idList.append((AccountId)GPOINTER_TO_INT(iter->data));
325  }
326 
327  ag_manager_list_free(list);
328 
329  return idList;
330 }
331 
338 Account *Manager::createAccount(const QString &providerName)
339 {
340  AgAccount *account =
341  ag_manager_create_account(d->m_manager,
342  providerName.toUtf8().constData());
343 
344  if (account != NULL) {
345  /* convert gaccount into qaccount */
346  Account *tmp = new Account(account, this);
347  g_object_unref(account);
348  return tmp;
349  }
350 
351  return NULL;
352 }
353 
360 Service Manager::service(const QString &serviceName) const
361 {
362  AgService *service =
363  ag_manager_get_service(d->m_manager,
364  serviceName.toUtf8().constData());
365  return Service(service, StealReference);
366 }
367 
378 ServiceList Manager::serviceList(const QString &serviceType) const
379 {
380  GList *list;
381 
382  if (serviceType.isEmpty()) {
383  list = ag_manager_list_services(d->m_manager);
384  } else {
385  list = ag_manager_list_services_by_type(d->m_manager,
386  serviceType.toUtf8().constData());
387  }
388 
389  /* convert glist -> ServiceList */
390  ServiceList servList;
391  GList *iter;
392 
393  for (iter = list; iter; iter = g_list_next(iter))
394  {
395  AgService *service = (AgService*)iter->data;
396  servList.append(Service(service, StealReference));
397  }
398 
399  g_list_free(list);
400 
401  return servList;
402 }
403 
410 Provider Manager::provider(const QString &providerName) const
411 {
412  AgProvider *provider;
413 
414  provider = ag_manager_get_provider(d->m_manager,
415  providerName.toUtf8().constData());
416  return Provider(provider, StealReference);
417 }
418 
424 ProviderList Manager::providerList() const
425 {
426  GList *list;
427 
428  list = ag_manager_list_providers(d->m_manager);
429 
430  /* convert glist -> ProviderList */
431  ProviderList provList;
432  GList *iter;
433 
434  for (iter = list; iter; iter = g_list_next(iter))
435  {
436  AgProvider *provider = (AgProvider*)iter->data;
437  provList.append(Provider(provider, StealReference));
438  }
439 
440  g_list_free(list);
441 
442  return provList;
443 }
444 
451 ServiceType Manager::serviceType(const QString &name) const
452 {
453  AgServiceType *type;
454  type = ag_manager_load_service_type(d->m_manager,
455  name.toUtf8().constData());
456  return ServiceType(type, StealReference);
457 }
458 
466 Application Manager::application(const QString &applicationName) const
467 {
468  QByteArray ba = applicationName.toUtf8();
469  AgApplication *application =
470  ag_manager_get_application(d->m_manager, ba.constData());
471  return Application(application);
472 }
473 
480 ApplicationList Manager::applicationList(const Service &service) const
481 {
482  ApplicationList ret;
483  GList *applications, *list;
484 
485  applications = ag_manager_list_applications_by_service(d->m_manager,
486  service.service());
487  for (list = applications; list != NULL; list = list->next) {
488  AgApplication *application = (AgApplication *)list->data;
489  ret.append(Application(application));
490  }
491  g_list_free (applications);
492  return ret;
493 }
494 
500 QString Manager::serviceType() const
501 {
502  return UTF8(ag_manager_get_service_type (d->m_manager));
503 }
504 
514 void Manager::setTimeout(quint32 timeout)
515 {
516  ag_manager_set_db_timeout(d->m_manager, timeout);
517 }
518 
524 {
525  return ag_manager_get_db_timeout(d->m_manager);
526 }
527 
533 {
534  ag_manager_set_abort_on_db_timeout(d->m_manager, abort);
535 }
536 
542 {
543  return ag_manager_get_abort_on_db_timeout(d->m_manager);
544 }
545 
556 {
557  return d->lastError;
558 }
559