Handle NAL-unit start code correctly.
[metze/wireshark/wip.git] / gtk / mtp3_summary.c
index 23909bf93eab51cda4b6f3bbe86cffaf30278096..7d90594ce865f031753e3e8576363b01c9f415a1 100644 (file)
 # include "config.h"
 #endif
 
-#include <gtk/gtk.h>
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
 #include <string.h>
 
-#include <wtap.h>
+#include <gtk/gtk.h>
 
 #include "epan/packet_info.h"
 #include "epan/epan.h"
 #include "epan/value_string.h"
-#include "../stat_menu.h"
-#include "gui_stat_menu.h"
-#include "globals.h"
-#include "file.h"
-#include "summary.h"
-#include "image/clist_ascend.xpm"
-#include "image/clist_descend.xpm"
-#include "dlg_utils.h"
-#include "gui_utils.h"
-#include "compat_macros.h"
 #include <epan/tap.h>
-
 #include <epan/dissectors/packet-mtp3.h>
-#include "mtp3_stat.h"
 
-#define SUM_STR_MAX 1024
+#include "../stat_menu.h"
+#include "../globals.h"
+#include "../file.h"
+#include "../summary.h"
 
-typedef struct column_arrows {
-    GtkWidget          *table;
-    GtkWidget          *ascend_pm;
-    GtkWidget          *descend_pm;
-} column_arrows;
+#include "gtk/gui_stat_menu.h"
+#include "gtk/dlg_utils.h"
+#include "gtk/gui_utils.h"
+#include "gtk/mtp3_stat.h"
+
+#define SUM_STR_MAX 1024
 
-#define        MTP3_SUM_INIT_TABLE_NUM_COLUMNS         6
 
 typedef struct _my_columns_t {
     guint32            value;
@@ -70,115 +63,157 @@ typedef struct _my_columns_t {
     GtkJustification   just;
 } my_columns_t;
 
-static my_columns_t columns[MTP3_SUM_INIT_TABLE_NUM_COLUMNS] = {
-    { 110,     "SI",                   GTK_JUSTIFY_LEFT },
-    { 100,     "Num MSUs",             GTK_JUSTIFY_RIGHT },
-    { 100,     "MSUs/sec",             GTK_JUSTIFY_RIGHT },
-    { 100,     "Num Bytes",            GTK_JUSTIFY_RIGHT },
-    { 100,     "Bytes/MSU",            GTK_JUSTIFY_RIGHT },
-    { 100,     "Bytes/sec",            GTK_JUSTIFY_RIGHT }
-};
-
-
-static void
-add_string_to_box(gchar *str, GtkWidget *box)
+enum
 {
-  GtkWidget *lb;
-  lb = gtk_label_new(str);
-  gtk_misc_set_alignment(GTK_MISC(lb), 0.0, 0.5);
-  gtk_box_pack_start(GTK_BOX(box), lb,FALSE,FALSE, 0);
-  gtk_widget_show(lb);
-}
-
+   SI_COLUMN,
+   NUM_MSUS_COLUMN,
+   NUM_MSUS_SEC_COLUMN,
+   NUM_BYTES_COLUMN,
+   NUM_BYTES_MSU_COLUMN,
+   NUM_BYTES_SEC_COLUMN,
+   N_COLUMN /* The number of columns */
+};
 
