Fix bug #7347: "Resize All Columns" fails in Time Column
authorJakub Zawadzki <darkjames-ws@darkjames.pl>
Wed, 25 Jul 2012 12:52:47 +0000 (12:52 -0000)
committerJakub Zawadzki <darkjames-ws@darkjames.pl>
Wed, 25 Jul 2012 12:52:47 +0000 (12:52 -0000)
If column is based on frame data packet_list_get_widest_column_string()
was constructing his own frame_data with biggest *value* for given column
(which might be not the longest string) and later fill column for it.

Which generally should work (time precision is fixed),
but in r41185 to lot col_*() function was added check if fd->flags.has_ts is set.
packet_list_get_widest_column_string() was passing frame_data with flags.has_ts unset.

To make maintaince easier, instead of fixing the problem with flags.has_ts,
generate column buffer for each frame, and find the one which has longest string.

svn path=/trunk/; revision=43991

ui/gtk/packet_list_store.c

index 3bb86b33a26de11646b51a2dbf8364343abe0b21..6867b6b4d7a31f6c5eaf515a0c253358732d8444 100644 (file)
@@ -1246,94 +1246,29 @@ packet_list_get_widest_column_string(PacketList *packet_list, gint col)
                PacketListRecord *record;
                guint vis_idx;
 
-               frame_data fdata;
-               memset (&fdata, 0, sizeof fdata);
-
-               nstime_set_zero(&fdata.abs_ts);
-               nstime_set_zero(&fdata.rel_ts);
-               nstime_set_zero(&fdata.del_cap_ts);
-               nstime_set_zero(&fdata.del_dis_ts);
+               guint widest_packet = 0;
+               gint widest_column_len = -1;
 
                for(vis_idx = 0; vis_idx < PACKET_LIST_RECORD_COUNT(packet_list->visible_rows); ++vis_idx) {
-                       record = PACKET_LIST_RECORD_GET(packet_list->visible_rows, vis_idx);
-                       switch (cfile.cinfo.col_fmt[col]) {
+                       gint column_len;
 
-                       case COL_NUMBER:
-                               if (record->fdata->num > fdata.num)
-                                       fdata.num = record->fdata->num;
-                               break;
-                       case COL_PACKET_LENGTH:
-                               if (record->fdata->pkt_len > fdata.pkt_len)
-                                       fdata.pkt_len = record->fdata->pkt_len;
-                               break;
-                       case COL_CUMULATIVE_BYTES:
-                               if (record->fdata->cum_bytes > fdata.cum_bytes)
-                                       fdata.cum_bytes = record->fdata->cum_bytes;
-                               break;
-                       case COL_ABS_TIME:
-                       case COL_ABS_DATE_TIME:
-                       case COL_UTC_TIME:
-                       case COL_UTC_DATE_TIME:
-                               if (nstime_cmp(&record->fdata->abs_ts, &fdata.abs_ts) > 0)
-                                       fdata.abs_ts = record->fdata->abs_ts;
-                               break;
-                       case COL_REL_TIME:
-                               if (nstime_cmp(&record->fdata->rel_ts, &fdata.rel_ts) > 0)
-                                       fdata.rel_ts = record->fdata->rel_ts;
-                               break;
-                       case COL_DELTA_TIME:
-                               if (nstime_cmp(&record->fdata->del_cap_ts, &fdata.del_cap_ts) > 0)
-                                       fdata.del_cap_ts = record->fdata->del_cap_ts;
-                               break;
-                       case COL_DELTA_TIME_DIS:
-                               if (nstime_cmp(&record->fdata->del_dis_ts, &fdata.del_dis_ts) > 0)
-                                       fdata.del_dis_ts = record->fdata->del_dis_ts;
-                               break;
-                       case COL_CLS_TIME:
-                               switch (timestamp_get_type()) {
-                               case TS_ABSOLUTE:
-                               case TS_ABSOLUTE_WITH_DATE:
-                               case TS_UTC:
-                               case TS_UTC_WITH_DATE:
-                                 if (nstime_cmp(&record->fdata->abs_ts, &fdata.abs_ts) > 0)
-                                         fdata.abs_ts = record->fdata->abs_ts;
-                                 break;
-
-                               case TS_RELATIVE:
-                                 if (nstime_cmp(&record->fdata->rel_ts, &fdata.rel_ts) > 0)
-                                         fdata.rel_ts = record->fdata->rel_ts;
-                                 break;
-
-                               case TS_DELTA:
-                                 if (nstime_cmp(&record->fdata->del_cap_ts, &fdata.del_cap_ts) > 0)
-                                         fdata.del_cap_ts = record->fdata->del_cap_ts;
-                                 break;
-
-                               case TS_DELTA_DIS:
-                                 if (nstime_cmp(&record->fdata->del_dis_ts, &fdata.del_dis_ts) > 0)
-                                         fdata.del_dis_ts = record->fdata->del_dis_ts;
-                                 break;
-
-                               case TS_EPOCH:
-                                 if (nstime_cmp(&record->fdata->abs_ts, &fdata.abs_ts) > 0)
-                                         fdata.abs_ts = record->fdata->abs_ts;
-                                 break;
-
-                               case TS_NOT_SET:
-                                 /* code is missing for this case, but I don't know which [jmayer20051219] */
-                                 g_assert_not_reached();
-                                 break;
-                               }
-                               break;
+                       record = PACKET_LIST_RECORD_GET(packet_list->visible_rows, vis_idx);
 
-                       default:
-                               g_assert_not_reached();
+                       col_fill_in_frame_data(record->fdata, &cfile.cinfo, col, FALSE);
+                       column_len = (gint) strlen(cfile.cinfo.col_buf[col]);
+                       if (column_len > widest_column_len) {
+                               widest_column_len = column_len;
+                               widest_packet = vis_idx;
                        }
                }
 
-               col_fill_in_frame_data(&fdata, &cfile.cinfo, col, FALSE);
+               if (widest_column_len != -1) {
+                       record = PACKET_LIST_RECORD_GET(packet_list->visible_rows, widest_packet);
+                       col_fill_in_frame_data(record->fdata, &cfile.cinfo, col, FALSE);
 
-               return cfile.cinfo.col_buf[col];
+                       return cfile.cinfo.col_buf[col];
+               } else
+                       return "";
        }
        else {
                PacketListRecord *record;