/*! *\brief Send messages in queue * *\param queue Queue folder to process *\param save_msgs Unused * *\return Number of messages sent, negative if an error occurred * positive if no error occurred */ gint procmsg_send_queue(FolderItem *queue, gboolean save_msgs) { gint sent = 0, err = 0; GSList *list, *elem; if (!queue) queue = folder_get_default_queue(); g_return_val_if_fail(queue != NULL, -1); folder_item_scan(queue); list = folder_item_get_msg_list(queue); for (elem = list; elem != NULL; elem = elem->next) { gchar *file; MsgInfo *msginfo; msginfo = (MsgInfo *)(elem->data); if (!MSG_IS_LOCKED(msginfo->flags)) { file = folder_item_fetch_msg(queue, msginfo->msgnum); if (file) { if (procmsg_send_message_queue(file) < 0) { g_warning("Sending queued message %d failed.\n", msginfo->msgnum); err++; } else { /* CLAWS: * We save in procmsg_send_message_queue because * we need the destination folder from the queue * header if (save_msgs) procmsg_save_to_outbox (queue->folder->outbox, file, TRUE); */ sent++; folder_item_remove_msg(queue, msginfo->msgnum); } g_free(file); } } /* FIXME: supposedly if only one message is locked, and queue * is being flushed, the following free says something like * "freeing msg ## in folder (nil)". */ procmsg_msginfo_free(msginfo); } return (err != 0 ? -err : sent); }
GSList *procmsg_find_children (MsgInfo *info) { GSList *children; GSList *all, *cur; g_return_val_if_fail(info!=NULL, NULL); all = folder_item_get_msg_list(info->folder); children = procmsg_find_children_func(info, NULL, all); if (children != NULL) { for (cur = all; cur != NULL; cur = g_slist_next(cur)) { /* this will not free the used pointers created with procmsg_msginfo_new_ref */ procmsg_msginfo_free((MsgInfo *)cur->data); } } g_slist_free(all); return children; }
void procmsg_empty_trash(FolderItem *trash) { FILE *fp; if (trash && trash->total_msgs > 0) { GSList *mlist = folder_item_get_msg_list(trash); GSList *cur; for (cur = mlist ; cur != NULL ; cur = cur->next) { MsgInfo * msginfo = (MsgInfo *) cur->data; if (MSG_IS_LOCKED(msginfo->flags)) continue; if (msginfo->total_size != 0 && msginfo->size != (off_t)msginfo->total_size) partial_mark_for_delete(msginfo); procmsg_msginfo_free(msginfo); } folder_item_remove_all_msg(trash); } }
/* return values: -2 skipped, -1 error, 0 OK */ gint export_to_mbox(FolderItem *src, const gchar *mbox) { GSList *mlist; gint ret; cm_return_val_if_fail(src != NULL, -1); cm_return_val_if_fail(src->folder != NULL, -1); cm_return_val_if_fail(mbox != NULL, -1); debug_print("Exporting messages from %s into %s...\n", src->path, mbox); mlist = folder_item_get_msg_list(src); folder_item_update_freeze(); ret = export_list_to_mbox(mlist, mbox); folder_item_update_thaw(); procmsg_msg_list_free(mlist); return ret; }
static void mh_write_sequences(FolderItem *item, gboolean remove_unseen) { gchar *mh_sequences_old, *mh_sequences_new; FILE *mh_sequences_old_fp, *mh_sequences_new_fp; gchar buf[BUFFSIZE]; gchar *path = NULL; gboolean err = FALSE; START_TIMING(""); if (!item) return; path = folder_item_get_path(item); mh_sequences_old = g_strconcat(path, G_DIR_SEPARATOR_S, ".mh_sequences", NULL); mh_sequences_new = g_strconcat(path, G_DIR_SEPARATOR_S, ".mh_sequences.new", NULL); if ((mh_sequences_new_fp = g_fopen(mh_sequences_new, "w+b")) != NULL) { GSList *msglist = folder_item_get_msg_list(item); GSList *cur; MsgInfo *info = NULL; gint start = -1, end = -1; gchar *sequence = g_strdup(""); gint seq_len = 0; msglist = g_slist_sort(msglist, sort_cache_list_by_msgnum); cur = msglist; /* write the unseen sequence if we don't have to scrap it */ if (!remove_unseen) do { info = (MsgInfo *)(cur ? cur->data:NULL); if (info && (MSG_IS_UNREAD(info->flags) || MSG_IS_NEW(info->flags))) { if (start < 0) start = end = info->msgnum; else end = info->msgnum; } else { if (start > 0 && end > 0) { gchar tmp[32]; gint tmp_len = 0; if (start != end) snprintf(tmp, 31, " %d-%d", start, end); else snprintf(tmp, 31, " %d", start); tmp_len = strlen(tmp); sequence = g_realloc(sequence, seq_len+tmp_len+1); strcpy(sequence+seq_len, tmp); seq_len += tmp_len; start = end = -1; } } cur = cur ? cur->next:NULL; } while (cur || (start > 0 && end > 0)); if (sequence && *sequence) { if (fprintf(mh_sequences_new_fp, "%s%s\n", get_unseen_seq_name(), sequence) < 0) err = TRUE; else debug_print("wrote unseen sequence: '%s%s'\n", get_unseen_seq_name(), sequence); } /* rewrite the rest of the file */ if ((mh_sequences_old_fp = g_fopen(mh_sequences_old, "r+b")) != NULL) { while (fgets(buf, sizeof(buf), mh_sequences_old_fp) != NULL) { if (strncmp(buf, get_unseen_seq_name(), strlen(get_unseen_seq_name()))) if (fprintf(mh_sequences_new_fp, "%s", buf) < 0) { err = TRUE; break; } } fclose(mh_sequences_old_fp); } fflush(mh_sequences_new_fp); #if 0 fsync(fileno(mh_sequences_new_fp)); #endif if (fclose(mh_sequences_new_fp) == EOF) err = TRUE; if (!err) { if (g_rename(mh_sequences_new, mh_sequences_old) < 0) FILE_OP_ERROR(mh_sequences_new, "rename"); } g_free(sequence); procmsg_msg_list_free(msglist); } g_free(mh_sequences_old); g_free(mh_sequences_new); g_free(path); END_TIMING(); }
static gint inc_start(IncProgressDialog *inc_dialog) { IncSession *session; GList *qlist; Pop3Session *pop3_session; IncState inc_state; gint error_num = 0; gint new_msgs = 0; gchar *msg; gchar *fin_msg; FolderItem *processing, *inbox; GSList *msglist, *msglist_element; gboolean cancelled = FALSE; qlist = inc_dialog->queue_list; while (qlist != NULL) { GList *next = qlist->next; session = qlist->data; pop3_session = POP3_SESSION(session->session); pop3_session->user = g_strdup(pop3_session->ac_prefs->userid); if (pop3_session->ac_prefs->passwd) pop3_session->pass = g_strdup(pop3_session->ac_prefs->passwd); else { gchar *pass; if (inc_dialog->show_dialog) manage_window_focus_in (inc_dialog->dialog->window, NULL, NULL); pass = input_dialog_query_password_keep (pop3_session->ac_prefs->recv_server, pop3_session->user, &(pop3_session->ac_prefs->session_passwd)); if (inc_dialog->show_dialog) manage_window_focus_out (inc_dialog->dialog->window, NULL, NULL); if (pass) { pop3_session->pass = pass; } } qlist = next; } #define SET_PIXMAP_AND_TEXT(pix, str) \ { \ progress_dialog_list_set(inc_dialog->dialog, \ inc_dialog->cur_row, \ pix, \ NULL, \ str); \ } for (; inc_dialog->queue_list != NULL && !cancelled; inc_dialog->cur_row++) { session = inc_dialog->queue_list->data; pop3_session = POP3_SESSION(session->session); GSList *filtered, *unfiltered; if (pop3_session->pass == NULL) { SET_PIXMAP_AND_TEXT(okpix, _("Cancelled")); inc_session_destroy(session); inc_dialog->queue_list = g_list_remove(inc_dialog->queue_list, session); continue; } inc_progress_dialog_clear(inc_dialog); progress_dialog_scroll_to_row(inc_dialog->dialog, inc_dialog->cur_row); SET_PIXMAP_AND_TEXT(currentpix, _("Retrieving")); /* begin POP3 session */ inc_state = inc_pop3_session_do(session); switch (inc_state) { case INC_SUCCESS: if (pop3_session->cur_total_num > 0) msg = g_strdup_printf( ngettext("Done (%d message (%s) received)", "Done (%d messages (%s) received)", pop3_session->cur_total_num), pop3_session->cur_total_num, to_human_readable((goffset)pop3_session->cur_total_recv_bytes)); else msg = g_strdup_printf(_("Done (no new messages)")); SET_PIXMAP_AND_TEXT(okpix, msg); g_free(msg); break; case INC_CONNECT_ERROR: SET_PIXMAP_AND_TEXT(errorpix, _("Connection failed")); break; case INC_AUTH_FAILED: SET_PIXMAP_AND_TEXT(errorpix, _("Auth failed")); if (pop3_session->ac_prefs->session_passwd) { g_free(pop3_session->ac_prefs->session_passwd); pop3_session->ac_prefs->session_passwd = NULL; } break; case INC_LOCKED: SET_PIXMAP_AND_TEXT(errorpix, _("Locked")); break; case INC_ERROR: case INC_NO_SPACE: case INC_IO_ERROR: case INC_SOCKET_ERROR: case INC_EOF: SET_PIXMAP_AND_TEXT(errorpix, _("Error")); break; case INC_TIMEOUT: SET_PIXMAP_AND_TEXT(errorpix, _("Timeout")); break; case INC_CANCEL: SET_PIXMAP_AND_TEXT(okpix, _("Cancelled")); if (!inc_dialog->show_dialog) cancelled = TRUE; break; default: break; } if (pop3_session->error_val == PS_AUTHFAIL) { if(!prefs_common.no_recv_err_panel) { if((prefs_common.recv_dialog_mode == RECV_DIALOG_ALWAYS) || ((prefs_common.recv_dialog_mode == RECV_DIALOG_MANUAL) && focus_window)) manage_window_focus_in(inc_dialog->dialog->window, NULL, NULL); } } /* CLAWS: perform filtering actions on dropped message */ /* CLAWS: get default inbox (perhaps per account) */ if (pop3_session->ac_prefs->inbox) { /* CLAWS: get destination folder / mailbox */ inbox = folder_find_item_from_identifier(pop3_session->ac_prefs->inbox); if (!inbox) inbox = folder_get_default_inbox(); } else inbox = folder_get_default_inbox(); /* get list of messages in processing */ processing = folder_get_default_processing(); folder_item_scan(processing); msglist = folder_item_get_msg_list(processing); /* process messages */ folder_item_update_freeze(); procmsg_msglist_filter(msglist, pop3_session->ac_prefs, &filtered, &unfiltered, pop3_session->ac_prefs->filter_on_recv); filtering_move_and_copy_msgs(msglist); if (unfiltered != NULL) folder_item_move_msgs(inbox, unfiltered); for(msglist_element = msglist; msglist_element != NULL; msglist_element = msglist_element->next) { MsgInfo *msginfo = (MsgInfo *)msglist_element->data; procmsg_msginfo_free(msginfo); } folder_item_update_thaw(); g_slist_free(msglist); g_slist_free(filtered); g_slist_free(unfiltered); statusbar_pop_all(); new_msgs += pop3_session->cur_total_num; pop3_write_uidl_list(pop3_session); if (inc_state != INC_SUCCESS && inc_state != INC_CANCEL) { error_num++; if (inc_dialog->show_dialog) manage_window_focus_in (inc_dialog->dialog->window, NULL, NULL); inc_put_error(inc_state, pop3_session); if (inc_dialog->show_dialog) manage_window_focus_out (inc_dialog->dialog->window, NULL, NULL); if (inc_state == INC_NO_SPACE || inc_state == INC_IO_ERROR) break; } folder_item_free_cache(processing, TRUE); inc_session_destroy(session); inc_dialog->queue_list = g_list_remove(inc_dialog->queue_list, session); } #undef SET_PIXMAP_AND_TEXT if (new_msgs > 0) fin_msg = g_strdup_printf(ngettext("Finished (%d new message)", "Finished (%d new messages)", new_msgs), new_msgs); else fin_msg = g_strdup_printf(_("Finished (no new messages)")); progress_dialog_set_label(inc_dialog->dialog, fin_msg); while (inc_dialog->queue_list != NULL) { session = inc_dialog->queue_list->data; inc_session_destroy(session); inc_dialog->queue_list = g_list_remove(inc_dialog->queue_list, session); } if (prefs_common.close_recv_dialog || !inc_dialog->show_dialog) inc_progress_dialog_destroy(inc_dialog); else { gtk_window_set_title(GTK_WINDOW(inc_dialog->dialog->window), fin_msg); gtk_button_set_label(GTK_BUTTON(inc_dialog->dialog->cancel_btn), GTK_STOCK_CLOSE); } g_free(fin_msg); return new_msgs; }