+2003-05-07
+
+ * src/compose.c: compose_insert_sig(): fixed a crash when signature
+ string contains illegal sequence.
+ * src/utils.[ch]: changed get_wcs_len() to get_mbs_len() for accuracy.
+
+2003-05-07
+
+ * major refactoring of MIME structure.
+ * src/procmime.c: procmime_scan_message(): decrypt message if
+ gpgme is enabled. Create multipart tree only if content-type is
+ multipart/* or message/rfc822.
+ procmime_scan_multipart_message(): fixed the scanning of
+ message/rfc822 part.
+ * src/action.c: parse_append_msgpart()
+ src/messageview.c: messageview_show()
+ src/mimeview.c: mimeview_show_message(): use procmime_scan_message()
+ instead of procmsg_open_message() and procmime_scan_mime_header().
+ mimeview_set_multipart_tree(): conform to the new MIME structure.
+ * src/textview.c: textview_show_part(): removed unnecessary check.
+ * src/procmsg.c: procmsg_open_message_decrypted(): fixed the file
+ pointer when decryption failed.
+
2003-05-06
* src/ssl.c: ssl_init_socket_with_method(): replaced log_warning()
+2003-05-07 [paul] 0.8.11claws146
+
+ * sync with 0.8.11cvs41
+ see ChangeLog 2003-05-07
+
2003-05-06 [christoph] 0.8.11claws145
* src/main.c
+2003-05-07
+
+ * src/compose.c: compose_insert_sig(): ½ð̾ʸ»úÎó¤ËÉÔÀµ¤Ê¥·¡¼¥±¥ó¥¹
+ ¤¬´Þ¤Þ¤ì¤ë¤È¤¤Î¥¯¥é¥Ã¥·¥å¤ò½¤Àµ¡£
+ * src/utils.[ch]: Àµ³Î¤µ¤Î¤¿¤á get_wcs_len() ¤ò get_mbs_len() ¤ËÊѹ¹¡£
+
+2003-05-07
+
+ * MIME ¹½Â¤¤ÎÂ礤ʥê¥Õ¥¡¥¯¥¿¥ê¥ó¥°¡£
+ * src/procmime.c: procmime_scan_message(): gpgme ¤¬Í¸ú¤Î¤È¤¤Ï
+ ¥á¥Ã¥»¡¼¥¸¤òÉü¹æ²½¤¹¤ë¤è¤¦¤Ë¤·¤¿¡£ content-type ¤¬ multipart/*
+ ¤Þ¤¿¤Ï message/rfc822 ¤Î¾ì¹ç¤Î¤ß¥Þ¥ë¥Á¥Ñ¡¼¥È¥Ä¥ê¡¼¤òºîÀ®¡£
+ procmime_scan_multipart_message(): message/rfc822 ¥Ñ¡¼¥È¤ÎÁöºº
+ ¤ò½¤Àµ¡£
+ * src/action.c: parse_append_msgpart()
+ src/messageview.c: messageview_show()
+ src/mimeview.c: mimeview_show_message(): procmsg_open_message() ¤È
+ procmime_scan_mime_header() ¤ÎÂå¤ï¤ê¤Ë procmime_scan_message()
+ ¤ò»ÈÍÑ¡£
+ mimeview_set_multipart_tree(): ¿·¤·¤¤ MIME ¹½Â¤¤ËÂбþ¡£
+ * src/textview.c: textview_show_part(): ÉÔÍפʥÁ¥§¥Ã¥¯¤òºï½ü¡£
+ * src/procmsg.c: procmsg_open_message_decrypted(): Éü¹æ²½¤Ë¼ºÇÔ¤·¤¿
+ ¾ì¹ç¤Î¥Õ¥¡¥¤¥ë¥Ý¥¤¥ó¥¿¤ò½¤Àµ¡£
+
2003-05-06
* src/ssl.c: ssl_init_socket_with_method(): log_warning() ¤ò
MICRO_VERSION=11
INTERFACE_AGE=0
BINARY_AGE=0
-EXTRA_VERSION=claws145
+EXTRA_VERSION=claws146
VERSION=$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION$EXTRA_VERSION
dnl set $target
gint ret;
if (!partinfo) {
- FILE *fp;
-#if USE_GPGME
- if ((fp = procmsg_open_message_decrypted(msginfo, &partinfo))
- == NULL) {
- alertpanel_error(_("Could not get message file."));
- return FALSE;
- }
-#else
- if ((fp = procmsg_open_message(msginfo)) == NULL) {
- alertpanel_error(_("Could not get message file."));
- return FALSE;
- }
- partinfo = procmime_scan_mime_header(fp);
-#endif
- fclose(fp);
+ partinfo = procmime_scan_message(msginfo);
if (!partinfo) {
- procmime_mimeinfo_free_all(partinfo);
alertpanel_error(_("Could not get message part."));
return FALSE;
}
return NULL;
}
-gint get_wcs_len(const gchar *s)
+gint get_mbs_len(const gchar *s)
{
const gchar *p = s;
gint mb_len;
size_t n);
wchar_t *wcscasestr (const wchar_t *haystack,
const wchar_t *needle);
-gint get_wcs_len (const gchar *s);
+gint get_mbs_len (const gchar *s);
gboolean is_next_nonascii (const guchar *s);
gint get_next_word_len (const gchar *s);
pos = gtkut_stext_find(text, 0, tmp, TRUE);
if (pos != -1) {
- gtk_stext_set_point(text, pos);
- len = get_wcs_len(tmp);
- gtk_stext_forward_delete(text, len);
+ len = get_mbs_len(tmp);
+ if (len >= 0) {
+ gtk_stext_set_point(text, pos);
+ gtk_stext_forward_delete(text, len);
+ } else {
+ len = gtk_stext_get_length(text);
+ gtk_stext_set_point(text, len);
+ }
} else {
len = gtk_stext_get_length(text);
gtk_stext_set_point(text, len);
void messageview_show(MessageView *messageview, MsgInfo *msginfo,
gboolean all_headers)
{
- FILE *fp;
gchar *file;
MimeInfo *mimeinfo;
g_return_if_fail(msginfo != NULL);
-#if USE_GPGME
- if ((fp = procmsg_open_message_decrypted(msginfo, &mimeinfo)) == NULL)
- return;
-#else /* !USE_GPGME */
- if ((fp = procmsg_open_message(msginfo)) == NULL) return;
- mimeinfo = procmime_scan_mime_header(fp);
-#endif /* USE_GPGME */
- fclose(fp);
- if (!mimeinfo) return;
+ mimeinfo = procmime_scan_message(msginfo);
+ g_return_if_fail(mimeinfo != NULL);
file = procmsg_get_message_file_path(msginfo);
if (!file) {
{
GtkCTree *ctree = GTK_CTREE(mimeview->ctree);
GtkCTreeNode *node;
- gchar buf[BUFFSIZE];
FILE *fp;
mimeview_clear(mimeview);
mimeview->mimeinfo = mimeinfo;
- if ((fp = fopen(file, "rb")) == NULL) {
- FILE_OP_ERROR(file, "fopen");
- return;
- }
mimeview->file = g_strdup(file);
- /* skip MIME part headers */
- if (mimeinfo->mime_type == MIME_MULTIPART) {
- if (fseek(fp, mimeinfo->fpos, SEEK_SET) < 0)
- perror("fseek");
- while (fgets(buf, sizeof(buf), fp) != NULL)
- if (buf[0] == '\r' || buf[0] == '\n') break;
- }
-
- procmime_scan_multipart_message(mimeinfo, fp);
#if USE_GPGME
- if ((prefs_common.auto_check_signatures)
- && (gpg_started))
+ if (prefs_common.auto_check_signatures && gpg_started) {
+ if ((fp = fopen(file, "rb")) == NULL) {
+ FILE_OP_ERROR(file, "fopen");
+ return;
+ }
rfc2015_check_signature(mimeinfo, fp);
- else
+ fclose(fp);
+ } else
set_unchecked_signature(mimeinfo);
#endif
partinfo->mime_type == MIME_TEXT_HTML))
break;
}
- fclose(fp);
textview_show_message(mimeview->messageview->textview, mimeinfo, file);
if (!node)
MimeInfo *mimeinfo,
GtkCTreeNode *parent)
{
- GtkCTreeNode *current = parent;
+ GtkCTreeNode *node;
g_return_if_fail(mimeinfo != NULL);
- if (!mimeinfo->sub && mimeinfo->parent)
- current = mimeview_append_part(mimeview, mimeinfo, parent);
- if (mimeinfo->sub && !mimeinfo->sub->children &&
- mimeinfo->sub->mime_type != MIME_TEXT &&
- mimeinfo->sub->mime_type != MIME_TEXT_HTML) {
- mimeview_append_part(mimeview, mimeinfo->sub, parent);
- return;
- }
-
- if (mimeinfo->sub)
- mimeview_set_multipart_tree(mimeview, mimeinfo->sub, current);
-
if (mimeinfo->children)
- mimeview_set_multipart_tree(mimeview, mimeinfo->children, current);
-
- if (mimeinfo->next)
- mimeview_set_multipart_tree(mimeview, mimeinfo->next, parent);
+ mimeinfo = mimeinfo->children;
+
+ while (mimeinfo != NULL) {
+ node = mimeview_append_part(mimeview, mimeinfo, parent);
+
+ if (mimeinfo->children)
+ mimeview_set_multipart_tree(mimeview, mimeinfo, node);
+ else if (mimeinfo->sub &&
+ mimeinfo->sub->mime_type != MIME_TEXT &&
+ mimeinfo->sub->mime_type != MIME_TEXT_HTML)
+ mimeview_set_multipart_tree(mimeview, mimeinfo->sub,
+ node);
+ mimeinfo = mimeinfo->next;
+ }
}
static gchar *get_part_name(MimeInfo *partinfo)
return NULL;
}
+#if 0
+void procmime_dump_mimeinfo(MimeInfo *mimeinfo)
+{
+ gint i;
+
+ g_print("\n");
+
+ for (; mimeinfo != NULL; mimeinfo = procmime_mimeinfo_next(mimeinfo)) {
+ for (i = 0; i < mimeinfo->level; i++)
+ g_print(" ");
+ g_print("%s%s\n", mimeinfo->main ? "sub: " : "",
+ mimeinfo->content_type);
+ }
+}
+#endif
+
MimeInfo *procmime_scan_message(MsgInfo *msginfo)
{
FILE *fp;
g_return_val_if_fail(msginfo != NULL, NULL);
+#if USE_GPGME
+ if ((fp = procmsg_open_message_decrypted(msginfo, &mimeinfo)) == NULL)
+ return NULL;
+#else
if ((fp = procmsg_open_message(msginfo)) == NULL) return NULL;
mimeinfo = procmime_scan_mime_header(fp);
+#endif
if (mimeinfo) {
- if (mimeinfo->mime_type != MIME_MULTIPART) {
- if (fseek(fp, mimeinfo->fpos, SEEK_SET) < 0)
- perror("fseek");
- }
- if (mimeinfo->mime_type != MIME_TEXT)
+ mimeinfo->size = get_left_file_size(fp);
+ if (mimeinfo->mime_type == MIME_MULTIPART ||
+ mimeinfo->mime_type == MIME_MESSAGE_RFC822)
procmime_scan_multipart_message(mimeinfo, fp);
}
-#if USE_GPGME
- if (prefs_common.auto_check_signatures)
- rfc2015_check_signature(mimeinfo, fp);
-#endif
fclose(fp);
return mimeinfo;
gint boundary_len = 0;
gchar buf[BUFFSIZE];
glong fpos, prev_fpos;
- gint npart;
g_return_if_fail(mimeinfo != NULL);
- g_return_if_fail(mimeinfo->mime_type != MIME_TEXT);
+ g_return_if_fail(mimeinfo->mime_type == MIME_MULTIPART ||
+ mimeinfo->mime_type == MIME_MESSAGE_RFC822);
if (mimeinfo->mime_type == MIME_MULTIPART) {
g_return_if_fail(mimeinfo->boundary != NULL);
return;
}
- for (npart = 0;; npart++) {
+ for (;;) {
MimeInfo *partinfo;
gboolean eom = FALSE;
prev_fpos = fpos;
debug_print("prev_fpos: %ld\n", fpos);
- partinfo = procmime_scan_mime_header(fp);
- if (!partinfo) break;
- procmime_mimeinfo_insert(mimeinfo, partinfo);
-
- if (partinfo->mime_type == MIME_MULTIPART) {
- if (partinfo->level < 8)
- procmime_scan_multipart_message(partinfo, fp);
- } else if (partinfo->mime_type == MIME_MESSAGE_RFC822) {
+ if (mimeinfo->mime_type == MIME_MESSAGE_RFC822) {
MimeInfo *sub;
- partinfo->sub = sub = procmime_scan_mime_header(fp);
+ mimeinfo->sub = sub = procmime_scan_mime_header(fp);
if (!sub) break;
- sub->level = partinfo->level + 1;
- sub->parent = partinfo;
- sub->main = partinfo;
-
- if (sub->level < 8) {
- if (sub->mime_type == MIME_MULTIPART) {
- procmime_scan_multipart_message
- (sub, fp);
- } else if (sub->mime_type == MIME_MESSAGE_RFC822) {
- fseek(fp, sub->fpos, SEEK_SET);
- procmime_scan_multipart_message
- (sub, fp);
- }
- }
+ sub->level = mimeinfo->level + 1;
+ sub->parent = mimeinfo->parent;
+ sub->main = mimeinfo;
+
+ partinfo = sub;
+ } else {
+ partinfo = procmime_scan_mime_header(fp);
+ if (!partinfo) break;
+ procmime_mimeinfo_insert(mimeinfo, partinfo);
+ }
+
+ if (partinfo->mime_type == MIME_MULTIPART ||
+ partinfo->mime_type == MIME_MESSAGE_RFC822) {
+ if (partinfo->level < 8)
+ procmime_scan_multipart_message(partinfo, fp);
}
/* look for next boundary */
debug_print("partinfo->size: %d\n", partinfo->size);
if (partinfo->sub && !partinfo->sub->sub &&
!partinfo->sub->children) {
- partinfo->sub->size = fpos - partinfo->sub->fpos - strlen(buf);
+ partinfo->sub->size =
+ fpos - partinfo->sub->fpos - strlen(buf);
debug_print("partinfo->sub->size: %d\n",
partinfo->sub->size);
}
{
FILE *fp;
MimeInfo *mimeinfo_;
+ glong fpos;
g_return_val_if_fail(msginfo != NULL, NULL);
}
if (MSG_IS_ENCRYPTED(msginfo->flags) &&
- (!msginfo->plaintext_file || msginfo->decryption_failed)) {
+ !msginfo->plaintext_file &&
+ !msginfo->decryption_failed) {
+ fpos = ftell(fp);
rfc2015_decrypt_message(msginfo, mimeinfo_, fp);
if (msginfo->plaintext_file &&
!msginfo->decryption_failed) {
fclose(fp);
return NULL;
}
+ } else {
+ if (fseek(fp, fpos, SEEK_SET) < 0)
+ perror("fseek");
}
}
if (mimeinfo->mime_type == MIME_MULTIPART) return;
- if (!mimeinfo->parent &&
- mimeinfo->mime_type != MIME_TEXT &&
- mimeinfo->mime_type != MIME_TEXT_HTML &&
- mimeinfo->mime_type != MIME_TEXT_ENRICHED)
- return;
-
if (fseek(fp, mimeinfo->fpos, SEEK_SET) < 0) {
perror("fseek");
return;
g_return_val_if_fail(str != NULL, FALSE);
- len = get_wcs_len(str);
+ len = get_mbs_len(str);
g_return_val_if_fail(len >= 0, FALSE);
pos = textview->cur_pos;