Пример #1
0
// 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);
    }
}
Пример #3
0
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;
}
Пример #4
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;
}