Fix: Handle broken modems that returns empty COPS
authorDenis Kenzior <denkenz@gmail.com>
Tue, 23 Mar 2010 18:43:55 +0000 (13:43 -0500)
committerDenis Kenzior <denkenz@gmail.com>
Wed, 24 Mar 2010 02:16:50 +0000 (21:16 -0500)
src/network.c

index 64178a4..3a9c517 100644 (file)
@@ -423,6 +423,7 @@ static char *get_operator_display_name(struct ofono_netreg *netreg)
        struct network_operator_data *opd = netreg->current_operator;
        const char *plmn;
        static char name[1024];
+       static char mccmnc[OFONO_MAX_MCC_LENGTH + OFONO_MAX_MNC_LENGTH + 1];
        int len = sizeof(name);
        int home_or_spdi;
 
@@ -436,6 +437,16 @@ static char *get_operator_display_name(struct ofono_netreg *netreg)
        }
 
        plmn = opd->name;
+
+       /*
+        * This is a fallback on some really broken hardware which do not
+        * report the COPS name
+        */
+       if (plmn[0] == '\0') {
+               snprintf(mccmnc, sizeof(mccmnc), "%s%s", opd->mcc, opd->mnc);
+               plmn = mccmnc;
+       }
+
        if (opd->eons_info && opd->eons_info->longname)
                plmn = opd->eons_info->longname;
 
@@ -476,6 +487,9 @@ static void set_network_operator_name(struct network_operator_data *opd,
        const char *path;
        const char *operator;
 
+       if (name[0] == '\0')
+               return;
+
        if (!strncmp(opd->name, name, OFONO_MAX_OPERATOR_NAME_LENGTH))
                return;
 
@@ -579,6 +593,7 @@ static DBusMessage *network_operator_get_properties(DBusConnection *conn,
        DBusMessage *reply;
        DBusMessageIter iter;
        DBusMessageIter dict;
+       char mccmnc[OFONO_MAX_MCC_LENGTH + OFONO_MAX_MNC_LENGTH + 1];
 
        const char *name = opd->name;
        const char *status =
@@ -597,6 +612,11 @@ static DBusMessage *network_operator_get_properties(DBusConnection *conn,
                                        OFONO_PROPERTIES_ARRAY_SIGNATURE,
                                        &dict);
 
+       if (name[0] == '\0') {
+               snprintf(mccmnc, sizeof(mccmnc), "%s%s", opd->mcc, opd->mnc);
+               name = mccmnc;
+       }
+
        ofono_dbus_dict_append(&dict, "Name", DBUS_TYPE_STRING, &name);
 
        ofono_dbus_dict_append(&dict, "Status", DBUS_TYPE_STRING, &status);