-static void
-mtp3_sum_gtk_click_column_cb(
-    GtkCList           *clist,
-    gint               column,
-    gpointer           data)
+/* Create list */
+static
+GtkWidget* create_list()
 {
-    column_arrows      *col_arrows = (column_arrows *) data;
-    int                        i;
 
+    GtkListStore *list_store;
+    GtkWidget *list;
+    GtkTreeViewColumn *column;
+    GtkCellRenderer *renderer;
+    GtkTreeSortable *sortable;
+       GtkTreeView     *list_view;
+       GtkTreeSelection  *selection;
+
+       /* Create the store */
+    list_store = gtk_list_store_new(N_COLUMN,  /* Total number of columns XXX*/
+                               G_TYPE_STRING,  /* SI                           */
+                               G_TYPE_INT,             /* Num MSUs                     */
+                               G_TYPE_STRING,  /* MSUs/sec                     */
+                               G_TYPE_INT,             /* Num Bytes            */
+                               G_TYPE_STRING,  /* Bytes/MSU            */
+                               G_TYPE_STRING); /* Bytes/sec            */
+
+    /* Create a view */
+    list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
+
+       list_view = GTK_TREE_VIEW(list);
+       sortable = GTK_TREE_SORTABLE(list_store);
+
+#if GTK_CHECK_VERSION(2,6,0)
+       /* Speed up the list display */
+       gtk_tree_view_set_fixed_height_mode(list_view, TRUE);
+#endif
 
-    gtk_clist_freeze(clist);
+    /* Setup the sortable columns */
+    gtk_tree_sortable_set_sort_column_id(sortable, SI_COLUMN, GTK_SORT_ASCENDING);
+    gtk_tree_view_set_headers_clickable(list_view, FALSE);
 
-    for (i=0; i < MTP3_SUM_INIT_TABLE_NUM_COLUMNS; i++)
-    {
-       gtk_widget_hide(col_arrows[i].ascend_pm);
-       gtk_widget_hide(col_arrows[i].descend_pm);
-    }
+    /* The view now holds a reference.  We can get rid of our own reference */
+    g_object_unref (G_OBJECT (list_store));
 
-    if (column == clist->sort_column)
-    {
-       if (clist->sort_type == GTK_SORT_ASCENDING)
-       {
-           clist->sort_type = GTK_SORT_DESCENDING;
-           gtk_widget_show(col_arrows[column].descend_pm);
-       }
-       else
-       {
-           clist->sort_type = GTK_SORT_ASCENDING;
-           gtk_widget_show(col_arrows[column].ascend_pm);
-       }
-    }
-    else
-    {
-       /*
-        * Columns 0 sorted in descending order by default
+    /* 
+        * Create the first column packet, associating the "text" attribute of the
+     * cell_renderer to the first column of the model 
         */
-       if (column == 0)
-       {
-           clist->sort_type = GTK_SORT_ASCENDING;
-           gtk_widget_show(col_arrows[column].ascend_pm);
-       }
-       else
-       {
-           clist->sort_type = GTK_SORT_DESCENDING;
-           gtk_widget_show(col_arrows[column].descend_pm);
-       }
-
-       gtk_clist_set_sort_column(clist, column);
-    }
+       /* 1:st column */
+       renderer = gtk_cell_renderer_text_new ();
+    column = gtk_tree_view_column_new_with_attributes ("SI", renderer, 
+               "text", SI_COLUMN, 
+               NULL);
+
+       gtk_tree_view_column_set_sort_column_id(column, SI_COLUMN);
+    gtk_tree_view_column_set_resizable(column, TRUE);
+    gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+    gtk_tree_view_column_set_min_width(column, 110);
+
+       /* Add the column to the view. */
+    gtk_tree_view_append_column (list_view, column);
+
+    /* 2:nd column... */
+    renderer = gtk_cell_renderer_text_new ();
+    column = gtk_tree_view_column_new_with_attributes ("Num MSUs", renderer, 
+               "text", NUM_MSUS_COLUMN,
+               NULL);
+    gtk_tree_view_column_set_sort_column_id(column, NUM_MSUS_COLUMN);
+    gtk_tree_view_column_set_resizable(column, TRUE);
+    gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+    gtk_tree_view_column_set_min_width(column, 100);
+    gtk_tree_view_append_column (list_view, column);
+
+       /* 3:d column... */
+    renderer = gtk_cell_renderer_text_new ();
+    column = gtk_tree_view_column_new_with_attributes ("MSUs/sec", renderer, 
+               "text", NUM_MSUS_SEC_COLUMN,
+               NULL);
+    gtk_tree_view_column_set_sort_column_id(column, NUM_MSUS_SEC_COLUMN);
+    gtk_tree_view_column_set_resizable(column, TRUE);
+    gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+    gtk_tree_view_column_set_min_width(column, 100);
+    gtk_tree_view_append_column (list_view, column);
+
+       /* 4:d column... */
+    renderer = gtk_cell_renderer_text_new ();
+    column = gtk_tree_view_column_new_with_attributes ("Num Bytes", renderer, 
+               "text", NUM_BYTES_COLUMN,
+               NULL);
+    gtk_tree_view_column_set_sort_column_id(column, NUM_BYTES_COLUMN);
+    gtk_tree_view_column_set_resizable(column, TRUE);
+    gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+    gtk_tree_view_column_set_min_width(column, 100);
+    gtk_tree_view_append_column (list_view, column);
+
+    /* 5:th column... */
+    renderer = gtk_cell_renderer_text_new ();
+       column = gtk_tree_view_column_new_with_attributes ("Bytes/MSU", renderer, 
+               "text", NUM_BYTES_MSU_COLUMN, 
+               NULL);
+       
 
-    gtk_clist_thaw(clist);
-    gtk_clist_sort(clist);
-}
+    gtk_tree_view_column_set_sort_column_id(column, NUM_BYTES_MSU_COLUMN);
+    gtk_tree_view_column_set_resizable(column, TRUE);
+    gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+    gtk_tree_view_column_set_min_width(column, 100);
+    gtk_tree_view_append_column (list_view, column);
 
