+2003-02-28 [christoph] 0.8.10claws64
+
+ * src/account.c
+ * src/addressadd.c
+ * src/compose.c
+ * src/gtkaspell.c
+ * src/gtkxtext.h ** REMOVE **
+ * src/imap.c
+ * src/matcher.[ch]
+ * src/mh.c
+ * src/news.c
+ * src/pine.c
+ * src/prefs_common.c
+ * src/prefs_matcher.c
+ * src/procheader.[ch]
+ * src/procmsg.[ch]
+ * src/toolbar.c
+ * src/common/ssl_certificate.c
+ * src/gtk/colorlabel.c
+ * src/gtk/menu.c
+ o fix warnings
+ o remove code obsoleted by new cache and folder system rework
+
2003-02-28 [oliver] 0.8.10claws63
* src/toolbar.[ch]
MICRO_VERSION=10
INTERFACE_AGE=0
BINARY_AGE=0
-EXTRA_VERSION=claws63
+EXTRA_VERSION=claws64
VERSION=$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION$EXTRA_VERSION
dnl set $target
#include "gtkutils.h"
#include "utils.h"
#include "alertpanel.h"
+#include "procheader.h"
typedef enum
{
if (reply_autosel) {
if (!account && msginfo->to) {
gchar *to;
- Xstrdup_a(to, msginfo->to, return);
+ Xstrdup_a(to, msginfo->to, return NULL);
extract_address(to);
account = account_find_from_address(to);
}
GtkWidget *vlbox;
GtkWidget *tree_win;
GtkWidget *hbbox;
- GtkWidget *hsep;
GtkWidget *ok_btn;
GtkWidget *cancel_btn;
GtkWidget *hsbox;
{
X509_STORE_CTX store_ctx;
X509_STORE *store;
- int ok = 0;
char *err_msg = NULL;
store = X509_STORE_new();
for (row = 0; (ainfo = gtk_clist_get_row_data(clist, row)) != NULL;
row++) {
- gchar buf[BUFFSIZE];
- gchar inbuf[B64_LINE_SIZE], outbuf[B64_BUFFSIZE];
-
if ((attach_fp = fopen(ainfo->file, "rb")) == NULL) {
g_warning("Can't open file %s\n", ainfo->file);
continue;
#include <glib.h>
#include <gdk/gdkx.h>
+#include <gtk/gtk.h>
#include <gtk/gtkwidget.h>
#include <gtk/gtkpixmap.h>
#include <gtk/gtkmenu.h>
#endif
#include <glib.h>
+#include <gtk/gtk.h>
#include <gtk/gtkwidget.h>
#include <gtk/gtkmenu.h>
#include <gtk/gtkmenubar.h>
gchar *language = NULL;
gchar *jargon = NULL;
gchar *size = NULL;
- gchar *end = NULL;
gchar buf[BUFSIZE];
g_return_val_if_fail(config, FALSE);
GSList *gtkaspell_get_dictionary_list(const gchar *aspell_path, gint refresh)
{
GSList *list;
- gchar *dict_path, *tmp, *prevdir;
- gchar tmpname[BUFSIZE];
Dictionary *dict;
AspellConfig *config;
AspellDictInfoList *dlist;
AspellDictInfoEnumeration *dels;
const AspellDictInfo *entry;
- struct dirent *ent;
if (!gtkaspellcheckers)
gtkaspellcheckers = gtkaspell_checkers_new();
+++ /dev/null
-/*
- * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 2001 Hiroyuki Yamamoto & The Sylpheed Claws Team
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef GTKXTEXT_H__
-#define GTKXTEXT_H__
-
-#include "config.h"
-
-#ifdef CLAWS
-
-#include "gtkstext.h"
-
-typedef GtkSText GtkXText;
-
-#define GTK_IS_XTEXT(obj) GTK_IS_STEXT(obj)
-#define GTK_XTEXT(obj) GTK_STEXT(obj)
-
-#define gtk_xtext_get_type gtk_stext_get_type
-#define gtk_xtext_new gtk_stext_new
-#define gtk_xtext_set_editable gtk_stext_set_editable
-#define gtk_xtext_set_word_wrap gtk_stext_set_word_wrap
-#define gtk_xtext_set_line_wrap gtk_stext_set_line_wrap
-#define gtk_xtext_set_adjustments gtk_stext_set_adjustments
-#define gtk_xtext_set_point gtk_stext_set_point
-#define gtk_xtext_get_point gtk_stext_get_point
-#define gtk_xtext_get_length gtk_stext_get_length
-#define gtk_xtext_freeze gtk_stext_freeze
-#define gtk_xtext_thaw gtk_stext_thaw
-#define gtk_xtext_insert gtk_stext_insert
-#define gtk_xtext_backward_delete gtk_stext_backward_delete
-#define gtk_xtext_forward_delete gtk_stext_forward_delete
-
-#define GTK_XTEXT_INDEX GTK_STEXT_INDEX
-
-#else
-
-#include <gtk/gtktext.h>
-
-typedef GtkText GtkXText;
-
-#define GTK_IS_XTEXT(obj) GTK_IS_TEXT(obj)
-#define GTK_XTEXT(obj) GTK_TEXT(obj)
-
-#define gtk_xtext_get_type gtk_text_get_type
-#define gtk_xtext_new gtk_text_new
-#define gtk_xtext_set_editable gtk_text_set_editable
-#define gtk_xtext_set_word_wrap gtk_text_set_word_wrap
-#define gtk_xtext_set_line_wrap gtk_text_set_line_wrap
-#define gtk_xtext_set_adjustments gtk_text_set_adjustments
-#define gtk_xtext_set_point gtk_text_set_point
-#define gtk_xtext_get_point gtk_text_get_point
-#define gtk_xtext_get_length gtk_text_get_length
-#define gtk_xtext_freeze gtk_text_freeze
-#define gtk_xtext_thaw gtk_text_thaw
-#define gtk_xtext_insert gtk_text_insert
-#define gtk_xtext_backward_delete gtk_text_backward_delete
-#define gtk_xtext_forward_delete gtk_text_forward_delete
-
-#define GTK_XTEXT_INDEX GTK_TEXT_INDEX
-
-#endif /* !CLAWS */
-
-
-#endif /* GTKXTEXT_H__ */
-
FolderItem *item,
guint32 first_uid,
guint32 last_uid);
-static GSList *imap_delete_cached_messages (GSList *mlist,
- FolderItem *item,
- guint32 first_uid,
- guint32 last_uid);
static void imap_delete_all_cached_messages (FolderItem *item);
#if USE_OPENSSL
gint *recent,
gint *unseen,
guint32 *uid_validity);
-static gint imap_get_uid (IMAPSession *session,
- gint msgnum,
- guint32 *uid);
static gint imap_status (IMAPSession *session,
IMAPFolder *folder,
const gchar *path,
}
}
-#define THROW goto catch
-
-GSList *imap_get_msg_list(Folder *folder, FolderItem *item, gboolean use_cache)
-{
- GSList *mlist = NULL;
- IMAPSession *session;
- gint ok, exists = 0, recent = 0, unseen = 0;
- guint32 uid_validity = 0;
- guint32 first_uid = 0, last_uid = 0, begin;
-
- g_return_val_if_fail(folder != NULL, NULL);
- g_return_val_if_fail(item != NULL, NULL);
- g_return_val_if_fail(folder->type == F_IMAP, NULL);
- g_return_val_if_fail(folder->account != NULL, NULL);
-
- session = imap_session_get(folder);
-
- if (!session) {
- mlist = procmsg_read_cache(item, FALSE);
- item->last_num = procmsg_get_last_num_in_msg_list(mlist);
- procmsg_set_flags(mlist, item);
- return mlist;
- }
-
- ok = imap_select(session, IMAP_FOLDER(folder), item->path,
- &exists, &recent, &unseen, &uid_validity);
- if (ok != IMAP_SUCCESS) THROW;
- if (exists > 0) {
- ok = imap_get_uid(session, 1, &first_uid);
- if (ok != IMAP_SUCCESS) THROW;
- if (1 != exists) {
- ok = imap_get_uid(session, exists, &last_uid);
- if (ok != IMAP_SUCCESS) THROW;
- } else
- last_uid = first_uid;
- } else {
- imap_delete_all_cached_messages(item);
- return NULL;
- }
-
- if (use_cache) {
- guint32 cache_last;
-
- mlist = procmsg_read_cache(item, FALSE);
- procmsg_set_flags(mlist, item);
- cache_last = procmsg_get_last_num_in_msg_list(mlist);
-
- /* calculating the range of envelope to get */
- if (item->mtime != uid_validity) {
- /* mailbox is changed (get all) */
- begin = first_uid;
- } else if (last_uid < cache_last) {
- /* mailbox is changed (get all) */
- begin = first_uid;
- } else if (last_uid == cache_last) {
- /* mailbox unchanged (get none)*/
- begin = 0;
- } else {
- begin = cache_last + 1;
- }
-
- item->mtime = uid_validity;
-
- if (first_uid > 0 && last_uid > 0) {
- mlist = imap_delete_cached_messages(mlist, item,
- 0, first_uid - 1);
- mlist = imap_delete_cached_messages(mlist, item,
- last_uid + 1,
- UINT_MAX);
- }
- if (begin > 0)
- mlist = imap_delete_cached_messages(mlist, item,
- begin, UINT_MAX);
- } else {
- imap_delete_all_cached_messages(item);
- begin = first_uid;
- }
-
- if (begin > 0 && begin <= last_uid) {
- GSList *newlist;
- newlist = imap_get_uncached_messages(session, item,
- begin, last_uid);
- mlist = g_slist_concat(mlist, newlist);
- }
-
- item->last_num = last_uid;
-
-catch:
- return mlist;
-}
-
-#undef THROW
-
gchar *imap_fetch_msg(Folder *folder, FolderItem *item, gint uid)
{
gchar *path, *filename;
return newlist;
}
-static GSList *imap_delete_cached_messages(GSList *mlist, FolderItem *item,
- guint32 first_uid, guint32 last_uid)
-{
- GSList *cur, *next;
- MsgInfo *msginfo;
- gchar *dir;
-
- g_return_val_if_fail(item != NULL, mlist);
- g_return_val_if_fail(item->folder != NULL, mlist);
- g_return_val_if_fail(item->folder->type == F_IMAP, mlist);
-
- debug_print("Deleting cached messages %u - %u ... ",
- first_uid, last_uid);
-
- dir = folder_item_get_path(item);
- if (is_dir_exist(dir))
- remove_numbered_files(dir, first_uid, last_uid);
- g_free(dir);
-
- for (cur = mlist; cur != NULL; ) {
- next = cur->next;
-
- msginfo = (MsgInfo *)cur->data;
- if (msginfo != NULL && first_uid <= msginfo->msgnum &&
- msginfo->msgnum <= last_uid) {
- procmsg_msginfo_free(msginfo);
- mlist = g_slist_remove(mlist, msginfo);
- }
-
- cur = next;
- }
-
- debug_print("done.\n");
-
- return mlist;
-}
-
static void imap_delete_all_cached_messages(FolderItem *item)
{
gchar *dir;
#define THROW(err) { ok = err; goto catch; }
-static gint imap_get_uid(IMAPSession *session, gint msgnum, guint32 *uid)
-{
- gint ok;
- GPtrArray *argbuf;
- gchar *str;
- gint num;
-
- *uid = 0;
- argbuf = g_ptr_array_new();
-
- imap_cmd_gen_send(SESSION(session)->sock, "FETCH %d (UID)", msgnum);
- if ((ok = imap_cmd_ok(SESSION(session)->sock, argbuf)) != IMAP_SUCCESS)
- THROW(ok);
-
- str = search_array_contain_str(argbuf, "FETCH");
- if (!str) THROW(IMAP_ERROR);
-
- if (sscanf(str, "%d FETCH (UID %d)", &num, uid) != 2 ||
- num != msgnum) {
- g_warning("imap_get_uid(): invalid FETCH line.\n");
- THROW(IMAP_ERROR);
- }
-
-catch:
- ptr_array_free_strings(argbuf);
- g_ptr_array_free(argbuf, TRUE);
-
- return ok;
-}
-
static gint imap_status(IMAPSession *session, IMAPFolder *folder,
const gchar *path,
gint *messages, gint *recent,
log_warning(_("can't copy %d to %s\n"), msgnum, destfolder_);
else if (imap_has_capability(session, "UIDPLUS") && reply->len > 0)
if ((okmsginfo = g_ptr_array_index(reply, reply->len - 1)) != NULL &&
- sscanf(okmsginfo, "%*u OK [COPYUID %*llu %u %u]", &olduid, &newuid) == 2 &&
+ sscanf(okmsginfo, "%*u OK [COPYUID %*u %u %u]", &olduid, &newuid) == 2 &&
olduid == msgnum)
*new_uid = newuid;
*/
gint get_matchparser_tab_id(const gchar *str)
{
- gint i;
MatchParser *res;
if (NULL != (res = g_hash_table_lookup(matchparser_hashtab, str))) {
*
*\return gchar * Newly allocated string with escaped characters
*/
-const gchar *matcher_escape_str(const gchar *str)
+gchar *matcher_escape_str(const gchar *str)
{
register const gchar *walk;
register int escape;
const gchar *criteria_str;
const gchar *matchtype_str;
int i;
- const char *expr;
- char *header;
+ gchar *expr;
criteria_str = NULL;
for (i = 0; i < (int) (sizeof(matchparser_tab) / sizeof(MatchParser)); i++) {
gboolean matcher_parse_boolean_op (gchar **str);
gchar *matcher_parse_regexp (gchar **str);
gchar *matcher_parse_str (gchar **str);
-const gchar *matcher_escape_str (const gchar *str);
+gchar *matcher_escape_str (const gchar *str);
gchar *matcher_unescape_str (gchar *str);
gchar *matcherprop_to_string (MatcherProp *matcher);
gchar *matcherlist_to_string (const MatcherList *matchers);
gchar *mh_get_new_msg_filename (FolderItem *dest);
-static GSList *mh_get_uncached_msgs (GHashTable *msg_table,
- FolderItem *item);
static MsgInfo *mh_parse_msg (const gchar *file,
FolderItem *item);
static void mh_scan_tree_recursive (FolderItem *item);
return nummsgs;
}
-GSList *mh_get_msg_list(Folder *folder, FolderItem *item, gboolean use_cache)
-{
- GSList *mlist;
- GHashTable *msg_table;
- gchar *path;
- struct stat s;
- gboolean scan_new = TRUE;
-#ifdef MEASURE_TIME
- struct timeval tv_before, tv_after, tv_result;
-
- gettimeofday(&tv_before, NULL);
-#endif
-
- g_return_val_if_fail(item != NULL, NULL);
-
- path = folder_item_get_path(item);
- if (stat(path, &s) < 0) {
- FILE_OP_ERROR(path, "stat");
- } else {
- time_t mtime;
-
- mtime = MAX(s.st_mtime, s.st_ctime);
- if (item->mtime == mtime) {
- debug_print("Folder is not modified.\n");
- scan_new = FALSE;
- } else
- item->mtime = mtime;
- }
- g_free(path);
-
- if (use_cache && !scan_new) {
- mlist = procmsg_read_cache(item, FALSE);
- if (!mlist)
- mlist = mh_get_uncached_msgs(NULL, item);
- } else if (use_cache) {
- GSList *newlist;
-
- mlist = procmsg_read_cache(item, TRUE);
- msg_table = procmsg_msg_hash_table_create(mlist);
-
- newlist = mh_get_uncached_msgs(msg_table, item);
- if (msg_table)
- g_hash_table_destroy(msg_table);
-
- mlist = g_slist_concat(mlist, newlist);
- } else
- mlist = mh_get_uncached_msgs(NULL, item);
-
- procmsg_set_flags(mlist, item);
-
-#ifdef MEASURE_TIME
- gettimeofday(&tv_after, NULL);
-
- timersub(&tv_after, &tv_before, &tv_result);
- g_print("mh_get_msg_list: %s: elapsed time: %ld.%06ld sec\n",
- item->path, tv_result.tv_sec, tv_result.tv_usec);
-#endif
-
- return mlist;
-}
-
gchar *mh_fetch_msg(Folder *folder, FolderItem *item, gint num)
{
gchar *path;
ret = mh_add_msg(folder, dest, srcfile, FALSE);
g_free(srcfile);
- if (ret != -1) {
- gchar *destdir;
- FILE *fp;
-
- destdir = folder_item_get_path(dest);
- if ((fp = procmsg_open_mark_file(destdir, TRUE)) == NULL)
- g_warning("Can't open mark file.\n");
- else {
- SET_DEST_MSG_FLAGS(fp, dest, msginfo);
- fclose(fp);
- }
- g_free(destdir);
-
+ if (ret != -1)
ret = folder_item_remove_msg(msginfo->folder, msginfo->msgnum);
- }
return ret;
}
return 0;
}
-
-static GSList *mh_get_uncached_msgs(GHashTable *msg_table, FolderItem *item)
-{
- gchar *path;
- DIR *dp;
- struct dirent *d;
- struct stat s;
- GSList *newlist = NULL;
- GSList *last = NULL;
- MsgInfo *msginfo;
- gint n_newmsg = 0;
- gint num;
-
- g_return_val_if_fail(item != NULL, NULL);
-
- path = folder_item_get_path(item);
- g_return_val_if_fail(path != NULL, NULL);
- if (change_dir(path) < 0) {
- g_free(path);
- return NULL;
- }
- g_free(path);
-
- if ((dp = opendir(".")) == NULL) {
- FILE_OP_ERROR(item->path, "opendir");
- return NULL;
- }
-
- debug_print("Searching uncached messages...\n");
-
- if (msg_table) {
- while ((d = readdir(dp)) != NULL) {
- if ((num = to_number(d->d_name)) < 0) continue;
- if (stat(d->d_name, &s) < 0) {
- FILE_OP_ERROR(d->d_name, "stat");
- continue;
- }
- if (!S_ISREG(s.st_mode)) continue;
-
- msginfo = g_hash_table_lookup
- (msg_table, GUINT_TO_POINTER(num));
-
- if (!msginfo) {
- /* not found in the cache (uncached message) */
- msginfo = mh_parse_msg(d->d_name, item);
- if (!msginfo) continue;
-
- if (!newlist)
- last = newlist =
- g_slist_append(NULL, msginfo);
- else {
- last = g_slist_append(last, msginfo);
- last = last->next;
- }
- n_newmsg++;
- }
- }
- } else {
- /* discard all previous cache */
- while ((d = readdir(dp)) != NULL) {
- if (to_number(d->d_name) < 0) continue;
- if (stat(d->d_name, &s) < 0) {
- FILE_OP_ERROR(d->d_name, "stat");
- continue;
- }
- if (!S_ISREG(s.st_mode)) continue;
-
- msginfo = mh_parse_msg(d->d_name, item);
- if (!msginfo) continue;
-
- if (!newlist)
- last = newlist = g_slist_append(NULL, msginfo);
- else {
- last = g_slist_append(last, msginfo);
- last = last->next;
- }
- n_newmsg++;
- }
- }
-
- closedir(dp);
-
- if (n_newmsg)
- debug_print("%d uncached message(s) found.\n", n_newmsg);
- else
- debug_print("done.\n");
-
- /* sort new messages in numerical order */
- if (newlist) {
- debug_print("Sorting uncached messages in numerical order...\n");
- newlist = g_slist_sort
- (newlist, (GCompareFunc)procmsg_cmp_msgnum_for_sort);
- debug_print("done.\n");
- }
-
- return newlist;
-}
-
static MsgInfo *mh_parse_msg(const gchar *file, FolderItem *item)
{
struct stat s;
gint *num,
gint *first,
gint *last);
-static GSList *news_get_uncached_articles(NNTPSession *session,
- FolderItem *item,
- gint cache_last,
- gint *rfirst,
- gint *rlast);
static MsgInfo *news_parse_xover (const gchar *xover_str);
static gchar *news_parse_xhdr (const gchar *xhdr_str,
MsgInfo *msginfo);
-static GSList *news_delete_old_articles (GSList *alist,
- FolderItem *item,
- gint first);
-static void news_delete_all_articles (FolderItem *item);
-static void news_delete_expired_caches (GSList *alist,
- FolderItem *item);
-
static gint news_remove_msg (Folder *folder,
FolderItem *item,
gint num);
return NNTP_SESSION(rfolder->session);
}
-GSList *news_get_article_list(Folder *folder, FolderItem *item,
- gboolean use_cache)
-{
- GSList *alist;
- NNTPSession *session;
-
- g_return_val_if_fail(folder != NULL, NULL);
- g_return_val_if_fail(item != NULL, NULL);
- g_return_val_if_fail(folder->type == F_NEWS, NULL);
-
- session = news_session_get(folder);
-
- if (!session) {
- alist = procmsg_read_cache(item, FALSE);
- item->last_num = procmsg_get_last_num_in_msg_list(alist);
- } else if (use_cache) {
- GSList *newlist;
- gint cache_last;
- gint first, last;
-
- alist = procmsg_read_cache(item, FALSE);
-
- cache_last = procmsg_get_last_num_in_msg_list(alist);
- newlist = news_get_uncached_articles
- (session, item, cache_last, &first, &last);
- if (first == 0 && last == 0) {
- news_delete_all_articles(item);
- procmsg_msg_list_free(alist);
- alist = NULL;
- } else {
- alist = news_delete_old_articles(alist, item, first);
- news_delete_expired_caches(alist, item);
- }
-
- alist = g_slist_concat(alist, newlist);
-
- item->last_num = last;
- } else {
- gint last;
-
- alist = news_get_uncached_articles
- (session, item, 0, NULL, &last);
- news_delete_all_articles(item);
- item->last_num = last;
- }
-
- procmsg_set_flags(alist, item);
-
- return alist;
-}
-
gchar *news_fetch_msg(Folder *folder, FolderItem *item, gint num)
{
gchar *path, *filename;
return ok;
}
-static GSList *news_get_uncached_articles(NNTPSession *session,
- FolderItem *item, gint cache_last,
- gint *rfirst, gint *rlast)
-{
- gint ok;
- gint num = 0, first = 0, last = 0, begin = 0, end = 0;
- gchar buf[NNTPBUFSIZE];
- GSList *newlist = NULL;
- GSList *llast = NULL;
- MsgInfo *msginfo;
-
- if (rfirst) *rfirst = -1;
- if (rlast) *rlast = -1;
-
- g_return_val_if_fail(session != NULL, NULL);
- g_return_val_if_fail(item != NULL, NULL);
- g_return_val_if_fail(item->folder != NULL, NULL);
- g_return_val_if_fail(item->folder->type == F_NEWS, NULL);
-
- ok = news_select_group(session, item->path, &num, &first, &last);
- if (ok != NN_SUCCESS) {
- log_warning("can't set group: %s\n", item->path);
- return NULL;
- }
-
- /* calculate getting overview range */
- if (first > last) {
- log_warning("invalid article range: %d - %d\n",
- first, last);
- return NULL;
- }
-
- if (rfirst) *rfirst = first;
- if (rlast) *rlast = last;
-
- if (cache_last < first)
- begin = first;
- else if (last < cache_last)
- begin = first;
- else if (last == cache_last) {
- debug_print("no new articles.\n");
- return NULL;
- } else
- begin = cache_last + 1;
- end = last;
-
- if (item->account->max_articles > 0 &&
- end - begin + 1 > item->account->max_articles)
- begin = end - item->account->max_articles + 1;
-
- log_message(_("getting xover %d - %d in %s...\n"),
- begin, end, item->path);
- if (nntp_xover(session->nntp_sock, begin, end) != NN_SUCCESS) {
- log_warning("can't get xover\n");
- return NULL;
- }
-
- for (;;) {
- if (sock_gets(SESSION(session)->sock, buf, sizeof(buf)) < 0) {
- log_warning("error occurred while getting xover.\n");
- return newlist;
- }
-
- if (buf[0] == '.' && buf[1] == '\r') break;
-
- msginfo = news_parse_xover(buf);
- if (!msginfo) {
- log_warning("invalid xover line: %s\n", buf);
- continue;
- }
-
- msginfo->folder = item;
- msginfo->flags.perm_flags = MSG_NEW|MSG_UNREAD;
- msginfo->flags.tmp_flags = MSG_NEWS;
- msginfo->newsgroups = g_strdup(item->path);
-
- if (!newlist)
- llast = newlist = g_slist_append(newlist, msginfo);
- else {
- llast = g_slist_append(llast, msginfo);
- llast = llast->next;
- }
- }
-
- if (nntp_xhdr(session->nntp_sock, "to", begin, end) != NN_SUCCESS) {
- log_warning("can't get xhdr\n");
- return newlist;
- }
-
- llast = newlist;
-
- for (;;) {
- if (sock_gets(SESSION(session)->sock, buf, sizeof(buf)) < 0) {
- log_warning("error occurred while getting xhdr.\n");
- return newlist;
- }
-
- if (buf[0] == '.' && buf[1] == '\r') break;
- if (!llast) {
- g_warning("llast == NULL\n");
- continue;
- }
-
- msginfo = (MsgInfo *)llast->data;
- msginfo->to = news_parse_xhdr(buf, msginfo);
-
- llast = llast->next;
- }
-
- if (nntp_xhdr(session->nntp_sock, "cc", begin, end) != NN_SUCCESS) {
- log_warning("can't get xhdr\n");
- return newlist;
- }
-
- llast = newlist;
-
- for (;;) {
- if (sock_gets(SESSION(session)->sock, buf, sizeof(buf)) < 0) {
- log_warning("error occurred while getting xhdr.\n");
- return newlist;
- }
-
- if (buf[0] == '.' && buf[1] == '\r') break;
- if (!llast) {
- g_warning("llast == NULL\n");
- continue;
- }
-
- msginfo = (MsgInfo *)llast->data;
- msginfo->cc = news_parse_xhdr(buf, msginfo);
-
- llast = llast->next;
- }
-
- return newlist;
-}
-
#define PARSE_ONE_PARAM(p, srcp) \
{ \
p = strchr(srcp, '\t'); \
return g_strdup(p);
}
-static GSList *news_delete_old_articles(GSList *alist, FolderItem *item,
- gint first)
-{
- GSList *cur, *next;
- MsgInfo *msginfo;
- gchar *dir;
-
- g_return_val_if_fail(item != NULL, alist);
- g_return_val_if_fail(item->folder != NULL, alist);
- g_return_val_if_fail(item->folder->type == F_NEWS, alist);
-
- if (first < 2) return alist;
-
- debug_print("Deleting cached articles 1 - %d ...\n", first - 1);
-
- dir = folder_item_get_path(item);
- remove_numbered_files(dir, 1, first - 1);
- g_free(dir);
-
- for (cur = alist; cur != NULL; ) {
- next = cur->next;
-
- msginfo = (MsgInfo *)cur->data;
- if (msginfo && msginfo->msgnum < first) {
- procmsg_msginfo_free(msginfo);
- alist = g_slist_remove(alist, msginfo);
- }
-
- cur = next;
- }
-
- return alist;
-}
-
-static void news_delete_all_articles(FolderItem *item)
-{
- gchar *dir;
-
- g_return_if_fail(item != NULL);
- g_return_if_fail(item->folder != NULL);
- g_return_if_fail(item->folder->type == F_NEWS);
-
- debug_print("Deleting all cached articles...\n");
-
- dir = folder_item_get_path(item);
- remove_all_numbered_files(dir);
- g_free(dir);
-}
-
-static void news_delete_expired_caches(GSList *alist, FolderItem *item)
-{
- gchar *dir;
-
- g_return_if_fail(item != NULL);
- g_return_if_fail(item->folder != NULL);
- g_return_if_fail(item->folder->type == F_NEWS);
-
- debug_print("Deleting expired cached articles...\n");
-
- dir = folder_item_get_path(item);
- remove_expired_files(dir, 24 * 7);
- g_free(dir);
-}
-
gint news_cancel_article(Folder * folder, MsgInfo * msginfo)
{
gchar * tmp;
ItemEMail *email;
gchar *key;
- g_return_if_fail( address != NULL );
+ g_return_val_if_fail( address != NULL, NULL );
/* create an entry with empty name if needed */
if ( name == NULL )
{
GtkWidget *vbox1;
GtkWidget *vbox2;
- GtkWidget *hbox1;
GtkWidget *checkbtn_autoextedit;
MatcherList *matchers;
MatcherProp *matcherprop;
AlertValue val;
- gint criteria;
- gint value_criteria;
gchar *matcher_str;
gchar *str;
gint row = 1;
{"From ", NULL, FALSE},
{NULL, NULL, FALSE}};
-const HeaderEntry* procheader_get_headernames(gboolean full)
+HeaderEntry* procheader_get_headernames(gboolean full)
{
return full ? hentry_full : hentry_short;
}
gchar *reference = NULL;
gchar *p;
gchar *hp;
- const HeaderEntry *hentry;
+ HeaderEntry *hentry;
gint hnum;
hentry = procheader_get_headernames(full);
void procheader_header_array_destroy (GPtrArray *harray);
void procheader_header_free (Header *header);
-const HeaderEntry* procheader_get_headernames (gboolean full);
+HeaderEntry* procheader_get_headernames (gboolean full);
void procheader_get_header_fields (FILE *fp,
HeaderEntry hentry[]);
#include "news.h"
#include "imap.h"
#include "hooks.h"
+#include "msgcache.h"
typedef struct _FlagInfo FlagInfo;
MsgFlags flags;
};
-static GHashTable *procmsg_read_mark_file (const gchar *folder);
-void procmsg_msginfo_write_flags (MsgInfo *msginfo);
-
GHashTable *procmsg_msg_hash_table_create(GSList *mlist)
{
GHashTable *msg_table;
return msg_table;
}
-static gint procmsg_read_cache_data_str(FILE *fp, gchar **str)
-{
- gchar buf[BUFFSIZE];
- gint ret = 0;
- size_t len;
-
- if (fread(&len, sizeof(len), 1, fp) == 1) {
- if (len < 0)
- ret = -1;
- else {
- gchar *tmp = NULL;
-
- while (len > 0) {
- size_t size = MIN(len, BUFFSIZE - 1);
-
- if (fread(buf, size, 1, fp) != 1) {
- ret = -1;
- if (tmp) g_free(tmp);
- *str = NULL;
- break;
- }
-
- buf[size] = '\0';
- if (tmp) {
- *str = g_strconcat(tmp, buf, NULL);
- g_free(tmp);
- tmp = *str;
- } else
- tmp = *str = g_strdup(buf);
-
- len -= size;
- }
- }
- } else
- ret = -1;
-
- if (ret < 0)
- g_warning("Cache data is corrupted\n");
-
- return ret;
-}
-
-#define READ_CACHE_DATA(data, fp) \
-{ \
- if (procmsg_read_cache_data_str(fp, &data) < 0) { \
- procmsg_msginfo_free(msginfo); \
- break; \
- } \
-}
-
-#define READ_CACHE_DATA_INT(n, fp) \
-{ \
- if (fread(&n, sizeof(n), 1, fp) != 1) { \
- g_warning("Cache data is corrupted\n"); \
- procmsg_msginfo_free(msginfo); \
- break; \
- } \
-}
-
-GSList *procmsg_read_cache(FolderItem *item, gboolean scan_file)
-{
- GSList *mlist = NULL;
- GSList *last = NULL;
- gchar *cache_file;
- FILE *fp;
- MsgInfo *msginfo;
- MsgFlags default_flags;
- gchar file_buf[BUFFSIZE];
- gint ver;
- guint num;
- FolderType type;
-
- g_return_val_if_fail(item != NULL, NULL);
- g_return_val_if_fail(item->folder != NULL, NULL);
- type = item->folder->type;
-
- default_flags.perm_flags = MSG_NEW|MSG_UNREAD;
- default_flags.tmp_flags = MSG_CACHED;
- if (type == F_MH || type == F_IMAP) {
- if (item->stype == F_QUEUE) {
- MSG_SET_TMP_FLAGS(default_flags, MSG_QUEUED);
- } else if (item->stype == F_DRAFT) {
- MSG_SET_TMP_FLAGS(default_flags, MSG_DRAFT);
- }
- }
- if (type == F_IMAP) {
- MSG_SET_TMP_FLAGS(default_flags, MSG_IMAP);
- } else if (type == F_NEWS) {
- MSG_SET_TMP_FLAGS(default_flags, MSG_NEWS);
- }
-
- if (type == F_MH) {
- gchar *path;
-
- path = folder_item_get_path(item);
- if (change_dir(path) < 0) {
- g_free(path);
- return NULL;
- }
- g_free(path);
- }
- cache_file = folder_item_get_cache_file(item);
- if ((fp = fopen(cache_file, "rb")) == NULL) {
- debug_print("\tNo cache file\n");
- g_free(cache_file);
- return NULL;
- }
- setvbuf(fp, file_buf, _IOFBF, sizeof(file_buf));
- g_free(cache_file);
-
- debug_print("\tReading summary cache...\n");
-
- /* compare cache version */
- if (fread(&ver, sizeof(ver), 1, fp) != 1 ||
- CACHE_VERSION != ver) {
- debug_print("Cache version is different. Discarding it.\n");
- fclose(fp);
- return NULL;
- }
-
- while (fread(&num, sizeof(num), 1, fp) == 1) {
- msginfo = procmsg_msginfo_new();
- msginfo->msgnum = num;
- READ_CACHE_DATA_INT(msginfo->size, fp);
- READ_CACHE_DATA_INT(msginfo->mtime, fp);
- READ_CACHE_DATA_INT(msginfo->date_t, fp);
- READ_CACHE_DATA_INT(msginfo->flags.tmp_flags, fp);
-
- READ_CACHE_DATA(msginfo->fromname, fp);
-
- READ_CACHE_DATA(msginfo->date, fp);
- READ_CACHE_DATA(msginfo->from, fp);
- READ_CACHE_DATA(msginfo->to, fp);
- READ_CACHE_DATA(msginfo->cc, fp);
- READ_CACHE_DATA(msginfo->newsgroups, fp);
- READ_CACHE_DATA(msginfo->subject, fp);
- READ_CACHE_DATA(msginfo->msgid, fp);
- READ_CACHE_DATA(msginfo->inreplyto, fp);
- READ_CACHE_DATA(msginfo->references, fp);
- READ_CACHE_DATA(msginfo->xref, fp);
-
-
- MSG_SET_PERM_FLAGS(msginfo->flags, default_flags.perm_flags);
- MSG_SET_TMP_FLAGS(msginfo->flags, default_flags.tmp_flags);
-
- /* if the message file doesn't exist or is changed,
- don't add the data */
- if (type == F_MH && scan_file &&
- folder_item_is_msg_changed(item, msginfo))
- procmsg_msginfo_free(msginfo);
- else {
- msginfo->folder = item;
-
- if (!mlist)
- last = mlist = g_slist_append(NULL, msginfo);
- else {
- last = g_slist_append(last, msginfo);
- last = last->next;
- }
- }
- }
-
- fclose(fp);
- debug_print("done.\n");
-
- return mlist;
-}
-
-#undef READ_CACHE_DATA
-#undef READ_CACHE_DATA_INT
-
-void procmsg_set_flags(GSList *mlist, FolderItem *item)
-{
- GSList *cur, *tmp;
- gint newmsg = 0;
- gint lastnum = 0;
- gchar *markdir;
- MsgInfo *msginfo;
- GHashTable *mark_table;
- MsgFlags *flags;
-
- if (!mlist) return;
- g_return_if_fail(item != NULL);
- g_return_if_fail(item->folder != NULL);
-
- debug_print("\tMarking the messages...\n");
-
- markdir = folder_item_get_path(item);
- if (!is_dir_exist(markdir))
- make_dir_hier(markdir);
-
- mark_table = procmsg_read_mark_file(markdir);
- g_free(markdir);
-
- if (!mark_table) return;
-
- for (cur = mlist; cur != NULL; cur = cur->next) {
- msginfo = (MsgInfo *)cur->data;
-
- if (lastnum < msginfo->msgnum)
- lastnum = msginfo->msgnum;
-
- flags = g_hash_table_lookup
- (mark_table, GUINT_TO_POINTER(msginfo->msgnum));
-
- if (flags != NULL) {
- /* add the permanent flags only */
- msginfo->flags.perm_flags = flags->perm_flags;
- if (item->folder->type == F_IMAP) {
- MSG_SET_TMP_FLAGS(msginfo->flags, MSG_IMAP);
- } else if (item->folder->type == F_NEWS) {
- MSG_SET_TMP_FLAGS(msginfo->flags, MSG_NEWS);
- }
- } else {
- /* not found (new message) */
- if (newmsg == 0) {
- for (tmp = mlist; tmp != cur; tmp = tmp->next)
- MSG_UNSET_PERM_FLAGS
- (((MsgInfo *)tmp->data)->flags,
- MSG_NEW);
- }
- newmsg++;
- }
- }
-
- item->last_num = lastnum;
-
- debug_print("done.\n");
- if (newmsg)
- debug_print("\t%d new message(s)\n", newmsg);
-
- hash_free_value_mem(mark_table);
- g_hash_table_destroy(mark_table);
-}
-
gint procmsg_get_last_num_in_msg_list(GSList *mlist)
{
GSList *cur;
g_slist_free(mlist);
}
-void procmsg_write_cache(MsgInfo *msginfo, FILE *fp)
-{
- MsgTmpFlags flags = msginfo->flags.tmp_flags & MSG_CACHED_FLAG_MASK;
-
- WRITE_CACHE_DATA_INT(msginfo->msgnum, fp);
- WRITE_CACHE_DATA_INT(msginfo->size, fp);
- WRITE_CACHE_DATA_INT(msginfo->mtime, fp);
- WRITE_CACHE_DATA_INT(msginfo->date_t, fp);
- WRITE_CACHE_DATA_INT(flags, fp);
-
- WRITE_CACHE_DATA(msginfo->fromname, fp);
-
- WRITE_CACHE_DATA(msginfo->date, fp);
- WRITE_CACHE_DATA(msginfo->from, fp);
- WRITE_CACHE_DATA(msginfo->to, fp);
- WRITE_CACHE_DATA(msginfo->cc, fp);
- WRITE_CACHE_DATA(msginfo->newsgroups, fp);
- WRITE_CACHE_DATA(msginfo->subject, fp);
- WRITE_CACHE_DATA(msginfo->msgid, fp);
- WRITE_CACHE_DATA(msginfo->inreplyto, fp);
- WRITE_CACHE_DATA(msginfo->references, fp);
- WRITE_CACHE_DATA(msginfo->xref, fp);
-
-}
-
-void procmsg_write_flags(MsgInfo *msginfo, FILE *fp)
-{
- MsgPermFlags flags = msginfo->flags.perm_flags;
-
- WRITE_CACHE_DATA_INT(msginfo->msgnum, fp);
- WRITE_CACHE_DATA_INT(flags, fp);
-}
-
-void procmsg_flush_mark_queue(FolderItem *item, FILE *fp)
-{
- MsgInfo *flaginfo;
-
- g_return_if_fail(item != NULL);
- g_return_if_fail(fp != NULL);
-
- while (item->mark_queue != NULL) {
- flaginfo = (MsgInfo *)item->mark_queue->data;
- procmsg_write_flags(flaginfo, fp);
- procmsg_msginfo_free(flaginfo);
- item->mark_queue = g_slist_remove(item->mark_queue, flaginfo);
- }
-}
-
-void procmsg_add_flags(FolderItem *item, gint num, MsgFlags flags)
-{
- FILE *fp;
- gchar *path;
- MsgInfo msginfo;
-
- g_return_if_fail(item != NULL);
-
- if (item->opened) {
- MsgInfo *queue_msginfo;
-
- queue_msginfo = g_new0(MsgInfo, 1);
- queue_msginfo->msgnum = num;
- queue_msginfo->flags = flags;
- item->mark_queue = g_slist_append
- (item->mark_queue, queue_msginfo);
- return;
- }
-
- path = folder_item_get_path(item);
- g_return_if_fail(path != NULL);
-
- if ((fp = procmsg_open_mark_file(path, TRUE)) == NULL) {
- g_warning("can't open mark file\n");
- g_free(path);
- return;
- }
- g_free(path);
-
- msginfo.msgnum = num;
- msginfo.flags = flags;
-
- procmsg_write_flags(&msginfo, fp);
- fclose(fp);
-}
-
struct MarkSum {
gint *new;
gint *unread;
gint first;
};
-static GHashTable *procmsg_read_mark_file(const gchar *folder)
-{
- FILE *fp;
- GHashTable *mark_table = NULL;
- gint num;
- MsgFlags *flags;
- MsgPermFlags perm_flags;
-
- if ((fp = procmsg_open_mark_file(folder, FALSE)) == NULL)
- return NULL;
-
- mark_table = g_hash_table_new(NULL, g_direct_equal);
-
- while (fread(&num, sizeof(num), 1, fp) == 1) {
- if (fread(&perm_flags, sizeof(perm_flags), 1, fp) != 1) break;
-
- flags = g_hash_table_lookup(mark_table, GUINT_TO_POINTER(num));
- if (flags != NULL)
- g_free(flags);
-
- flags = g_new0(MsgFlags, 1);
- flags->perm_flags = perm_flags;
-
- if (!MSG_IS_REALLY_DELETED(*flags)) {
- g_hash_table_insert(mark_table, GUINT_TO_POINTER(num), flags);
- } else {
- g_hash_table_remove(mark_table, GUINT_TO_POINTER(num));
- }
- }
-
- fclose(fp);
- return mark_table;
-}
-
-FILE *procmsg_open_mark_file(const gchar *folder, gboolean append)
-{
- gchar *markfile;
- FILE *fp;
- gint ver;
-
- markfile = g_strconcat(folder, G_DIR_SEPARATOR_S, MARK_FILE, NULL);
-
- if ((fp = fopen(markfile, "rb")) == NULL)
- debug_print("Mark file not found.\n");
- else if (fread(&ver, sizeof(ver), 1, fp) != 1 || MARK_VERSION != ver) {
- debug_print("Mark version is different (%d != %d). "
- "Discarding it.\n", ver, MARK_VERSION);
- fclose(fp);
- fp = NULL;
- }
-
- /* read mode */
- if (append == FALSE) {
- g_free(markfile);
- return fp;
- }
-
- if (fp) {
- /* reopen with append mode */
- fclose(fp);
- if ((fp = fopen(markfile, "ab")) == NULL)
- g_warning("Can't open mark file with append mode.\n");
- } else {
- /* open with overwrite mode if mark file doesn't exist or
- version is different */
- if ((fp = fopen(markfile, "wb")) == NULL)
- g_warning("Can't open mark file with write mode.\n");
- else {
- ver = MARK_VERSION;
- WRITE_CACHE_DATA_INT(ver, fp);
- }
- }
-
- g_free(markfile);
- return fp;
-}
-
static gboolean procmsg_ignore_node(GNode *node, gpointer data)
{
MsgInfo *msginfo = (MsgInfo *)node->data;
folder_item_update(msginfo->folder, F_ITEM_UPDATE_MSGCNT);
CHANGE_FLAGS(msginfo);
- procmsg_msginfo_write_flags(msginfo);
}
void procmsg_msginfo_unset_flags(MsgInfo *msginfo, MsgPermFlags perm_flags, MsgTmpFlags tmp_flags)
folder_item_update(msginfo->folder, F_ITEM_UPDATE_MSGCNT);
CHANGE_FLAGS(msginfo);
- procmsg_msginfo_write_flags(msginfo);
-}
-
-void procmsg_msginfo_write_flags(MsgInfo *msginfo)
-{
- gchar *destdir;
- FILE *fp;
-
- destdir = folder_item_get_path(msginfo->folder);
- if (!is_dir_exist(destdir))
- make_dir_hier(destdir);
-
- if ((fp = procmsg_open_mark_file(destdir, TRUE))) {
- procmsg_write_flags(msginfo, fp);
- fclose(fp);
- } else {
- g_warning("Can't open mark file.\n");
- }
-
- g_free(destdir);
}
/*!
#define MSG_IS_IGNORE_THREAD(msg) (((msg).perm_flags & MSG_IGNORE_THREAD) != 0)
#define MSG_IS_RETRCPT_PENDING(msg) (((msg).perm_flags & MSG_RETRCPT_PENDING) != 0)
-
-#define WRITE_CACHE_DATA_INT(n, fp) \
- fwrite(&n, sizeof(n), 1, fp)
-
-#define WRITE_CACHE_DATA(data, fp) \
-{ \
- gint len; \
- \
- if (data == NULL) { \
- len = 0; \
- WRITE_CACHE_DATA_INT(len, fp); \
- } else { \
- len = strlen(data); \
- WRITE_CACHE_DATA_INT(len, fp); \
- if (len > 0) \
- fwrite(data, len, 1, fp); \
- } \
-}
-
struct _MsgFlags
{
MsgPermFlags perm_flags;
GSList *procmsg_read_cache (FolderItem *item,
gboolean scan_file);
-void procmsg_set_flags (GSList *mlist,
- FolderItem *item);
gint procmsg_get_last_num_in_msg_list(GSList *mlist);
void procmsg_msg_list_free (GSList *mlist);
-void procmsg_write_cache (MsgInfo *msginfo,
- FILE *fp);
-void procmsg_write_flags (MsgInfo *msginfo,
- FILE *fp);
-void procmsg_flush_mark_queue (FolderItem *item,
- FILE *fp);
-void procmsg_add_flags (FolderItem *item,
- gint num,
- MsgFlags flags);
void procmsg_get_mark_sum (const gchar *folder,
gint *new,
gint *unread,
gint *min,
gint *max,
gint first);
-FILE *procmsg_open_mark_file (const gchar *folder,
- gboolean append);
GNode *procmsg_get_thread_tree (GSList *mlist);
GList *sel = NULL;
MsgInfo *msginfo = NULL;
gchar *text;
- gchar *path;
switch (toolbar_item->type) {
case TOOLBAR_MAIN: