From 78506604cff5d8bb1cff26459b75917a16a24701 Mon Sep 17 00:00:00 2001
From: winckel <winckel@eurecom.fr>
Date: Thu, 7 Nov 2013 08:37:41 +0000
Subject: [PATCH] Moved xmlCleanupParser into main function, it is not safe to
 call it in threads. Added messages for XML filters parsing when no
 definitions are found in the file. Saved file names when opening or saving
 files.

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4336 818b1a75-f10b-46b9-bf7c-635c3b92a50f
---
 common/utils/itti_analyzer/itti_analyzer.c    |  8 ++-
 .../utils/itti_analyzer/libparser/xml_parse.c |  5 --
 common/utils/itti_analyzer/libui/ui_filters.c | 27 +++++----
 .../itti_analyzer/libui/ui_main_screen.c      | 12 +++-
 .../itti_analyzer/libui/ui_notifications.c    | 60 +++++++++++++++----
 5 files changed, 84 insertions(+), 28 deletions(-)

diff --git a/common/utils/itti_analyzer/itti_analyzer.c b/common/utils/itti_analyzer/itti_analyzer.c
index 9f2d7f20bb..94f5c1c191 100644
--- a/common/utils/itti_analyzer/itti_analyzer.c
+++ b/common/utils/itti_analyzer/itti_analyzer.c
@@ -82,7 +82,8 @@ int main(int argc, char *argv[])
      * between the version it was compiled for and the actual shared
      * library used.
      */
-    LIBXML_TEST_VERSION
+    LIBXML_TEST_VERSION;
+    xmlInitParser();
 
     /* Initialize the widget set */
     gtk_init(&argc, &argv);
@@ -94,5 +95,10 @@ int main(int argc, char *argv[])
     /* Enter the main event loop, and wait for user interaction */
     gtk_main ();
 
+    /* Free the global variables that may
+     * have been allocated by the parser.
+     */
+    xmlCleanupParser ();
+
     return ret;
 }
diff --git a/common/utils/itti_analyzer/libparser/xml_parse.c b/common/utils/itti_analyzer/libparser/xml_parse.c
index a810c1f1aa..20bc0dd912 100644
--- a/common/utils/itti_analyzer/libparser/xml_parse.c
+++ b/common/utils/itti_analyzer/libparser/xml_parse.c
@@ -752,11 +752,6 @@ static int xml_parse_doc(xmlDocPtr doc) {
     /* Free the document */
     xmlFreeDoc(doc);
 
-    /* Free the global variables that may
-     * have been allocated by the parser.
-     */
-    xmlCleanupParser();
-
     if (ret == RC_OK) {
         resolve_typedefs (&head);
         resolve_pointer_type (&head);
diff --git a/common/utils/itti_analyzer/libui/ui_filters.c b/common/utils/itti_analyzer/libui/ui_filters.c
index 649631a8a3..5fe994b83a 100644
--- a/common/utils/itti_analyzer/libui/ui_filters.c
+++ b/common/utils/itti_analyzer/libui/ui_filters.c
@@ -214,7 +214,7 @@ static int xml_parse_filters(xmlDocPtr doc)
     xmlNode *filter_node = NULL;
     xmlNode *cur_node = NULL;
     ui_filter_e filter;
-    int ret = RC_OK;
+    int ret = RC_FAIL;
 
     /* Get the root element node */
     root_element = xmlDocGetRootElement (doc);
@@ -222,7 +222,7 @@ static int xml_parse_filters(xmlDocPtr doc)
     if (root_element != NULL)
     {
         /* Search for the start of filters definition */
-        for (cur_node = root_element; (strcmp ((char *) cur_node->name, "filters") != 0) && (cur_node != NULL);
+        for (cur_node = root_element; (cur_node != NULL) && (strcmp ((char *) cur_node->name, "filters") != 0);
                 cur_node = cur_node->next)
             ;
 
@@ -265,6 +265,7 @@ static int xml_parse_filters(xmlDocPtr doc)
                                         cur_node->properties->children->content[0] == '0' ?
                                                 ENTRY_ENABLED_FALSE : ENTRY_ENABLED_TRUE);
 
+                                ret = RC_OK;
                                 cur_node = cur_node->next;
                             }
                         }
@@ -281,12 +282,7 @@ static int xml_parse_filters(xmlDocPtr doc)
     /* Free the document */
     xmlFreeDoc (doc);
 
-    /* Free the global variables that may
-     * have been allocated by the parser.
-     */
-    xmlCleanupParser ();
-
-    g_message("Parsed filters definition");
+    g_message("Parsed XML filters definition");
 
     return ret;
 }
