gboolean decode_as_default_reset(const char *name, const gpointer pattern) { dissector_reset_uint(name, GPOINTER_TO_UINT(pattern)); return TRUE; }
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; }