2009-09-14 [colin] 3.7.2cvs32
[claws.git] / src / matcher.c
index 00c4734f2abd348ee416dbfab42c316ba45f37b3..8a7930b06af929c99201dec04525677487bfa795 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)");
@@ -463,6 +467,7 @@ static gboolean matcherprop_string_match(MatcherProp *prop, const gchar *str,
        switch (prop->matchtype) {
        case MATCHTYPE_REGEXPCASE:
        case MATCHTYPE_REGEXP:
+#ifndef G_OS_WIN32
                if (!prop->preg && (prop->error == 0)) {
                        prop->preg = g_new0(regex_t, 1);
                        /* if regexp then don't use the escaped string */
@@ -505,7 +510,7 @@ static gboolean matcherprop_string_match(MatcherProp *prop, const gchar *str,
                        g_free(stripped);
                }
                break;
-                       
+#endif                 
        case MATCHTYPE_MATCHCASE:
        case MATCHTYPE_MATCH:
                ret = (strstr(str1, down_expr) != NULL);
@@ -797,6 +802,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);
@@ -1033,76 +1046,76 @@ gboolean matcherprop_match(MatcherProp *prop,
        }
        case MATCHCRITERIA_SIZE_GREATER:
        {
-               /* FIXME: info->size is an off_t */
-               gboolean ret = (info->size > (off_t) prop->value);
+               /* FIXME: info->size is a goffset */
+               gboolean ret = (info->size > (goffset) prop->value);
 
                /* debug output */
                if (debug_filtering_session
                                && prefs_common.filtering_debug_level >= FILTERING_DEBUG_LEVEL_HIGH) {
                        if (ret) {
                                log_print(LOG_DEBUG_FILTERING,
-                                               "message size [ %ld ] is greater than [ %d ]\n",
-                                               info->size, prop->value);
+                                               "message size is greater than [ %d ]\n",
+                                               prop->value);
                        } else {
                                log_print(LOG_DEBUG_FILTERING,
-                                               "message size [ %ld ] is not greater than [ %d ]\n",
-                                               info->size, prop->value);
+                                               "message size is not greater than [ %d ]\n",
+                                               prop->value);
                        }
                }
                return ret;
        }
        case MATCHCRITERIA_SIZE_SMALLER:
        {
-               /* FIXME: info->size is an off_t */
-               gboolean ret = (info->size < (off_t) prop->value);
+               /* FIXME: info->size is a goffset */
+               gboolean ret = (info->size < (goffset) prop->value);
 
                /* debug output */
                if (debug_filtering_session
                                && prefs_common.filtering_debug_level >= FILTERING_DEBUG_LEVEL_HIGH) {
                        if (ret) {
                                log_print(LOG_DEBUG_FILTERING,
-                                               "message size [ %ld ] is smaller than [ %d ]\n",
-                                               info->size, prop->value);
+                                               "message size is smaller than [ %d ]\n",
+                                               prop->value);
                        } else {
                                log_print(LOG_DEBUG_FILTERING,
-                                               "message size [ %ld ] is not smaller than [ %d ]\n",
-                                               info->size, prop->value);
+                                               "message size is not smaller than [ %d ]\n",
+                                               prop->value);
                        }
                }
                return ret;
        }
        case MATCHCRITERIA_SIZE_EQUAL:
        {
-               /* FIXME: info->size is an off_t */
-               gboolean ret = (info->size == (off_t) prop->value);
+               /* FIXME: info->size is a goffset */
+               gboolean ret = (info->size == (goffset) prop->value);
 
                /* debug output */
                if (debug_filtering_session
                                && prefs_common.filtering_debug_level >= FILTERING_DEBUG_LEVEL_HIGH) {
                        if (ret) {
                                log_print(LOG_DEBUG_FILTERING,
-                                               "message size [ %ld ] is equal to [ %d ]\n",
-                                               info->size, prop->value);
+                                               "message size is equal to [ %d ]\n",
+                                               prop->value);
                        } else {
                                log_print(LOG_DEBUG_FILTERING,
-                                               "message size [ %ld ] is not equal to [ %d ]\n",
-                                               info->size, prop->value);
+                                               "message size is not equal to [ %d ]\n",
+                                               prop->value);
                        }
                }
                return ret;
        }
        case MATCHCRITERIA_PARTIAL:
        {
-               /* FIXME: info->size is an off_t */
-               gboolean ret = (info->total_size != 0 && info->size != (off_t)info->total_size);
+               /* FIXME: info->size is a goffset */
+               gboolean ret = (info->total_size != 0 && info->size != (goffset)info->total_size);
 
                /* debug output */
                if (debug_filtering_session
                                && prefs_common.filtering_debug_level >= FILTERING_DEBUG_LEVEL_HIGH) {
                        if (ret) {
                                log_print(LOG_DEBUG_FILTERING,
-                                               "message is partially downloaded, size [ %ld ] is less than total size [ %d ])\n",
-                                               info->size, info->total_size);
+                                               "message is partially downloaded, size is less than total size [ %d ])\n",
+                                               info->total_size);
                        } else {
                                log_print(LOG_DEBUG_FILTERING,
                                                "message is not partially downloaded\n");
@@ -1112,8 +1125,8 @@ gboolean matcherprop_match(MatcherProp *prop,
        }
        case MATCHCRITERIA_NOT_PARTIAL:
        {
-               /* FIXME: info->size is an off_t */
-               gboolean ret = (info->total_size == 0 || info->size == (off_t)info->total_size);
+               /* FIXME: info->size is a goffset */
+               gboolean ret = (info->total_size == 0 || info->size == (goffset)info->total_size);
 
                /* debug output */
                if (debug_filtering_session
@@ -1123,8 +1136,8 @@ gboolean matcherprop_match(MatcherProp *prop,
                                                "message is not partially downloaded\n");
                        } else {
                                log_print(LOG_DEBUG_FILTERING,
-                                               "message is partially downloaded, size [ %ld ] is less than total size [ %d ])\n",
-                                               info->size, info->total_size);
+                                               "message is partially downloaded, size is less than total size [ %d ])\n",
+                                               info->total_size);
                        }
                }
                return ret;
@@ -1205,10 +1218,11 @@ 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);
        }
+       g_slist_free(cond->matchers);
        g_free(cond);
 }
 
@@ -1684,6 +1698,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:
@@ -1879,6 +1897,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:
@@ -2001,9 +2023,9 @@ static void add_str_default(gchar ** dest,
 
 /* matching_build_command() - preferably cmd should be unescaped */
 /*!
- *\brief       Build the command line to execute
+ *\brief       Build the command-line to execute
  *
- *\param       cmd String with command line specifiers
+ *\param       cmd String with command-line specifiers
  *\param       info Message info to use for command
  *
  *\return      gchar * Newly allocated string
@@ -2370,8 +2392,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;
        }