2021-11-30 13:01:36 +00:00
|
|
|
/** @file
|
2012-01-04 22:13:01 +00:00
|
|
|
*
|
|
|
|
* Wireshark - Network traffic analyzer
|
|
|
|
* By Gerald Combs <gerald@wireshark.org>
|
|
|
|
* Copyright 1998 Gerald Combs
|
|
|
|
*
|
2018-04-30 07:47:58 +00:00
|
|
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
*/
|
2012-01-04 22:13:01 +00:00
|
|
|
|
|
|
|
#ifndef PACKET_LIST_RECORD_H
|
|
|
|
#define PACKET_LIST_RECORD_H
|
|
|
|
|
2015-01-03 20:52:54 +00:00
|
|
|
#include <config.h>
|
2012-01-04 22:13:01 +00:00
|
|
|
|
|
|
|
#include <glib.h>
|
|
|
|
|
2014-05-31 01:56:35 +00:00
|
|
|
#include "cfile.h"
|
|
|
|
|
2022-08-06 13:31:23 +00:00
|
|
|
#include <epan/column.h>
|
2012-01-04 22:13:01 +00:00
|
|
|
#include <epan/packet.h>
|
|
|
|
|
2014-05-31 01:56:35 +00:00
|
|
|
#include <QByteArray>
|
2022-12-18 11:01:52 +00:00
|
|
|
#include <QCache>
|
2012-01-04 22:13:01 +00:00
|
|
|
#include <QList>
|
|
|
|
#include <QVariant>
|
|
|
|
|
2015-02-24 01:56:14 +00:00
|
|
|
struct conversation;
|
2015-09-10 23:06:12 +00:00
|
|
|
struct _GStringChunk;
|
2015-02-24 01:56:14 +00:00
|
|
|
|
2012-01-04 22:13:01 +00:00
|
|
|
class PacketListRecord
|
|
|
|
{
|
|
|
|
public:
|
2019-07-04 13:46:45 +00:00
|
|
|
PacketListRecord(frame_data *frameData);
|
|
|
|
virtual ~PacketListRecord();
|
2016-07-13 21:51:56 +00:00
|
|
|
|
2020-11-19 07:50:28 +00:00
|
|
|
// Ensure that the record is colorized.
|
|
|
|
void ensureColorized(capture_file *cap_file);
|
2014-05-31 01:56:35 +00:00
|
|
|
// Return the string value for a column. Data is cached if possible.
|
2019-07-03 21:01:34 +00:00
|
|
|
const QString columnString(capture_file *cap_file, int column, bool colorized = false);
|
2014-10-05 19:23:33 +00:00
|
|
|
frame_data *frameData() const { return fdata_; }
|
|
|
|
// packet_list->col_to_text in gtk/packet_list_store.c
|
|
|
|
static int textColumn(int column) { return cinfo_column_.value(column, -1); }
|
2023-02-07 23:20:50 +00:00
|
|
|
bool colorized() { return colorized_ && (color_ver_ == rows_color_ver_); }
|
2019-07-04 13:46:45 +00:00
|
|
|
unsigned int conversation() { return conv_index_; }
|
2014-05-31 01:56:35 +00:00
|
|
|
|
2014-09-23 20:35:10 +00:00
|
|
|
int columnTextSize(const char *str);
|
Qt: Ensure that add frame comments trigger recoloring, count updates
Add functions to PacketListRecord to invalidate a single record's
colorization and column strings, used for a record is modified in a
way that needs to trigger redrawing, but we don't need to redraw
all packets.
Move the functionality for adding, deleting, and setting frame comments
into PacketListModel, operating on QModelIndexes (or on all physical
rows in the case of deleting all comments from a file.) Trigger
recolorization of any record with an updated comment.
Only set a block as modified when deleting comments if we actually
deleted comments. This avoids marking a file as modified if we
delete all comments from all frames, or all comments from selected
frames, when those comments do not actually have frames.
If cf_set_modified_block is used to modify a block that is already
modified, it can't update the comment count. In that case, return
false and have the callers update the comment count. (It already
has a return value, which is always true.) This avoids having the
GUI warning about saving into a format that doesn't support comments
when comments have been added and then removed.
Note that, unlike with time references and time shifts, there
are no fields (and hence no columns nor color filters) that depend
on whether other fields have comments. If for some reason some
were added, then the model data for all frames would have to be
updated instead. Since there aren't, we don't need to
redrawVisiblePackets, but we do need to drawCurrentPacket to ensure
the packet details are redissected.
Fix #12519
2023-02-09 12:21:55 +00:00
|
|
|
|
|
|
|
void invalidateColorized() { colorized_ = false; }
|
|
|
|
void invalidateRecord() { col_text_cache_.remove(fdata_->num); }
|
2022-12-18 11:01:52 +00:00
|
|
|
static void invalidateAllRecords() { col_text_cache_.clear(); }
|
2022-12-26 19:27:02 +00:00
|
|
|
/* In Qt 6, QCache maxCost is a qsizetype, but the QAbstractItemModel
|
|
|
|
* number of rows is still an int, so we're limited to INT_MAX anyway.
|
|
|
|
*/
|
|
|
|
static void setMaxCache(int cost) { col_text_cache_.setMaxCost(cost); }
|
2014-05-31 01:56:35 +00:00
|
|
|
static void resetColumns(column_info *cinfo);
|
2019-11-19 12:11:36 +00:00
|
|
|
static void resetColorization() { rows_color_ver_++; }
|
|
|
|
|
2015-02-26 21:02:06 +00:00
|
|
|
inline int lineCount() { return lines_; }
|
|
|
|
inline int lineCountChanged() { return line_count_changed_; }
|
2012-01-04 22:13:01 +00:00
|
|
|
|
|
|
|
private:
|
2019-06-19 18:22:47 +00:00
|
|
|
/** The column text for some columns */
|
2022-12-18 11:01:52 +00:00
|
|
|
static QCache<guint32, QStringList> col_text_cache_;
|
2012-01-04 22:13:01 +00:00
|
|
|
|
2012-12-17 23:03:21 +00:00
|
|
|
frame_data *fdata_;
|
2015-02-26 21:02:06 +00:00
|
|
|
int lines_;
|
|
|
|
bool line_count_changed_;
|
2014-10-05 19:23:33 +00:00
|
|
|
static QMap<int, int> cinfo_column_;
|
|
|
|
|
2012-01-04 22:13:01 +00:00
|
|
|
/** Has this record been colorized? */
|
2019-11-19 12:11:36 +00:00
|
|
|
static unsigned int rows_color_ver_;
|
|
|
|
unsigned int color_ver_;
|
2014-05-31 01:56:35 +00:00
|
|
|
bool colorized_;
|
2012-01-04 22:13:01 +00:00
|
|
|
|
2015-02-24 01:56:14 +00:00
|
|
|
/** Conversation. Used by RelatedPacketDelegate */
|
2019-07-04 13:46:45 +00:00
|
|
|
unsigned int conv_index_;
|
2015-09-10 23:06:12 +00:00
|
|
|
|
2020-02-15 19:14:34 +00:00
|
|
|
bool read_failed_;
|
|
|
|
|
2022-12-18 11:01:52 +00:00
|
|
|
void dissect(capture_file *cap_file, bool dissect_columns, bool dissect_color = false);
|
2019-01-09 17:09:11 +00:00
|
|
|
void cacheColumnStrings(column_info *cinfo);
|
2012-01-04 22:13:01 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif // PACKET_LIST_RECORD_H
|