5 * Copyright (c) 2000 by Gilbert Ramirez <gram@alumni.rice.edu>
7 * Wireshark - Network traffic analyzer
8 * By Gerald Combs <gerald@wireshark.org>
9 * Copyright 1998 Gerald Combs
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version 2
14 * of the License, or (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
28 #include <epan/emem.h>
31 #include "tvbuff-int.h"
32 #include "proto.h" /* XXX - only used for DISSECTOR_ASSERT, probably a new header file? */
37 /** Func to call when actually freed */
38 tvbuff_free_cb_t free_cb;
42 real_free(tvbuff_t *tvb)
44 struct tvb_real *real_tvb = (struct tvb_real *) tvb;
46 if (real_tvb->free_cb) {
48 * XXX - do this with a union?
50 real_tvb->free_cb((gpointer)tvb->real_data);
55 real_offset(const tvbuff_t *tvb _U_, const guint counter)
60 static const struct tvb_ops tvb_real_ops = {
61 sizeof(struct tvb_real), /* size */
64 real_offset, /* offset */
67 NULL, /* find_guint8 */
68 NULL, /* pbrk_guint8 */
73 tvb_new_real_data(const guint8* data, const guint length, const gint reported_length)
76 struct tvb_real *real_tvb;
78 THROW_ON(reported_length < -1, ReportedBoundsError);
80 tvb = tvb_new(&tvb_real_ops);
82 tvb->real_data = data;
84 tvb->reported_length = reported_length;
85 tvb->initialized = TRUE;
88 * This is the top-level real tvbuff for this data source,
89 * so its data source tvbuff is itself.
93 real_tvb = (struct tvb_real *) tvb;
94 real_tvb->free_cb = NULL;
100 tvb_set_free_cb(tvbuff_t *tvb, const tvbuff_free_cb_t func)
102 struct tvb_real *real_tvb = (struct tvb_real *) tvb;
104 DISSECTOR_ASSERT(tvb);
105 DISSECTOR_ASSERT(tvb->ops == &tvb_real_ops);
106 real_tvb->free_cb = func;
110 tvb_set_child_real_data_tvbuff(tvbuff_t *parent, tvbuff_t *child)
112 DISSECTOR_ASSERT(parent && child);
113 DISSECTOR_ASSERT(parent->initialized);
114 DISSECTOR_ASSERT(child->initialized);
115 DISSECTOR_ASSERT(child->ops == &tvb_real_ops);
116 tvb_add_to_chain(parent, child);
120 tvb_new_child_real_data(tvbuff_t *parent, const guint8* data, const guint length, const gint reported_length)
122 tvbuff_t *tvb = tvb_new_real_data(data, length, reported_length);
124 tvb_set_child_real_data_tvbuff(parent, tvb);