sync with 0.9.10claws57 HEAD
[claws.git] / src / filtering.c
index fb79d43bd2283ccc6c58cde8b14b9f2b88e64c79..7b68fa03d85b7dda574d3569a36acad903574f45 100644 (file)
@@ -284,7 +284,7 @@ static gboolean filteringaction_apply(FilteringAction * action, MsgInfo * info)
                return TRUE;
 
        case MATCHACTION_STOP:
-                return TRUE;
+                return FALSE;
 
        case MATCHACTION_HIDE:
                 info->hidden = TRUE;
@@ -318,6 +318,17 @@ static gboolean filtering_match_condition(FilteringProp *filtering, MsgInfo *inf
        return matcherlist_match(filtering->matchers, info);
 }
 
+/*!
+ *\brief       Apply a rule on message.
+ *
+ *\param       filtering List of filtering rules.
+ *\param       info Message to apply rules on.
+ *\param       final Variable returning TRUE or FALSE if one of the
+ *             encountered actions was final. 
+ *             See also \ref filtering_is_final_action.
+ *
+ *\return      gboolean TRUE to continue applying rules.
+ */
 static gboolean filtering_apply_rule(FilteringProp *filtering, MsgInfo *info,
     gboolean * final)
 {
@@ -332,7 +343,7 @@ static gboolean filtering_apply_rule(FilteringProp *filtering, MsgInfo *info,
                 action = tmp->data;
                 
                 if (FALSE == (result = filteringaction_apply(action, info))) {
-                        g_warning("action %s could not be applied", 
+                        g_warning("No further processing after rule %s\n",
                             filteringaction_to_string(buf, sizeof buf, action));
                 }
                 
@@ -344,6 +355,14 @@ static gboolean filtering_apply_rule(FilteringProp *filtering, MsgInfo *info,
        return result;
 }
 
+/*!
+ *\brief       Check if an action is "final", i.e. should break further
+ *             processing.
+ *
+ *\param       filtering_action Action to check.
+ *
+ *\return      gboolean TRUE if \a filtering_action is final.  
+ */
 static gboolean filtering_is_final_action(FilteringAction *filtering_action)
 {
        switch(filtering_action->type) {
@@ -360,15 +379,15 @@ static gboolean filter_msginfo(GSList * filtering_list, MsgInfo * info)
 {
        GSList  *l;
        gboolean final;
-       gboolean applied;
+       gboolean apply_next;
        
        g_return_val_if_fail(info != NULL, TRUE);
        
-       for (l = filtering_list, final = FALSE, applied = FALSE; l != NULL; l = g_slist_next(l)) {
+       for (l = filtering_list, final = FALSE, apply_next = FALSE; l != NULL; l = g_slist_next(l)) {
                FilteringProp * filtering = (FilteringProp *) l->data;
 
                if (filtering_match_condition(filtering, info)) {
-                       applied = filtering_apply_rule(filtering, info, &final);
+                       apply_next = filtering_apply_rule(filtering, info, &final);
                         if (final)
                                 break;
                }               
@@ -376,13 +395,26 @@ static gboolean filter_msginfo(GSList * filtering_list, MsgInfo * info)
 
        /* put in inbox if a final rule could not be applied, or
         * the last rule was not a final one. */
-       if ((final && !applied) || !final) {
+       if ((final && !apply_next) || !final) {
                return FALSE;
        }
 
        return TRUE;
 }
 
+/*!
+ *\brief       Filter a message against a list of rules.
+ *
+ *\param       flist List of filter rules.
+ *\param       info Message.
+ *
+ *\return      gboolean TRUE if filter rules handled the message.
+ *
+ *\note                Returning FALSE means the message was not handled,
+ *             and that the calling code should do the default
+ *             processing. E.g. \ref inc.c::inc_start moves the 
+ *             message to the inbox.   
+ */
 gboolean filter_message_by_msginfo(GSList *flist, MsgInfo *info)
 {
        return filter_msginfo(flist, info);