summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Mann <mmann78@netscape.net>2017-06-21 23:58:50 -0400
committerMichael Mann <mmann78@netscape.net>2017-06-22 13:07:11 +0000
commit29e726a606a5bb7b860d8a2f6ee2996c1b4a154e (patch)
tree361782ab965df7283993ebb45f035bb471b221fc
parent9fe90b93ce9bbb802f45b93632a78f5261b3f717 (diff)
downloadwireshark-29e726a606a5bb7b860d8a2f6ee2996c1b4a154e.tar.gz
Add support for "bool" and "display filter" types for UATs.
Filter expressions needs support for a checkbox (bool) and string field that verifies display filters. Change-Id: Idfbffd6cdb5abaee8914126a05d890e834c17306 Reviewed-on: https://code.wireshark.org/review/22340 Petri-Dish: Michael Mann <mmann78@netscape.net> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Michael Mann <mmann78@netscape.net>
-rw-r--r--epan/uat.c26
-rw-r--r--epan/uat.h37
-rw-r--r--ui/qt/uat_delegate.cpp14
-rw-r--r--ui/qt/uat_dialog.cpp2
-rw-r--r--ui/qt/uat_model.cpp44
5 files changed, 115 insertions, 8 deletions
diff --git a/epan/uat.c b/epan/uat.c
index 3c1a0ec7dc..71403485b7 100644
--- a/epan/uat.c
+++ b/epan/uat.c
@@ -273,8 +273,10 @@ char *uat_fld_tostr(void *rec, uat_field_t *f) {
case PT_TXTMOD_NONE:
case PT_TXTMOD_STRING:
case PT_TXTMOD_ENUM:
+ case PT_TXTMOD_BOOL:
case PT_TXTMOD_FILENAME:
case PT_TXTMOD_DIRECTORYNAME:
+ case PT_TXTMOD_DISPLAY_FILTER:
out = g_strndup(ptr, len);
break;
case PT_TXTMOD_HEXBYTES: {
@@ -309,6 +311,7 @@ static void putfld(FILE* fp, void* rec, uat_field_t* f) {
case PT_TXTMOD_ENUM:
case PT_TXTMOD_FILENAME:
case PT_TXTMOD_DIRECTORYNAME:
+ case PT_TXTMOD_DISPLAY_FILTER:
case PT_TXTMOD_STRING: {
guint i;
@@ -336,6 +339,10 @@ static void putfld(FILE* fp, void* rec, uat_field_t* f) {
break;
}
+ case PT_TXTMOD_BOOL: {
+ fprintf(fp,"\"%s\"", fld_ptr);
+ break;
+ }
default:
g_assert_not_reached();
}
@@ -633,13 +640,30 @@ gboolean uat_fld_chk_num_hex(void* u1 _U_, const char* strptr, guint len, const
return uat_fld_chk_num(16, strptr, len, err);
}
+gboolean uat_fld_chk_bool(void* u1 _U_, const char* strptr, guint len, const void* u2 _U_, const void* u3 _U_, char** err)
+{
+ char* str = g_strndup(strptr,len);
+
+ if ((g_strcmp0(str, "TRUE") == 0) ||
+ (g_strcmp0(str, "FALSE") == 0)) {
+ *err = NULL;
+ g_free(str);
+ return TRUE;
+ }
+
+ *err = g_strdup_printf("invalid value: %s (must be TRUE or FALSE)", str);
+ g_free(str);
+ return FALSE;
+}
+
+
gboolean uat_fld_chk_enum(void* u1 _U_, const char* strptr, guint len, const void* v, const void* u3 _U_, char** err) {
char* str = g_strndup(strptr,len);
guint i;
const value_string* vs = (const value_string *)v;
for(i=0;vs[i].strptr;i++) {
- if (g_str_equal(vs[i].strptr,str)) {
+ if (g_strcmp0(vs[i].strptr,str) == 0) {
*err = NULL;
g_free(str);
return TRUE;
diff --git a/epan/uat.h b/epan/uat.h
index 746013ab9e..a23f6760b7 100644
--- a/epan/uat.h
+++ b/epan/uat.h
@@ -217,8 +217,12 @@ typedef enum _uat_text_mode_t {
PT_TXTMOD_FILENAME,
/* processed like a PT_TXTMOD_STRING, but shows a filename dialog */
- PT_TXTMOD_DIRECTORYNAME
+ PT_TXTMOD_DIRECTORYNAME,
/* processed like a PT_TXTMOD_STRING, but shows a directory dialog */
+ PT_TXTMOD_DISPLAY_FILTER,
+ /* processed like a PT_TXTMOD_STRING, but verifies display filter */
+ PT_TXTMOD_BOOL
+ /* Displays a checkbox for value */
} uat_text_mode_t;
/*
@@ -345,6 +349,8 @@ gboolean uat_fld_chk_num_dec(void*, const char*, unsigned, const void*, const vo
WS_DLL_PUBLIC
gboolean uat_fld_chk_num_hex(void*, const char*, unsigned, const void*, const void*, char** err);
WS_DLL_PUBLIC
+gboolean uat_fld_chk_bool(void*, const char*, unsigned, const void*, const void*, char** err);
+WS_DLL_PUBLIC
gboolean uat_fld_chk_enum(void*, const char*, unsigned, const void*, const void*, char**);
WS_DLL_PUBLIC
gboolean uat_fld_chk_range(void*, const char*, unsigned, const void*, const void*, char**);
@@ -439,6 +445,16 @@ static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr,
{#field_name, title, PT_TXTMOD_DIRECTORYNAME,{uat_fld_chk_str,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
/*
+ * DISPLAY_FILTER,
+ * a simple c-string contained in (((rec_t*)rec)->(field_name))
+ */
+#define UAT_DISPLAY_FILTER_CB_DEF(basename,field_name,rec_t) UAT_CSTRING_CB_DEF(basename,field_name,rec_t)
+
+#define UAT_FLD_DISPLAY_FILTER(basename,field_name,title,desc) \
+ {#field_name, title, PT_TXTMOD_DISPLAY_FILTER, {uat_fld_chk_str,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
+
+
+/*
* OID - just a CSTRING with a specific check routine
*/
#define UAT_FLD_OID(basename,field_name,title,desc) \
@@ -523,6 +539,25 @@ static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr,
{#field_name, title, PT_TXTMOD_STRING,{uat_fld_chk_num_hex,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
/*
+ * BOOL Macros,
+ * an boolean value contained in
+ */
+#define UAT_BOOL_CB_DEF(basename,field_name,rec_t) \
+static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, guint len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
+ char* tmp_str = g_strndup(buf,len); \
+ if (g_strcmp0(tmp_str, "TRUE") == 0) \
+ ((rec_t*)rec)->field_name = 1; \
+ else \
+ ((rec_t*)rec)->field_name = 0; \
+ g_free(tmp_str); } \
+static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
+ *out_ptr = g_strdup_printf("%s",((rec_t*)rec)->field_name ? "TRUE" : "FALSE"); \
+ *out_len = (unsigned)strlen(*out_ptr); }
+
+#define UAT_FLD_BOOL(basename,field_name,title,desc) \
+{#field_name, title, PT_TXTMOD_BOOL,{uat_fld_chk_bool,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
+
+/*
* ENUM macros
* enum_t: name = ((enum_t*)ptr)->strptr
* value = ((enum_t*)ptr)->value
diff --git a/ui/qt/uat_delegate.cpp b/ui/qt/uat_delegate.cpp
index 641edbcc24..09e9ef848b 100644
--- a/ui/qt/uat_delegate.cpp
+++ b/ui/qt/uat_delegate.cpp
@@ -28,6 +28,9 @@
#include <QEvent>
#include <QFileDialog>
#include <QLineEdit>
+#include <QCheckBox>
+
+#include "display_filter_edit.h"
UatDelegate::UatDelegate(QObject *parent) : QStyledItemDelegate(parent)
{
@@ -66,6 +69,11 @@ QWidget *UatDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &
// TODO add a live validator? Should SyntaxLineEdit be used?
return QStyledItemDelegate::createEditor(parent, option, index);
+ case PT_TXTMOD_DISPLAY_FILTER:
+ {
+ DisplayFilterEdit *editor = new DisplayFilterEdit(parent);
+ return editor;
+ }
case PT_TXTMOD_HEXBYTES:
{
// Requires input of the form "ab cd ef" (with possibly no or a colon
@@ -81,6 +89,12 @@ QWidget *UatDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &
return editor;
}
+ case PT_TXTMOD_BOOL:
+ {
+ // model will handle creating checkbox
+ return 0;
+ }
+
case PT_TXTMOD_NONE:
return 0;
diff --git a/ui/qt/uat_dialog.cpp b/ui/qt/uat_dialog.cpp
index 8a2459a251..ab4d4a9a2d 100644
--- a/ui/qt/uat_dialog.cpp
+++ b/ui/qt/uat_dialog.cpp
@@ -43,7 +43,7 @@ UatDialog::UatDialog(QWidget *parent, epan_uat *uat) :
ui(new Ui::UatDialog),
uat_model_(NULL),
uat_delegate_(NULL),
- uat_(NULL)
+ uat_(uat)
{
ui->setupUi(this);
if (uat) loadGeometry(0, 0, uat->name);
diff --git a/ui/qt/uat_model.cpp b/ui/qt/uat_model.cpp
index 29f358a18f..c5310f3a07 100644
--- a/ui/qt/uat_model.cpp
+++ b/ui/qt/uat_model.cpp
@@ -47,7 +47,13 @@ Qt::ItemFlags UatModel::flags(const QModelIndex &index) const
if (!index.isValid())
return 0;
+ uat_field_t *field = &uat_->fields[index.column()];
+
Qt::ItemFlags flags = QAbstractTableModel::flags(index);
+ if (field->mode == PT_TXTMOD_BOOL)
+ {
+ flags |= Qt::ItemIsUserCheckable;
+ }
flags |= Qt::ItemIsEditable;
return flags;
}
@@ -71,6 +77,8 @@ QVariant UatModel::data(const QModelIndex &index, int role) const
QString qstr(temp_str);
wmem_free(NULL, temp_str);
return qstr;
+ } else if (field->mode == PT_TXTMOD_BOOL) {
+ return "";
} else {
QString qstr(str);
g_free(str);
@@ -78,6 +86,19 @@ QVariant UatModel::data(const QModelIndex &index, int role) const
}
}
+ if ((role == Qt::CheckStateRole) && (field->mode == PT_TXTMOD_BOOL))
+ {
+ char *str = NULL;
+ guint length = 0;
+ enum Qt::CheckState state = Qt::Unchecked;
+ field->cb.tostr(rec, &str, &length, field->cbdata.tostr, field->fld_data);
+ if (g_strcmp0(str, "TRUE") == 0)
+ state = Qt::Checked;
+
+ g_free(str);
+ return state;
+ }
+
if (role == Qt::UserRole) {
return QVariant::fromValue(static_cast<void *>(field));
}
@@ -133,7 +154,13 @@ int UatModel::columnCount(const QModelIndex &parent) const
bool UatModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
- if (!index.isValid() || role != Qt::EditRole)
+ if (!index.isValid())
+ return false;
+
+ uat_field_t *field = &uat_->fields[index.column()];
+
+ if ((role != Qt::EditRole) &&
+ ((field->mode == PT_TXTMOD_BOOL) && (role != Qt::CheckStateRole)))
return false;
if (data(index, role) == value) {
@@ -142,13 +169,20 @@ bool UatModel::setData(const QModelIndex &index, const QVariant &value, int role
}
const int row = index.row();
- uat_field_t *field = &uat_->fields[index.column()];
void *rec = UAT_INDEX_PTR(uat_, row);
//qDebug() << "Changing (" << row << "," << index.column() << ") from " << data(index, Qt::EditRole) << " to " << value;
- const QByteArray &str = value.toString().toUtf8();
- const QByteArray &bytes = field->mode == PT_TXTMOD_HEXBYTES ? QByteArray::fromHex(str) : str;
- field->cb.set(rec, bytes.constData(), (unsigned) bytes.size(), field->cbdata.set, field->fld_data);
+ if (field->mode != PT_TXTMOD_BOOL) {
+ const QByteArray &str = value.toString().toUtf8();
+ const QByteArray &bytes = field->mode == PT_TXTMOD_HEXBYTES ? QByteArray::fromHex(str) : str;
+ field->cb.set(rec, bytes.constData(), (unsigned) bytes.size(), field->cbdata.set, field->fld_data);
+ } else {
+ if (value == Qt::Checked) {
+ field->cb.set(rec, "TRUE", 4, field->cbdata.set, field->fld_data);
+ } else {
+ field->cb.set(rec, "FALSE", 5, field->cbdata.set, field->fld_data);
+ }
+ }
QVector<int> roles;
roles << role;