From 7a178e01907cf7011bbe364d78d42e79aa4daa79 Mon Sep 17 00:00:00 2001 From: winckel <winckel@eurecom.fr> Date: Mon, 18 Nov 2013 10:32:48 +0000 Subject: [PATCH] Reorganized and completed menus: - Separated "File" into "Filters and "Messages" menus. - Added "Enable filtering". - Added "Reload messages file". - Added "Go to first message". - Added "Go to message". - Added "Go to last message". - Added "Display message header" - Added "Display brace" - Added menu key shortcuts (mnemonic and accelerator). Created an entry box for message goto input number and modified the search function to select the closest lower number if input number is not present in messages list. Cleared message content view when needed. Blocked message content redisplay when not needed. Added a signal handler to capture events on message list tree view. Modified message content display format. Modified some log points. git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4426 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- .../utils/itti_analyzer/libbuffers/socket.c | 4 +- .../itti_analyzer/libparser/array_type.c | 31 +-- .../itti_analyzer/libparser/array_type.h | 8 +- .../utils/itti_analyzer/libparser/enum_type.c | 13 +- .../utils/itti_analyzer/libparser/enum_type.h | 10 +- .../itti_analyzer/libparser/enum_value_type.c | 14 +- .../itti_analyzer/libparser/enum_value_type.h | 8 +- .../itti_analyzer/libparser/field_type.c | 54 +++-- .../itti_analyzer/libparser/field_type.h | 8 +- .../utils/itti_analyzer/libparser/file_type.c | 4 +- .../utils/itti_analyzer/libparser/file_type.h | 4 +- .../libparser/fundamental_type.c | 22 +- .../libparser/fundamental_type.h | 10 +- .../itti_analyzer/libparser/pointer_type.c | 22 +- .../itti_analyzer/libparser/pointer_type.h | 8 +- .../itti_analyzer/libparser/reference_type.c | 10 +- .../itti_analyzer/libparser/reference_type.h | 8 +- .../itti_analyzer/libparser/struct_type.c | 33 +-- .../itti_analyzer/libparser/struct_type.h | 8 +- .../itti_analyzer/libparser/typedef_type.c | 29 ++- .../itti_analyzer/libparser/typedef_type.h | 8 +- common/utils/itti_analyzer/libparser/types.h | 9 +- .../itti_analyzer/libparser/union_type.c | 64 +++-- .../itti_analyzer/libparser/union_type.h | 12 +- .../utils/itti_analyzer/libparser/xml_parse.c | 11 +- .../itti_analyzer/libresolver/locate_root.c | 1 + .../itti_analyzer/libresolver/locate_root.h | 1 + .../itti_analyzer/libresolver/resolvers.c | 36 +-- .../utils/itti_analyzer/libui/ui_callbacks.c | 158 ++++++++---- .../utils/itti_analyzer/libui/ui_callbacks.h | 16 +- .../utils/itti_analyzer/libui/ui_interface.c | 2 +- .../itti_analyzer/libui/ui_main_screen.c | 8 + .../itti_analyzer/libui/ui_main_screen.h | 12 +- .../utils/itti_analyzer/libui/ui_menu_bar.c | 224 ++++++++++++------ .../utils/itti_analyzer/libui/ui_notebook.c | 5 + .../itti_analyzer/libui/ui_notifications.c | 15 +- .../libui/ui_signal_dissect_view.c | 9 +- .../utils/itti_analyzer/libui/ui_tree_view.c | 73 +++++- .../utils/itti_analyzer/libui/ui_tree_view.h | 4 +- 39 files changed, 642 insertions(+), 334 deletions(-) diff --git a/common/utils/itti_analyzer/libbuffers/socket.c b/common/utils/itti_analyzer/libbuffers/socket.c index 27d9316d6f..ff5e28fd3c 100644 --- a/common/utils/itti_analyzer/libbuffers/socket.c +++ b/common/utils/itti_analyzer/libbuffers/socket.c @@ -84,7 +84,7 @@ static int socket_read_itti_message(socket_data_t *socket_data, g_assert(message_header != NULL); - // g_debug("Attempting to read signal header from socket"); + g_debug("Attempting to read signal header from socket"); /* Read the sub-header of signal */ while (data_read != sizeof(itti_signal_header_t)) { @@ -124,7 +124,7 @@ static int socket_read_itti_message(socket_data_t *socket_data, socket_notify_gui_update(socket_data); } - // g_debug("Successfully read new signal %u from socket", itti_signal_header.message_number); + g_debug("Successfully read new signal %u from socket", itti_signal_header.message_number); return total_data_read + sizeof(itti_signal_header); } diff --git a/common/utils/itti_analyzer/libparser/array_type.c b/common/utils/itti_analyzer/libparser/array_type.c index 2537839c55..0a2fe60b57 100644 --- a/common/utils/itti_analyzer/libparser/array_type.c +++ b/common/utils/itti_analyzer/libparser/array_type.c @@ -8,10 +8,12 @@ #include "ui_interface.h" int array_dissect_from_buffer( - struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, - buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent) + types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, + buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line) { - struct types_s *type_child; + types_t *type_child; + int length = 0; + char cbuf[50]; DISPLAY_PARSE_INFO("array", type->name, offset, parent_offset); @@ -49,22 +51,23 @@ int array_dissect_from_buffer( } } for (i = 0; i < (items - zero_counter); i++) + { + INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "[%d] ", i)); + ui_set_signal_text_cb(user_data, cbuf, length); + type->child->type_dissect_from_buffer ( type->child, ui_set_signal_text_cb, user_data, buffer, parent_offset, - offset + i * type_child->size, type->name == NULL ? indent : indent + DISPLAY_TAB_SIZE); + offset + i * type_child->size, indent, + FALSE); + } if (zero_counter > 0) { - int length = 0; - char cbuf[50]; - - INDENTED_STRING(cbuf, type->name == NULL ? indent : indent + DISPLAY_TAB_SIZE,); - - length = sprintf(cbuf, "[%d .. %d] ", i, items -1); - + INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "[%d .. %d] ", i, items -1)); ui_set_signal_text_cb(user_data, cbuf, length); + type->child->type_dissect_from_buffer ( type->child, ui_set_signal_text_cb, user_data, - buffer, parent_offset, offset + i * type_child->size, 0); + buffer, parent_offset, offset + i * type_child->size, indent, FALSE); } } if (type->name) { @@ -74,7 +77,7 @@ int array_dissect_from_buffer( return 0; } -int array_type_file_print(struct types_s *type, int indent, FILE *file) { +int array_type_file_print(types_t *type, int indent, FILE *file) { if (type == NULL) return -1; INDENTED(file, indent, fprintf(file, "<Array>\n")); @@ -93,7 +96,7 @@ int array_type_file_print(struct types_s *type, int indent, FILE *file) { return 0; } -int array_type_hr_display(struct types_s *type, int indent) { +int array_type_hr_display(types_t *type, int indent) { if (type == NULL) return -1; INDENTED(stdout, indent, printf("<Array>\n")); diff --git a/common/utils/itti_analyzer/libparser/array_type.h b/common/utils/itti_analyzer/libparser/array_type.h index 3dd9571af6..3d7273c1e2 100644 --- a/common/utils/itti_analyzer/libparser/array_type.h +++ b/common/utils/itti_analyzer/libparser/array_type.h @@ -4,11 +4,11 @@ #define ARRAY_TYPE_H_ int array_dissect_from_buffer( - struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, - buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent); + types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, + buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line); -int array_type_hr_display(struct types_s *type, int indent); +int array_type_hr_display(types_t *type, int indent); -int array_type_file_print(struct types_s *type, int indent, FILE *file); +int array_type_file_print(types_t *type, int indent, FILE *file); #endif /* ARRAY_TYPE_H_ */ diff --git a/common/utils/itti_analyzer/libparser/enum_type.c b/common/utils/itti_analyzer/libparser/enum_type.c index 889d40a728..734cbac7a0 100644 --- a/common/utils/itti_analyzer/libparser/enum_type.c +++ b/common/utils/itti_analyzer/libparser/enum_type.c @@ -6,7 +6,7 @@ #include "enum_type.h" #include "ui_interface.h" -char *enum_type_get_name_from_value(struct types_s *type, uint32_t value) +char *enum_type_get_name_from_value(types_t *type, uint32_t value) { char *enum_name = "UNKNOWN"; types_t *enum_value; @@ -22,8 +22,8 @@ char *enum_type_get_name_from_value(struct types_s *type, uint32_t value) } int enum_type_dissect_from_buffer( - struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, - buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent) + types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, + buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line) { uint32_t value = 0; types_t *values; @@ -37,7 +37,7 @@ int enum_type_dissect_from_buffer( values->parent = type; values->type_dissect_from_buffer( values, ui_set_signal_text_cb, user_data, buffer, offset, parent_offset, - type->name == NULL ? indent: indent + DISPLAY_TAB_SIZE); + type->name == NULL ? indent: indent + DISPLAY_TAB_SIZE, FALSE); break; } } @@ -46,14 +46,13 @@ int enum_type_dissect_from_buffer( char cbuf[50]; length = sprintf(cbuf, "(0x%08x) UNKNOWN;\n", value); - ui_set_signal_text_cb(user_data, cbuf, length); } return 0; } -int enum_type_file_print(struct types_s *type, int indent, FILE *file) +int enum_type_file_print(types_t *type, int indent, FILE *file) { types_t *values; @@ -77,7 +76,7 @@ int enum_type_file_print(struct types_s *type, int indent, FILE *file) return 0; } -int enum_type_hr_display(struct types_s *type, int indent) +int enum_type_hr_display(types_t *type, int indent) { types_t *values; diff --git a/common/utils/itti_analyzer/libparser/enum_type.h b/common/utils/itti_analyzer/libparser/enum_type.h index 27501ffa45..3c3d918b1c 100644 --- a/common/utils/itti_analyzer/libparser/enum_type.h +++ b/common/utils/itti_analyzer/libparser/enum_type.h @@ -3,14 +3,14 @@ #ifndef ENUM_TYPE_H_ #define ENUM_TYPE_H_ -char *enum_type_get_name_from_value(struct types_s *type, uint32_t value); +char *enum_type_get_name_from_value(types_t *type, uint32_t value); int enum_type_dissect_from_buffer( - struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, - buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent); + types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, + buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line); -int enum_type_file_print(struct types_s *type, int indent, FILE *file); +int enum_type_file_print(types_t *type, int indent, FILE *file); -int enum_type_hr_display(struct types_s *type, int indent); +int enum_type_hr_display(types_t *type, int indent); #endif /* ENUM_TYPE_H_ */ diff --git a/common/utils/itti_analyzer/libparser/enum_value_type.c b/common/utils/itti_analyzer/libparser/enum_value_type.c index bb560ae983..472fcb8064 100644 --- a/common/utils/itti_analyzer/libparser/enum_value_type.c +++ b/common/utils/itti_analyzer/libparser/enum_value_type.c @@ -9,10 +9,10 @@ uint32_t last_enum_value; int enum_value_dissect_from_buffer( - struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, - buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent) + types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, + buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line) { - struct types_s *type_parent = NULL; + types_t *type_parent = NULL; uint32_t value = 0; DISPLAY_PARSE_INFO("enum_value", type->name, offset, parent_offset); @@ -40,16 +40,14 @@ int enum_value_dissect_from_buffer( last_enum_value = 0; } } - sprintf(cbuf, "(0x%08x) %s;\n", value, type->name); - length = strlen(cbuf); - + length = sprintf(cbuf, "(0x%08x) %s;\n", value, type->name); ui_set_signal_text_cb(user_data, cbuf, length); } return 0; } -int enum_value_file_print(struct types_s *type, int indent, FILE *file) +int enum_value_file_print(types_t *type, int indent, FILE *file) { if (type == NULL) return -1; @@ -63,7 +61,7 @@ int enum_value_file_print(struct types_s *type, int indent, FILE *file) return 0; } -int enum_value_type_hr_display(struct types_s *type, int indent) +int enum_value_type_hr_display(types_t *type, int indent) { if (type == NULL) return -1; diff --git a/common/utils/itti_analyzer/libparser/enum_value_type.h b/common/utils/itti_analyzer/libparser/enum_value_type.h index 6db1152482..8f6249733a 100644 --- a/common/utils/itti_analyzer/libparser/enum_value_type.h +++ b/common/utils/itti_analyzer/libparser/enum_value_type.h @@ -6,11 +6,11 @@ extern uint32_t last_enum_value; int enum_value_dissect_from_buffer( - struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, - buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent); + types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, + buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line); -int enum_value_file_print(struct types_s *type, int indent, FILE *file); +int enum_value_file_print(types_t *type, int indent, FILE *file); -int enum_value_type_hr_display(struct types_s *type, int indent); +int enum_value_type_hr_display(types_t *type, int indent); #endif /* ENUM_VALUE_TYPE_H_ */ diff --git a/common/utils/itti_analyzer/libparser/field_type.c b/common/utils/itti_analyzer/libparser/field_type.c index 44c7ae3d41..c681e27af3 100644 --- a/common/utils/itti_analyzer/libparser/field_type.c +++ b/common/utils/itti_analyzer/libparser/field_type.c @@ -10,14 +10,14 @@ #include "ui_interface.h" int field_dissect_from_buffer( - struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, - buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent) + types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, + buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line) { int length = 0; char cbuf[50]; - struct types_s *type_child; + types_t *type_child; char array_info[50]; - int indent_child; + new_line = FALSE; DISPLAY_PARSE_INFO("field", type->name, offset, parent_offset); @@ -41,7 +41,7 @@ int field_dissect_from_buffer( } if (type_child->type == TYPE_ARRAY) { - struct types_s *type_array_child; + types_t *type_array_child; /* Ignore TYPEDEF children */ for (type_array_child = type_child->child; @@ -56,34 +56,45 @@ int field_dissect_from_buffer( } DISPLAY_TYPE("Fld"); - INDENTED_STRING(cbuf, indent, sprintf(cbuf, ".%s%s = ", type->name ? type->name : "Field", array_info)); - length = strlen (cbuf); + INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, ".%s%s = ", type->name ? type->name : "Field", array_info)); ui_set_signal_text_cb(user_data, cbuf, length); - indent_child = indent; - if (type_child->type == TYPE_ARRAY || type_child->type == TYPE_STRUCT || type_child->type == TYPE_UNION) { + if (type_child->type == TYPE_ARRAY) { DISPLAY_BRACE(ui_set_signal_text_cb(user_data, "{", 1);) ui_set_signal_text_cb(user_data, "\n", 1); - indent_child += DISPLAY_TAB_SIZE; + new_line = TRUE; } - if (type_child->type == TYPE_FUNDAMENTAL || type_child->type == TYPE_POINTER) { - indent_child = 0; + /* + if (type_child->type == TYPE_STRUCT || type_child->type == TYPE_UNION) { + DISPLAY_BRACE(ui_set_signal_text_cb(user_data, "{", 1);) + ui_set_signal_text_cb(user_data, "\n", 1); + new_line = TRUE; } + */ type->child->parent = type; - CHECK_FCT(type->child->type_dissect_from_buffer( - type->child, ui_set_signal_text_cb, user_data, buffer, - parent_offset, offset + type->offset, indent_child)); + type->child->type_dissect_from_buffer( + type->child, ui_set_signal_text_cb, user_data, buffer, + parent_offset, offset + type->offset, new_line ? indent + DISPLAY_TAB_SIZE : indent, new_line); + + DISPLAY_BRACE( + if (type_child->type == TYPE_ARRAY) { + DISPLAY_TYPE("Fld"); + INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "};\n")); + ui_set_signal_text_cb(user_data, cbuf, length); + }); + /* DISPLAY_BRACE( - if (type_child->type == TYPE_ARRAY || type_child->type == TYPE_STRUCT || type_child->type == TYPE_UNION) { + if (type_child->type == TYPE_STRUCT || type_child->type == TYPE_UNION) { DISPLAY_TYPE("Fld"); INDENTED_STRING(cbuf, indent, sprintf(cbuf, "};\n")); length = strlen (cbuf); ui_set_signal_text_cb(user_data, cbuf, length); }); + */ } } } @@ -94,19 +105,16 @@ int field_dissect_from_buffer( CHECK_FCT(buffer_fetch_bits(buffer, offset + type->offset + parent_offset, type->bits, &value)); DISPLAY_TYPE("Fld"); - INDENTED_STRING( - cbuf, - indent, - sprintf(cbuf, ".%s:%d = (0x%0*x) %d;\n", type->name ? type->name : "Field", type->bits, (type->bits + 3) / 4, value, value)); - length = strlen (cbuf); + INDENTED_STRING(cbuf, indent, + length = sprintf(cbuf, ".%s:%d = (0x%0*x) %d;\n", type->name ? type->name : "Field", type->bits, (type->bits + 3) / 4, value, value)); ui_set_signal_text_cb(user_data, cbuf, length); } return 0; } -int field_type_file_print(struct types_s *type, int indent, FILE *file) { +int field_type_file_print(types_t *type, int indent, FILE *file) { if (type == NULL) return -1; INDENTED(file, indent, fprintf(file, "<Field>\n")); @@ -127,7 +135,7 @@ int field_type_file_print(struct types_s *type, int indent, FILE *file) { return 0; } -int field_type_hr_display(struct types_s *type, int indent) { +int field_type_hr_display(types_t *type, int indent) { if (type == NULL) return -1; INDENTED(stdout, indent, printf("<Field>\n")); diff --git a/common/utils/itti_analyzer/libparser/field_type.h b/common/utils/itti_analyzer/libparser/field_type.h index bf23cb8dc2..9e2b5d56ad 100644 --- a/common/utils/itti_analyzer/libparser/field_type.h +++ b/common/utils/itti_analyzer/libparser/field_type.h @@ -4,11 +4,11 @@ #define FIELD_TYPE_H_ int field_dissect_from_buffer( - struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, - buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent); + types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, + buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line); -int field_type_file_print(struct types_s *type, int indent, FILE *file); +int field_type_file_print(types_t *type, int indent, FILE *file); -int field_type_hr_display(struct types_s *type, int indent); +int field_type_hr_display(types_t *type, int indent); #endif /* FIELD_TYPE_H_ */ diff --git a/common/utils/itti_analyzer/libparser/file_type.c b/common/utils/itti_analyzer/libparser/file_type.c index 36db678f20..0ca1bc3a65 100644 --- a/common/utils/itti_analyzer/libparser/file_type.c +++ b/common/utils/itti_analyzer/libparser/file_type.c @@ -5,7 +5,7 @@ #include "file_type.h" -int file_type_file_print(struct types_s *type, int indent, FILE *file) +int file_type_file_print(types_t *type, int indent, FILE *file) { if (type == NULL) return -1; @@ -17,7 +17,7 @@ int file_type_file_print(struct types_s *type, int indent, FILE *file) return 0; } -int file_type_hr_display(struct types_s *type, int indent) +int file_type_hr_display(types_t *type, int indent) { if (type == NULL) return -1; diff --git a/common/utils/itti_analyzer/libparser/file_type.h b/common/utils/itti_analyzer/libparser/file_type.h index a2ad0cc460..5f9a864054 100644 --- a/common/utils/itti_analyzer/libparser/file_type.h +++ b/common/utils/itti_analyzer/libparser/file_type.h @@ -3,8 +3,8 @@ #ifndef FILE_TYPE_H_ #define FILE_TYPE_H_ -int file_type_file_print(struct types_s *type, int indent, FILE *file); +int file_type_file_print(types_t *type, int indent, FILE *file); -int file_type_hr_display(struct types_s *type, int indent); +int file_type_hr_display(types_t *type, int indent); #endif /* FILE_TYPE_H_ */ diff --git a/common/utils/itti_analyzer/libparser/fundamental_type.c b/common/utils/itti_analyzer/libparser/fundamental_type.c index b3291adc6d..51045b56ee 100644 --- a/common/utils/itti_analyzer/libparser/fundamental_type.c +++ b/common/utils/itti_analyzer/libparser/fundamental_type.c @@ -7,7 +7,7 @@ #include "fundamental_type.h" #include "ui_interface.h" -uint64_t fundamental_read_from_buffer(struct types_s *type, buffer_t *buffer, uint32_t offset, uint32_t parent_offset) { +uint64_t fundamental_read_from_buffer(types_t *type, buffer_t *buffer, uint32_t offset, uint32_t parent_offset) { uint64_t value; switch (type->size) { @@ -36,8 +36,8 @@ uint64_t fundamental_read_from_buffer(struct types_s *type, buffer_t *buffer, ui } int fundamental_dissect_from_buffer( - struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, - buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent) + types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, + buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line) { int length = 0; char cbuf[200]; @@ -55,6 +55,7 @@ int fundamental_dissect_from_buffer( value64 = fundamental_read_from_buffer(type, buffer, offset, parent_offset); + indent = new_line ? indent : 0; if (indent > 0) { DISPLAY_TYPE("Fun"); @@ -63,39 +64,36 @@ int fundamental_dissect_from_buffer( case 8: value8 = (uint8_t) value64; INDENTED_STRING(cbuf, indent, - sprintf(cbuf, type_unsigned ? "(0x%02" PRIx8 ") %3" PRIu8 " '%c';\n" : "(0x%02" PRIx8 ") %4" PRId8 " '%c';\n", value8, value8, isprint(value8) ? value8 : '.')); + length = sprintf(cbuf, type_unsigned ? "(0x%02" PRIx8 ") %3" PRIu8 " '%c';\n" : "(0x%02" PRIx8 ") %4" PRId8 " '%c';\n", value8, value8, isprint(value8) ? value8 : '.')); break; case 16: value16 = (uint16_t) value64; INDENTED_STRING(cbuf, indent, - sprintf(cbuf, type_unsigned ? "(0x%04" PRIx16 ") %5" PRIu16 ";\n" : "(0x%04" PRIx16 ") %6" PRId16 ";\n", value16, value16)); + length = sprintf(cbuf, type_unsigned ? "(0x%04" PRIx16 ") %5" PRIu16 ";\n" : "(0x%04" PRIx16 ") %6" PRId16 ";\n", value16, value16)); break; case 32: value32 = (uint32_t) value64; INDENTED_STRING(cbuf, indent, - sprintf(cbuf, type_unsigned ? "(0x%08" PRIx32 ") %9" PRIu32 ";\n" : "(0x%08" PRIx32 ") %10" PRId32 ";\n", value32, value32)); + length = sprintf(cbuf, type_unsigned ? "(0x%08" PRIx32 ") %9" PRIu32 ";\n" : "(0x%08" PRIx32 ") %10" PRId32 ";\n", value32, value32)); break; case 64: INDENTED_STRING(cbuf, indent, - sprintf(cbuf, type_unsigned ? "(0x%016" PRIx64 ") %20" PRIu64 ";\n" : "(0x%016" PRIx64 ") %20" PRId64 ";\n", value64, value64)); + length = sprintf(cbuf, type_unsigned ? "(0x%016" PRIx64 ") %20" PRIu64 ";\n" : "(0x%016" PRIx64 ") %20" PRId64 ";\n", value64, value64)); break; default: /* ??? */ break; } - - length = strlen (cbuf); - ui_set_signal_text_cb(user_data, cbuf, length); return 0; } -int fundamental_type_file_print(struct types_s *type, int indent, FILE *file) { +int fundamental_type_file_print(types_t *type, int indent, FILE *file) { if (type == NULL) return -1; INDENTED(file, indent, fprintf(file, "<Fundamental>\n")); @@ -109,7 +107,7 @@ int fundamental_type_file_print(struct types_s *type, int indent, FILE *file) { return 0; } -int fundamental_type_hr_display(struct types_s *type, int indent) { +int fundamental_type_hr_display(types_t *type, int indent) { if (type == NULL) return -1; INDENTED(stdout, indent, printf("<Fundamental>\n")); diff --git a/common/utils/itti_analyzer/libparser/fundamental_type.h b/common/utils/itti_analyzer/libparser/fundamental_type.h index 0b58a426fe..3d0870321b 100644 --- a/common/utils/itti_analyzer/libparser/fundamental_type.h +++ b/common/utils/itti_analyzer/libparser/fundamental_type.h @@ -3,14 +3,14 @@ #ifndef FUNDAMENTAL_TYPE_H_ #define FUNDAMENTAL_TYPE_H_ -uint64_t fundamental_read_from_buffer(struct types_s *type, buffer_t *buffer, uint32_t offset, uint32_t parent_offset); +uint64_t fundamental_read_from_buffer(types_t *type, buffer_t *buffer, uint32_t offset, uint32_t parent_offset); int fundamental_dissect_from_buffer( - struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, - buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent); + types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, + buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line); -int fundamental_type_file_print(struct types_s *type, int indent, FILE *file); +int fundamental_type_file_print(types_t *type, int indent, FILE *file); -int fundamental_type_hr_display(struct types_s *type, int indent); +int fundamental_type_hr_display(types_t *type, int indent); #endif /* FUNDAMENTAL_TYPE_H_ */ diff --git a/common/utils/itti_analyzer/libparser/pointer_type.c b/common/utils/itti_analyzer/libparser/pointer_type.c index d866546aa1..39719c9494 100644 --- a/common/utils/itti_analyzer/libparser/pointer_type.c +++ b/common/utils/itti_analyzer/libparser/pointer_type.c @@ -7,8 +7,8 @@ #include "ui_interface.h" int pointer_dissect_from_buffer( - struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, - buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent) + types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, + buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line) { int length = 0, i; char cbuf[200]; @@ -21,37 +21,37 @@ int pointer_dissect_from_buffer( buffer_fetch_nbytes(buffer, parent_offset + offset, type->size / 8, value); - DISPLAY_TYPE("Ptr"); + indent = new_line ? indent : 0; + if (indent > 0) + { + DISPLAY_TYPE("Ptr"); + } if (type->child->name && type->child) { /* INDENTED(stdout, indent, fprintf(stdout, "<%s>0x%08x</%s>\n", type->child->name, value, type->child->name)); */ - INDENTED_STRING(cbuf, indent, sprintf(cbuf, "(%s *) 0x", type->child->name)); + INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "(%s *) 0x", type->child->name)); } else { /* INDENTED(stdout, indent, fprintf(stdout, "<Pointer>0x%08x</Pointer>\n", value)); */ - INDENTED_STRING(cbuf, indent, sprintf(cbuf, "(void *) 0x")); + INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "(void *) 0x")); } - length = strlen (cbuf); - /* Append the value */ for (i = type->size / 8 - 1; i >= 0; i--) { length += sprintf(&cbuf[length], "%02x", value[i]); } - length += sprintf(&cbuf[length], ";\n"); - ui_set_signal_text_cb(user_data, cbuf, length); return 0; } -int pointer_type_file_print(struct types_s *type, int indent, FILE *file) { +int pointer_type_file_print(types_t *type, int indent, FILE *file) { if (type == NULL) return -1; INDENTED(file, indent, fprintf(file, "<Pointer>\n")); @@ -75,6 +75,6 @@ int pointer_type_file_print(struct types_s *type, int indent, FILE *file) { return 0; } -int pointer_type_hr_display(struct types_s *type, int indent) { +int pointer_type_hr_display(types_t *type, int indent) { return pointer_type_file_print(type, indent, stdout); } diff --git a/common/utils/itti_analyzer/libparser/pointer_type.h b/common/utils/itti_analyzer/libparser/pointer_type.h index 6f82f42c6b..6560f4f45d 100644 --- a/common/utils/itti_analyzer/libparser/pointer_type.h +++ b/common/utils/itti_analyzer/libparser/pointer_type.h @@ -4,11 +4,11 @@ #define POINTER_TYPE_H_ int pointer_dissect_from_buffer( - struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, - buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent); + types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, + buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line); -int pointer_type_file_print(struct types_s *type, int indent, FILE *file); +int pointer_type_file_print(types_t *type, int indent, FILE *file); -int pointer_type_hr_display(struct types_s *type, int indent); +int pointer_type_hr_display(types_t *type, int indent); #endif /* POINTER_TYPE_H_ */ diff --git a/common/utils/itti_analyzer/libparser/reference_type.c b/common/utils/itti_analyzer/libparser/reference_type.c index 32e2f75c3e..409428d624 100644 --- a/common/utils/itti_analyzer/libparser/reference_type.c +++ b/common/utils/itti_analyzer/libparser/reference_type.c @@ -7,8 +7,8 @@ #include "ui_interface.h" int reference_dissect_from_buffer( - struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, - buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent) + types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, + buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line) { DISPLAY_PARSE_INFO("reference", type->name, offset, parent_offset); @@ -18,7 +18,7 @@ int reference_dissect_from_buffer( if (type->child != NULL) type->child->type_dissect_from_buffer(type->child, ui_set_signal_text_cb, user_data, buffer, offset, parent_offset, - type->name == NULL ? indent: indent + DISPLAY_TAB_SIZE); + type->name == NULL ? indent: indent + DISPLAY_TAB_SIZE, TRUE); if (type->name) { INDENTED(stdout, indent, fprintf(stdout, "</%s>\n", type->name)); } @@ -26,7 +26,7 @@ int reference_dissect_from_buffer( return 0; } -int reference_type_file_print(struct types_s *type, int indent, FILE *file) +int reference_type_file_print(types_t *type, int indent, FILE *file) { if (type == NULL) return -1; @@ -49,7 +49,7 @@ int reference_type_file_print(struct types_s *type, int indent, FILE *file) return 0; } -int reference_type_hr_display(struct types_s *type, int indent) +int reference_type_hr_display(types_t *type, int indent) { if (type == NULL) return -1; diff --git a/common/utils/itti_analyzer/libparser/reference_type.h b/common/utils/itti_analyzer/libparser/reference_type.h index 3c52088d8f..fe0c84f9d8 100644 --- a/common/utils/itti_analyzer/libparser/reference_type.h +++ b/common/utils/itti_analyzer/libparser/reference_type.h @@ -4,11 +4,11 @@ #define REFERENCE_TYPE_H_ int reference_dissect_from_buffer( - struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, - buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent); + types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, + buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line); -int reference_type_file_print(struct types_s *type, int indent, FILE *file); +int reference_type_file_print(types_t *type, int indent, FILE *file); -int reference_type_hr_display(struct types_s *type, int indent); +int reference_type_hr_display(types_t *type, int indent); #endif /* REFERENCE_TYPE_H_ */ diff --git a/common/utils/itti_analyzer/libparser/struct_type.c b/common/utils/itti_analyzer/libparser/struct_type.c index c4d6691828..a4189dc1c4 100644 --- a/common/utils/itti_analyzer/libparser/struct_type.c +++ b/common/utils/itti_analyzer/libparser/struct_type.c @@ -10,47 +10,50 @@ #include "ui_interface.h" int struct_dissect_from_buffer( - struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, - buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent) + types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, + buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line) { int i; int length = 0; char cbuf[200]; + char *name; DISPLAY_PARSE_INFO("structure", type->name, offset, parent_offset); memset (cbuf, 0, 200); - if (type->name) { + if (new_line) { DISPLAY_TYPE("Str"); - INDENTED_STRING(cbuf, indent, sprintf (cbuf, "%s =%s\n", type->name, "" DISPLAY_BRACE(" {"))); } - length = strlen (cbuf); - + if (type->name) { + name = type->name; + } + else { + name = "_anonymous_"; + } + INDENTED_STRING(cbuf, new_line ? indent : 0, length = sprintf (cbuf, "%s :", name)); + DISPLAY_BRACE(length += sprintf(&cbuf[length], " {");); + length += sprintf(&cbuf[length], "\n"); ui_set_signal_text_cb(user_data, cbuf, length); for (i = 0; i < type->nb_members; i++) { if (type->members_child[i] != NULL) type->members_child[i]->type_dissect_from_buffer ( type->members_child[i], ui_set_signal_text_cb, user_data, - buffer, offset, parent_offset, - type->name == NULL ? indent : indent + DISPLAY_TAB_SIZE); + buffer, offset, parent_offset, indent + DISPLAY_TAB_SIZE, TRUE); } DISPLAY_BRACE( - if (type->name) { - DISPLAY_TYPE("Str"); - INDENTED_STRING(cbuf, indent, sprintf(cbuf, "};\n")); - } - length = strlen (cbuf); + DISPLAY_TYPE("Str"); + INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "};\n")); ui_set_signal_text_cb(user_data, cbuf, length);) return 0; } -int struct_type_file_print(struct types_s *type, int indent, FILE *file) { +int struct_type_file_print(types_t *type, int indent, FILE *file) { int i; if (type == NULL) return -1; @@ -78,7 +81,7 @@ int struct_type_file_print(struct types_s *type, int indent, FILE *file) { return 0; } -int struct_type_hr_display(struct types_s *type, int indent) { +int struct_type_hr_display(types_t *type, int indent) { int i; if (type == NULL) return -1; diff --git a/common/utils/itti_analyzer/libparser/struct_type.h b/common/utils/itti_analyzer/libparser/struct_type.h index d785141e90..a3e1fcf12f 100644 --- a/common/utils/itti_analyzer/libparser/struct_type.h +++ b/common/utils/itti_analyzer/libparser/struct_type.h @@ -4,11 +4,11 @@ #define STRUCT_TYPE_H_ int struct_dissect_from_buffer( - struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, - buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent); + types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, + buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line); -int struct_type_hr_display(struct types_s *type, int indent); +int struct_type_hr_display(types_t *type, int indent); -int struct_type_file_print(struct types_s *type, int indent, FILE *file); +int struct_type_file_print(types_t *type, int indent, FILE *file); #endif /* STRUCT_TYPE_H_ */ diff --git a/common/utils/itti_analyzer/libparser/typedef_type.c b/common/utils/itti_analyzer/libparser/typedef_type.c index 193e7449fb..18239fc87b 100644 --- a/common/utils/itti_analyzer/libparser/typedef_type.c +++ b/common/utils/itti_analyzer/libparser/typedef_type.c @@ -7,22 +7,41 @@ #include "ui_interface.h" int typedef_dissect_from_buffer( - struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, - buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent) + types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, + buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line) { + int length = 0; + char cbuf[200]; + types_t *type_child = NULL; + DISPLAY_PARSE_INFO("typedef", type->name, offset, parent_offset); + if (type->child != NULL) { + /* Ignore TYPEDEF children */ + for (type_child = type->child; type_child != NULL && type_child->type == TYPE_TYPEDEF; type_child = + type_child->child) { + } + } + + if ((type_child == NULL) || (type_child->type != TYPE_FUNDAMENTAL)) + { + INDENTED_STRING(cbuf, new_line ? indent : 0, length = sprintf (cbuf, "%s, ", type->name)); + ui_set_signal_text_cb(user_data, cbuf, length); + + new_line = FALSE; + } + /* Simply call next_type */ if (type->child != NULL) { type->child->parent = type; type->child->type_dissect_from_buffer( - type->child, ui_set_signal_text_cb, user_data, buffer, offset, parent_offset, indent); + type->child, ui_set_signal_text_cb, user_data, buffer, offset, parent_offset, indent, new_line); } return 0; } -int typedef_type_file_print(struct types_s *type, int indent, FILE *file) +int typedef_type_file_print(types_t *type, int indent, FILE *file) { if (type == NULL) return -1; @@ -46,7 +65,7 @@ int typedef_type_file_print(struct types_s *type, int indent, FILE *file) return 0; } -int typedef_type_hr_display(struct types_s *type, int indent) +int typedef_type_hr_display(types_t *type, int indent) { if (type == NULL) return -1; diff --git a/common/utils/itti_analyzer/libparser/typedef_type.h b/common/utils/itti_analyzer/libparser/typedef_type.h index e0f96f501b..878176005f 100644 --- a/common/utils/itti_analyzer/libparser/typedef_type.h +++ b/common/utils/itti_analyzer/libparser/typedef_type.h @@ -3,12 +3,12 @@ #ifndef TYPEDEF_TYPE_H_ #define TYPEDEF_TYPE_H_ -int typedef_type_file_print(struct types_s *type, int indent, FILE *file); +int typedef_type_file_print(types_t *type, int indent, FILE *file); -int typedef_type_hr_display(struct types_s *type, int indent); +int typedef_type_hr_display(types_t *type, int indent); int typedef_dissect_from_buffer( - struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, - buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent); + types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, + buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line); #endif /* TYPEDEF_TYPE_H_ */ diff --git a/common/utils/itti_analyzer/libparser/types.h b/common/utils/itti_analyzer/libparser/types.h index bfd057b8e3..2a8e55951a 100644 --- a/common/utils/itti_analyzer/libparser/types.h +++ b/common/utils/itti_analyzer/libparser/types.h @@ -1,6 +1,7 @@ #include <stdio.h> #include "buffers.h" +#include "ui_main_screen.h" #include "ui_interface.h" #ifndef TYPES_H_ @@ -13,10 +14,10 @@ #define ENABLE_DISPLAY_PARSE_INFO 0 /* Activate to show braces, in increase the number of displayed lines (formating option)*/ -#define ENABLE_DISPLAY_BRACE 0 +#define ENABLE_DISPLAY_BRACE 1 #if (ENABLE_DISPLAY_TYPE != 0) -# define DISPLAY_TYPE(tYPE) ui_set_signal_text_cb(user_data, tYPE, strlen(tYPE)); +# define DISPLAY_TYPE(tYPE) ui_set_signal_text_cb(user_data, tYPE" ", strlen(tYPE) + 1); #else # define DISPLAY_TYPE(tYPE) #endif @@ -35,7 +36,7 @@ #endif #if (ENABLE_DISPLAY_BRACE != 0) -# define DISPLAY_BRACE(cODE) cODE +# define DISPLAY_BRACE(cODE) if (ui_main_data.display_brace) {cODE} #else # define DISPLAY_BRACE(cODE) #endif @@ -74,7 +75,7 @@ typedef int (*type_file_print_t)(struct types_s *type, int indent, FILE *file); **/ typedef int (*type_dissect_from_buffer_t)( struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, - buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent); + buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line); typedef struct types_s { /* The type of the current description */ diff --git a/common/utils/itti_analyzer/libparser/union_type.c b/common/utils/itti_analyzer/libparser/union_type.c index 9de5cd4c3e..df69290c06 100644 --- a/common/utils/itti_analyzer/libparser/union_type.c +++ b/common/utils/itti_analyzer/libparser/union_type.c @@ -12,29 +12,49 @@ /* There is only one special case of union which is associated to an index: the message id */ int union_msg_dissect_from_buffer( - struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, - buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent) + types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, + buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line) { uint32_t message_id; + int length = 0; + char cbuf[200]; DISPLAY_PARSE_INFO("union_msg", type->name, offset, parent_offset); CHECK_FCT(get_message_id(type->head, buffer, &message_id)); + if (type->name) { + DISPLAY_TYPE("Uni"); + + length = sprintf(cbuf, "%s |", type->name); + DISPLAY_BRACE(length += sprintf(&cbuf[length], " {");); + length += sprintf(&cbuf[length], "\n"); + ui_set_signal_text_cb(user_data, cbuf, length); + } + if (type->members_child[message_id] != NULL) type->members_child[message_id]->type_dissect_from_buffer( type->members_child[message_id], ui_set_signal_text_cb, user_data, - buffer, offset, parent_offset, indent); + buffer, offset, parent_offset, type->name == NULL ? indent : indent + DISPLAY_TAB_SIZE, TRUE); + + DISPLAY_BRACE( + if (type->name) { + DISPLAY_TYPE("Uni"); + + INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "};\n")); + ui_set_signal_text_cb(user_data, cbuf, length); + }); return RC_OK; } int union_dissect_from_buffer( - struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, - buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent) + types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, + buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line) { int length = 0; char cbuf[200]; + char *name; int union_child = 0; DISPLAY_PARSE_INFO("union", type->name, offset, parent_offset); @@ -44,10 +64,20 @@ int union_dissect_from_buffer( // CHECK_FCT(buffer_has_enouch_data(buffer, offset + parent_offset, type->size / 8)); if (type->name) { -// INDENTED(stdout, indent, fprintf(stdout, "<%s>\n", type->name)); + name = type->name; + } + else { + name = "_anonymous_"; + } + if (new_line) { DISPLAY_TYPE("Uni"); - INDENTED_STRING(cbuf, indent, sprintf(cbuf, "%s {\n", type->name)); + } + INDENTED_STRING(cbuf, new_line ? indent : 0, length = sprintf(cbuf, "%s |", name)); + DISPLAY_BRACE(length += sprintf(&cbuf[length], " {");); + length += sprintf(&cbuf[length], "\n"); + ui_set_signal_text_cb(user_data, cbuf, length); + if (type->name) { if (type->parent != NULL) { if ((type->parent->name != NULL) && (strcmp(type->parent->name, "choice") == 0)) @@ -64,29 +94,25 @@ int union_dissect_from_buffer( } } - length = strlen (cbuf); - - ui_set_signal_text_cb(user_data, cbuf, length); /* Only dissect the first field present in unions */ if (type->members_child[union_child] != NULL) type->members_child[union_child]->type_dissect_from_buffer( type->members_child[union_child], ui_set_signal_text_cb, user_data, buffer, - offset, parent_offset, type->name == NULL ? indent : indent + DISPLAY_TAB_SIZE); + offset, parent_offset, indent + DISPLAY_TAB_SIZE, TRUE); - if (type->name) { - DISPLAY_TYPE("Uni"); - INDENTED_STRING(cbuf, indent, sprintf(cbuf, "};\n")); - } + DISPLAY_BRACE( + DISPLAY_TYPE("Uni"); + INDENTED_STRING(cbuf, indent, sprintf(cbuf, "};\n")); - length = strlen (cbuf); + length = strlen (cbuf); - ui_set_signal_text_cb(user_data, cbuf, length); + ui_set_signal_text_cb(user_data, cbuf, length);); return 0; } -int union_type_file_print(struct types_s *type, int indent, FILE *file) { +int union_type_file_print(types_t *type, int indent, FILE *file) { int i; if (type == NULL) return -1; @@ -112,7 +138,7 @@ int union_type_file_print(struct types_s *type, int indent, FILE *file) { return 0; } -int union_type_hr_display(struct types_s *type, int indent) { +int union_type_hr_display(types_t *type, int indent) { int i; if (type == NULL) return -1; diff --git a/common/utils/itti_analyzer/libparser/union_type.h b/common/utils/itti_analyzer/libparser/union_type.h index 0df3fba3c0..2df5be43c0 100644 --- a/common/utils/itti_analyzer/libparser/union_type.h +++ b/common/utils/itti_analyzer/libparser/union_type.h @@ -4,15 +4,15 @@ #define UNION_TYPE_H_ int union_msg_dissect_from_buffer( - struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, - buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent); + types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, + buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line); int union_dissect_from_buffer( - struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, - buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent); + types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data, + buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line); -int union_type_file_print(struct types_s *type, int indent, FILE *file); +int union_type_file_print(types_t *type, int indent, FILE *file); -int union_type_hr_display(struct types_s *type, int indent); +int union_type_hr_display(types_t *type, int indent); #endif /* UNION_TYPE_H_ */ diff --git a/common/utils/itti_analyzer/libparser/xml_parse.c b/common/utils/itti_analyzer/libparser/xml_parse.c index bd85d172b0..f6c81b9469 100644 --- a/common/utils/itti_analyzer/libparser/xml_parse.c +++ b/common/utils/itti_analyzer/libparser/xml_parse.c @@ -788,6 +788,9 @@ static int xml_parse_doc(xmlDocPtr doc) { /* Locate the header part of a message */ CHECK_FCT(locate_type("ittiMsgHeader", head, &message_header_type)); + /* Locate the main message part */ + CHECK_FCT(locate_type("msg", head, &message_type)); + /* Locate the origin task id field */ CHECK_FCT(locate_type("originTaskId", message_header_type, &origin_task_id_type)); /* Locate the destination task id field */ @@ -830,7 +833,7 @@ int dissect_signal_header(buffer_t *buffer, ui_set_signal_text_cb_t ui_set_signa message_header_type->type_dissect_from_buffer( message_header_type, ui_set_signal_text_cb, cb_user_data, - buffer, 0, 0, INDENT_START); + buffer, 0, 0, INDENT_START, TRUE); return RC_OK; } @@ -838,7 +841,7 @@ int dissect_signal_header(buffer_t *buffer, ui_set_signal_text_cb_t ui_set_signa int dissect_signal(buffer_t *buffer, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer cb_user_data) { - if (root == NULL) { + if (message_type == NULL) { g_error("No messages format definition provided"); return RC_FAIL; } @@ -848,8 +851,8 @@ int dissect_signal(buffer_t *buffer, ui_set_signal_text_cb_t ui_set_signal_text_ return RC_FAIL; } - root->type_dissect_from_buffer(root, ui_set_signal_text_cb, cb_user_data, - buffer, 0, 0, INDENT_START); + message_type->type_dissect_from_buffer(message_type, ui_set_signal_text_cb, cb_user_data, + buffer, 0, 0, INDENT_START, TRUE); return RC_OK; } diff --git a/common/utils/itti_analyzer/libresolver/locate_root.c b/common/utils/itti_analyzer/libresolver/locate_root.c index 9013950c62..25566db886 100644 --- a/common/utils/itti_analyzer/libresolver/locate_root.c +++ b/common/utils/itti_analyzer/libresolver/locate_root.c @@ -18,6 +18,7 @@ types_t *origin_task_id_type = NULL; types_t *destination_task_id_type = NULL; types_t *instance_type = NULL; types_t *message_header_type = NULL; +types_t *message_type = NULL; types_t *message_size_type = NULL; int locate_root(const char *root_name, types_t *head, types_t **root_elm) { diff --git a/common/utils/itti_analyzer/libresolver/locate_root.h b/common/utils/itti_analyzer/libresolver/locate_root.h index 28d5662e7d..a5f81d5319 100644 --- a/common/utils/itti_analyzer/libresolver/locate_root.h +++ b/common/utils/itti_analyzer/libresolver/locate_root.h @@ -9,6 +9,7 @@ extern types_t *origin_task_id_type; extern types_t *destination_task_id_type; extern types_t *instance_type; extern types_t *message_header_type; +extern types_t *message_type; extern types_t *message_size_type; int locate_root(const char *root_name, types_t *head, types_t **root); diff --git a/common/utils/itti_analyzer/libresolver/resolvers.c b/common/utils/itti_analyzer/libresolver/resolvers.c index a0e0104deb..2925e5dd3c 100644 --- a/common/utils/itti_analyzer/libresolver/resolvers.c +++ b/common/utils/itti_analyzer/libresolver/resolvers.c @@ -14,7 +14,7 @@ typedef enum { RESOLV_NOT_FOUND = -3, } resolv_rc_e; -int search_id(types_t *head, types_t **found, int id) +static int search_id(types_t *head, types_t **found, int id) { types_t *next_type; @@ -101,7 +101,7 @@ int resolve_struct(types_t **head) if (next_type->type != TYPE_STRUCT) continue; -// g_debug("Trying to resolve struct members %s with type %d", next_type->name, next_type->id); + g_debug("Trying to resolve struct members %s with type %d", next_type->name, next_type->id); /* Struct may have no member */ if (next_type->members == NULL) @@ -115,10 +115,10 @@ int resolve_struct(types_t **head) while(member != NULL) { if (next_type->nb_members == 0) { - next_type->members_child = malloc(sizeof(struct types_s *)); + next_type->members_child = malloc(sizeof(types_t *)); } else { next_type->members_child = realloc(next_type->members_child, - (next_type->nb_members + 1) * sizeof(struct types_s *)); + (next_type->nb_members + 1) * sizeof(types_t *)); } if (search_id(*head, &next_type->members_child[next_type->nb_members], atoi(member)) != RESOLV_OK) { /* We have to remove this reference */ @@ -160,7 +160,7 @@ int resolve_union(types_t **head) if (next_type->type != TYPE_UNION) continue; -// printf("Trying to resolve struct members %s with type %d\n", next_type->name, next_type->id); + g_debug("Trying to resolve union members %s with type %d\n", next_type->name, next_type->id); /* Struct may have no member */ if (next_type->members == NULL) @@ -174,10 +174,10 @@ int resolve_union(types_t **head) while(member != NULL) { if (next_type->nb_members == 0) { - next_type->members_child = malloc(sizeof(struct types_s *)); + next_type->members_child = malloc(sizeof(types_t *)); } else { next_type->members_child = realloc(next_type->members_child, - (next_type->nb_members + 1) * sizeof(struct types_s *)); + (next_type->nb_members + 1) * sizeof(types_t *)); } if (search_id(*head, &next_type->members_child[next_type->nb_members], atoi(member)) != RESOLV_OK) { /* We have to remove this reference */ @@ -208,8 +208,8 @@ int resolve_pointer_type(types_t **head) if (next_type->type != TYPE_POINTER) continue; - // g_debug("Trying to resolve pointer id %d with type %d", - // next_type->id, next_type->type_xml); + g_debug("Trying to resolve pointer id %d with type %d", + next_type->id, next_type->type_xml); if (search_id(*head, &next_type->child, next_type->type_xml) != RESOLV_OK) { /* We have to remove this reference */ @@ -235,8 +235,8 @@ int resolve_reference(types_t **head) if (next_type->type != TYPE_REFERENCE) continue; -// printf("Trying to resolve reference id %d with type %d\n", -// next_type->id, next_type->type_xml); + g_debug("Trying to resolve reference id %d with type %d\n", + next_type->id, next_type->type_xml); if (search_id(*head, &next_type->child, next_type->type_xml) != RESOLV_OK) { /* We have to remove this reference */ @@ -262,8 +262,8 @@ int resolve_field(types_t **head) if (next_type->type != TYPE_FIELD) continue; -// printf("Trying to resolve pointer id %d with type %d\n", -// next_type->id, next_type->type_xml); + g_debug("Trying to resolve pointer id %d with type %d\n", + next_type->id, next_type->type_xml); if (search_id(*head, &next_type->child, next_type->type_xml) != RESOLV_OK) { /* We have to remove this reference */ @@ -289,8 +289,8 @@ int resolve_array(types_t **head) if (next_type->type != TYPE_ARRAY) continue; -// printf("Trying to resolve array id %d with type %d\n", -// next_type->id, next_type->type_xml); + g_debug("Trying to resolve array id %d with type %d\n", + next_type->id, next_type->type_xml); if (search_id(*head, &next_type->child, next_type->type_xml) != RESOLV_OK) { /* We have to remove this reference */ @@ -316,8 +316,8 @@ int resolve_function(types_t **head) if (next_type->type != TYPE_FUNCTION) continue; - // g_debug("Trying to resolve function id %d with type %d", - // next_type->id, next_type->type_xml); + g_debug("Trying to resolve function id %d with type %d", + next_type->id, next_type->type_xml); if (search_id(*head, &next_type->child, next_type->type_xml) != RESOLV_OK) { /* We have to remove this reference */ @@ -348,7 +348,7 @@ int resolve_file(types_t **head) continue; } -// printf("Trying to resolve file %s\n", next_type->file); + g_debug("Trying to resolve file %s\n", next_type->file); if (search_file(*head, &next_type->file_ref, atoi(&next_type->file[1])) != RESOLV_OK) { /* We have to remove this reference */ diff --git a/common/utils/itti_analyzer/libui/ui_callbacks.c b/common/utils/itti_analyzer/libui/ui_callbacks.c index 9e389e61a1..9131da9754 100644 --- a/common/utils/itti_analyzer/libui/ui_callbacks.c +++ b/common/utils/itti_analyzer/libui/ui_callbacks.c @@ -101,6 +101,16 @@ gboolean ui_callback_on_save_filters(GtkWidget *widget, gpointer data) return TRUE; } +gboolean ui_callback_on_enable_filters(GtkWidget *widget, gpointer data) +{ + gboolean enabled; + + enabled = gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.filters_enabled)); + gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.filters_enabled), !enabled); + + return TRUE; +} + gboolean ui_callback_on_about(GtkWidget *widget, gpointer data) { #if defined(PACKAGE_STRING) @@ -115,55 +125,92 @@ gboolean ui_callback_on_about(GtkWidget *widget, gpointer data) gboolean ui_callback_on_select_signal(GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, gpointer user_data) { + static gpointer buffer_current; ui_text_view_t *text_view; GtkTreeIter iter; - text_view = (ui_text_view_t *) user_data; + if (ui_tree_view_last_event) + { + g_debug("last_event %p %d %d", ui_tree_view_last_event, ui_tree_view_last_event->type, ui_tree_view_last_event->button); - g_assert(text_view != NULL); + if (ui_tree_view_last_event->type == GDK_BUTTON_PRESS) + { + /* Callback is due to a button click */ + ui_main_data.follow_last = FALSE; - if (gtk_tree_model_get_iter (model, &iter, path)) - { - GValue buffer_store = G_VALUE_INIT; - gpointer buffer; + if (ui_tree_view_last_event->button == 3) + { + /* It was a right mouse click */ + } + } - GValue message_id_store = G_VALUE_INIT; - guint message_id; + ui_tree_view_last_event = NULL; + } - gtk_tree_model_get_value (model, &iter, COL_BUFFER, &buffer_store); - buffer = g_value_get_pointer (&buffer_store); + g_debug("Message selected %d %p %p %s", path_currently_selected, buffer_current, path, gtk_tree_path_to_string(path)); - gtk_tree_model_get_value (model, &iter, COL_MESSAGE_ID, &message_id_store); - message_id = g_value_get_uint(&message_id_store); + if (!path_currently_selected) + { + text_view = (ui_text_view_t *) user_data; - if (!path_currently_selected) - { - /* Clear the view */ - CHECK_FCT_DO(ui_signal_dissect_clear_view(text_view), return FALSE); + g_assert(text_view != NULL); - if ((strcmp (message_id_to_string (message_id), "ERROR") == 0) - || (strcmp (message_id_to_string (message_id), "WARNING") == 0) - || (strcmp (message_id_to_string (message_id), "GENERIC_LOG") == 0)) - { - gchar *data; - gint data_size; - uint32_t message_header_type_size; + if (gtk_tree_model_get_iter(model, &iter, path)) + { + GValue buffer_store = G_VALUE_INIT; + gpointer buffer; - CHECK_FCT_DO(dissect_signal_header((buffer_t*)buffer, ui_signal_set_text, text_view), return FALSE); + GValue message_id_store = G_VALUE_INIT; + guint message_id; - message_header_type_size = get_message_header_type_size (); - data = (gchar *) buffer_at_offset ((buffer_t*) buffer, message_header_type_size); - data_size = get_message_size ((buffer_t*) buffer); + gtk_tree_model_get_value(model, &iter, COL_BUFFER, &buffer_store); + buffer = g_value_get_pointer(&buffer_store); - g_debug("message header type size: %u, data size: %u", message_header_type_size, data_size); + g_debug(" Get iter %p %p", buffer_current, buffer); - ui_signal_set_text (text_view, "\n", 1); - ui_signal_set_text (text_view, data, data_size); - } - else + if (buffer_current != buffer) { - /* Dissect the signal */ - CHECK_FCT_DO(dissect_signal((buffer_t*)buffer, ui_signal_set_text, text_view), return FALSE); + buffer_current = buffer; + + gtk_tree_model_get_value(model, &iter, COL_MESSAGE_ID, &message_id_store); + message_id = g_value_get_uint(&message_id_store); + + /* Clear the view */ + CHECK_FCT_DO(ui_signal_dissect_clear_view(text_view), return FALSE); + + if (ui_main_data.display_message_header) + { + CHECK_FCT_DO(dissect_signal_header((buffer_t*)buffer, ui_signal_set_text, text_view), return FALSE); + } + + if ((strcmp(message_id_to_string(message_id), "ERROR_LOG") == 0) + || (strcmp(message_id_to_string(message_id), "WARNING_LOG") == 0) + || (strcmp(message_id_to_string(message_id), "GENERIC_LOG") == 0)) + { + gchar *data; + gint data_size; + uint32_t message_header_type_size; + + if (ui_main_data.display_message_header) + { + ui_signal_set_text(text_view, "\n", 1); + } + + message_header_type_size = get_message_header_type_size(); + data = (gchar *) buffer_at_offset((buffer_t*) buffer, message_header_type_size); + data_size = get_message_size((buffer_t*) buffer); + + g_debug(" message header type size: %u, data size: %u %p %d", message_header_type_size, data_size, + buffer, ui_main_data.follow_last); + + ui_signal_set_text(text_view, data, data_size); + } else + { + g_debug(" dissect message %d %p %d", message_id, buffer, ui_main_data.follow_last); + + /* Dissect the signal */ + CHECK_FCT_DO(dissect_signal((buffer_t*)buffer, ui_signal_set_text, text_view), return FALSE); + } } } } @@ -172,6 +219,7 @@ gboolean ui_callback_on_select_signal(GtkTreeSelection *selection, GtkTreeModel void ui_signal_add_to_list(gpointer data, gpointer user_data) { + gboolean goto_last = user_data ? TRUE : FALSE; buffer_t *signal_buffer; GtkTreePath *path; GtkTreeViewColumn *focus_column; @@ -205,11 +253,10 @@ void ui_signal_add_to_list(gpointer data, gpointer user_data) /* Increment number of messages */ ui_main_data.nb_message_received++; - /* Check if no signal was selected in the list or if it was the last signal */ - if ((ui_main_data.path_last == NULL) || (path == NULL) || (gtk_tree_path_compare(ui_main_data.path_last, path) == 0)) + if ((ui_main_data.follow_last) && (goto_last)) { /* Advance to the new last signal */ - ui_callback_signal_go_to_last (NULL, NULL); + ui_tree_view_select_row (ui_tree_view_get_filtered_number() - 1); } } @@ -225,7 +272,7 @@ static gboolean ui_handle_update_signal_list(gint fd, void *data, size_t data_le g_assert(signal_list_message != NULL); g_assert(signal_list_message->signal_list != NULL); - g_list_foreach (signal_list_message->signal_list, ui_signal_add_to_list, NULL); + g_list_foreach (signal_list_message->signal_list, ui_signal_add_to_list, (gpointer) TRUE); /* Free the list but not user data associated with each element */ g_list_free (signal_list_message->signal_list); @@ -378,25 +425,46 @@ gboolean ui_callback_on_disconnect(GtkWidget *widget, gpointer data) return TRUE; } +gboolean ui_callback_signal_go_to_first(GtkWidget *widget, gpointer data) +{ + ui_tree_view_select_row (0); + ui_main_data.follow_last = FALSE; + + return TRUE; +} + gboolean ui_callback_signal_go_to(GtkWidget *widget, gpointer data) { - ui_tree_view_select_row (ui_main_data.nb_message_received / 2, NULL); + gtk_window_set_focus (GTK_WINDOW(ui_main_data.window), ui_main_data.signals_go_to_entry); return TRUE; } -gboolean ui_callback_signal_go_to_first(GtkWidget *widget, gpointer data) +gboolean ui_callback_signal_go_to_entry(GtkWidget *widget, gpointer data) { - ui_tree_view_select_row (0, NULL); + // gtk_entry_buffer_set_text(GTK_ENTRY(ui_main_data.signals_go_to_entry), ""); + gtk_window_set_focus (GTK_WINDOW(ui_main_data.window), ui_main_data.signalslist); return TRUE; } gboolean ui_callback_signal_go_to_last(GtkWidget *widget, gpointer data) { - GtkTreePath *path; + ui_tree_view_select_row (ui_tree_view_get_filtered_number() - 1); + ui_main_data.follow_last = TRUE; + + return TRUE; +} - ui_tree_view_select_row (ui_tree_view_get_filtered_number() - 1, &path); - ui_main_data.path_last = path; +gboolean ui_callback_display_message_header(GtkWidget *widget, gpointer data) +{ + ui_main_data.display_message_header = !ui_main_data.display_message_header; + // TODO refresh textview. + return TRUE; +} +gboolean ui_callback_display_brace(GtkWidget *widget, gpointer data) +{ + ui_main_data.display_brace = !ui_main_data.display_brace; + // TODO refresh textview. return TRUE; } @@ -411,7 +479,7 @@ gboolean ui_callback_signal_clear_list(GtkWidget *widget, gpointer data) if (ui_main_data.text_view != NULL) { - // ui_signal_dissect_clear_view(ui_main_data.text_view); + ui_signal_dissect_clear_view(ui_main_data.text_view); } return TRUE; diff --git a/common/utils/itti_analyzer/libui/ui_callbacks.h b/common/utils/itti_analyzer/libui/ui_callbacks.h index 6f111c3861..66db3504d0 100644 --- a/common/utils/itti_analyzer/libui/ui_callbacks.h +++ b/common/utils/itti_analyzer/libui/ui_callbacks.h @@ -18,6 +18,9 @@ gboolean ui_callback_on_open_filters(GtkWidget *widget, gboolean ui_callback_on_save_filters(GtkWidget *widget, gpointer data); +gboolean ui_callback_on_enable_filters(GtkWidget *widget, + gpointer data); + gboolean ui_callback_on_about(GtkWidget *widget, gpointer data); @@ -41,15 +44,24 @@ ui_callback_on_select_signal(GtkTreeSelection *selection, gboolean path_currently_selected, gpointer userdata); +gboolean ui_callback_signal_go_to_first(GtkWidget *widget, + gpointer data); + gboolean ui_callback_signal_go_to(GtkWidget *widget, - gpointer data); + gpointer data); -gboolean ui_callback_signal_go_to_first(GtkWidget *widget, +gboolean ui_callback_signal_go_to_entry(GtkWidget *widget, gpointer data); gboolean ui_callback_signal_go_to_last(GtkWidget *widget, gpointer data); +gboolean ui_callback_display_message_header(GtkWidget *widget, + gpointer data); + +gboolean ui_callback_display_brace(GtkWidget *widget, + gpointer data); + gboolean ui_callback_signal_clear_list(GtkWidget *widget, gpointer data); diff --git a/common/utils/itti_analyzer/libui/ui_interface.c b/common/utils/itti_analyzer/libui/ui_interface.c index 3dd58b2756..5010a07658 100644 --- a/common/utils/itti_analyzer/libui/ui_interface.c +++ b/common/utils/itti_analyzer/libui/ui_interface.c @@ -22,7 +22,7 @@ gboolean ui_callback_on_pipe_notification( /* avoid reentrancy problems and stack overflow */ g_source_remove(pipe_input->pipe_input_id); - // g_debug("Received new data on pipe %d", pipe_input->pipe_input_id); + g_debug("Received new data on pipe %d", pipe_input->pipe_input_id); if (pipe_input->input_cb(pipe_input->source_fd, pipe_input->user_data)) { /* restore pipe handler */ diff --git a/common/utils/itti_analyzer/libui/ui_main_screen.c b/common/utils/itti_analyzer/libui/ui_main_screen.c index 7512c4872d..b0bccef9b2 100644 --- a/common/utils/itti_analyzer/libui/ui_main_screen.c +++ b/common/utils/itti_analyzer/libui/ui_main_screen.c @@ -22,6 +22,11 @@ ui_main_data_t ui_main_data; +gchar *LOG_DOMAIN_PARSE = "Parse"; +gchar *LOG_DOMAIN_PIPE = "Pipe"; +gchar *LOG_DOMAIN_SOCKET = "Socket"; +gchar *LOG_DOMAIN_UI = "UI"; + static void ui_help(void) { printf ("Usage: itti_analyser [options]\n\n" @@ -112,6 +117,8 @@ static int ui_idle_callback(gpointer data) { g_debug("Entering idle state"); + gtk_window_set_focus (GTK_WINDOW(ui_main_data.window), ui_main_data.signalslist); + /* Read filters file */ if (ui_main_data.filters_file_name != NULL) { @@ -168,6 +175,7 @@ int ui_gtk_initialize(int argc, char *argv[]) ui_main_data.window = gtk_window_new (GTK_WINDOW_TOPLEVEL); ui_init_filters (TRUE, FALSE); + // gtk_window_set_default_icon_from_file ("../analyzer.png", NULL); gtk_window_set_default_icon_name (GTK_STOCK_FIND); gtk_window_set_position (GTK_WINDOW(ui_main_data.window), GTK_WIN_POS_CENTER); diff --git a/common/utils/itti_analyzer/libui/ui_main_screen.h b/common/utils/itti_analyzer/libui/ui_main_screen.h index b044df0790..5420d20296 100644 --- a/common/utils/itti_analyzer/libui/ui_main_screen.h +++ b/common/utils/itti_analyzer/libui/ui_main_screen.h @@ -1,8 +1,10 @@ -#include "ui_signal_dissect_view.h" - #ifndef UI_MAIN_SCREEN_H_ #define UI_MAIN_SCREEN_H_ +#include <gtk/gtk.h> + +#include "ui_signal_dissect_view.h" + typedef struct { GtkWidget *window; GtkWidget *ip_entry; @@ -29,12 +31,14 @@ typedef struct { /* Signal list buttons */ /* Clear signals button */ - GtkToolItem *signals_go_to_button; + GtkWidget *signals_go_to_entry; GtkToolItem *signals_go_to_last_button; GtkToolItem *signals_go_to_first_button; + gboolean display_message_header; + gboolean display_brace; GtkTreeSelection *selection; - GtkTreePath *path_last; + gboolean follow_last; /* Nb of messages received */ guint nb_message_received; diff --git a/common/utils/itti_analyzer/libui/ui_menu_bar.c b/common/utils/itti_analyzer/libui/ui_menu_bar.c index 3a8867adb7..f291b9cc18 100644 --- a/common/utils/itti_analyzer/libui/ui_menu_bar.c +++ b/common/utils/itti_analyzer/libui/ui_menu_bar.c @@ -1,4 +1,5 @@ #include <gtk/gtk.h> +#include <gdk/gdkkeysyms.h> #include "rc.h" #include "ui_main_screen.h" @@ -19,78 +20,162 @@ void ui_set_sensitive_move_buttons(gboolean enable) int ui_menu_bar_create(GtkWidget *vbox) { - GtkWidget *menubar; - GtkWidget *filemenu, *helpmenu; - GtkWidget *file; + GtkAccelGroup *accel_group; + GtkWidget *menu_bar; + GtkWidget *filters_menu; + GtkWidget *messages_menu; + GtkWidget *help_menu; + GtkWidget *filters; + GtkWidget *messages; GtkWidget *help; - GtkWidget *open_messages; - GtkWidget *save_messages; GtkWidget *open_filters; GtkWidget *save_filters; + GtkWidget *enable_filters; + GtkWidget *open_messages; + GtkWidget *reload_messages; + GtkWidget *save_messages; + GtkWidget *goto_first_messages; + GtkWidget *goto_messages; + GtkWidget *goto_last_messages; + GtkWidget *display_message_header; + GtkWidget *display_brace; GtkWidget *quit; GtkWidget *about; - GtkWidget *separator1; - GtkWidget *separator2; if (!vbox) return RC_BAD_PARAM; - menubar = gtk_menu_bar_new(); - - /* Create the File submenu */ - filemenu = gtk_menu_new(); - - file = gtk_menu_item_new_with_label("File"); - open_messages = gtk_menu_item_new_with_label("Open messages file"); - save_messages = gtk_menu_item_new_with_label("Save messages file"); - open_filters = gtk_menu_item_new_with_label("Open filters file"); - save_filters = gtk_menu_item_new_with_label("Save filters file"); - quit = gtk_menu_item_new_with_label("Quit"); - separator1 = gtk_menu_item_new(); - separator2 = gtk_menu_item_new(); - - gtk_menu_item_set_submenu(GTK_MENU_ITEM(file), filemenu); - - gtk_menu_shell_append(GTK_MENU_SHELL(menubar), file); - gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), open_messages); - gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), save_messages); - gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), separator1); - gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), open_filters); - gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), save_filters); - gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), separator2); - gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), quit); + accel_group = gtk_accel_group_new(); + gtk_window_add_accel_group(GTK_WINDOW(ui_main_data.window), accel_group); - /* Create the Help submenu */ - helpmenu = gtk_menu_new(); + menu_bar = gtk_menu_bar_new(); - help = gtk_menu_item_new_with_label("Help"); - about = gtk_menu_item_new_with_label("About"); + /* Create the Filters sub-menu */ + { + filters = gtk_menu_item_new_with_mnemonic ("_Filters"); + gtk_menu_shell_append (GTK_MENU_SHELL(menu_bar), filters); + + filters_menu = gtk_menu_new (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM(filters), filters_menu); + + /* Create the Filters menu items */ + { + open_filters = gtk_menu_item_new_with_mnemonic ("_Open filters file"); + gtk_widget_add_accelerator (open_filters, "activate", accel_group, GDK_KEY_p, GDK_CONTROL_MASK, + GTK_ACCEL_VISIBLE); + gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), open_filters); + g_signal_connect(G_OBJECT(open_filters), "activate", G_CALLBACK(ui_callback_on_open_filters), NULL); + + save_filters = gtk_menu_item_new_with_mnemonic ("_Save filters file"); + gtk_widget_add_accelerator (save_filters, "activate", accel_group, GDK_KEY_a, GDK_CONTROL_MASK, + GTK_ACCEL_VISIBLE); + gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), save_filters); + g_signal_connect(G_OBJECT(save_filters), "activate", G_CALLBACK(ui_callback_on_save_filters), NULL); + + gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), gtk_menu_item_new ()); // Separator + + enable_filters = gtk_menu_item_new_with_mnemonic ("_Enable filtering"); + gtk_widget_add_accelerator (enable_filters, "activate", accel_group, GDK_KEY_e, GDK_CONTROL_MASK, + GTK_ACCEL_VISIBLE); + gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), enable_filters); + g_signal_connect(G_OBJECT(enable_filters), "activate", G_CALLBACK(ui_callback_on_enable_filters), NULL); + + gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), gtk_menu_item_new ()); // Separator + + quit = gtk_menu_item_new_with_mnemonic ("_Quit"); + gtk_widget_add_accelerator (quit, "activate", accel_group, GDK_KEY_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); + gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), quit); + g_signal_connect(G_OBJECT(quit), "activate", G_CALLBACK(gtk_main_quit), NULL); + } + } - gtk_menu_item_set_submenu(GTK_MENU_ITEM(help), helpmenu); + /* Create the Messages sub-menu */ + { + messages = gtk_menu_item_new_with_mnemonic ("_Messages"); + gtk_menu_shell_append (GTK_MENU_SHELL(menu_bar), messages); + + messages_menu = gtk_menu_new (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM(messages), messages_menu); + + /* Crate the Messages menu items */ + { + open_messages = gtk_menu_item_new_with_mnemonic ("_Open messages file"); + gtk_widget_add_accelerator (open_messages, "activate", accel_group, GDK_KEY_o, GDK_CONTROL_MASK, + GTK_ACCEL_VISIBLE); + gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), open_messages); + g_signal_connect(G_OBJECT(open_messages), "activate", G_CALLBACK(ui_callback_on_open_messages), + (gpointer) FALSE); + + reload_messages = gtk_menu_item_new_with_mnemonic ("_Reload messages file"); + gtk_widget_add_accelerator (reload_messages, "activate", accel_group, GDK_KEY_r, GDK_CONTROL_MASK, + GTK_ACCEL_VISIBLE); + gtk_widget_add_accelerator (reload_messages, "activate", accel_group, GDK_KEY_F5, 0, GTK_ACCEL_VISIBLE); + gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), reload_messages); + g_signal_connect(G_OBJECT(reload_messages), "activate", G_CALLBACK(ui_callback_on_open_messages), + (gpointer) TRUE); + + save_messages = gtk_menu_item_new_with_mnemonic ("_Save messages file"); + gtk_widget_add_accelerator (save_messages, "activate", accel_group, GDK_KEY_s, GDK_CONTROL_MASK, + GTK_ACCEL_VISIBLE); + gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), save_messages); + g_signal_connect(G_OBJECT(save_messages), "activate", G_CALLBACK(ui_callback_on_save_messages), NULL); + + gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), gtk_menu_item_new ()); // Separator + + goto_first_messages = gtk_menu_item_new_with_mnemonic ("Go to _first message"); + gtk_widget_add_accelerator (goto_first_messages, "activate", accel_group, GDK_KEY_f, GDK_CONTROL_MASK, + GTK_ACCEL_VISIBLE); + gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), goto_first_messages); + g_signal_connect(G_OBJECT(goto_first_messages), "activate", G_CALLBACK(ui_callback_signal_go_to_first), + NULL); + + goto_messages = gtk_menu_item_new_with_mnemonic ("_Go to message ..."); + gtk_widget_add_accelerator (goto_messages, "activate", accel_group, GDK_KEY_g, GDK_CONTROL_MASK, + GTK_ACCEL_VISIBLE); + gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), goto_messages); + g_signal_connect(G_OBJECT(goto_messages), "activate", G_CALLBACK(ui_callback_signal_go_to), NULL); + + goto_last_messages = gtk_menu_item_new_with_mnemonic ("Go to _last message"); + gtk_widget_add_accelerator (goto_last_messages, "activate", accel_group, GDK_KEY_l, GDK_CONTROL_MASK, + GTK_ACCEL_VISIBLE); + gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), goto_last_messages); + g_signal_connect(G_OBJECT(goto_last_messages), "activate", G_CALLBACK(ui_callback_signal_go_to_last), NULL); + + gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), gtk_menu_item_new ()); // Separator + + display_message_header = gtk_menu_item_new_with_mnemonic ("Display message _header"); + gtk_widget_add_accelerator (display_message_header, "activate", accel_group, GDK_KEY_h, GDK_CONTROL_MASK, + GTK_ACCEL_VISIBLE); + gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), display_message_header); + g_signal_connect(G_OBJECT(display_message_header), "activate", + G_CALLBACK(ui_callback_display_message_header), NULL); + + display_brace = gtk_menu_item_new_with_mnemonic ("Display _brace"); + gtk_widget_add_accelerator (display_brace, "activate", accel_group, GDK_KEY_b, GDK_CONTROL_MASK, + GTK_ACCEL_VISIBLE); + gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), display_brace); + g_signal_connect(G_OBJECT(display_brace), "activate", G_CALLBACK(ui_callback_display_brace), NULL); + } + } - gtk_menu_shell_append(GTK_MENU_SHELL(menubar), help); - gtk_menu_shell_append(GTK_MENU_SHELL(helpmenu), about); + /* Create the Help sub-menu */ + { + help = gtk_menu_item_new_with_mnemonic ("_Help"); + gtk_menu_shell_append (GTK_MENU_SHELL(menu_bar), help); + + help_menu = gtk_menu_new (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM(help), help_menu); + + /* Create the Help menu item */ + { + about = gtk_menu_item_new_with_mnemonic ("_About"); + gtk_menu_shell_append (GTK_MENU_SHELL(help_menu), about); + g_signal_connect(G_OBJECT(about), "activate", G_CALLBACK(ui_callback_on_about), NULL); + } + } /* Add the menubar to the vbox */ - gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 3); - - g_signal_connect(G_OBJECT(open_messages), "activate", - G_CALLBACK(ui_callback_on_open_messages), NULL); - - g_signal_connect(G_OBJECT(save_messages), "activate", - G_CALLBACK(ui_callback_on_save_messages), NULL); - - g_signal_connect(G_OBJECT(open_filters), "activate", - G_CALLBACK(ui_callback_on_open_filters), NULL); - - g_signal_connect(G_OBJECT(save_filters), "activate", - G_CALLBACK(ui_callback_on_save_filters), NULL); - - g_signal_connect(G_OBJECT(quit), "activate", - G_CALLBACK(gtk_main_quit), NULL); - - g_signal_connect(G_OBJECT(about), "activate", - G_CALLBACK(ui_callback_on_about), NULL); + gtk_box_pack_start(GTK_BOX(vbox), menu_bar, FALSE, FALSE, 3); return RC_OK; } @@ -163,20 +248,6 @@ int ui_toolbar_create(GtkWidget *vbox) G_CALLBACK(ui_callback_on_save_messages), NULL); } -#if 0 /* This function is already handled by GTK */ - /* Button to go given signal number */ - { - ui_main_data.signals_go_to_button = gtk_tool_button_new_from_stock(GTK_STOCK_INDEX); - /* Set the tooltip text */ - gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.signals_go_to_button), "Goto signal"); - - gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.signals_go_to_button), FALSE); - - g_signal_connect(G_OBJECT(ui_main_data.signals_go_to_button), "clicked", - G_CALLBACK(ui_callback_signal_go_to), NULL); - } -#endif - /* Button to go to first signal in list */ { ui_main_data.signals_go_to_first_button = gtk_tool_button_new_from_stock(GTK_STOCK_GOTO_FIRST); @@ -189,6 +260,16 @@ int ui_toolbar_create(GtkWidget *vbox) G_CALLBACK(ui_callback_signal_go_to_first), NULL); } + /* Entry to go to given signal number */ + { + ui_main_data.signals_go_to_entry = gtk_entry_new (); + gtk_entry_set_width_chars (GTK_ENTRY(ui_main_data.signals_go_to_entry), 10); + // gtk_entry_set_input_purpose (GTK_ENTRY(ui_main_data.signals_go_to_entry), GTK_INPUT_PURPOSE_DIGITS); + + g_signal_connect(G_OBJECT(ui_main_data.signals_go_to_entry), "activate", + G_CALLBACK(ui_callback_signal_go_to_entry), NULL); + } + /* Button to go to last signal in list */ { ui_main_data.signals_go_to_last_button = gtk_tool_button_new_from_stock(GTK_STOCK_GOTO_LAST); @@ -251,6 +332,7 @@ int ui_toolbar_create(GtkWidget *vbox) gtk_box_pack_start(GTK_BOX(hbox), gtk_separator_new(GTK_ORIENTATION_VERTICAL), FALSE, FALSE, SEPARATOR_SPACE); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.signals_go_to_first_button), FALSE, FALSE, BUTTON_SPACE); + gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.signals_go_to_entry), FALSE, FALSE, BUTTON_SPACE); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.signals_go_to_last_button), FALSE, FALSE, BUTTON_SPACE); gtk_box_pack_start(GTK_BOX(hbox), gtk_separator_new(GTK_ORIENTATION_VERTICAL), FALSE, FALSE, SEPARATOR_SPACE); diff --git a/common/utils/itti_analyzer/libui/ui_notebook.c b/common/utils/itti_analyzer/libui/ui_notebook.c index 313aa438bf..a35024ade8 100644 --- a/common/utils/itti_analyzer/libui/ui_notebook.c +++ b/common/utils/itti_analyzer/libui/ui_notebook.c @@ -27,6 +27,11 @@ int ui_notebook_create(GtkWidget *vbox) gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox_notebook, NULL); gtk_notebook_set_tab_label_text (GTK_NOTEBOOK(notebook), vbox_notebook, "Messages list"); + vbox_notebook = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); + + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox_notebook, NULL); + gtk_notebook_set_tab_label_text (GTK_NOTEBOOK(notebook), vbox_notebook, "Filters"); + /* Add the notebook to the vbox of the main window */ gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0); diff --git a/common/utils/itti_analyzer/libui/ui_notifications.c b/common/utils/itti_analyzer/libui/ui_notifications.c index 03466b46f1..2e04360d6f 100644 --- a/common/utils/itti_analyzer/libui/ui_notifications.c +++ b/common/utils/itti_analyzer/libui/ui_notifications.c @@ -104,6 +104,7 @@ int ui_messages_read(char *filename) size = st.st_size; ui_callback_signal_clear_list (NULL, NULL); + ui_main_data.follow_last = TRUE; /* Initialize the progress bar */ ui_progress_bar_set_fraction(0); @@ -162,18 +163,20 @@ int ui_messages_read(char *filename) buffer->message_number = itti_signal_header->message_number; - ui_signal_add_to_list (buffer, NULL); - read_messages++; + ui_signal_add_to_list (buffer, ((read_messages % 100) == 0) ? (gpointer) 1: NULL); - if (read_messages % 100 == 0) + if ((read_messages % 100) == 0) { ui_progress_bar_set_fraction(read_fraction); ui_gtk_flush_events (); } + + read_messages++; break; } case ITTI_DUMP_XML_DEFINITION: + ui_gtk_flush_events (); xml_parse_buffer (input_data, input_data_length); ui_gtk_flush_events (); break; @@ -197,6 +200,12 @@ int ui_messages_read(char *filename) /* Enable buttons to move in the list of signals */ ui_set_sensitive_move_buttons (TRUE); + if (ui_main_data.follow_last) + { + /* Advance to the last signal */ + ui_tree_view_select_row (ui_tree_view_get_filtered_number() - 1); + } + basename = g_path_get_basename(filename); ui_set_title ("\"%s\"", basename); } diff --git a/common/utils/itti_analyzer/libui/ui_signal_dissect_view.c b/common/utils/itti_analyzer/libui/ui_signal_dissect_view.c index 112ca206fe..0dd5b86b73 100644 --- a/common/utils/itti_analyzer/libui/ui_signal_dissect_view.c +++ b/common/utils/itti_analyzer/libui/ui_signal_dissect_view.c @@ -51,12 +51,11 @@ int ui_signal_dissect_clear_view(ui_text_view_t *text_view) if (text_view->text_view != NULL) { - text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view->text_view)); + /* Create an empty text buffer */ + text_buffer = gtk_text_buffer_new(NULL); + gtk_text_buffer_set_text(text_buffer, "", 0); - /* If a text buffer is present for the textview remove it */ - if (text_buffer != NULL) { - gtk_text_view_set_buffer(GTK_TEXT_VIEW(text_view->text_view), NULL); - } + gtk_text_view_set_buffer(GTK_TEXT_VIEW(text_view->text_view), text_buffer); } return RC_OK; diff --git a/common/utils/itti_analyzer/libui/ui_tree_view.c b/common/utils/itti_analyzer/libui/ui_tree_view.c index 4c810fd998..b67870fa16 100644 --- a/common/utils/itti_analyzer/libui/ui_tree_view.c +++ b/common/utils/itti_analyzer/libui/ui_tree_view.c @@ -25,6 +25,8 @@ typedef struct static ui_store_t ui_store; +GdkEventButton *ui_tree_view_last_event; + static gboolean ui_tree_filter_messages(GtkTreeModel *model, GtkTreeIter *iter, ui_store_t *store) { uint32_t msg_number; @@ -52,6 +54,24 @@ static gboolean ui_tree_filter_messages(GtkTreeModel *model, GtkTreeIter *iter, return enabled; } +static gboolean onButtonPressed(GtkWidget *treeview, GdkEventButton *event, gpointer userdata) +{ + g_debug("onButtonPressed %p %p %p %d %d", treeview, event, userdata, event->type, event->button); + ui_tree_view_last_event = event; + + return FALSE; +} + +/* +static gboolean onButtonRelease(GtkWidget *treeview, GdkEventButton *event, gpointer userdata) +{ + g_debug("onButtonRelease %p %p %p %d %d", treeview, event, userdata, event->type, event->button); + // last_event = event; + + return FALSE; +} +*/ + static void ui_tree_view_init_list(GtkWidget *list) { @@ -176,7 +196,45 @@ void ui_tree_view_destroy_list(GtkWidget *list) /* Reset number of messages */ ui_main_data.nb_message_received = 0; - ui_main_data.path_last = NULL; +} + +/* Search for the message with its message number equal to the given value or the previous one */ +static gboolean ui_tree_view_search (GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter, + gpointer search_data) +{ + uint32_t msg_number; + uint32_t key_value = atoi(key); + + gtk_tree_model_get (model, iter, column, &msg_number, -1); + + g_debug ("ui_tree_view_search %d %d", key_value, msg_number); + + if (key_value == msg_number) + { + /* Value found, use this message */ + return 0; + } + + { + GtkTreeIter iter_next = *iter; + + if (gtk_tree_model_iter_next(model, &iter_next)) + { + gtk_tree_model_get (model, &iter_next, column, &msg_number, -1); + + if (key_value < msg_number) + { + /* Next value will be greater, use this message */ + return 0; + } + } + else + { + /* Last value, use this message */ + return 0; + } + } + return 1; } int ui_tree_view_create(GtkWidget *window, GtkWidget *vbox) @@ -192,6 +250,8 @@ int ui_tree_view_create(GtkWidget *window, GtkWidget *vbox) ui_main_data.signalslist = gtk_tree_view_new(); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(ui_main_data.signalslist), TRUE); + gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW(ui_main_data.signalslist), ui_tree_view_search, NULL, NULL); + gtk_tree_view_set_search_entry (GTK_TREE_VIEW(ui_main_data.signalslist), GTK_ENTRY(ui_main_data.signals_go_to_entry)); /* Disable multiple selection */ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(ui_main_data.signalslist)); @@ -210,6 +270,9 @@ int ui_tree_view_create(GtkWidget *window, GtkWidget *vbox) gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 5); + g_signal_connect(G_OBJECT(ui_main_data.signalslist), "button-press-event", G_CALLBACK (onButtonPressed), NULL); + // g_signal_connect(G_OBJECT(ui_main_data.signalslist), "button-release-event", G_CALLBACK (onButtonRelease), NULL); + /* Connect callback on row selection */ gtk_tree_selection_set_select_function(selection, ui_callback_on_select_signal, ui_main_data.text_view, NULL); @@ -249,20 +312,16 @@ int ui_tree_view_new_signal_ind(const uint32_t message_number, const gchar *lte_ return RC_OK; } -void ui_tree_view_select_row(gint row, GtkTreePath **path) +void ui_tree_view_select_row(gint row) { GtkTreePath *path_row; path_row = gtk_tree_path_new_from_indices(row, -1); + /* Select the message in requested row */ gtk_tree_view_set_cursor(GTK_TREE_VIEW(ui_main_data.signalslist), path_row, NULL, FALSE); /* Center the message in the middle of the list if possible */ gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(ui_main_data.signalslist), path_row, NULL, TRUE, 0.5, 0.0); - - if (path != NULL) - { - *path = path_row; - } } void ui_tree_view_refilter(void) diff --git a/common/utils/itti_analyzer/libui/ui_tree_view.h b/common/utils/itti_analyzer/libui/ui_tree_view.h index f03bb2bb8f..a9aba1edfa 100644 --- a/common/utils/itti_analyzer/libui/ui_tree_view.h +++ b/common/utils/itti_analyzer/libui/ui_tree_view.h @@ -18,6 +18,8 @@ typedef enum NUM_COLS } col_type_e; +extern GdkEventButton *ui_tree_view_last_event; + int ui_tree_view_create(GtkWidget *window, GtkWidget *vbox); int ui_tree_view_new_signal_ind(const uint32_t message_number, const gchar *lte_time, @@ -28,7 +30,7 @@ int ui_tree_view_new_signal_ind(const uint32_t message_number, const gchar *lte_ void ui_tree_view_destroy_list(GtkWidget *list); -void ui_tree_view_select_row(gint row, GtkTreePath **path); +void ui_tree_view_select_row(gint row); void ui_tree_view_refilter(void); -- GitLab