Update the AT modem driver to the new devinfo api
authorDenis Kenzior <denkenz@gmail.com>
Thu, 20 Aug 2009 17:45:53 +0000 (12:45 -0500)
committerDenis Kenzior <denkenz@gmail.com>
Thu, 20 Aug 2009 17:48:29 +0000 (12:48 -0500)
drivers/Makefile.am
drivers/atmodem/at.h
drivers/atmodem/atmodem.c
drivers/atmodem/devinfo.c [new file with mode: 0644]

index 9dac55a..69ba411 100644 (file)
@@ -11,7 +11,7 @@ builtin_sources += atmodem/atmodem.c atmodem/at.h \
                        atmodem/network-registration.c atmodem/sim.c \
                        atmodem/ussd.c atmodem/voicecall.c \
                        atmodem/call-barring.c atmodem/phonebook.c \
-                       atmodem/ssn.c
+                       atmodem/ssn.c atmodem/devinfo.c
 
 if COND_ISI
 builtin_modules += isimodem
index 8ec8046..a532812 100644 (file)
@@ -89,3 +89,6 @@ extern void at_phonebook_exit();
 
 extern void at_ssn_init();
 extern void at_ssn_exit();
+
+extern void at_devinfo_init();
+extern void at_devinfo_exit();
index e340f83..445992a 100644 (file)
@@ -37,6 +37,7 @@
 #include <ofono/call-forwarding.h>
 #include <ofono/call-meter.h>
 #include <ofono/call-settings.h>
+#include <ofono/devinfo.h>
 #include <ofono/message-waiting.h>
 #include <ofono/phonebook.h>
 #include <ofono/sim.h>
@@ -45,8 +46,6 @@
 #include <ofono/ussd.h>
 #include <ofono/voicecall.h>
 
-#include "driver.h"
-
 #include "at.h"
 #include "session.h"
 
@@ -133,166 +132,6 @@ static void manager_free(gpointer user)
        g_slist_free(g_sessions);
 }
 
-struct attr_cb_info {
-       ofono_modem_attribute_query_cb_t cb;
-       void *data;
-       const char *prefix;
-};
-
-static inline struct attr_cb_info *attr_cb_info_new(ofono_modem_attribute_query_cb_t cb,
-                                                       void *data,
-                                                       const char *prefix)
-{
-       struct attr_cb_info *ret;
-
-       ret = g_try_new(struct attr_cb_info, 1);
-
-       if (!ret)
-               return ret;
-
-       ret->cb = cb;
-       ret->data = data;
-       ret->prefix = prefix;
-
-       return ret;
-}
-
-static const char *fixup_return(const char *line, const char *prefix)
-{
-       if (g_str_has_prefix(line, prefix) == FALSE)
-               return line;
-
-       line = line + strlen(prefix);
-
-       while (line[0] == ' ')
-               line++;
-
-       return line;
-}
-
-static void attr_cb(gboolean ok, GAtResult *result, gpointer user_data)
-{
-       struct ofono_error error;
-       struct attr_cb_info *info = user_data;
-
-       decode_at_error(&error, g_at_result_final_response(result));
-
-       dump_response("attr_cb", ok, result);
-
-       if (ok) {
-               GAtResultIter iter;
-               const char *line;
-               int i;
-
-               g_at_result_iter_init(&iter, result);
-
-               /* We have to be careful here, sometimes a stray unsolicited
-                * notification will appear as part of the response and we
-                * cannot rely on having a prefix to recognize the actual
-                * response line.  So use the last line only as the response
-                */
-               for (i = 0; i < g_at_result_num_response_lines(result); i++)
-                       g_at_result_iter_next(&iter, NULL);
-
-               line = g_at_result_iter_raw_line(&iter);
-
-               info->cb(&error, fixup_return(line, info->prefix), info->data);
-       } else
-               info->cb(&error, "", info->data);
-}
-
-static void at_query_manufacturer(struct ofono_modem *modem,
-                               ofono_modem_attribute_query_cb_t cb, void *data)
-{
-       struct attr_cb_info *info = attr_cb_info_new(cb, data, "+CGMI:");
-       struct at_data *at = ofono_modem_get_userdata(modem);
-
-       if (!info)
-               goto error;
-
-       if (g_at_chat_send(at->parser, "AT+CGMI", NULL,
-                               attr_cb, info, g_free) > 0)
-               return;
-
-error:
-       if (info)
-               g_free(info);
-
-       {
-               DECLARE_FAILURE(error);
-               cb(&error, NULL, data);
-       }
-}
-
-static void at_query_model(struct ofono_modem *modem,
-                               ofono_modem_attribute_query_cb_t cb, void *data)
-{
-       struct attr_cb_info *info = attr_cb_info_new(cb, data, "+CGMM:");
-       struct at_data *at = ofono_modem_get_userdata(modem);
-
-       if (!info)
-               goto error;
-
-       if (g_at_chat_send(at->parser, "AT+CGMM", NULL,
-                               attr_cb, info, g_free) > 0)
-               return;
-
-error:
-       if (info)
-               g_free(info);
-
-       {
-               DECLARE_FAILURE(error);
-               cb(&error, NULL, data);
-       }
-}
-
-static void at_query_revision(struct ofono_modem *modem,
-                               ofono_modem_attribute_query_cb_t cb, void *data)
-{
-       struct attr_cb_info *info = attr_cb_info_new(cb, data, "+CGMR:");
-       struct at_data *at = ofono_modem_get_userdata(modem);
-
-       if (!info)
-               goto error;
-
-       if (g_at_chat_send(at->parser, "AT+CGMR", NULL,
-                               attr_cb, info, g_free) > 0)
-               return;
-
-error:
-       if (info)
-               g_free(info);
-
-       {
-               DECLARE_FAILURE(error);
-               cb(&error, NULL, data);
-       }
-}
-
-static void at_query_serial(struct ofono_modem *modem,
-                               ofono_modem_attribute_query_cb_t cb, void *data)
-{
-       struct attr_cb_info *info = attr_cb_info_new(cb, data, "+CGSN:");
-       struct at_data *at = ofono_modem_get_userdata(modem);
-
-       if (!info)
-               goto error;
-
-       if (g_at_chat_send(at->parser, "AT+CGSN", NULL,
-                               attr_cb, info, g_free) > 0)
-               return;
-
-error:
-       if (info)
-               g_free(info);
-
-       {
-               DECLARE_FAILURE(error);
-               cb(&error, NULL, data);
-       }
-}
-
 static void send_init_commands(const char *vendor, GAtChat *parser)
 {
        if (!strcmp(vendor, "ti_calypso")) {
@@ -303,13 +142,6 @@ static void send_init_commands(const char *vendor, GAtChat *parser)
        }
 }
 