+    /* 6:th column... */
+    renderer = gtk_cell_renderer_text_new ();
+       column = gtk_tree_view_column_new_with_attributes ("Bytes/sec", renderer, 
+               "text", NUM_BYTES_SEC_COLUMN, 
+               NULL);
 
-static gint
-mtp3_sum_gtk_sort_column(
-    GtkCList           *clist,
-    gconstpointer      ptr1,
-    gconstpointer      ptr2)
-{
-    const GtkCListRow  *row1 = ptr1;
-    const GtkCListRow  *row2 = ptr2;
-    char               *text1 = NULL;
-    char               *text2 = NULL;
-    int                        i1, i2;
+    gtk_tree_view_column_set_sort_column_id(column, NUM_BYTES_SEC_COLUMN);
+    gtk_tree_view_column_set_resizable(column, TRUE);
+    gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+    gtk_tree_view_column_set_min_width(column, 100);
+    gtk_tree_view_append_column (list_view, column);
 
-    text1 = GTK_CELL_TEXT(row1->cell[clist->sort_column])->text;
-    text2 = GTK_CELL_TEXT(row2->cell[clist->sort_column])->text;
+       /* Now enable the sorting of each column */
+    gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(list_view), TRUE);
+    gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(list_view), TRUE);
 
-    switch (clist->sort_column)
-    {
-    case 0:
-       /* text columns */
-       return(strcmp(text1, text2));
-
-    default:
-       /* number columns */
-       i1 = strtol(text1, NULL, 0);
-       i2 = strtol(text2, NULL, 0);
-       return(i1 - i2);
-    }
+       /* Setup the selection handler */
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
+       gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
 
-    g_assert_not_reached();
+       return list;
 
-    return(0);
 }
 
