aboutsummaryrefslogtreecommitdiffstats
path: root/ui/packet_list_utils.c
blob: 312d156e126f8cb856eb5a42e1f325004be7e99f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/* packet_list_utils.c
 * Packet list display utilities
 * Copied from gtk/packet_list.c
 *
 * Wireshark - Network traffic analyzer
 * By Gerald Combs <gerald@wireshark.org>
 * Copyright 1998 Gerald Combs
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

#include "config.h"

#include "packet_list_utils.h"

#include <epan/column.h>

gboolean
right_justify_column (gint col, capture_file *cf)
{
    header_field_info *hfi;
    gboolean right_justify = FALSE;
    guint num_fields, ii;
    col_custom_t *col_custom;
    guint right_justify_count = 0;

    if (!cf) return FALSE;

    switch (cf->cinfo.columns[col].col_fmt) {

        case COL_NUMBER:
        case COL_PACKET_LENGTH:
        case COL_CUMULATIVE_BYTES:
        case COL_DSCP_VALUE:
        case COL_UNRES_DST_PORT:
        case COL_UNRES_SRC_PORT:
        case COL_DEF_DST_PORT:
        case COL_DEF_SRC_PORT:
        case COL_DELTA_TIME:
        case COL_DELTA_TIME_DIS:
            right_justify = TRUE;
            break;

        case COL_CUSTOM:
            num_fields = g_slist_length(cf->cinfo.columns[col].col_custom_fields_ids);
            for (ii = 0; ii < num_fields; ii++) {
                col_custom = (col_custom_t *) g_slist_nth_data(cf->cinfo.columns[col].col_custom_fields_ids, ii);
                if (col_custom->field_id == 0) {
                    /* XXX - If there were some way to check the compiled dfilter's
                     * expected return type, we could use that.
                     */
                    return FALSE;
                }
                hfi = proto_registrar_get_nth(col_custom->field_id);

                /* Check if this is a valid field and we have no strings lookup table */
                /* XXX - We should check every hfi with the same abbreviation */
                if ((hfi != NULL) && ((hfi->strings == NULL) || !get_column_resolved(col))) {
                    /* Check for bool, framenum, double, float, relative time and decimal/octal integer types */
                    if ((hfi->type == FT_BOOLEAN) || (hfi->type == FT_FRAMENUM) || (hfi->type == FT_DOUBLE) ||
                        (hfi->type == FT_FLOAT) || (hfi->type == FT_RELATIVE_TIME) ||
                        (((FIELD_DISPLAY(hfi->display) == BASE_DEC) || (FIELD_DISPLAY(hfi->display) == BASE_OCT)) &&
                         (FT_IS_INT(hfi->type) || FT_IS_UINT(hfi->type))))
                    {
                        right_justify_count++;
                    }
                }
            }

            if ((num_fields > 0) && (right_justify_count == num_fields)) {
                /* All custom fields must meet the right-justify criteria */
                right_justify = TRUE;
            }
            break;

        default:
            break;
    }

    return right_justify;
}

gboolean
resolve_column (gint col, capture_file *cf)
{
    header_field_info *hfi;
    gboolean resolve = FALSE;
    guint num_fields, ii;
    col_custom_t *col_custom;

    if (!cf) return FALSE;

    switch (cf->cinfo.columns[col].col_fmt) {

        case COL_CUSTOM:
            num_fields = g_slist_length(cf->cinfo.columns[col].col_custom_fields_ids);
            for (ii = 0; ii < num_fields; ii++) {
                col_custom = (col_custom_t *) g_slist_nth_data(cf->cinfo.columns[col].col_custom_fields_ids, ii);
                if (col_custom->field_id == 0) {
                    /* XXX - A "resolved" string might be conceivable for certain
                     * expressions, but would require being able to know which
                     * hfinfo produced each value, if there are multiple hfi with
                     * the same abbreviation.
                     */
                    continue;
                }
                hfi = proto_registrar_get_nth(col_custom->field_id);
                /* XXX - We should check every hfi with the same abbreviation */

                /* Check if we have an OID, a (potentially) resolvable network
                 * address, a Boolean, or a strings table with integer values */
                /* XXX: Should this checkbox be disabled if the Name Resolution
                 * preference for a given type is off?
                 */
                if ((hfi->type == FT_OID) || (hfi->type == FT_REL_OID) || (hfi->type == FT_ETHER) || (hfi->type == FT_IPv4) || (hfi->type == FT_IPv6) || (hfi->type == FT_FCWWN) || (hfi->type == FT_BOOLEAN) ||
                    ((hfi->strings != NULL) &&
                     (FT_IS_INT(hfi->type) || FT_IS_UINT(hfi->type))))
                {
                    resolve = TRUE;
                    break;
                }
            }
            break;

        default:
            break;
    }

    return resolve;
}