-static struct ofono_modem_attribute_ops ops = {
-       .query_manufacturer = at_query_manufacturer,
-       .query_model = at_query_model,
-       .query_revision = at_query_revision,
-       .query_serial = at_query_serial
-};
-
 static void msg_destroy(gpointer user)
 {
        DBusMessage *msg = user;
@@ -359,13 +191,14 @@ static void create_cb(GIOChannel *io, gboolean success, gpointer user)
 
        send_init_commands(driver, at->parser);
 
-       at->modem = ofono_modem_register(&ops);
+       at->modem = ofono_modem_register();
 
        if (!at->modem)
                goto out;
 
        ofono_modem_set_userdata(at->modem, at);
 
+       ofono_devinfo_create(at->modem, "generic_at", at->parser);
        ofono_ussd_create(at->modem, "generic_at", at->parser);
        ofono_sim_create(at->modem, "generic_at", at->parser);
        ofono_call_forwarding_create(at->modem, "generic_at", at->parser);
@@ -538,6 +371,7 @@ static int atmodem_init(void)
        DBusConnection *conn = ofono_dbus_get_connection();
 
        at_voicecall_init();
+       at_devinfo_init();
        at_call_barring_init();
        at_call_forwarding_init();
        at_call_meter_init();
@@ -570,6 +404,7 @@ static void atmodem_exit(void)
        at_call_forwarding_exit();
        at_call_barring_exit();
        at_netreg_exit();
+       at_devinfo_exit();
        at_voicecall_exit();
 }
 
