diff options
-rw-r--r-- | ui/qt/widgets/byte_view_text.cpp | 56 | ||||
-rw-r--r-- | ui/recent.c | 33 | ||||
-rw-r--r-- | ui/recent.h | 7 |
3 files changed, 65 insertions, 31 deletions
diff --git a/ui/qt/widgets/byte_view_text.cpp b/ui/qt/widgets/byte_view_text.cpp index 07264771f6..232ee46f8a 100644 --- a/ui/qt/widgets/byte_view_text.cpp +++ b/ui/qt/widgets/byte_view_text.cpp @@ -26,14 +26,12 @@ #include <QTextLayout> // To do: -// - Add recent settings and context menu items to show/hide the offset, -// and ASCII/EBCDIC. +// - Add recent settings and context menu items to show/hide the offset. // - Add a UTF-8 and possibly UTF-xx option to the ASCII display. -// - Add "copy bytes as" context menu items. // - Move more common metrics to DataPrinter. Q_DECLARE_METATYPE(bytes_view_type) -Q_DECLARE_METATYPE(packet_char_enc) +Q_DECLARE_METATYPE(bytes_encoding_type) Q_DECLARE_METATYPE(DataPrinter::DumpType) ByteViewText::ByteViewText(const QByteArray &data, packet_char_enc encoding, QWidget *parent) : @@ -78,47 +76,53 @@ ByteViewText::~ByteViewText() void ByteViewText::createContextMenu() { - QActionGroup * format_actions_ = new QActionGroup(this); QAction *action; - QActionGroup * copyEntries = DataPrinter::copyActions(this); - ctx_menu_.addActions(copyEntries->actions()); + QActionGroup * copy_actions = DataPrinter::copyActions(this); + ctx_menu_.addActions(copy_actions->actions()); ctx_menu_.addSeparator(); - action = format_actions_->addAction(tr("Show bytes as hexadecimal")); + QActionGroup * format_actions = new QActionGroup(this); + action = format_actions->addAction(tr("Show bytes as hexadecimal")); action->setData(qVariantFromValue(BYTES_HEX)); action->setCheckable(true); if (recent.gui_bytes_view == BYTES_HEX) { action->setChecked(true); } - action = format_actions_->addAction(tr(UTF8_HORIZONTAL_ELLIPSIS "as bits")); + action = format_actions->addAction(tr(UTF8_HORIZONTAL_ELLIPSIS "as bits")); action->setData(qVariantFromValue(BYTES_BITS)); action->setCheckable(true); if (recent.gui_bytes_view == BYTES_BITS) { action->setChecked(true); } - ctx_menu_.addActions(format_actions_->actions()); - connect(format_actions_, SIGNAL(triggered(QAction*)), this, SLOT(setHexDisplayFormat(QAction*))); + ctx_menu_.addActions(format_actions->actions()); + connect(format_actions, SIGNAL(triggered(QAction*)), this, SLOT(setHexDisplayFormat(QAction*))); ctx_menu_.addSeparator(); - QActionGroup * encoding_actions_ = new QActionGroup(this); - action = encoding_actions_->addAction(tr(UTF8_HORIZONTAL_ELLIPSIS "as ASCII")); - action->setData(qVariantFromValue(PACKET_CHAR_ENC_CHAR_ASCII)); + QActionGroup * encoding_actions = new QActionGroup(this); + action = encoding_actions->addAction(tr("Show text based on packet")); + action->setData(qVariantFromValue(BYTES_ENC_FROM_PACKET)); action->setCheckable(true); - if (encoding_ == PACKET_CHAR_ENC_CHAR_ASCII) { + if (recent.gui_bytes_encoding == BYTES_ENC_FROM_PACKET) { action->setChecked(true); } - action = encoding_actions_->addAction(tr(UTF8_HORIZONTAL_ELLIPSIS "as EBCDIC")); - action->setData(qVariantFromValue(PACKET_CHAR_ENC_CHAR_EBCDIC)); + action = encoding_actions->addAction(tr(UTF8_HORIZONTAL_ELLIPSIS "as ASCII")); + action->setData(qVariantFromValue(BYTES_ENC_ASCII)); action->setCheckable(true); - if (encoding_ == PACKET_CHAR_ENC_CHAR_EBCDIC) { + if (recent.gui_bytes_encoding == BYTES_ENC_ASCII) { + action->setChecked(true); + } + action = encoding_actions->addAction(tr(UTF8_HORIZONTAL_ELLIPSIS "as EBCDIC")); + action->setData(qVariantFromValue(BYTES_ENC_EBCDIC)); + action->setCheckable(true); + if (recent.gui_bytes_encoding == BYTES_ENC_EBCDIC) { action->setChecked(true); } - ctx_menu_.addActions(encoding_actions_->actions()); - connect(encoding_actions_, SIGNAL(triggered(QAction*)), this, SLOT(setCharacterEncoding(QAction*))); + ctx_menu_.addActions(encoding_actions->actions()); + connect(encoding_actions, SIGNAL(triggered(QAction*)), this, SLOT(setCharacterEncoding(QAction*))); } bool ByteViewText::isEmpty() const @@ -351,6 +355,8 @@ void ByteViewText::drawLine(QPainter *painter, const int offset, const int row_y bool in_non_printable = false; int np_start = 0; int np_len = 0; + guchar c; + for (int tvb_pos = offset; tvb_pos <= max_tvb_pos; tvb_pos++) { /* insert a space every separator_interval_ bytes */ if ((tvb_pos != offset) && ((tvb_pos % separator_interval_) == 0)) { @@ -360,9 +366,11 @@ void ByteViewText::drawLine(QPainter *painter, const int offset, const int row_y } } - guchar c = (encoding_ == PACKET_CHAR_ENC_CHAR_EBCDIC) ? - EBCDIC_to_ASCII1(data_[tvb_pos]) : - data_[tvb_pos]; + if (recent.gui_bytes_encoding != BYTES_ENC_EBCDIC && encoding_ == PACKET_CHAR_ENC_CHAR_ASCII) { + c = data_[tvb_pos]; + } else { + c = EBCDIC_to_ASCII1(data_[tvb_pos]); + } if (g_ascii_isprint(c)) { line += c; @@ -614,7 +622,7 @@ void ByteViewText::setCharacterEncoding(QAction *action) return; } - encoding_ = action->data().value<packet_char_enc>(); + recent.gui_bytes_encoding = action->data().value<bytes_encoding_type>(); viewport()->update(); } diff --git a/ui/recent.c b/ui/recent.c index 35ec2785f6..11a6f96008 100644 --- a/ui/recent.c +++ b/ui/recent.c @@ -44,6 +44,7 @@ #define RECENT_GUI_SECONDS_FORMAT "gui.seconds_format" #define RECENT_GUI_ZOOM_LEVEL "gui.zoom_level" #define RECENT_GUI_BYTES_VIEW "gui.bytes_view" +#define RECENT_GUI_BYTES_ENCODING "gui.bytes_encoding" #define RECENT_GUI_GEOMETRY_MAIN_X "gui.geometry_main_x" #define RECENT_GUI_GEOMETRY_MAIN_Y "gui.geometry_main_y" #define RECENT_GUI_GTK_GEOMETRY_MAIN_X "gui.gtk.geometry_main_x" @@ -108,6 +109,19 @@ static const value_string ts_seconds_values[] = { { 0, NULL } }; +static const value_string bytes_view_type_values[] = { + { BYTES_HEX, "HEX" }, + { BYTES_BITS, "BITS" }, + { 0, NULL } +}; + +static const value_string bytes_encoding_type_values[] = { + { BYTES_ENC_FROM_PACKET, "FROM_PACKET" }, + { BYTES_ENC_ASCII, "ASCII" }, + { BYTES_ENC_EBCDIC, "EBCDIC" }, + { 0, NULL } +}; + static void free_col_width_data(gpointer data, gpointer user_data _U_) { @@ -824,11 +838,14 @@ write_profile_recent(void) fprintf(rf, RECENT_GUI_ZOOM_LEVEL ": %d\n", recent.gui_zoom_level); - fprintf(rf, "\n# Bytes view.\n"); - fprintf(rf, "# A decimal number.\n"); - fprintf(rf, RECENT_GUI_BYTES_VIEW ": %d\n", + write_recent_enum(rf, "Bytes view display type", + RECENT_GUI_BYTES_VIEW, bytes_view_type_values, recent.gui_bytes_view); + write_recent_enum(rf, "Bytes view text encoding", + RECENT_GUI_BYTES_ENCODING, bytes_encoding_type_values, + recent.gui_bytes_encoding); + fprintf(rf, "\n# Main window upper (or leftmost) pane size.\n"); fprintf(rf, "# Decimal number.\n"); if (recent.gui_geometry_main_upper_pane != 0) { @@ -1027,10 +1044,11 @@ read_set_recent_pair_static(gchar *key, const gchar *value, return PREFS_SET_SYNTAX_ERR; /* number was bad */ recent.gui_zoom_level = (gint)num; } else if (strcmp(key, RECENT_GUI_BYTES_VIEW) == 0) { - num = strtol(value, &p, 0); - if (p == value || *p != '\0') - return PREFS_SET_SYNTAX_ERR; /* number was bad */ - recent.gui_bytes_view = (bytes_view_type)num; + recent.gui_bytes_view = + (bytes_view_type)str_to_val(value, bytes_view_type_values, BYTES_HEX); + } else if (strcmp(key, RECENT_GUI_BYTES_ENCODING) == 0) { + recent.gui_bytes_encoding = + (bytes_encoding_type)str_to_val(value, bytes_encoding_type_values, BYTES_ENC_FROM_PACKET); } else if (strcmp(key, RECENT_GUI_GEOMETRY_MAIN_MAXIMIZED) == 0) { parse_recent_boolean(value, &recent.gui_geometry_main_maximized); } else if (strcmp(key, RECENT_GUI_GEOMETRY_MAIN_UPPER_PANE) == 0) { @@ -1284,6 +1302,7 @@ recent_read_profile_static(char **rf_path_return, int *rf_errno_return) recent.gui_seconds_format = TS_SECONDS_DEFAULT; recent.gui_zoom_level = 0; recent.gui_bytes_view = BYTES_HEX; + recent.gui_bytes_encoding = BYTES_ENC_FROM_PACKET; /* pane size of zero will autodetect */ recent.gui_geometry_main_upper_pane = 0; diff --git a/ui/recent.h b/ui/recent.h index 5ee7e14f9c..05cfd9077b 100644 --- a/ui/recent.h +++ b/ui/recent.h @@ -56,6 +56,12 @@ typedef enum { BYTES_BITS } bytes_view_type; +typedef enum { + BYTES_ENC_FROM_PACKET, // frame_data packet_char_enc + BYTES_ENC_ASCII, + BYTES_ENC_EBCDIC +} bytes_encoding_type; + /** Recent settings. */ typedef struct recent_settings_tag { gboolean main_toolbar_show; @@ -72,6 +78,7 @@ typedef struct recent_settings_tag { ts_seconds_type gui_seconds_format; gint gui_zoom_level; bytes_view_type gui_bytes_view; + bytes_encoding_type gui_bytes_encoding; gint gui_geometry_main_x; gint gui_geometry_main_y; |