From Florent DROUIN <florent.drouin@alcatel.fr>, bug 1518:
[obnox/wireshark/wip.git] / color_filters.c
index 1cf34806f0aa9f6e40348aec358e64919184e60a..a1c661a95c88545aac1aebccd4ecfac563994bf6 100644 (file)
@@ -52,6 +52,7 @@ static GSList *color_filter_list = NULL;
 /* keep "old" deleted filters in this list until 
  * the dissection no longer needs them (e.g. file is closed) */
 static GSList *color_filter_deleted_list = NULL;
+static GSList *color_filter_valid_list = NULL;
 
 /* Color Filters can en-/disabled. */
 gboolean filters_enabled = TRUE;
@@ -127,8 +128,9 @@ color_filter_clone(color_filter_t *colorf)
 }
 
 static void
-color_filter_list_clone_cb(gpointer filter_arg, gpointer *cfl)
+color_filter_list_clone_cb(gpointer filter_arg, gpointer cfl_arg)
 {
+    gpointer *cfl = cfl_arg;
     color_filter_t *new_colorf;
 
     new_colorf = color_filter_clone(filter_arg);
@@ -182,17 +184,34 @@ color_filters_clone(gpointer user_data)
 
 
 static void
-color_filter_compile_cb(gpointer filter_arg, gpointer *cfl)
+color_filter_compile_cb(gpointer filter_arg, gpointer unused _U_)
 {
        color_filter_t *colorf = filter_arg;
 
-        g_assert(colorf->c_colorfilter == NULL);
+       g_assert(colorf->c_colorfilter == NULL);
        if (!dfilter_compile(colorf->filter_text, &colorf->c_colorfilter)) {
                simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
                "Could not compile color filter name: \"%s\" text: \"%s\".\n%s",
                              colorf->filter_name, colorf->filter_text, dfilter_error_msg);
                /* this filter was compilable before, so this should never happen */
-               g_assert_not_reached();
+               /* except if the OK button of the parent window has been clicked */
+               /* so don't use g_assert_not_reached() but check the filters again */
+       }
+}
+
+static void
+color_filter_validate_cb(gpointer filter_arg, gpointer unused _U_)
+{
+       color_filter_t *colorf = filter_arg;
+
+       g_assert(colorf->c_colorfilter == NULL);
+       if (!dfilter_compile(colorf->filter_text, &colorf->c_colorfilter)) {
+               simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
+               "Removing color filter name: \"%s\" text: \"%s\".\n%s",
+                             colorf->filter_name, colorf->filter_text, dfilter_error_msg);
+               /* Delete the color filter from the list of color filters. */
+               color_filter_valid_list = g_slist_remove(color_filter_valid_list, colorf);
+               color_filter_delete(colorf);
        }
 }
 
@@ -206,7 +225,14 @@ color_filters_apply(GSList *cfl)
         color_filter_list = NULL;
 
         /* clone all list entries from edit to normal list */
-        color_filter_list = color_filter_list_clone(cfl);
+        color_filter_valid_list = NULL;
+        color_filter_valid_list = color_filter_list_clone(cfl);
+
+        /* compile all filter */
+        g_slist_foreach(color_filter_valid_list, color_filter_validate_cb, NULL);
+
+        /* clone all list entries from edit to normal list */
+        color_filter_list = color_filter_list_clone(color_filter_valid_list);
 
         /* compile all filter */
         g_slist_foreach(color_filter_list, color_filter_compile_cb, NULL);
@@ -255,7 +281,7 @@ color_filters_colorize_packet(gint row, epan_dissect_t *edt)
     if (color_filters_used()) {
         curr = color_filter_list;
 
-        while( (curr = g_slist_next(curr)) != NULL) {
+        while(curr != NULL) {
             colorf = curr->data;
             if ((colorf->c_colorfilter != NULL) &&
                  dfilter_apply_edt(colorf->c_colorfilter, edt)) {
@@ -263,6 +289,7 @@ color_filters_colorize_packet(gint row, epan_dissect_t *edt)
                     packet_list_set_colors(row, &(colorf->fg_color), &(colorf->bg_color));
                     return colorf;
             }
+            curr = g_slist_next(curr);
         }
     }