diff --git a/drivers/atmodem/devinfo.c b/drivers/atmodem/devinfo.c
new file mode 100644 (file)
index 0000000..ad61e8e
--- /dev/null
@@ -0,0 +1,224 @@
+/*
+ *
+ *  oFono - Open Source Telephony
+ *
+ *  Copyright (C) 2008-2009  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 <glib.h>
+
+#include <ofono/plugin.h>
+#include <ofono/log.h>
+#include <ofono/modem.h>
+#include <ofono/devinfo.h>
+
+#include "gatchat.h"
+#include "gatresult.h"
+
+#include "at.h"
+
+static const char *fixup_return(const char *line, const char *prefix)
+{
+       if (g_str_has_prefix(line, prefix) == FALSE)
+               return line;
+
+       line = line + strlen(prefix);
+
+       while (line[0] == ' ')
+               line++;
+
+       return line;
+}
+
+static void attr_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+       struct cb_data *cbd = user_data;
+       ofono_devinfo_query_cb_t cb = cbd->cb;
+       const char *prefix = cbd->user;
+       struct ofono_error error;
+
+       decode_at_error(&error, g_at_result_final_response(result));
+
+       dump_response("attr_cb", ok, result);
+
+       if (ok) {
+               GAtResultIter iter;
+               const char *line;
+               int i;
+
+               g_at_result_iter_init(&iter, result);
+
+               /* We have to be careful here, sometimes a stray unsolicited
+                * notification will appear as part of the response and we
+                * cannot rely on having a prefix to recognize the actual
+                * response line.  So use the last line only as the response
+                */
+               for (i = 0; i < g_at_result_num_response_lines(result); i++)
+                       g_at_result_iter_next(&iter, NULL);
+
+               line = g_at_result_iter_raw_line(&iter);
+
+               cb(&error, fixup_return(line, prefix), cbd->data);
+       } else
+               cb(&error, "", cbd->data);
+}
+
+static void at_query_manufacturer(struct ofono_devinfo *info,
+                               ofono_devinfo_query_cb_t cb, void *data)
+{
+       struct cb_data *cbd = cb_data_new(cb, data);
+       GAtChat *chat = ofono_devinfo_get_data(info);
+
+       if (!cbd)
+               goto error;
+
+       cbd->user = "+CGMI:";
+
+       if (g_at_chat_send(chat, "AT+CGMI", NULL,
+                               attr_cb, cbd, g_free) > 0)
+               return;
+
+error:
+       if (cbd)
+               g_free(cbd);
+       {
+               DECLARE_FAILURE(error);
+               cb(&error, NULL, data);
+       }
+}
+
+static void at_query_model(struct ofono_devinfo *info,
+                               ofono_devinfo_query_cb_t cb, void *data)
+{
+       struct cb_data *cbd = cb_data_new(cb, data);
+       GAtChat *chat = ofono_devinfo_get_data(info);
+
+       if (!cbd)
+               goto error;
+
+       cbd->user = "+CGMM:";
+
+       if (g_at_chat_send(chat, "AT+CGMM", NULL,
+                               attr_cb, cbd, g_free) > 0)
+               return;
+
+error:
+       if (cbd)
+               g_free(cbd);
+
+       {
+               DECLARE_FAILURE(error);
+               cb(&error, NULL, data);
+       }
+}
+
+static void at_query_revision(struct ofono_devinfo *info,
+                               ofono_devinfo_query_cb_t cb, void *data)
+{
+       struct cb_data *cbd = cb_data_new(cb, data);
+       GAtChat *chat = ofono_devinfo_get_data(info);
+
+       if (!cbd)
+               goto error;
+
+       cbd->user = "+CGMR:";
+
+       if (g_at_chat_send(chat, "AT+CGMR", NULL,
+                               attr_cb, cbd, g_free) > 0)
+               return;
+
+error:
+       if (cbd)
+               g_free(cbd);
+
+       {
+               DECLARE_FAILURE(error);
+               cb(&error, NULL, data);
+       }
+}
+
+static void at_query_serial(struct ofono_devinfo *info,
+                               ofono_devinfo_query_cb_t cb, void *data)
+{
+       struct cb_data *cbd = cb_data_new(cb, data);
+       GAtChat *chat = ofono_devinfo_get_data(info);
+
+       if (!cbd)
+               goto error;
+
+       cbd->user = "+CGSN:";
+
+       if (g_at_chat_send(chat, "AT+CGSN", NULL,
+                               attr_cb, cbd, g_free) > 0)
+               return;
+
+error:
+       if (cbd)
+               g_free(cbd);
+
+       {
+               DECLARE_FAILURE(error);
+               cb(&error, NULL, data);
+       }
+}
+
+static gboolean at_devinfo_register(gpointer user_data)
+{
+       struct ofono_devinfo *info = user_data;
+
+       ofono_devinfo_register(info);
+
+       return FALSE;
+}
+
+static int at_devinfo_probe(struct ofono_devinfo *info)
+{
+       /* There are no useful initializations we can do */
+       g_timeout_add(0, at_devinfo_register, info);
+
+       return 0;
+}
+
+static int at_devinfo_remove(struct ofono_devinfo *info)
+{
+       return 0;
+}
+
+static struct ofono_devinfo_driver driver = {
+       .name = "generic_at",
+       .probe = at_devinfo_probe,
+       .remove = at_devinfo_remove,
+       .query_manufacturer = at_query_manufacturer,
+       .query_model = at_query_model,
+       .query_revision = at_query_revision,
+       .query_serial = at_query_serial
+};
+
+void at_devinfo_init(void)
+{
+       ofono_devinfo_driver_register(&driver);
+}
+
+void at_devinfo_exit(void)
+{
+       ofono_devinfo_driver_unregister(&driver);
+}