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