Hi Bertrand,
> Makefile.am | 6 +-
> include/cdma-netreg.h | 63 +++++++++++++
> include/dbus.h | 2 +
> src/cdma-netreg.c | 233
> +++++++++++++++++++++++++++++++++++++++++++++++++
> src/ofono.h | 2 +
> 5 files changed, 303 insertions(+), 3 deletions(-)
> create mode 100644 include/cdma-netreg.h
> create mode 100644 src/cdma-netreg.c
I prefer to keep include/dbus.h changes in a separate patch.
> diff --git a/Makefile.am b/Makefile.am
> index d44e62b..837d374 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -16,8 +16,8 @@ pkginclude_HEADERS = include/log.h include/plugin.h
> include/history.h \
> include/cdma-sms.h include/sim-auth.h \
> include/gprs-provision.h include/emulator.h \
> include/location-reporting.h \
> - include/cdma-connman.h include/gnss.h \
> - include/private-network.h
> + include/cdma-connman.h include/cdma-netreg.h \
> + include/gnss.h include/private-network.h
>
> nodist_pkginclude_HEADERS = include/version.h
>
> @@ -410,7 +410,7 @@ src_ofonod_SOURCES = $(gdbus_sources) $(builtin_sources)
> src/ofono.ver \
> src/cdma-connman.c src/gnss.c \
> src/gnssagent.c src/gnssagent.h \
> src/cdma-smsutil.h src/cdma-smsutil.c \
> - src/cdma-sms.c src/private-network.c
> + src/cdma-sms.c src/cdma-netreg.c src/private-network.c
>
> src_ofonod_LDADD = $(builtin_libadd) @GLIB_LIBS@ @DBUS_LIBS@ @CAPNG_LIBS@
> -ldl
>
> diff --git a/include/cdma-netreg.h b/include/cdma-netreg.h
> new file mode 100644
> index 0000000..36f8593
> --- /dev/null
> +++ b/include/cdma-netreg.h
> @@ -0,0 +1,63 @@
> +/*
> + *
> + * oFono - Open Source Telephony
> + *
> + * Copyright (C) 2008-2011 Intel Corporation. All rights reserved.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
> USA
> + *
> + */
> +
> +#ifndef __OFONO_CDMA_NETREG_H
> +#define __OFONO_CDMA_NETREG_H
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +#include <ofono/types.h>
> +
> +struct ofono_cdma_netreg;
> +
> +struct ofono_cdma_netreg_driver {
> + const char *name;
> + int (*probe)(struct ofono_cdma_netreg *cdma_netreg, unsigned int vendor,
> + void *data);
> + void (*remove)(struct ofono_cdma_netreg *cdma_netreg);
> +};
> +
> +void ofono_cdma_netreg_status_notify(struct ofono_cdma_netreg *netreg,
> + int status);
> +
> +int ofono_cdma_netreg_driver_register(const struct ofono_cdma_netreg_driver
> *d);
> +void ofono_cdma_netreg_driver_unregister(const struct
> ofono_cdma_netreg_driver *d);
> +
> +struct ofono_cdma_netreg *ofono_cdma_netreg_create(struct ofono_modem *modem,
> + unsigned int vendor,
> + const char *driver,
> + void *data);
> +
> +void ofono_cdma_netreg_register(struct ofono_cdma_netreg *cdma_netreg);
> +void ofono_cdma_netreg_remove(struct ofono_cdma_netreg *cdma_netreg);
> +
> +void ofono_cdma_netreg_set_data(struct ofono_cdma_netreg *cdma_netreg, void
> *data);
> +void *ofono_cdma_netreg_get_data(struct ofono_cdma_netreg *cdma_netreg);
> +
> +int ofono_cdma_netreg_get_status(struct ofono_cdma_netreg *netreg);
If you wanna put in a basic skeleton first, then that is fine, but then
please leave details like status out of it.
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* __OFONO_CDMA_NETREG_H */
> diff --git a/include/dbus.h b/include/dbus.h
> index 4dd9db5..65bda72 100644
> --- a/include/dbus.h
> +++ b/include/dbus.h
> @@ -63,6 +63,8 @@ extern "C" {
> #define OFONO_CDMA_VOICECALL_MANAGER_INTERFACE
> "org.ofono.cdma.VoiceCallManager"
> #define OFONO_CDMA_MESSAGE_MANAGER_INTERFACE "org.ofono.cdma.MessageManager"
> #define OFONO_CDMA_CONNECTION_MANAGER_INTERFACE
> "org.ofono.cdma.ConnectionManager"
> +#define OFONO_CDMA_NETWORK_REGISTRATION_INTERFACE \
> + "org.ofono.cdma.NetworkRegistration"
As mentioned above, separate patch.
>
> /* Essentially a{sv} */
> #define OFONO_PROPERTIES_ARRAY_SIGNATURE
> DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING \
> diff --git a/src/cdma-netreg.c b/src/cdma-netreg.c
> new file mode 100644
> index 0000000..c19a861
> --- /dev/null
> +++ b/src/cdma-netreg.c
> @@ -0,0 +1,233 @@
> +/*
> + *
> + * oFono - Open Source Telephony
> + *
> + * Copyright (C) 2008-2011 Intel Corporation. All rights reserved.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
> + *
> + */
> +
> +#ifdef HAVE_CONFIG_H
> +#include <config.h>
> +#endif
> +
> +#include <string.h>
> +#include <stdio.h>
> +#include <errno.h>
> +
> +#include <glib.h>
> +#include <gdbus.h>
> +#include <sys/time.h>
Please keep the includes to a minimum that is required.
> +
> +#include "ofono.h"
> +#include "common.h"
What is common.h doing here?
> +
> +static GSList *g_drivers;
> +
> +struct ofono_cdma_netreg {
> + int status;
Leave status out for a skeleton.
> + const struct ofono_cdma_netreg_driver *driver;
> + void *driver_data;
> + struct ofono_atom *atom;
> +};
> +
> +static DBusMessage *network_get_properties(DBusConnection *conn,
> + DBusMessage *msg, void *data)
> +{
> + struct ofono_cdma_netreg *netreg = data;
> + DBusMessage *reply;
> + DBusMessageIter iter;
> + DBusMessageIter dict;
> +
> + const char *status = registration_status_to_string(netreg->status);
I am not sure that using the GSM counterpart is such a good idea here.
> +
> + reply = dbus_message_new_method_return(msg);
> + if (reply == NULL)
> + return NULL;
> +
> + dbus_message_iter_init_append(reply, &iter);
> +
> + dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
> + OFONO_PROPERTIES_ARRAY_SIGNATURE,
> + &dict);
> +
> + ofono_dbus_dict_append(&dict, "Status", DBUS_TYPE_STRING, &status);
> +
> + dbus_message_iter_close_container(&iter, &dict);
> +
> + return reply;
> +}
> +
> +static GDBusMethodTable cdma_netreg_manager_methods[] = {
> + /* TODO */
> + { "GetProperties", "", "a{sv}", network_get_properties },
> + { }
> +};
> +
> +static GDBusSignalTable cdma_netreg_manager_signals[] = {
> + /* TODO */
> + { }
> +};
Both TODOs are a bad idea. I rather implement it and have it fail with
an error not implemented than having weird TODO entries here.
> +
> +static void set_registration_status(struct ofono_cdma_netreg *netreg,
> + int status)
> +{
> + const char *str_status = registration_status_to_string(status);
> + const char *path = __ofono_atom_get_path(netreg->atom);
> + DBusConnection *conn = ofono_dbus_get_connection();
> +
> + netreg->status = status;
> +
> + ofono_dbus_signal_property_changed(conn, path,
> + OFONO_CDMA_NETWORK_REGISTRATION_INTERFACE,
> + "Status", DBUS_TYPE_STRING, &str_status);
> +}
> +
> +void ofono_cdma_netreg_status_notify(struct ofono_cdma_netreg *netreg,
> + int status)
> +{
> + if (netreg == NULL)
> + return;
> +
> + if (netreg->status != status)
> + set_registration_status(netreg, status);
> +}
> +
> +int ofono_cdma_netreg_get_status(struct ofono_cdma_netreg *netreg)
> +{
> + if (netreg == NULL)
> + return -1;
> +
> + return netreg->status;
> +}
> +
> +int ofono_cdma_netreg_driver_register(const struct ofono_cdma_netreg_driver
> *d)
> +{
> + DBG("driver: %p, name: %s", d, d->name);
> +
> + if (d->probe == NULL)
> + return -EINVAL;
> +
> + g_drivers = g_slist_prepend(g_drivers, (void *)d);
> +
> + return 0;
> +}
> +
> +void ofono_cdma_netreg_driver_unregister(const struct
> ofono_cdma_netreg_driver *d)
> +{
> + DBG("driver: %p, name: %s", d, d->name);
> +
> + g_drivers = g_slist_remove(g_drivers, (void *)d);
> +}
> +
> +static void cdma_netreg_unregister(struct ofono_atom *atom)
> +{
> + DBusConnection *conn = ofono_dbus_get_connection();
> + struct ofono_modem *modem = __ofono_atom_get_modem(atom);
> + const char *path = __ofono_atom_get_path(atom);
> +
> + g_dbus_unregister_interface(conn, path,
> + OFONO_CDMA_NETWORK_REGISTRATION_INTERFACE);
> +
> + ofono_modem_remove_interface(modem,
> + OFONO_CDMA_NETWORK_REGISTRATION_INTERFACE);
> +}
> +
> +static void cdma_netreg_remove(struct ofono_atom *atom)
> +{
> + struct ofono_cdma_netreg *cdma_netreg = __ofono_atom_get_data(atom);
> +
> + DBG("atom: %p", atom);
> +
> + if (cdma_netreg == NULL)
> + return;
> +
> + if (cdma_netreg->driver && cdma_netreg->driver->remove)
> + cdma_netreg->driver->remove(cdma_netreg);
> +
> + g_free(cdma_netreg);
> +}
> +
> +struct ofono_cdma_netreg *ofono_cdma_netreg_create(struct ofono_modem *modem,
> + unsigned int vendor,
> + const char *driver,
> + void *data)
> +{
> + struct ofono_cdma_netreg *cdma_netreg;
> + GSList *l;
> +
> + if (driver == NULL)
> + return NULL;
> +
> + cdma_netreg = g_try_new0(struct ofono_cdma_netreg, 1);
> + if (cdma_netreg == NULL)
> + return NULL;
> +
> + cdma_netreg->atom = __ofono_modem_add_atom(modem,
> + OFONO_ATOM_TYPE_CDMA_NETREG,
> + cdma_netreg_remove, cdma_netreg);
> +
> + for (l = g_drivers; l; l = l->next) {
> + const struct ofono_cdma_netreg_driver *drv = l->data;
> +
> + if (g_strcmp0(drv->name, driver))
> + continue;
> +
> + if (drv->probe(cdma_netreg, vendor, data) < 0)
> + continue;
> +
> + cdma_netreg->driver = drv;
> + break;
> + }
> +
> + return cdma_netreg;
> +}
> +
> +void ofono_cdma_netreg_register(struct ofono_cdma_netreg *cdma_netreg)
> +{
> + DBusConnection *conn = ofono_dbus_get_connection();
> + struct ofono_modem *modem = __ofono_atom_get_modem(cdma_netreg->atom);
> + const char *path = __ofono_atom_get_path(cdma_netreg->atom);
> +
> + if (!g_dbus_register_interface(conn, path,
> + OFONO_CDMA_NETWORK_REGISTRATION_INTERFACE,
> + cdma_netreg_manager_methods,
> + cdma_netreg_manager_signals,
> + NULL, cdma_netreg, NULL)) {
> + ofono_error("Could not create %s interface",
> + OFONO_CDMA_NETWORK_REGISTRATION_INTERFACE);
> + return;
> + }
> +
> + ofono_modem_add_interface(modem,
> + OFONO_CDMA_NETWORK_REGISTRATION_INTERFACE);
> +
> + __ofono_atom_register(cdma_netreg->atom, cdma_netreg_unregister);
> +}
> +
> +void ofono_cdma_netreg_remove(struct ofono_cdma_netreg *cdma_netreg)
> +{
> + __ofono_atom_free(cdma_netreg->atom);
> +}
> +
> +void ofono_cdma_netreg_set_data(struct ofono_cdma_netreg *cdma_netreg, void
> *data)
> +{
> + cdma_netreg->driver_data = data;
> +}
> +
> +void *ofono_cdma_netreg_get_data(struct ofono_cdma_netreg *cdma_netreg)
> +{
> + return cdma_netreg->driver_data;
> +}
The rest is a 1:1 copy of the GSM netreg atom anyway.
> diff --git a/src/ofono.h b/src/ofono.h
> index 6524806..3de3052 100644
> --- a/src/ofono.h
> +++ b/src/ofono.h
> @@ -135,6 +135,7 @@ enum ofono_atom_type {
> OFONO_ATOM_TYPE_LOCATION_REPORTING,
> OFONO_ATOM_TYPE_GNSS,
> OFONO_ATOM_TYPE_CDMA_SMS,
> + OFONO_ATOM_TYPE_CDMA_NETREG
> };
Please do this in a separate patch. Same as with the D-Bus stuff.
>
> enum ofono_atom_watch_condition {
> @@ -474,6 +475,7 @@ void __ofono_gprs_provision_free_settings(
> #include <ofono/emulator.h>
> #include <ofono/gnss.h>
> #include <ofono/cdma-sms.h>
> +#include <ofono/cdma-netreg.h>
> #include <ofono/private-network.h>
>
> void __ofono_private_network_release(int id);
Regards
Marcel
_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono