2004-09-08 [christoph] 0.9.12cvs98
authorChristoph Hohmann <reboot@gmx.ch>
Wed, 8 Sep 2004 14:23:20 +0000 (14:23 +0000)
committerChristoph Hohmann <reboot@gmx.ch>
Wed, 8 Sep 2004 14:23:20 +0000 (14:23 +0000)
* src/procmsg.[ch]
change MSG_CACHED (unused in claws) to MSG_SCANNED to remember
if the message structure has been scanned

* src/folder.c
o scan structure when the mail is fetched for the first time
  to prevent unnecessary fetching of messages while scanning
  the folder for messages
o revert 0.9.12cvs24

* src/plugins/pgpmime/pgpmime.c
check signature if auto signature checking is enabled when the
signature status is requested for first time and not when
checking if a part has a signature

ChangeLog.claws
PATCHSETS
configure.ac
src/folder.c
src/plugins/pgpmime/pgpmime.c
src/procmsg.c
src/procmsg.h

index 272b0f4..30c0ffd 100644 (file)
@@ -1,3 +1,20 @@
+2004-09-08 [christoph] 0.9.12cvs98
+
+       * src/procmsg.[ch]
+               change MSG_CACHED (unused in claws) to MSG_SCANNED to remember
+               if the message structure has been scanned
+
+       * src/folder.c
+               o scan structure when the mail is fetched for the first time
+                 to prevent unnecessary fetching of messages while scanning
+                 the folder for messages
+               o revert 0.9.12cvs24
+
+       * src/plugins/pgpmime/pgpmime.c
+               check signature if auto signature checking is enabled when the
+               signature status is requested for first time and not when
+               checking if a part has a signature
+
 2004-09-07 [colin]     0.9.12cvs97
 
        * src/inc.c
index 4cb0860..19341ba 100644 (file)
--- a/PATCHSETS
+++ b/PATCHSETS
@@ -80,3 +80,4 @@
 ( cvs diff -u -r 1.445 -r 1.446 src/summaryview.c; cvs diff -u -r 1.125 -r 1.126 src/mimeview.c; ) > 0.9.12cvs95.patchset
 ( cvs diff -u -r 1.54 -r 1.55 src/toolbar.c; ) > 0.9.12cvs96.patchset
 ( cvs diff -u -r 1.175 -r 1.176 src/inc.c; ) > 0.9.12cvs97.patchset
+( cvs diff -u -r 1.258 -r 1.259 src/folder.c; cvs diff -u -r 1.166 -r 1.167 src/procmsg.c; cvs diff -u -r 1.70 -r 1.71 src/procmsg.h; cvs diff -u -r 1.3 -r 1.4 src/plugins/pgpmime/pgpmime.c; ) > 0.9.12cvs98.patchset
index 074ac94..06d3509 100644 (file)
@@ -11,7 +11,7 @@ MINOR_VERSION=9
 MICRO_VERSION=12
 INTERFACE_AGE=0
 BINARY_AGE=0
-EXTRA_VERSION=97
+EXTRA_VERSION=98
 EXTRA_RELEASE=
 
 if test \( $EXTRA_VERSION -eq 0 \) -o \( "x$EXTRA_RELEASE" != "x" \); then
index e26a367..f75e98f 100644 (file)
@@ -1403,7 +1403,6 @@ void folder_item_set_default_flags(FolderItem *dest, MsgFlags *flags)
        } else {
                flags->perm_flags = 0;
        }
