+2002-08-28
+
+ * src/folder.[ch]: folder_get_path(): new. It returns the root path
+ of Folder.
+ * src/imap.c
+ src/news.c
+ imap_folder_destroy()
+ imap_remove_msg()
+ imap_remove_all_msg()
+ news_folder_destroy(): remove cache directories / files when
+ deleting Folder / messages.
+ * src/utils.c:
+ file_exist()
+ is_dir_exist()
+ is_file_entry_exist(): check if the argument is NULL.
+ remove_all_files()
+ remove_numbered_files()
+ remove_expired_files(): fixed memory leaks on error.
+
+2002-08-28
+
+ * src/folder.[ch]
+ src/imap.[ch]
+ src/mh.[ch]
+ src/news.[ch]
+ src/session.[ch]
+ src/smtp.[ch]: made Folder and Session destructor virtual method.
+
2002-08-27
* src/compose.c: do joining of normal lines only when auto-wrapping.
+ * src/main.c: modified the warning message for GnuPG.
+ * src/about.c: about_create(): modified the compiled-in features
+ list.
+ * configure.in: improved LDAP library checking (thanks to Alfons).
2002-08-26
-2002-08-29 [colin] 0.8.2claws1
+2002-08-28 [paul] 0.8.2claws2
+
+ * sync with 0.8.2cvs4
+ see ChangeLog 2002-08-27 and 2002-08-28
+
+2002-08-28 [colin] 0.8.2claws1
* src/summary_search.c
Added "AND search"
+2002-08-28
+
+ * src/folder.[ch]: folder_get_path(): ¿·µ¬¡£ Folder ¤Î¥ë¡¼¥È¥Ñ¥¹¤ò
+ ÊÖ¤¹¡£
+ * src/imap.c
+ src/news.c
+ imap_folder_destroy()
+ imap_remove_msg()
+ imap_remove_all_msg()
+ news_folder_destroy(): Folder / ¥á¥Ã¥»¡¼¥¸¤òºï½ü¤¹¤ë¤È¤¤Ë
+ ¥¥ã¥Ã¥·¥å¥Ç¥£¥ì¥¯¥È¥ê / ¥Õ¥¡¥¤¥ë¤òºï½ü¤¹¤ë¤è¤¦¤Ë¤·¤¿¡£
+ * src/utils.c:
+ file_exist()
+ is_dir_exist()
+ is_file_entry_exist(): °ú¿ô¤¬ NULL ¤«¤É¤¦¤«¤ò¥Á¥§¥Ã¥¯¡£
+ remove_all_files()
+ remove_numbered_files()
+ remove_expired_files(): ¥¨¥é¡¼»þ¤Î¥á¥â¥ê¥ê¡¼¥¯¤ò½¤Àµ¡£
+
+2002-08-28
+
+ * src/folder.[ch]
+ src/imap.[ch]
+ src/mh.[ch]
+ src/news.[ch]
+ src/session.[ch]
+ src/smtp.[ch]: Folder ¤È Session ¤Î¥Ç¥¹¥È¥é¥¯¥¿¤ò²¾Áۥ᥽¥Ã¥É¤Ë
+ ¤·¤¿¡£
+
2002-08-27
* src/compose.c: Ä̾ï¹Ô¤Î·ë¹ç¤ò¼«Æ°²þ¹Ô»þ¤Î¤ß¹Ô¤¦¤è¤¦¤Ë¤·¤¿¡£
+ * src/main.c: GnuPG ¤Î·Ù¹ð¥á¥Ã¥»¡¼¥¸¤ò½¤Àµ¡£
+ * src/about.c: about_create(): ¥³¥ó¥Ñ¥¤¥ëºÑµ¡Ç½°ìÍ÷¤ò½¤Àµ¡£
+ * configure.in: LDAP ¥é¥¤¥Ö¥é¥ê¤Î¥Á¥§¥Ã¥¯¤ò²þÎÉ(Alfons ¤µ¤ó thanks)¡£
2002-08-26
MICRO_VERSION=2
INTERFACE_AGE=0
BINARY_AGE=0
-EXTRA_VERSION=claws1
+EXTRA_VERSION=claws2
VERSION=$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION$EXTRA_VERSION
dnl set $target
AC_MSG_CHECKING([whether to use GPGME])
if test $ac_cv_enable_gpgme = yes; then
AC_MSG_RESULT(yes)
- AM_PATH_GPGME(0.2.3, AC_DEFINE(USE_GPGME), [use_gpgme=no
+ AM_PATH_GPGME(0.3.5, AC_DEFINE(USE_GPGME), [use_gpgme=no
ac_cv_enable_gpgme=no])
else
AC_MSG_RESULT(no)
" IPv6"
#endif
#if HAVE_LIBCOMPFACE
- " libcompface"
+ " compface"
#endif
#if HAVE_LIBJCONV
- " libjconv"
+ " jconv"
#endif
#if USE_GPGME
- " GPGME"
+ " GnuPG"
#endif
#if USE_SSL
- " SSL"
+ " OpenSSL"
#endif
#if USE_LDAP
" LDAP"
MsgInfo *msginfo);
static void compose_wrap_line (Compose *compose);
static void compose_wrap_line_all (Compose *compose);
+static void compose_wrap_line_all_full (Compose *compose,
+ gboolean autowrap);
static void compose_set_title (Compose *compose);
static PrefsAccount *compose_current_mail_account(void);
/* check if we should join the next line */
static gboolean join_next_line(GtkSText *text, guint start_pos, guint tlen,
- guint prev_ilen)
+ guint prev_ilen, gboolean autowrap)
{
guint indent_len, ch_len;
gboolean do_join = FALSE;
indent_len = get_indent_length(text, start_pos, tlen);
- if (indent_len > 0 && indent_len == prev_ilen) {
+ if ((autowrap || indent_len > 0) && indent_len == prev_ilen) {
GET_CHAR(start_pos + indent_len, cbuf, ch_len);
if (ch_len > 0 && (cbuf[0] != '\n'))
do_join = TRUE;
return do_join;
}
+static void compose_wrap_line_all(Compose *compose)
+{
+ compose_wrap_line_all_full(compose, FALSE);
+}
+
#define STEXT_FREEZE() \
if (!frozen) { gtk_stext_freeze(text); frozen = TRUE; }
-static void compose_wrap_line_all(Compose *compose)
+static void compose_wrap_line_all_full(Compose *compose, gboolean autowrap)
{
GtkSText *text = GTK_STEXT(compose->text);
guint tlen;
gchar cb[MB_LEN_MAX];
/* should we join the next line */
- if (i_len != cur_len && do_delete &&
- join_next_line(text, cur_pos + 1, tlen, i_len))
+ if ((autowrap || i_len != cur_len) && do_delete &&
+ join_next_line
+ (text, cur_pos + 1, tlen, i_len, autowrap))
do_delete = TRUE;
else
do_delete = FALSE;
/* start over with current line */
is_new_line = TRUE;
line_len = cur_len = 0;
- if (i_len)
+ if (autowrap || i_len > 0)
do_delete = TRUE;
else
do_delete = FALSE;
return;
}
}
+
gtk_widget_destroy(compose->window);
}
(GTK_EDITABLE(compose->focused_editable), 0, -1);
}
-static void compose_gtk_stext_action_cb(Compose *compose, ComposeCallGtkSTextAction action)
+static void compose_gtk_stext_action_cb(Compose *compose,
+ ComposeCallGtkSTextAction action)
{
- if (!(compose->focused_editable && GTK_WIDGET_HAS_FOCUS(compose->focused_editable))) return;
-
- switch (action) {
- case COMPOSE_CALL_GTK_STEXT_MOVE_BEGINNING_OF_LINE:
- gtk_stext_move_beginning_of_line(GTK_STEXT(compose->focused_editable));
- break;
- case COMPOSE_CALL_GTK_STEXT_MOVE_FORWARD_CHARACTER:
- gtk_stext_move_forward_character(GTK_STEXT(compose->focused_editable));
- break;
- case COMPOSE_CALL_GTK_STEXT_MOVE_BACKWARD_CHARACTER:
- gtk_stext_move_backward_character(GTK_STEXT(compose->focused_editable));
- break;
- case COMPOSE_CALL_GTK_STEXT_MOVE_FORWARD_WORD:
- gtk_stext_move_forward_word(GTK_STEXT(compose->focused_editable));
- break;
- case COMPOSE_CALL_GTK_STEXT_MOVE_BACKWARD_WORD:
- gtk_stext_move_backward_word(GTK_STEXT(compose->focused_editable));
- break;
- case COMPOSE_CALL_GTK_STEXT_MOVE_END_OF_LINE:
- gtk_stext_move_end_of_line(GTK_STEXT(compose->focused_editable));
- break;
- case COMPOSE_CALL_GTK_STEXT_MOVE_NEXT_LINE:
- gtk_stext_move_next_line(GTK_STEXT(compose->focused_editable));
- break;
- case COMPOSE_CALL_GTK_STEXT_MOVE_PREVIOUS_LINE:
- gtk_stext_move_previous_line(GTK_STEXT(compose->focused_editable));
- break;
- case COMPOSE_CALL_GTK_STEXT_DELETE_FORWARD_CHARACTER:
- gtk_stext_delete_forward_character(GTK_STEXT(compose->focused_editable));
- break;
- case COMPOSE_CALL_GTK_STEXT_DELETE_BACKWARD_CHARACTER:
- gtk_stext_delete_backward_character(GTK_STEXT(compose->focused_editable));
- break;
- case COMPOSE_CALL_GTK_STEXT_DELETE_FORWARD_WORD:
- gtk_stext_delete_forward_word(GTK_STEXT(compose->focused_editable));
- break;
- case COMPOSE_CALL_GTK_STEXT_DELETE_BACKWARD_WORD:
- gtk_stext_delete_backward_word(GTK_STEXT(compose->focused_editable));
- break;
- case COMPOSE_CALL_GTK_STEXT_DELETE_LINE:
- gtk_stext_delete_line(GTK_STEXT(compose->focused_editable));
- break;
- case COMPOSE_CALL_GTK_STEXT_DELETE_LINE_N:
- gtk_stext_delete_line(GTK_STEXT(compose->focused_editable));
- gtk_stext_delete_forward_character(GTK_STEXT(compose->focused_editable));
- break;
- case COMPOSE_CALL_GTK_STEXT_DELETE_TO_LINE_END:
- gtk_stext_delete_to_line_end(GTK_STEXT(compose->focused_editable));
- break;
- default:
- break;
- }
+ GtkSText *text = GTK_STEXT(compose->text);
+ static struct {
+ void (*do_action) (GtkSText *text);
+ } action_table[] = {
+ {gtk_stext_move_beginning_of_line},
+ {gtk_stext_move_forward_character},
+ {gtk_stext_move_backward_character},
+ {gtk_stext_move_forward_word},
+ {gtk_stext_move_backward_word},
+ {gtk_stext_move_end_of_line},
+ {gtk_stext_move_next_line},
+ {gtk_stext_move_previous_line},
+ {gtk_stext_delete_forward_character},
+ {gtk_stext_delete_backward_character},
+ {gtk_stext_delete_forward_word},
+ {gtk_stext_delete_backward_word},
+ {gtk_stext_delete_line},
+ {gtk_stext_delete_line}, /* gtk_stext_delete_line_n */
+ {gtk_stext_delete_to_line_end}
+ };
+
+ if (!GTK_WIDGET_HAS_FOCUS(text)) return;
+
+ if (action >= COMPOSE_CALL_GTK_STEXT_MOVE_BEGINNING_OF_LINE &&
+ action <= COMPOSE_CALL_GTK_STEXT_DELETE_TO_LINE_END)
+ action_table[action].do_action(text);
}
static void compose_grab_focus_cb(GtkWidget *widget, Compose *compose)
gtk_editable_insert_text(editable, text, length, position);
if (prefs_common.autowrap)
- compose_wrap_line_all(compose);
+ compose_wrap_line_all_full(compose, TRUE);
gtk_signal_handler_unblock_by_func(GTK_OBJECT(widget),
GTK_SIGNAL_FUNC(text_inserted),
void folder_destroy(Folder *folder)
{
g_return_if_fail(folder != NULL);
+ g_return_if_fail(folder->destroy != NULL);
- switch (folder->type) {
- case F_MBOX:
- mbox_folder_destroy(MBOX_FOLDER(folder));
- case F_MH:
- mh_folder_destroy(MH_FOLDER(folder));
- break;
- case F_IMAP:
- imap_folder_destroy(IMAP_FOLDER(folder));
- break;
- case F_NEWS:
- news_folder_destroy(NEWS_FOLDER(folder));
- break;
- default:
- break;
- }
+ folder->destroy(folder);
folder_list = g_list_remove(folder_list, folder);
#undef CREATE_FOLDER_IF_NOT_EXIST
-gchar *folder_item_get_path(FolderItem *item)
+gchar *folder_get_path(Folder *folder)
{
- gchar *folder_path;
gchar *path;
- g_return_val_if_fail(item != NULL, NULL);
+ g_return_val_if_fail(folder != NULL, NULL);
- if (FOLDER_TYPE(item->folder) == F_MH)
- folder_path = g_strdup(LOCAL_FOLDER(item->folder)->rootpath);
- else if (FOLDER_TYPE(item->folder) == F_MBOX) {
- path = mbox_get_virtual_path(item);
+ if (FOLDER_TYPE(folder) == F_MH)
+ path = g_strdup(LOCAL_FOLDER(folder)->rootpath);
+ else if (FOLDER_TYPE(folder) == F_MBOX) {
+ path = mbox_get_virtual_path(folder);
if (path == NULL)
return NULL;
- folder_path = g_strconcat(get_mbox_cache_dir(),
+ path = g_strconcat(get_mbox_cache_dir(),
G_DIR_SEPARATOR_S, path, NULL);
- g_free(path);
-
- return folder_path;
+ return path;
}
- else if (FOLDER_TYPE(item->folder) == F_IMAP) {
- g_return_val_if_fail(item->folder->account != NULL, NULL);
- folder_path = g_strconcat(get_imap_cache_dir(),
- G_DIR_SEPARATOR_S,
- item->folder->account->recv_server,
- G_DIR_SEPARATOR_S,
- item->folder->account->userid,
- NULL);
- } else if (FOLDER_TYPE(item->folder) == F_NEWS) {
- g_return_val_if_fail(item->folder->account != NULL, NULL);
- folder_path = g_strconcat(get_news_cache_dir(),
- G_DIR_SEPARATOR_S,
- item->folder->account->nntp_server,
- NULL);
+ else if (FOLDER_TYPE(folder) == F_IMAP) {
+ g_return_val_if_fail(folder->account != NULL, NULL);
+ path = g_strconcat(get_imap_cache_dir(),
+ G_DIR_SEPARATOR_S,
+ folder->account->recv_server,
+ G_DIR_SEPARATOR_S,
+ folder->account->userid,
+ NULL);
+ } else if (FOLDER_TYPE(folder) == F_NEWS) {
+ g_return_val_if_fail(folder->account != NULL, NULL);
+ path = g_strconcat(get_news_cache_dir(),
+ G_DIR_SEPARATOR_S,
+ folder->account->nntp_server,
+ NULL);
} else
- return NULL;
+ path = NULL;
+
+ return path;
+}
+
+gchar *folder_item_get_path(FolderItem *item)
+{
+ gchar *folder_path;
+ gchar *path;
+
+ g_return_val_if_fail(item != NULL, NULL);
+ folder_path = folder_get_path(item->folder);
g_return_val_if_fail(folder_path != NULL, NULL);
if (folder_path[0] == G_DIR_SEPARATOR) {
const gchar *name);
gint (*remove_folder) (Folder *folder,
FolderItem *item);
+
+ void (*destroy) (Folder *folder);
void (*update_mark) (Folder *folder,
FolderItem *item);
void (*change_flags) (Folder *folder,
FolderItem *folder_get_default_processing (void);
void folder_set_missing_folders (void);
+gchar *folder_get_path (Folder *folder);
gchar *folder_item_get_path (FolderItem *item);
+
gint folder_item_scan (FolderItem *item);
void folder_item_scan_foreach (GHashTable *table);
MsgInfo *folder_item_fetch_msginfo (FolderItem *item,
return folder;
}
-void imap_folder_destroy(IMAPFolder *folder)
+void imap_folder_destroy(Folder *folder)
{
- g_free(folder->selected_folder);
-
+ gchar *dir;
+
+ dir = folder_get_path(folder);
+ if (is_dir_exist(dir))
+ remove_dir_recursive(dir);
+ g_free(dir);
+
folder_remote_folder_destroy(REMOTE_FOLDER(folder));
}
folder->create_folder = imap_create_folder;
folder->rename_folder = imap_rename_folder;
folder->remove_folder = imap_remove_folder;
+ folder->destroy = imap_folder_destroy;
folder->check_msgnum_validity = imap_check_msgnum_validity;
folder->get_num_list = imap_get_num_list;
}
session = g_new(IMAPSession, 1);
+
SESSION(session)->type = SESSION_IMAP;
SESSION(session)->server = g_strdup(account->recv_server);
SESSION(session)->sock = imap_sock;
SESSION(session)->phase = SESSION_READY;
SESSION(session)->last_access_time = time(NULL);
SESSION(session)->data = NULL;
+
+ SESSION(session)->destroy = imap_session_destroy;
+
session->mbox = NULL;
session_list = g_list_append(session_list, session);
return SESSION(session);
}
-void imap_session_destroy(IMAPSession *session)
+void imap_session_destroy(Session *session)
{
- sock_close(SESSION(session)->sock);
- SESSION(session)->sock = NULL;
+ sock_close(session->sock);
+ session->sock = NULL;
- g_free(session->mbox);
+ g_free(IMAP_SESSION(session)->mbox);
session_list = g_list_remove(session_list, session);
}
guint32 uid_validity;
gint ok;
IMAPSession *session;
+ gchar *dir;
g_return_val_if_fail(folder != NULL, -1);
g_return_val_if_fail(folder->type == F_IMAP, -1);
return ok;
}
+ dir = folder_item_get_path(item);
+ remove_numbered_files(dir, uid, uid);
+ g_free(dir);
+
return IMAP_SUCCESS;
}
guint32 uid_validity;
gint ok;
IMAPSession *session;
+ gchar *dir;
g_return_val_if_fail(folder != NULL, -1);
g_return_val_if_fail(item != NULL, -1);
return ok;
}
+ dir = folder_item_get_path(item);
+ remove_all_numbered_files(dir);
+ g_free(dir);
+
return IMAP_SUCCESS;
}
Folder *imap_folder_new (const gchar *name,
const gchar *path);
-void imap_folder_destroy (IMAPFolder *folder);
+void imap_folder_destroy (Folder *folder);
FolderItem *imap_folder_item_new ();
void imap_folder_item_destroy (FolderItem *item);
Session *imap_session_new (const PrefsAccount *account);
-void imap_session_destroy (IMAPSession *session);
+void imap_session_destroy (Session *session);
void imap_session_destroy_all (void);
GSList *imap_get_msg_list (Folder *folder,
val = alertpanel_message_with_disable
(_("Warning"),
- _("GnuPG is not installed properly.\n"
+ _("GnuPG is not installed properly, or needs to be upgraded.\n"
"OpenPGP support disabled."));
if (val & G_ALERTDISABLE)
prefs_common.gpg_warning = FALSE;
return folder;
}
-void news_folder_destroy(NewsFolder *folder)
+void news_folder_destroy(Folder *folder)
{
+ gchar *dir;
+
+ dir = folder_get_path(folder);
+ if (is_dir_exist(dir))
+ remove_dir_recursive(dir);
+ g_free(dir);
+
folder_remote_folder_destroy(REMOTE_FOLDER(folder));
}
/*
folder->scan = news_scan_group;
*/
+ folder->destroy = news_folder_destroy;
folder->remove_msg = news_remove_msg;
folder->get_num_list = news_get_num_list;
folder->fetch_msginfo = news_fetch_msginfo;
SESSION(session)->phase = SESSION_READY;
SESSION(session)->last_access_time = time(NULL);
SESSION(session)->data = NULL;
+
+ SESSION(session)->destroy = news_session_destroy;
+
session->group = NULL;
return SESSION(session);
}
-void news_session_destroy(NNTPSession *session)
+void news_session_destroy(Session *session)
{
- nntp_close(session->nntp_sock);
- session->nntp_sock = NULL;
- SESSION(session)->sock = NULL;
+ nntp_close(NNTP_SESSION(session)->nntp_sock);
+ NNTP_SESSION(session)->nntp_sock = NULL;
+ session->sock = NULL;
- g_free(session->group);
+ g_free(NNTP_SESSION(session)->group);
}
static Session *news_session_new_for_folder(Folder *folder)
Folder *news_folder_new (const gchar *name,
const gchar *folder);
-void news_folder_destroy (NewsFolder *folder);
+void news_folder_destroy (Folder *folder);
-void news_session_destroy (NNTPSession *session);
+void news_session_destroy (Session *session);
NNTPSession *news_session_get (Folder *folder);
GSList *news_get_article_list (Folder *folder,
#include <glib.h>
#include "session.h"
-#include "imap.h"
-#include "news.h"
-#include "smtp.h"
void session_destroy(Session *session)
{
g_return_if_fail(session != NULL);
+ g_return_if_fail(session->destroy != NULL);
- switch (session->type) {
- case SESSION_IMAP:
- imap_session_destroy(IMAP_SESSION(session));
- break;
- case SESSION_NEWS:
- news_session_destroy(NNTP_SESSION(session));
- break;
- case SESSION_SMTP:
- smtp_session_destroy(SMTP_SESSION(session));
- break;
- default:
- break;
- }
-
+ session->destroy(session);
g_free(session->server);
g_free(session);
}
/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999,2000 Hiroyuki Yamamoto
+ * Copyright (C) 1999-2002 Hiroyuki Yamamoto
*
* 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
time_t last_access_time;
gpointer data;
+
+ void (*destroy) (Session *session);
};
void session_destroy (Session *session);
SESSION(session)->phase = SESSION_READY;
SESSION(session)->last_access_time = 0;
SESSION(session)->data = NULL;
+
+ SESSION(session)->destroy = smtp_session_destroy;
+
session->avail_auth_type = avail_auth_type;
session->user = user ? g_strdup(user) : NULL;
session->pass = pass ? g_strdup(pass) :
return SESSION(session);
}
-void smtp_session_destroy(SMTPSession *session)
+void smtp_session_destroy(Session *session)
{
- sock_close(SESSION(session)->sock);
- SESSION(session)->sock = NULL;
+ sock_close(session->sock);
+ session->sock = NULL;
- g_free(session->user);
- g_free(session->pass);
+ g_free(SMTP_SESSION(session)->user);
+ g_free(SMTP_SESSION(session)->pass);
}
gint smtp_from(SMTPSession *session, const gchar *from,
const gchar *user,
const gchar *pass);
#endif
-void smtp_session_destroy (SMTPSession *session);
+void smtp_session_destroy (Session *session);
gint smtp_from (SMTPSession *session,
const gchar *from,
{
struct stat s;
+ if (file == NULL)
+ return FALSE;
+
if (stat(file, &s) < 0) {
if (ENOENT != errno) FILE_OP_ERROR(file, "stat");
return FALSE;
{
struct stat s;
+ if (dir == NULL)
+ return FALSE;
+
if (stat(dir, &s) < 0) {
if (ENOENT != errno) FILE_OP_ERROR(dir, "stat");
return FALSE;
{
struct stat s;
+ if (file == NULL)
+ return FALSE;
+
if (stat(file, &s) < 0) {
if (ENOENT != errno) FILE_OP_ERROR(file, "stat");
return FALSE;
if (chdir(dir) < 0) {
FILE_OP_ERROR(dir, "chdir");
+ g_free(prev_dir);
return -1;
}
if ((dp = opendir(".")) == NULL) {
FILE_OP_ERROR(dir, "opendir");
+ g_free(prev_dir);
return -1;
}
if (chdir(dir) < 0) {
FILE_OP_ERROR(dir, "chdir");
+ g_free(prev_dir);
return -1;
}
if ((dp = opendir(".")) == NULL) {
FILE_OP_ERROR(dir, "opendir");
+ g_free(prev_dir);
return -1;
}
if (chdir(dir) < 0) {
FILE_OP_ERROR(dir, "chdir");
+ g_free(prev_dir);
return -1;
}
if ((dp = opendir(".")) == NULL) {
FILE_OP_ERROR(dir, "opendir");
+ g_free(prev_dir);
return -1;
}