/* This function converts a range_t to a (ep_alloc()-allocated) string. */ char * range_convert_range(range_t *range) { guint32 i; gboolean prepend_comma = FALSE; emem_strbuf_t *strbuf; strbuf=ep_strbuf_new(NULL); for (i=0; i < range->nranges; i++) { if (range->ranges[i].low == range->ranges[i].high) { ep_strbuf_append_printf(strbuf, "%s%u", prepend_comma?",":"", range->ranges[i].low); } else { ep_strbuf_append_printf(strbuf, "%s%u-%u", prepend_comma?",":"", range->ranges[i].low, range->ranges[i].high); } prepend_comma = TRUE; } return strbuf->str; }
const gchar * profile_name_is_valid(const gchar *name) { gchar *reason = NULL; emem_strbuf_t *message = ep_strbuf_new(NULL); #ifdef _WIN32 char *invalid_dir_char = "\\/:*?\"<>|"; gboolean invalid = FALSE; int i; for (i = 0; i < 9; i++) { if (strchr(name, invalid_dir_char[i])) { /* Invalid character in directory */ invalid = TRUE; } } if (name[0] == '.' || name[strlen(name)-1] == '.') { /* Profile name cannot start or end with period */ invalid = TRUE; } if (invalid) { reason = g_strdup_printf("start or end with period (.), or contain any of the following characters:\n" " \\ / : * ? \" < > |"); } #else if (strchr(name, '/')) { /* Invalid character in directory */ reason = g_strdup_printf("contain the '/' character."); } #endif if (reason) { ep_strbuf_printf(message, "A profile name cannot %s\nProfiles unchanged.", reason); g_free(reason); return message->str; } return NULL; }
const gchar *apply_profile_changes(void) { char *pf_dir_path, *pf_dir_path2, *pf_filename; GList *fl1, *fl2; profile_def *profile1, *profile2; gboolean found; emem_strbuf_t *message = ep_strbuf_new(NULL); const gchar *err_msg; /* First validate all profile names */ fl1 = edited_profile_list(); while (fl1) { profile1 = (profile_def *) fl1->data; g_strstrip(profile1->name); if ((err_msg = profile_name_is_valid(profile1->name)) != NULL) { ep_strbuf_printf(message, "%s", err_msg); return message->str; } fl1 = g_list_next(fl1); } /* Then do all copy profiles */ fl1 = edited_profile_list(); while (fl1) { profile1 = (profile_def *) fl1->data; g_strstrip(profile1->name); if (profile1->status == PROF_STAT_COPY) { if (create_persconffile_profile(profile1->name, &pf_dir_path) == -1) { ep_strbuf_printf(message, "Can't create directory\n\"%s\":\n%s.", pf_dir_path, g_strerror(errno)); g_free(pf_dir_path); } profile1->status = PROF_STAT_EXISTS; if (profile1->reference) { if (copy_persconffile_profile(profile1->name, profile1->reference, profile1->from_global, &pf_filename, &pf_dir_path, &pf_dir_path2) == -1) { simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Can't copy file \"%s\" in directory\n\"%s\" to\n\"%s\":\n%s.", pf_filename, pf_dir_path2, pf_dir_path, g_strerror(errno)); g_free(pf_filename); g_free(pf_dir_path); g_free(pf_dir_path2); } } g_free (profile1->reference); profile1->reference = g_strdup(profile1->name); } fl1 = g_list_next(fl1); } /* Then create new and rename changed */ fl1 = edited_profile_list(); while (fl1) { profile1 = (profile_def *) fl1->data; g_strstrip(profile1->name); if (profile1->status == PROF_STAT_NEW) { /* We do not create a directory for the default profile */ if (strcmp(profile1->name, DEFAULT_PROFILE)!=0) { if (create_persconffile_profile(profile1->name, &pf_dir_path) == -1) { simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Can't create directory\n\"%s\":\n%s.", pf_dir_path, g_strerror(errno)); g_free(pf_dir_path); } profile1->status = PROF_STAT_EXISTS; g_free (profile1->reference); profile1->reference = g_strdup(profile1->name); } } else if (profile1->status == PROF_STAT_CHANGED) { if (strcmp(profile1->reference, profile1->name)!=0) { /* Rename old profile directory to new */ if (rename_persconffile_profile(profile1->reference, profile1->name, &pf_dir_path, &pf_dir_path2) == -1) { simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Can't rename directory\n\"%s\" to\n\"%s\":\n%s.", pf_dir_path, pf_dir_path2, g_strerror(errno)); g_free(pf_dir_path); g_free(pf_dir_path2); } profile1->status = PROF_STAT_EXISTS; g_free (profile1->reference); profile1->reference = g_strdup(profile1->name); } } fl1 = g_list_next(fl1); } /* Last remove deleted */ fl1 = current_profile_list(); while (fl1) { found = FALSE; profile1 = (profile_def *) fl1->data; fl2 = edited_profile_list(); while (fl2) { profile2 = (profile_def *) fl2->data; if (!profile2->is_global) { if (strcmp(profile1->name, profile2->name)==0) { /* Profile exists in both lists */ found = TRUE; } else if (strcmp(profile1->name, profile2->reference)==0) { /* Profile has been renamed */ found = TRUE; } } fl2 = g_list_next(fl2); } if (!found) { /* Exists in existing list and not in edited, this is a deleted profile */ if (delete_persconffile_profile(profile1->name, &pf_dir_path) == -1) { simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Can't delete profile directory\n\"%s\":\n%s.", pf_dir_path, g_strerror(errno)); g_free(pf_dir_path); } } fl1 = g_list_next(fl1); } copy_profile_list(); return NULL; }