From 643870cda9a3a4ab78bdf019413fcc729620f1f4 Mon Sep 17 00:00:00 2001
From: winckel <winckel@eurecom.fr>
Date: Tue, 12 Nov 2013 15:32:59 +0000
Subject: [PATCH] Added an instance column.

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4370 818b1a75-f10b-46b9-bf7c-635c3b92a50f
---
 .../utils/itti_analyzer/libparser/xml_parse.c |  1 +
 .../itti_analyzer/libresolver/locate_root.c   | 10 +++
 .../itti_analyzer/libresolver/locate_root.h   |  3 +
 .../utils/itti_analyzer/libui/ui_callbacks.c  |  3 +-
 .../utils/itti_analyzer/libui/ui_tree_view.c  | 65 ++++++++++++-------
 .../utils/itti_analyzer/libui/ui_tree_view.h  |  8 ++-
 6 files changed, 64 insertions(+), 26 deletions(-)

diff --git a/common/utils/itti_analyzer/libparser/xml_parse.c b/common/utils/itti_analyzer/libparser/xml_parse.c
index f8ead59e9..400f9c36f 100644
--- a/common/utils/itti_analyzer/libparser/xml_parse.c
+++ b/common/utils/itti_analyzer/libparser/xml_parse.c
@@ -778,6 +778,7 @@ static int xml_parse_doc(xmlDocPtr doc) {
         CHECK_FCT(locate_type("MessagesIds", head, &messages_id_enum));
         CHECK_FCT(locate_type("originTaskId", head, &origin_task_id_type));
         CHECK_FCT(locate_type("destinationTaskId", head, &destination_task_id_type));
+        CHECK_FCT(locate_type("instance", head, &instance_type));
         // root->type_hr_display(root, 0);
         update_filters();
         if (dissect_file != NULL) {
diff --git a/common/utils/itti_analyzer/libresolver/locate_root.c b/common/utils/itti_analyzer/libresolver/locate_root.c
index 8a6ff9487..083d84523 100644
--- a/common/utils/itti_analyzer/libresolver/locate_root.c
+++ b/common/utils/itti_analyzer/libresolver/locate_root.c
@@ -13,6 +13,7 @@
 types_t *messages_id_enum = NULL;
 types_t *origin_task_id_type = NULL;
 types_t *destination_task_id_type = NULL;
+types_t *instance_type = NULL;
 
 int locate_root(const char *root_name, types_t *head, types_t **root_elm) {
     types_t *next_type;
@@ -114,6 +115,15 @@ char *get_destination_task_id(buffer_t *buffer) {
     return destination_task_id;
 }
 
+uint32_t get_instance(buffer_t *buffer) {
+    uint32_t  instance_value;
+
+    /* Fetch instance value */
+    buffer_fetch_bits (buffer, instance_type->offset, instance_type->child->child->child->size, &instance_value);
+
+    return instance_value;
+}
+
 char *message_id_to_string(uint32_t message_id)
 {
     return enum_type_get_name_from_value(messages_id_enum, message_id);
diff --git a/common/utils/itti_analyzer/libresolver/locate_root.h b/common/utils/itti_analyzer/libresolver/locate_root.h
index 96b489e0d..e38b6bdea 100644
--- a/common/utils/itti_analyzer/libresolver/locate_root.h
+++ b/common/utils/itti_analyzer/libresolver/locate_root.h
@@ -4,6 +4,7 @@
 extern types_t *messages_id_enum;
 extern types_t *origin_task_id_type;
 extern types_t *destination_task_id_type;
+extern types_t *instance_type;
 
 int locate_root(const char *root_name, types_t *head, types_t **root);
 
@@ -17,4 +18,6 @@ char *get_origin_task_id(buffer_t *buffer);
 
 char *get_destination_task_id(buffer_t *buffer);
 
+uint32_t get_instance(buffer_t *buffer);
+
 #endif /* LOCATE_ROOT_H_ */
diff --git a/common/utils/itti_analyzer/libui/ui_callbacks.c b/common/utils/itti_analyzer/libui/ui_callbacks.c
index 10f01fec0..0190a4077 100644
--- a/common/utils/itti_analyzer/libui/ui_callbacks.c
+++ b/common/utils/itti_analyzer/libui/ui_callbacks.c
@@ -119,7 +119,8 @@ void ui_signal_add_to_list(gpointer data, gpointer user_data)
     get_message_id (root, signal_buffer, &signal_buffer->message_id);
 
     ui_tree_view_new_signal_ind (signal_buffer->message_number, message_id_to_string (signal_buffer->message_id),
-                                 get_origin_task_id (signal_buffer), get_destination_task_id (signal_buffer), data);
+                                 get_origin_task_id (signal_buffer), get_destination_task_id (signal_buffer),
+                                 get_instance (signal_buffer), data);
 
     /* Increment number of messages */
     ui_main_data.nb_message_received++;
diff --git a/common/utils/itti_analyzer/libui/ui_tree_view.c b/common/utils/itti_analyzer/libui/ui_tree_view.c
index 610baee6d..834e1600b 100644
--- a/common/utils/itti_analyzer/libui/ui_tree_view.c
+++ b/common/utils/itti_analyzer/libui/ui_tree_view.c
@@ -18,16 +18,15 @@ typedef struct
 {
     GtkListStore *store;
     GtkTreeModelFilter *filtered;
-    guint filtered_last_msg;
-    guint filtered_msg_number;
+    uint32_t filtered_last_msg;
+    uint32_t filtered_msg_number;
 } ui_store_t;
 
 static ui_store_t ui_store;
 
 static gboolean ui_tree_filter_messages(GtkTreeModel *model, GtkTreeIter *iter, ui_store_t *store)
 {
-    char *msg_number;
-    guint number = 0;
+    uint32_t msg_number;
     char *message;
     char *origin_task;
     char *destination_task;
@@ -35,17 +34,16 @@ static gboolean ui_tree_filter_messages(GtkTreeModel *model, GtkTreeIter *iter,
 
     gtk_tree_model_get (model, iter, COL_MSG_NUM, &msg_number, COL_SIGNAL, &message, COL_FROM_TASK, &origin_task,
                         COL_TO_TASK, &destination_task, -1);
-    if (msg_number != NULL)
+    if (msg_number != 0)
     {
-        number = atoi (msg_number);
         enabled = ui_filters_message_enabled (message, origin_task, destination_task);
 
-        if ((enabled) && (ui_store.filtered_last_msg < number))
+        if ((enabled) && (ui_store.filtered_last_msg < msg_number))
         {
-            ui_store.filtered_last_msg = number;
+            ui_store.filtered_last_msg = msg_number;
             ui_store.filtered_msg_number++;
         }
-        // g_debug("%x %x %d %s %s %s %d %d", (int) model, (int) iter, number, message, origin_task, destination_task, enabled, ui_store.filtered_msg_number);
+        g_debug("%x %x %d %s %s %s %d %d", (int) model, (int) iter, msg_number, message, origin_task, destination_task, enabled, ui_store.filtered_msg_number);
     }
 
     g_free (message);
@@ -84,17 +82,32 @@ ui_tree_view_init_list(GtkWidget *list)
     g_signal_connect(G_OBJECT(column), "clicked",
                      G_CALLBACK(ui_callback_on_tree_column_header_click), (gpointer) COL_TO_TASK);
 
+    column = gtk_tree_view_column_new_with_attributes(
+        "Ins", renderer, "text", COL_INSTANCE, NULL);
+    gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);
+
     ui_store.store = gtk_list_store_new(NUM_COLS,
-                                       G_TYPE_STRING,
-                                       G_TYPE_STRING,
-                                       G_TYPE_STRING,
-                                       G_TYPE_STRING,
+                                       G_TYPE_UINT,   // COL_MSG_NUM
+                                       G_TYPE_STRING, // COL_SIGNAL
+                                       G_TYPE_STRING, // COL_FROM_TASK
+                                       G_TYPE_STRING, // COL_TO_TASK
+                                       G_TYPE_UINT,   // COL_INSTANCE
+                                       /* HACK: add id of message fields to speed-up filtering
+                                        */
+                                       G_TYPE_UINT, // COL_SIGNAL_ID
+                                       G_TYPE_UINT, // COL_FROM_TASK_ID
+                                       G_TYPE_UINT, // COL_TO_TASK_ID
                                        /* HACK: add a reference to the buffer here
                                         * to avoid maintining multiple lists.
                                         * The reference is not displayed
                                         */
                                        G_TYPE_POINTER);
 
+    if(ui_store.store == NULL)
+    {
+        g_error("gtk_list_store_new failed");
+    }
+
     ui_store.filtered = GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (GTK_TREE_MODEL (ui_store.store), NULL));
     gtk_tree_model_filter_set_visible_func (ui_store.filtered,
                                             (GtkTreeModelFilterVisibleFunc) ui_tree_filter_messages,
@@ -105,20 +118,24 @@ ui_tree_view_init_list(GtkWidget *list)
     gtk_tree_view_columns_autosize(GTK_TREE_VIEW(list));
 }
 
-static void ui_tree_view_add_to_list(GtkWidget *list, const gchar *message_number,
+static void ui_tree_view_add_to_list(GtkWidget *list, const uint32_t message_number,
                         const gchar *signal_name, const char *origin_task,
-                        const char *to_task, gpointer buffer)
+                        const char *to_task, uint32_t instance, gpointer buffer)
 {
     GtkTreeIter iter;
 
     gtk_list_store_append(ui_store.store, &iter);
     gtk_list_store_set(ui_store.store, &iter,
                        /* Columns */
-                       COL_MSG_NUM    , message_number,
-                       COL_SIGNAL     , signal_name,
-                       COL_FROM_TASK  , origin_task,
-                       COL_TO_TASK    , to_task,
-                       COL_BUFFER     , buffer,
+                       COL_MSG_NUM      , message_number,
+                       COL_SIGNAL       , signal_name,
+                       COL_FROM_TASK    , origin_task,
+                       COL_TO_TASK      , to_task,
+                       COL_INSTANCE     , instance,
+                       COL_SIGNAL_ID    , 0,
+                       COL_FROM_TASK_ID , 0,
+                       COL_TO_TASK_ID   , 0,
+                       COL_BUFFER       , buffer,
                        /* End of columns */
                        -1);
 }
@@ -162,7 +179,7 @@ int ui_tree_view_create(GtkWidget *window, GtkWidget *vbox)
     ui_tree_view_init_list(ui_main_data.signalslist);
     gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(ui_main_data.signalslist), TRUE);
 
-    gtk_widget_set_size_request(GTK_WIDGET(scrolled_window), 500, -1);
+    gtk_widget_set_size_request(GTK_WIDGET(scrolled_window), 530, -1);
     gtk_box_pack_start(GTK_BOX(hbox), scrolled_window, FALSE, FALSE, 0);
     ui_main_data.text_view = ui_signal_dissect_new(hbox);
 
@@ -178,14 +195,14 @@ int ui_tree_view_create(GtkWidget *window, GtkWidget *vbox)
 }
 
 int ui_tree_view_new_signal_ind(const uint32_t message_number, const char *signal_name,
-                                const char *origin_task, const char *to_task, gpointer buffer)
+                                const char *origin_task, const char *to_task, uint32_t instance, gpointer buffer)
 {
     gchar message_number_str[11];
 
     sprintf(message_number_str, "%u", message_number);
 
-    ui_tree_view_add_to_list(ui_main_data.signalslist, message_number_str, signal_name,
-                             origin_task, to_task, (buffer_t *)buffer);
+    ui_tree_view_add_to_list(ui_main_data.signalslist, message_number, signal_name,
+                             origin_task, to_task, instance, (buffer_t *)buffer);
 
     return RC_OK;
 }
diff --git a/common/utils/itti_analyzer/libui/ui_tree_view.h b/common/utils/itti_analyzer/libui/ui_tree_view.h
index 8c5ce9c16..532ee178f 100644
--- a/common/utils/itti_analyzer/libui/ui_tree_view.h
+++ b/common/utils/itti_analyzer/libui/ui_tree_view.h
@@ -7,6 +7,12 @@ typedef enum
     COL_SIGNAL,
     COL_FROM_TASK,
     COL_TO_TASK,
+    COL_INSTANCE,
+
+    COL_SIGNAL_ID,
+    COL_FROM_TASK_ID,
+    COL_TO_TASK_ID,
+
     COL_BUFFER,
     NUM_COLS
 } col_type_e;
@@ -14,7 +20,7 @@ typedef enum
 int ui_tree_view_create(GtkWidget *window, GtkWidget *vbox);
 
 int ui_tree_view_new_signal_ind(const uint32_t message_number, const char *signal_name,
-                                const char *origin_task, const char *to_task, gpointer buffer);
+                                const char *origin_task, const char *to_task, uint32_t instance, gpointer buffer);
 
 void ui_tree_view_destroy_list(GtkWidget *list);
 
-- 
GitLab