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

Reply via email to