2007-07-26 [colin] 2.10.0cvs68

* src/ldapserver.c
		Fix possible crash on cache invalidation
	* src/compose.c
	* src/procmime.c
	* src/procmime.h
	* src/quote_fmt_parse.y
		Make replying to mails with big attachments
		much faster. Fixes bug 1224, 'The process of
		Replying to emails with large attachments
		seems unreasonably long...'
This commit is contained in:
Colin Leroy 2007-07-26 16:32:02 +00:00
parent af3288a90e
commit 438277591e
8 changed files with 114 additions and 30 deletions

View file

@ -1,3 +1,16 @@
2007-07-26 [colin] 2.10.0cvs68
* src/ldapserver.c
Fix possible crash on cache invalidation
* src/compose.c
* src/procmime.c
* src/procmime.h
* src/quote_fmt_parse.y
Make replying to mails with big attachments
much faster. Fixes bug 1224, 'The process of
Replying to emails with large attachments
seems unreasonably long...'
2007-07-26 [colin] 2.10.0cvs67
* src/mimeview.c

View file

@ -2721,3 +2721,4 @@
( cvs diff -u -r 1.654.2.2774 -r 1.654.2.2775 configure.ac; ) > 2.10.0cvs65.patchset
( cvs diff -u -r 1.12.2.38 -r 1.12.2.39 src/gtk/prefswindow.c; ) > 2.10.0cvs66.patchset
( cvs diff -u -r 1.83.2.113 -r 1.83.2.114 src/mimeview.c; cvs diff -u -r 1.75.2.43 -r 1.75.2.44 src/matcher.c; cvs diff -u -r 1.9.2.20 -r 1.9.2.21 src/common/ssl.c; ) > 2.10.0cvs67.patchset
( cvs diff -u -r 1.382.2.395 -r 1.382.2.396 src/compose.c; cvs diff -u -r 1.4.2.10 -r 1.4.2.11 src/ldapserver.c; cvs diff -u -r 1.49.2.93 -r 1.49.2.94 src/procmime.c; cvs diff -u -r 1.17.2.18 -r 1.17.2.19 src/procmime.h; cvs diff -u -r 1.22.2.34 -r 1.22.2.35 src/quote_fmt_parse.y; ) > 2.10.0cvs68.patchset

View file

@ -11,7 +11,7 @@ MINOR_VERSION=10
MICRO_VERSION=0
INTERFACE_AGE=0
BINARY_AGE=0
EXTRA_VERSION=67
EXTRA_VERSION=68
EXTRA_RELEASE=
EXTRA_GTK2_VERSION=

View file