+static void
+add_string_to_box(gchar *str, GtkWidget *box)
+{
+  GtkWidget *lb;
+  lb = gtk_label_new(str);
+  gtk_misc_set_alignment(GTK_MISC(lb), 0.0, 0.5);
+  gtk_box_pack_start(GTK_BOX(box), lb,FALSE,FALSE, 0);
+  gtk_widget_show(lb);
+}
+
+
+
 static void
 mtp3_sum_draw(
     GtkWidget          *table,
@@ -186,47 +221,56 @@ mtp3_sum_draw(
     int                        *tot_num_msus_p,
     double             *tot_num_bytes_p)
 {
-    const char         *entries[MTP3_SUM_INIT_TABLE_NUM_COLUMNS];
+    char               *entries[N_COLUMN];
     int                        i, j;
     int                        num_msus;
-    double             num_bytes;
+    int                        num_bytes;
+    GtkListStore *list_store = NULL;
+    GtkTreeIter  iter;
 
     *tot_num_msus_p = 0;
     *tot_num_bytes_p = 0;
 
+    list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (table))); /* Get store */
+
     for (i=0; i < MTP3_NUM_SI_CODE; i++)
     {
-       entries[0] = g_strdup(mtp3_service_indicator_code_short_vals[i].strptr);
-
-       j = 0;
-       num_msus = 0;
-       num_bytes = 0;
-
-       while (j < mtp3_num_used)
-       {
-           num_msus += mtp3_stat[j].si_code[i].num_msus;
-           num_bytes += mtp3_stat[j].si_code[i].size;
-
-           j++;
-       }
-
-       *tot_num_msus_p += num_msus;
-       *tot_num_bytes_p += num_bytes;
-
-       entries[1] = g_strdup_printf("%u", num_msus);
-
-       entries[2] = (seconds) ? g_strdup_printf("%.2f", num_msus/seconds) : "N/A";
-       
-       entries[3] = g_strdup_printf("%.0f", num_bytes);
-
-       entries[4] = (num_msus) ? g_strdup_printf("%.2f", num_bytes/num_msus) : "N/A";
-
-       entries[5] = (seconds) ? g_strdup_printf("%.2f", num_bytes/seconds) : "N/A";
-
-       gtk_clist_insert(GTK_CLIST(table), i, (gchar **) entries);
+        j = 0;
+        num_msus = 0;
+        num_bytes = 0;
+
+        while (j < mtp3_num_used)
+        {
+            num_msus += mtp3_stat[j].si_code[i].num_msus;
+            num_bytes += mtp3_stat[j].si_code[i].size;
+
+            j++;
+        }
+
+        *tot_num_msus_p += num_msus;
+        *tot_num_bytes_p += num_bytes;
+
+        /*
+         * XXX - when do these get freed?
+         */
+        entries[2] = (seconds) ? g_strdup_printf("%.2f", (double)num_msus/seconds) : g_strdup("N/A");
+        entries[4] = (num_msus) ? g_strdup_printf("%.2f", (double)num_bytes/num_msus) : g_strdup("N/A");
+        entries[5] = (seconds) ? g_strdup_printf("%.2f", (double)num_bytes/seconds) : g_strdup("N/A");
+
+#if GTK_CHECK_VERSION(2,6,0)
+        gtk_list_store_insert_with_values( list_store , &iter, G_MAXINT,
+#else
+        gtk_list_store_append  (list_store, &iter);
+        gtk_list_store_set  (list_store, &iter,
+#endif
+           SI_COLUMN, mtp3_service_indicator_code_short_vals[i].strptr,
+           NUM_MSUS_COLUMN, num_msus,
+           NUM_MSUS_SEC_COLUMN, entries[2],
+           NUM_BYTES_COLUMN, num_bytes,
+           NUM_BYTES_MSU_COLUMN, entries[4],
+           NUM_BYTES_SEC_COLUMN, entries[5],
+           -1);
     }
-
-    gtk_clist_sort(GTK_CLIST(table));
 }
 
 
@@ -238,16 +282,14 @@ mtp3_sum_gtk_sum_cb(GtkWidget *w _U_, gpointer d _U_)
                 *main_vb, *file_fr, *data_fr, *file_box,
                *data_box, *bbox, *close_bt,
                *tot_fr, *tot_box,
-               *table, *column_lb, *table_fr;
-  column_arrows        *col_arrows;
+               *table, *table_fr;
 
   gchar                        string_buff[SUM_STR_MAX];
   const char *  file_type;
   double               seconds;
   int                  tot_num_msus;
   double               tot_num_bytes;
-  int                  i;
-
+  
   /* initialize the tally */
   summary_fill_in(&cfile, &summary);
 
@@ -258,7 +300,7 @@ mtp3_sum_gtk_sum_cb(GtkWidget *w _U_, gpointer d _U_)
 
   /* Container for each row of widgets */
   main_vb = gtk_vbox_new(FALSE, 3);
-  gtk_container_border_width(GTK_CONTAINER(main_vb), 5);
+  gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5);
   gtk_container_add(GTK_CONTAINER(sum_open_w), main_vb);
   gtk_widget_show(main_vb);
 
@@ -276,11 +318,11 @@ mtp3_sum_gtk_sum_cb(GtkWidget *w _U_, gpointer d _U_)
   add_string_to_box(string_buff, file_box);
 
   /* length */
-  g_snprintf(string_buff, SUM_STR_MAX, "Length: %lld", (long long) summary.file_length);
+  g_snprintf(string_buff, SUM_STR_MAX, "Length: %" G_GINT64_MODIFIER "d", summary.file_length);
   add_string_to_box(string_buff, file_box);
 
   /* format */
