diff --git a/common/utils/itti_analyzer/libbuffers/socket.c b/common/utils/itti_analyzer/libbuffers/socket.c index 27d9316d6f5ab54c3b9a222d4ff24a5595d64c24..ff5e28fd3c0e1cb450c073563817f58c7bf10018 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 2537839c559b5fcb0fcdb2e7b26a2f884c9241c7..0a2fe60b57db6f7ada5b9b474a14c2e426a0a491 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 3dd9571af600bd19c81228c0faad8ab8a21b0b13..3d7273c1e227b6a37e6afa1bb1f2c6984ee7f790 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 889d40a72865f67ad8e9a2502da0cd38ec76d615..734cbac7a0ef86b8d65bedb0f425cd1ecd5b6747 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 27501ffa45c75306baf9170404c18827386bac80..3c3d918b1c23ee0e0090d6e854d3c4f6bb16b1e3 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 bb560ae98337fb4804b4db48b62a3c68f53af483..472fcb8064788313219a8faa379097eef2c40e7a 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 6db11524828b0e7921aa98b478d154af00970d3c..8f6249733a6093998d35235362a35bc8d1fe62e0 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 44c7ae3d4113b1f59ca5952ca7fbe78f5ca1cc1e..c681e27af35eb6840d80786b44a6cd1ba23f0b6a 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 bf23cb8dc257bc12ea5f7372a3c1db8c557e1b55..9e2b5d56ad41b33b5cfa255fb870a1d706e86141 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 36db678f204099de40bcc8297fd3e0de2145630d..0ca1bc3a655d6ed5079057e476ac2a744e0c5414 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 a2ad0cc4602e67211b8c5270f0f9d2f7fb674a10..5f9a8640547455ec1c217281dc17f344272e808b 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 b3291adc6d42671b8a590b9aecdd88320c708dc7..51045b56ee66c7c1fac9e5a44a0e9d90c7d28b80 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 0b58a426fedb7d70e8068ce5adea7ce764bdfec7..3d0870321b73bf425f56dbba19dd06abe62afec5 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 d866546aa122b33cb6f64c00989a89bb8c07283f..39719c94949309d7f9e8ff90550c95b063464665 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 6f82f42c6b9e03df2d507ea1c789e5195f8a4f8a..6560f4f45dc234948a3ae2696ec461c15dbbef49 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 32e2f75c3e29d1223796f4d532453924b2981bc0..409428d624c8cd5f248948f17dda98b8ca216cee 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 3c52088d8f798b6ee7d81f10ecbc45eaff03bdc3..fe0c84f9d85b8f6076394f2ea8aae42eee29bcd3 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 c4d66918280e306c0720ab5459e65c31c95f42a5..a4189dc1c41f84d36b410920a09c5cc359b72bfb 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 d785141e903da3b77123989d18b4016bef9c5d1f..a3e1fcf12fda829489d97c26682253a5810d7123 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 193e7449fb11485b9be6811d46c073ce57b31cd1..18239fc87bd89c95e9b2a477ee99d3e0af9eae85 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 e0f96f501b246777a7dfe8bbc354614fb3315192..878176005fce59fcdc9c581237a55ac14c6b8e3e 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 bfd057b8e3f113873869f134ce177779d8809c3b..2a8e55951a2d08dc9bdf744edddf17758ceb3deb 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 9de5cd4c3e456571c78a2aaa8cb467c0975c1588..df69290c0604895cb0911a715602bf84acb8e5ce 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 0df3fba3c0d128aab54fb431876671dc51c514fc..2df5be43c0256e24443672fd06786968da457dd2 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 bd85d172b01e4ceb2c34a2c02223f62ba2ef3664..f6c81b9469f7d2644007f8db52e63c717bbe5653 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 9013950c62493e8aacbad10624a88598c0416316..25566db88656a34aa27474a56a03afdae4afb9ee 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 28d5662e7d0d3bb47cdf59ae8843b2e5522c974c..a5f81d5319c0a97d5b7bd51fba8ee89c38db72bf 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 a0e0104deb632cc55768acc14f051a0f1a2899b4..2925e5dd3cea4985bebcf019e1392235d3aac2ad 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 9e389e61a1f49eaa1b367ef613bea7c9839d1f50..9131da9754a7fa917470f94eec53cac1c038dc10 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 6f111c3861ba37d70029e297cbb2160972bdaf1d..66db3504d009dc9675f3f493144d1bd27637465f 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 3dd58b275670a87b3a1dbb228b77bb4f3b9c110a..5010a07658e3ab7f60a80a74ab0896a747167cfe 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 7512c4872ddaaf4cf35ccab7be3c59c756067aea..b0bccef9b25cdc1266719dd3ad9fa224f216aa59 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 b044df07909c42c55e7dd31ff1a3b7129211b6f7..5420d20296411626ead591d071da7dde1e28ff4e 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 3a8867adb734bbe93491cc9244ddd4662468301d..f291b9cc18f16cbbd2ecd10db6f8f2b7ef981389 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 313aa438bf4a46ca62b6dd7c1ea3aca1ec57d4f8..a35024ade8ea8cacfde4de92096cd45d338f06ac 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 03466b46f1410847dba9021d1a916daba886eb71..2e04360d6f81b1b2397ddd3a002c4c81179e18ef 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 112ca206fe17deaab218d3d1cbcdb8c02542f124..0dd5b86b73fb3b2ff854e21cb8061db148c05f07 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 4c810fd998625ddb099b1a4490c009ff04cda215..b67870fa16e0a2b0f7c64108bab128cdf8d60c72 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 f03bb2bb8f708c4a934d8cfa4b102c3f80eb75ae..a9aba1edfa5aec63a33851fe0cfdfc3a2aeed054 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);