@ -123,6 +123,7 @@
#include "combobox.h"
#include "hooks.h"
#include "privacy.h"
#include "timing.h"
enum
{
@ -1359,7 +1360,7 @@ static void compose_extract_original_charset(Compose *compose)
info = compose->targetinfo;
}
if (info) {
MimeInfo *mimeinfo = procmime_scan_message(info);
MimeInfo *mimeinfo = procmime_scan_message_short(info);
MimeInfo *partinfo = mimeinfo;
while (partinfo && partinfo->type != MIMETYPE_TEXT)
partinfo = procmime_mimeinfo_next(partinfo);
@ -1405,7 +1406,7 @@ static Compose *compose_generic_reply(MsgInfo *msginfo,
gboolean quote = FALSE;
const gchar *qmark = NULL;
const gchar *body_fmt = NULL;
START_TIMING("");
g_return_val_if_fail(msginfo != NULL, NULL);
g_return_val_if_fail(msginfo->folder != NULL, NULL);
@ -1482,7 +1483,8 @@ static Compose *compose_generic_reply(MsgInfo *msginfo,
_("Message reply format error at line %d."));
quote_fmt_reset_vartable();
}
if (procmime_msginfo_is_encrypted(compose->replyinfo)) {
if (MSG_IS_ENCRYPTED(compose->replyinfo->flags)) {
compose_force_encryption(compose, account, FALSE);
}
@ -1512,7 +1514,7 @@ static Compose *compose_generic_reply(MsgInfo *msginfo,
compose_destroy(compose);
return NULL;
}
END_TIMING();
return compose;
}
@ -1998,7 +2000,7 @@ Compose *compose_reedit(MsgInfo *msginfo, gboolean batch)
G_CALLBACK(compose_changed_cb),
compose);
if (procmime_msginfo_is_encrypted(msginfo)) {
if (MSG_IS_ENCRYPTED(msginfo->flags)) {
fp = procmime_get_first_encrypted_text_content(msginfo);
if (fp) {
compose_force_encryption(compose, account, TRUE);
@ -8419,6 +8421,10 @@ gboolean compose_draft (gpointer data, guint action)
}
newmsginfo = folder_item_get_msginfo(draft, msgnum);
if (!newmsginfo && compose->msgid) {
newmsginfo = folder_item_get_msginfo_by_msgid(draft, compose->msgid);
msgnum = newmsginfo->msgnum;
}
if (newmsginfo) {
procmsg_msginfo_unset_flags(newmsginfo, ~0, ~0);
if (target_locked)
@ -9806,9 +9812,8 @@ static void compose_reply_from_messageview_real(MessageView *msgview, GSList *ms
orig_msginfo, mimeinfo);
if (tmp_msginfo != NULL) {
new_msglist = g_slist_append(NULL, tmp_msginfo);
if (procmime_msginfo_is_encrypted(orig_msginfo)) {
originally_enc = TRUE;
}
originally_enc = MSG_IS_ENCRYPTED(orig_msginfo->flags);
tmp_msginfo->folder = orig_msginfo->folder;
tmp_msginfo->msgnum = orig_msginfo->msgnum;
if (orig_msginfo->tags)

View file

@ -703,6 +703,8 @@ gint ldapsvr_read_data( LdapServer *server )
//printf( "...addrbook_read_data :%s:\n", addrcache_get_name( server->addressCache ) );
addrcache_clear(server->addressCache);
ldapsvr_free_all_query( server );
server->listQuery = NULL;
server->addressCache->modified = FALSE;
server->addressCache->accessFlag = FALSE;
server->addressCache->dataRead = TRUE;

View file

@ -50,8 +50,12 @@
#include "prefs_common.h"
#include "prefs_gtk.h"
#include "alertpanel.h"
#include "timing.h"
static GHashTable *procmime_get_mime_type_table (void);
static MimeInfo *procmime_scan_file_short(const gchar *filename);
static MimeInfo *procmime_scan_queue_file_short(const gchar *filename);
static MimeInfo *procmime_scan_queue_file_full(const gchar *filename, gboolean short_scan);
MimeInfo *procmime_mimeinfo_new(void)
{
@ -186,7 +190,7 @@ MimeInfo *procmime_scan_message(MsgInfo *msginfo)
{
gchar *filename;
MimeInfo *mimeinfo;
START_TIMING("");
filename = procmsg_get_message_file_path(msginfo);
if (!filename || !is_file_exist(filename)) {
g_free(filename);
@ -200,6 +204,28 @@ MimeInfo *procmime_scan_message(MsgInfo *msginfo)
mimeinfo = procmime_scan_queue_file(filename);
g_free(filename);
END_TIMING();
return mimeinfo;
}
MimeInfo *procmime_scan_message_short(MsgInfo *msginfo)
{
gchar *filename;
MimeInfo *mimeinfo;
filename = procmsg_get_message_file_path(msginfo);
if (!filename || !is_file_exist(filename)) {
g_free(filename);
return NULL;
}
if (!folder_has_parent_of_type(msginfo->folder, F_QUEUE) &&
!folder_has_parent_of_type(msginfo->folder, F_DRAFT))
mimeinfo = procmime_scan_file_short(filename);
else
mimeinfo = procmime_scan_queue_file_short(filename);
g_free(filename);
return mimeinfo;
}
@ -812,18 +838,21 @@ FILE *procmime_get_text_content(MimeInfo *mimeinfo)
return outfp;
}
static void output_mime_structure(MimeInfo *mimeinfo, int indent);
/* search the first text part of (multipart) MIME message,
decode, convert it and output to outfp. */
FILE *procmime_get_first_text_content(MsgInfo *msginfo)
{
FILE *outfp = NULL;
MimeInfo *mimeinfo, *partinfo;
START_TIMING("");
g_return_val_if_fail(msginfo != NULL, NULL);
mimeinfo = procmime_scan_message(msginfo);
mimeinfo = procmime_scan_message_short(msginfo);
if (!mimeinfo) return NULL;
output_mime_structure(mimeinfo, 0);
partinfo = mimeinfo;
while (partinfo && partinfo->type != MIMETYPE_TEXT) {
partinfo = procmime_mimeinfo_next(partinfo);
@ -832,7 +861,7 @@ FILE *procmime_get_first_text_content(MsgInfo *msginfo)
outfp = procmime_get_text_content(partinfo);
procmime_mimeinfo_free_all(mimeinfo);
END_TIMING();
return outfp;
}
@ -1348,9 +1377,10 @@ static int procmime_parse_mimepart(MimeInfo *parent,
gchar *content_location,
const gchar *filename,
guint offset,
guint length);
guint length,
gboolean short_scan);
static void procmime_parse_message_rfc822(MimeInfo *mimeinfo)
static void procmime_parse_message_rfc822(MimeInfo *mimeinfo, gboolean short_scan)
{
HeaderEntry hentry[] = {{"Content-Type:", NULL, TRUE},
{"Content-Transfer-Encoding:",
@ -1411,7 +1441,7 @@ static void procmime_parse_message_rfc822(MimeInfo *mimeinfo)
hentry[2].body, hentry[3].body,
hentry[4].body, hentry[5].body,
mimeinfo->data.filename, content_start,
len);
len, short_scan);
for (i = 0; i < (sizeof hentry / sizeof hentry[0]); i++) {
g_free(hentry[i].body);
@ -1419,7 +1449,7 @@ static void procmime_parse_message_rfc822(MimeInfo *mimeinfo)
}
}
static void procmime_parse_multipart(MimeInfo *mimeinfo)
static void procmime_parse_multipart(MimeInfo *mimeinfo, gboolean short_scan)
{
HeaderEntry hentry[] = {{"Content-Type:", NULL, TRUE},
{"Content-Transfer-Encoding:",
@ -1439,6 +1469,7 @@ static void procmime_parse_multipart(MimeInfo *mimeinfo)
gchar buf[BUFFSIZE];
FILE *fp;
int result = 0;
gboolean done = FALSE;
boundary = g_hash_table_lookup(mimeinfo->typeparameters, "boundary");
if (!boundary)
@ -1467,7 +1498,11 @@ static void procmime_parse_multipart(MimeInfo *mimeinfo)
hentry[2].body, hentry[3].body,
hentry[4].body, hentry[5].body,
mimeinfo->data.filename, lastoffset,
len);
len, short_scan);
if (result == 1 && short_scan) {
done = TRUE;
break;
}
}
if (buf[2 + boundary_len] == '-' &&
@ -1760,10 +1795,11 @@ static int procmime_parse_mimepart(MimeInfo *parent,
gchar *content_location,
const gchar *filename,
guint offset,
guint length)
guint length,
gboolean short_scan)
{
MimeInfo *mimeinfo;
int result = 0;
/* Create MimeInfo */
mimeinfo = procmime_mimeinfo_new();
mimeinfo->content = MIMECONTENT_FILE;
@ -1824,21 +1860,27 @@ static int procmime_parse_mimepart(MimeInfo *parent,
/* Call parser for mime type */
switch (mimeinfo->type) {
case MIMETYPE_TEXT:
if (g_ascii_strcasecmp(mimeinfo->subtype, "plain") == 0 && short_scan) {
return 1;
}
break;
case MIMETYPE_MESSAGE:
if (g_ascii_strcasecmp(mimeinfo->subtype, "rfc822") == 0) {
procmime_parse_message_rfc822(mimeinfo);
procmime_parse_message_rfc822(mimeinfo, short_scan);
}
break;
case MIMETYPE_MULTIPART:
procmime_parse_multipart(mimeinfo);
procmime_parse_multipart(mimeinfo, short_scan);
break;
default:
break;
}
return 0;
return result;
}
static gchar *typenames[] = {
@ -1870,7 +1912,7 @@ static void output_mime_structure(MimeInfo *mimeinfo, int indent)
g_node_traverse(mimeinfo->node, G_PRE_ORDER, G_TRAVERSE_ALL, -1, output_func, NULL);
}
static MimeInfo *procmime_scan_file_with_offset(const gchar *filename, int offset)
static MimeInfo *procmime_scan_file_with_offset(const gchar *filename, int offset, gboolean short_scan)
{
MimeInfo *mimeinfo;
struct stat buf;
@ -1886,25 +1928,35 @@ static MimeInfo *procmime_scan_file_with_offset(const gchar *filename, int offse
mimeinfo->offset = offset;
mimeinfo->length = buf.st_size - offset;
procmime_parse_message_rfc822(mimeinfo);
procmime_parse_message_rfc822(mimeinfo, short_scan);
if (debug_get_mode())
output_mime_structure(mimeinfo, 0);
return mimeinfo;
}
MimeInfo *procmime_scan_file(const gchar *filename)
static MimeInfo *procmime_scan_file_full(const gchar *filename, gboolean short_scan)
{
MimeInfo *mimeinfo;
g_return_val_if_fail(filename != NULL, NULL);
mimeinfo = procmime_scan_file_with_offset(filename, 0);
mimeinfo = procmime_scan_file_with_offset(filename, 0, short_scan);
return mimeinfo;
}
MimeInfo *procmime_scan_queue_file(const gchar *filename)
MimeInfo *procmime_scan_file(const gchar *filename)
{
return procmime_scan_file_full(filename, FALSE);
}
static MimeInfo *procmime_scan_file_short(const gchar *filename)
{
return procmime_scan_file_full(filename, TRUE);
}
static MimeInfo *procmime_scan_queue_file_full(const gchar *filename, gboolean short_scan)
{
FILE *fp;
MimeInfo *mimeinfo;
@ -1938,11 +1990,21 @@ MimeInfo *procmime_scan_queue_file(const gchar *filename)
offset = ftell(fp);
fclose(fp);
mimeinfo = procmime_scan_file_with_offset(filename, offset);
mimeinfo = procmime_scan_file_with_offset(filename, offset, short_scan);
return mimeinfo;
}
MimeInfo *procmime_scan_queue_file(const gchar *filename)
{
return procmime_scan_queue_file_full(filename, FALSE);
}
static MimeInfo *procmime_scan_queue_file_short(const gchar *filename)
{
return procmime_scan_queue_file_full(filename, TRUE);
}
typedef enum {
ENC_AS_TOKEN,
ENC_AS_QUOTED_STRING,

View file

@ -165,6 +165,7 @@ MimeInfo *procmime_mimeinfo_parent (MimeInfo *mimeinfo);
MimeInfo *procmime_mimeinfo_next (MimeInfo *mimeinfo);
MimeInfo *procmime_scan_message (MsgInfo *msginfo);
MimeInfo *procmime_scan_message_short (MsgInfo *msginfo);
void procmime_scan_multipart_message (MimeInfo *mimeinfo,
FILE *fp);
const gchar *procmime_mimeinfo_get_parameter

View file

@ -426,7 +426,7 @@ static void quote_fmt_show_msg(MsgInfo *msginfo, const gchar *body,
if (body)
fp = str_open_as_stream(body);
else {
if (procmime_msginfo_is_encrypted(msginfo))
if (MSG_IS_ENCRYPTED(msginfo->flags))
fp = procmime_get_first_encrypted_text_content(msginfo);
else
fp = procmime_get_first_text_content(msginfo);