/** * Write a single attachment to file * \param filename Filename with path * \param partinfo Attachment to save */ static gboolean mimeview_write_part(const gchar *filename, MimeInfo *partinfo) { gchar *dir; dir= g_dirname(filename); if (!is_dir_exist(dir)) make_dir_hier(dir); g_free(dir); if (is_file_exist(filename)) { AlertValue aval; gchar *res; res = g_strdup_printf(_("Overwrite existing file '%s'?"), filename); aval = alertpanel(_("Overwrite"), res, _("OK"), _("Cancel"), NULL); g_free(res); if (G_ALERTDEFAULT != aval) return FALSE; } if (procmime_get_part(filename, partinfo) < 0) { alertpanel_error (_("Can't save the part of multipart message.")); return FALSE; } return TRUE; }
static gchar *mh_get_new_msg_filename(FolderItem *dest) { gchar *destfile; gchar *destpath; destpath = folder_item_get_path(dest); cm_return_val_if_fail(destpath != NULL, NULL); if (!is_dir_exist(destpath)) make_dir_hier(destpath); for (;;) { destfile = g_strdup_printf("%s%c%d", destpath, G_DIR_SEPARATOR, dest->last_num + 1); if (is_file_entry_exist(destfile)) { dest->last_num++; g_free(destfile); } else break; } g_free(destpath); return destfile; }
static gint mh_rename_folder(Folder *folder, FolderItem *item, const gchar *name) { gchar *real_name; gchar *oldpath; gchar *dirname; gchar *newpath, *utf8newpath; gchar *paths[2]; cm_return_val_if_fail(folder != NULL, -1); cm_return_val_if_fail(item != NULL, -1); cm_return_val_if_fail(item->path != NULL, -1); cm_return_val_if_fail(name != NULL, -1); oldpath = folder_item_get_path(item); if (!is_dir_exist(oldpath)) make_dir_hier(oldpath); dirname = g_path_get_dirname(oldpath); real_name = mh_filename_from_utf8(name); newpath = g_strconcat(dirname, G_DIR_SEPARATOR_S, real_name, NULL); g_free(real_name); if (g_rename(oldpath, newpath) < 0) { FILE_OP_ERROR(oldpath, "rename"); g_free(oldpath); g_free(newpath); return -1; } g_free(oldpath); g_free(newpath); if (strchr(item->path, G_DIR_SEPARATOR) != NULL) { dirname = g_path_get_dirname(item->path); utf8newpath = g_strconcat(dirname, G_DIR_SEPARATOR_S, name, NULL); g_free(dirname); } else utf8newpath = g_strdup(name); g_free(item->name); item->name = g_strdup(name); paths[0] = g_strdup(item->path); paths[1] = utf8newpath; g_node_traverse(item->node, G_PRE_ORDER, G_TRAVERSE_ALL, -1, mh_rename_folder_func, paths); g_free(paths[0]); g_free(paths[1]); return 0; }
static FolderItem *mh_create_folder(Folder *folder, FolderItem *parent, const gchar *name) { gchar *path, *real_name; gchar *fullpath; FolderItem *new_item; gchar *mh_sequences_filename; FILE *mh_sequences_file; cm_return_val_if_fail(folder != NULL, NULL); cm_return_val_if_fail(parent != NULL, NULL); cm_return_val_if_fail(name != NULL, NULL); path = folder_item_get_path(parent); if (!is_dir_exist(path)) if (make_dir_hier(path) != 0) return NULL; real_name = mh_filename_from_utf8(name); fullpath = g_strconcat(path, G_DIR_SEPARATOR_S, real_name, NULL); g_free(real_name); g_free(path); if (make_dir(fullpath) < 0) { g_free(fullpath); return NULL; } g_free(fullpath); if (parent->path) path = g_strconcat(parent->path, G_DIR_SEPARATOR_S, name, NULL); else path = g_strdup(name); new_item = folder_item_new(folder, name, path); folder_item_append(parent, new_item); g_free(path); path = folder_item_get_path(new_item); mh_sequences_filename = g_strconcat(path, G_DIR_SEPARATOR_S, ".mh_sequences", NULL); if ((mh_sequences_file = g_fopen(mh_sequences_filename, "a+b")) != NULL) { fclose(mh_sequences_file); } g_free(mh_sequences_filename); g_free(path); return new_item; }
static gchar *news_fetch_msg(Folder *folder, FolderItem *item, gint num) { gchar *path, *filename; NewsSession *session; gint ok; cm_return_val_if_fail(folder != NULL, NULL); cm_return_val_if_fail(item != NULL, NULL); path = folder_item_get_path(item); if (!is_dir_exist(path)) make_dir_hier(path); filename = g_strconcat(path, G_DIR_SEPARATOR_S, itos(num), NULL); g_free(path); if (is_file_exist(filename)) { debug_print("article %d has been already cached.\n", num); return filename; } session = news_session_get(folder); if (!session) { g_free(filename); return NULL; } ok = news_select_group(folder, item->path, NULL, NULL, NULL); if (ok != NEWSNNTP_NO_ERROR) { if (ok == NEWSNNTP_ERROR_STREAM) { session_destroy(SESSION(session)); REMOTE_FOLDER(folder)->session = NULL; } g_free(filename); return NULL; } debug_print("getting article %d...\n", num); ok = news_get_article(folder, num, filename); if (ok != NEWSNNTP_NO_ERROR) { g_warning("can't read article %d", num); if (ok == NEWSNNTP_ERROR_STREAM) { session_destroy(SESSION(session)); REMOTE_FOLDER(folder)->session = NULL; } g_free(filename); return NULL; } GTK_EVENTS_FLUSH(); return filename; }
static int news_remove_msg (Folder *folder, FolderItem *item, gint msgnum) { gchar *path, *filename; cm_return_val_if_fail(folder != NULL, -1); cm_return_val_if_fail(item != NULL, -1); path = folder_item_get_path(item); if (!is_dir_exist(path)) make_dir_hier(path); filename = g_strconcat(path, G_DIR_SEPARATOR_S, itos(msgnum), NULL); g_free(path); claws_unlink(filename); g_free(filename); return 0; }
static gint news_rename_folder(Folder *folder, FolderItem *item, const gchar *name) { gchar *path; cm_return_val_if_fail(folder != NULL, -1); cm_return_val_if_fail(item != NULL, -1); cm_return_val_if_fail(item->path != NULL, -1); cm_return_val_if_fail(name != NULL, -1); path = folder_item_get_path(item); if (!is_dir_exist(path)) make_dir_hier(path); g_free(item->name); item->name = g_strdup(name); return 0; }
gint syl_setup_rc_dir(void) { if (!is_dir_exist(get_rc_dir())) { if (make_dir_hier(get_rc_dir()) < 0) return -1; } MAKE_DIR_IF_NOT_EXIST(get_mail_base_dir()); CHDIR_RETURN_VAL_IF_FAIL(get_rc_dir(), -1); MAKE_DIR_IF_NOT_EXIST(get_imap_cache_dir()); MAKE_DIR_IF_NOT_EXIST(get_news_cache_dir()); MAKE_DIR_IF_NOT_EXIST(get_mime_tmp_dir()); MAKE_DIR_IF_NOT_EXIST(get_tmp_dir()); MAKE_DIR_IF_NOT_EXIST(UIDL_DIR); MAKE_DIR_IF_NOT_EXIST(PLUGIN_DIR); /* remove temporary files */ remove_all_files(get_tmp_dir()); remove_all_files(get_mime_tmp_dir()); return 0; }
static void prefs_themes_btn_install_clicked_cb(GtkWidget *widget, gpointer data) { gchar *filename, *source; gchar *themeinfo, *themename; gchar *alert_title = NULL; CopyInfo *cinfo; AlertValue val = 0; ThemesData *tdata = prefs_themes_data; filename = filesel_select_file_open_folder(_("Select theme folder"), NULL); if (filename == NULL) return; if (filename[strlen(filename) - 1] != G_DIR_SEPARATOR) filename = g_strconcat(filename, G_DIR_SEPARATOR_S, NULL); else filename = g_strdup(filename); cinfo = g_new0(CopyInfo, 1); source = g_path_get_dirname(filename); themename = g_path_get_basename(source); debug_print("Installing '%s' theme from %s\n", themename, filename); themeinfo = g_strconcat(source, G_DIR_SEPARATOR_S, THEMEINFO_FILE, NULL); alert_title = g_strdup_printf(_("Install theme '%s'"), themename); if (file_exist(themeinfo, FALSE) == FALSE) { val = alertpanel(alert_title, _("This folder doesn't seem to be a theme folder.\nInstall anyway?"), GTK_STOCK_NO, GTK_STOCK_YES, NULL); if (G_ALERTALTERNATE != val) goto end_inst; } if (superuser_p ()) { val = alertpanel(alert_title, _("Do you want to install theme for all users?"), GTK_STOCK_NO, GTK_STOCK_YES, NULL); switch (val) { case G_ALERTALTERNATE: cinfo->dest = stock_pixmap_get_system_theme_dir_for_theme( themename); break; case G_ALERTDEFAULT: break; default: goto end_inst; } } g_free(alert_title); if (cinfo->dest == NULL) { cinfo->dest = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, PIXMAP_THEME_DIR, G_DIR_SEPARATOR_S, themename, NULL); } if (TRUE == is_dir_exist(cinfo->dest)) { AlertValue val = alertpanel_full(_("Theme exists"), _("A theme with the same name is\nalready installed in this location.\n\n" "Do you want to replace it?"), GTK_STOCK_CANCEL, _("Overwrite"), NULL, FALSE, NULL, ALERT_WARNING, G_ALERTDEFAULT); if (val == G_ALERTALTERNATE) { if (remove_dir_recursive(cinfo->dest) < 0) { alertpanel_error(_("Couldn't delete the old theme in %s."), cinfo->dest); goto end_inst; } } else { goto end_inst; } } if (0 != make_dir_hier(cinfo->dest)) { alertpanel_error(_("Couldn't create destination directory %s."), cinfo->dest); goto end_inst; } prefs_themes_foreach_file(source, prefs_themes_file_install, cinfo); if (cinfo->status == NULL) { GList *insted; /* update interface to show newly installed theme */ prefs_themes_get_themes_and_names(tdata); insted = g_list_find_custom(tdata->themes, (gpointer)(cinfo->dest), (GCompareFunc)strcmp2); if (NULL != insted) { alertpanel_notice(_("Theme installed successfully.")); tdata->displayed = (gchar *)(insted->data); prefs_themes_set_themes_menu(GTK_COMBO_BOX(tdata->page->op_menu), tdata); prefs_themes_display_global_stats(tdata); prefs_themes_get_theme_info(tdata); } else alertpanel_error(_("Failed installing theme")); } else alertpanel_error(_("File %s failed\nwhile installing theme."), cinfo->status); end_inst: g_free(cinfo->dest); g_free(filename); g_free(source); g_free(themeinfo); g_free(cinfo); g_free(themename); }
GSList *news_get_group_list(Folder *folder) { gchar *path, *filename; FILE *fp; GSList *list = NULL; GSList *last = NULL; gchar buf[BUFFSIZE]; cm_return_val_if_fail(folder != NULL, NULL); cm_return_val_if_fail(FOLDER_CLASS(folder) == &news_class, NULL); path = folder_item_get_path(FOLDER_ITEM(folder->node->data)); if (!is_dir_exist(path)) make_dir_hier(path); filename = g_strconcat(path, G_DIR_SEPARATOR_S, NEWSGROUP_LIST, NULL); g_free(path); if ((fp = g_fopen(filename, "rb")) == NULL) { NewsSession *session; gint ok; clist *grouplist = NULL; clistiter *cur; fp = g_fopen(filename, "wb"); if (!fp) { g_free(filename); return NULL; } session = news_session_get(folder); if (!session) { fclose(fp); g_free(filename); return NULL; } ok = nntp_threaded_list(folder, &grouplist); if (ok != NEWSNNTP_NO_ERROR) { if (ok == NEWSNNTP_ERROR_STREAM) { session_destroy(SESSION(session)); REMOTE_FOLDER(folder)->session = NULL; } fclose(fp); g_free(filename); return NULL; } if (grouplist) { for (cur = clist_begin(grouplist); cur; cur = clist_next(cur)) { struct newsnntp_group_info *info = (struct newsnntp_group_info *) clist_content(cur); if (fprintf(fp, "%s %d %d %c\n", info->grp_name, info->grp_last, info->grp_first, info->grp_type) < 0) { log_error(LOG_PROTOCOL, ("Can't write newsgroup list\n")); session_destroy(SESSION(session)); REMOTE_FOLDER(folder)->session = NULL; fclose(fp); g_free(filename); newsnntp_list_free(grouplist); return NULL; } } newsnntp_list_free(grouplist); } if (fclose(fp) == EOF) { log_error(LOG_PROTOCOL, ("Can't write newsgroup list\n")); session_destroy(SESSION(session)); REMOTE_FOLDER(folder)->session = NULL; g_free(filename); return NULL; } if ((fp = g_fopen(filename, "rb")) == NULL) { FILE_OP_ERROR(filename, "fopen"); g_free(filename); return NULL; } } while (fgets(buf, sizeof(buf), fp) != NULL) { gchar *p = buf; gchar *name; gint last_num; gint first_num; gchar type; NewsGroupInfo *ginfo; p = strchr(p, ' '); if (!p) continue; *p = '\0'; p++; name = buf; if (sscanf(p, "%d %d %c", &last_num, &first_num, &type) < 3) continue; ginfo = news_group_info_new(name, first_num, last_num, type); if (!last) last = list = g_slist_append(NULL, ginfo); else { last = g_slist_append(last, ginfo); last = last->next; } } fclose(fp); g_free(filename); list = g_slist_sort(list, (GCompareFunc)news_group_info_compare); return list; }