-  file_type = wtap_file_type_string(summary.encap_type);
+  file_type = wtap_file_type_string(summary.file_type);
   g_snprintf(string_buff, SUM_STR_MAX, "Format: %s", (file_type ? file_type : "N/A"));
   add_string_to_box(string_buff, file_box);
 
@@ -315,62 +357,11 @@ mtp3_sum_gtk_sum_cb(GtkWidget *w _U_, gpointer d _U_)
   gtk_container_add(GTK_CONTAINER(main_vb), table_fr);
   gtk_widget_show(table_fr);
 
-  table = gtk_clist_new(MTP3_SUM_INIT_TABLE_NUM_COLUMNS);
+   table = create_list();
+  
   gtk_container_add(GTK_CONTAINER(table_fr), table);
   gtk_widget_show(table);
 
-  col_arrows =
-      (column_arrows *) g_malloc(sizeof(column_arrows) * MTP3_SUM_INIT_TABLE_NUM_COLUMNS);
-
-  for (i = 0; i < MTP3_SUM_INIT_TABLE_NUM_COLUMNS; i++)
-  {
-      col_arrows[i].table = gtk_table_new(2, 2, FALSE);
-
-      gtk_table_set_col_spacings(GTK_TABLE(col_arrows[i].table), 5);
-
-      column_lb = gtk_label_new(columns[i].strptr);
-
-      gtk_table_attach(GTK_TABLE(col_arrows[i].table), column_lb,
-         0, 1, 0, 2, GTK_SHRINK, GTK_SHRINK, 0, 0);
-
-      gtk_widget_show(column_lb);
-
-      col_arrows[i].ascend_pm = xpm_to_widget(clist_ascend_xpm);
-
-      gtk_table_attach(GTK_TABLE(col_arrows[i].table), col_arrows[i].ascend_pm,
-         1, 2, 1, 2, GTK_SHRINK, GTK_SHRINK, 0, 0);
-
-      col_arrows[i].descend_pm = xpm_to_widget(clist_descend_xpm);
-
-      gtk_table_attach(GTK_TABLE(col_arrows[i].table), col_arrows[i].descend_pm,
-         1, 2, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
-
-      if (i == 0)
-      {
-         /* default column sorting */
-         gtk_widget_show(col_arrows[i].ascend_pm);
-      }
-
-      gtk_clist_set_column_justification(GTK_CLIST(table), i, columns[i].just);
-
-      gtk_clist_set_column_widget(GTK_CLIST(table), i, col_arrows[i].table);
-      gtk_widget_show(col_arrows[i].table);
-  }
-  gtk_clist_column_titles_show(GTK_CLIST(table));
-
-  gtk_clist_set_compare_func(GTK_CLIST(table), mtp3_sum_gtk_sort_column);
-  gtk_clist_set_sort_column(GTK_CLIST(table), 0);
-  gtk_clist_set_sort_type(GTK_CLIST(table), GTK_SORT_ASCENDING);
-
-  for (i = 0; i < MTP3_SUM_INIT_TABLE_NUM_COLUMNS; i++)
-  {
-      gtk_clist_set_column_width(GTK_CLIST(table), i, columns[i].value);
-  }
-
-  gtk_clist_set_shadow_type(GTK_CLIST(table), GTK_SHADOW_IN);
-  gtk_clist_column_titles_show(GTK_CLIST(table));
-
-  SIGNAL_CONNECT(table, "click-column", mtp3_sum_gtk_click_column_cb, col_arrows);
 
   mtp3_sum_draw(table, seconds, &tot_num_msus, &tot_num_bytes);
 
@@ -418,10 +409,10 @@ mtp3_sum_gtk_sum_cb(GtkWidget *w _U_, gpointer d _U_)
   gtk_container_add(GTK_CONTAINER(main_vb), bbox);
   gtk_widget_show(bbox);
 
-  close_bt = OBJECT_GET_DATA(bbox, GTK_STOCK_CLOSE);
+  close_bt = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
   window_set_cancel_button(sum_open_w, close_bt, window_cancel_button_cb);
 
-  SIGNAL_CONNECT(sum_open_w, "delete_event", window_delete_event_cb, NULL);
+  g_signal_connect(sum_open_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
 
   gtk_widget_show_all(sum_open_w);
   window_present(sum_open_w);