2009-09-28 [colin] 3.7.2cvs41
[claws.git] / src / matcher.c
index 6ae1c0df2802f319e4bdcbb973f8a06ae7b81c89..5626e3d9f296bdb9ec252f2b2bebb6a44a2e89f1 100644 (file)
@@ -85,6 +85,10 @@ static const MatchParser matchparser_tab[] = {
        {MATCHCRITERIA_NOT_WATCH_THREAD, "~watch_thread"},
        {MATCHCRITERIA_SPAM, "spam"},
        {MATCHCRITERIA_NOT_SPAM, "~spam"},
+       {MATCHCRITERIA_HAS_ATTACHMENT, "has_attachment"},
+       {MATCHCRITERIA_HAS_NO_ATTACHMENT, "~has_attachment"},
+       {MATCHCRITERIA_SIGNED, "signed"},
+       {MATCHCRITERIA_NOT_SIGNED, "~signed"},
 
        /* msginfo headers */
        {MATCHCRITERIA_SUBJECT, "subject"},
@@ -351,7 +355,7 @@ static gboolean match_with_addresses_in_addressbook
        gboolean found = FALSE;
        gchar *path = NULL;
 
-       g_return_val_if_fail(address_list != NULL, FALSE);
+       cm_return_val_if_fail(address_list != NULL, FALSE);
 
        debug_print("match_with_addresses_in_addressbook(%d, %s)\n",
                                g_slist_length(address_list), folderpath?folderpath:"(null)");
@@ -685,13 +689,21 @@ static gboolean matcherprop_match_test(const MatcherProp *prop,
 #endif
 
        file = procmsg_get_message_file(info);
-       if (file == NULL)
+       if (file == NULL) {
+#ifdef USE_PTHREAD
+               g_free(td);
+#endif
                return FALSE;
+       }
        g_free(file);           
 
        cmd = matching_build_command(prop->expr, info);
-       if (cmd == NULL)
+       if (cmd == NULL) {
+#ifdef USE_PTHREAD
+               g_free(td);
+#endif 
                return FALSE;
+}
 
 #ifdef USE_PTHREAD
        /* debug output */
@@ -798,6 +810,14 @@ gboolean matcherprop_match(MatcherProp *prop,
                return MSG_IS_SPAM(info->flags);
        case MATCHCRITERIA_NOT_SPAM:
                return !MSG_IS_SPAM(info->flags);
+       case MATCHCRITERIA_HAS_ATTACHMENT:
+               return MSG_IS_WITH_ATTACHMENT(info->flags);
+       case MATCHCRITERIA_HAS_NO_ATTACHMENT:
+               return !MSG_IS_WITH_ATTACHMENT(info->flags);
+       case MATCHCRITERIA_SIGNED:
+               return MSG_IS_SIGNED(info->flags);
+       case MATCHCRITERIA_NOT_SIGNED:
+               return !MSG_IS_SIGNED(info->flags);
        case MATCHCRITERIA_COLORLABEL:
        {
                gint color = MSG_GET_COLORLABEL_VALUE(info->flags);
@@ -1206,7 +1226,7 @@ void matcherlist_free(MatcherList *cond)
 {
        GSList *l;
 
-       g_return_if_fail(cond);
+       cm_return_if_fail(cond);
        for (l = cond->matchers ; l != NULL ; l = g_slist_next(l)) {
                matcherprop_free((MatcherProp *) l->data);
        }
@@ -1686,6 +1706,10 @@ gboolean matcherlist_match(MatcherList *matchers, MsgInfo *info)
                case MATCHCRITERIA_NOT_LOCKED:
                case MATCHCRITERIA_SPAM:
                case MATCHCRITERIA_NOT_SPAM:
+               case MATCHCRITERIA_HAS_ATTACHMENT:
+               case MATCHCRITERIA_HAS_NO_ATTACHMENT:
+               case MATCHCRITERIA_SIGNED:
+               case MATCHCRITERIA_NOT_SIGNED:
                case MATCHCRITERIA_COLORLABEL:
                case MATCHCRITERIA_NOT_COLORLABEL:
                case MATCHCRITERIA_IGNORE_THREAD:
@@ -1881,6 +1905,10 @@ gchar *matcherprop_to_string(MatcherProp *matcher)
        case MATCHCRITERIA_NOT_LOCKED:
        case MATCHCRITERIA_SPAM:
        case MATCHCRITERIA_NOT_SPAM:
+       case MATCHCRITERIA_HAS_ATTACHMENT:
+       case MATCHCRITERIA_HAS_NO_ATTACHMENT:
+       case MATCHCRITERIA_SIGNED:
+       case MATCHCRITERIA_NOT_SIGNED:
        case MATCHCRITERIA_PARTIAL:
        case MATCHCRITERIA_NOT_PARTIAL:
        case MATCHCRITERIA_IGNORE_THREAD:
@@ -2372,8 +2400,17 @@ static void matcher_add_rulenames(const gchar *rcpath)
        FILE *dst = g_fopen(newpath, "wb");
        gchar buf[BUFFSIZE];
        int r;
+       if (src == NULL) {
+               perror("fopen");
+               if (dst)
+                       fclose(dst);
+               g_free(newpath);
+               return;
+       }
        if (dst == NULL) {
                perror("fopen");
+               if (src)
+                       fclose(src);
                g_free(newpath);
                return;
        }