-       flags->tmp_flags = MSG_CACHED;
        if (FOLDER_TYPE(dest->folder) == F_MH) {
                if (dest->stype == F_QUEUE) {
                        MSG_SET_TMP_FLAGS(*flags, MSG_QUEUED);
@@ -1487,40 +1486,10 @@ gint folder_item_close(FolderItem *item)
        return folder->klass->close(folder, item);
 }
 
-static void msginfo_set_mime_flags(GNode *node, gpointer data)
-{
-       MsgInfo *msginfo = data;
-       MimeInfo *mimeinfo = node->data;
-
-       if (mimeinfo->disposition == DISPOSITIONTYPE_ATTACHMENT) {
-               MSG_SET_TMP_FLAGS(msginfo->flags, MSG_HAS_ATTACHMENT);
-       } else if (mimeinfo->disposition == DISPOSITIONTYPE_UNKNOWN && 
-                mimeinfo->type != MIMETYPE_TEXT &&
-                mimeinfo->type != MIMETYPE_MULTIPART) {
-               MSG_SET_TMP_FLAGS(msginfo->flags, MSG_HAS_ATTACHMENT)
-       }
-
-       /* don't descend below top level message for signed and encrypted info */
-       if (mimeinfo->type == MIMETYPE_MESSAGE)
-               return;
-
-       if (privacy_mimeinfo_is_signed(mimeinfo)) {
-               MSG_SET_TMP_FLAGS(msginfo->flags, MSG_SIGNED);
-       }
-
-       if (privacy_mimeinfo_is_encrypted(mimeinfo)) {
-               MSG_SET_TMP_FLAGS(msginfo->flags, MSG_ENCRYPTED);
-       } else {
-               /* searching inside encrypted parts doesn't really make sense */
-               g_node_children_foreach(mimeinfo->node, G_TRAVERSE_ALL, msginfo_set_mime_flags, msginfo);
-       }
-}
-
 static MsgInfoList *get_msginfos(FolderItem *item, MsgNumberList *numlist)
 {
        MsgInfoList *msglist = NULL;
        Folder *folder = item->folder;
-       MsgInfoList *elem;
 
        if (folder->klass->get_msginfos != NULL)
                msglist = folder->klass->get_msginfos(folder, item, numlist);
@@ -1538,16 +1507,6 @@ static MsgInfoList *get_msginfos(FolderItem *item, MsgNumberList *numlist)
                }               
        }
 
-       for (elem = msglist; elem != NULL; elem = g_slist_next(elem)) {
-               MsgInfo *msginfo = elem->data;
-               MimeInfo *mimeinfo;
-
-               mimeinfo = procmime_scan_message(msginfo);
-               /* check for attachments */
-               g_node_children_foreach(mimeinfo->node, G_TRAVERSE_ALL, msginfo_set_mime_flags, msginfo);
-               procmime_mimeinfo_free_all(mimeinfo);
-       }
-
        return msglist;
 }
 
@@ -1577,30 +1536,21 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
        guint newcnt = 0, unreadcnt = 0, totalcnt = 0, unreadmarkedcnt = 0;
        guint cache_max_num, folder_max_num, cache_cur_num, folder_cur_num;
        gboolean update_flags = 0, old_uids_valid = FALSE;
-       gint err = -1;
-#ifdef USE_GPGME
-       gint old_auto_check = 0;
-       old_auto_check = prefs_common.auto_check_signatures;
-       prefs_common.auto_check_signatures = 0;
-#endif
-       if (item == NULL)
-               goto bail_scan;
-       if (item->path == NULL)
-               goto bail_scan;
+    
+       g_return_val_if_fail(item != NULL, -1);
+       if (item->path == NULL) return -1;
 
        folder = item->folder;
 
-       if (folder == NULL)
-               goto bail_scan;
-       if (folder->klass->get_num_list == NULL)
-               goto bail_scan;
+       g_return_val_if_fail(folder != NULL, -1);
+       g_return_val_if_fail(folder->klass->get_num_list != NULL, -1);
 
        debug_print("Scanning folder %s for cache changes.\n", item->path);
 
        /* Get list of messages for folder and cache */
        if (folder->klass->get_num_list(item->folder, item, &folder_list, &old_uids_valid) < 0) {
                debug_print("Error fetching list of message numbers\n");
-               goto bail_scan;
+               return(-1);
        }
 
        if (old_uids_valid) {
@@ -1813,12 +1763,8 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
 
        folder_item_update(item, update_flags);
        folder_item_update_thaw();
-       err = 0;
-bail_scan:
-#ifdef USE_GPGME
-       prefs_common.auto_check_signatures = old_auto_check;
-#endif
-       return err;
+
+       return 0;
 }
 
 gint folder_item_syncronize_flags(FolderItem *item)
@@ -2115,9 +2061,40 @@ GSList *folder_item_get_msg_list(FolderItem *item)
        return msgcache_get_msg_list(item->cache);
 }
 
