{
gint fd;
gchar *filepath = NULL;
- gchar *tmpdir, *tmp;
+ gchar *tmpdir;
guint hash_number;
/* hmmm... maybe we need a modest_text_utils_validate_file_name? */
return NULL;
}
- if (g_strstr_len (orig_name, strlen(orig_name), "/") != NULL) {
+ if (g_strstr_len (orig_name, strlen (orig_name), "/") != NULL) {
g_warning ("%s: filename contains '/' character(s) (%s)",
__FUNCTION__, orig_name);
return NULL;
return NULL;
}
- tmp = g_uri_escape_string (orig_name, NULL, FALSE);
- filepath = g_build_filename (tmpdir, tmp, NULL);
- g_free (tmp);
+ filepath = g_build_filename (tmpdir, orig_name, NULL);
/* if file exists, first we try to remove it */
if (g_access (filepath, F_OK) == 0)
}
FILE*
-modest_utils_open_mcc_mapping_file (gboolean from_lc_messages, gboolean *translated)
+modest_utils_open_mcc_mapping_file (void)
{
FILE* result = NULL;
const gchar* path;
- const gchar *env_list;
- gchar **parts, **node;
- if (from_lc_messages) {
- env_list = setlocale (LC_MESSAGES, NULL);
+ if (access (MODEST_OPERATOR_WIZARD_MCC_MAPPING, R_OK) == 0) {
+ path = MODEST_OPERATOR_WIZARD_MCC_MAPPING;
+ } else if (access (MODEST_MCC_MAPPING, R_OK) == 0) {
+ path = MODEST_MCC_MAPPING;
} else {
- env_list = getenv ("LANG");
- }
- parts = g_strsplit (env_list, ":", 0);
- gchar *path1 = NULL;
- const gchar* path2 = MODEST_MCC_MAPPING;
-
- if (translated)
- *translated = TRUE;
-
- path = NULL;
- for (node = parts; path == NULL && node != NULL && *node != NULL && **node != '\0'; node++) {
- path1 = g_strdup_printf ("%s.%s", MODEST_OPERATOR_WIZARD_MCC_MAPPING, *node);
- if (access (path1, R_OK) == 0) {
- path = path1;
- break;
- } else {
- g_free (path1);
- path1 = NULL;
- }
- }
- g_strfreev (parts);
-
- if (path == NULL) {
- if (access (MODEST_OPERATOR_WIZARD_MCC_MAPPING, R_OK) == 0) {
- path = MODEST_OPERATOR_WIZARD_MCC_MAPPING;
- if (translated)
- *translated = FALSE;
- } else if (access (path2, R_OK) == 0) {
- path = path2;
- } else {
- g_warning ("%s: neither '%s' nor '%s' is a readable mapping file",
- __FUNCTION__, path1, path2);
- goto end;
- }
+ g_warning ("%s: neither '%s' nor '%s' is a readable mapping file",
+ __FUNCTION__, MODEST_OPERATOR_WIZARD_MCC_MAPPING, MODEST_MCC_MAPPING);
+ return NULL;
}
result = fopen (path, "r");
if (!result) {
g_warning ("%s: error opening mapping file '%s': %s",
__FUNCTION__, path, strerror(errno));
- goto end;
}
- end:
- g_free (path1);
- return result;
-}
-/* cluster mcc's, based on the list
- * http://en.wikipedia.org/wiki/Mobile_country_code
- */
-static int
-effective_mcc (gint mcc)
-{
- switch (mcc) {
- case 405: return 404; /* india */
- case 441: return 440; /* japan */
- case 235: return 234; /* united kingdom */
- case 311:
- case 312:
- case 313:
- case 314:
- case 315:
- case 316: return 310; /* united states */
- default: return mcc;
- }
+ return result;
}
/* each line is of the form:
NOTE: this function is NOT re-entrant, the out-param country
are static strings that should NOT be freed. and will change when
calling this function again
-
- also note, this function will return the "effective mcc", which
- is the normalized mcc for a country - ie. even if the there
- are multiple entries for the United States with various mccs,
- this function will always return 310, even if the real mcc parsed
- would be 314. see the 'effective_mcc' function above.
*/
static int
parse_mcc_mapping_line (const char* line, char** country)
*country = g_utf8_find_next_char (tab, NULL);
/* Replace by end of string. We need to use strlen, because
- g_utf8_strrchr expects bytes and not UTF8 characters */
- final = g_utf8_strrchr (tab, strlen (tab) + 1, '\n');
+ g_utf8_strrchr expects bytes and not UTF8 characters. File
+ lines end with \r\n */
+ final = g_utf8_strrchr (tab, strlen (tab) + 1, '\r');
if (G_LIKELY (final))
*final = '\0';
else
mcc[2] = g_utf8_get_char (iter);
mcc[3] = '\0';
- return effective_mcc ((int) strtol ((const char*)mcc, NULL, 10));
+ return (int) strtol ((const char*)mcc, NULL, 10);
}
#define MCC_FILE_MAX_LINE_LEN 128 /* max length of a line in MCC file */
void
modest_utils_fill_country_model (GtkTreeModel *model, gint *locale_mcc)
{
- gboolean translated;
char line[MCC_FILE_MAX_LINE_LEN];
guint previous_mcc = 0;
gchar *territory;
FILE *file;
/* First we need to know our current region */
- file = modest_utils_open_mcc_mapping_file (FALSE, &translated);
+ file = modest_utils_open_mcc_mapping_file ();
if (!file) {
g_warning ("Could not open mcc_mapping file");
return;
}
/* Get the territory specified for the current locale */
- territory = nl_langinfo (_NL_ADDRESS_COUNTRY_NAME);
+ territory = nl_langinfo (_NL_IDENTIFICATION_TERRITORY);
+
+ setlocale (LC_MESSAGES, "en_GB");
while (fgets (line, MCC_FILE_MAX_LINE_LEN, file) != NULL) {
int mcc;
previous_mcc = mcc;
if (!(*locale_mcc)) {
- if (translated) {
- if (!g_utf8_collate (country, territory))
- *locale_mcc = mcc;
- } else {
- gchar *translation = dgettext ("osso-countries", country);
- if (!g_utf8_collate (translation, territory))
- *locale_mcc = mcc;
- }
+ gchar *translation = dgettext ("osso-countries", country);
+ if (!g_utf8_collate (translation, territory))
+ *locale_mcc = mcc;
}
}
- fclose (file);
- /* Now we fill the model */
- file = modest_utils_open_mcc_mapping_file (TRUE, &translated);
- if (!file) {
- g_warning ("Could not open mcc_mapping file");
- return;
- }
+ setlocale (LC_MESSAGES, "");
+ /* Now we fill the model */
+ rewind (file);
country_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
while (fgets (line, MCC_FILE_MAX_LINE_LEN, file) != NULL) {
name_translated = dgettext ("osso-countries", country);
- /* Add the row to the model: */
- gtk_list_store_append (GTK_LIST_STORE (model), &iter);
- gtk_list_store_set(GTK_LIST_STORE (model), &iter,
- MODEST_UTILS_COUNTRY_MODEL_COLUMN_MCC, mcc,
- MODEST_UTILS_COUNTRY_MODEL_COLUMN_NAME, name_translated,
- -1);
+ /* Add the row to the model if we have translation for it */
+ if (g_utf8_collate (country, name_translated)) {
+ gtk_list_store_append (GTK_LIST_STORE (model), &iter);
+ gtk_list_store_set(GTK_LIST_STORE (model), &iter,
+ MODEST_UTILS_COUNTRY_MODEL_COLUMN_MCC, mcc,
+ MODEST_UTILS_COUNTRY_MODEL_COLUMN_NAME, name_translated,
+ -1);
+ } else {
+ g_debug ("%s no translation for %s", __FUNCTION__, country);
+ }
}