From: Denis Kenzior Date: Fri, 23 Oct 2009 16:14:55 +0000 (-0500) Subject: Add implementation of GPRS context atom X-Git-Tag: 0.9~91 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a3b736afe5be1c09b8777be1ccf5e2c7bbbb2b8a;p=platform%2Fupstream%2Fofono.git Add implementation of GPRS context atom --- diff --git a/include/gprs-context.h b/include/gprs-context.h index 1ceb19b..c4ebd23 100644 --- a/include/gprs-context.h +++ b/include/gprs-context.h @@ -63,10 +63,9 @@ void ofono_gprs_context_deactivated(struct ofono_gprs_context *gc, unsigned id); int ofono_gprs_context_driver_register(const struct ofono_gprs_context_driver *d); void ofono_gprs_context_driver_unregister(const struct ofono_gprs_context_driver *d); -struct ofono_gprs *ofono_gprs_context_create(struct ofono_modem *modem, +struct ofono_gprs_context *ofono_gprs_context_create(struct ofono_modem *modem, unsigned int vendor, const char *driver, void *data); -void ofono_gprs_context_register(struct ofono_gprs_context *gc); void ofono_gprs_context_remove(struct ofono_gprs_context *gc); void ofono_gprs_context_set_data(struct ofono_gprs_context *gc, void *data); diff --git a/src/gprs.c b/src/gprs.c index 2f8610f..03066e2 100644 --- a/src/gprs.c +++ b/src/gprs.c @@ -40,6 +40,7 @@ #define GPRS_FLAG_ATTACHING 0x1 static GSList *g_drivers = NULL; +static GSList *g_context_drivers = NULL; enum gprs_context_type { GPRS_CONTEXT_TYPE_INTERNET = 1, @@ -72,6 +73,7 @@ struct ofono_gprs_context { DBusMessage *pending; const struct ofono_gprs_context_driver *driver; void *driver_data; + struct ofono_atom *atom; }; struct pri_context { @@ -1019,6 +1021,92 @@ void ofono_gprs_context_deactivated(struct ofono_gprs_context *gc, unsigned cid) } } +int ofono_gprs_context_driver_register(const struct ofono_gprs_context_driver *d) +{ + DBG("driver: %p, name: %s", d, d->name); + + if (d->probe == NULL) + return -EINVAL; + + g_context_drivers = g_slist_prepend(g_context_drivers, (void *)d); + + return 0; +} + +void ofono_gprs_context_driver_unregister(const struct ofono_gprs_context_driver *d) +{ + DBG("driver: %p, name: %s", d, d->name); + + g_context_drivers = g_slist_remove(g_context_drivers, (void *)d); +} + +static void gprs_context_remove(struct ofono_atom *atom) +{ + struct ofono_gprs_context *gc = __ofono_atom_get_data(atom); + + DBG("atom: %p", atom); + + if (gc == NULL) + return; + + if (gc->driver && gc->driver->remove) + gc->driver->remove(gc); + + if (gc->gprs) + gc->gprs->context_driver = NULL; + + g_free(gc); +} + +struct ofono_gprs_context *ofono_gprs_context_create(struct ofono_modem *modem, + unsigned int vendor, + const char *driver, void *data) +{ + struct ofono_gprs_context *gc; + GSList *l; + + if (driver == NULL) + return NULL; + + gc = g_try_new0(struct ofono_gprs_context, 1); + + if (gc == NULL) + return NULL; + + gc->atom = __ofono_modem_add_atom(modem, OFONO_ATOM_TYPE_GPRS_CONTEXT, + gprs_context_remove, gc); + + for (l = g_drivers; l; l = l->next) { + const struct ofono_gprs_context_driver *drv = l->data; + + if (g_strcmp0(drv->name, driver)) + continue; + + if (drv->probe(gc, vendor, data) < 0) + continue; + + gc->driver = drv; + break; + } + + return gc; +} + +void ofono_gprs_context_remove(struct ofono_gprs_context *gc) +{ + __ofono_atom_free(gc->atom); +} + +void ofono_gprs_context_set_data(struct ofono_gprs_context *gc, void *data) +{ + gc->driver_data = data; +} + +void *ofono_gprs_context_get_data(struct ofono_gprs_context *gc) +{ + return gc->driver_data; +} + int ofono_gprs_driver_register(const struct ofono_gprs_driver *d) { DBG("driver: %p, name: %s", d, d->name); diff --git a/src/ofono.h b/src/ofono.h index aa58a2b..54500d6 100644 --- a/src/ofono.h +++ b/src/ofono.h @@ -108,6 +108,7 @@ enum ofono_atom_type { OFONO_ATOM_TYPE_CBS = 14, OFONO_ATOM_TYPES_CALL_VOLUME = 15, OFONO_ATOM_TYPE_GPRS = 16, + OFONO_ATOM_TYPE_GPRS_CONTEXT = 17, }; enum ofono_atom_watch_condition {