From: Philippe Nunes <philippe.nunes@linux.intel.com>
To: ofono@ofono.org
Subject: [PATCH v2 1/6] mbpi: Add mbpi_lookup_cdma_provider_name API
Date: Thu, 17 Nov 2011 17:20:59 +0100 [thread overview]
Message-ID: <1321546864-368-2-git-send-email-philippe.nunes@linux.intel.com> (raw)
In-Reply-To: <1321546864-368-1-git-send-email-philippe.nunes@linux.intel.com>
[-- Attachment #1: Type: text/plain, Size: 5409 bytes --]
---
plugins/mbpi.c | 146 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
plugins/mbpi.h | 2 +
2 files changed, 148 insertions(+), 0 deletions(-)
diff --git a/plugins/mbpi.c b/plugins/mbpi.c
index 1e41ecb..415633f 100644
--- a/plugins/mbpi.c
+++ b/plugins/mbpi.c
@@ -58,6 +58,12 @@ struct gsm_data {
gboolean allow_duplicates;
};
+struct cdma_data {
+ const char *match_sid;
+ char *provider_name;
+ gboolean match_found;
+};
+
const char *mbpi_ap_type(enum ofono_gprs_context_type type)
{
switch (type) {
@@ -281,6 +287,32 @@ static void apn_handler(GMarkupParseContext *context, struct gsm_data *gsm,
g_markup_parse_context_push(context, &apn_parser, ap);
}
+static void sid_handler(GMarkupParseContext *context,
+ struct cdma_data *cdma,
+ const gchar **attribute_names,
+ const gchar **attribute_values,
+ GError **error)
+{
+ const char *sid = NULL;
+ int i;
+
+ for (i = 0; attribute_names[i]; i++)
+ if (g_str_equal(attribute_names[i], "value") == TRUE) {
+ sid = attribute_values[i];
+ break;
+ }
+
+ if (sid == NULL) {
+ mbpi_g_set_error(context, error, G_MARKUP_ERROR,
+ G_MARKUP_ERROR_MISSING_ATTRIBUTE,
+ "Missing attribute: sid");
+ return;
+ }
+
+ if (g_str_equal(sid, cdma->match_sid))
+ cdma->match_found = TRUE;
+}
+
static void gsm_start(GMarkupParseContext *context, const gchar *element_name,
const gchar **attribute_names,
const gchar **attribute_values,
@@ -347,6 +379,71 @@ static const GMarkupParser gsm_parser = {
NULL,
};
+static void cdma_start(GMarkupParseContext *context, const gchar *element_name,
+ const gchar **attribute_names,
+ const gchar **attribute_values,
+ gpointer userdata, GError **error)
+{
+ if (g_str_equal(element_name, "sid")) {
+ struct cdma_data *cdma = userdata;
+ /*
+ * For entries with multiple sid elements, don't bother
+ * searching if we already have a match
+ */
+ if (cdma->match_found == TRUE)
+ return;
+
+ sid_handler(context, cdma, attribute_names, attribute_values,
+ error);
+ }
+}
+
+static const GMarkupParser cdma_parser = {
+ cdma_start,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+};
+
+static void provider_start(GMarkupParseContext *context,
+ const gchar *element_name,
+ const gchar **attribute_names,
+ const gchar **attribute_values,
+ gpointer userdata, GError **error)
+{
+ if (g_str_equal(element_name, "name")) {
+ struct cdma_data *cdma = userdata;
+
+ g_free(cdma->provider_name);
+ cdma->provider_name = NULL;
+ g_markup_parse_context_push(context, &text_parser,
+ &cdma->provider_name);
+ } else if (g_str_equal(element_name, "gsm"))
+ g_markup_parse_context_push(context, &skip_parser, NULL);
+ else if (g_str_equal(element_name, "cdma"))
+ g_markup_parse_context_push(context, &cdma_parser, userdata);
+}
+
+static void provider_end(GMarkupParseContext *context,
+ const gchar *element_name,
+ gpointer userdata, GError **error)
+{
+ if (g_str_equal(element_name, "name") ||
+ g_str_equal(element_name, "gsm") ||
+ g_str_equal(element_name, "cdma"))
+ g_markup_parse_context_pop(context);
+
+}
+
+static const GMarkupParser provider_parser = {
+ provider_start,
+ provider_end,
+ NULL,
+ NULL,
+ NULL,
+};
+
static void toplevel_gsm_start(GMarkupParseContext *context,
const gchar *element_name,
const gchar **atribute_names,
@@ -379,6 +476,40 @@ static const GMarkupParser toplevel_gsm_parser = {
NULL,
};
+static void toplevel_cdma_start(GMarkupParseContext *context,
+ const gchar *element_name,
+ const gchar **atribute_names,
+ const gchar **attribute_values,
+ gpointer userdata, GError **error)
+{
+ struct cdma_data *cdma = userdata;
+
+ if (g_str_equal(element_name, "provider")) {
+ if (cdma->match_found == TRUE)
+ g_markup_parse_context_push(context, &skip_parser,
+ NULL);
+ else
+ g_markup_parse_context_push(context, &provider_parser,
+ userdata);
+ }
+}
+
+static void toplevel_cdma_end(GMarkupParseContext *context,
+ const gchar *element_name,
+ gpointer userdata, GError **error)
+{
+ if (g_str_equal(element_name, "provider"))
+ g_markup_parse_context_pop(context);
+}
+
+static const GMarkupParser toplevel_cdma_parser = {
+ toplevel_cdma_start,
+ toplevel_cdma_end,
+ NULL,
+ NULL,
+ NULL,
+};
+
static gboolean mbpi_parse(const GMarkupParser *parser, gpointer userdata,
GError **error)
{
@@ -453,3 +584,18 @@ GSList *mbpi_lookup_apn(const char *mcc, const char *mnc,
return gsm.apns;
}
+
+char *mbpi_lookup_cdma_provider_name(const char *sid, GError **error)
+{
+ struct cdma_data cdma;
+
+ memset(&cdma, 0, sizeof(cdma));
+ cdma.match_sid = sid;
+
+ if (mbpi_parse(&toplevel_cdma_parser, &cdma, error) == FALSE) {
+ g_free(cdma.provider_name);
+ cdma.provider_name = NULL;
+ }
+
+ return cdma.provider_name;
+}
diff --git a/plugins/mbpi.h b/plugins/mbpi.h
index 6d34358..64b7ea5 100644
--- a/plugins/mbpi.h
+++ b/plugins/mbpi.h
@@ -25,3 +25,5 @@ void mbpi_ap_free(struct ofono_gprs_provision_data *data);
GSList *mbpi_lookup_apn(const char *mcc, const char *mnc,
gboolean allow_duplicates, GError **error);
+
+char *mbpi_lookup_cdma_provider_name(const char *sid, GError **error);
--
1.7.1
next prev parent reply other threads:[~2011-11-17 16:20 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-11-17 16:20 [PATCH v2 0/6] Add a parser to retrieve the CDMA network name Philippe Nunes
2011-11-17 16:20 ` Philippe Nunes [this message]
2011-11-16 10:28 ` [PATCH v2 1/6] mbpi: Add mbpi_lookup_cdma_provider_name API Denis Kenzior
2011-11-17 16:21 ` [PATCH v2 2/6] tools: Add utility for looking CDMA network name from database Philippe Nunes
2011-11-16 10:28 ` Denis Kenzior
2011-11-17 16:21 ` [PATCH v2 3/6] Huaweicdmamodem: remove this specific driver Philippe Nunes
2011-11-17 16:21 ` [PATCH v2 4/6] huaweicdmamodem: Merge this driver with cdmamodem driver Philippe Nunes
2011-11-17 16:21 ` [PATCH v2 5/6] cdmamodem: Add CDMA network-registration support Philippe Nunes
2011-11-17 16:21 ` [PATCH v2 6/6] cdmamodem: Add serving system identifier support Philippe Nunes
2011-11-16 10:26 ` Denis Kenzior
2011-11-18 13:18 ` Philippe Nunes
2011-11-18 15:18 ` Denis Kenzior
2011-11-24 17:35 ` Philippe Nunes
2011-11-24 7:03 ` Denis Kenzior
2011-11-25 16:31 ` Philippe Nunes
2011-11-24 23:35 ` Denis Kenzior
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1321546864-368-2-git-send-email-philippe.nunes@linux.intel.com \
--to=philippe.nunes@linux.intel.com \
--cc=ofono@ofono.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.