+static void msginfo_set_mime_flags(GNode *node, gpointer data)
+{
+       MsgInfo *msginfo = data;
+       MimeInfo *mimeinfo = node->data;
+
+       if (mimeinfo->disposition == DISPOSITIONTYPE_ATTACHMENT) {
+               procmsg_msginfo_set_flags(msginfo, 0, MSG_HAS_ATTACHMENT);
+       } else if (mimeinfo->disposition == DISPOSITIONTYPE_UNKNOWN && 
+                mimeinfo->type != MIMETYPE_TEXT &&
+                mimeinfo->type != MIMETYPE_MULTIPART) {
+               procmsg_msginfo_set_flags(msginfo, 0, MSG_HAS_ATTACHMENT);
+       }
+
+       /* don't descend below top level message for signed and encrypted info */
+       if (mimeinfo->type == MIMETYPE_MESSAGE)
+               return;
+
+       if (privacy_mimeinfo_is_signed(mimeinfo)) {
+               procmsg_msginfo_set_flags(msginfo, 0, MSG_SIGNED);
+       }
+
+       if (privacy_mimeinfo_is_encrypted(mimeinfo)) {
+               procmsg_msginfo_set_flags(msginfo, 0, MSG_ENCRYPTED);
+       } else {
+               /* searching inside encrypted parts doesn't really make sense */
+               g_node_children_foreach(mimeinfo->node, G_TRAVERSE_ALL, msginfo_set_mime_flags, msginfo);
+       }
+}
+
 gchar *folder_item_fetch_msg(FolderItem *item, gint num)
 {
        Folder *folder;
+       gchar *msgfile;
+       MsgInfo *msginfo;
 
        g_return_val_if_fail(item != NULL, NULL);
 
@@ -2125,7 +2102,25 @@ gchar *folder_item_fetch_msg(FolderItem *item, gint num)
 
        g_return_val_if_fail(folder->klass->fetch_msg != NULL, NULL);
 
-       return folder->klass->fetch_msg(folder, item, num);
+       msgfile = folder->klass->fetch_msg(folder, item, num);
+
+       msginfo = folder_item_get_msginfo(item, num);
+       if ((msginfo != NULL) && !MSG_IS_SCANNED(msginfo->flags)) {
+               MimeInfo *mimeinfo;
+
+               if (msginfo->folder->stype != F_QUEUE && 
+                   msginfo->folder->stype != F_DRAFT)
+                       mimeinfo = procmime_scan_file(msgfile);
+               else
+                       mimeinfo = procmime_scan_queue_file(msgfile);
+               /* check for attachments */
+               g_node_children_foreach(mimeinfo->node, G_TRAVERSE_ALL, msginfo_set_mime_flags, msginfo);
+               procmime_mimeinfo_free_all(mimeinfo);
+
+               procmsg_msginfo_set_flags(msginfo, 0, MSG_SCANNED);
+       }
+
+       return msgfile;
 }
 
 gint folder_item_fetch_all_msg(FolderItem *item)
@@ -2417,12 +2412,7 @@ FolderItem *folder_item_move_recursive(FolderItem *src, FolderItem *dest)
        FolderItem *next_item;
        GNode *srcnode;
        gchar *old_id, *new_id;
-       gint err = 1;
-#ifdef USE_GPGME
-       gint old_auto_check = 0;
-       old_auto_check = prefs_common.auto_check_signatures;
-       prefs_common.auto_check_signatures = 0;
-#endif
+
        mlist = folder_item_get_msg_list(src);
 
        /* move messages */
@@ -2430,7 +2420,7 @@ FolderItem *folder_item_move_recursive(FolderItem *src, FolderItem *dest)
        new_item = folder_create_folder(dest, src->name);
        if (new_item == NULL) {
                printf("Can't create folder\n");
-               goto bail_move;
+               return NULL;
        }
        
        if (new_item->folder == NULL)
@@ -2463,7 +2453,7 @@ FolderItem *folder_item_move_recursive(FolderItem *src, FolderItem *dest)
                        next_item = (FolderItem*) srcnode->data;
                        srcnode = srcnode->next;
                        if (folder_item_move_recursive(next_item, new_item) == NULL)
-                               goto bail_move;
+                               return NULL;
                }
        }
        old_id = folder_item_get_identifier(src);
