diff --git a/epan/prefs.c b/epan/prefs.c index b74ab1f419..96d242d7e2 100644 --- a/epan/prefs.c +++ b/epan/prefs.c @@ -5388,6 +5388,8 @@ set_pref(gchar *pref_name, const gchar *value, void *private_data _U_, filter_expression_new(filter_label, value, "", filter_enabled); g_free(filter_label); filter_label = NULL; + /* Remember to save the new UAT to file. */ + prefs.filter_expressions_old = TRUE; } else if (strcmp(pref_name, "gui.version_in_start_page") == 0) { /* Convert deprecated value to closest current equivalent */ if (g_ascii_strcasecmp(value, "true") == 0) { @@ -6586,6 +6588,21 @@ write_prefs(char **pf_path_return) pf = stdout; } + /* + * If the preferences file is being written, be sure to write UAT files + * first that were migrated from the preferences file. + */ + if (pf_path_return != NULL) { + if (prefs.filter_expressions_old) { + char *err = NULL; + prefs.filter_expressions_old = FALSE; + if (!uat_save(uat_get_table_by_name("Display expressions"), &err)) { + g_warning("Unable to save Display expressions: %s", err); + g_free(err); + } + } + } + fputs("# Configuration file for Wireshark " VERSION ".\n" "#\n" "# This file is regenerated each time preferences are saved within\n" diff --git a/epan/prefs.h b/epan/prefs.h index f88553ea83..15bff0759a 100644 --- a/epan/prefs.h +++ b/epan/prefs.h @@ -213,6 +213,7 @@ typedef struct _e_prefs { gboolean enable_incomplete_dissectors_check; gboolean incomplete_dissectors_check_debug; gboolean strict_conversation_tracking_heuristics; + gboolean filter_expressions_old; /* TRUE if old filter expressions preferences were loaded. */ gboolean gui_update_enabled; software_update_channel_e gui_update_channel; gint gui_update_interval; diff --git a/ui/preference_utils.c b/ui/preference_utils.c index c1a4b0c9b5..e0b1cbfbdb 100644 --- a/ui/preference_utils.c +++ b/ui/preference_utils.c @@ -18,6 +18,7 @@ #include #include #include +#include #ifdef HAVE_LIBPCAP #include "capture_opts.h" @@ -213,6 +214,23 @@ column_prefs_remove_nth(gint col) column_prefs_remove_link(g_list_nth(prefs.col_list, col)); } +void save_migrated_uat(const char *uat_name, gboolean *old_pref) +{ + char *err = NULL; + + if (!uat_save(uat_get_table_by_name(uat_name), &err)) { + g_warning("Unable to save %s: %s", uat_name, err); + g_free(err); + return; + } + + // Ensure that any old preferences are removed after successful migration. + if (*old_pref) { + *old_pref = FALSE; + prefs_main_write(); + } +} + /* * Editor modelines - https://www.wireshark.org/tools/modelines.html * diff --git a/ui/preference_utils.h b/ui/preference_utils.h index aaed9b6ab9..4ffc30be58 100644 --- a/ui/preference_utils.h +++ b/ui/preference_utils.h @@ -83,6 +83,10 @@ void column_prefs_remove_link(GList* col_link); */ void column_prefs_remove_nth(gint col); +/** Save the UAT and complete migration of old preferences by writing the main + * preferences file (if necessary). + */ +void save_migrated_uat(const char *uat_name, gboolean *old_pref); #ifdef __cplusplus } diff --git a/ui/qt/filter_expression_frame.cpp b/ui/qt/filter_expression_frame.cpp index 08fdd0922d..c976466842 100644 --- a/ui/qt/filter_expression_frame.cpp +++ b/ui/qt/filter_expression_frame.cpp @@ -11,7 +11,6 @@ #include #include -#include #include #include @@ -122,7 +121,6 @@ void FilterExpressionFrame::on_displayFilterLineEdit_textChanged(const QString) void FilterExpressionFrame::on_buttonBox_accepted() { - gchar* err = NULL; QByteArray label_ba = ui->labelLineEdit->text().toUtf8(); QByteArray expr_ba = ui->displayFilterLineEdit->text().toUtf8(); QByteArray comment_ba = ui->commentLineEdit->text().toUtf8(); @@ -147,12 +145,10 @@ void FilterExpressionFrame::on_buttonBox_accepted() { filter_expression_new(label_ba.constData(), expr_ba.constData(), comment_ba.constData(), TRUE); } - uat_save(uat_get_table_by_name("Display expressions"), &err); + save_migrated_uat("Display expressions", &prefs.filter_expressions_old); on_buttonBox_rejected(); emit filterExpressionsChanged(); - - g_free(err); } void FilterExpressionFrame::on_buttonBox_rejected() diff --git a/ui/qt/widgets/filter_expression_toolbar.cpp b/ui/qt/widgets/filter_expression_toolbar.cpp index f0b4c5e307..ed78e0cbbc 100644 --- a/ui/qt/widgets/filter_expression_toolbar.cpp +++ b/ui/qt/widgets/filter_expression_toolbar.cpp @@ -14,6 +14,7 @@ #include #include +#include #include #include @@ -114,7 +115,6 @@ void FilterExpressionToolBar::filterExpressionsChanged() void FilterExpressionToolBar::removeFilter() { - gchar* err = NULL; UatModel * uatModel = new UatModel(this, "Display expressions"); QString label = ((QAction *)sender())->property(dfe_property_label_).toString(); @@ -126,8 +126,7 @@ void FilterExpressionToolBar::removeFilter() if ( rowIndex.isValid() ) { uatModel->removeRow(rowIndex.row()); - uat_save(uat_get_table_by_name("Display expressions"), &err); - g_free(err); + save_migrated_uat("Display expressions", &prefs.filter_expressions_old); filterExpressionsChanged(); } } @@ -155,8 +154,6 @@ void FilterExpressionToolBar::onActionMoved(QAction* action, int oldPos, int new void FilterExpressionToolBar::disableFilter() { - gchar* err = NULL; - QString label = ((QAction *)sender())->property(dfe_property_label_).toString(); QString expr = ((QAction *)sender())->property(dfe_property_expression_).toString(); @@ -167,8 +164,7 @@ void FilterExpressionToolBar::disableFilter() if ( rowIndex.isValid() ) { uatModel->setData(rowIndex, QVariant::fromValue(false)); - uat_save(uat_get_table_by_name("Display expressions"), &err); - g_free(err); + save_migrated_uat("Display expressions", &prefs.filter_expressions_old); filterExpressionsChanged(); } } @@ -189,16 +185,13 @@ void FilterExpressionToolBar::editFilter() void FilterExpressionToolBar::onFilterDropped(QString description, QString filter) { - gchar* err = NULL; if ( filter.length() == 0 ) return; filter_expression_new(qUtf8Printable(description), qUtf8Printable(filter), qUtf8Printable(description), TRUE); - uat_save(uat_get_table_by_name("Display expressions"), &err); - g_free(err); - + save_migrated_uat("Display expressions", &prefs.filter_expressions_old); filterExpressionsChanged(); }