put back a g_free()
[claws.git] / src / summaryview.c
index 4bbfeb708b1403eca3b1e39310b81b6a36d89aa7..feb139f5f1f8c91a49014c3a41b0ba88121e6d13 100644 (file)
@@ -2191,6 +2191,28 @@ static void summary_write_cache_func(GtkCTree *ctree, GtkCTreeNode *node,
        procmsg_write_flags(msginfo, fps->mark_fp);
 }
 
+static gchar *summary_complete_address(const gchar *addr)
+{
+       gint count;
+       gchar *res, *tmp, *email_addr;
+
+       Xstrdup_a(email_addr, addr, return NULL);
+       extract_address(email_addr);
+       g_return_val_if_fail(*email_addr, NULL);
+
+       /*
+        * completion stuff must be already initialized
+        */
+       res = NULL;
+       if (1 < (count = complete_address(email_addr))) {
+               tmp = get_complete_address(1);
+               res = procheader_get_fromname(tmp);
+               g_free(tmp);    
+       }
+       
+       return res;
+}
+
 static void summary_set_header(SummaryView *summaryview, gchar *text[],
                               MsgInfo *msginfo)
 {
@@ -2230,34 +2252,37 @@ static void summary_set_header(SummaryView *summaryview, gchar *text[],
                _("(No From)");
        if (prefs_common.swap_from && msginfo->from && msginfo->to &&
            !MSG_IS_NEWS(msginfo->flags)) {
-               gchar *from;
+               gchar *addr = NULL;
 
-               Xstrdup_a(from, msginfo->from, return);
-               extract_address(from);
-               if (account_find_from_address(from)) {
+               if (prefs_common.use_addr_book) {
+                       Xstrdup_a(addr, msginfo->from, return);
+                       extract_address(addr);
+               }
+
+               if (account_find_from_address(addr)) {
+                       addr = summary_complete_address(msginfo->to);
                        g_free(to);
-                       to = g_strconcat("-->", msginfo->to, NULL);
+                       to   = g_strconcat("-->", addr == NULL ? msginfo->to : addr, NULL);
                        text[col_pos[S_COL_FROM]] = to;
                }
        }
 
-       if ((text[col_pos[S_COL_FROM]] != to) && prefs_common.use_addr_book &&
-           msginfo->from) {
-               gint count;
+       /*
+        * CLAWS: note that the "text[col_pos[S_COL_FROM]] != to" is really a hack, 
+        * checking whether the above block (which handles the special case of
+        * the --> in sent boxes) was executed.
+        */
+       if (text[col_pos[S_COL_FROM]] != to && prefs_common.use_addr_book && msginfo->from) {
                gchar *from;
-  
-               Xstrdup_a(from, msginfo->from, return);
-               extract_address(from);
-               if (*from) {
-                       count = complete_address(from);
-                       if (count > 1) {
-                               g_free(from_name);
-                               from = get_complete_address(1);
-                               from_name = procheader_get_fromname(from);
-                               g_free(from);
-                               text[col_pos[S_COL_FROM]] = from_name;
-                       }
-               }
+               from = summary_complete_address(msginfo->from);
+               if (from) {
+                       /*
+                        * FIXME: this text[col_pos[S_COL_FROM]] should be freed
+                        * but may have been assigned _("No From"). Should be
+                        * freed??? 
+                        */
+                       text[col_pos[S_COL_FROM]] = from;
+               }       
        }
 
        if (prefs->enable_simplify_subject 
@@ -3935,23 +3960,42 @@ static void summary_filter_func(GtkCTree *ctree, GtkCTreeNode *node,
 
 void summary_filter_open(SummaryView *summaryview, PrefsFilterType type)
 {
-       static HeaderEntry hentry[] = {{"List-Id:",        NULL, FALSE},
+       static HeaderEntry hentry[] = {{"X-BeenThere:",    NULL, FALSE},
                                       {"X-ML-Name:",      NULL, FALSE},
                                       {"X-List:",         NULL, FALSE},
                                       {"X-Mailing-list:", NULL, FALSE},
+                                      {"List-Id:",        NULL, FALSE},
                                       {NULL,              NULL, FALSE}};
+
+       static gchar *header_strs[] = {"From", "from", "To", "to", "Subject", "subject"};
+
+       static gchar *hentry_strs[]   = {"X-BeenThere", "X-ML-Name", "X-List",
+                                        "X-Mailing-List", "List-Id",
+                                        "header \"X-BeenThere\"", "header \"X-ML-Name\"",
+                                        "header \"X-List\"", "header \"X-Mailing-List\"",
+                                        "header \"List-Id\""};
        enum
        {
-               H_LIST_ID        = 0,
+               H_X_BEENTHERE    = 0,
                H_X_ML_NAME      = 1,
                H_X_LIST         = 2,
-               H_X_MAILING_LIST = 3
+               H_X_MAILING_LIST = 3,
+               H_LIST_ID        = 4
+       };
+
+       enum
+       {
+               H_FROM    = 0,
+               H_TO      = 2,
+               H_SUBJECT = 4
        };
 
        MsgInfo *msginfo;
        gchar *header = NULL;
        gchar *key = NULL;
        FILE *fp;
+       int header_offset;
+       int hentry_offset;
 
        if (!summaryview->selected) return;
 
@@ -3959,6 +4003,15 @@ void summary_filter_open(SummaryView *summaryview, PrefsFilterType type)
                                              summaryview->selected);
        if (!msginfo) return;
 
+       if (global_processing) {
+               header_offset = 1;
+               hentry_offset = 5;
+       }
+       else {
+               header_offset = 0;
+               hentry_offset = 0;
+       }
+
        switch (type) {
        case FILTER_BY_NONE:
                break;
@@ -3967,50 +4020,58 @@ void summary_filter_open(SummaryView *summaryview, PrefsFilterType type)
                procheader_get_header_fields(fp, hentry);
                fclose(fp);
 
-               if (hentry[H_LIST_ID].body != NULL) {
-                       header = "List-Id";
-                       Xstrdup_a(key, hentry[H_LIST_ID].body, );
+               if (hentry[H_X_BEENTHERE].body != NULL) {
+                       header = hentry_strs[H_X_BEENTHERE + hentry_offset];
+                       Xstrdup_a(key, hentry[H_X_BEENTHERE].body, );
                } else if (hentry[H_X_ML_NAME].body != NULL) {
-                       header = "X-ML-Name";
+                       header = hentry_strs[H_X_ML_NAME + hentry_offset];
                        Xstrdup_a(key, hentry[H_X_ML_NAME].body, );
                } else if (hentry[H_X_LIST].body != NULL) {
-                       header = "X-List";
+                       header = hentry_strs[H_X_LIST + hentry_offset];
                        Xstrdup_a(key, hentry[H_X_LIST].body, );
                } else if (hentry[H_X_MAILING_LIST].body != NULL) {
-                       header = "X-Mailing-list";
+                       header = hentry_strs[H_X_MAILING_LIST + hentry_offset];
                        Xstrdup_a(key, hentry[H_X_MAILING_LIST].body, );
+               } else if (hentry[H_LIST_ID].body != NULL) {
+                       header = hentry_strs[H_LIST_ID + hentry_offset];
+                       Xstrdup_a(key, hentry[H_LIST_ID].body, );
                } else if (msginfo->subject) {
-                       header = "Subject";
+                       header = header_strs[H_SUBJECT + header_offset];
                        key = msginfo->subject;
                }
 
-               g_free(hentry[H_LIST_ID].body);
-               hentry[H_LIST_ID].body = NULL;
+               g_free(hentry[H_X_BEENTHERE].body);
+               hentry[H_X_BEENTHERE].body = NULL;
                g_free(hentry[H_X_ML_NAME].body);
                hentry[H_X_ML_NAME].body = NULL;
                g_free(hentry[H_X_LIST].body);
                hentry[H_X_LIST].body = NULL;
                g_free(hentry[H_X_MAILING_LIST].body);
                hentry[H_X_MAILING_LIST].body = NULL;
+               g_free(hentry[H_LIST_ID].body);
+               hentry[H_LIST_ID].body = NULL;
 
                break;
        case FILTER_BY_FROM:
-               header = "From";
+               header = header_strs[H_FROM + header_offset];
                key = msginfo->from;
                break;
        case FILTER_BY_TO:
-               header = "To";
+               header = header_strs[H_TO + header_offset];
                key = msginfo->to;
                break;
        case FILTER_BY_SUBJECT:
-               header = "Subject";
+               header = header_strs[H_SUBJECT + header_offset];
                key = msginfo->subject;
                break;
        default:
                break;
        }
 
-       prefs_filter_open(header, key);
+       if (global_processing)
+               prefs_filtering_open(NULL, header, key);
+       else
+               prefs_filter_open(header, key);
 }
 
 void summary_reply(SummaryView *summaryview, ComposeMode mode)