accounts-qt  1.2
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  TRACE() << "id =" << id;
151 
152  emit self->accountCreated(id);
153 }
154 
155 void Manager::Private::on_account_deleted(Manager *self, AgAccountId id)
156 {
157  TRACE() << "id =" << id;
158 
159  emit self->accountRemoved(id);
160 }
161 
162 void Manager::Private::on_account_updated(Manager *self, AgAccountId id)
163 {
164  TRACE() << "id =" << id;
165 
166  emit self->accountUpdated(id);
167 }
168 
169 void Manager::Private::on_enabled_event(Manager *self, AgAccountId id)
170 {
171  TRACE() << "id =" << id;
172 
173  emit self->enabledEvent(id);
174 }
175 
181 Manager::Manager(QObject *parent):
182  QObject(parent),
183  d(new Private)
184 {
185  g_type_init();
186 
187  AgManager *manager = ag_manager_new();
188 
189  if (manager != 0) {
190  d->init(this, manager);
191  } else {
192  qWarning() << "Manager could not be created. DB is locked";
193  d->lastError = Error::DatabaseLocked;
194  }
195 
196 }
197 
210 Manager::Manager(const QString &serviceType, QObject *parent):
211  QObject(parent),
212  d(new Private)
213 {
214  g_type_init();
215 
216  AgManager *manager =
217  ag_manager_new_for_service_type(serviceType.toUtf8().constData());
218 
219  if (manager != 0) {
220  d->init(this, manager);
221  } else {
222  qWarning() << "Manager could not be created, DB is locked";
223  d->lastError = Error::DatabaseLocked;
224  }
225 
226 }
227 
232 {
233  TRACE();
234 
235  g_signal_handlers_disconnect_by_func
236  (d->m_manager, (void *)&Private::on_enabled_event, this);
237  g_signal_handlers_disconnect_by_func
238  (d->m_manager, (void *)&Private::on_account_updated, this);
239  g_signal_handlers_disconnect_by_func
240  (d->m_manager, (void *)&Private::on_account_deleted, this);
241  g_signal_handlers_disconnect_by_func
242  (d->m_manager, (void *)&Private::on_account_created, this);
243  g_object_unref(d->m_manager);
244 
245  delete d;
246  d = 0;
247 }
248 
256 Account *Manager::account(const AccountId &id) const
257 {
258  TRACE() << "get account id: " << id;
259 
260  GError *error = NULL;
261  AgAccount *account = ag_manager_load_account(d->m_manager, id, &error);
262 
263  if (account != NULL) {
264  Q_ASSERT(error == NULL);
265  Account *tmp = new Account(account, const_cast<Manager*>(this));
266  g_object_unref(account);
267  return tmp;
268  } else {
269  Q_ASSERT(error != NULL);
270  d->lastError = Error(error);
271  g_error_free(error);
272  }
273  return NULL;
274 }
275 
285 AccountIdList Manager::accountList(const QString &serviceType) const
286 {
287  GList *list = NULL;
288 
289  if (serviceType.isEmpty()) {
290  list = ag_manager_list(d->m_manager);
291  } else {
292  list = ag_manager_list_by_service_type(d->m_manager,
293  serviceType.toUtf8().constData());
294  }
295 
296  /* convert glist -> AccountIdList */
297  AccountIdList idList;
298  GList *iter;
299 
300  for (iter = list; iter; iter = g_list_next(iter))
301  {
302  idList.append((AccountId)GPOINTER_TO_INT(iter->data));
303  }
304 
305  ag_manager_list_free(list);
306 
307  return idList;
308 }
309 
320 AccountIdList Manager::accountListEnabled(const QString &serviceType) const
321 {
322  GList *list = NULL;
323  if (serviceType.isEmpty()) {
324  list = ag_manager_list_enabled(d->m_manager);
325  } else {
326  list = ag_manager_list_enabled_by_service_type(d->m_manager,
327  serviceType.toUtf8().constData());
328  }
329 
330  /* convert glist -> AccountIdList */
331  AccountIdList idList;
332  GList *iter;
333 
334  for (iter = list; iter; iter = g_list_next(iter))
335  {
336  idList.append((AccountId)GPOINTER_TO_INT(iter->data));
337  }
338 
339  ag_manager_list_free(list);
340 
341  return idList;
342 }
343 
350 Account *Manager::createAccount(const QString &providerName)
351 {
352  TRACE() << providerName;
353 
354  AgAccount *account =
355  ag_manager_create_account(d->m_manager,
356  providerName.toUtf8().constData());
357 
358  if (account != NULL) {
359  /* convert gaccount into qaccount */
360  Account *tmp = new Account(account, this);
361  g_object_unref(account);
362  return tmp;
363  }
364 
365  return NULL;
366 }
367 
374 Service Manager::service(const QString &serviceName) const
375 {
376  TRACE() << serviceName;
377  AgService *service =
378  ag_manager_get_service(d->m_manager,
379  serviceName.toUtf8().constData());
380  return Service(service, StealReference);
381 }
382 
393 ServiceList Manager::serviceList(const QString &serviceType) const
394 {
395  TRACE() << serviceType;
396  GList *list;
397 
398  if (serviceType.isEmpty()) {
399  list = ag_manager_list_services(d->m_manager);
400  } else {
401  list = ag_manager_list_services_by_type(d->m_manager,
402  serviceType.toUtf8().constData());
403  }
404  TRACE() << "found:" << g_list_length(list);
405 
406  /* convert glist -> ServiceList */
407  ServiceList servList;
408  GList *iter;
409 
410  for (iter = list; iter; iter = g_list_next(iter))
411  {
412  AgService *service = (AgService*)iter->data;
413  servList.append(Service(service, StealReference));
414  }
415 
416  g_list_free(list);
417 
418  return servList;
419 }
420 
427 Provider Manager::provider(const QString &providerName) const
428 {
429  TRACE() << providerName;
430  AgProvider *provider;
431 
432  provider = ag_manager_get_provider(d->m_manager,
433  providerName.toUtf8().constData());
434  return Provider(provider, StealReference);
435 }
436 
442 ProviderList Manager::providerList() const
443 {
444  GList *list;
445 
446  list = ag_manager_list_providers(d->m_manager);
447 
448  /* convert glist -> ProviderList */
449  ProviderList provList;
450  GList *iter;
451 
452  for (iter = list; iter; iter = g_list_next(iter))
453  {
454  AgProvider *provider = (AgProvider*)iter->data;
455  provList.append(Provider(provider, StealReference));
456  }
457 
458  g_list_free(list);
459 
460  return provList;
461 }
462 
469 ServiceType Manager::serviceType(const QString &name) const
470 {
471  AgServiceType *type;
472  type = ag_manager_load_service_type(d->m_manager,
473  name.toUtf8().constData());
474  return ServiceType(type, StealReference);
475 }
476 
484 Application Manager::application(const QString &applicationName) const
485 {
486  QByteArray ba = applicationName.toUtf8();
487  AgApplication *application =
488  ag_manager_get_application(d->m_manager, ba.constData());
489  return Application(application);
490 }
491 
498 ApplicationList Manager::applicationList(const Service &service) const
499 {
500  ApplicationList ret;
501  GList *applications, *list;
502 
503  applications = ag_manager_list_applications_by_service(d->m_manager,
504  service.service());
505  for (list = applications; list != NULL; list = list->next) {
506  AgApplication *application = (AgApplication *)list->data;
507  ret.append(Application(application));
508  }
509  g_list_free (applications);
510  return ret;
511 }
512 
518 QString Manager::serviceType() const
519 {
520  return UTF8(ag_manager_get_service_type (d->m_manager));
521 }
522 
532 void Manager::setTimeout(quint32 timeout)
533 {
534  ag_manager_set_db_timeout(d->m_manager, timeout);
535 }
536 
542 {
543  return ag_manager_get_db_timeout(d->m_manager);
544 }
545 
551 {
552  ag_manager_set_abort_on_db_timeout(d->m_manager, abort);
553 }
554 
560 {
561  return ag_manager_get_abort_on_db_timeout(d->m_manager);
562 }
563 
574 {
575  return d->lastError;
576 }
577