Dissect-on-the-fly when we have columns that are empty, i.e. columns containing strings (COL_INFO + friends). This allows us to sort on _all_ columns now.
svn path=/trunk/; revision=29718
This commit is contained in:
parent
e1eaab161d
commit
f493e75db6
|
@ -104,6 +104,7 @@ static void packet_list_sortable_init(GtkTreeSortableIface *iface);
|
||||||
static gint packet_list_compare_records(gint sort_id _U_, PacketListRecord *a,
|
static gint packet_list_compare_records(gint sort_id _U_, PacketListRecord *a,
|
||||||
PacketListRecord *b);
|
PacketListRecord *b);
|
||||||
static void packet_list_resort(PacketList *packet_list);
|
static void packet_list_resort(PacketList *packet_list);
|
||||||
|
static void packet_list_dissect_and_cache_by_record(PacketList *packet_list, PacketListRecord *record);
|
||||||
|
|
||||||
static GObjectClass *parent_class = NULL;
|
static GObjectClass *parent_class = NULL;
|
||||||
|
|
||||||
|
@ -232,6 +233,7 @@ packet_list_init(PacketList *packet_list)
|
||||||
packet_list->physical_rows = g_ptr_array_new();
|
packet_list->physical_rows = g_ptr_array_new();
|
||||||
packet_list->visible_rows = g_ptr_array_new();
|
packet_list->visible_rows = g_ptr_array_new();
|
||||||
|
|
||||||
|
packet_list->dissected = FALSE;
|
||||||
packet_list->sort_id = 0; /* defaults to first column for now */
|
packet_list->sort_id = 0; /* defaults to first column for now */
|
||||||
packet_list->sort_order = GTK_SORT_ASCENDING;
|
packet_list->sort_order = GTK_SORT_ASCENDING;
|
||||||
}
|
}
|
||||||
|
@ -567,6 +569,7 @@ new_packet_list_store_clear(PacketList *packet_list)
|
||||||
g_ptr_array_free(packet_list->visible_rows, TRUE);
|
g_ptr_array_free(packet_list->visible_rows, TRUE);
|
||||||
packet_list->physical_rows = g_ptr_array_new();
|
packet_list->physical_rows = g_ptr_array_new();
|
||||||
packet_list->visible_rows = g_ptr_array_new();
|
packet_list->visible_rows = g_ptr_array_new();
|
||||||
|
packet_list->dissected = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -646,6 +649,7 @@ packet_list_change_record(PacketList *packet_list, guint row, gint col, column_i
|
||||||
{
|
{
|
||||||
PacketListRecord *record;
|
PacketListRecord *record;
|
||||||
|
|
||||||
|
g_return_if_fail(packet_list);
|
||||||
g_return_if_fail(PACKETLIST_IS_LIST(packet_list));
|
g_return_if_fail(PACKETLIST_IS_LIST(packet_list));
|
||||||
|
|
||||||
g_assert(row < PACKET_LIST_RECORD_COUNT(packet_list->physical_rows));
|
g_assert(row < PACKET_LIST_RECORD_COUNT(packet_list->physical_rows));
|
||||||
|
@ -653,7 +657,10 @@ packet_list_change_record(PacketList *packet_list, guint row, gint col, column_i
|
||||||
record = PACKET_LIST_RECORD_GET(packet_list->physical_rows, row);
|
record = PACKET_LIST_RECORD_GET(packet_list->physical_rows, row);
|
||||||
|
|
||||||
g_assert(record->physical_pos == row);
|
g_assert(record->physical_pos == row);
|
||||||
g_assert(!record->fdata->col_text || (record->fdata->col_text[col] == NULL));
|
|
||||||
|
if (record->fdata->col_text && record->fdata->col_text[col] != NULL)
|
||||||
|
/* Column already contains a value. Bail out */
|
||||||
|
return;
|
||||||
|
|
||||||
if (!record->fdata->col_text)
|
if (!record->fdata->col_text)
|
||||||
record->fdata->col_text = se_alloc0(sizeof(record->fdata->col_text) *
|
record->fdata->col_text = se_alloc0(sizeof(record->fdata->col_text) *
|
||||||
|
@ -683,6 +690,33 @@ packet_list_sortable_get_sort_column_id(GtkTreeSortable *sortable,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
packet_list_column_contains_values(PacketList *packet_list, gint sort_col_id)
|
||||||
|
{
|
||||||
|
if (packet_list->dissected || col_based_on_frame_data(&cfile.cinfo, sort_col_id))
|
||||||
|
return TRUE;
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
packet_list_dissect_and_cache_all(PacketList *packet_list)
|
||||||
|
{
|
||||||
|
PacketListRecord *record;
|
||||||
|
guint i;
|
||||||
|
|
||||||
|
g_assert(packet_list->dissected == FALSE);
|
||||||
|
|
||||||
|
g_warning(G_STRLOC " - TODO: Insert progress bar");
|
||||||
|
|
||||||
|
for(i = 0; i < PACKET_LIST_RECORD_COUNT(packet_list->physical_rows); ++i) {
|
||||||
|
record = PACKET_LIST_RECORD_GET(packet_list->physical_rows, i);
|
||||||
|
packet_list_dissect_and_cache_by_record(packet_list, record);
|
||||||
|
}
|
||||||
|
|
||||||
|
packet_list->dissected = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
packet_list_sortable_set_sort_column_id(GtkTreeSortable *sortable,
|
packet_list_sortable_set_sort_column_id(GtkTreeSortable *sortable,
|
||||||
gint sort_col_id,
|
gint sort_col_id,
|
||||||
|
@ -699,14 +733,15 @@ packet_list_sortable_set_sort_column_id(GtkTreeSortable *sortable,
|
||||||
packet_list->sort_order == order)
|
packet_list->sort_order == order)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!col_based_on_frame_data(&cfile.cinfo, sort_col_id)) {
|
|
||||||
g_warning("Sorting on column %u not supported", sort_col_id);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
packet_list->sort_id = sort_col_id;
|
packet_list->sort_id = sort_col_id;
|
||||||
packet_list->sort_order = order;
|
packet_list->sort_order = order;
|
||||||
|
|
||||||
|
if(PACKET_LIST_RECORD_COUNT(packet_list->physical_rows) == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!packet_list_column_contains_values(packet_list, sort_col_id))
|
||||||
|
packet_list_dissect_and_cache_all(packet_list);
|
||||||
|
|
||||||
packet_list_resort(packet_list);
|
packet_list_resort(packet_list);
|
||||||
|
|
||||||
/* emit "sort-column-changed" signal to tell any tree views
|
/* emit "sort-column-changed" signal to tell any tree views
|
||||||
|
@ -749,12 +784,14 @@ static gint
|
||||||
packet_list_compare_records(gint sort_id, PacketListRecord *a,
|
packet_list_compare_records(gint sort_id, PacketListRecord *a,
|
||||||
PacketListRecord *b)
|
PacketListRecord *b)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* XXX If we want to store other things than text, we need other sort functions */
|
|
||||||
|
|
||||||
if (col_based_on_frame_data(&cfile.cinfo, sort_id))
|
if (col_based_on_frame_data(&cfile.cinfo, sort_id))
|
||||||
return frame_data_compare(a->fdata, b->fdata, cfile.cinfo.col_fmt[sort_id]);
|
return frame_data_compare(a->fdata, b->fdata, cfile.cinfo.col_fmt[sort_id]);
|
||||||
|
|
||||||
|
g_assert(a->fdata->col_text);
|
||||||
|
g_assert(b->fdata->col_text);
|
||||||
|
g_assert(a->fdata->col_text[sort_id]);
|
||||||
|
g_assert(b->fdata->col_text[sort_id]);
|
||||||
|
|
||||||
if((a->fdata->col_text[sort_id]) && (b->fdata->col_text[sort_id]))
|
if((a->fdata->col_text[sort_id]) && (b->fdata->col_text[sort_id]))
|
||||||
return strcmp(a->fdata->col_text[sort_id], b->fdata->col_text[sort_id]);
|
return strcmp(a->fdata->col_text[sort_id], b->fdata->col_text[sort_id]);
|
||||||
|
|
||||||
|
@ -886,12 +923,6 @@ packet_list_recreate_visible_rows(PacketList *packet_list)
|
||||||
void
|
void
|
||||||
packet_list_dissect_and_cache(PacketList *packet_list, GtkTreeIter *iter)
|
packet_list_dissect_and_cache(PacketList *packet_list, GtkTreeIter *iter)
|
||||||
{
|
{
|
||||||
epan_dissect_t edt;
|
|
||||||
int err;
|
|
||||||
gchar *err_info;
|
|
||||||
frame_data *fdata;
|
|
||||||
column_info *cinfo;
|
|
||||||
gint col;
|
|
||||||
PacketListRecord *record;
|
PacketListRecord *record;
|
||||||
|
|
||||||
g_return_if_fail(packet_list != NULL);
|
g_return_if_fail(packet_list != NULL);
|
||||||
|
@ -901,6 +932,19 @@ packet_list_dissect_and_cache(PacketList *packet_list, GtkTreeIter *iter)
|
||||||
|
|
||||||
record = iter->user_data;
|
record = iter->user_data;
|
||||||
|
|
||||||
|
packet_list_dissect_and_cache_by_record(packet_list, record);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
packet_list_dissect_and_cache_by_record(PacketList *packet_list, PacketListRecord *record)
|
||||||
|
{
|
||||||
|
epan_dissect_t edt;
|
||||||
|
int err;
|
||||||
|
gchar *err_info;
|
||||||
|
frame_data *fdata;
|
||||||
|
column_info *cinfo;
|
||||||
|
gint col;
|
||||||
|
|
||||||
fdata = record->fdata;
|
fdata = record->fdata;
|
||||||
cinfo = &cfile.cinfo;
|
cinfo = &cfile.cinfo;
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,7 @@ typedef struct _PacketListClass PacketListClass;
|
||||||
/* PacketListRecord: represents a row */
|
/* PacketListRecord: represents a row */
|
||||||
struct _PacketListRecord
|
struct _PacketListRecord
|
||||||
{
|
{
|
||||||
|
/* Has this record been dissected? */
|
||||||
gboolean dissected;
|
gboolean dissected;
|
||||||
frame_data *fdata;
|
frame_data *fdata;
|
||||||
|
|
||||||
|
@ -69,6 +70,9 @@ struct _PacketList
|
||||||
/* Array of pointers to the PacketListRecord structure for each row. */
|
/* Array of pointers to the PacketListRecord structure for each row. */
|
||||||
GPtrArray *physical_rows;
|
GPtrArray *physical_rows;
|
||||||
|
|
||||||
|
/* Has the entire file been dissected? */
|
||||||
|
gboolean dissected;
|
||||||
|
|
||||||
gint n_columns;
|
gint n_columns;
|
||||||
/* Note: We need one extra column to store the entire PacketListRecord */
|
/* Note: We need one extra column to store the entire PacketListRecord */
|
||||||
GType column_types[NUM_COL_FMTS+1];
|
GType column_types[NUM_COL_FMTS+1];
|
||||||
|
|
Loading…
Reference in New Issue