@@ -2479,17 +2469,8 @@ FolderItem *folder_item_move_recursive(FolderItem *src, FolderItem *dest)
                prefs_filtering_rename_path(old_id, new_id);
        g_free(old_id);
        g_free(new_id);
-       err = 0;
 
-bail_move:
-#ifdef USE_GPGME
-       prefs_common.auto_check_signatures = old_auto_check;
-#endif
-
-       if (err != 0)
-               return NULL;
-       else
-               return new_item;
+       return new_item;
 }
 
 gint folder_item_move_to(FolderItem *src, FolderItem *dest, FolderItem **new_item)
index af836f7..b3b0d5f 100644 (file)
@@ -116,9 +116,6 @@ static gboolean pgpmime_is_signed(MimeInfo *mimeinfo)
        data->done_sigtest = TRUE;
        data->is_signed = TRUE;
 
-       if (prefs_common.auto_check_signatures)
-               pgpmime_check_signature(mimeinfo);
-       
        return TRUE;
 }
 
@@ -186,6 +183,10 @@ static SignatureStatus pgpmime_get_sig_status(MimeInfo *mimeinfo)
        
        g_return_val_if_fail(data != NULL, SIGNATURE_INVALID);
 
+       if (data->sigstatus == GPGME_SIG_STAT_NONE && 
+           prefs_common.auto_check_signatures)
+               pgpmime_check_signature(mimeinfo);
+       
        return sgpgme_sigstat_gpgme_to_privacy(data->ctx, data->sigstatus);
 }
 
@@ -195,6 +196,10 @@ static gchar *pgpmime_get_sig_info_short(MimeInfo *mimeinfo)
        
        g_return_val_if_fail(data != NULL, g_strdup("Error"));
 
+       if (data->sigstatus == GPGME_SIG_STAT_NONE && 
+           prefs_common.auto_check_signatures)
+               pgpmime_check_signature(mimeinfo);
+       
        return sgpgme_sigstat_info_short(data->ctx, data->sigstatus);
 }
 
@@ -204,6 +209,10 @@ static gchar *pgpmime_get_sig_info_full(MimeInfo *mimeinfo)
        
        g_return_val_if_fail(data != NULL, g_strdup("Error"));
 
+       if (data->sigstatus == GPGME_SIG_STAT_NONE && 
+           prefs_common.auto_check_signatures)
+               pgpmime_check_signature(mimeinfo);
+       
        return sgpgme_sigstat_info_full(data->ctx, data->sigstatus);
 }
 
@@ -314,13 +323,12 @@ static MimeInfo *pgpmime_decrypt(MimeInfo *mimeinfo)
        } else
                gpgme_release(ctx);
 
