aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Wu <peter@lekensteyn.nl>2018-09-08 11:49:22 +0200
committerPeter Wu <peter@lekensteyn.nl>2018-09-10 09:27:34 +0000
commitad0de0ffbc9ed9e397d09e1398555d06d29439d2 (patch)
tree18acdf02c960d2de3cff6b8134be1cae43367a18
parent7573f7dab49043bc6401b97a10439d9b9b6a291a (diff)
prefs,ui: properly migrate old filter expressions
When legacy filter expressions preferences are present, be sure to (1) save the dfilter_buttons file when updating the preferences file and (2) save the preferences file after updating the dfilter_buttons file. Without doing (1), the old buttons will be lost. Without (2), restarting Wireshark will result in duplicate buttons. Only write the files if the user actually made other changes to avoid breaking profiles by just opening Wireshark. Bug: 15114 Bug: 15121 Change-Id: I5b9417c34146c4450526781a20308c9c98fb44a1 Reviewed-on: https://code.wireshark.org/review/29488 Reviewed-by: Stig Bjørlykke <stig@bjorlykke.org> Petri-Dish: Stig Bjørlykke <stig@bjorlykke.org> Tested-by: Petri Dish Buildbot Reviewed-by: Peter Wu <peter@lekensteyn.nl>
-rw-r--r--epan/prefs.c17
-rw-r--r--epan/prefs.h1
-rw-r--r--ui/preference_utils.c18
-rw-r--r--ui/preference_utils.h4
-rw-r--r--ui/qt/filter_expression_frame.cpp6
-rw-r--r--ui/qt/widgets/filter_expression_toolbar.cpp15
6 files changed, 45 insertions, 16 deletions
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 <epan/prefs-int.h>
#include <epan/packet.h>
#include <epan/decode_as.h>
+#include <epan/uat-int.h>
#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 <ui_filter_expression_frame.h>
#include <epan/filter_expressions.h>
-#include <epan/uat-int.h>
#include <ui/preference_utils.h>
#include <ui/qt/models/uat_model.h>
@@ -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 <ui/qt/wireshark_application.h>
#include <epan/filter_expressions.h>
+#include <ui/preference_utils.h>
#include <QApplication>
#include <QFrame>
@@ -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();
}