/* filter_expressions.c
* Submitted by Edwin Groothuis <wireshark@mavetju.org>
*
- * $Id$
- *
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
#include "config.h"
-#include <stdlib.h>
-#include <string.h>
#include <glib.h>
#include <epan/prefs.h>
+#include <epan/uat.h>
+#include <epan/uat-int.h>
#include "epan/filter_expressions.h"
-static struct filter_expression *_filter_expression_head = NULL;
-struct filter_expression **pfilter_expression_head = &_filter_expression_head;
+/* UAT variables */
+static uat_t *display_filter_macro_uat = NULL;
+static filter_expression_t *display_filter_macros = NULL;
+static guint num_display_filter_macros = 0;
+
+/* Field callbacks. */
+UAT_BOOL_CB_DEF(display_filter_macro_uat, enabled, filter_expression_t)
+UAT_CSTRING_CB_DEF(display_filter_macro_uat, label, filter_expression_t)
+UAT_DISPLAY_FILTER_CB_DEF(display_filter_macro_uat, expression, filter_expression_t)
+UAT_CSTRING_CB_DEF(display_filter_macro_uat, comment, filter_expression_t)
/*
* Create a new filter_expression and add it to the end of the list
* of filter_expressions.
*/
-struct filter_expression *
+filter_expression_t*
filter_expression_new(const gchar *label, const gchar *expr,
- const gboolean enabled)
+ const gchar *comment, const gboolean enabled)
+{
+ filter_expression_t expression;
+
+ //UAT does the allocation of memory before copying structure
+ memset(&expression, 0, sizeof(expression));
+ expression.label = g_strdup(label);
+ expression.expression = g_strdup(expr);
+ expression.comment = g_strdup(comment);
+ expression.enabled = enabled;
+
+ /* XXX - This is just returned to make GTK GUI work. */
+ return (filter_expression_t*)uat_add_record(display_filter_macro_uat, &expression, TRUE);
+}
+
+void filter_expression_iterate_expressions(wmem_foreach_func func, void* user_data)
{
- struct filter_expression *expression;
- struct filter_expression *prev;
-
- expression = (struct filter_expression *)g_malloc(sizeof(struct filter_expression));
- memset(expression, '\0', sizeof(struct filter_expression));
- expression->button = NULL;
- expression->label = g_strdup(label);
- expression->expression = g_strdup(expr);
- expression->enabled = enabled;
- expression->deleted = FALSE;
- expression->index = 0;
-
- expression->next = NULL;
-
- /* Add it at the end so the button order is always the same*/
- if (*pfilter_expression_head == NULL) {
- _filter_expression_head = expression;
- } else {
- prev = *pfilter_expression_head;
- while (prev->next != NULL)
- prev = prev->next;
- prev->next = expression;
- expression->index = prev->index + 1;
+ guint i;
+
+ for (i = 0; i < num_display_filter_macros; i++)
+ {
+ func(NULL, &display_filter_macros[i], user_data);
}
+}
- return(expression);
+static void display_filter_free_cb(void*r) {
+ filter_expression_t* rec = (filter_expression_t*)r;
+
+ g_free(rec->label);
+ g_free(rec->expression);
+ g_free(rec->comment);
}
-void
-filter_expression_init(gboolean enable_prefs)
+static void* display_filter_copy_cb(void* n, const void* o, size_t siz _U_) {
+ filter_expression_t* new_record = (filter_expression_t*)n;
+ const filter_expression_t* old_record = (const filter_expression_t*)o;
+
+ new_record->button = old_record->button;
+ new_record->label = g_strdup(old_record->label);
+ new_record->expression = g_strdup(old_record->expression);
+ new_record->comment = g_strdup(old_record->comment);
+
+ new_record->enabled = old_record->enabled;
+
+ return new_record;
+}
+
+static uat_field_t display_filter_uat_flds[] = {
+ UAT_FLD_BOOL(display_filter_macro_uat, enabled, "Show in toolbar",
+ "Checked to add display filter button to toolbar"),
+ UAT_FLD_CSTRING(display_filter_macro_uat, label, "Button Label",
+ "Name of the display filter button"),
+ UAT_FLD_DISPLAY_FILTER(display_filter_macro_uat, expression, "Filter Expression",
+ "Filter expression to be applied by the button"),
+ UAT_FLD_CSTRING(display_filter_macro_uat, comment, "Comment",
+ "Comment describing filter expression"),
+ UAT_END_FIELDS
+};
+
+void filter_expression_register_uat(module_t* pref_module)
{
- if (enable_prefs)
- prefs.filter_expressions = pfilter_expression_head;
+ display_filter_macro_uat = uat_new("Display expressions",
+ sizeof(filter_expression_t), /* record size */
+ "dfilter_buttons", /* filename */
+ TRUE, /* from_profile */
+ &display_filter_macros, /* data_ptr */
+ &num_display_filter_macros, /* numitems_ptr */
+ 0, /* Doesn't not explicitly effect dissection */
+ NULL, /* help */
+ display_filter_copy_cb, /* copy callback */
+ NULL, /* update callback */
+ display_filter_free_cb, /* free callback */
+ NULL, /* post update callback */
+ NULL, /* reset callback */
+ display_filter_uat_flds); /* UAT field definitions */
+
+ prefs_register_uat_preference(pref_module, "expressions",
+ "Display filter expressions",
+ "Macros for display filters",
+ display_filter_macro_uat);
}
+
+
+/*
+ * Editor modelines - http://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 8
+ * tab-width: 8
+ * indent-tabs-mode: t
+ * End:
+ *
+ * vi: set shiftwidth=8 tabstop=8 noexpandtab:
+ * :indentSize=8:tabSize=8:noTabs=false:
+ */