diff options
author | Michael Mann <mmann78@netscape.net> | 2017-06-21 23:58:50 -0400 |
---|---|---|
committer | Michael Mann <mmann78@netscape.net> | 2017-06-22 13:07:11 +0000 |
commit | 29e726a606a5bb7b860d8a2f6ee2996c1b4a154e (patch) | |
tree | 361782ab965df7283993ebb45f035bb471b221fc | |
parent | 9fe90b93ce9bbb802f45b93632a78f5261b3f717 (diff) | |
download | wireshark-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.c | 26 | ||||
-rw-r--r-- | epan/uat.h | 37 | ||||
-rw-r--r-- | ui/qt/uat_delegate.cpp | 14 | ||||
-rw-r--r-- | ui/qt/uat_dialog.cpp | 2 | ||||
-rw-r--r-- | ui/qt/uat_model.cpp | 44 |
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; |