summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAki Niemi <aki.niemi@nokia.com>2009-06-12 10:02:52 +0300
committerDenis Kenzior <denkenz@gmail.com>2009-06-12 11:01:19 -0500
commitba8828c095d72fb628fa418b1aa082a765d5d0a3 (patch)
tree5ba65ff096eb2f4317f2cf7cec586fb560deb753 /src
parent683b00de1bc7afb80bad8e1ce13269b84247baa5 (diff)
downloadofono-ba8828c095d72fb628fa418b1aa082a765d5d0a3.tar.bz2
Change MNC and MCC variable types to string
This is to make sure both 2 and 3-digit MNC values are correctly handled. Both the modem plugin API as well as the D-Bus API are affected.
Diffstat (limited to 'src')
-rw-r--r--src/driver.h7
-rw-r--r--src/network.c48
2 files changed, 24 insertions, 31 deletions
diff --git a/src/driver.h b/src/driver.h
index 61504dd4..f753c7f5 100644
--- a/src/driver.h
+++ b/src/driver.h
@@ -74,10 +74,13 @@ struct ofono_call {
* */
#define OFONO_MAX_OPERATOR_NAME_LENGTH 63
+/* MCC is always three digits. MNC is either two or three digits */
+#define OFONO_MAX_MNC_MCC_LENGTH 3
+
struct ofono_network_operator {
char name[OFONO_MAX_OPERATOR_NAME_LENGTH + 1];
- short mcc;
- short mnc;
+ char mcc[OFONO_MAX_MNC_MCC_LENGTH + 1];
+ char mnc[OFONO_MAX_MNC_MCC_LENGTH + 1];
int status;
int tech;
};
diff --git a/src/network.c b/src/network.c
index f797165d..aa13077f 100644
--- a/src/network.c
+++ b/src/network.c
@@ -180,8 +180,9 @@ static void network_operator_populate_registered(struct ofono_modem *modem,
int modem_len;
int num_children;
GSList *l;
- int *mccmnc;
char path[MAX_DBUS_PATH_LEN];
+ char mnc[4];
+ char mcc[4];
modem_len = snprintf(path, MAX_DBUS_PATH_LEN, "%s/operator",
modem->path);
@@ -199,10 +200,6 @@ static void network_operator_populate_registered(struct ofono_modem *modem,
*network_operators = g_try_new0(char *, num_children + 1);
- mccmnc = g_try_new0(int, num_children * 2);
- for (i = 0; i < num_children; i++)
- sscanf(children[i], "%3d%3d", &mccmnc[i*2], &mccmnc[i*2+1]);
-
/* Quoting 27.007: "The list of operators shall be in order: home
* network, networks referenced in SIM or active application in the
* UICC (GSM or USIM) in the following order: HPLMN selector, User
@@ -217,18 +214,17 @@ static void network_operator_populate_registered(struct ofono_modem *modem,
int j;
for (j = 0; children[j]; j++) {
- if (op->mcc == mccmnc[j*2] && op->mnc == mccmnc[j*2+1]) {
- /* Enough to store '/' + 3 char wide MCC + 3 char wide MNC + null */
- (*network_operators)[i] = g_try_new(char, modem_len + 8);
- snprintf((*network_operators)[i], modem_len + 8, "%s/%s",
+ sscanf(children[j], "%3[0-9]%[0-9]", mcc, mnc);
+ if (strcmp(op->mcc, mcc) == 0 && strcmp(op->mnc, mnc) == 0) {
+ /* Enough to store '/' + MCC + '_' + MNC + null */
+ (*network_operators)[i] = g_try_new(char, modem_len + 9);
+ snprintf((*network_operators)[i], modem_len + 9, "%s/%s",
path, children[j]);
++i;
}
}
}
- g_free(mccmnc);
-
dbus_free_string_array(children);
}
@@ -244,19 +240,13 @@ static gint network_operator_compare(gconstpointer a, gconstpointer b)
const struct ofono_network_operator *opa = a;
const struct ofono_network_operator *opb = b;
- if (opa->mcc < opb->mcc)
- return -1;
+ int comp1;
+ int comp2;
- if (opa->mcc > opb->mcc)
- return 1;
+ comp1 = strcmp(opa->mcc, opb->mcc);
+ comp2 = strcmp(opa->mnc, opb->mnc);
- if (opa->mnc < opb->mnc)
- return -1;
-
- if (opa->mnc > opb->mnc)
- return 1;
-
- return 0;
+ return comp1 != 0 ? comp1 : comp2;
}
static inline const char *network_operator_build_path(struct ofono_modem *modem,
@@ -264,7 +254,7 @@ static inline const char *network_operator_build_path(struct ofono_modem *modem,
{
static char path[MAX_DBUS_PATH_LEN];
- snprintf(path, MAX_DBUS_PATH_LEN, "%s/operator/%03d%03d",
+ snprintf(path, MAX_DBUS_PATH_LEN, "%s/operator/%s%s",
modem->path, oper->mcc, oper->mnc);
return path;
@@ -427,16 +417,16 @@ static DBusMessage *network_operator_get_properties(DBusConnection *conn,
dbus_gsm_dict_append(&dict, "Status", DBUS_TYPE_STRING, &status);
- if (op->operator->mcc != -1) {
- dbus_uint16_t mcc = op->operator->mcc;
+ if (*op->operator->mcc != '\0') {
+ const char *mcc = op->operator->mcc;
dbus_gsm_dict_append(&dict, "MobileCountryCode",
- DBUS_TYPE_UINT16, &mcc);
+ DBUS_TYPE_STRING, &mcc);
}
- if (op->operator->mnc != -1) {
- dbus_uint16_t mnc = op->operator->mnc;
+ if (*op->operator->mnc != '\0') {
+ const char *mnc = op->operator->mnc;
dbus_gsm_dict_append(&dict, "MobileNetworkCode",
- DBUS_TYPE_UINT16, &mnc);
+ DBUS_TYPE_STRING, &mnc);
}
if (op->operator->tech != -1) {