-       
        return decinfo;
 }
 
 static PrivacySystem pgpmime_system = {
        "pgpmime",                      /* id */
-       "PGP/Mime",                     /* name */
+       "PGP Mime",                     /* name */
 
        pgpmime_free_privacydata,       /* free_privacydata */
 
index 2ba52b1..a9d9d78 100644 (file)
@@ -1228,8 +1228,7 @@ gint procmsg_send_message_queue(const gchar *file)
                                if (replymessageid != NULL) {
                                        procmsg_msginfo_unset_flags(msginfo, MSG_FORWARDED, 0);
                                        procmsg_msginfo_set_flags(msginfo, MSG_REPLIED, 0);
-                               } 
-                               else {
+                               }  else {
                                        procmsg_msginfo_unset_flags(msginfo, MSG_REPLIED, 0);
                                        procmsg_msginfo_set_flags(msginfo, MSG_FORWARDED, 0);
                                }
@@ -1287,6 +1286,7 @@ void procmsg_msginfo_set_flags(MsgInfo *msginfo, MsgPermFlags perm_flags, MsgTmp
        FolderItem *item;
        MsgInfoUpdate msginfo_update;
        MsgPermFlags perm_flags_new, perm_flags_old;
+       MsgTmpFlags tmp_flags_old;
 
        g_return_if_fail(msginfo != NULL);
        item = msginfo->folder;
@@ -1306,14 +1306,19 @@ void procmsg_msginfo_set_flags(MsgInfo *msginfo, MsgPermFlags perm_flags, MsgTmp
 
                update_folder_msg_counts(item, msginfo, perm_flags_old);
 
+       }
+
+       /* Tmp flags handling */
+       tmp_flags_old = msginfo->flags.tmp_flags;
+       msginfo->flags.tmp_flags |= tmp_flags;
+
+       /* update notification */
+       if ((perm_flags_old != perm_flags_new) || (tmp_flags_old != msginfo->flags.tmp_flags)) {
                msginfo_update.msginfo = msginfo;
                msginfo_update.flags = MSGINFO_UPDATE_FLAGS;
                hooks_invoke(MSGINFO_UPDATE_HOOKLIST, &msginfo_update);
                folder_item_update(msginfo->folder, F_ITEM_UPDATE_MSGCNT);
        }
-
-       /* Tmp flags hanlding */
-       msginfo->flags.tmp_flags |= tmp_flags;
 }
 
 void procmsg_msginfo_unset_flags(MsgInfo *msginfo, MsgPermFlags perm_flags, MsgTmpFlags tmp_flags)
@@ -1321,6 +1326,7 @@ void procmsg_msginfo_unset_flags(MsgInfo *msginfo, MsgPermFlags perm_flags, MsgT
        FolderItem *item;
        MsgInfoUpdate msginfo_update;
        MsgPermFlags perm_flags_new, perm_flags_old;
+       MsgTmpFlags tmp_flags_old;
 
        g_return_if_fail(msginfo != NULL);
        item = msginfo->folder;
@@ -1344,7 +1350,16 @@ void procmsg_msginfo_unset_flags(MsgInfo *msginfo, MsgPermFlags perm_flags, MsgT
        }
 
        /* Tmp flags hanlding */
+       tmp_flags_old = msginfo->flags.tmp_flags;
        msginfo->flags.tmp_flags &= ~tmp_flags;
+
+       /* update notification */
+       if ((perm_flags_old != perm_flags_new) || (tmp_flags_old != msginfo->flags.tmp_flags)) {
+               msginfo_update.msginfo = msginfo;
+               msginfo_update.flags = MSGINFO_UPDATE_FLAGS;
+               hooks_invoke(MSGINFO_UPDATE_HOOKLIST, &msginfo_update);
+               folder_item_update(msginfo->folder, F_ITEM_UPDATE_MSGCNT);
+       }
 }
 
 /*!
index f1e3582..2d566aa 100644 (file)
@@ -93,11 +93,11 @@ typedef guint32 MsgPermFlags;
 #define MSG_SIGNED             (1U << 21)
 #define MSG_MULTIPART          (1U << 29)
 #define MSG_HAS_ATTACHMENT     (1U << 30)
-#define MSG_CACHED             (1U << 31)
+#define MSG_SCANNED            (1U << 31)
 
 typedef guint32 MsgTmpFlags;
 
-#define MSG_CACHED_FLAG_MASK   (MSG_MULTIPART | MSG_ENCRYPTED | MSG_SIGNED | MSG_HAS_ATTACHMENT)
+#define MSG_CACHED_FLAG_MASK   (MSG_MULTIPART | MSG_ENCRYPTED | MSG_SIGNED | MSG_HAS_ATTACHMENT | MSG_SCANNED)
 
 #define MSG_SET_FLAGS(msg, flags)      { (msg) |= (flags); }
 #define MSG_UNSET_FLAGS(msg, flags)    { (msg) &= ~(flags); }
@@ -137,7 +137,7 @@ typedef guint32 MsgTmpFlags;
 #define MSG_IS_NEWS(msg)               (((msg).tmp_flags & MSG_NEWS) != 0)
 #define MSG_IS_MULTIPART(msg)          (((msg).tmp_flags & MSG_MULTIPART) != 0)
 #define MSG_IS_WITH_ATTACHMENT(msg)    (((msg).tmp_flags & MSG_HAS_ATTACHMENT) != 0)
-#define MSG_IS_CACHED(msg)             (((msg).tmp_flags & MSG_CACHED) != 0)
+#define MSG_IS_SCANNED(msg)            (((msg).tmp_flags & MSG_SCANNED) != 0)
 
 /* Claws related flags */
 #define MSG_IS_REALLY_DELETED(msg)     (((msg).perm_flags & MSG_REALLY_DELETED) != 0)