@@ -294,6 +290,7 @@ static int xml_parse_filters(xmlDocPtr doc)
 int ui_filters_read(const char *file_name)
 {
     xmlDocPtr doc; /* the resulting document tree */
+    int ret;
 
     if (file_name == NULL)
     {
@@ -310,7 +307,16 @@ int ui_filters_read(const char *file_name)
         return RC_FAIL;
     }
 
-    return xml_parse_filters (doc);
+    ret = xml_parse_filters (doc);
+
+    if (ret != RC_OK)
+    {
+        g_warning("Found no filter definition in \"%s\"", file_name);
+        ui_notification_dialog (DIALOG_WARNING, "Found no filter definition in \"%s\"", file_name);
+        return RC_FAIL;
+    }
+
+    return ret;
 }
 
 static void write_filter(FILE *filter_file, ui_filter_t *filter)
@@ -343,7 +349,8 @@ int ui_filters_file_write(const char *file_name)
         return RC_FAIL;
     }
 
-    fprintf (filter_file, "<filters>\n");
+    fprintf (filter_file, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+             "<filters>\n");
 
     write_filter (filter_file, &ui_filters.messages);
     write_filter (filter_file, &ui_filters.origin_tasks);
diff --git a/common/utils/itti_analyzer/libui/ui_main_screen.c b/common/utils/itti_analyzer/libui/ui_main_screen.c
index 63e3498e9c..46721db1e3 100644
--- a/common/utils/itti_analyzer/libui/ui_main_screen.c
+++ b/common/utils/itti_analyzer/libui/ui_main_screen.c
@@ -42,7 +42,11 @@ static void ui_gtk_parse_arg(int argc, char *argv[])
         switch (c)
         {
             case 'f':
-                ui_main_data.filters_file_name = optarg;
+                ui_main_data.filters_file_name = malloc (strlen (optarg) + 1);
+                if (ui_main_data.filters_file_name != NULL)
+                {
+                    strcpy (ui_main_data.filters_file_name, optarg);
+                }
                 break;
 
             case 'h':
@@ -55,7 +59,11 @@ static void ui_gtk_parse_arg(int argc, char *argv[])
                 break;
 
             case 'm':
-                ui_main_data.messages_file_name = optarg;
+                ui_main_data.messages_file_name = malloc (strlen (optarg) + 1);
+                if (ui_main_data.messages_file_name != NULL)
+                {
+                    strcpy (ui_main_data.messages_file_name, optarg);
+                }
                 break;
 
             case 'p':
diff --git a/common/utils/itti_analyzer/libui/ui_notifications.c b/common/utils/itti_analyzer/libui/ui_notifications.c
index 85b052868b..1e90061844 100644
--- a/common/utils/itti_analyzer/libui/ui_notifications.c
+++ b/common/utils/itti_analyzer/libui/ui_notifications.c
@@ -191,7 +191,19 @@ int ui_messages_open_file_chooser(void)
     if (accept)
     {
         result = ui_messages_read (filename);
-        g_free (filename);
+        if (result == RC_OK)
+        {
+            /* Update messages file name for future use */
+            if (ui_main_data.messages_file_name != NULL)
+            {
+                g_free (ui_main_data.messages_file_name);
+            }
+            ui_main_data.messages_file_name = filename;
+        }
+        else
+        {
+            g_free (filename);
+        }
     }
 
     return result;
@@ -219,7 +231,19 @@ int ui_filters_open_file_chooser(void)
     if (accept)
     {
         result = ui_filters_read(filename);
-        g_free (filename);
+        if (result == RC_OK)
+        {
+            /* Update filters file name for future use */
+            if (ui_main_data.filters_file_name != NULL)
+            {
+                g_free (ui_main_data.filters_file_name);
+            }
+            ui_main_data.filters_file_name = filename;
+        }
+        else
+        {
+            g_free (filename);
+        }
     }
 
     return result;
@@ -231,15 +255,19 @@ int ui_filters_save_file_chooser(void)
     int result = RC_OK;
 
     filechooser = gtk_file_chooser_dialog_new ("Save file", GTK_WINDOW (ui_main_data.window),
-                                               GTK_FILE_CHOOSER_ACTION_SAVE,
-                                               GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                               GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
-                                               NULL);
+                                               GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                               GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
 
     gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (filechooser), TRUE);
 
-    //gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (filechooser), "filters.xml");
-    gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (filechooser), "./filters.xml");
+    if (ui_main_data.filters_file_name != NULL)
+    {
+        gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (filechooser), ui_main_data.filters_file_name);
+    }
+    else
+    {
+        gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (filechooser), "filters.xml");
+    }
 
     /* Process the response */
     if (gtk_dialog_run (GTK_DIALOG (filechooser)) == GTK_RESPONSE_ACCEPT)
@@ -247,8 +275,20 @@ int ui_filters_save_file_chooser(void)
         char *filename;
 
         filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filechooser));
-        result = ui_filters_file_write(filename);
-        g_free (filename);
+        result = ui_filters_file_write (filename);
+        if (result == RC_OK)
+        {
+            /* Update filters file name for future use */
+            if (ui_main_data.filters_file_name != NULL)
+            {
+                g_free (ui_main_data.filters_file_name);
+            }
+            ui_main_data.filters_file_name = filename;
+        }
+        else
+        {
+            g_free (filename);
+        }
     }
     gtk_widget_destroy (filechooser);
 
-- 
GitLab