// Copied from prefs.c:prefs_pref_is_default. We may want to move this to // prefs.c as well. bool PreferencesDialog::stashedPrefIsDefault(pref_t *pref) { if (!pref) return false; switch (pref->type) { case PREF_UINT: if (pref->default_val.uint == pref->stashed_val.uint) return true; break; case PREF_BOOL: if (pref->default_val.boolval == pref->stashed_val.boolval) return true; break; case PREF_ENUM: if (pref->default_val.enumval == pref->stashed_val.enumval) return true; break; case PREF_STRING: case PREF_FILENAME: if (!(g_strcmp0(pref->default_val.string, pref->stashed_val.string))) return true; break; case PREF_RANGE: { if ((ranges_are_equal(pref->default_val.range, pref->stashed_val.range))) return true; break; } case PREF_COLOR: { if ((pref->default_val.color.red == pref->stashed_val.color.red) && (pref->default_val.color.green == pref->stashed_val.color.green) && (pref->default_val.color.blue == pref->stashed_val.color.blue)) return true; break; } case PREF_CUSTOM: case PREF_OBSOLETE: case PREF_STATIC_TEXT: case PREF_UAT: return false; break; } return false; }
void PreferenceEditorFrame::on_okButton_clicked() { bool apply = false; switch(pref_->type) { case PREF_UINT: if (pref_->stashed_val.uint != new_uint_) { pref_->stashed_val.uint = new_uint_; apply = true; } break; case PREF_STRING: if (new_str_.compare(pref_->stashed_val.string) != 0) { g_free(pref_->stashed_val.string); pref_->stashed_val.string = qstring_strdup(new_str_); apply = true; } break; case PREF_RANGE: if (!ranges_are_equal(pref_->stashed_val.range, new_range_)) { g_free(pref_->stashed_val.range); pref_->stashed_val.range = range_copy(new_range_); apply = true; } break; default: break; } if (apply && module_) { pref_unstash(pref_, &module_->prefs_changed); prefs_apply(module_); if (!prefs.gui_use_pref_save) { prefs_main_write(); } } on_cancelButton_clicked(); // Emit signals once UI is hidden if (apply) { wsApp->emitAppSignal(WiresharkApplication::PacketDissectionChanged); wsApp->emitAppSignal(WiresharkApplication::PreferencesChanged); } }
guint pref_unstash(pref_t *pref, gpointer changed_p) { gboolean *pref_changed_p = (gboolean *)changed_p; /* Revert the preference to its saved value. */ switch (pref->type) { case PREF_UINT: if (*pref->varp.uint != pref->stashed_val.uint) { *pref_changed_p = TRUE; *pref->varp.uint = pref->stashed_val.uint; } break; case PREF_BOOL: if (*pref->varp.boolp != pref->stashed_val.boolval) { *pref_changed_p = TRUE; *pref->varp.boolp = pref->stashed_val.boolval; } break; case PREF_ENUM: if (*pref->varp.enump != pref->stashed_val.enumval) { *pref_changed_p = TRUE; *pref->varp.enump = pref->stashed_val.enumval; } break; case PREF_STRING: case PREF_FILENAME: case PREF_DIRNAME: if (strcmp(*pref->varp.string, pref->stashed_val.string) != 0) { *pref_changed_p = TRUE; g_free((void *)*pref->varp.string); *pref->varp.string = g_strdup(pref->stashed_val.string); } break; case PREF_RANGE: if (!ranges_are_equal(*pref->varp.range, pref->stashed_val.range)) { *pref_changed_p = TRUE; g_free(*pref->varp.range); *pref->varp.range = range_copy(pref->stashed_val.range); } break; case PREF_COLOR: *pref->varp.colorp = pref->stashed_val.color; break; case PREF_STATIC_TEXT: case PREF_UAT: case PREF_CUSTOM: break; case PREF_OBSOLETE: g_assert_not_reached(); break; } return 0; }
guint pref_unstash(pref_t *pref, gpointer unstash_data_p) { pref_unstash_data_t *unstash_data = (pref_unstash_data_t *)unstash_data_p; dissector_table_t sub_dissectors = NULL; dissector_handle_t handle = NULL; /* Revert the preference to its saved value. */ switch (pref->type) { case PREF_DECODE_AS_UINT: if (*pref->varp.uint != pref->stashed_val.uint) { unstash_data->module->prefs_changed = TRUE; if (unstash_data->handle_decode_as) { if (*pref->varp.uint != pref->default_val.uint) { dissector_reset_uint(pref->name, *pref->varp.uint); } } *pref->varp.uint = pref->stashed_val.uint; if (unstash_data->handle_decode_as) { sub_dissectors = find_dissector_table(pref->name); if (sub_dissectors != NULL) { handle = dissector_table_get_dissector_handle(sub_dissectors, (gchar*)unstash_data->module->title); if (handle != NULL) { dissector_change_uint(pref->name, *pref->varp.uint, handle); } } } } break; case PREF_UINT: if (*pref->varp.uint != pref->stashed_val.uint) { unstash_data->module->prefs_changed = TRUE; *pref->varp.uint = pref->stashed_val.uint; } break; case PREF_BOOL: if (*pref->varp.boolp != pref->stashed_val.boolval) { unstash_data->module->prefs_changed = TRUE; *pref->varp.boolp = pref->stashed_val.boolval; } break; case PREF_ENUM: if (*pref->varp.enump != pref->stashed_val.enumval) { unstash_data->module->prefs_changed = TRUE; *pref->varp.enump = pref->stashed_val.enumval; } break; case PREF_STRING: case PREF_FILENAME: case PREF_DIRNAME: if (strcmp(*pref->varp.string, pref->stashed_val.string) != 0) { unstash_data->module->prefs_changed = TRUE; g_free(*pref->varp.string); *pref->varp.string = g_strdup(pref->stashed_val.string); } break; case PREF_DECODE_AS_RANGE: if (!ranges_are_equal(*pref->varp.range, pref->stashed_val.range)) { guint32 i, j; unstash_data->module->prefs_changed = TRUE; if (unstash_data->handle_decode_as) { sub_dissectors = find_dissector_table(pref->name); if (sub_dissectors != NULL) { handle = dissector_table_get_dissector_handle(sub_dissectors, (gchar*)unstash_data->module->title); if (handle != NULL) { /* Delete all of the old values from the dissector table */ for (i = 0; i < (*pref->varp.range)->nranges; i++) { for (j = (*pref->varp.range)->ranges[i].low; j < (*pref->varp.range)->ranges[i].high; j++) { dissector_delete_uint(pref->name, j, handle); decode_build_reset_list(pref->name, dissector_table_get_type(sub_dissectors), GUINT_TO_POINTER(j), NULL, NULL); } dissector_delete_uint(pref->name, (*pref->varp.range)->ranges[i].high, handle); decode_build_reset_list(pref->name, dissector_table_get_type(sub_dissectors), GUINT_TO_POINTER((*pref->varp.range)->ranges[i].high), NULL, NULL); } } } } g_free(*pref->varp.range); *pref->varp.range = range_copy(pref->stashed_val.range); if (unstash_data->handle_decode_as) { if ((sub_dissectors != NULL) && (handle != NULL)) { /* Add new values to the dissector table */ for (i = 0; i < (*pref->varp.range)->nranges; i++) { for (j = (*pref->varp.range)->ranges[i].low; j < (*pref->varp.range)->ranges[i].high; j++) { dissector_change_uint(pref->name, j, handle); decode_build_reset_list(pref->name, dissector_table_get_type(sub_dissectors), GUINT_TO_POINTER(j), NULL, NULL); } dissector_change_uint(pref->name, (*pref->varp.range)->ranges[i].high, handle); decode_build_reset_list(pref->name, dissector_table_get_type(sub_dissectors), GUINT_TO_POINTER((*pref->varp.range)->ranges[i].high), NULL, NULL); } } } } break; case PREF_RANGE: if (!ranges_are_equal(*pref->varp.range, pref->stashed_val.range)) { unstash_data->module->prefs_changed = TRUE; g_free(*pref->varp.range); *pref->varp.range = range_copy(pref->stashed_val.range); } break; case PREF_COLOR: *pref->varp.colorp = pref->stashed_val.color; break; case PREF_STATIC_TEXT: case PREF_UAT: case PREF_CUSTOM: break; case PREF_OBSOLETE: g_assert_not_reached(); break; } return 0; }