diff options
author | Denis Kenzior <denis.kenzior@intel.com> | 2009-10-23 11:14:55 -0500 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2009-10-23 17:05:56 -0500 |
commit | a3b736afe5be1c09b8777be1ccf5e2c7bbbb2b8a (patch) | |
tree | 02ad426304ca9ed778e191ca0622842ada84a493 | |
parent | fa800e58522fe7141e2a5d672a0266b7a4d47559 (diff) | |
download | ofono-a3b736afe5be1c09b8777be1ccf5e2c7bbbb2b8a.tar.bz2 |
Add implementation of GPRS context atom
-rw-r--r-- | include/gprs-context.h | 3 | ||||
-rw-r--r-- | src/gprs.c | 88 | ||||
-rw-r--r-- | src/ofono.h | 1 |
3 files changed, 90 insertions, 2 deletions
diff --git a/include/gprs-context.h b/include/gprs-context.h index 1ceb19bf..c4ebd231 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); @@ -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 aa58a2b1..54500d66 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 { |