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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox