[network-manager-applet/NMA_0_8_1] gsm/cdma: MCC/MNC and SID are provider properties, not method ones
- From: Dan Williams <dcbw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [network-manager-applet/NMA_0_8_1] gsm/cdma: MCC/MNC and SID are provider properties, not method ones
- Date: Mon, 12 Jul 2010 17:39:02 +0000 (UTC)
commit 40de79aa5be5797690ed9dfe0d300eaaecaf0433
Author: Dan Williams <dcbw redhat com>
Date: Mon Jul 12 12:35:44 2010 -0700
gsm/cdma: MCC/MNC and SID are provider properties, not method ones
And some providers can have roaming-only networks without native
service, thus would have an MCC/MNC which we'd like to use, but
won't have an APN. The MCC/MNC and SID are really provider/network
properties, not plan/APN properties.
As a bonus, this patch saves memory because the MCC/MNC list doesn't
have to be copied for each plan.
src/applet-device-cdma.c | 17 +++------
src/applet-device-gsm.c | 46 ++++++++++--------------
src/utils/nmn-mobile-providers.c | 70 ++++++++++++++------------------------
src/utils/nmn-mobile-providers.h | 9 ++---
4 files changed, 55 insertions(+), 87 deletions(-)
---
diff --git a/src/applet-device-cdma.c b/src/applet-device-cdma.c
index f80034b..e4a401b 100644
--- a/src/applet-device-cdma.c
+++ b/src/applet-device-cdma.c
@@ -683,7 +683,7 @@ find_provider_for_sid (GHashTable *table, guint32 sid)
{
GHashTableIter iter;
gpointer value;
- GSList *miter, *piter, *siter;
+ GSList *piter, *siter;
char *name = NULL;
if (sid == 0)
@@ -698,16 +698,11 @@ find_provider_for_sid (GHashTable *table, guint32 sid)
for (piter = providers; piter && !name; piter = g_slist_next (piter)) {
NmnMobileProvider *provider = piter->data;
- /* Search through each provider's access methods */
- for (miter = provider->methods; miter && !name; miter = g_slist_next (miter)) {
- NmnMobileAccessMethod *method = miter->data;
-
- /* Search through CDMA SID list */
- for (siter = method->cdma_sid; siter; siter = g_slist_next (siter)) {
- if (GPOINTER_TO_UINT (siter->data) == sid) {
- name = g_strdup (provider->name);
- break;
- }
+ /* Search through CDMA SID list */
+ for (siter = provider->cdma_sid; siter; siter = g_slist_next (siter)) {
+ if (GPOINTER_TO_UINT (siter->data) == sid) {
+ name = g_strdup (provider->name);
+ break;
}
}
}
diff --git a/src/applet-device-gsm.c b/src/applet-device-gsm.c
index 939a4a7..27cfb67 100644
--- a/src/applet-device-gsm.c
+++ b/src/applet-device-gsm.c
@@ -1059,7 +1059,7 @@ find_provider_for_mcc_mnc (GHashTable *table, const char *mccmnc)
{
GHashTableIter iter;
gpointer value;
- GSList *miter, *piter, *siter;
+ GSList *piter, *siter;
const char *name2 = NULL, *name3 = NULL;
gboolean done = FALSE;
@@ -1075,36 +1075,28 @@ find_provider_for_mcc_mnc (GHashTable *table, const char *mccmnc)
for (piter = providers; piter && !done; piter = g_slist_next (piter)) {
NmnMobileProvider *provider = piter->data;
- /* Search through each provider's access methods */
- for (miter = provider->methods; miter && !done; miter = g_slist_next (miter)) {
- NmnMobileAccessMethod *method = miter->data;
+ /* Search through MCC/MNC list */
+ for (siter = provider->gsm_mcc_mnc; siter; siter = g_slist_next (siter)) {
+ NmnGsmMccMnc *mcc = siter->data;
- if (method->type != NMN_MOBILE_ACCESS_METHOD_TYPE_GSM)
- continue;
+ /* Match both 2-digit and 3-digit MNC; prefer a
+ * 3-digit match if found, otherwise a 2-digit one.
+ */
+ if (strncmp (mcc->mcc, mccmnc, 3))
+ continue; /* MCC was wrong */
- /* Search through MCC/MNC list */
- for (siter = method->gsm_mcc_mnc; siter; siter = g_slist_next (siter)) {
- NmnGsmMccMnc *mcc = siter->data;
+ if ( !name3
+ && (strlen (mccmnc) == 6)
+ && !strncmp (mccmnc + 3, mcc->mnc, 3))
+ name3 = provider->name;
- /* Match both 2-digit and 3-digit MNC; prefer a
- * 3-digit match if found, otherwise a 2-digit one.
- */
- if (strncmp (mcc->mcc, mccmnc, 3))
- continue; /* MCC was wrong */
+ if ( !name2
+ && !strncmp (mccmnc + 3, mcc->mnc, 2))
+ name2 = provider->name;
- if ( !name3
- && (strlen (mccmnc) == 6)
- && !strncmp (mccmnc + 3, mcc->mnc, 3))
- name3 = provider->name;
-
- if ( !name2
- && !strncmp (mccmnc + 3, mcc->mnc, 2))
- name2 = provider->name;
-
- if (name2 && name3) {
- done = TRUE;
- break;
- }
+ if (name2 && name3) {
+ done = TRUE;
+ break;
}
}
}
diff --git a/src/utils/nmn-mobile-providers.c b/src/utils/nmn-mobile-providers.c
index 7252512..4cb8286 100644
--- a/src/utils/nmn-mobile-providers.c
+++ b/src/utils/nmn-mobile-providers.c
@@ -18,7 +18,7 @@
* Copyright (C) 2009 Novell, Inc.
* Author: Tambet Ingo (tambet gmail com).
*
- * Copyright (C) 2009 Red Hat, Inc.
+ * Copyright (C) 2009 - 2010 Red Hat, Inc.
*/
#include <string.h>
@@ -120,7 +120,6 @@ typedef struct {
GSList *current_providers;
NmnMobileProvider *current_provider;
NmnMobileAccessMethod *current_method;
- GSList *mcc_mncs;
char *text_buffer;
MobileContextState state;
@@ -146,20 +145,6 @@ mcc_mnc_free (NmnGsmMccMnc *m)
g_slice_free (NmnGsmMccMnc, m);
}
-static GSList *
-mcc_mnc_list_copy (GSList *list)
-{
- GSList *iter, *ret = NULL;
-
- for (iter = list; iter; iter = g_slist_next (iter)) {
- NmnGsmMccMnc *m = iter->data;
-
- ret = g_slist_prepend (ret, mcc_mnc_new (m->mcc, m->mnc));
- }
-
- return g_slist_reverse (ret);
-}
-
static NmnMobileAccessMethod *
access_method_new (void)
{
@@ -201,11 +186,6 @@ nmn_mobile_access_method_unref (NmnMobileAccessMethod *method)
g_slist_foreach (method->dns, (GFunc) g_free, NULL);
g_slist_free (method->dns);
- g_slist_foreach (method->gsm_mcc_mnc, (GFunc) mcc_mnc_free, NULL);
- g_slist_free (method->gsm_mcc_mnc);
-
- g_slist_free (method->cdma_sid);
-
g_slice_free (NmnMobileAccessMethod, method);
}
}
@@ -256,6 +236,11 @@ nmn_mobile_provider_unref (NmnMobileProvider *provider)
g_slist_foreach (provider->methods, (GFunc) nmn_mobile_access_method_unref, NULL);
g_slist_free (provider->methods);
+ g_slist_foreach (provider->gsm_mcc_mnc, (GFunc) mcc_mnc_free, NULL);
+ g_slist_free (provider->gsm_mcc_mnc);
+
+ g_slist_free (provider->cdma_sid);
+
g_slice_free (NmnMobileProvider, provider);
}
}
@@ -352,9 +337,9 @@ parser_provider_start (MobileParser *parser,
static void
parser_gsm_start (MobileParser *parser,
- const char *name,
- const char **attribute_names,
- const char **attribute_values)
+ const char *name,
+ const char **attribute_names,
+ const char **attribute_values)
{
if (!strcmp (name, "network-id")) {
const char *mcc = NULL, *mnc = NULL;
@@ -367,7 +352,8 @@ parser_gsm_start (MobileParser *parser,
mnc = attribute_values[i];
if (mcc && strlen (mcc) && mnc && strlen (mnc)) {
- parser->mcc_mncs = g_slist_append (parser->mcc_mncs, mcc_mnc_new (mcc, mnc));
+ parser->current_provider->gsm_mcc_mnc = g_slist_prepend (parser->current_provider->gsm_mcc_mnc,
+ mcc_mnc_new (mcc, mnc));
break;
}
}
@@ -402,8 +388,8 @@ parser_cdma_start (MobileParser *parser,
errno = 0;
tmp = strtoul (attribute_values[i], NULL, 10);
if (errno == 0 && tmp > 0)
- parser->current_method->cdma_sid = g_slist_prepend (parser->current_method->cdma_sid,
- GUINT_TO_POINTER ((guint32) tmp));
+ parser->current_provider->cdma_sid = g_slist_prepend (parser->current_provider->cdma_sid,
+ GUINT_TO_POINTER ((guint32) tmp));
break;
}
}
@@ -472,6 +458,9 @@ parser_provider_end (MobileParser *parser,
} else if (!strcmp (name, "provider")) {
parser->current_provider->methods = g_slist_reverse (parser->current_provider->methods);
+ parser->current_provider->gsm_mcc_mnc = g_slist_reverse (parser->current_provider->gsm_mcc_mnc);
+ parser->current_provider->cdma_sid = g_slist_reverse (parser->current_provider->cdma_sid);
+
parser->current_providers = g_slist_prepend (parser->current_providers, parser->current_provider);
parser->current_provider = NULL;
parser->text_buffer = NULL;
@@ -484,9 +473,6 @@ parser_gsm_end (MobileParser *parser,
const char *name)
{
if (!strcmp (name, "gsm")) {
- g_slist_foreach (parser->mcc_mncs, (GFunc) mcc_mnc_free, NULL);
- g_slist_free (parser->mcc_mncs);
- parser->mcc_mncs = NULL;
parser->text_buffer = NULL;
parser->state = PARSER_PROVIDER;
}
@@ -517,7 +503,6 @@ parser_gsm_apn_end (MobileParser *parser,
} else if (!strcmp (name, "apn")) {
parser->current_method->type = NMN_MOBILE_ACCESS_METHOD_TYPE_GSM;
parser->current_method->dns = g_slist_reverse (parser->current_method->dns);
- parser->current_method->gsm_mcc_mnc = mcc_mnc_list_copy (parser->mcc_mncs);
if (!parser->current_method->name)
parser->current_method->name = g_strdup (_("Default"));
@@ -549,7 +534,6 @@ parser_cdma_end (MobileParser *parser,
} else if (!strcmp (name, "cdma")) {
parser->current_method->type = NMN_MOBILE_ACCESS_METHOD_TYPE_CDMA;
parser->current_method->dns = g_slist_reverse (parser->current_method->dns);
- parser->current_method->cdma_sid = g_slist_reverse (parser->current_method->cdma_sid);
if (!parser->current_method->name)
parser->current_method->name = g_strdup (parser->current_provider->name);
@@ -717,29 +701,17 @@ dump_generic (NmnMobileAccessMethod *method)
static void
dump_cdma (NmnMobileAccessMethod *method)
{
- GSList *iter;
-
g_print (" CDMA: %s\n", method->name);
dump_generic (method);
-
- for (iter = method->cdma_sid; iter; iter = g_slist_next (iter))
- g_print (" SID: %d\n", GPOINTER_TO_UINT (iter->data));
}
static void
dump_gsm (NmnMobileAccessMethod *method)
{
- GSList *iter;
-
g_print (" APN: %s (%s)\n", method->name, method->gsm_apn);
dump_generic (method);
-
- for (iter = method->gsm_mcc_mnc; iter; iter = g_slist_next (iter)) {
- NmnGsmMccMnc *m = iter->data;
- g_print (" MCC/MNC: %s-%s\n", m->mcc, m->mnc);
- }
}
static void
@@ -753,6 +725,16 @@ dump_country (gpointer key, gpointer value, gpointer user_data)
g_print ("Provider: %s (%s)\n", provider->name, (const char *) key);
for (miter = provider->methods; miter; miter = g_slist_next (miter)) {
NmnMobileAccessMethod *method = miter->data;
+ GSList *liter;
+
+
+ for (liter = provider->gsm_mcc_mnc; liter; liter = g_slist_next (liter)) {
+ NmnGsmMccMnc *m = liter->data;
+ g_print (" MCC/MNC: %s-%s\n", m->mcc, m->mnc);
+ }
+
+ for (liter = provider->cdma_sid; liter; liter = g_slist_next (liter))
+ g_print (" SID: %d\n", GPOINTER_TO_UINT (liter->data));
switch (method->type) {
case NMN_MOBILE_ACCESS_METHOD_TYPE_CDMA:
diff --git a/src/utils/nmn-mobile-providers.h b/src/utils/nmn-mobile-providers.h
index d3ba215..584a7f0 100644
--- a/src/utils/nmn-mobile-providers.h
+++ b/src/utils/nmn-mobile-providers.h
@@ -18,7 +18,7 @@
* Copyright (C) 2009 Novell, Inc.
* Author: Tambet Ingo (tambet gmail com).
*
- * Copyright (C) 2009 Red Hat, Inc.
+ * Copyright (C) 2009 - 2010 Red Hat, Inc.
*/
#ifndef NMN_MOBILE_PROVIDERS_H
@@ -53,10 +53,6 @@ typedef struct {
/* Only used with NMN_PROVIDER_TYPE_GSM */
char *gsm_apn;
- GSList *gsm_mcc_mnc; /* GSList of NmnGsmMccMnc */
-
- /* Only used with NMN_PROVIDER_TYPE_CDMA */
- GSList *cdma_sid; /* GSList of guint32 */
NmnMobileAccessMethodType type;
@@ -70,6 +66,9 @@ typedef struct {
GSList *methods; /* GSList of NmnMobileAccessMethod */
+ GSList *gsm_mcc_mnc; /* GSList of NmnGsmMccMnc */
+ GSList *cdma_sid; /* GSList of guint32 */
+
gint refs;
} NmnMobileProvider;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]