[network-manager-applet/NMA_0_8_1] gsm/cdma: MCC/MNC and SID are provider properties, not method ones



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]