X-Git-Url: http://git.samba.org/samba.git/?a=blobdiff_plain;ds=sidebyside;f=color_filters.c;h=a1c661a95c88545aac1aebccd4ecfac563994bf6;hb=7519508c6308eaaed1df0ea1b23ca3d4ca8cacf9;hp=1cf34806f0aa9f6e40348aec358e64919184e60a;hpb=b1599d53b39c02b14ac9b945caf094ecc0eff644;p=obnox%2Fwireshark%2Fwip.git diff --git a/color_filters.c b/color_filters.c index 1cf34806f0..a1c661a95c 100644 --- a/color_filters.c +++ b/color_filters.c @@ -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); } }