void mimeview_save_part_as(MimeView *mimeview, MimeInfo *partinfo) { gchar *filename = NULL; g_return_if_fail(partinfo != NULL); if (!mimeview->messageview->file) return; if (partinfo->filename) { filename = filesel_save_as(partinfo->filename); } else if (partinfo->name) { gchar *defname; defname = g_strdup(partinfo->name); subst_for_filename(defname); filename = filesel_save_as(defname); g_free(defname); } else filename = filesel_save_as(NULL); if (!filename) return; if (procmime_get_part(filename, mimeview->messageview->file, partinfo) < 0) alertpanel_error (_("Can't save the part of multipart message.")); g_free(filename); }
gchar *partial_get_filename(const gchar *server, const gchar *login, const gchar *muidl) { gchar *path; gchar *result = NULL; FILE *fp; gchar buf[POPBUFSIZE]; gchar uidl[POPBUFSIZE]; time_t recv_time; time_t now; gchar *sanitized_uid = g_strdup(login); subst_for_filename(sanitized_uid); path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, "uidl", G_DIR_SEPARATOR_S, server, "-", sanitized_uid, NULL); if ((fp = g_fopen(path, "rb")) == NULL) { if (ENOENT != errno) FILE_OP_ERROR(path, "fopen"); g_free(path); path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, "uidl-", server, "-", sanitized_uid, NULL); if ((fp = g_fopen(path, "rb")) == NULL) { if (ENOENT != errno) FILE_OP_ERROR(path, "fopen"); g_free(sanitized_uid); g_free(path); return result; } } g_free(sanitized_uid); g_free(path); now = time(NULL); while (fgets(buf, sizeof(buf), fp) != NULL) { gchar tmp[POPBUFSIZE]; strretchomp(buf); recv_time = RECV_TIME_NONE; if (sscanf(buf, "%s\t%ld\t%s", uidl, (long int *) &recv_time, tmp) < 2) { if (sscanf(buf, "%s", uidl) != 1) continue; else { recv_time = now; } } if (!strcmp(muidl, uidl)) { result = g_strdup(tmp); break; } } fclose(fp); return result; }
/** * Menu callback: Save the selected attachment * \param mimeview Current display */ static void mimeview_save_as(MimeView *mimeview) { gchar *filename; gchar *filepath = NULL; gchar *filedir = NULL; MimeInfo *partinfo; gchar *partname = NULL; if (!mimeview->opened) return; if (!mimeview->file) return; partinfo = mimeview_get_selected_part(mimeview); if (!partinfo) { partinfo = (MimeInfo *) gtk_object_get_data (GTK_OBJECT(mimeview->popupmenu), "pop_partinfo"); gtk_object_set_data(GTK_OBJECT(mimeview->popupmenu), "pop_partinfo", NULL); } g_return_if_fail(partinfo != NULL); if (get_part_name(partinfo) == NULL) { return; } partname = g_strdup(get_part_name(partinfo)); subst_for_filename(partname); if (prefs_common.attach_save_dir) filepath = g_strconcat(prefs_common.attach_save_dir, G_DIR_SEPARATOR_S, partname, NULL); else filepath = g_strdup(partname); g_free(partname); filename = filesel_select_file(_("Save as"), filepath); if (!filename) { g_free(filepath); return; } mimeview_write_part(filename, partinfo); filedir = g_dirname(filename); if (filedir && strcmp(filedir, ".")) { if (prefs_common.attach_save_dir) g_free(prefs_common.attach_save_dir); prefs_common.attach_save_dir = g_strdup(filedir); } g_free(filedir); g_free(filepath); }
void messageview_save_as(MessageView *messageview) { gchar *filename = NULL; MsgInfo *msginfo; gchar *src, *dest; if (!messageview->msginfo) return; msginfo = messageview->msginfo; if (msginfo->subject) { Xstrdup_a(filename, msginfo->subject, return); subst_for_filename(filename); }
/** * Returns a filename (with path) for an attachment * \param partinfo The attachment to save * \param basedir The target directory * \param number Used for dummy filename if attachment is unnamed */ gchar *mimeview_get_filename_for_part(MimeInfo *partinfo, const gchar *basedir, gint number) { gchar *fullname; gchar *filename; filename = g_strdup(get_part_name(partinfo)); if (!filename || !*filename) filename = g_strdup_printf("noname.%d", number); subst_for_filename(filename); fullname = g_strconcat (basedir, G_DIR_SEPARATOR_S, (filename[0] == G_DIR_SEPARATOR) ? &filename[1] : filename, NULL); g_free(filename); return fullname; }
static void mimeview_drag_begin(GtkWidget *widget, GdkDragContext *drag_context, MimeView *mimeview) { gchar *filename; gchar *bname = NULL; MimeInfo *partinfo; if (!mimeview->opened) return; if (!mimeview->messageview->file) return; partinfo = mimeview_get_selected_part(mimeview); if (!partinfo) return; filename = partinfo->filename ? partinfo->filename : partinfo->name; if (filename) { const gchar *bname_; bname_ = g_basename(filename); bname = conv_filename_from_utf8(bname_); subst_for_filename(bname); } if (!bname || *bname == '\0') filename = procmime_get_tmp_file_name(partinfo); else filename = g_strconcat(get_mime_tmp_dir(), G_DIR_SEPARATOR_S, bname, NULL); if (procmime_get_part(filename, mimeview->messageview->file, partinfo) < 0) { g_warning(_("Can't save the part of multipart message.")); } else mimeview->drag_file = encode_uri(filename); g_free(filename); gtk_drag_set_icon_default(drag_context); }
gint pop3_write_uidl_list(Pop3Session *session) { gchar *path, *tmp_path; FILE *fp; Pop3MsgInfo *msg; gint n; gchar *sanitized_uid = g_strdup(session->ac_prefs->userid); subst_for_filename(sanitized_uid); if (!session->uidl_is_valid) { g_free(sanitized_uid); return 0; } path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, "uidl", G_DIR_SEPARATOR_S, session->ac_prefs->recv_server, "-", sanitized_uid, NULL); tmp_path = g_strconcat(path, ".tmp", NULL); g_free(sanitized_uid); if ((fp = g_fopen(tmp_path, "wb")) == NULL) { FILE_OP_ERROR(tmp_path, "fopen"); goto err_write; } for (n = 1; n <= session->count; n++) { msg = &session->msg[n]; if (msg->uidl && msg->received && (!msg->deleted || session->state != POP3_DONE)) TRY(fprintf(fp, "%s\t%ld\t%d\n", msg->uidl, (long int) msg->recv_time, msg->partial_recv) > 0); } if (fclose(fp) == EOF) { FILE_OP_ERROR(tmp_path, "fclose"); fp = NULL; goto err_write; } fp = NULL; #ifdef G_OS_WIN32 claws_unlink(path); #endif if (g_rename(tmp_path, path) < 0) { FILE_OP_ERROR(path, "rename"); goto err_write; } g_free(path); g_free(tmp_path); return 0; err_write: if (fp) fclose(fp); g_free(path); g_free(tmp_path); return -1; }
static void pop3_get_uidl_table(PrefsAccount *ac_prefs, Pop3Session *session) { GHashTable *table; GHashTable *partial_recv_table; gchar *path; FILE *fp; gchar buf[POPBUFSIZE]; gchar uidl[POPBUFSIZE]; time_t recv_time; time_t now; gint partial_recv; gchar *sanitized_uid = g_strdup(ac_prefs->userid); subst_for_filename(sanitized_uid); table = g_hash_table_new(g_str_hash, g_str_equal); partial_recv_table = g_hash_table_new(g_str_hash, g_str_equal); path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, "uidl", G_DIR_SEPARATOR_S, ac_prefs->recv_server, "-", sanitized_uid, NULL); g_free(sanitized_uid); if ((fp = g_fopen(path, "rb")) == NULL) { if (ENOENT != errno) FILE_OP_ERROR(path, "fopen"); g_free(path); path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, "uidl-", ac_prefs->recv_server, "-", ac_prefs->userid, NULL); if ((fp = g_fopen(path, "rb")) == NULL) { if (ENOENT != errno) FILE_OP_ERROR(path, "fopen"); g_free(path); session->uidl_table = table; session->partial_recv_table = partial_recv_table; return; } } g_free(path); now = time(NULL); while (fgets(buf, sizeof(buf), fp) != NULL) { gchar tmp[POPBUFSIZE]; strretchomp(buf); recv_time = RECV_TIME_NONE; partial_recv = POP3_TOTALLY_RECEIVED; if (sscanf(buf, "%s\t%ld\t%s", uidl, (long int *) &recv_time, tmp) < 3) { if (sscanf(buf, "%s\t%ld", uidl, (long int *) &recv_time) != 2) { if (sscanf(buf, "%s", uidl) != 1) continue; else { recv_time = now; strcpy(tmp, "0"); } } else { strcpy(tmp, "0"); } } if (recv_time == RECV_TIME_NONE) recv_time = RECV_TIME_RECEIVED; g_hash_table_insert(table, g_strdup(uidl), GINT_TO_POINTER(recv_time)); if (strlen(tmp) == 1) partial_recv = atoi(tmp); /* totally received ?*/ else partial_recv = POP3_MUST_COMPLETE_RECV; g_hash_table_insert(partial_recv_table, g_strdup(uidl), GINT_TO_POINTER(partial_recv)); } fclose(fp); session->uidl_table = table; session->partial_recv_table = partial_recv_table; return; }
int partial_msg_in_uidl_list(MsgInfo *msginfo) { gchar *path; FILE *fp; gchar buf[POPBUFSIZE]; gchar uidl[POPBUFSIZE]; time_t recv_time; time_t now; gchar *sanitized_uid = NULL; if (!msginfo->extradata) return FALSE; sanitized_uid = g_strdup(msginfo->extradata->account_login); subst_for_filename(sanitized_uid); if (!msginfo->extradata->account_server || !msginfo->extradata->account_login || !msginfo->extradata->partial_recv) return FALSE; path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, "uidl", G_DIR_SEPARATOR_S, msginfo->extradata->account_server, "-", msginfo->extradata->account_login, NULL); if ((fp = g_fopen(path, "rb")) == NULL) { if (ENOENT != errno) FILE_OP_ERROR(path, "fopen"); g_free(path); path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, "uidl-", msginfo->extradata->account_server, "-", sanitized_uid, NULL); if ((fp = g_fopen(path, "rb")) == NULL) { if (ENOENT != errno) FILE_OP_ERROR(path, "fopen"); g_free(sanitized_uid); g_free(path); return FALSE; } } g_free(sanitized_uid); g_free(path); now = time(NULL); while (fgets(buf, sizeof(buf), fp) != NULL) { gchar tmp[POPBUFSIZE]; strretchomp(buf); recv_time = RECV_TIME_NONE; if (sscanf(buf, "%s\t%ld\t%s", uidl, (long int *) &recv_time, tmp) < 2) { if (sscanf(buf, "%s", uidl) != 1) continue; else { recv_time = now; } } if (!strcmp(uidl, msginfo->extradata->partial_recv)) { fclose(fp); return TRUE; } } fclose(fp); return FALSE; }
static int partial_uidl_mark_mail(MsgInfo *msginfo, int download) { gchar *path; gchar *pathnew; FILE *fp; FILE *fpnew; gchar buf[POPBUFSIZE]; gchar uidl[POPBUFSIZE]; time_t recv_time; time_t now; gchar partial_recv[POPBUFSIZE]; int err = -1; gchar *filename; MsgInfo *tinfo; gchar *sanitized_uid = NULL; filename = procmsg_get_message_file_path(msginfo); if (!filename) { g_warning("can't get message file path."); return err; } tinfo = procheader_parse_file(filename, msginfo->flags, TRUE, TRUE); if (!tinfo->extradata) { g_free(filename); return err; } sanitized_uid = g_strdup(tinfo->extradata->account_login); subst_for_filename(sanitized_uid); if (!tinfo->extradata->account_server || !tinfo->extradata->account_login || !tinfo->extradata->partial_recv) { goto bail; } path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, "uidl", G_DIR_SEPARATOR_S, tinfo->extradata->account_server, "-", sanitized_uid, NULL); if ((fp = g_fopen(path, "rb")) == NULL) { perror("fopen1"); if (ENOENT != errno) FILE_OP_ERROR(path, "fopen"); g_free(path); path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, "uidl-", tinfo->extradata->account_server, "-", tinfo->extradata->account_login, NULL); if ((fp = g_fopen(path, "rb")) == NULL) { if (ENOENT != errno) FILE_OP_ERROR(path, "fopen"); g_free(path); goto bail; } } pathnew = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, "uidl", G_DIR_SEPARATOR_S, tinfo->extradata->account_server, "-", sanitized_uid, ".new", NULL); g_free(sanitized_uid); if ((fpnew = g_fopen(pathnew, "wb")) == NULL) { perror("fopen2"); fclose(fp); g_free(pathnew); goto bail; } now = time(NULL); while (fgets(buf, sizeof(buf), fp) != NULL) { strretchomp(buf); recv_time = RECV_TIME_NONE; sprintf(partial_recv,"0"); if (sscanf(buf, "%s\t%ld\t%s", uidl, (long int *) &recv_time, partial_recv) < 2) { if (sscanf(buf, "%s", uidl) != 1) continue; else { recv_time = now; } } if (strcmp(tinfo->extradata->partial_recv, uidl)) { if (fprintf(fpnew, "%s\t%ld\t%s\n", uidl, (long int) recv_time, partial_recv) < 0) { FILE_OP_ERROR(pathnew, "fprintf"); fclose(fpnew); fclose(fp); g_free(path); g_free(pathnew); goto bail; } } else { gchar *stat = NULL; if (download == POP3_PARTIAL_DLOAD_DLOAD) { gchar *folder_id = folder_item_get_identifier( msginfo->folder); stat = g_strdup_printf("%s:%d", folder_id, msginfo->msgnum); g_free(folder_id); } else if (download == POP3_PARTIAL_DLOAD_UNKN) stat = g_strdup("1"); else if (download == POP3_PARTIAL_DLOAD_DELE) stat = g_strdup("0"); if (fprintf(fpnew, "%s\t%ld\t%s\n", uidl, (long int) recv_time, stat) < 0) { FILE_OP_ERROR(pathnew, "fprintf"); fclose(fpnew); fclose(fp); g_free(path); g_free(pathnew); goto bail; } g_free(stat); } } if (fclose(fpnew) == EOF) { FILE_OP_ERROR(pathnew, "fclose"); fclose(fp); g_free(path); g_free(pathnew); goto bail; } fclose(fp); move_file(pathnew, path, TRUE); g_free(path); g_free(pathnew); if ((fp = g_fopen(filename,"rb")) == NULL) { perror("fopen3"); goto bail; } pathnew = g_strdup_printf("%s.new", filename); if ((fpnew = g_fopen(pathnew, "wb")) == NULL) { perror("fopen4"); fclose(fp); g_free(pathnew); goto bail; } if (fprintf(fpnew, "SC-Marked-For-Download: %d\n", download) < 0) { FILE_OP_ERROR(pathnew, "fprintf"); fclose(fpnew); fclose(fp); g_free(pathnew); goto bail; } while (fgets(buf, sizeof(buf)-1, fp) != NULL) { if(strlen(buf) > strlen("SC-Marked-For-Download: x\n") && !strncmp(buf, "SC-Marked-For-Download:", strlen("SC-Marked-For-Download:"))) { if (fprintf(fpnew, "%s", buf+strlen("SC-Marked-For-Download: x\n")) < 0) { FILE_OP_ERROR(pathnew, "fprintf"); fclose(fpnew); fclose(fp); g_free(pathnew); goto bail; } continue; } else if (strlen(buf) == strlen("SC-Marked-For-Download: x\n") && !strncmp(buf, "SC-Marked-For-Download:", strlen("SC-Marked-For-Download:"))) { continue; } if (fprintf(fpnew, "%s", buf) < 0) { FILE_OP_ERROR(pathnew, "fprintf"); fclose(fpnew); fclose(fp); g_free(pathnew); goto bail; } } if (fclose(fpnew) == EOF) { FILE_OP_ERROR(pathnew, "fclose"); fclose(fp); g_free(pathnew); goto bail; } fclose(fp); if (rename_force(pathnew, filename) != 0) { g_free(pathnew); goto bail; } g_free(pathnew); msginfo->planned_download = download; msgcache_update_msg(msginfo->folder->cache, msginfo); err = 0; bail: g_free(filename); procmsg_msginfo_free(&tinfo); return err; }