Merge remote-tracking branch 'origin/develop' into oairu
This commit is contained in:
@@ -129,7 +129,7 @@ ID = ENB_MAC_UE_DL_PDU_WITH_DATA
|
||||
FORMAT = int,eNB_ID : int,CC_id : int,rnti : int,frame : int,subframe : int,harq_pid : buffer,data
|
||||
ID = ENB_MAC_SCHEDULING_REQUEST
|
||||
DESC = MAC scheduling request detected for an UE
|
||||
GROUP = ALL:MAC:ENB
|
||||
GROUP = ALL:MAC:ENB:WIRESHARK
|
||||
FORMAT = int,eNB_ID : int,CC_id : int,frame : int,subframe : int,rnti
|
||||
ID = ENB_MAC_UE_DL_RAR_PDU_WITH_DATA
|
||||
DESC = MAC downlink PDU for an UE
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#define DEFAULT_LIVE_PORT 2021
|
||||
|
||||
#define NO_PREAMBLE -1
|
||||
#define NO_SR_RNTI -1
|
||||
|
||||
typedef struct {
|
||||
int socket;
|
||||
@@ -48,6 +49,10 @@ typedef struct {
|
||||
int rar_frame;
|
||||
int rar_subframe;
|
||||
int rar_data;
|
||||
/* SR */
|
||||
int sr_rnti;
|
||||
int sr_frame;
|
||||
int sr_subframe;
|
||||
|
||||
/* NR traces */
|
||||
/* NR ul */
|
||||
@@ -80,6 +85,15 @@ typedef struct {
|
||||
/* runtime vars */
|
||||
int cur_mib;
|
||||
int cur_sib;
|
||||
|
||||
/* hack to report UE id:
|
||||
* each time we see a rnti, we allocate the next ue_id
|
||||
* (two separate versions for lte and nr)
|
||||
*/
|
||||
int lte_rnti_to_ueid[65536];
|
||||
int lte_next_ue_id;
|
||||
int nr_rnti_to_ueid[65536];
|
||||
int nr_next_ue_id;
|
||||
} ev_data;
|
||||
|
||||
/****************************************************************************/
|
||||
@@ -87,7 +101,8 @@ typedef struct {
|
||||
/****************************************************************************/
|
||||
|
||||
void trace_lte(ev_data *d, int direction, int rnti_type, int rnti,
|
||||
int frame, int subframe, void *buf, int bufsize, int preamble)
|
||||
int frame, int subframe, void *buf, int bufsize, int preamble,
|
||||
int sr_rnti)
|
||||
{
|
||||
ssize_t ret;
|
||||
int fsf;
|
||||
@@ -102,6 +117,18 @@ void trace_lte(ev_data *d, int direction, int rnti_type, int rnti,
|
||||
PUTC(&d->buf, MAC_LTE_RNTI_TAG);
|
||||
PUTC(&d->buf, (rnti>>8) & 255);
|
||||
PUTC(&d->buf, rnti & 255);
|
||||
|
||||
/* put UE id */
|
||||
if (rnti < 0 || rnti > 65535) { printf("bad rnti!\n"); exit(1); }
|
||||
/* if no UE id allocated for this rnti then allocate the next one */
|
||||
if (d->lte_rnti_to_ueid[rnti] == -1) {
|
||||
d->lte_rnti_to_ueid[rnti] = d->lte_next_ue_id;
|
||||
d->lte_next_ue_id++;
|
||||
}
|
||||
|
||||
PUTC(&d->buf, MAC_LTE_UEID_TAG);
|
||||
PUTC(&d->buf, (d->lte_rnti_to_ueid[rnti]>>8) & 255);
|
||||
PUTC(&d->buf, d->lte_rnti_to_ueid[rnti] & 255);
|
||||
}
|
||||
|
||||
/* for newer version of wireshark? */
|
||||
@@ -118,6 +145,25 @@ void trace_lte(ev_data *d, int direction, int rnti_type, int rnti,
|
||||
PUTC(&d->buf, 0); /* rach attempt - always 0 for us (not sure of this) */
|
||||
}
|
||||
|
||||
if (sr_rnti != NO_SR_RNTI) {
|
||||
PUTC(&d->buf, MAC_LTE_SR_TAG);
|
||||
PUTC(&d->buf, 0); /* number of items byte 1 */
|
||||
PUTC(&d->buf, 1); /* number of items byte 2 */
|
||||
|
||||
/* put UE id */
|
||||
if (sr_rnti < 0 || sr_rnti > 65535) { printf("bad sr rnti!\n"); exit(1); }
|
||||
/* if no UE id allocated for this rnti then allocate the next one */
|
||||
if (d->lte_rnti_to_ueid[sr_rnti] == -1) {
|
||||
d->lte_rnti_to_ueid[sr_rnti] = d->lte_next_ue_id;
|
||||
d->lte_next_ue_id++;
|
||||
}
|
||||
PUTC(&d->buf, (d->lte_rnti_to_ueid[sr_rnti]>>8) & 255);
|
||||
PUTC(&d->buf, d->lte_rnti_to_ueid[sr_rnti] & 255);
|
||||
|
||||
PUTC(&d->buf, (sr_rnti>>8) & 255);
|
||||
PUTC(&d->buf, sr_rnti & 255);
|
||||
}
|
||||
|
||||
PUTC(&d->buf, MAC_LTE_PAYLOAD_TAG);
|
||||
|
||||
for (i = 0; i < bufsize; i++)
|
||||
@@ -135,7 +181,7 @@ void ul(void *_d, event e)
|
||||
trace_lte(d, DIRECTION_UPLINK, C_RNTI, e.e[d->ul_rnti].i,
|
||||
e.e[d->ul_frame].i, e.e[d->ul_subframe].i,
|
||||
e.e[d->ul_data].b, e.e[d->ul_data].bsize,
|
||||
NO_PREAMBLE);
|
||||
NO_PREAMBLE, NO_SR_RNTI);
|
||||
}
|
||||
|
||||
void dl(void *_d, event e)
|
||||
@@ -154,7 +200,7 @@ void dl(void *_d, event e)
|
||||
e.e[d->dl_rnti].i != 0xffff ? C_RNTI : SI_RNTI, e.e[d->dl_rnti].i,
|
||||
e.e[d->dl_frame].i, e.e[d->dl_subframe].i,
|
||||
e.e[d->dl_data].b, e.e[d->dl_data].bsize,
|
||||
NO_PREAMBLE);
|
||||
NO_PREAMBLE, NO_SR_RNTI);
|
||||
}
|
||||
|
||||
void mib(void *_d, event e)
|
||||
@@ -169,7 +215,7 @@ void mib(void *_d, event e)
|
||||
trace_lte(d, DIRECTION_DOWNLINK, NO_RNTI, 0,
|
||||
e.e[d->mib_frame].i, e.e[d->mib_subframe].i,
|
||||
e.e[d->mib_data].b, e.e[d->mib_data].bsize,
|
||||
NO_PREAMBLE);
|
||||
NO_PREAMBLE, NO_SR_RNTI);
|
||||
}
|
||||
|
||||
void preamble(void *_d, event e)
|
||||
@@ -178,7 +224,7 @@ void preamble(void *_d, event e)
|
||||
trace_lte(d, DIRECTION_UPLINK, NO_RNTI, 0,
|
||||
e.e[d->preamble_frame].i, e.e[d->preamble_subframe].i,
|
||||
NULL, 0,
|
||||
e.e[d->preamble_preamble].i);
|
||||
e.e[d->preamble_preamble].i, NO_SR_RNTI);
|
||||
}
|
||||
|
||||
void rar(void *_d, event e)
|
||||
@@ -187,7 +233,16 @@ void rar(void *_d, event e)
|
||||
trace_lte(d, DIRECTION_DOWNLINK, RA_RNTI, e.e[d->rar_rnti].i,
|
||||
e.e[d->rar_frame].i, e.e[d->rar_subframe].i,
|
||||
e.e[d->rar_data].b, e.e[d->rar_data].bsize,
|
||||
NO_PREAMBLE);
|
||||
NO_PREAMBLE, NO_SR_RNTI);
|
||||
}
|
||||
|
||||
void sr(void *_d, event e)
|
||||
{
|
||||
ev_data *d = _d;
|
||||
trace_lte(d, DIRECTION_UPLINK, NO_RNTI, 0,
|
||||
e.e[d->sr_frame].i, e.e[d->sr_subframe].i,
|
||||
NULL, 0,
|
||||
NO_PREAMBLE, e.e[d->sr_rnti].i);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
@@ -198,6 +253,7 @@ void rar(void *_d, event e)
|
||||
|
||||
#define MAC_NR_PAYLOAD_TAG 0x01
|
||||
#define MAC_NR_RNTI_TAG 0x02
|
||||
#define MAC_NR_UEID_TAG 0x03
|
||||
#define MAC_NR_FRAME_SLOT_TAG 0x07
|
||||
|
||||
#define NR_FDD_RADIO 1
|
||||
@@ -225,6 +281,18 @@ void trace_nr(ev_data *d, int direction, int rnti_type, int rnti,
|
||||
PUTC(&d->buf, MAC_NR_RNTI_TAG);
|
||||
PUTC(&d->buf, (rnti>>8) & 255);
|
||||
PUTC(&d->buf, rnti & 255);
|
||||
|
||||
/* put UE id */
|
||||
if (rnti < 0 || rnti > 65535) { printf("bad rnti!\n"); exit(1); }
|
||||
/* if no UE id allocated for this rnti then allocate the next one */
|
||||
if (d->nr_rnti_to_ueid[rnti] == -1) {
|
||||
d->nr_rnti_to_ueid[rnti] = d->nr_next_ue_id;
|
||||
d->nr_next_ue_id++;
|
||||
}
|
||||
|
||||
PUTC(&d->buf, MAC_NR_UEID_TAG);
|
||||
PUTC(&d->buf, (d->nr_rnti_to_ueid[rnti]>>8) & 255);
|
||||
PUTC(&d->buf, d->nr_rnti_to_ueid[rnti] & 255);
|
||||
}
|
||||
|
||||
#if 0
|
||||
@@ -298,7 +366,7 @@ void nr_rar(void *_d, event e)
|
||||
/****************************************************************************/
|
||||
|
||||
void setup_data(ev_data *d, void *database, int ul_id, int dl_id, int mib_id,
|
||||
int preamble_id, int rar_id,
|
||||
int preamble_id, int rar_id, int sr_id,
|
||||
int nr_ul_id, int nr_dl_id, int nr_mib_id, int nr_rar_id)
|
||||
{
|
||||
database_event_format f;
|
||||
@@ -321,6 +389,9 @@ void setup_data(ev_data *d, void *database, int ul_id, int dl_id, int mib_id,
|
||||
d->rar_frame = -1;
|
||||
d->rar_subframe = -1;
|
||||
d->rar_data = -1;
|
||||
d->sr_rnti = -1;
|
||||
d->sr_frame = -1;
|
||||
d->sr_subframe = -1;
|
||||
|
||||
d->nr_ul_rnti = -1;
|
||||
d->nr_ul_frame = -1;
|
||||
@@ -407,6 +478,18 @@ void setup_data(ev_data *d, void *database, int ul_id, int dl_id, int mib_id,
|
||||
if (d->rar_rnti == -1 || d->rar_frame == -1 || d->rar_subframe == -1 ||
|
||||
d->rar_data == -1) goto error;
|
||||
|
||||
/* sr: rnti, frame, subframe */
|
||||
f = get_format(database, sr_id);
|
||||
|
||||
for (i = 0; i < f.count; i++) {
|
||||
G("rnti", "int", d->sr_rnti);
|
||||
G("frame", "int", d->sr_frame);
|
||||
G("subframe", "int", d->sr_subframe);
|
||||
}
|
||||
|
||||
if (d->sr_rnti == -1 || d->sr_frame == -1 || d->sr_subframe == -1)
|
||||
goto error;
|
||||
|
||||
/* NR ul: rnti, frame, slot, data */
|
||||
f = get_format(database, nr_ul_id);
|
||||
|
||||
@@ -530,6 +613,7 @@ int main(int n, char **v)
|
||||
int i;
|
||||
int ul_id, dl_id, mib_id, preamble_id, rar_id;
|
||||
int nr_ul_id, nr_dl_id, nr_mib_id, nr_rar_id;
|
||||
int sr_id;
|
||||
ev_data d;
|
||||
char *ip = DEFAULT_IP;
|
||||
int port = DEFAULT_PORT;
|
||||
@@ -538,6 +622,11 @@ int main(int n, char **v)
|
||||
int live = 0;
|
||||
memset(&d, 0, sizeof(ev_data));
|
||||
|
||||
for (i = 0; i < 65536; i++) {
|
||||
d.lte_rnti_to_ueid[i] = -1;
|
||||
d.nr_rnti_to_ueid[i] = -1;
|
||||
}
|
||||
|
||||
for (i = 1; i < n; i++) {
|
||||
if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage();
|
||||
if (!strcmp(v[i], "-d")) { if(i>n-2)usage(); database_filename = v[++i]; continue; }
|
||||
@@ -599,6 +688,7 @@ int main(int n, char **v)
|
||||
on_off(database, "ENB_PHY_MIB", is_on, 1);
|
||||
on_off(database, "ENB_PHY_INITIATE_RA_PROCEDURE", is_on, 1);
|
||||
on_off(database, "ENB_MAC_UE_DL_RAR_PDU_WITH_DATA", is_on, 1);
|
||||
on_off(database, "ENB_MAC_SCHEDULING_REQUEST", is_on, 1);
|
||||
|
||||
on_off(database, "GNB_MAC_UL_PDU_WITH_DATA", is_on, 1);
|
||||
on_off(database, "GNB_MAC_DL_PDU_WITH_DATA", is_on, 1);
|
||||
@@ -621,13 +711,14 @@ int main(int n, char **v)
|
||||
mib_id = event_id_from_name(database, "ENB_PHY_MIB");
|
||||
preamble_id = event_id_from_name(database, "ENB_PHY_INITIATE_RA_PROCEDURE");
|
||||
rar_id = event_id_from_name(database, "ENB_MAC_UE_DL_RAR_PDU_WITH_DATA");
|
||||
sr_id = event_id_from_name(database, "ENB_MAC_SCHEDULING_REQUEST");
|
||||
|
||||
nr_ul_id = event_id_from_name(database, "GNB_MAC_UL_PDU_WITH_DATA");
|
||||
nr_dl_id = event_id_from_name(database, "GNB_MAC_DL_PDU_WITH_DATA");
|
||||
nr_mib_id = event_id_from_name(database, "GNB_PHY_MIB");
|
||||
nr_rar_id = event_id_from_name(database, "GNB_MAC_DL_RAR_PDU_WITH_DATA");
|
||||
|
||||
setup_data(&d, database, ul_id, dl_id, mib_id, preamble_id, rar_id,
|
||||
setup_data(&d, database, ul_id, dl_id, mib_id, preamble_id, rar_id, sr_id,
|
||||
nr_ul_id, nr_dl_id, nr_mib_id, nr_rar_id);
|
||||
|
||||
register_handler_function(h, ul_id, ul, &d);
|
||||
@@ -635,6 +726,7 @@ int main(int n, char **v)
|
||||
register_handler_function(h, mib_id, mib, &d);
|
||||
register_handler_function(h, preamble_id, preamble, &d);
|
||||
register_handler_function(h, rar_id, rar, &d);
|
||||
register_handler_function(h, sr_id, sr, &d);
|
||||
|
||||
register_handler_function(h, nr_ul_id, nr_ul, &d);
|
||||
register_handler_function(h, nr_dl_id, nr_dl, &d);
|
||||
@@ -662,7 +754,7 @@ int main(int n, char **v)
|
||||
if (e.type == -1) break;
|
||||
|
||||
if (!(e.type == ul_id || e.type == dl_id || e.type == mib_id ||
|
||||
e.type == preamble_id || e.type == rar_id ||
|
||||
e.type == preamble_id || e.type == rar_id || e.type == sr_id ||
|
||||
e.type == nr_ul_id || e.type == nr_dl_id ||
|
||||
e.type == nr_mib_id || e.type == nr_rar_id)) continue;
|
||||
|
||||
|
||||
@@ -11,26 +11,7 @@
|
||||
*
|
||||
* Copyright (C) 2009 Martin Mathieson. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#ifndef __COMMON_UTILS_T_TRACER_PACKET_MAC_LTE__H__
|
||||
@@ -67,9 +48,9 @@
|
||||
/* and implemented by this dissector, using the definitions */
|
||||
/* below. A link to an example program showing you how to encode */
|
||||
/* these headers and send LTE MAC PDUs on a UDP socket is */
|
||||
/* provided at https://wiki.wireshark.org/MAC-LTE */
|
||||
/* provided at https://wiki.wireshark.org/MAC-LTE */
|
||||
/* */
|
||||
/* A heuristic dissecter (enabled by a preference) will */
|
||||
/* A heuristic dissector (enabled by a preference) will */
|
||||
/* recognise a signature at the beginning of these frames. */
|
||||
/*****************************************************************/
|
||||
|
||||
@@ -126,18 +107,25 @@
|
||||
MCS index (1 byte), redundancy version (1 byte), resource block length (1 byte),
|
||||
HARQ id (1 byte), NDI (1 byte), TB (1 byte), DL reTx (1 byte) */
|
||||
|
||||
#define MAC_LTE_SIMULT_PUCCH_PUSCH_PCELL 0x0C
|
||||
#define MAC_LTE_SIMULT_PUCCH_PUSCH_PCELL_TAG 0x0C
|
||||
/* 0 byte */
|
||||
|
||||
#define MAC_LTE_SIMULT_PUCCH_PUSCH_PSCELL 0x0D
|
||||
#define MAC_LTE_SIMULT_PUCCH_PUSCH_PSCELL_TAG 0x0D
|
||||
/* 0 byte */
|
||||
|
||||
#define MAC_LTE_CE_MODE 0x0E
|
||||
#define MAC_LTE_CE_MODE_TAG 0x0E
|
||||
/* 1 byte containing mac_lte_ce_mode enum value */
|
||||
|
||||
#define MAC_LTE_NB_MODE 0x0F
|
||||
#define MAC_LTE_NB_MODE_TAG 0x0F
|
||||
/* 1 byte containing mac_lte_nb_mode enum value */
|
||||
|
||||
#define MAC_LTE_N_UL_RB_TAG 0x10
|
||||
/* 1 byte containing the number of UL resource blocks: 6, 15, 25, 50, 75 or 100 */
|
||||
|
||||
#define MAC_LTE_SR_TAG 0x11
|
||||
/* 2 bytes for the number of items, followed by that number of ueid, rnti (2 bytes each) */
|
||||
|
||||
|
||||
/* MAC PDU. Following this tag comes the actual MAC PDU (there is no length, the PDU
|
||||
continues until the end of the frame) */
|
||||
#define MAC_LTE_PAYLOAD_TAG 0x01
|
||||
|
||||
@@ -1,370 +0,0 @@
|
||||
Installation Instructions
|
||||
*************************
|
||||
|
||||
Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation,
|
||||
Inc.
|
||||
|
||||
Copying and distribution of this file, with or without modification,
|
||||
are permitted in any medium without royalty provided the copyright
|
||||
notice and this notice are preserved. This file is offered as-is,
|
||||
without warranty of any kind.
|
||||
|
||||
Basic Installation
|
||||
==================
|
||||
|
||||
Briefly, the shell command `./configure && make && make install'
|
||||
should configure, build, and install this package. The following
|
||||
more-detailed instructions are generic; see the `README' file for
|
||||
instructions specific to this package. Some packages provide this
|
||||
`INSTALL' file but do not implement all of the features documented
|
||||
below. The lack of an optional feature in a given package is not
|
||||
necessarily a bug. More recommendations for GNU packages can be found
|
||||
in *note Makefile Conventions: (standards)Makefile Conventions.
|
||||
|
||||
The `configure' shell script attempts to guess correct values for
|
||||
various system-dependent variables used during compilation. It uses
|
||||
those values to create a `Makefile' in each directory of the package.
|
||||
It may also create one or more `.h' files containing system-dependent
|
||||
definitions. Finally, it creates a shell script `config.status' that
|
||||
you can run in the future to recreate the current configuration, and a
|
||||
file `config.log' containing compiler output (useful mainly for
|
||||
debugging `configure').
|
||||
|
||||
It can also use an optional file (typically called `config.cache'
|
||||
and enabled with `--cache-file=config.cache' or simply `-C') that saves
|
||||
the results of its tests to speed up reconfiguring. Caching is
|
||||
disabled by default to prevent problems with accidental use of stale
|
||||
cache files.
|
||||
|
||||
If you need to do unusual things to compile the package, please try
|
||||
to figure out how `configure' could check whether to do them, and mail
|
||||
diffs or instructions to the address given in the `README' so they can
|
||||
be considered for the next release. If you are using the cache, and at
|
||||
some point `config.cache' contains results you don't want to keep, you
|
||||
may remove or edit it.
|
||||
|
||||
The file `configure.ac' (or `configure.in') is used to create
|
||||
`configure' by a program called `autoconf'. You need `configure.ac' if
|
||||
you want to change it or regenerate `configure' using a newer version
|
||||
of `autoconf'.
|
||||
|
||||
The simplest way to compile this package is:
|
||||
|
||||
1. `cd' to the directory containing the package's source code and type
|
||||
`./configure' to configure the package for your system.
|
||||
|
||||
Running `configure' might take a while. While running, it prints
|
||||
some messages telling which features it is checking for.
|
||||
|
||||
2. Type `make' to compile the package.
|
||||
|
||||
3. Optionally, type `make check' to run any self-tests that come with
|
||||
the package, generally using the just-built uninstalled binaries.
|
||||
|
||||
4. Type `make install' to install the programs and any data files and
|
||||
documentation. When installing into a prefix owned by root, it is
|
||||
recommended that the package be configured and built as a regular
|
||||
user, and only the `make install' phase executed with root
|
||||
privileges.
|
||||
|
||||
5. Optionally, type `make installcheck' to repeat any self-tests, but
|
||||
this time using the binaries in their final installed location.
|
||||
This target does not install anything. Running this target as a
|
||||
regular user, particularly if the prior `make install' required
|
||||
root privileges, verifies that the installation completed
|
||||
correctly.
|
||||
|
||||
6. You can remove the program binaries and object files from the
|
||||
source code directory by typing `make clean'. To also remove the
|
||||
files that `configure' created (so you can compile the package for
|
||||
a different kind of computer), type `make distclean'. There is
|
||||
also a `make maintainer-clean' target, but that is intended mainly
|
||||
for the package's developers. If you use it, you may have to get
|
||||
all sorts of other programs in order to regenerate files that came
|
||||
with the distribution.
|
||||
|
||||
7. Often, you can also type `make uninstall' to remove the installed
|
||||
files again. In practice, not all packages have tested that
|
||||
uninstallation works correctly, even though it is required by the
|
||||
GNU Coding Standards.
|
||||
|
||||
8. Some packages, particularly those that use Automake, provide `make
|
||||
distcheck', which can by used by developers to test that all other
|
||||
targets like `make install' and `make uninstall' work correctly.
|
||||
This target is generally not run by end users.
|
||||
|
||||
Compilers and Options
|
||||
=====================
|
||||
|
||||
Some systems require unusual options for compilation or linking that
|
||||
the `configure' script does not know about. Run `./configure --help'
|
||||
for details on some of the pertinent environment variables.
|
||||
|
||||
You can give `configure' initial values for configuration parameters
|
||||
by setting variables in the command line or in the environment. Here
|
||||
is an example:
|
||||
|
||||
./configure CC=c99 CFLAGS=-g LIBS=-lposix
|
||||
|
||||
*Note Defining Variables::, for more details.
|
||||
|
||||
Compiling For Multiple Architectures
|
||||
====================================
|
||||
|
||||
You can compile the package for more than one kind of computer at the
|
||||
same time, by placing the object files for each architecture in their
|
||||
own directory. To do this, you can use GNU `make'. `cd' to the
|
||||
directory where you want the object files and executables to go and run
|
||||
the `configure' script. `configure' automatically checks for the
|
||||
source code in the directory that `configure' is in and in `..'. This
|
||||
is known as a "VPATH" build.
|
||||
|
||||
With a non-GNU `make', it is safer to compile the package for one
|
||||
architecture at a time in the source code directory. After you have
|
||||
installed the package for one architecture, use `make distclean' before
|
||||
reconfiguring for another architecture.
|
||||
|
||||
On MacOS X 10.5 and later systems, you can create libraries and
|
||||
executables that work on multiple system types--known as "fat" or
|
||||
"universal" binaries--by specifying multiple `-arch' options to the
|
||||
compiler but only a single `-arch' option to the preprocessor. Like
|
||||
this:
|
||||
|
||||
./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||
CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||
CPP="gcc -E" CXXCPP="g++ -E"
|
||||
|
||||
This is not guaranteed to produce working output in all cases, you
|
||||
may have to build one architecture at a time and combine the results
|
||||
using the `lipo' tool if you have problems.
|
||||
|
||||
Installation Names
|
||||
==================
|
||||
|
||||
By default, `make install' installs the package's commands under
|
||||
`/usr/local/bin', include files under `/usr/local/include', etc. You
|
||||
can specify an installation prefix other than `/usr/local' by giving
|
||||
`configure' the option `--prefix=PREFIX', where PREFIX must be an
|
||||
absolute file name.
|
||||
|
||||
You can specify separate installation prefixes for
|
||||
architecture-specific files and architecture-independent files. If you
|
||||
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
|
||||
PREFIX as the prefix for installing programs and libraries.
|
||||
Documentation and other data files still use the regular prefix.
|
||||
|
||||
In addition, if you use an unusual directory layout you can give
|
||||
options like `--bindir=DIR' to specify different values for particular
|
||||
kinds of files. Run `configure --help' for a list of the directories
|
||||
you can set and what kinds of files go in them. In general, the
|
||||
default for these options is expressed in terms of `${prefix}', so that
|
||||
specifying just `--prefix' will affect all of the other directory
|
||||
specifications that were not explicitly provided.
|
||||
|
||||
The most portable way to affect installation locations is to pass the
|
||||
correct locations to `configure'; however, many packages provide one or
|
||||
both of the following shortcuts of passing variable assignments to the
|
||||
`make install' command line to change installation locations without
|
||||
having to reconfigure or recompile.
|
||||
|
||||
The first method involves providing an override variable for each
|
||||
affected directory. For example, `make install
|
||||
prefix=/alternate/directory' will choose an alternate location for all
|
||||
directory configuration variables that were expressed in terms of
|
||||
`${prefix}'. Any directories that were specified during `configure',
|
||||
but not in terms of `${prefix}', must each be overridden at install
|
||||
time for the entire installation to be relocated. The approach of
|
||||
makefile variable overrides for each directory variable is required by
|
||||
the GNU Coding Standards, and ideally causes no recompilation.
|
||||
However, some platforms have known limitations with the semantics of
|
||||
shared libraries that end up requiring recompilation when using this
|
||||
method, particularly noticeable in packages that use GNU Libtool.
|
||||
|
||||
The second method involves providing the `DESTDIR' variable. For
|
||||
example, `make install DESTDIR=/alternate/directory' will prepend
|
||||
`/alternate/directory' before all installation names. The approach of
|
||||
`DESTDIR' overrides is not required by the GNU Coding Standards, and
|
||||
does not work on platforms that have drive letters. On the other hand,
|
||||
it does better at avoiding recompilation issues, and works well even
|
||||
when some directory options were not specified in terms of `${prefix}'
|
||||
at `configure' time.
|
||||
|
||||
Optional Features
|
||||
=================
|
||||
|
||||
If the package supports it, you can cause programs to be installed
|
||||
with an extra prefix or suffix on their names by giving `configure' the
|
||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
||||
|
||||
Some packages pay attention to `--enable-FEATURE' options to
|
||||
`configure', where FEATURE indicates an optional part of the package.
|
||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||
is something like `gnu-as' or `x' (for the X Window System). The
|
||||
`README' should mention any `--enable-' and `--with-' options that the
|
||||
package recognizes.
|
||||
|
||||
For packages that use the X Window System, `configure' can usually
|
||||
find the X include and library files automatically, but if it doesn't,
|
||||
you can use the `configure' options `--x-includes=DIR' and
|
||||
`--x-libraries=DIR' to specify their locations.
|
||||
|
||||
Some packages offer the ability to configure how verbose the
|
||||
execution of `make' will be. For these packages, running `./configure
|
||||
--enable-silent-rules' sets the default to minimal output, which can be
|
||||
overridden with `make V=1'; while running `./configure
|
||||
--disable-silent-rules' sets the default to verbose, which can be
|
||||
overridden with `make V=0'.
|
||||
|
||||
Particular systems
|
||||
==================
|
||||
|
||||
On HP-UX, the default C compiler is not ANSI C compatible. If GNU
|
||||
CC is not installed, it is recommended to use the following options in
|
||||
order to use an ANSI C compiler:
|
||||
|
||||
./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
|
||||
|
||||
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
|
||||
|
||||
HP-UX `make' updates targets which have the same time stamps as
|
||||
their prerequisites, which makes it generally unusable when shipped
|
||||
generated files such as `configure' are involved. Use GNU `make'
|
||||
instead.
|
||||
|
||||
On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
|
||||
parse its `<wchar.h>' header file. The option `-nodtk' can be used as
|
||||
a workaround. If GNU CC is not installed, it is therefore recommended
|
||||
to try
|
||||
|
||||
./configure CC="cc"
|
||||
|
||||
and if that doesn't work, try
|
||||
|
||||
./configure CC="cc -nodtk"
|
||||
|
||||
On Solaris, don't put `/usr/ucb' early in your `PATH'. This
|
||||
directory contains several dysfunctional programs; working variants of
|
||||
these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
|
||||
in your `PATH', put it _after_ `/usr/bin'.
|
||||
|
||||
On Haiku, software installed for all users goes in `/boot/common',
|
||||
not `/usr/local'. It is recommended to use the following options:
|
||||
|
||||
./configure --prefix=/boot/common
|
||||
|
||||
Specifying the System Type
|
||||
==========================
|
||||
|
||||
There may be some features `configure' cannot figure out
|
||||
automatically, but needs to determine by the type of machine the package
|
||||
will run on. Usually, assuming the package is built to be run on the
|
||||
_same_ architectures, `configure' can figure that out, but if it prints
|
||||
a message saying it cannot guess the machine type, give it the
|
||||
`--build=TYPE' option. TYPE can either be a short name for the system
|
||||
type, such as `sun4', or a canonical name which has the form:
|
||||
|
||||
CPU-COMPANY-SYSTEM
|
||||
|
||||
where SYSTEM can have one of these forms:
|
||||
|
||||
OS
|
||||
KERNEL-OS
|
||||
|
||||
See the file `config.sub' for the possible values of each field. If
|
||||
`config.sub' isn't included in this package, then this package doesn't
|
||||
need to know the machine type.
|
||||
|
||||
If you are _building_ compiler tools for cross-compiling, you should
|
||||
use the option `--target=TYPE' to select the type of system they will
|
||||
produce code for.
|
||||
|
||||
If you want to _use_ a cross compiler, that generates code for a
|
||||
platform different from the build platform, you should specify the
|
||||
"host" platform (i.e., that on which the generated programs will
|
||||
eventually be run) with `--host=TYPE'.
|
||||
|
||||
Sharing Defaults
|
||||
================
|
||||
|
||||
If you want to set default values for `configure' scripts to share,
|
||||
you can create a site shell script called `config.site' that gives
|
||||
default values for variables like `CC', `cache_file', and `prefix'.
|
||||
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
||||
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||
`CONFIG_SITE' environment variable to the location of the site script.
|
||||
A warning: not all `configure' scripts look for a site script.
|
||||
|
||||
Defining Variables
|
||||
==================
|
||||
|
||||
Variables not defined in a site shell script can be set in the
|
||||
environment passed to `configure'. However, some packages may run
|
||||
configure again during the build, and the customized values of these
|
||||
variables may be lost. In order to avoid this problem, you should set
|
||||
them in the `configure' command line, using `VAR=value'. For example:
|
||||
|
||||
./configure CC=/usr/local2/bin/gcc
|
||||
|
||||
causes the specified `gcc' to be used as the C compiler (unless it is
|
||||
overridden in the site shell script).
|
||||
|
||||
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
|
||||
an Autoconf limitation. Until the limitation is lifted, you can use
|
||||
this workaround:
|
||||
|
||||
CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
|
||||
|
||||
`configure' Invocation
|
||||
======================
|
||||
|
||||
`configure' recognizes the following options to control how it
|
||||
operates.
|
||||
|
||||
`--help'
|
||||
`-h'
|
||||
Print a summary of all of the options to `configure', and exit.
|
||||
|
||||
`--help=short'
|
||||
`--help=recursive'
|
||||
Print a summary of the options unique to this package's
|
||||
`configure', and exit. The `short' variant lists options used
|
||||
only in the top level, while the `recursive' variant lists options
|
||||
also present in any nested packages.
|
||||
|
||||
`--version'
|
||||
`-V'
|
||||
Print the version of Autoconf used to generate the `configure'
|
||||
script, and exit.
|
||||
|
||||
`--cache-file=FILE'
|
||||
Enable the cache: use and save the results of the tests in FILE,
|
||||
traditionally `config.cache'. FILE defaults to `/dev/null' to
|
||||
disable caching.
|
||||
|
||||
`--config-cache'
|
||||
`-C'
|
||||
Alias for `--cache-file=config.cache'.
|
||||
|
||||
`--quiet'
|
||||
`--silent'
|
||||
`-q'
|
||||
Do not print messages saying which checks are being made. To
|
||||
suppress all normal output, redirect it to `/dev/null' (any error
|
||||
messages will still be shown).
|
||||
|
||||
`--srcdir=DIR'
|
||||
Look for the package's source code in directory DIR. Usually
|
||||
`configure' can determine that directory automatically.
|
||||
|
||||
`--prefix=DIR'
|
||||
Use DIR as the installation prefix. *note Installation Names::
|
||||
for more details, including other options available for fine-tuning
|
||||
the installation locations.
|
||||
|
||||
`--no-create'
|
||||
`-n'
|
||||
Run the configure checks, but stop before creating any output
|
||||
files.
|
||||
|
||||
`configure' also accepts some other, not widely useful, options. Run
|
||||
`configure --help' for more details.
|
||||
@@ -1,17 +0,0 @@
|
||||
AM_CFLAGS = \
|
||||
@ADD_CFLAGS@ \
|
||||
-I$(top_srcdir)/common \
|
||||
-I$(top_srcdir)/libparser \
|
||||
-I$(top_srcdir)/libresolver \
|
||||
-I$(top_srcdir)/libbuffers \
|
||||
-I$(top_srcdir)/libui
|
||||
|
||||
SUBDIRS = libparser libresolver libbuffers libui .
|
||||
|
||||
itti_analyzer_LDADD = \
|
||||
$(top_builddir)/libui/libui.la \
|
||||
$(top_builddir)/libparser/libparser.la \
|
||||
$(top_builddir)/libresolver/libresolver.la \
|
||||
$(top_builddir)/libbuffers/libbuffers.la
|
||||
|
||||
bin_PROGRAMS = itti_analyzer
|
||||
@@ -1,14 +0,0 @@
|
||||
|
||||
To run itti_analyzer, please perform the following actions:
|
||||
|
||||
1) apt-get install autotools-dev automake libtool
|
||||
|
||||
2) libtoolize
|
||||
|
||||
3) ./autogen.sh
|
||||
|
||||
4) ./configure
|
||||
|
||||
5) make
|
||||
|
||||
6) ./itti_analyzer
|
||||
@@ -1,6 +0,0 @@
|
||||
#! /bin/sh
|
||||
|
||||
aclocal \
|
||||
&& autoheader \
|
||||
&& automake --add-missing \
|
||||
&& autoconf
|
||||
@@ -1,73 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/** @brief Intertask Interface common types
|
||||
* Contains type definitions used for generating and parsing ITTI messages.
|
||||
* @author Laurent Winckel <laurent.winckel@eurecom.fr>
|
||||
*/
|
||||
|
||||
#ifndef _ITTI_TYPES_H_
|
||||
#define _ITTI_TYPES_H_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#define CHARS_TO_UINT32(c1, c2, c3, c4) (((c4) << 24) | ((c3) << 16) | ((c2) << 8) | (c1))
|
||||
|
||||
#define MESSAGE_NUMBER_CHAR_FORMAT "%11u"
|
||||
|
||||
/* Intertask message types */
|
||||
enum itti_message_types_e
|
||||
{
|
||||
ITTI_DUMP_XML_DEFINITION = CHARS_TO_UINT32 ('\n', 'I', 'x', 'd'),
|
||||
ITTI_DUMP_XML_DEFINITION_END = CHARS_TO_UINT32 ('i', 'X', 'D', '\n'),
|
||||
|
||||
ITTI_DUMP_MESSAGE_TYPE = CHARS_TO_UINT32 ('\n', 'I', 'm', 's'),
|
||||
ITTI_DUMP_MESSAGE_TYPE_END = CHARS_TO_UINT32 ('i', 'M', 'S', '\n'),
|
||||
|
||||
ITTI_STATISTIC_MESSAGE_TYPE = CHARS_TO_UINT32 ('\n', 'I', 's', 't'),
|
||||
ITTI_STATISTIC_MESSAGE_TYPE_END = CHARS_TO_UINT32 ('i', 'S', 'T', '\n'),
|
||||
|
||||
/* This signal is not meant to be used by remote analyzer */
|
||||
ITTI_DUMP_EXIT_SIGNAL = CHARS_TO_UINT32 ('e', 'X', 'I', 'T'),
|
||||
};
|
||||
|
||||
typedef uint32_t itti_message_types_t;
|
||||
|
||||
/* Message header is the common part that should never change between
|
||||
* remote process and this one.
|
||||
*/
|
||||
typedef struct {
|
||||
/* The size of this structure */
|
||||
uint32_t message_size;
|
||||
itti_message_types_t message_type;
|
||||
} itti_socket_header_t;
|
||||
|
||||
typedef struct {
|
||||
char message_number_char[12]; /* 9 chars are needed to store an unsigned 32 bits value in decimal, but must be a multiple of 32 bits to avoid alignment issues */
|
||||
} itti_signal_header_t;
|
||||
|
||||
|
||||
#define INSTANCE_DEFAULT (UINT16_MAX - 1)
|
||||
#define INSTANCE_ALL (UINT16_MAX)
|
||||
|
||||
typedef uint16_t instance_t;
|
||||
|
||||
#endif
|
||||
@@ -1,56 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*
|
||||
* logs.h
|
||||
*
|
||||
* Created on: Nov 22, 2013
|
||||
* Author: Laurent Winckel
|
||||
*/
|
||||
|
||||
#ifndef LOGS_H_
|
||||
#define LOGS_H_
|
||||
|
||||
/* Added definition of the g_info log function to complete the set of log functions from "gmessages.h" */
|
||||
|
||||
#include <glib/gmessages.h>
|
||||
|
||||
#ifdef G_HAVE_ISO_VARARGS
|
||||
|
||||
#define g_info(...) g_log (G_LOG_DOMAIN, \
|
||||
G_LOG_LEVEL_INFO, \
|
||||
__VA_ARGS__)
|
||||
|
||||
#else
|
||||
|
||||
static void
|
||||
g_info (const gchar *format,
|
||||
...)
|
||||
{
|
||||
va_list args;
|
||||
va_start (args, format);
|
||||
g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format, args);
|
||||
va_end (args);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* LOGS_H_ */
|
||||
@@ -1,71 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifndef RC_H_
|
||||
#define RC_H_
|
||||
|
||||
#define RC_OK 0
|
||||
#define RC_FAIL -1
|
||||
#define RC_BAD_PARAM -2
|
||||
#define RC_NULL_POINTER -3
|
||||
|
||||
static const char * const rc_strings[] =
|
||||
{"Ok", "fail", "bad parameter", "null pointer"};
|
||||
|
||||
#define CHECK_FCT(fCT) \
|
||||
do { \
|
||||
int rET; \
|
||||
if ((rET = fCT) != RC_OK) { \
|
||||
fprintf(stderr, #fCT" has failed (%s:%d)\n", __FILE__, __LINE__); \
|
||||
return rET; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#define CHECK_FCT_POSIX(fCT) \
|
||||
do { \
|
||||
if (fCT == -1) { \
|
||||
fprintf(stderr, #fCT" has failed (%d:%s) (%s:%d)\n", errno, \
|
||||
strerror(errno), __FILE__, __LINE__); \
|
||||
return RC_FAIL; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#define CHECK_FCT_DO(fCT, dO) \
|
||||
do { \
|
||||
int rET; \
|
||||
if ((rET = fCT) != RC_OK) { \
|
||||
fprintf(stderr, #fCT" has returned %d (%s:%d)\n", rET, __FILE__, __LINE__); \
|
||||
dO; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#define CHECK_BUFFER(bUFFER) \
|
||||
do { \
|
||||
if ((bUFFER) == NULL) { \
|
||||
fprintf(stderr, #bUFFER" is NULL (%s:%d)\n", __FILE__, __LINE__); \
|
||||
return RC_NULL_POINTER; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#endif /* RC_H_ */
|
||||
@@ -1,97 +0,0 @@
|
||||
AC_PREREQ([2.68])
|
||||
|
||||
define([svnversion], esyscmd([sh -c "svnversion ..|tr -d '\n'"]))
|
||||
|
||||
AC_DEFINE(SVN_REVISION, "svnversion", [SVN Revision])
|
||||
|
||||
AC_INIT([itti_analyzer], [0.2.svnversion], [openair_admin@eurecom.fr])
|
||||
AC_CANONICAL_BUILD
|
||||
AC_CANONICAL_TARGET
|
||||
AM_INIT_AUTOMAKE([1.11 silent-rules])
|
||||
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
|
||||
AM_MAINTAINER_MODE
|
||||
|
||||
AM_SILENT_RULES([yes])
|
||||
|
||||
AM_PROG_LIBTOOL
|
||||
|
||||
AC_PROG_RANLIB
|
||||
AC_PROG_CXX
|
||||
|
||||
AC_FUNC_ALLOCA
|
||||
AC_FUNC_MALLOC
|
||||
AC_FUNC_REALLOC
|
||||
|
||||
AC_TYPE_SIZE_T
|
||||
AC_TYPE_SSIZE_T
|
||||
AC_TYPE_INT8_T
|
||||
AC_TYPE_INT16_T
|
||||
AC_TYPE_INT32_T
|
||||
AC_TYPE_INT64_T
|
||||
AC_TYPE_UINT8_T
|
||||
AC_TYPE_UINT16_T
|
||||
AC_TYPE_UINT32_T
|
||||
AC_TYPE_UINT64_T
|
||||
|
||||
AC_CHECK_FUNCS([memset])
|
||||
AC_CHECK_FUNCS([socket])
|
||||
AC_CHECK_FUNCS([strdup])
|
||||
AC_CHECK_FUNCS([strerror])
|
||||
AC_CHECK_FUNCS([select])
|
||||
AC_CHECK_FUNCS([strstr])
|
||||
|
||||
AC_CHECK_HEADERS([arpa/inet.h])
|
||||
AC_CHECK_HEADERS([fcntl.h])
|
||||
AC_CHECK_HEADERS([libintl.h])
|
||||
AC_CHECK_HEADERS([malloc.h])
|
||||
AC_CHECK_HEADERS([stddef.h])
|
||||
AC_CHECK_HEADERS([netinet/in.h])
|
||||
|
||||
AC_CHECK_LIB(m, log10)
|
||||
|
||||
PKG_CHECK_MODULES(XML2, [libxml-2.0 >= 2.7.8], [HAVE_XML2=true], [AC_MSG_ERROR(lixml-2.0 not installed)])
|
||||
CFLAGS="$CFLAGS $XML2_CFLAGS"
|
||||
LIBS="$LIBS $XML2_LIBS"
|
||||
|
||||
AM_PATH_GTK_3_0(3.0.0, [], AC_MSG_ERROR(Requirement not met: gtk >= 3.0.0))
|
||||
CFLAGS="$CFLAGS $GTK_CFLAGS"
|
||||
LIBS="$LIBS $GTK_LIBS"
|
||||
|
||||
dnl Add these flags
|
||||
CFLAGS="$CFLAGS -Wall"
|
||||
CFLAGS="$CFLAGS -Wshadow"
|
||||
CFLAGS="$CFLAGS -Wcast-align"
|
||||
CFLAGS="$CFLAGS -Wchar-subscripts"
|
||||
CFLAGS="$CFLAGS -Wmissing-prototypes"
|
||||
CFLAGS="$CFLAGS -Wmissing-declarations"
|
||||
CFLAGS="$CFLAGS -Werror=implicit-function-declaration"
|
||||
|
||||
AC_SUBST([AM_CFLAGS])
|
||||
AC_SUBST(ADD_CFLAGS)
|
||||
|
||||
dnl *** Autoconf support ***
|
||||
AC_ARG_ENABLE(autoconf,
|
||||
[ --disable-autoconf disable automatic generation of configure script ],
|
||||
enable_autoconf=$enableval, enable_autoconf=yes
|
||||
)
|
||||
AC_PATH_PROG(AUTOCONF, autoconf, @echo autoconf not available)
|
||||
AC_PATH_PROG(AUTOHEADER, autoheader, @echo autoheader not available)
|
||||
if test -z "$AUTOCONF"; then enable_autoconf=no ; fi
|
||||
if test -z "$AUTOHEADER"; then enable_autoconf=no ; fi
|
||||
if test x$enable_autoconf = xyes; then
|
||||
CONFIGURE_DEPENDS="configure.in aclocal.m4"
|
||||
fi
|
||||
AC_SUBST(CONFIGURE_DEPENDS)
|
||||
|
||||
AC_CONFIG_FILES(
|
||||
libbuffers/Makefile \
|
||||
libparser/Makefile \
|
||||
libresolver/Makefile \
|
||||
libui/Makefile \
|
||||
Makefile \
|
||||
)
|
||||
AC_OUTPUT
|
||||
@@ -1,135 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<filters>
|
||||
<messages>
|
||||
<INITIALIZE_MESSAGE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<ACTIVATE_MESSAGE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<DEACTIVATE_MESSAGE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<TERMINATE_MESSAGE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<MESSAGE_TEST enabled="0" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<ERROR_LOG enabled="1" foreground_color="#000000" background_color="#ff8080"/>
|
||||
<WARNING_LOG enabled="1" foreground_color="#303030" background_color="#fff050"/>
|
||||
<NOTICE_LOG enabled="0" foreground_color="#585858" background_color="#ffffa0"/>
|
||||
<INFO_LOG enabled="0" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<DEBUG_LOG enabled="0" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<GENERIC_LOG enabled="1" foreground_color="#246b24" background_color="#ffffff"/>
|
||||
<TIMER_HAS_EXPIRED enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<PHY_DEACTIVATE_REQ enabled="1" foreground_color="#000000" background_color="#bef2ff"/>
|
||||
<PHY_FIND_CELL_REQ enabled="1" foreground_color="#000000" background_color="#bef2ff"/>
|
||||
<PHY_FIND_NEXT_CELL_REQ enabled="1" foreground_color="#000000" background_color="#bef2ff"/>
|
||||
<PHY_FIND_CELL_IND enabled="1" foreground_color="#585858" background_color="#bef2ff"/>
|
||||
<RRC_MAC_IN_SYNC_IND enabled="0" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_MAC_OUT_OF_SYNC_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_MAC_BCCH_DATA_REQ enabled="0" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_MAC_BCCH_DATA_IND enabled="0" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_MAC_CCCH_DATA_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_MAC_CCCH_DATA_CNF enabled="0" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_MAC_CCCH_DATA_IND enabled="1" foreground_color="#585858" background_color="#dfb9fc"/>
|
||||
<RRC_MAC_MCCH_DATA_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_MAC_MCCH_DATA_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_DCCH_DATA_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_DCCH_DATA_IND enabled="1" foreground_color="#585858" background_color="#a7b1de"/>
|
||||
<RRC_STATE_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_CONFIGURATION_REQ enabled="1" foreground_color="#ffffff" background_color="#4d2a73"/>
|
||||
<NAS_CELL_SELECTION_REQ enabled="1" foreground_color="#ffffff" background_color="#2d315c"/>
|
||||
<NAS_CONN_ESTABLI_REQ enabled="1" foreground_color="#ffffff" background_color="#2d315c"/>
|
||||
<NAS_UPLINK_DATA_REQ enabled="1" foreground_color="#ffffff" background_color="#2d315c"/>
|
||||
<NAS_RAB_ESTABLI_RSP enabled="1" foreground_color="#ffffff" background_color="#2d315c"/>
|
||||
<NAS_CELL_SELECTION_CNF enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
|
||||
<NAS_CELL_SELECTION_IND enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
|
||||
<NAS_PAGING_IND enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
|
||||
<NAS_CONN_ESTABLI_CNF enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
|
||||
<NAS_CONN_RELEASE_IND enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
|
||||
<NAS_UPLINK_DATA_CNF enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
|
||||
<NAS_DOWNLINK_DATA_IND enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
|
||||
<S1AP_REGISTER_ENB_REQ enabled="1" foreground_color="#000000" background_color="#cbffb1"/>
|
||||
<S1AP_REGISTER_ENB_CNF enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
|
||||
<S1AP_DEREGISTERED_ENB_IND enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
|
||||
<S1AP_NAS_FIRST_REQ enabled="1" foreground_color="#000000" background_color="#cbffb1"/>
|
||||
<S1AP_UPLINK_NAS enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
|
||||
<S1AP_UE_CAPABILITIES_IND enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
|
||||
<S1AP_INITIAL_CONTEXT_SETUP_RESP enabled="1" foreground_color="#19431e" background_color="#cbffb1"/>
|
||||
<S1AP_INITIAL_CONTEXT_SETUP_FAIL enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
|
||||
<S1AP_NAS_NON_DELIVERY_IND enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
|
||||
<S1AP_UE_CONTEXT_RELEASE_RESP enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
|
||||
<S1AP_UE_CTXT_MODIFICATION_RESP enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
|
||||
<S1AP_UE_CTXT_MODIFICATION_FAIL enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
|
||||
<S1AP_DOWNLINK_NAS enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
|
||||
<S1AP_INITIAL_CONTEXT_SETUP_REQ enabled="1" foreground_color="#000000" background_color="#cbffb1"/>
|
||||
<S1AP_UE_CTXT_MODIFICATION_REQ enabled="1" foreground_color="#000000" background_color="#cbffb1"/>
|
||||
<S1AP_PAGING_IND enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
|
||||
<S1AP_UE_CONTEXT_RELEASE_REQ enabled="1" foreground_color="#000000" background_color="#cbffb1"/>
|
||||
<SCTP_NEW_ASSOCIATION_REQ enabled="0" foreground_color="#000000" background_color="#aefeff"/>
|
||||
<SCTP_NEW_ASSOCIATION_RESP enabled="0" foreground_color="#585858" background_color="#aefeff"/>
|
||||
<SCTP_NEW_ASSOCIATION_IND enabled="1" foreground_color="#585858" background_color="#aefeff"/>
|
||||
<SCTP_REGISTER_UPPER_LAYER enabled="1" foreground_color="#585858" background_color="#aefeff"/>
|
||||
<SCTP_DATA_REQ enabled="1" foreground_color="#000000" background_color="#aefeff"/>
|
||||
<SCTP_DATA_IND enabled="1" foreground_color="#585858" background_color="#aefeff"/>
|
||||
<RRC_RAL_SYSTEM_CONFIGURATION_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_SYSTEM_INFORMATION_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_SCAN_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_SCAN_CONF enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_CONFIGURE_THRESHOLD_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_CONFIGURE_THRESHOLD_CONF enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_MEASUREMENT_REPORT_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_CONNECTION_ESTABLISHMENT_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_CONNECTION_ESTABLISHMENT_CONF enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_CONNECTION_ESTABLISHMENT_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_CONNECTION_REESTABLISHMENT_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_CONNECTION_RECONFIGURATION_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_CONNECTION_RECONFIGURATION_HO_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_CONNECTION_RELEASE_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_CONNECTION_RELEASE_CONF enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_CONNECTION_RELEASE_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<NAS_UPLINK_DATA_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
</messages>
|
||||
<origin_tasks>
|
||||
<TASK_UNKNOWN enabled="1"/>
|
||||
<TASK_TIMER enabled="1"/>
|
||||
<TASK_L2L1 enabled="1"/>
|
||||
<TASK_BM enabled="1"/>
|
||||
<TASK_PHY_ENB enabled="1"/>
|
||||
<TASK_MAC_ENB enabled="1"/>
|
||||
<TASK_RLC_ENB enabled="1"/>
|
||||
<TASK_PDCP_ENB enabled="1"/>
|
||||
<TASK_DATA_FORWARDING enabled="1"/>
|
||||
<TASK_END_MARKER enabled="1"/>
|
||||
<TASK_RRC_ENB enabled="1"/>
|
||||
<TASK_RAL_ENB enabled="1"/>
|
||||
<TASK_S1AP enabled="1"/>
|
||||
<TASK_X2AP enabled="1"/>
|
||||
<TASK_SCTP enabled="1"/>
|
||||
<TASK_ENB_APP enabled="1"/>
|
||||
<TASK_PHY_UE enabled="1"/>
|
||||
<TASK_MAC_UE enabled="1"/>
|
||||
<TASK_RLC_UE enabled="1"/>
|
||||
<TASK_PDCP_UE enabled="1"/>
|
||||
<TASK_RRC_UE enabled="1"/>
|
||||
<TASK_NAS_UE enabled="1"/>
|
||||
<TASK_RAL_UE enabled="1"/>
|
||||
</origin_tasks>
|
||||
<destination_tasks>
|
||||
<TASK_UNKNOWN enabled="1"/>
|
||||
<TASK_TIMER enabled="1"/>
|
||||
<TASK_L2L1 enabled="1"/>
|
||||
<TASK_BM enabled="1"/>
|
||||
<TASK_PHY_ENB enabled="1"/>
|
||||
<TASK_MAC_ENB enabled="1"/>
|
||||
<TASK_RLC_ENB enabled="1"/>
|
||||
<TASK_PDCP_ENB enabled="1"/>
|
||||
<TASK_DATA_FORWARDING enabled="1"/>
|
||||
<TASK_END_MARKER enabled="1"/>
|
||||
<TASK_RRC_ENB enabled="1"/>
|
||||
<TASK_RAL_ENB enabled="1"/>
|
||||
<TASK_S1AP enabled="1"/>
|
||||
<TASK_X2AP enabled="1"/>
|
||||
<TASK_SCTP enabled="1"/>
|
||||
<TASK_ENB_APP enabled="1"/>
|
||||
<TASK_PHY_UE enabled="1"/>
|
||||
<TASK_MAC_UE enabled="1"/>
|
||||
<TASK_RLC_UE enabled="1"/>
|
||||
<TASK_PDCP_UE enabled="1"/>
|
||||
<TASK_RRC_UE enabled="1"/>
|
||||
<TASK_NAS_UE enabled="1"/>
|
||||
<TASK_RAL_UE enabled="1"/>
|
||||
</destination_tasks>
|
||||
</filters>
|
||||
@@ -1,131 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<filters>
|
||||
<messages>
|
||||
<ACTIVATE_MESSAGE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<DEACTIVATE_MESSAGE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<DEBUG_LOG enabled="0" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<ERROR_LOG enabled="1" foreground_color="#000000" background_color="#ff8080"/>
|
||||
<GENERIC_LOG enabled="1" foreground_color="#246b24" background_color="#ffffff"/>
|
||||
<GTPV1U_CREATE_TUNNEL_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<GTPV1U_CREATE_TUNNEL_RESP enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<GTPV1U_DELETE_TUNNEL_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<GTPV1U_DELETE_TUNNEL_RESP enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<GTPV1U_TUNNEL_DATA_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<GTPV1U_TUNNEL_DATA_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<GTPV1U_UPDATE_TUNNEL_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<GTPV1U_UPDATE_TUNNEL_RESP enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<INFO_LOG enabled="0" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<INITIALIZE_MESSAGE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<MESSAGE_TEST enabled="0" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<MME_APP_CONNECTION_ESTABLISHMENT_IND enabled="1" foreground_color="#90ff40" background_color="#805000"/>
|
||||
<MME_APP_INITIAL_CONTEXT_SETUP_RSP enabled="1" foreground_color="#90ff40" background_color="#805000"/>
|
||||
<NAS_AUTHENTICATION_PARAM_FAIL enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<NAS_AUTHENTICATION_PARAM_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<NAS_AUTHENTICATION_PARAM_RSP enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<NAS_BEARER_PARAM enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<NAS_CONNECTION_ESTABLISHMENT_CNF enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<NAS_CONNECTION_ESTABLISHMENT_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<NAS_CONNECTION_RELEASE_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<NAS_CONN_ESTABLI_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<NAS_DL_EMM_PLAIN_MSG enabled="1" foreground_color="#90ff40" background_color="#805000"/>
|
||||
<NAS_DL_EMM_PROTECTED_MSG enabled="1" foreground_color="#90ff40" background_color="#805000"/>
|
||||
<NAS_DL_EMM_RAW_MSG enabled="1" foreground_color="#90ff40" background_color="#805000"/>
|
||||
<NAS_DL_ESM_PLAIN_MSG enabled="1" foreground_color="#90ff40" background_color="#906010"/>
|
||||
<NAS_DL_ESM_PROTECTED_MSG enabled="1" foreground_color="#90ff40" background_color="#906010"/>
|
||||
<NAS_DL_ESM_RAW_MSG enabled="1" foreground_color="#90ff40" background_color="#906010"/>
|
||||
<NAS_DOWNLINK_DATA_CNF enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<NAS_DOWNLINK_DATA_REJ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<NAS_DOWNLINK_DATA_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<NAS_NON_DELIVERY_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<NAS_PAGING_IND enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
|
||||
<NAS_PDN_CONNECTIVITY_REQ enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
|
||||
<NAS_RAB_ESTABLI_RSP enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<NAS_RAB_ESTABLISHMENT_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<NAS_RAB_ESTABLISHMENT_RESP enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<NAS_RAB_RELEASE_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<NAS_UL_EMM_PLAIN_MSG enabled="1" foreground_color="#ff8080" background_color="#805000"/>
|
||||
<NAS_UL_EMM_PROTECTED_MSG enabled="1" foreground_color="#ff8080" background_color="#805000"/>
|
||||
<NAS_UL_EMM_RAW_MSG enabled="1" foreground_color="#ff8080" background_color="#805000"/>
|
||||
<NAS_UL_ESM_PLAIN_MSG enabled="1" foreground_color="#ff8080" background_color="#906010"/>
|
||||
<NAS_UL_ESM_PROTECTED_MSG enabled="1" foreground_color="#ff8080" background_color="#906010"/>
|
||||
<NAS_UL_ESM_RAW_MSG enabled="1" foreground_color="#ff8080" background_color="#906010"/>
|
||||
<NAS_UPLINK_DATA_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<NAS_UPLINK_DATA_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<NOTICE_LOG enabled="0" foreground_color="#585858" background_color="#ffffa0"/>
|
||||
<S1AP_DEREGISTERED_ENB_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S1AP_DEREGISTER_UE_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S1AP_DOWNLINK_NAS_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S1AP_ENB_DEREGISTERED_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S1AP_INITIAL_CONTEXT_SETUP_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S1AP_INITIAL_CONTEXT_SETUP_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S1AP_INITIAL_UE_MESSAGE_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S1AP_NAS_NON_DELIVERY_IND_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S1AP_REGISTER_ENB_CNF enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S1AP_S1_SETUP_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S1AP_UE_CAPABILITIES_IND enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
|
||||
<S1AP_UE_CAPABILITY_IND_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S1AP_UE_CONTEXT_RELEASE_COMMAND enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
|
||||
<S1AP_UE_CONTEXT_RELEASE_COMPLETE enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
|
||||
<S1AP_UE_CONTEXT_RELEASE_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S1AP_UE_CONTEXT_RELEASE_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S1AP_UE_CONTEXT_RELEASE_REQ_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S1AP_UPLINK_NAS_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S6A_AUTH_INFO_ANS enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S6A_AUTH_INFO_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S6A_UPDATE_LOCATION_ANS enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S6A_UPDATE_LOCATION_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<SCTP_CLOSE_ASSOCIATION enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<SCTP_DATA_IND enabled="1" foreground_color="#585858" background_color="#aefeff"/>
|
||||
<SCTP_DATA_REQ enabled="1" foreground_color="#000000" background_color="#aefeff"/>
|
||||
<SCTP_INIT_MSG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<SCTP_NEW_ASSOCIATION enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<SCTP_NEW_ASSOCIATION_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<SCTP_NEW_ASSOCIATION_REQ enabled="1" foreground_color="#000000" background_color="#aefeff"/>
|
||||
<SCTP_NEW_ASSOCIATION_RESP enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<SGI_CREATE_ENDPOINT_REQUEST enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<SGI_CREATE_ENDPOINT_RESPONSE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<SGI_DELETE_ENDPOINT_REQUEST enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<SGI_DELETE_ENDPOINT_RESPONSE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<SGI_UPDATE_ENDPOINT_REQUEST enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<SGI_UPDATE_ENDPOINT_RESPONSE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<SGW_CREATE_SESSION_REQUEST enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<SGW_CREATE_SESSION_RESPONSE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<SGW_DELETE_SESSION_REQUEST enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<SGW_DELETE_SESSION_RESPONSE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<SGW_MODIFY_BEARER_REQUEST enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<SGW_MODIFY_BEARER_RESPONSE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<SGW_RELEASE_ACCESS_BEARERS_RESPONSE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<TERMINATE_MESSAGE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<TIMER_HAS_EXPIRED enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<UDP_DATA_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<UDP_DATA_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<UDP_INIT enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<WARNING_LOG enabled="1" foreground_color="#303030" background_color="#fff050"/>
|
||||
</messages>
|
||||
<origin_tasks>
|
||||
<TASK_UNKNOWN enabled="1"/>
|
||||
<TASK_TIMER enabled="0"/>
|
||||
<TASK_GTPV1_U enabled="1"/>
|
||||
<TASK_MME_APP enabled="1"/>
|
||||
<TASK_NAS_MME enabled="1"/>
|
||||
<TASK_S11 enabled="1"/>
|
||||
<TASK_S1AP enabled="1"/>
|
||||
<TASK_S6A enabled="1"/>
|
||||
<TASK_SCTP enabled="1"/>
|
||||
<TASK_SPGW_APP enabled="1"/>
|
||||
<TASK_UDP enabled="1"/>
|
||||
</origin_tasks>
|
||||
<destination_tasks>
|
||||
<TASK_UNKNOWN enabled="1"/>
|
||||
<TASK_TIMER enabled="0"/>
|
||||
<TASK_GTPV1_U enabled="1"/>
|
||||
<TASK_MME_APP enabled="1"/>
|
||||
<TASK_NAS_MME enabled="1"/>
|
||||
<TASK_S11 enabled="1"/>
|
||||
<TASK_S1AP enabled="1"/>
|
||||
<TASK_S6A enabled="1"/>
|
||||
<TASK_SCTP enabled="1"/>
|
||||
<TASK_SPGW_APP enabled="1"/>
|
||||
<TASK_UDP enabled="1"/>
|
||||
</destination_tasks>
|
||||
</filters>
|
||||
@@ -1,174 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<filters>
|
||||
<messages>
|
||||
<INITIALIZE_MESSAGE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<ACTIVATE_MESSAGE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<DEACTIVATE_MESSAGE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<TERMINATE_MESSAGE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<MESSAGE_TEST enabled="0" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<ERROR_LOG enabled="1" foreground_color="#000000" background_color="#ff8080"/>
|
||||
<WARNING_LOG enabled="1" foreground_color="#303030" background_color="#fff050"/>
|
||||
<NOTICE_LOG enabled="0" foreground_color="#585858" background_color="#ffffa0"/>
|
||||
<INFO_LOG enabled="0" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<DEBUG_LOG enabled="0" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<GENERIC_LOG enabled="1" foreground_color="#246b24" background_color="#ffffff"/>
|
||||
<TIMER_HAS_EXPIRED enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<NAS_CELL_SELECTION_CNF enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
|
||||
<NAS_CELL_SELECTION_IND enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
|
||||
<NAS_CELL_SELECTION_REQ enabled="1" foreground_color="#ffffff" background_color="#2d315c"/>
|
||||
<NAS_CONN_ESTABLI_CNF enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
|
||||
<NAS_CONN_ESTABLI_REQ enabled="1" foreground_color="#ffffff" background_color="#2d315c"/>
|
||||
<NAS_CONN_RELEASE_IND enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
|
||||
<NAS_DL_EMM_PLAIN_MSG enabled="1" foreground_color="#90ff40" background_color="#805000"/>
|
||||
<NAS_DL_EMM_PROTECTED_MSG enabled="1" foreground_color="#90ff40" background_color="#805000"/>
|
||||
<NAS_DL_EMM_RAW_MSG enabled="1" foreground_color="#90ff40" background_color="#805000"/>
|
||||
<NAS_DL_ESM_PLAIN_MSG enabled="1" foreground_color="#90ff40" background_color="#906010"/>
|
||||
<NAS_DL_ESM_PROTECTED_MSG enabled="1" foreground_color="#90ff40" background_color="#906010"/>
|
||||
<NAS_DL_ESM_RAW_MSG enabled="1" foreground_color="#90ff40" background_color="#906010"/>
|
||||
<NAS_DOWNLINK_DATA_IND enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
|
||||
<NAS_PAGING_IND enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
|
||||
<NAS_RAB_ESTABLI_RSP enabled="1" foreground_color="#ffffff" background_color="#2d315c"/>
|
||||
<NAS_UL_EMM_PLAIN_MSG enabled="1" foreground_color="#ff8080" background_color="#805000"/>
|
||||
<NAS_UL_EMM_PROTECTED_MSG enabled="1" foreground_color="#ff8080" background_color="#805000"/>
|
||||
<NAS_UL_EMM_RAW_MSG enabled="1" foreground_color="#ff8080" background_color="#805000"/>
|
||||
<NAS_UL_ESM_PLAIN_MSG enabled="1" foreground_color="#ff8080" background_color="#906010"/>
|
||||
<NAS_UL_ESM_PROTECTED_MSG enabled="1" foreground_color="#ff8080" background_color="#906010"/>
|
||||
<NAS_UL_ESM_RAW_MSG enabled="1" foreground_color="#ff8080" background_color="#906010"/>
|
||||
<NAS_UPLINK_DATA_CNF enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
|
||||
<NAS_UPLINK_DATA_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<NAS_UPLINK_DATA_REQ enabled="1" foreground_color="#ffffff" background_color="#2d315c"/>
|
||||
<PHY_DEACTIVATE_REQ enabled="1" foreground_color="#000000" background_color="#bef2ff"/>
|
||||
<PHY_FIND_CELL_IND enabled="1" foreground_color="#585858" background_color="#bef2ff"/>
|
||||
<PHY_FIND_CELL_REQ enabled="1" foreground_color="#000000" background_color="#bef2ff"/>
|
||||
<PHY_FIND_NEXT_CELL_REQ enabled="1" foreground_color="#000000" background_color="#bef2ff"/>
|
||||
<PHY_MEAS_REPORT_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<PHY_MEAS_THRESHOLD_CONF enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<PHY_MEAS_THRESHOLD_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RLC_AM_DATA_PDU_IND enabled="0" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RLC_AM_DATA_PDU_REQ enabled="0" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RLC_AM_SDU_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RLC_AM_SDU_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RLC_AM_STATUS_PDU_IND enabled="0" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RLC_AM_STATUS_PDU_REQ enabled="0" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RLC_UM_DATA_PDU_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RLC_UM_DATA_PDU_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_CONFIGURATION_REQ enabled="1" foreground_color="#ffffff" background_color="#4d2a73"/>
|
||||
<RRC_DCCH_DATA_IND enabled="1" foreground_color="#585858" background_color="#a7b1de"/>
|
||||
<RRC_DCCH_DATA_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_DL_BCCH enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_DL_CCCH enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_DL_DCCH enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_DL_MCCH enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_MAC_BCCH_DATA_IND enabled="0" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_MAC_BCCH_DATA_REQ enabled="0" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_MAC_CCCH_DATA_CNF enabled="0" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_MAC_CCCH_DATA_IND enabled="1" foreground_color="#585858" background_color="#dfb9fc"/>
|
||||
<RRC_MAC_CCCH_DATA_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_MAC_IN_SYNC_IND enabled="0" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_MAC_MCCH_DATA_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_MAC_MCCH_DATA_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_MAC_OUT_OF_SYNC_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_CONFIGURE_THRESHOLD_CONF enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_CONFIGURE_THRESHOLD_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_CONNECTION_ESTABLISHMENT_CONF enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_CONNECTION_ESTABLISHMENT_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_CONNECTION_ESTABLISHMENT_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_CONNECTION_RECONFIGURATION_HO_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_CONNECTION_RECONFIGURATION_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_CONNECTION_REESTABLISHMENT_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_CONNECTION_RELEASE_CONF enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_CONNECTION_RELEASE_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_CONNECTION_RELEASE_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_MEASUREMENT_REPORT_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_SCAN_CONF enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_SCAN_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_SYSTEM_CONFIGURATION_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_RAL_SYSTEM_INFORMATION_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_STATE_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_UE_EUTRA_CAPABILITY enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_UL_CCCH enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<RRC_UL_DCCH enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S1AP_DEREGISTERED_ENB_IND enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
|
||||
<S1AP_DOWNLINK_NAS enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
|
||||
<S1AP_DOWNLINK_NAS_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S1AP_INITIAL_CONTEXT_SETUP_FAIL enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
|
||||
<S1AP_INITIAL_CONTEXT_SETUP_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S1AP_INITIAL_CONTEXT_SETUP_REQ enabled="1" foreground_color="#000000" background_color="#cbffb1"/>
|
||||
<S1AP_INITIAL_CONTEXT_SETUP_RESP enabled="1" foreground_color="#19431e" background_color="#cbffb1"/>
|
||||
<S1AP_INITIAL_UE_MESSAGE_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S1AP_NAS_FIRST_REQ enabled="1" foreground_color="#000000" background_color="#cbffb1"/>
|
||||
<S1AP_NAS_NON_DELIVERY_IND enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
|
||||
<S1AP_NAS_NON_DELIVERY_IND_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S1AP_PAGING_IND enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
|
||||
<S1AP_REGISTER_ENB_CNF enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
|
||||
<S1AP_REGISTER_ENB_REQ enabled="1" foreground_color="#000000" background_color="#cbffb1"/>
|
||||
<S1AP_S1_SETUP_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S1AP_UE_CAPABILITIES_IND enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
|
||||
<S1AP_UE_CAPABILITY_IND_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S1AP_UE_CONTEXT_RELEASE_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S1AP_UE_CONTEXT_RELEASE_REQ enabled="1" foreground_color="#000000" background_color="#cbffb1"/>
|
||||
<S1AP_UE_CONTEXT_RELEASE_REQ_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<S1AP_UE_CONTEXT_RELEASE_RESP enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
|
||||
<S1AP_UE_CTXT_MODIFICATION_FAIL enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
|
||||
<S1AP_UE_CTXT_MODIFICATION_REQ enabled="1" foreground_color="#000000" background_color="#cbffb1"/>
|
||||
<S1AP_UE_CTXT_MODIFICATION_RESP enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
|
||||
<S1AP_UPLINK_NAS enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
|
||||
<S1AP_UPLINK_NAS_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
|
||||
<SCTP_DATA_IND enabled="1" foreground_color="#585858" background_color="#aefeff"/>
|
||||
<SCTP_DATA_REQ enabled="1" foreground_color="#000000" background_color="#aefeff"/>
|
||||
<SCTP_NEW_ASSOCIATION_IND enabled="1" foreground_color="#585858" background_color="#aefeff"/>
|
||||
<SCTP_NEW_ASSOCIATION_REQ enabled="1" foreground_color="#000000" background_color="#aefeff"/>
|
||||
<SCTP_NEW_ASSOCIATION_RESP enabled="1" foreground_color="#585858" background_color="#aefeff"/>
|
||||
<SCTP_REGISTER_UPPER_LAYER enabled="1" foreground_color="#585858" background_color="#aefeff"/>
|
||||
</messages>
|
||||
<origin_tasks>
|
||||
<TASK_UNKNOWN enabled="1"/>
|
||||
<TASK_TIMER enabled="1"/>
|
||||
<TASK_L2L1 enabled="1"/>
|
||||
<TASK_BM enabled="1"/>
|
||||
<TASK_PHY_ENB enabled="1"/>
|
||||
<TASK_MAC_ENB enabled="1"/>
|
||||
<TASK_RLC_ENB enabled="1"/>
|
||||
<TASK_PDCP_ENB enabled="1"/>
|
||||
<TASK_DATA_FORWARDING enabled="1"/>
|
||||
<TASK_END_MARKER enabled="1"/>
|
||||
<TASK_RRC_ENB enabled="1"/>
|
||||
<TASK_RAL_ENB enabled="1"/>
|
||||
<TASK_S1AP enabled="1"/>
|
||||
<TASK_X2AP enabled="1"/>
|
||||
<TASK_SCTP enabled="1"/>
|
||||
<TASK_ENB_APP enabled="1"/>
|
||||
<TASK_PHY_UE enabled="1"/>
|
||||
<TASK_MAC_UE enabled="1"/>
|
||||
<TASK_RLC_UE enabled="1"/>
|
||||
<TASK_PDCP_UE enabled="1"/>
|
||||
<TASK_RRC_UE enabled="1"/>
|
||||
<TASK_NAS_UE enabled="1"/>
|
||||
<TASK_RAL_UE enabled="1"/>
|
||||
</origin_tasks>
|
||||
<destination_tasks>
|
||||
<TASK_UNKNOWN enabled="1"/>
|
||||
<TASK_TIMER enabled="1"/>
|
||||
<TASK_L2L1 enabled="1"/>
|
||||
<TASK_BM enabled="1"/>
|
||||
<TASK_PHY_ENB enabled="1"/>
|
||||
<TASK_MAC_ENB enabled="1"/>
|
||||
<TASK_RLC_ENB enabled="1"/>
|
||||
<TASK_PDCP_ENB enabled="1"/>
|
||||
<TASK_DATA_FORWARDING enabled="1"/>
|
||||
<TASK_END_MARKER enabled="1"/>
|
||||
<TASK_RRC_ENB enabled="1"/>
|
||||
<TASK_RAL_ENB enabled="1"/>
|
||||
<TASK_S1AP enabled="1"/>
|
||||
<TASK_X2AP enabled="1"/>
|
||||
<TASK_SCTP enabled="1"/>
|
||||
<TASK_ENB_APP enabled="1"/>
|
||||
<TASK_PHY_UE enabled="1"/>
|
||||
<TASK_MAC_UE enabled="1"/>
|
||||
<TASK_RLC_UE enabled="1"/>
|
||||
<TASK_PDCP_UE enabled="1"/>
|
||||
<TASK_RRC_UE enabled="1"/>
|
||||
<TASK_NAS_UE enabled="1"/>
|
||||
<TASK_RAL_UE enabled="1"/>
|
||||
</destination_tasks>
|
||||
</filters>
|
||||
@@ -1,145 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include <libxml/parser.h>
|
||||
|
||||
#include "xml_parse.h"
|
||||
#include "resolvers.h"
|
||||
#include "locate_root.h"
|
||||
#include "file.h"
|
||||
#include "ui_main_screen.h"
|
||||
|
||||
#include "rc.h"
|
||||
|
||||
#define G_LOG_LEVELS (G_LOG_LEVEL_ERROR | \
|
||||
G_LOG_LEVEL_CRITICAL | \
|
||||
G_LOG_LEVEL_WARNING | \
|
||||
G_LOG_LEVEL_MESSAGE | \
|
||||
G_LOG_LEVEL_INFO | \
|
||||
G_LOG_LEVEL_DEBUG)
|
||||
|
||||
int debug_buffers = 1;
|
||||
int debug_parser = 0;
|
||||
|
||||
static void console_log_handler(const char *log_domain, GLogLevelFlags log_level,
|
||||
const char *message, gpointer user_data)
|
||||
{
|
||||
GLogLevelFlags domain_log_level = (GLogLevelFlags) user_data;
|
||||
time_t curr;
|
||||
struct tm *today;
|
||||
const char *level;
|
||||
|
||||
if (ui_main_data.log_flags & domain_log_level & log_level)
|
||||
{
|
||||
switch (log_level & G_LOG_LEVEL_MASK)
|
||||
{
|
||||
case G_LOG_LEVEL_ERROR:
|
||||
level = "Err ";
|
||||
break;
|
||||
case G_LOG_LEVEL_CRITICAL:
|
||||
level = "Crit";
|
||||
break;
|
||||
case G_LOG_LEVEL_WARNING:
|
||||
level = "Warn";
|
||||
break;
|
||||
case G_LOG_LEVEL_MESSAGE:
|
||||
level = "Msg ";
|
||||
break;
|
||||
case G_LOG_LEVEL_INFO:
|
||||
level = "Info";
|
||||
break;
|
||||
case G_LOG_LEVEL_DEBUG:
|
||||
level = "Dbg ";
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "unknown log_level %u\n", log_level);
|
||||
level = NULL;
|
||||
g_assert_not_reached();
|
||||
break;
|
||||
}
|
||||
|
||||
/* create a "timestamp" */
|
||||
time(&curr);
|
||||
today = localtime(&curr);
|
||||
|
||||
fprintf(stderr, "%02u:%02u:%02u %-9s %s %s\n", today->tm_hour, today->tm_min, today->tm_sec,
|
||||
log_domain != NULL ? log_domain : "", level, message);
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
GLogLevelFlags log_flags;
|
||||
|
||||
log_flags = (GLogLevelFlags)
|
||||
(G_LOG_LEVEL_ERROR |
|
||||
G_LOG_LEVEL_CRITICAL |
|
||||
G_LOG_LEVEL_WARNING |
|
||||
G_LOG_LEVEL_MESSAGE |
|
||||
G_LOG_LEVEL_INFO |
|
||||
G_LOG_LEVEL_DEBUG);
|
||||
|
||||
/* This initialize the library and check potential ABI mismatches
|
||||
* between the version it was compiled for and the actual shared
|
||||
* library used.
|
||||
*/
|
||||
LIBXML_TEST_VERSION;
|
||||
xmlInitParser();
|
||||
|
||||
/* Initialize the widget set */
|
||||
gtk_init(&argc, &argv);
|
||||
|
||||
/* Parse command line options */
|
||||
ui_gtk_parse_arg (argc, argv);
|
||||
|
||||
/* Set log handlers:
|
||||
* Domain, Levels, Handler, Domain enabled levels */
|
||||
g_log_set_handler( NULL, log_flags, console_log_handler, (gpointer) (G_LOG_LEVELS));
|
||||
g_log_set_handler("BUFFERS", log_flags, console_log_handler, (gpointer) (G_LOG_LEVELS & (~(G_LOG_LEVEL_DEBUG))));
|
||||
g_log_set_handler("PARSER", log_flags, console_log_handler, (gpointer) (G_LOG_LEVELS & (~(G_LOG_LEVEL_DEBUG))));
|
||||
g_log_set_handler("RESOLVER", log_flags, console_log_handler, (gpointer) (G_LOG_LEVELS & (~(G_LOG_LEVEL_DEBUG))));
|
||||
g_log_set_handler("UI", log_flags, console_log_handler, (gpointer) (G_LOG_LEVELS & (~(G_LOG_LEVEL_DEBUG))));
|
||||
g_log_set_handler("UI_CB", log_flags, console_log_handler, (gpointer) (G_LOG_LEVELS));
|
||||
g_log_set_handler("UI_FILTER", log_flags, console_log_handler, (gpointer) (G_LOG_LEVELS & (~(G_LOG_LEVEL_DEBUG))));
|
||||
g_log_set_handler("UI_INTER", log_flags, console_log_handler, (gpointer) (G_LOG_LEVELS));
|
||||
g_log_set_handler("UI_TREE", log_flags, console_log_handler, (gpointer) (G_LOG_LEVELS & (~(G_LOG_LEVEL_DEBUG))));
|
||||
|
||||
CHECK_FCT(ui_gtk_initialize(argc, argv));
|
||||
|
||||
/* Enter the main event loop, and wait for user interaction */
|
||||
gtk_main ();
|
||||
|
||||
/* Free the global variables that may
|
||||
* have been allocated by the parser.
|
||||
*/
|
||||
xmlCleanupParser ();
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
AM_CFLAGS = \
|
||||
@ADD_CFLAGS@ \
|
||||
-I$(top_srcdir)/common \
|
||||
-I$(top_srcdir)/libparser \
|
||||
-I$(top_srcdir)/libui
|
||||
|
||||
noinst_LTLIBRARIES = libbuffers.la
|
||||
|
||||
libbuffers_la_LDFLAGS = -all-static
|
||||
libbuffers_la_SOURCES = \
|
||||
buffers.c buffers.h \
|
||||
file.c file.h \
|
||||
socket.c socket.h
|
||||
@@ -1,241 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <pthread.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define G_LOG_DOMAIN ("BUFFERS")
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#include "rc.h"
|
||||
#include "buffers.h"
|
||||
|
||||
extern int debug_buffers;
|
||||
|
||||
static
|
||||
int buffer_fetch(buffer_t *buffer, uint32_t offset, int size, void *value);
|
||||
|
||||
/* Try to fetch 8 bits unsigned from the buffer */
|
||||
uint8_t buffer_get_uint8_t(buffer_t *buffer, uint32_t offset)
|
||||
{
|
||||
uint8_t value;
|
||||
|
||||
buffer_fetch(buffer, offset, 1, &value);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
/* Try to fetch 16 bits unsigned from the buffer */
|
||||
uint16_t buffer_get_uint16_t(buffer_t *buffer, uint32_t offset)
|
||||
{
|
||||
uint16_t value;
|
||||
|
||||
buffer_fetch(buffer, offset, 2, &value);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
/* Try to fetch 32 bits unsigned from the buffer */
|
||||
uint32_t buffer_get_uint32_t(buffer_t *buffer, uint32_t offset)
|
||||
{
|
||||
uint32_t value;
|
||||
|
||||
buffer_fetch(buffer, offset, 4, &value);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
/* Try to fetch 64 bits unsigned from the buffer */
|
||||
uint64_t buffer_get_uint64_t(buffer_t *buffer, uint32_t offset)
|
||||
{
|
||||
uint64_t value;
|
||||
|
||||
buffer_fetch(buffer, offset, 8, &value);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
static
|
||||
int buffer_fetch(buffer_t *buffer, uint32_t offset, int size, void *value)
|
||||
{
|
||||
if (buffer == NULL || value == NULL)
|
||||
return -1;
|
||||
if (size <= 0)
|
||||
return -1;
|
||||
|
||||
if (buffer->size_bytes < ((offset >> 3) + size)) {
|
||||
g_warning("Not enough data to fetch");
|
||||
return -1;
|
||||
}
|
||||
|
||||
memcpy(value, &buffer->data[offset >> 3], size);
|
||||
buffer->buffer_current = &buffer->data[(offset >> 3) + size];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int buffer_fetch_nbytes(buffer_t *buffer, uint32_t offset, int n_bytes, uint8_t *value)
|
||||
{
|
||||
if (buffer->size_bytes < ((offset >> 3) + n_bytes)) {
|
||||
g_warning("Not enough data to fetch");
|
||||
return -1;
|
||||
}
|
||||
memcpy(&value[0], &buffer->data[offset >> 3], n_bytes);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int buffer_fetch_bits(buffer_t *buffer, uint32_t offset, int nbits, uint32_t *value)
|
||||
{
|
||||
uint32_t temp = 0;
|
||||
int i;
|
||||
|
||||
if (buffer == NULL || value == NULL)
|
||||
return RC_BAD_PARAM;
|
||||
|
||||
/* We cannot fetch more than 32 bits */
|
||||
if (nbits > 32)
|
||||
return RC_BAD_PARAM;
|
||||
|
||||
for (i = 0; i < nbits; i++)
|
||||
{
|
||||
temp |= ((buffer->data[(offset + i) / 8] >> ((offset + i) % 8)) & 1) << i;
|
||||
}
|
||||
|
||||
*value = temp;
|
||||
|
||||
return RC_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Create a new buffer from data
|
||||
* @param buffer caller reference where created buffer will be stored
|
||||
* @param data Data to attach to the new buffer
|
||||
* @param length Length of data buffer
|
||||
* @param data_static flag that indicates if data pointer has been statically (= 0) or not (!= 0)
|
||||
*/
|
||||
int buffer_new_from_data(buffer_t **buffer, uint8_t *data, const uint32_t length,
|
||||
int data_static)
|
||||
{
|
||||
buffer_t *new;
|
||||
|
||||
if (!buffer)
|
||||
return RC_BAD_PARAM;
|
||||
|
||||
new = malloc(sizeof(buffer_t));
|
||||
|
||||
new->size_bytes = length;
|
||||
if (data && length > 0) {
|
||||
if (data_static == 0) {
|
||||
new->data = malloc(sizeof(uint8_t) * new->size_bytes);
|
||||
memcpy(new->data, data, new->size_bytes);
|
||||
} else {
|
||||
new->data = data;
|
||||
}
|
||||
new->buffer_current = &new->data[0];
|
||||
} else {
|
||||
new->buffer_current = NULL;
|
||||
}
|
||||
|
||||
*buffer = new;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define INDENTED(fILE, x, y) \
|
||||
do { \
|
||||
int indentation = x; \
|
||||
while(indentation--) fprintf(fILE, " "); \
|
||||
y; \
|
||||
} while(0)
|
||||
|
||||
#define INDENT_BREAK 20
|
||||
|
||||
void buffer_dump(buffer_t *buffer, FILE *to)
|
||||
{
|
||||
FILE *file = to;
|
||||
uint32_t i;
|
||||
|
||||
if (!buffer)
|
||||
return;
|
||||
if (!to)
|
||||
to = stdout;
|
||||
|
||||
fprintf(file, "<Buffer>\n");
|
||||
INDENTED(file, 4, fprintf(file, "<Length>%u<Length>\n", buffer->size_bytes));
|
||||
INDENTED(file, 4, fprintf(file, "<Bytes>\n"));
|
||||
for (i = 0; i < buffer->size_bytes; i++)
|
||||
{
|
||||
if ((i % INDENT_BREAK) == 0)
|
||||
fprintf(file, " ");
|
||||
fprintf(file, "0x%02x ", buffer->data[i]);
|
||||
if ((i % INDENT_BREAK) == (INDENT_BREAK - 1))
|
||||
fprintf(file, "\n");
|
||||
}
|
||||
if ((i % INDENT_BREAK) != (INDENT_BREAK - 1))
|
||||
fprintf(file, "\n");
|
||||
INDENTED(file, 4, fprintf(file, "</Bytes>\n"));
|
||||
fprintf(file, "</Buffer>\n");
|
||||
}
|
||||
|
||||
int buffer_append_data(buffer_t *buffer, const uint8_t *data, const uint32_t length)
|
||||
{
|
||||
if (!buffer)
|
||||
return -1;
|
||||
|
||||
if (data && length > 0) {
|
||||
if (!buffer->data) {
|
||||
buffer->size_bytes = length;
|
||||
buffer->data = malloc(sizeof(uint8_t) * buffer->size_bytes);
|
||||
memcpy(buffer->data, data, buffer->size_bytes);
|
||||
} else {
|
||||
buffer->data = realloc(buffer->data, sizeof(uint8_t) * (buffer->size_bytes + length));
|
||||
memcpy(&buffer->data[buffer->size_bytes], data, length);
|
||||
buffer->size_bytes += length;
|
||||
}
|
||||
buffer->buffer_current = &buffer->data[0];
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int buffer_has_enouch_data(buffer_t *buffer, uint32_t offset, uint32_t to_get)
|
||||
{
|
||||
int underflow;
|
||||
if (!buffer)
|
||||
return -1;
|
||||
underflow = (buffer->size_bytes >= ((offset + to_get) / 8)) ? 0 : -1;
|
||||
if (underflow && debug_buffers)
|
||||
g_warning("Detected Underflow offset %u, to_get %u, buffer size %u\n",
|
||||
offset, to_get, buffer->size_bytes);
|
||||
return underflow;
|
||||
}
|
||||
|
||||
void *buffer_at_offset(buffer_t *buffer, uint32_t offset)
|
||||
{
|
||||
// if (buffer_has_enouch_data(buffer, 0, offset) != 0) {
|
||||
// return NULL;
|
||||
// }
|
||||
return &buffer->data[offset / 8];
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifndef BUFFERS_H_
|
||||
#define BUFFERS_H_
|
||||
|
||||
typedef struct buffer_s {
|
||||
/* The size in bytes as read from socket */
|
||||
uint32_t size_bytes;
|
||||
|
||||
/* Current position */
|
||||
uint8_t *buffer_current;
|
||||
|
||||
/* The complete data */
|
||||
uint8_t *data;
|
||||
|
||||
/* The message number as read from socket */
|
||||
uint32_t message_number;
|
||||
|
||||
uint32_t message_id;
|
||||
} buffer_t;
|
||||
|
||||
uint8_t buffer_get_uint8_t(buffer_t *buffer, uint32_t offset);
|
||||
|
||||
uint16_t buffer_get_uint16_t(buffer_t *buffer, uint32_t offset);
|
||||
|
||||
uint32_t buffer_get_uint32_t(buffer_t *buffer, uint32_t offset);
|
||||
|
||||
uint64_t buffer_get_uint64_t(buffer_t *buffer, uint32_t offset);
|
||||
|
||||
int buffer_fetch_bits(buffer_t *buffer, uint32_t offset, int nbits, uint32_t *value);
|
||||
|
||||
int buffer_fetch_nbytes(buffer_t *buffer, uint32_t offset, int n_bytes, uint8_t *value);
|
||||
|
||||
void buffer_dump(buffer_t *buffer, FILE *to);
|
||||
|
||||
int buffer_append_data(buffer_t *buffer, const uint8_t *data, const uint32_t length);
|
||||
|
||||
int buffer_new_from_data(buffer_t **buffer, uint8_t *data, const uint32_t length,
|
||||
int data_static);
|
||||
|
||||
int buffer_has_enouch_data(buffer_t *buffer, uint32_t offset, uint32_t to_get);
|
||||
|
||||
void *buffer_at_offset(buffer_t *buffer, uint32_t offset);
|
||||
|
||||
#endif /* BUFFERS_H_ */
|
||||
@@ -1,75 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#define G_LOG_DOMAIN ("BUFFERS")
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#include "rc.h"
|
||||
#include "buffers.h"
|
||||
#include "file.h"
|
||||
|
||||
#define READ_BUFFER_SIZE 1024
|
||||
|
||||
int file_read_dump(buffer_t **buffer, const char *filename)
|
||||
{
|
||||
int fd = -1;
|
||||
buffer_t *new_buf = NULL;
|
||||
uint8_t data[READ_BUFFER_SIZE];
|
||||
ssize_t current_read;
|
||||
|
||||
if (!filename)
|
||||
return RC_BAD_PARAM;
|
||||
|
||||
if ((fd = open(filename, O_RDONLY)) == -1) {
|
||||
g_warning("Cannot open %s for reading, returned %d:%s\n",
|
||||
filename, errno, strerror(errno));
|
||||
return RC_FAIL;
|
||||
}
|
||||
|
||||
CHECK_FCT(buffer_new_from_data(&new_buf, NULL, 0, 0));
|
||||
|
||||
do {
|
||||
current_read = read(fd, data, READ_BUFFER_SIZE);
|
||||
if (current_read == -1)
|
||||
{
|
||||
g_warning("Failed to read data from file, returned %d:%s\n",
|
||||
errno, strerror(errno));
|
||||
return RC_FAIL;
|
||||
}
|
||||
CHECK_FCT(buffer_append_data(new_buf, data, current_read));
|
||||
} while(current_read == READ_BUFFER_SIZE);
|
||||
|
||||
*buffer = new_buf;
|
||||
|
||||
buffer_dump(new_buf, stdout);
|
||||
|
||||
close(fd);
|
||||
|
||||
return RC_OK;
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifndef FILE_H_
|
||||
#define FILE_H_
|
||||
|
||||
int file_read_dump(buffer_t **buffer, const char *filename);
|
||||
|
||||
#endif /* FILE_H_ */
|
||||
@@ -1,444 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#define G_LOG_DOMAIN ("BUFFERS")
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include "logs.h"
|
||||
#include "itti_types.h"
|
||||
#include "rc.h"
|
||||
|
||||
#include "ui_interface.h"
|
||||
#include "ui_notifications.h"
|
||||
#include "ui_notif_dlg.h"
|
||||
|
||||
#include "socket.h"
|
||||
#include "buffers.h"
|
||||
|
||||
#include "xml_parse.h"
|
||||
|
||||
/* Retry connection after 100 ms */
|
||||
#define SOCKET_US_BEFORE_CONNECT_RETRY (100 * 1000)
|
||||
/* About 10 minutes time-out for connecting to peer */
|
||||
#define SOCKET_NB_CONNECT_RETRY ((10 * 60 * 1000 * 1000) / SOCKET_US_BEFORE_CONNECT_RETRY)
|
||||
|
||||
#define SOCKET_NB_SIGNALS_BEFORE_SIGNALLING 10
|
||||
#define SOCKET_MS_BEFORE_SIGNALLING 100
|
||||
|
||||
gboolean socket_abort_connection = FALSE;
|
||||
|
||||
void *socket_thread_fct(void *arg);
|
||||
|
||||
static ssize_t socket_read_data(socket_data_t *socket_data, void *buffer, size_t size, int flags)
|
||||
{
|
||||
ssize_t recv_ret;
|
||||
|
||||
recv_ret = recv(socket_data->sd, buffer, size, flags);
|
||||
if (recv_ret == -1) {
|
||||
/* Failure case */
|
||||
switch (errno) {
|
||||
// case EWOULDBLOCK:
|
||||
case EAGAIN:
|
||||
return -1;
|
||||
default:
|
||||
g_info("recv failed: %s", g_strerror(errno));
|
||||
pthread_exit(NULL);
|
||||
break;
|
||||
}
|
||||
} else if (recv_ret == 0) {
|
||||
/* We lost the connection with other peer or shutdown asked */
|
||||
ui_pipe_write_message(socket_data->pipe_fd,
|
||||
UI_PIPE_CONNECTION_LOST, NULL, 0);
|
||||
free(socket_data->ip_address);
|
||||
free(socket_data);
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
|
||||
return recv_ret;
|
||||
}
|
||||
|
||||
static void socket_notify_gui_update(socket_data_t *socket_data)
|
||||
{
|
||||
pipe_new_signals_list_message_t pipe_signal_list_message;
|
||||
|
||||
pipe_signal_list_message.signal_list = socket_data->signal_list;
|
||||
|
||||
socket_data->signal_list = NULL;
|
||||
socket_data->nb_signals_since_last_update = 0;
|
||||
|
||||
/* Send an update notification */
|
||||
ui_pipe_write_message(socket_data->pipe_fd,
|
||||
UI_PIPE_UPDATE_SIGNAL_LIST, &pipe_signal_list_message,
|
||||
sizeof(pipe_signal_list_message));
|
||||
|
||||
/* Acquire the last data notification */
|
||||
socket_data->last_data_notification = g_get_monotonic_time();
|
||||
}
|
||||
|
||||
static int socket_read_itti_message(socket_data_t *socket_data,
|
||||
itti_socket_header_t *message_header)
|
||||
{
|
||||
itti_signal_header_t itti_signal_header;
|
||||
buffer_t *buffer;
|
||||
uint8_t *data;
|
||||
size_t data_length;
|
||||
ssize_t data_read = 0;
|
||||
ssize_t total_data_read = 0;
|
||||
|
||||
g_assert(message_header != NULL);
|
||||
|
||||
g_debug("Attempting to read signal header from socket");
|
||||
|
||||
/* Read the sub-header of signal */
|
||||
while (data_read != sizeof(itti_signal_header_t)) {
|
||||
data_read = socket_read_data(socket_data, &itti_signal_header,
|
||||
sizeof(itti_signal_header_t), 0);
|
||||
}
|
||||
|
||||
data_length = message_header->message_size - sizeof(itti_socket_header_t) - sizeof(itti_signal_header_t);
|
||||
data = malloc(sizeof(uint8_t) * data_length);
|
||||
|
||||
while (total_data_read < data_length) {
|
||||
data_read = socket_read_data(socket_data, &data[total_data_read],
|
||||
data_length - total_data_read, 0);
|
||||
/* We are waiting for data */
|
||||
if (data_read < 0) {
|
||||
usleep(10);
|
||||
} else {
|
||||
total_data_read += data_read;
|
||||
}
|
||||
}
|
||||
|
||||
/* Create the new buffer */
|
||||
if (buffer_new_from_data(&buffer, data, data_length - sizeof(itti_message_types_t), 1) != RC_OK) {
|
||||
g_error("Failed to create new buffer");
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
sscanf (itti_signal_header.message_number_char, MESSAGE_NUMBER_CHAR_FORMAT, &buffer->message_number);
|
||||
// buffer_dump(buffer, stdout);
|
||||
|
||||
/* Update the number of signals received since last GUI update */
|
||||
socket_data->nb_signals_since_last_update++;
|
||||
|
||||
socket_data->signal_list = g_list_append(socket_data->signal_list, (gpointer)buffer);
|
||||
|
||||
if (socket_data->nb_signals_since_last_update >= SOCKET_NB_SIGNALS_BEFORE_SIGNALLING) {
|
||||
socket_notify_gui_update(socket_data);
|
||||
}
|
||||
|
||||
g_debug("Successfully read new signal %u from socket", buffer->message_number);
|
||||
|
||||
return total_data_read + sizeof(itti_signal_header);
|
||||
}
|
||||
|
||||
static int socket_read_xml_definition(socket_data_t *socket_data,
|
||||
itti_socket_header_t *message_header)
|
||||
{
|
||||
ssize_t data_read;
|
||||
ssize_t total_data_read = 0;
|
||||
char *xml_definition;
|
||||
size_t xml_definition_length;
|
||||
pipe_xml_definition_message_t pipe_xml_definition_message;
|
||||
|
||||
xml_definition_length = message_header->message_size - sizeof(*message_header);
|
||||
xml_definition = malloc(xml_definition_length * sizeof(char));
|
||||
|
||||
g_debug("Attempting to read XML definition of size %zu from socket",
|
||||
xml_definition_length);
|
||||
|
||||
/* XML definition is a long message... so function may take some time */
|
||||
|
||||
do {
|
||||
data_read = socket_read_data(socket_data, &xml_definition[total_data_read],
|
||||
xml_definition_length - total_data_read, 0);
|
||||
|
||||
/* We are waiting for data */
|
||||
if (data_read < 0) {
|
||||
usleep(10);
|
||||
} else {
|
||||
total_data_read += data_read;
|
||||
}
|
||||
} while (total_data_read != xml_definition_length);
|
||||
|
||||
pipe_xml_definition_message.xml_definition = xml_definition;
|
||||
pipe_xml_definition_message.xml_definition_length = xml_definition_length - sizeof(itti_message_types_t);
|
||||
|
||||
g_debug("Received XML definition of size %zu, effectively read %zu bytes",
|
||||
xml_definition_length, total_data_read);
|
||||
|
||||
ui_pipe_write_message(socket_data->pipe_fd, UI_PIPE_XML_DEFINITION,
|
||||
&pipe_xml_definition_message, sizeof(pipe_xml_definition_message));
|
||||
|
||||
return total_data_read;
|
||||
}
|
||||
|
||||
static int socket_read(socket_data_t *socket_data)
|
||||
{
|
||||
int ret = 0;
|
||||
itti_socket_header_t message_header;
|
||||
|
||||
while (ret >= 0) {
|
||||
ret = socket_read_data(socket_data, &message_header, sizeof(message_header), 0);
|
||||
|
||||
if (ret == -1) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch(message_header.message_type) {
|
||||
case ITTI_DUMP_XML_DEFINITION:
|
||||
socket_read_xml_definition(socket_data, &message_header);
|
||||
break;
|
||||
|
||||
case ITTI_DUMP_MESSAGE_TYPE:
|
||||
socket_read_itti_message(socket_data, &message_header);
|
||||
break;
|
||||
|
||||
case ITTI_STATISTIC_MESSAGE_TYPE:
|
||||
default:
|
||||
g_warning("Received unknow (or not implemented) message from socket type: %d",
|
||||
message_header.message_type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int socket_handle_disconnect_evt(socket_data_t *socket_data)
|
||||
{
|
||||
/* Send shutdown to remote host */
|
||||
CHECK_FCT_POSIX(shutdown(socket_data->sd, SHUT_RDWR));
|
||||
/* Close file descriptor */
|
||||
CHECK_FCT_POSIX(close(socket_data->sd));
|
||||
|
||||
socket_data->sd = -1;
|
||||
|
||||
/* Close pipe */
|
||||
close(socket_data->pipe_fd);
|
||||
|
||||
/* Leaving the thread */
|
||||
pthread_exit(NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pipe_read_message(socket_data_t *socket_data)
|
||||
{
|
||||
pipe_input_header_t input_header;
|
||||
uint8_t *input_data = NULL;
|
||||
size_t input_data_length = 0;
|
||||
|
||||
/* Read the header */
|
||||
if (read(socket_data->pipe_fd, &input_header, sizeof(input_header)) < 0) {
|
||||
g_warning("Failed to read from pipe %d: %s", socket_data->pipe_fd,
|
||||
g_strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
input_data_length = input_header.message_size - sizeof(input_header);
|
||||
|
||||
/* Checking for non-header part */
|
||||
if (input_data_length > 0) {
|
||||
input_data = malloc(sizeof(uint8_t) * input_data_length);
|
||||
|
||||
if (read(socket_data->pipe_fd, input_data, input_data_length) < 0) {
|
||||
g_warning("Failed to read from pipe %d: %s", socket_data->pipe_fd,
|
||||
g_strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
switch (input_header.message_type) {
|
||||
case UI_PIPE_DISCONNECT_EVT:
|
||||
return socket_handle_disconnect_evt(socket_data);
|
||||
default:
|
||||
g_warning("[socket] Unhandled message type %u", input_header.message_type);
|
||||
g_assert_not_reached();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *socket_thread_fct(void *arg)
|
||||
{
|
||||
int ret;
|
||||
struct sockaddr_in si_me;
|
||||
socket_data_t *socket_data;
|
||||
int retry = SOCKET_NB_CONNECT_RETRY;
|
||||
|
||||
/* master file descriptor list */
|
||||
fd_set master_fds;
|
||||
/* temp file descriptor list for select() */
|
||||
fd_set read_fds;
|
||||
int fd_max = 0;
|
||||
struct timeval tv;
|
||||
|
||||
socket_data = (socket_data_t *)arg;
|
||||
|
||||
g_assert(socket_data != NULL);
|
||||
|
||||
/* Preparing the socket */
|
||||
if ((socket_data->sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
|
||||
g_warning("socket failed: %s", g_strerror(errno));
|
||||
free(socket_data->ip_address);
|
||||
free(socket_data);
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
memset((void *)&si_me, 0, sizeof(si_me));
|
||||
|
||||
si_me.sin_family = AF_INET;
|
||||
si_me.sin_port = htons(socket_data->port);
|
||||
if (inet_aton(socket_data->ip_address, &si_me.sin_addr) == 0) {
|
||||
g_warning("inet_aton() failed\n");
|
||||
free(socket_data->ip_address);
|
||||
free(socket_data);
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
|
||||
/* clear the master and temp sets */
|
||||
FD_ZERO(&master_fds);
|
||||
FD_ZERO(&read_fds);
|
||||
|
||||
/* Add the GUI pipe to the list of sockets to monitor */
|
||||
FD_SET(socket_data->pipe_fd, &master_fds);
|
||||
|
||||
/* Add the client socket to the list of sockets to monitor */
|
||||
FD_SET(socket_data->sd, &master_fds);
|
||||
|
||||
/* Update the fd_max with the MAX of socket/pipe */
|
||||
fd_max = MAX(socket_data->pipe_fd, socket_data->sd);
|
||||
|
||||
/* Setup the timeout for select.
|
||||
* When a timeout is caught, check for new notifications to send to GUI.
|
||||
*/
|
||||
tv.tv_sec = 0;
|
||||
tv.tv_usec = 1000 * SOCKET_MS_BEFORE_SIGNALLING;
|
||||
|
||||
do {
|
||||
/* Connecting to remote peer */
|
||||
ret = connect(socket_data->sd, (struct sockaddr *) &si_me, sizeof(struct sockaddr_in));
|
||||
if (ret < 0) {
|
||||
if ((socket_abort_connection) || (retry < 0)) {
|
||||
if (retry < 0) {
|
||||
g_warning("Failed to connect to peer %s:%d", socket_data->ip_address, socket_data->port);
|
||||
ui_pipe_write_message(socket_data->pipe_fd, UI_PIPE_CONNECTION_FAILED, NULL, 0);
|
||||
}
|
||||
free(socket_data->ip_address);
|
||||
free(socket_data);
|
||||
socket_abort_connection = FALSE;
|
||||
/* Quit the thread */
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
usleep(SOCKET_US_BEFORE_CONNECT_RETRY);
|
||||
retry--;
|
||||
}
|
||||
} while (ret < 0);
|
||||
|
||||
/* Set the socket as non-blocking */
|
||||
fcntl(socket_data->sd, F_SETFL, O_NONBLOCK);
|
||||
|
||||
while (1) {
|
||||
memcpy(&read_fds, &master_fds, sizeof(master_fds));
|
||||
|
||||
ret = select(fd_max + 1, &read_fds, NULL, NULL, &tv);
|
||||
if (ret < 0) {
|
||||
g_warning("Error in select: %s", g_strerror(errno));
|
||||
free(socket_data->ip_address);
|
||||
free(socket_data);
|
||||
/* Quit the thread */
|
||||
pthread_exit(NULL);
|
||||
} else if (ret == 0) {
|
||||
/* Timeout for select: check if there is new incoming messages
|
||||
* since last GUI update
|
||||
*/
|
||||
if (socket_data->nb_signals_since_last_update > 0) {
|
||||
g_debug("Timout on select and data new signal in list");
|
||||
g_debug("-> notify GUI");
|
||||
socket_notify_gui_update(socket_data);
|
||||
}
|
||||
|
||||
/* Reset the timeval to the max value */
|
||||
tv.tv_usec = 1000 * SOCKET_MS_BEFORE_SIGNALLING;
|
||||
}
|
||||
|
||||
/* Checking if there is data to read from the pipe */
|
||||
if (FD_ISSET(socket_data->pipe_fd, &read_fds)) {
|
||||
FD_CLR(socket_data->pipe_fd, &read_fds);
|
||||
pipe_read_message(socket_data);
|
||||
}
|
||||
|
||||
/* Checking if there is data to read from the socket */
|
||||
if (FD_ISSET(socket_data->sd, &read_fds)) {
|
||||
FD_CLR(socket_data->sd, &read_fds);
|
||||
socket_read(socket_data);
|
||||
|
||||
/* Update the timeout of select if there is data not notify to GUI */
|
||||
if (socket_data->nb_signals_since_last_update > 0) {
|
||||
gint64 current_time;
|
||||
|
||||
current_time = g_get_monotonic_time();
|
||||
|
||||
if ((current_time - socket_data->last_data_notification) > SOCKET_MS_BEFORE_SIGNALLING) {
|
||||
socket_notify_gui_update(socket_data);
|
||||
tv.tv_usec = 1000 * SOCKET_MS_BEFORE_SIGNALLING;
|
||||
} else {
|
||||
/* Update tv */
|
||||
tv.tv_usec = (1000 * SOCKET_MS_BEFORE_SIGNALLING) - (current_time - socket_data->last_data_notification);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int socket_connect_to_remote_host(const char *remote_ip, const uint16_t port,
|
||||
int pipe_fd)
|
||||
{
|
||||
socket_data_t *socket_data;
|
||||
|
||||
socket_data = calloc(1, sizeof(*socket_data));
|
||||
|
||||
socket_data->ip_address = strdup(remote_ip);
|
||||
|
||||
socket_data->pipe_fd = pipe_fd;
|
||||
socket_data->port = port;
|
||||
socket_data->sd = -1;
|
||||
|
||||
if (pthread_create(&socket_data->thread, NULL, socket_thread_fct, socket_data) != 0) {
|
||||
g_warning("Failed to create thread %d:%s", errno, strerror(errno));
|
||||
free(socket_data->ip_address);
|
||||
free(socket_data);
|
||||
return RC_FAIL;
|
||||
}
|
||||
|
||||
return RC_OK;
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <arpa/inet.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#ifndef SOCKET_H_
|
||||
#define SOCKET_H_
|
||||
|
||||
typedef struct {
|
||||
pthread_t thread;
|
||||
int sd;
|
||||
char *ip_address;
|
||||
uint16_t port;
|
||||
|
||||
/* The pipe used between main thread (running GTK) and the socket thread */
|
||||
int pipe_fd;
|
||||
|
||||
/* Time used to avoid refreshing UI every time a new signal is incoming */
|
||||
gint64 last_data_notification;
|
||||
uint8_t nb_signals_since_last_update;
|
||||
|
||||
/* The last signals received which are not yet been updated in GUI */
|
||||
GList *signal_list;
|
||||
} socket_data_t;
|
||||
|
||||
gboolean socket_abort_connection;
|
||||
|
||||
int socket_connect_to_remote_host(const char *remote_ip, const uint16_t port,
|
||||
int pipe_fd);
|
||||
|
||||
int socket_disconnect_from_remote_host(void);
|
||||
|
||||
#endif /* SOCKET_H_ */
|
||||
@@ -1,23 +0,0 @@
|
||||
AM_CFLAGS = \
|
||||
@ADD_CFLAGS@ \
|
||||
-I$(top_srcdir)/common \
|
||||
-I$(top_srcdir)/libbuffers \
|
||||
-I$(top_srcdir)/libui
|
||||
|
||||
noinst_LTLIBRARIES = libparser.la
|
||||
|
||||
libparser_la_LDFLAGS = -all-static
|
||||
libparser_la_SOURCES = \
|
||||
xml_parse.c \
|
||||
array_type.c array_type.h \
|
||||
enum_type.c enum_type.h \
|
||||
enum_value_type.c enum_value_type.h \
|
||||
file_type.c file_type.h \
|
||||
field_type.c field_type.h \
|
||||
fundamental_type.c fundamental_type.h \
|
||||
pointer_type.h pointer_type.c \
|
||||
reference_type.c reference_type.h \
|
||||
struct_type.c struct_type.h \
|
||||
typedef_type.c typedef_type.h \
|
||||
types.h types.c \
|
||||
union_type.c union_type.h
|
||||
@@ -1,180 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include <tgmath.h>
|
||||
|
||||
#define G_LOG_DOMAIN ("PARSER")
|
||||
|
||||
#include "array_type.h"
|
||||
#include "fundamental_type.h"
|
||||
#include "ui_interface.h"
|
||||
|
||||
int array_dissect_from_buffer(
|
||||
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
|
||||
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
|
||||
{
|
||||
types_t *type_child;
|
||||
int length = 0;
|
||||
char cbuf[50];
|
||||
|
||||
DISPLAY_PARSE_INFO("array", type->name, offset, parent_offset);
|
||||
|
||||
/* Ignore TYPEDEF children */
|
||||
for (type_child = type->child; type_child != NULL && type_child->type == TYPE_TYPEDEF;
|
||||
type_child = type_child->child) {
|
||||
}
|
||||
|
||||
if (type->name) {
|
||||
INDENTED(stdout, indent, fprintf(stdout, "<%s>\n", type->name));
|
||||
}
|
||||
if (type->child != NULL) {
|
||||
int items = type->size / type_child->size;
|
||||
int i;
|
||||
int zero_counter = 0;
|
||||
gboolean is_string = FALSE;
|
||||
char *string;
|
||||
int nb_digits = 0;
|
||||
|
||||
/* Factorizes trailing 0 */
|
||||
if ((items > 1) && (type_child->type == TYPE_FUNDAMENTAL))
|
||||
{
|
||||
for (i = items - 1; i >= 0; i--)
|
||||
{
|
||||
if (fundamental_read_from_buffer(type_child, buffer, parent_offset, offset + i * type_child->size) == 0)
|
||||
{
|
||||
zero_counter ++;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check if this is an array of 8 bits items and if at least the firsts ones are not null */
|
||||
if ((type_child->size == 8) && (zero_counter >= 1) && ((items - zero_counter) >= 2))
|
||||
{
|
||||
int end = items - zero_counter;
|
||||
|
||||
/* check if this is a printable string */
|
||||
is_string = TRUE;
|
||||
string = malloc(end + 1);
|
||||
|
||||
for (i = 0; i < end; i++)
|
||||
{
|
||||
string[i] = fundamental_read_from_buffer(type_child, buffer, parent_offset, offset + i * type_child->size);
|
||||
if (isprint(string[i]) == 0)
|
||||
{
|
||||
/* This is not a printable string */
|
||||
is_string = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (is_string)
|
||||
{
|
||||
string[i] = '\0';
|
||||
INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "[0 .. %d] \"%s\"\n", end - 1, string));
|
||||
ui_set_signal_text_cb(user_data, cbuf, length);
|
||||
}
|
||||
}
|
||||
|
||||
/* Do not factorize if there is only one null item */
|
||||
if (zero_counter <= 1)
|
||||
{
|
||||
zero_counter = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (is_string == FALSE)
|
||||
{
|
||||
nb_digits = log10(items - zero_counter) + 1;
|
||||
|
||||
for (i = 0; i < (items - zero_counter); i++)
|
||||
{
|
||||
INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "[%*d] ", nb_digits, i));
|
||||
ui_set_signal_text_cb(user_data, cbuf, length);
|
||||
|
||||
type->child->type_dissect_from_buffer (
|
||||
type->child, ui_set_signal_text_cb, user_data, buffer, parent_offset,
|
||||
offset + i * type_child->size, indent,
|
||||
FALSE);
|
||||
}
|
||||
if (zero_counter > 0)
|
||||
{
|
||||
INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "[%d .. %d] ", i, items -1));
|
||||
ui_set_signal_text_cb(user_data, cbuf, length);
|
||||
|
||||
type->child->type_dissect_from_buffer (
|
||||
type->child, ui_set_signal_text_cb, user_data,
|
||||
buffer, parent_offset, offset + i * type_child->size, indent, FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (type->name) {
|
||||
INDENTED(stdout, indent, fprintf(stdout, "</%s>\n", type->name));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int array_type_file_print(types_t *type, int indent, FILE *file) {
|
||||
if (type == NULL)
|
||||
return -1;
|
||||
INDENTED(file, indent, fprintf(file, "<Array>\n"));
|
||||
INDENTED(file, indent+4, fprintf(file, "Id .........: %d\n", type->id));
|
||||
INDENTED(file, indent+4, fprintf(file, "Min ........: %d\n", type->min));
|
||||
INDENTED(file, indent+4, fprintf(file, "Max ........: %d\n", type->max));
|
||||
INDENTED(file, indent+4, fprintf(file, "Type .......: %d\n", type->type_xml));
|
||||
INDENTED(file, indent+4, fprintf(file, "Size .......: %d\n", type->size));
|
||||
INDENTED(file, indent+4, fprintf(file, "Align ......: %d\n", type->align));
|
||||
if (type->file_ref != NULL)
|
||||
type->file_ref->type_file_print (type->file_ref, indent + 4, file);
|
||||
if (type->child != NULL)
|
||||
type->child->type_file_print (type->child, indent + 4, file);
|
||||
INDENTED(file, indent, fprintf(file, "</Array>\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int array_type_hr_display(types_t *type, int indent) {
|
||||
if (type == NULL)
|
||||
return -1;
|
||||
INDENTED(stdout, indent, printf("<Array>\n"));
|
||||
INDENTED(stdout, indent+4, printf("Id .........: %d\n", type->id));
|
||||
INDENTED(stdout, indent+4, printf("Min ........: %d\n", type->min));
|
||||
INDENTED(stdout, indent+4, printf("Max ........: %d\n", type->max));
|
||||
INDENTED(stdout, indent+4, printf("Type .......: %d\n", type->type_xml));
|
||||
INDENTED(stdout, indent+4, printf("Size .......: %d\n", type->size));
|
||||
INDENTED(stdout, indent+4, printf("Align ......: %d\n", type->align));
|
||||
if (type->file_ref != NULL)
|
||||
type->file_ref->type_hr_display (type->file_ref, indent + 4);
|
||||
if (type->child != NULL)
|
||||
type->child->type_hr_display (type->child, indent + 4);
|
||||
INDENTED(stdout, indent, printf("</Array>\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#ifndef ARRAY_TYPE_H_
|
||||
#define ARRAY_TYPE_H_
|
||||
|
||||
int array_dissect_from_buffer(
|
||||
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
|
||||
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
|
||||
|
||||
int array_type_hr_display(types_t *type, int indent);
|
||||
|
||||
int array_type_file_print(types_t *type, int indent, FILE *file);
|
||||
|
||||
#endif /* ARRAY_TYPE_H_ */
|
||||
@@ -1,124 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#define G_LOG_DOMAIN ("PARSER")
|
||||
|
||||
#include "enum_type.h"
|
||||
#include "ui_interface.h"
|
||||
|
||||
char *enum_type_get_name_from_value(types_t *type, uint32_t value)
|
||||
{
|
||||
char *enum_name = "UNKNOWN";
|
||||
types_t *enum_value;
|
||||
|
||||
/* Loop on each enumeration values */
|
||||
for (enum_value = type->child; enum_value; enum_value = enum_value->next) {
|
||||
if (value == enum_value->init_value) {
|
||||
enum_name = enum_value->name;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return enum_name;
|
||||
}
|
||||
|
||||
int enum_type_dissect_from_buffer(
|
||||
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
|
||||
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
|
||||
{
|
||||
uint32_t value = 0;
|
||||
types_t *values;
|
||||
|
||||
DISPLAY_PARSE_INFO("enum", type->name, offset, parent_offset);
|
||||
|
||||
value = buffer_get_uint32_t(buffer, parent_offset + offset);
|
||||
|
||||
for (values = type->child; values; values = values->next) {
|
||||
if (value == values->init_value) {
|
||||
values->parent = type;
|
||||
values->type_dissect_from_buffer(
|
||||
values, ui_set_signal_text_cb, user_data, buffer, offset, parent_offset,
|
||||
type->name == NULL ? indent: indent + DISPLAY_TAB_SIZE, FALSE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (values == NULL) {
|
||||
int length = 0;
|
||||
char cbuf[50];
|
||||
|
||||
length = sprintf(cbuf, "(0x%08x) UNKNOWN;\n", value);
|
||||
ui_set_signal_text_cb(user_data, cbuf, length);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int enum_type_file_print(types_t *type, int indent, FILE *file)
|
||||
{
|
||||
types_t *values;
|
||||
|
||||
if (type == NULL)
|
||||
return -1;
|
||||
INDENTED(file, indent, fprintf(file, "<Enumeration>\n"));
|
||||
INDENTED(file, indent+4, fprintf(file, "Name .......: %s\n", type->name));
|
||||
INDENTED(file, indent+4, fprintf(file, "Size .......: %d\n", type->size));
|
||||
INDENTED(file, indent+4, fprintf(file, "Align ......: %d\n", type->align));
|
||||
INDENTED(file, indent+4, fprintf(file, "Artificial .: %d\n", type->artificial));
|
||||
INDENTED(file, indent+4, fprintf(file, "File .......: %s\n", type->file));
|
||||
INDENTED(file, indent+4, fprintf(file, "Line .......: %d\n", type->line));
|
||||
if (type->file_ref != NULL)
|
||||
type->file_ref->type_file_print(type->file_ref, indent+4, file);
|
||||
/* Call enum values display */
|
||||
for (values = type->child; values; values = values->next) {
|
||||
values->type_file_print(values, indent + 4, file);
|
||||
}
|
||||
INDENTED(file, indent, fprintf(file, "</Enumeration>\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int enum_type_hr_display(types_t *type, int indent)
|
||||
{
|
||||
types_t *values;
|
||||
|
||||
if (type == NULL)
|
||||
return -1;
|
||||
INDENTED(stdout, indent, printf("<Enumeration>\n"));
|
||||
INDENTED(stdout, indent+4, printf("Name .......: %s\n", type->name));
|
||||
INDENTED(stdout, indent+4, printf("Size .......: %d\n", type->size));
|
||||
INDENTED(stdout, indent+4, printf("Align ......: %d\n", type->align));
|
||||
INDENTED(stdout, indent+4, printf("Artificial .: %d\n", type->artificial));
|
||||
INDENTED(stdout, indent+4, printf("File .......: %s\n", type->file));
|
||||
INDENTED(stdout, indent+4, printf("Line .......: %d\n", type->line));
|
||||
if (type->file_ref != NULL)
|
||||
type->file_ref->type_hr_display(type->file_ref, indent+4);
|
||||
/* Call enum values display */
|
||||
for (values = type->child; values; values = values->next) {
|
||||
values->type_hr_display(values, indent + 4);
|
||||
}
|
||||
INDENTED(stdout, indent, printf("</Enumeration>\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#ifndef ENUM_TYPE_H_
|
||||
#define ENUM_TYPE_H_
|
||||
|
||||
char *enum_type_get_name_from_value(types_t *type, uint32_t value);
|
||||
|
||||
int enum_type_dissect_from_buffer(
|
||||
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
|
||||
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
|
||||
|
||||
int enum_type_file_print(types_t *type, int indent, FILE *file);
|
||||
|
||||
int enum_type_hr_display(types_t *type, int indent);
|
||||
|
||||
#endif /* ENUM_TYPE_H_ */
|
||||
@@ -1,99 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#define G_LOG_DOMAIN ("PARSER")
|
||||
|
||||
#include "enum_value_type.h"
|
||||
#include "ui_interface.h"
|
||||
|
||||
uint32_t last_enum_value;
|
||||
|
||||
int enum_value_dissect_from_buffer(
|
||||
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
|
||||
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
|
||||
{
|
||||
types_t *type_parent = NULL;
|
||||
uint32_t value = 0;
|
||||
|
||||
DISPLAY_PARSE_INFO("enum_value", type->name, offset, parent_offset);
|
||||
|
||||
value = buffer_get_uint32_t(buffer, parent_offset + offset);
|
||||
if (type->name) {
|
||||
int length = 0;
|
||||
char cbuf[50 + strlen(type->name)];
|
||||
|
||||
/* Search for enum variable name and check if it is used in association with a union type */
|
||||
{
|
||||
if (type->parent != NULL) {
|
||||
/* Ignore ENUMERATION and TYPEDEF parents */
|
||||
for (type_parent = type->parent; (type_parent != NULL) && ((type_parent->type == TYPE_ENUMERATION) || (type_parent->type == TYPE_TYPEDEF));
|
||||
type_parent = type_parent->parent) {
|
||||
}
|
||||
}
|
||||
if ((type_parent != NULL) && (type_parent->name != NULL) && (strcmp(type_parent->name, "present") == 0))
|
||||
{
|
||||
/* ASN1 union, keep the "present" member */
|
||||
last_enum_value = value;
|
||||
}
|
||||
else
|
||||
{
|
||||
last_enum_value = 0;
|
||||
}
|
||||
}
|
||||
length = sprintf(cbuf, "(0x%08x) %s;\n", value, type->name);
|
||||
ui_set_signal_text_cb(user_data, cbuf, length);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int enum_value_file_print(types_t *type, int indent, FILE *file)
|
||||
{
|
||||
if (type == NULL)
|
||||
return -1;
|
||||
INDENTED(file, indent, fprintf(file, "<Value>\n"));
|
||||
INDENTED(file, indent+4, fprintf(file, "Name .......: %s\n", type->name));
|
||||
INDENTED(file, indent+4, fprintf(file, "Value ......: %d\n", type->init_value));
|
||||
if (type->file_ref != NULL)
|
||||
type->file_ref->type_file_print(type->file_ref, indent+4, file);
|
||||
INDENTED(file, indent, fprintf(file, "</Value>\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int enum_value_type_hr_display(types_t *type, int indent)
|
||||
{
|
||||
if (type == NULL)
|
||||
return -1;
|
||||
INDENTED(stdout, indent, printf("<Value>\n"));
|
||||
INDENTED(stdout, indent+4, printf("Name .......: %s\n", type->name));
|
||||
INDENTED(stdout, indent+4, printf("Value ......: %d\n", type->init_value));
|
||||
if (type->file_ref != NULL)
|
||||
type->file_ref->type_hr_display(type->file_ref, indent+4);
|
||||
INDENTED(stdout, indent, printf("</Value>\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#ifndef ENUM_VALUE_TYPE_H_
|
||||
#define ENUM_VALUE_TYPE_H_
|
||||
|
||||
extern uint32_t last_enum_value;
|
||||
|
||||
int enum_value_dissect_from_buffer(
|
||||
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
|
||||
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
|
||||
|
||||
int enum_value_file_print(types_t *type, int indent, FILE *file);
|
||||
|
||||
int enum_value_type_hr_display(types_t *type, int indent);
|
||||
|
||||
#endif /* ENUM_VALUE_TYPE_H_ */
|
||||
@@ -1,180 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#define G_LOG_DOMAIN ("PARSER")
|
||||
|
||||
#include "rc.h"
|
||||
|
||||
#include "field_type.h"
|
||||
#include "buffers.h"
|
||||
#include "ui_interface.h"
|
||||
|
||||
int field_dissect_from_buffer(
|
||||
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
|
||||
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
|
||||
{
|
||||
int length = 0;
|
||||
char cbuf[50 + (type->name ? strlen (type->name) : 0)];
|
||||
types_t *type_child;
|
||||
char array_info[50];
|
||||
new_line = FALSE;
|
||||
|
||||
DISPLAY_PARSE_INFO("field", type->name, offset, parent_offset);
|
||||
|
||||
CHECK_FCT(buffer_has_enouch_data(buffer, parent_offset + offset, type->size / 8));
|
||||
|
||||
if (type->bits == -1) {
|
||||
if ((type->name != NULL) && (strcmp(type->name, "_asn_ctx") == 0)) {
|
||||
/* Hide ASN1 asn_struct_ctx_t struct that hold context for parsing across buffer boundaries */
|
||||
/*
|
||||
INDENTED_STRING(cbuf, indent, sprintf(cbuf, ".asn_ctx ...\n"));
|
||||
length = strlen (cbuf);
|
||||
|
||||
ui_set_signal_text_cb(user_data, cbuf, length);
|
||||
*/
|
||||
}
|
||||
else {
|
||||
if (type->child != NULL) {
|
||||
/* Ignore TYPEDEF children */
|
||||
for (type_child = type->child; type_child != NULL && type_child->type == TYPE_TYPEDEF; type_child =
|
||||
type_child->child) {
|
||||
}
|
||||
|
||||
if (type_child->type == TYPE_ARRAY) {
|
||||
types_t *type_array_child;
|
||||
|
||||
/* Ignore TYPEDEF children */
|
||||
for (type_array_child = type_child->child;
|
||||
type_array_child != NULL && type_array_child->type == TYPE_TYPEDEF; type_array_child =
|
||||
type_array_child->child) {
|
||||
}
|
||||
|
||||
sprintf (array_info, "[%d]", type_child->size / type_array_child->size);
|
||||
}
|
||||
else {
|
||||
array_info[0] = '\0';
|
||||
}
|
||||
|
||||
DISPLAY_TYPE("Fld");
|
||||
|
||||
INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, ".%s%s = ", type->name ? type->name : "Field", array_info));
|
||||
ui_set_signal_text_cb(user_data, cbuf, length);
|
||||
|
||||
if (type_child->type == TYPE_ARRAY) {
|
||||
DISPLAY_BRACE(ui_set_signal_text_cb(user_data, "{", 1);)
|
||||
ui_set_signal_text_cb(user_data, "\n", 1);
|
||||
new_line = TRUE;
|
||||
}
|
||||
/*
|
||||
if (type_child->type == TYPE_STRUCT || type_child->type == TYPE_UNION) {
|
||||
DISPLAY_BRACE(ui_set_signal_text_cb(user_data, "{", 1);)
|
||||
ui_set_signal_text_cb(user_data, "\n", 1);
|
||||
new_line = TRUE;
|
||||
}
|
||||
*/
|
||||
|
||||
type->child->parent = type;
|
||||
type->child->type_dissect_from_buffer(
|
||||
type->child, ui_set_signal_text_cb, user_data, buffer,
|
||||
parent_offset, offset + type->offset, new_line ? indent + DISPLAY_TAB_SIZE : indent, new_line);
|
||||
|
||||
DISPLAY_BRACE(
|
||||
if (type_child->type == TYPE_ARRAY) {
|
||||
DISPLAY_TYPE("Fld");
|
||||
|
||||
INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "};\n"));
|
||||
ui_set_signal_text_cb(user_data, cbuf, length);
|
||||
});
|
||||
/*
|
||||
DISPLAY_BRACE(
|
||||
if (type_child->type == TYPE_STRUCT || type_child->type == TYPE_UNION) {
|
||||
DISPLAY_TYPE("Fld");
|
||||
INDENTED_STRING(cbuf, indent, sprintf(cbuf, "};\n"));
|
||||
length = strlen (cbuf);
|
||||
|
||||
ui_set_signal_text_cb(user_data, cbuf, length);
|
||||
});
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* The field is only composed of bits */
|
||||
uint32_t value = 0;
|
||||
|
||||
CHECK_FCT(buffer_fetch_bits(buffer, offset + type->offset + parent_offset, type->bits, &value));
|
||||
|
||||
DISPLAY_TYPE("Fld");
|
||||
|
||||
INDENTED_STRING(cbuf, indent,
|
||||
length = sprintf(cbuf, ".%s:%d = (0x%0*x) %d;\n", type->name ? type->name : "Field", type->bits, (type->bits + 3) / 4, value, value));
|
||||
ui_set_signal_text_cb(user_data, cbuf, length);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int field_type_file_print(types_t *type, int indent, FILE *file) {
|
||||
if (type == NULL)
|
||||
return -1;
|
||||
INDENTED(file, indent, fprintf(file, "<Field>\n"));
|
||||
INDENTED(file, indent+4, fprintf(file, "Id .........: %d\n", type->id));
|
||||
INDENTED(file, indent+4, fprintf(file, "Name .......: %s\n", type->name));
|
||||
INDENTED(file, indent+4, fprintf(file, "Bits .......: %d\n", type->bits));
|
||||
INDENTED(file, indent+4, fprintf(file, "Type .......: %d\n", type->type_xml));
|
||||
INDENTED(file, indent+4, fprintf(file, "Offset .....: %d\n", type->offset));
|
||||
INDENTED(file, indent+4, fprintf(file, "Context ....: %d\n", type->context));
|
||||
INDENTED(file, indent+4, fprintf(file, "File .......: %s\n", type->file));
|
||||
INDENTED(file, indent+4, fprintf(file, "Line .......: %d\n", type->line));
|
||||
if (type->file_ref != NULL)
|
||||
type->file_ref->type_file_print (type->file_ref, indent + 4, file);
|
||||
if (type->child != NULL)
|
||||
type->child->type_file_print (type->child, indent + 4, file);
|
||||
INDENTED(file, indent, fprintf(file, "</Field>\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int field_type_hr_display(types_t *type, int indent) {
|
||||
if (type == NULL)
|
||||
return -1;
|
||||
INDENTED(stdout, indent, printf("<Field>\n"));
|
||||
INDENTED(stdout, indent+4, printf("Id .........: %d\n", type->id));
|
||||
INDENTED(stdout, indent+4, printf("Name .......: %s\n", type->name));
|
||||
INDENTED(stdout, indent+4, printf("Bits .......: %d\n", type->bits));
|
||||
INDENTED(stdout, indent+4, printf("Type .......: %d\n", type->type_xml));
|
||||
INDENTED(stdout, indent+4, printf("Offset .....: %d\n", type->offset));
|
||||
INDENTED(stdout, indent+4, printf("Context ....: %d\n", type->context));
|
||||
INDENTED(stdout, indent+4, printf("File .......: %s\n", type->file));
|
||||
INDENTED(stdout, indent+4, printf("Line .......: %d\n", type->line));
|
||||
if (type->file_ref != NULL)
|
||||
type->file_ref->type_hr_display (type->file_ref, indent + 4);
|
||||
if (type->child != NULL)
|
||||
type->child->type_hr_display (type->child, indent + 4);
|
||||
INDENTED(stdout, indent, printf("</Field>\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#ifndef FIELD_TYPE_H_
|
||||
#define FIELD_TYPE_H_
|
||||
|
||||
int field_dissect_from_buffer(
|
||||
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
|
||||
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
|
||||
|
||||
int field_type_file_print(types_t *type, int indent, FILE *file);
|
||||
|
||||
int field_type_hr_display(types_t *type, int indent);
|
||||
|
||||
#endif /* FIELD_TYPE_H_ */
|
||||
@@ -1,53 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#define G_LOG_DOMAIN ("PARSER")
|
||||
|
||||
#include "file_type.h"
|
||||
|
||||
int file_type_file_print(types_t *type, int indent, FILE *file)
|
||||
{
|
||||
if (type == NULL)
|
||||
return -1;
|
||||
INDENTED(file, indent, fprintf(file, "<File>\n"));
|
||||
INDENTED(file, indent+4, fprintf(file, "Id .........: %d\n", type->id));
|
||||
INDENTED(file, indent+4, fprintf(file, "Name .......: %s\n", type->name));
|
||||
INDENTED(file, indent, fprintf(file, "</File>\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int file_type_hr_display(types_t *type, int indent)
|
||||
{
|
||||
if (type == NULL)
|
||||
return -1;
|
||||
INDENTED(stdout, indent, printf("<File>\n"));
|
||||
INDENTED(stdout, indent+4, printf("Id .........: %d\n", type->id));
|
||||
INDENTED(stdout, indent+4, printf("Name .......: %s\n", type->name));
|
||||
INDENTED(stdout, indent, printf("</File>\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#ifndef FILE_TYPE_H_
|
||||
#define FILE_TYPE_H_
|
||||
|
||||
int file_type_file_print(types_t *type, int indent, FILE *file);
|
||||
|
||||
int file_type_hr_display(types_t *type, int indent);
|
||||
|
||||
#endif /* FILE_TYPE_H_ */
|
||||
@@ -1,144 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
#define G_LOG_DOMAIN ("PARSER")
|
||||
|
||||
#include "fundamental_type.h"
|
||||
#include "ui_interface.h"
|
||||
|
||||
uint64_t fundamental_read_from_buffer(types_t *type, buffer_t *buffer, uint32_t offset, uint32_t parent_offset) {
|
||||
uint64_t value;
|
||||
|
||||
switch (type->size) {
|
||||
case 8:
|
||||
value = buffer_get_uint8_t (buffer, offset + parent_offset);
|
||||
break;
|
||||
|
||||
case 16:
|
||||
value = buffer_get_uint16_t (buffer, offset + parent_offset);
|
||||
break;
|
||||
|
||||
case 32:
|
||||
value = buffer_get_uint32_t (buffer, offset + parent_offset);
|
||||
break;
|
||||
|
||||
case 64:
|
||||
value = buffer_get_uint64_t (buffer, offset + parent_offset);
|
||||
break;
|
||||
|
||||
default:
|
||||
/* ??? */
|
||||
value = 0;
|
||||
break;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
int fundamental_dissect_from_buffer(
|
||||
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
|
||||
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
|
||||
{
|
||||
int length = 0;
|
||||
char cbuf[200];
|
||||
int type_unsigned;
|
||||
uint8_t value8;
|
||||
uint16_t value16;
|
||||
uint32_t value32;
|
||||
uint64_t value64;
|
||||
|
||||
DISPLAY_PARSE_INFO("fundamental", type->name, offset, parent_offset);
|
||||
|
||||
memset (cbuf, 0, 200);
|
||||
|
||||
type_unsigned = strstr (type->name, "unsigned") == NULL ? 0 : 1;
|
||||
|
||||
value64 = fundamental_read_from_buffer(type, buffer, offset, parent_offset);
|
||||
|
||||
indent = new_line ? indent : 0;
|
||||
if (indent > 0)
|
||||
{
|
||||
DISPLAY_TYPE("Fun");
|
||||
}
|
||||
switch (type->size) {
|
||||
case 8:
|
||||
value8 = (uint8_t) value64;
|
||||
INDENTED_STRING(cbuf, indent,
|
||||
length = sprintf(cbuf, type_unsigned ? "(0x%02" PRIx8 ") %3" PRIu8 ";\n" : "(0x%02" PRIx8 ") %4" PRId8 ";\n", value8, value8));
|
||||
break;
|
||||
|
||||
case 16:
|
||||
value16 = (uint16_t) value64;
|
||||
INDENTED_STRING(cbuf, indent,
|
||||
length = sprintf(cbuf, type_unsigned ? "(0x%04" PRIx16 ") %5" PRIu16 ";\n" : "(0x%04" PRIx16 ") %6" PRId16 ";\n", value16, value16));
|
||||
break;
|
||||
|
||||
case 32:
|
||||
value32 = (uint32_t) value64;
|
||||
INDENTED_STRING(cbuf, indent,
|
||||
length = sprintf(cbuf, type_unsigned ? "(0x%08" PRIx32 ") %9" PRIu32 ";\n" : "(0x%08" PRIx32 ") %10" PRId32 ";\n", value32, value32));
|
||||
break;
|
||||
|
||||
case 64:
|
||||
INDENTED_STRING(cbuf, indent,
|
||||
length = sprintf(cbuf, type_unsigned ? "(0x%016" PRIx64 ") %20" PRIu64 ";\n" : "(0x%016" PRIx64 ") %20" PRId64 ";\n", value64, value64));
|
||||
break;
|
||||
|
||||
default:
|
||||
/* ??? */
|
||||
break;
|
||||
}
|
||||
ui_set_signal_text_cb(user_data, cbuf, length);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fundamental_type_file_print(types_t *type, int indent, FILE *file) {
|
||||
if (type == NULL)
|
||||
return -1;
|
||||
INDENTED(file, indent, fprintf(file, "<Fundamental>\n"));
|
||||
INDENTED(file, indent+4, fprintf(file, "Name .......: %s\n", type->name));
|
||||
INDENTED(file, indent+4, fprintf(file, "Id .........: %d\n", type->id));
|
||||
INDENTED(file, indent+4, fprintf(file, "Size .......: %d\n", type->size));
|
||||
INDENTED(file, indent+4, fprintf(file, "Align ......: %d\n", type->align));
|
||||
if (type->file_ref != NULL)
|
||||
type->file_ref->type_file_print (type->file_ref, indent + 4, file);
|
||||
INDENTED(file, indent, fprintf(file, "</Fundamental>\n"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fundamental_type_hr_display(types_t *type, int indent) {
|
||||
if (type == NULL)
|
||||
return -1;
|
||||
INDENTED(stdout, indent, printf("<Fundamental>\n"));
|
||||
INDENTED(stdout, indent+4, printf("Name .......: %s\n", type->name));
|
||||
INDENTED(stdout, indent+4, printf("Id .........: %d\n", type->id));
|
||||
INDENTED(stdout, indent+4, printf("Size .......: %d\n", type->size));
|
||||
INDENTED(stdout, indent+4, printf("Align ......: %d\n", type->align));
|
||||
if (type->file_ref != NULL)
|
||||
type->file_ref->type_hr_display (type->file_ref, indent + 4);
|
||||
INDENTED(stdout, indent, printf("</Fundamental>\n"));
|
||||
return 0;
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#ifndef FUNDAMENTAL_TYPE_H_
|
||||
#define FUNDAMENTAL_TYPE_H_
|
||||
|
||||
uint64_t fundamental_read_from_buffer(types_t *type, buffer_t *buffer, uint32_t offset, uint32_t parent_offset);
|
||||
|
||||
int fundamental_dissect_from_buffer(
|
||||
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
|
||||
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
|
||||
|
||||
int fundamental_type_file_print(types_t *type, int indent, FILE *file);
|
||||
|
||||
int fundamental_type_hr_display(types_t *type, int indent);
|
||||
|
||||
#endif /* FUNDAMENTAL_TYPE_H_ */
|
||||
@@ -1,35 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include "fundamental_type.h"
|
||||
#include "struct_type.h"
|
||||
|
||||
#ifndef INTERTASK_CONTEXTS_H_
|
||||
#define INTERTASK_CONTEXTS_H_
|
||||
|
||||
typedef struct {
|
||||
/* List of fundamental types that can contruct any other type */
|
||||
fundamental_type_t *ft_list;
|
||||
|
||||
struct_type_t *struct_list;
|
||||
} intertask_context_t;
|
||||
|
||||
#endif /* INTERTASK_CONTEXTS_H_ */
|
||||
@@ -1,103 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#define G_LOG_DOMAIN ("PARSER")
|
||||
|
||||
#include "pointer_type.h"
|
||||
#include "ui_interface.h"
|
||||
|
||||
int pointer_dissect_from_buffer(
|
||||
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
|
||||
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
|
||||
{
|
||||
int length = 0, i;
|
||||
char cbuf[200];
|
||||
|
||||
DISPLAY_PARSE_INFO("pointer", type->name, offset, parent_offset);
|
||||
|
||||
memset (cbuf, 0, 200);
|
||||
|
||||
uint8_t value[type->size / 8];
|
||||
|
||||
buffer_fetch_nbytes(buffer, parent_offset + offset, type->size / 8, value);
|
||||
|
||||
indent = new_line ? indent : 0;
|
||||
if (indent > 0)
|
||||
{
|
||||
DISPLAY_TYPE("Ptr");
|
||||
}
|
||||
if (type->child && type->child->name) {
|
||||
/*
|
||||
INDENTED(stdout, indent, fprintf(stdout, "<%s>0x%08x</%s>\n",
|
||||
type->child->name, value, type->child->name));
|
||||
*/
|
||||
INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "(%s *) 0x", type->child->name));
|
||||
}
|
||||
else {
|
||||
/*
|
||||
INDENTED(stdout, indent, fprintf(stdout, "<Pointer>0x%08x</Pointer>\n",
|
||||
value));
|
||||
*/
|
||||
INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "(void *) 0x"));
|
||||
}
|
||||
|
||||
/* Append the value */
|
||||
for (i = type->size / 8 - 1; i >= 0; i--) {
|
||||
length += sprintf(&cbuf[length], "%02x", value[i]);
|
||||
}
|
||||
length += sprintf(&cbuf[length], ";\n");
|
||||
ui_set_signal_text_cb(user_data, cbuf, length);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pointer_type_file_print(types_t *type, int indent, FILE *file) {
|
||||
if (type == NULL)
|
||||
return -1;
|
||||
INDENTED(file, indent, fprintf(file, "<Pointer>\n"));
|
||||
INDENTED(file, indent+4, fprintf(file, "Id .........: %d\n", type->id));
|
||||
INDENTED(file, indent+4, fprintf(file, "Type .......: %d\n", type->type_xml));
|
||||
INDENTED(file, indent+4, fprintf(file, "Size .......: %d\n", type->size));
|
||||
INDENTED(file, indent+4, fprintf(file, "Align ......: %d\n", type->align));
|
||||
if (type->child != NULL) {
|
||||
if (type->child->type == TYPE_FUNCTION) {
|
||||
INDENTED(file, indent+4, fprintf(file, "<Function>\n"));
|
||||
INDENTED(file, indent+8, fprintf(file, "<Args>To be done</Args>\n"));
|
||||
INDENTED(file, indent+4, fprintf(file, "</Function>\n"));
|
||||
} else {
|
||||
type->child->type_file_print (type->child, indent + 4, file);
|
||||
}
|
||||
}
|
||||
if (type->file_ref != NULL)
|
||||
type->file_ref->type_file_print (type->file_ref, indent + 4, file);
|
||||
INDENTED(file, indent, fprintf(file, "</Pointer>\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pointer_type_hr_display(types_t *type, int indent) {
|
||||
return pointer_type_file_print(type, indent, stdout);
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#ifndef POINTER_TYPE_H_
|
||||
#define POINTER_TYPE_H_
|
||||
|
||||
int pointer_dissect_from_buffer(
|
||||
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
|
||||
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
|
||||
|
||||
int pointer_type_file_print(types_t *type, int indent, FILE *file);
|
||||
|
||||
int pointer_type_hr_display(types_t *type, int indent);
|
||||
|
||||
#endif /* POINTER_TYPE_H_ */
|
||||
@@ -1,96 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#define G_LOG_DOMAIN ("PARSER")
|
||||
|
||||
#include "reference_type.h"
|
||||
#include "ui_interface.h"
|
||||
|
||||
int reference_dissect_from_buffer(
|
||||
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
|
||||
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
|
||||
{
|
||||
DISPLAY_PARSE_INFO("reference", type->name, offset, parent_offset);
|
||||
|
||||
if (type->name) {
|
||||
INDENTED(stdout, indent, fprintf(stdout, "<%s>\n", type->name));
|
||||
}
|
||||
if (type->child != NULL)
|
||||
type->child->type_dissect_from_buffer(type->child, ui_set_signal_text_cb,
|
||||
user_data, buffer, offset, parent_offset,
|
||||
type->name == NULL ? indent: indent + DISPLAY_TAB_SIZE, TRUE);
|
||||
if (type->name) {
|
||||
INDENTED(stdout, indent, fprintf(stdout, "</%s>\n", type->name));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int reference_type_file_print(types_t *type, int indent, FILE *file)
|
||||
{
|
||||
if (type == NULL)
|
||||
return -1;
|
||||
INDENTED(file, indent, fprintf(file, "<Reference>\n"));
|
||||
INDENTED(file, indent+4, fprintf(file, "Name .......: %s\n", type->name));
|
||||
INDENTED(file, indent+4, fprintf(file, "Id .........: %d\n", type->id));
|
||||
INDENTED(file, indent+4, fprintf(file, "Type .......: %d\n", type->type_xml));
|
||||
INDENTED(file, indent+4, fprintf(file, "Size .......: %d\n", type->size));
|
||||
INDENTED(file, indent+4, fprintf(file, "Align ......: %d\n", type->align));
|
||||
INDENTED(file, indent+4, fprintf(file, "Context ....: %d\n", type->context));
|
||||
INDENTED(file, indent+4, fprintf(file, "Offset .....: %d\n", type->offset));
|
||||
INDENTED(file, indent+4, fprintf(file, "Line .......: %d\n", type->line));
|
||||
INDENTED(file, indent+4, fprintf(file, "File .......: %s\n", type->file));
|
||||
if (type->child != NULL)
|
||||
type->child->type_file_print(type->child, indent+4, file);
|
||||
if (type->file_ref != NULL)
|
||||
type->file_ref->type_file_print(type->file_ref, indent+4, file);
|
||||
INDENTED(file, indent, fprintf(file, "</Reference>\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int reference_type_hr_display(types_t *type, int indent)
|
||||
{
|
||||
if (type == NULL)
|
||||
return -1;
|
||||
INDENTED(stdout, indent, printf("<Reference>\n"));
|
||||
INDENTED(stdout, indent+4, printf("Name .......: %s\n", type->name));
|
||||
INDENTED(stdout, indent+4, printf("Id .........: %d\n", type->id));
|
||||
INDENTED(stdout, indent+4, printf("Type .......: %d\n", type->type_xml));
|
||||
INDENTED(stdout, indent+4, printf("Size .......: %d\n", type->size));
|
||||
INDENTED(stdout, indent+4, printf("Align ......: %d\n", type->align));
|
||||
INDENTED(stdout, indent+4, printf("Context ....: %d\n", type->context));
|
||||
INDENTED(stdout, indent+4, printf("Offset .....: %d\n", type->offset));
|
||||
INDENTED(stdout, indent+4, printf("Line .......: %d\n", type->line));
|
||||
INDENTED(stdout, indent+4, printf("File .......: %s\n", type->file));
|
||||
if (type->child != NULL)
|
||||
type->child->type_hr_display(type->child, indent+4);
|
||||
if (type->file_ref != NULL)
|
||||
type->file_ref->type_hr_display(type->file_ref, indent+4);
|
||||
INDENTED(stdout, indent, printf("</Reference>\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#ifndef REFERENCE_TYPE_H_
|
||||
#define REFERENCE_TYPE_H_
|
||||
|
||||
int reference_dissect_from_buffer(
|
||||
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
|
||||
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
|
||||
|
||||
int reference_type_file_print(types_t *type, int indent, FILE *file);
|
||||
|
||||
int reference_type_hr_display(types_t *type, int indent);
|
||||
|
||||
#endif /* REFERENCE_TYPE_H_ */
|
||||
@@ -1,148 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#define G_LOG_DOMAIN ("PARSER")
|
||||
|
||||
#include "rc.h"
|
||||
|
||||
#include "struct_type.h"
|
||||
#include "buffers.h"
|
||||
#include "ui_callbacks.h"
|
||||
#include "ui_interface.h"
|
||||
|
||||
int struct_dissect_from_buffer(
|
||||
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
|
||||
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
|
||||
{
|
||||
int i;
|
||||
char cbuf[50 + (type->name ? strlen (type->name) : 0)];
|
||||
int length = 0;
|
||||
char *name;
|
||||
|
||||
memset (cbuf, 0, sizeof(cbuf));
|
||||
|
||||
DISPLAY_PARSE_INFO("structure", type->name, offset, parent_offset);
|
||||
|
||||
if (new_line) {
|
||||
DISPLAY_TYPE("Str");
|
||||
}
|
||||
|
||||
if (type->name) {
|
||||
name = type->name;
|
||||
}
|
||||
else {
|
||||
name = "_anonymous_";
|
||||
}
|
||||
|
||||
if ((strcmp (name, "IttiMsgText_s") == 0) &&
|
||||
(type->members_child[0] != NULL) && (strcmp (type->members_child[0]->name, "size") == 0) &&
|
||||
(type->members_child[1] != NULL) && (strcmp (type->members_child[1]->name, "text") == 0)) {
|
||||
uint8_t *buf;
|
||||
|
||||
length = buffer_get_uint32_t (buffer, offset + parent_offset);
|
||||
buf = malloc (length + 1);
|
||||
buf[0] = '\n';
|
||||
buffer_fetch_nbytes(buffer, parent_offset + offset + 32, length, &buf[1]);
|
||||
length = ui_callback_check_string ((char *) &buf[1], length, 0);
|
||||
ui_set_signal_text_cb(user_data, (char *) buf, length + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
INDENTED_STRING(cbuf, new_line ? indent : 0, length = sprintf (cbuf, "%s :", name));
|
||||
DISPLAY_BRACE(length += sprintf(&cbuf[length], " {"););
|
||||
length += sprintf(&cbuf[length], "\n");
|
||||
ui_set_signal_text_cb(user_data, cbuf, length);
|
||||
|
||||
for (i = 0; i < type->nb_members; i++) {
|
||||
if (type->members_child[i] != NULL)
|
||||
type->members_child[i]->type_dissect_from_buffer (
|
||||
type->members_child[i], ui_set_signal_text_cb, user_data,
|
||||
buffer, offset, parent_offset, indent + DISPLAY_TAB_SIZE, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
DISPLAY_BRACE(
|
||||
DISPLAY_TYPE("Str");
|
||||
|
||||
INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "};\n"));
|
||||
ui_set_signal_text_cb(user_data, cbuf, length);)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int struct_type_file_print(types_t *type, int indent, FILE *file) {
|
||||
int i;
|
||||
if (type == NULL)
|
||||
return -1;
|
||||
if (file == NULL)
|
||||
return -1;
|
||||
INDENTED(file, indent, fprintf(file, "<Struct>\n"));
|
||||
INDENTED(file, indent+4, fprintf(file, "Name .......: %s\n", type->name));
|
||||
INDENTED(file, indent+4, fprintf(file, "Id .........: %d\n", type->id));
|
||||
INDENTED(file, indent+4, fprintf(file, "Size .......: %d\n", type->size));
|
||||
INDENTED(file, indent+4, fprintf(file, "Align ......: %d\n", type->align));
|
||||
INDENTED(file, indent+4, fprintf(file, "Artificial .: %d\n", type->artificial));
|
||||
INDENTED(file, indent+4, fprintf(file, "File .......: %s\n", type->file));
|
||||
INDENTED(file, indent+4, fprintf(file, "Line .......: %d\n", type->line));
|
||||
INDENTED(file, indent+4, fprintf(file, "Members ....: %s\n", type->members));
|
||||
INDENTED(file, indent+4, fprintf(file, "Mangled ....: %s\n", type->mangled));
|
||||
INDENTED(file, indent+4, fprintf(file, "Demangled ..: %s\n", type->demangled));
|
||||
if (type->file_ref != NULL)
|
||||
type->file_ref->type_file_print (type->file_ref, indent + 4, file);
|
||||
for (i = 0; i < type->nb_members; i++) {
|
||||
if (type->members_child[i] != NULL)
|
||||
type->members_child[i]->type_file_print (type->members_child[i], indent + 4, file);
|
||||
}
|
||||
INDENTED(file, indent, fprintf(file, "</Struct>\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int struct_type_hr_display(types_t *type, int indent) {
|
||||
int i;
|
||||
if (type == NULL)
|
||||
return -1;
|
||||
INDENTED(stdout, indent, printf("<Struct>\n"));
|
||||
INDENTED(stdout, indent+4, printf("Name .......: %s\n", type->name));
|
||||
INDENTED(stdout, indent+4, printf("Id .........: %d\n", type->id));
|
||||
INDENTED(stdout, indent+4, printf("Size .......: %d\n", type->size));
|
||||
INDENTED(stdout, indent+4, printf("Align ......: %d\n", type->align));
|
||||
INDENTED(stdout, indent+4, printf("Artificial .: %d\n", type->artificial));
|
||||
INDENTED(stdout, indent+4, printf("File .......: %s\n", type->file));
|
||||
INDENTED(stdout, indent+4, printf("Line .......: %d\n", type->line));
|
||||
INDENTED(stdout, indent+4, printf("Members ....: %s\n", type->members));
|
||||
INDENTED(stdout, indent+4, printf("Mangled ....: %s\n", type->mangled));
|
||||
INDENTED(stdout, indent+4, printf("Demangled ..: %s\n", type->demangled));
|
||||
if (type->file_ref != NULL)
|
||||
type->file_ref->type_hr_display (type->file_ref, indent + 4);
|
||||
for (i = 0; i < type->nb_members; i++) {
|
||||
if (type->members_child[i] != NULL)
|
||||
type->members_child[i]->type_hr_display (type->members_child[i], indent + 4);
|
||||
}
|
||||
INDENTED(stdout, indent, printf("</Struct>\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#ifndef STRUCT_TYPE_H_
|
||||
#define STRUCT_TYPE_H_
|
||||
|
||||
int struct_dissect_from_buffer(
|
||||
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
|
||||
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
|
||||
|
||||
int struct_type_hr_display(types_t *type, int indent);
|
||||
|
||||
int struct_type_file_print(types_t *type, int indent, FILE *file);
|
||||
|
||||
#endif /* STRUCT_TYPE_H_ */
|
||||
@@ -1,113 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#define G_LOG_DOMAIN ("PARSER")
|
||||
|
||||
#include "typedef_type.h"
|
||||
#include "ui_interface.h"
|
||||
|
||||
int typedef_dissect_from_buffer(
|
||||
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
|
||||
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
|
||||
{
|
||||
int length = 0;
|
||||
char cbuf[50 + (type->name ? strlen (type->name) : 0)];
|
||||
types_t *type_child = NULL;
|
||||
|
||||
DISPLAY_PARSE_INFO("typedef", type->name, offset, parent_offset);
|
||||
|
||||
if (type->child != NULL) {
|
||||
/* Ignore TYPEDEF children */
|
||||
for (type_child = type->child; type_child != NULL && type_child->type == TYPE_TYPEDEF; type_child =
|
||||
type_child->child) {
|
||||
}
|
||||
}
|
||||
|
||||
if ((type_child == NULL) || (type_child->type != TYPE_FUNDAMENTAL))
|
||||
{
|
||||
INDENTED_STRING(cbuf, new_line ? indent : 0, length = sprintf (cbuf, "%s, ", type->name));
|
||||
ui_set_signal_text_cb(user_data, cbuf, length);
|
||||
|
||||
new_line = FALSE;
|
||||
}
|
||||
|
||||
/* Simply call next_type */
|
||||
if (type->child != NULL) {
|
||||
type->child->parent = type;
|
||||
type->child->type_dissect_from_buffer(
|
||||
type->child, ui_set_signal_text_cb, user_data, buffer, offset, parent_offset, indent, new_line);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int typedef_type_file_print(types_t *type, int indent, FILE *file)
|
||||
{
|
||||
if (type == NULL)
|
||||
return -1;
|
||||
INDENTED(file, indent, fprintf(file, "<Typedef>\n"));
|
||||
INDENTED(file, indent+4, fprintf(file, "Name .......: %s\n", type->name));
|
||||
INDENTED(file, indent+4, fprintf(file, "Type .......: %d\n", type->type_xml));
|
||||
INDENTED(file, indent+4, fprintf(file, "Size .......: %d\n", type->size));
|
||||
INDENTED(file, indent+4, fprintf(file, "Align ......: %d\n", type->align));
|
||||
INDENTED(file, indent+4, fprintf(file, "Artificial .: %d\n", type->artificial));
|
||||
INDENTED(file, indent+4, fprintf(file, "File .......: %s\n", type->file));
|
||||
INDENTED(file, indent+4, fprintf(file, "Line .......: %d\n", type->line));
|
||||
INDENTED(file, indent+4, fprintf(file, "Members ....: %s\n", type->members));
|
||||
INDENTED(file, indent+4, fprintf(file, "Mangled ....: %s\n", type->mangled));
|
||||
INDENTED(file, indent+4, fprintf(file, "Demangled ..: %s\n", type->demangled));
|
||||
if (type->file_ref != NULL)
|
||||
type->file_ref->type_file_print(type->file_ref, indent+4, file);
|
||||
if (type->child != NULL)
|
||||
type->child->type_file_print(type->child, indent+4, file);
|
||||
INDENTED(file, indent, fprintf(file, "</Typedef>\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int typedef_type_hr_display(types_t *type, int indent)
|
||||
{
|
||||
if (type == NULL)
|
||||
return -1;
|
||||
INDENTED(stdout, indent, printf("<Typedef>\n"));
|
||||
INDENTED(stdout, indent+4, printf("Name .......: %s\n", type->name));
|
||||
INDENTED(stdout, indent+4, printf("Type .......: %d\n", type->type_xml));
|
||||
INDENTED(stdout, indent+4, printf("Size .......: %d\n", type->size));
|
||||
INDENTED(stdout, indent+4, printf("Align ......: %d\n", type->align));
|
||||
INDENTED(stdout, indent+4, printf("Artificial .: %d\n", type->artificial));
|
||||
INDENTED(stdout, indent+4, printf("File .......: %s\n", type->file));
|
||||
INDENTED(stdout, indent+4, printf("Line .......: %d\n", type->line));
|
||||
INDENTED(stdout, indent+4, printf("Members ....: %s\n", type->members));
|
||||
INDENTED(stdout, indent+4, printf("Mangled ....: %s\n", type->mangled));
|
||||
INDENTED(stdout, indent+4, printf("Demangled ..: %s\n", type->demangled));
|
||||
if (type->file_ref != NULL)
|
||||
type->file_ref->type_hr_display(type->file_ref, indent+4);
|
||||
if (type->child != NULL)
|
||||
type->child->type_hr_display(type->child, indent+4);
|
||||
INDENTED(stdout, indent, printf("</Typedef>\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#ifndef TYPEDEF_TYPE_H_
|
||||
#define TYPEDEF_TYPE_H_
|
||||
|
||||
int typedef_type_file_print(types_t *type, int indent, FILE *file);
|
||||
|
||||
int typedef_type_hr_display(types_t *type, int indent);
|
||||
|
||||
int typedef_dissect_from_buffer(
|
||||
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
|
||||
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
|
||||
|
||||
#endif /* TYPEDEF_TYPE_H_ */
|
||||
@@ -1,147 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define G_LOG_DOMAIN ("PARSER")
|
||||
|
||||
#include "types.h"
|
||||
#include "array_type.h"
|
||||
#include "enum_type.h"
|
||||
#include "fundamental_type.h"
|
||||
#include "struct_type.h"
|
||||
#include "union_type.h"
|
||||
#include "typedef_type.h"
|
||||
#include "enum_value_type.h"
|
||||
#include "file_type.h"
|
||||
#include "field_type.h"
|
||||
#include "reference_type.h"
|
||||
#include "pointer_type.h"
|
||||
|
||||
types_t *type_new(enum type_e type)
|
||||
{
|
||||
types_t *new_p;
|
||||
|
||||
new_p = calloc(1, sizeof(types_t));
|
||||
|
||||
new_p->type = type;
|
||||
|
||||
switch(type) {
|
||||
case TYPE_FUNCTION:
|
||||
/* Nothing to do for now. Display is done by pointer type */
|
||||
break;
|
||||
case TYPE_ENUMERATION:
|
||||
new_p->type_hr_display = enum_type_hr_display;
|
||||
new_p->type_file_print = enum_type_file_print;
|
||||
new_p->type_dissect_from_buffer = enum_type_dissect_from_buffer;
|
||||
break;
|
||||
case TYPE_FUNDAMENTAL:
|
||||
new_p->type_hr_display = fundamental_type_hr_display;
|
||||
new_p->type_file_print = fundamental_type_file_print;
|
||||
new_p->type_dissect_from_buffer = fundamental_dissect_from_buffer;
|
||||
break;
|
||||
case TYPE_STRUCT:
|
||||
new_p->type_hr_display = struct_type_hr_display;
|
||||
new_p->type_file_print = struct_type_file_print;
|
||||
new_p->type_dissect_from_buffer = struct_dissect_from_buffer;
|
||||
break;
|
||||
case TYPE_UNION:
|
||||
new_p->type_hr_display = union_type_hr_display;
|
||||
new_p->type_file_print = union_type_file_print;
|
||||
new_p->type_dissect_from_buffer = union_dissect_from_buffer;
|
||||
break;
|
||||
case TYPE_TYPEDEF:
|
||||
new_p->type_hr_display = typedef_type_hr_display;
|
||||
new_p->type_file_print = typedef_type_file_print;
|
||||
new_p->type_dissect_from_buffer = typedef_dissect_from_buffer;
|
||||
break;
|
||||
case TYPE_ENUMERATION_VALUE:
|
||||
new_p->type_hr_display = enum_value_type_hr_display;
|
||||
new_p->type_file_print = enum_value_file_print;
|
||||
new_p->type_dissect_from_buffer = enum_value_dissect_from_buffer;
|
||||
break;
|
||||
case TYPE_FILE:
|
||||
new_p->type_hr_display = file_type_hr_display;
|
||||
new_p->type_file_print = file_type_file_print;
|
||||
// new_p->type_dissect_from_buffer = file_dissect_from_buffer;
|
||||
break;
|
||||
case TYPE_FIELD:
|
||||
new_p->type_hr_display = field_type_hr_display;
|
||||
new_p->type_file_print = field_type_file_print;
|
||||
new_p->type_dissect_from_buffer = field_dissect_from_buffer;
|
||||
break;
|
||||
case TYPE_REFERENCE:
|
||||
new_p->type_hr_display = reference_type_hr_display;
|
||||
new_p->type_file_print = reference_type_file_print;
|
||||
new_p->type_dissect_from_buffer = reference_dissect_from_buffer;
|
||||
break;
|
||||
case TYPE_ARRAY:
|
||||
new_p->type_hr_display = array_type_hr_display;
|
||||
new_p->type_file_print = array_type_file_print;
|
||||
new_p->type_dissect_from_buffer = array_dissect_from_buffer;
|
||||
break;
|
||||
case TYPE_POINTER:
|
||||
new_p->type_hr_display = pointer_type_hr_display;
|
||||
new_p->type_file_print = pointer_type_file_print;
|
||||
new_p->type_dissect_from_buffer = pointer_dissect_from_buffer;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return new_p;
|
||||
}
|
||||
|
||||
int types_insert_tail(types_t **head, types_t *to_insert)
|
||||
{
|
||||
if (to_insert == NULL || head == NULL)
|
||||
return -1;
|
||||
if (*head == NULL) {
|
||||
*head = to_insert;
|
||||
} else {
|
||||
types_t *last = *head;
|
||||
while(last->next != NULL) {
|
||||
last = last->next;
|
||||
}
|
||||
last->next = to_insert;
|
||||
to_insert->previous = last;
|
||||
}
|
||||
to_insert->head = *head;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void types_hr_display(types_t *head)
|
||||
{
|
||||
types_t *current = head;
|
||||
|
||||
if (head == NULL) {
|
||||
printf("Empty list\n");
|
||||
/* Empty list */
|
||||
return;
|
||||
}
|
||||
|
||||
while((current = current->next) != NULL)
|
||||
{
|
||||
current->type_hr_display(current, 0);
|
||||
}
|
||||
}
|
||||
@@ -1,187 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "buffers.h"
|
||||
#include "ui_main_screen.h"
|
||||
#include "ui_interface.h"
|
||||
|
||||
#ifndef TYPES_H_
|
||||
#define TYPES_H_
|
||||
|
||||
/* Activate to display the type at the beginning of the line (debug option) */
|
||||
#define ENABLE_DISPLAY_TYPE 0
|
||||
|
||||
/* Activate to display the parse information before processing each item (debug option) */
|
||||
#define ENABLE_DISPLAY_PARSE_INFO 0
|
||||
|
||||
/* Activate to show braces, in increase the number of displayed lines (formating option)*/
|
||||
#define ENABLE_DISPLAY_BRACE 1
|
||||
|
||||
#if (ENABLE_DISPLAY_TYPE != 0)
|
||||
# define DISPLAY_TYPE(tYPE) ui_set_signal_text_cb(user_data, tYPE" ", strlen(tYPE) + 1);
|
||||
#else
|
||||
# define DISPLAY_TYPE(tYPE)
|
||||
#endif
|
||||
|
||||
#define DISPLAY_TAB_SIZE (2)
|
||||
|
||||
#if (ENABLE_DISPLAY_PARSE_INFO != 0)
|
||||
# define DISPLAY_PARSE_INFO(tYPE, nAME, oFFSET, pARENToFFSET) \
|
||||
{ \
|
||||
char buf[200]; \
|
||||
sprintf(buf, "/* %s \"%s\" %d %d */\n", tYPE, nAME, oFFSET, pARENToFFSET); \
|
||||
ui_set_signal_text_cb(user_data, buf, strlen(buf)); \
|
||||
}
|
||||
#else
|
||||
# define DISPLAY_PARSE_INFO(tYPE, nAME, oFFSET, pARENToFFSET)
|
||||
#endif
|
||||
|
||||
#if (ENABLE_DISPLAY_BRACE != 0)
|
||||
# define DISPLAY_BRACE(cODE) if (ui_main_data.display_brace) {cODE}
|
||||
#else
|
||||
# define DISPLAY_BRACE(cODE)
|
||||
#endif
|
||||
|
||||
enum type_e {
|
||||
TYPE_ENUMERATION,
|
||||
TYPE_ENUMERATION_VALUE,
|
||||
TYPE_STRUCT,
|
||||
TYPE_UNION,
|
||||
TYPE_FUNDAMENTAL,
|
||||
TYPE_TYPEDEF,
|
||||
TYPE_ARRAY,
|
||||
TYPE_REFERENCE,
|
||||
TYPE_FIELD,
|
||||
TYPE_FUNCTION,
|
||||
TYPE_ARGUMENT,
|
||||
TYPE_POINTER,
|
||||
TYPE_FILE,
|
||||
};
|
||||
|
||||
/* Forward declarations */
|
||||
struct types_s;
|
||||
|
||||
typedef int (*type_hr_display_t)(struct types_s *type, int indent);
|
||||
typedef int (*type_ui_display_t)(struct types_s *type, int indent);
|
||||
typedef int (*type_file_print_t)(struct types_s *type, int indent, FILE *file);
|
||||
|
||||
/**
|
||||
* type_dissect_from_buffer_t
|
||||
* @param type The current type
|
||||
* @param ui_set_signal_text_cb GUI display function
|
||||
* @param user_data Transparent data to pass to the GUI display function
|
||||
* @param buffer The buffer containing data to dissect
|
||||
* @param offset offset of field from the beginning of the parent
|
||||
* @param parent_offset offset of the parent from begining
|
||||
**/
|
||||
typedef int (*type_dissect_from_buffer_t)(
|
||||
struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
|
||||
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
|
||||
|
||||
typedef struct types_s {
|
||||
/* The type of the current description */
|
||||
enum type_e type;
|
||||
|
||||
/* Printable name for the current type */
|
||||
char *name;
|
||||
|
||||
int type_xml;
|
||||
|
||||
int size;
|
||||
int align;
|
||||
int bits;
|
||||
|
||||
/* Used only for arrays */
|
||||
int min;
|
||||
int max;
|
||||
|
||||
int context;
|
||||
|
||||
/* Init value for enumerations */
|
||||
int init_value;
|
||||
|
||||
int incomplete;
|
||||
|
||||
/* Id of the type as defined in XML file */
|
||||
int id;
|
||||
int artificial;
|
||||
|
||||
char *mangled;
|
||||
char *demangled;
|
||||
|
||||
/* List of members in constructed types */
|
||||
char *members;
|
||||
|
||||
/* The file containing the definition */
|
||||
char *file;
|
||||
/* Line number of the current definition */
|
||||
int line;
|
||||
|
||||
/* offset of the field in the parent type
|
||||
* -1 means no parent
|
||||
*/
|
||||
int offset;
|
||||
|
||||
struct types_s *previous;
|
||||
struct types_s *next;
|
||||
struct types_s *parent;
|
||||
struct types_s *child;
|
||||
struct types_s *file_ref;
|
||||
/* Reference to the head */
|
||||
struct types_s *head;
|
||||
|
||||
/* For structures or union */
|
||||
int nb_members;
|
||||
struct types_s **members_child;
|
||||
|
||||
/* Some procedures to display the type on terminal */
|
||||
type_hr_display_t type_hr_display;
|
||||
/* Some procedures to display the type on UI */
|
||||
type_ui_display_t type_ui_display;
|
||||
/* Procedure to display the type to a file */
|
||||
type_file_print_t type_file_print;
|
||||
/* Dissect the type */
|
||||
type_dissect_from_buffer_t type_dissect_from_buffer;
|
||||
} types_t;
|
||||
|
||||
types_t *type_new(enum type_e type);
|
||||
|
||||
int types_insert_tail(types_t **head, types_t *to_insert);
|
||||
|
||||
void types_hr_display(types_t *head);
|
||||
|
||||
#define INDENTED(fILE, x, y) \
|
||||
do { \
|
||||
int indentation = x; \
|
||||
while(indentation--) fprintf(fILE, " "); \
|
||||
y; \
|
||||
} while(0)
|
||||
|
||||
#define INDENTED_STRING(sTR, x, y) \
|
||||
do { \
|
||||
int indentation = x; \
|
||||
while(indentation--) ui_set_signal_text_cb(user_data, " ", 1); \
|
||||
y; \
|
||||
} while(0)
|
||||
|
||||
#endif /* TYPES_H_ */
|
||||
@@ -1,188 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#define G_LOG_DOMAIN ("PARSER")
|
||||
|
||||
#include "rc.h"
|
||||
|
||||
#include "enum_value_type.h"
|
||||
#include "union_type.h"
|
||||
#include "../libresolver/locate_root.h"
|
||||
#include "ui_interface.h"
|
||||
|
||||
/* There is only one special case of union which is associated to an index: the message id */
|
||||
int union_msg_dissect_from_buffer(
|
||||
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
|
||||
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
|
||||
{
|
||||
uint32_t message_id;
|
||||
int length = 0;
|
||||
char cbuf[200];
|
||||
|
||||
DISPLAY_PARSE_INFO("union_msg", type->name, offset, parent_offset);
|
||||
|
||||
CHECK_FCT(get_message_id(type->head, buffer, &message_id));
|
||||
|
||||
if (type->name) {
|
||||
DISPLAY_TYPE("Uni");
|
||||
|
||||
length = sprintf(cbuf, "%s |", type->name);
|
||||
DISPLAY_BRACE(length += sprintf(&cbuf[length], " {"););
|
||||
length += sprintf(&cbuf[length], "\n");
|
||||
ui_set_signal_text_cb(user_data, cbuf, length);
|
||||
}
|
||||
|
||||
if (type->members_child[message_id] != NULL)
|
||||
type->members_child[message_id]->type_dissect_from_buffer(
|
||||
type->members_child[message_id], ui_set_signal_text_cb, user_data,
|
||||
buffer, offset, parent_offset, type->name == NULL ? indent : indent + DISPLAY_TAB_SIZE, TRUE);
|
||||
|
||||
DISPLAY_BRACE(
|
||||
if (type->name) {
|
||||
DISPLAY_TYPE("Uni");
|
||||
|
||||
INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "};\n"));
|
||||
ui_set_signal_text_cb(user_data, cbuf, length);
|
||||
});
|
||||
|
||||
return RC_OK;
|
||||
}
|
||||
|
||||
int union_dissect_from_buffer(
|
||||
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
|
||||
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
|
||||
{
|
||||
int length = 0;
|
||||
char cbuf[50 + (type->name ? strlen (type->name) : 0)];
|
||||
char *name;
|
||||
int union_child = 0;
|
||||
|
||||
DISPLAY_PARSE_INFO("union", type->name, offset, parent_offset);
|
||||
|
||||
memset (cbuf, 0, sizeof(cbuf));
|
||||
|
||||
// CHECK_FCT(buffer_has_enouch_data(buffer, offset + parent_offset, type->size / 8));
|
||||
|
||||
if (type->name) {
|
||||
name = type->name;
|
||||
}
|
||||
else {
|
||||
name = "_anonymous_";
|
||||
}
|
||||
if (new_line) {
|
||||
DISPLAY_TYPE("Uni");
|
||||
}
|
||||
INDENTED_STRING(cbuf, new_line ? indent : 0, length = sprintf(cbuf, "%s |", name));
|
||||
DISPLAY_BRACE(length += sprintf(&cbuf[length], " {"););
|
||||
length += sprintf(&cbuf[length], "\n");
|
||||
ui_set_signal_text_cb(user_data, cbuf, length);
|
||||
|
||||
if (type->name) {
|
||||
if (type->parent != NULL)
|
||||
{
|
||||
if ((type->parent->name != NULL) && (strcmp(type->parent->name, "choice") == 0))
|
||||
{
|
||||
/* ASN1 union */
|
||||
|
||||
if ((last_enum_value > 0) && (last_enum_value <= type->nb_members))
|
||||
{
|
||||
union_child = last_enum_value - 1;
|
||||
|
||||
g_debug("ASN1 union \"%s\' detected, use member %d", type->name, union_child);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Only dissect the first field present in unions */
|
||||
if (type->members_child[union_child] != NULL)
|
||||
type->members_child[union_child]->type_dissect_from_buffer(
|
||||
type->members_child[union_child], ui_set_signal_text_cb, user_data, buffer,
|
||||
offset, parent_offset, indent + DISPLAY_TAB_SIZE, TRUE);
|
||||
|
||||
DISPLAY_BRACE(
|
||||
DISPLAY_TYPE("Uni");
|
||||
INDENTED_STRING(cbuf, indent, sprintf(cbuf, "};\n"));
|
||||
|
||||
length = strlen (cbuf);
|
||||
|
||||
ui_set_signal_text_cb(user_data, cbuf, length););
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int union_type_file_print(types_t *type, int indent, FILE *file) {
|
||||
int i;
|
||||
if (type == NULL)
|
||||
return -1;
|
||||
INDENTED(file, indent, fprintf(file, "<Union>\n"));
|
||||
INDENTED(file, indent+4, fprintf(file, "Name .......: %s\n", type->name));
|
||||
INDENTED(file, indent+4, fprintf(file, "Id .........: %d\n", type->id));
|
||||
INDENTED(file, indent+4, fprintf(file, "Size .......: %d\n", type->size));
|
||||
INDENTED(file, indent+4, fprintf(file, "Align ......: %d\n", type->align));
|
||||
INDENTED(file, indent+4, fprintf(file, "Artificial .: %d\n", type->artificial));
|
||||
INDENTED(file, indent+4, fprintf(file, "File .......: %s\n", type->file));
|
||||
INDENTED(file, indent+4, fprintf(file, "Line .......: %d\n", type->line));
|
||||
INDENTED(file, indent+4, fprintf(file, "Members ....: %s\n", type->members));
|
||||
INDENTED(file, indent+4, fprintf(file, "Mangled ....: %s\n", type->mangled));
|
||||
INDENTED(file, indent+4, fprintf(file, "Demangled ..: %s\n", type->demangled));
|
||||
if (type->file_ref != NULL)
|
||||
type->file_ref->type_file_print (type->file_ref, indent + 4, file);
|
||||
for (i = 0; i < type->nb_members; i++) {
|
||||
if (type->members_child[i] != NULL)
|
||||
type->members_child[i]->type_file_print (type->members_child[i], indent + 4, file);
|
||||
}
|
||||
INDENTED(file, indent, fprintf(file, "</Union>\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int union_type_hr_display(types_t *type, int indent) {
|
||||
int i;
|
||||
if (type == NULL)
|
||||
return -1;
|
||||
INDENTED(stdout, indent, printf("<Union>\n"));
|
||||
INDENTED(stdout, indent+4, printf("Name .......: %s\n", type->name));
|
||||
INDENTED(stdout, indent+4, printf("Id .........: %d\n", type->id));
|
||||
INDENTED(stdout, indent+4, printf("Size .......: %d\n", type->size));
|
||||
INDENTED(stdout, indent+4, printf("Align ......: %d\n", type->align));
|
||||
INDENTED(stdout, indent+4, printf("Artificial .: %d\n", type->artificial));
|
||||
INDENTED(stdout, indent+4, printf("File .......: %s\n", type->file));
|
||||
INDENTED(stdout, indent+4, printf("Line .......: %d\n", type->line));
|
||||
INDENTED(stdout, indent+4, printf("Members ....: %s\n", type->members));
|
||||
INDENTED(stdout, indent+4, printf("Mangled ....: %s\n", type->mangled));
|
||||
INDENTED(stdout, indent+4, printf("Demangled ..: %s\n", type->demangled));
|
||||
if (type->file_ref != NULL)
|
||||
type->file_ref->type_hr_display (type->file_ref, indent + 4);
|
||||
for (i = 0; i < type->nb_members; i++) {
|
||||
if (type->members_child[i] != NULL)
|
||||
type->members_child[i]->type_hr_display (type->members_child[i], indent + 4);
|
||||
}
|
||||
INDENTED(stdout, indent, printf("</Union>\n"));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#ifndef UNION_TYPE_H_
|
||||
#define UNION_TYPE_H_
|
||||
|
||||
int union_msg_dissect_from_buffer(
|
||||
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
|
||||
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
|
||||
|
||||
int union_dissect_from_buffer(
|
||||
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
|
||||
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
|
||||
|
||||
int union_type_file_print(types_t *type, int indent, FILE *file);
|
||||
|
||||
int union_type_hr_display(types_t *type, int indent);
|
||||
|
||||
#endif /* UNION_TYPE_H_ */
|
||||
@@ -1,904 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define G_LOG_DOMAIN ("PARSER")
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include <libxml/parser.h>
|
||||
#include <libxml/tree.h>
|
||||
|
||||
#include "logs.h"
|
||||
#include "types.h"
|
||||
#include "xml_parse.h"
|
||||
#include "union_type.h"
|
||||
|
||||
#include "ui_interface.h"
|
||||
#include "ui_main_screen.h"
|
||||
#include "ui_notif_dlg.h"
|
||||
#include "ui_filters.h"
|
||||
|
||||
#include "../libresolver/locate_root.h"
|
||||
#include "../libresolver/resolvers.h"
|
||||
|
||||
extern int debug_parser;
|
||||
|
||||
#if (ENABLE_DISPLAY_PARSE_INFO != 0)
|
||||
# define INDENT_START 30
|
||||
#else
|
||||
# define INDENT_START 0
|
||||
#endif
|
||||
|
||||
void *xml_raw_data;
|
||||
uint32_t xml_raw_data_size;
|
||||
|
||||
types_t *xml_head;
|
||||
types_t *root;
|
||||
|
||||
static int xml_parse_doc(xmlDocPtr doc);
|
||||
|
||||
static int parse_attribute_name(xmlNode *node, types_t *type, int mandatory) {
|
||||
xmlAttrPtr node_attribute;
|
||||
if ((node_attribute = xmlHasProp (node, (xmlChar *) "name")) == NULL) {
|
||||
if (mandatory) {
|
||||
g_error("cannot retrieve name attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
g_debug("cannot retrieve name attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
type->name = strdup ((char *) node_attribute->children->content);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_attribute_id(xmlNode *node, types_t *type) {
|
||||
xmlAttrPtr node_attribute;
|
||||
if ((node_attribute = xmlHasProp (node, (xmlChar *) "id")) == NULL) {
|
||||
g_error("cannot retrieve id attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
return -1;
|
||||
}
|
||||
type->id = atoi ((char *) &node_attribute->children->content[1]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_attribute_size(xmlNode *node, types_t *type, int mandatory) {
|
||||
xmlAttrPtr node_attribute;
|
||||
if ((node_attribute = xmlHasProp (node, (xmlChar *) "size")) == NULL) {
|
||||
if (mandatory) {
|
||||
g_error("cannot retrieve size attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
type->size = -1;
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
g_debug("cannot retrieve size attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
type->size = -1;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
type->size = atoi ((char *) node_attribute->children->content);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_attribute_align(xmlNode *node, types_t *type, int mandatory) {
|
||||
xmlAttrPtr node_attribute;
|
||||
if ((node_attribute = xmlHasProp (node, (xmlChar *) "align")) == NULL) {
|
||||
if (mandatory) {
|
||||
g_error("cannot retrieve align attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
type->align = -1;
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
g_debug("cannot retrieve align attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
type->align = -1;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
type->align = atoi ((char *) node_attribute->children->content);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_attribute_line(xmlNode *node, types_t *type) {
|
||||
xmlAttrPtr node_attribute;
|
||||
if ((node_attribute = xmlHasProp (node, (xmlChar *) "line")) == NULL) {
|
||||
type->line = -1;
|
||||
return 0;
|
||||
}
|
||||
type->line = atoi ((char *) node_attribute->children->content);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_attribute_file(xmlNode *node, types_t *type) {
|
||||
xmlAttrPtr node_attribute;
|
||||
if ((node_attribute = xmlHasProp (node, (xmlChar *) "file")) == NULL) {
|
||||
type->file = NULL;
|
||||
return 0;
|
||||
}
|
||||
type->file = strdup ((char *) node_attribute->children->content);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_attribute_context(xmlNode *node, types_t *type, int mandatory) {
|
||||
xmlAttrPtr node_attribute;
|
||||
if ((node_attribute = xmlHasProp (node, (xmlChar *) "context")) == NULL) {
|
||||
if (mandatory) {
|
||||
g_error("cannot retrieve context attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
type->context = -1;
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
type->context = -1;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
type->context = atoi ((char *) &node_attribute->children->content[1]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_attribute_artificial(xmlNode *node, types_t *type) {
|
||||
xmlAttrPtr node_attribute;
|
||||
if ((node_attribute = xmlHasProp (node, (xmlChar *) "artificial")) == NULL) {
|
||||
g_debug("cannot retrieve artificial attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
type->artificial = -1;
|
||||
return 0;
|
||||
}
|
||||
type->artificial = atoi ((char *) &node_attribute->children->content[1]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_attribute_init(xmlNode *node, types_t *type) {
|
||||
xmlAttrPtr node_attribute;
|
||||
if ((node_attribute = xmlHasProp (node, (xmlChar *) "init")) == NULL) {
|
||||
g_error("cannot retrieve init attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
type->init_value = -1;
|
||||
return 0;
|
||||
}
|
||||
type->init_value = atoi ((char *) node_attribute->children->content);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_attribute_members(xmlNode *node, types_t *type, int mandatory) {
|
||||
xmlAttrPtr node_attribute;
|
||||
if ((node_attribute = xmlHasProp (node, (xmlChar *) "members")) == NULL) {
|
||||
if (mandatory) {
|
||||
g_error("cannot retrieve members attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
type->members = 0;
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
g_debug("cannot retrieve members attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
type->members = 0;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
type->members = strdup ((char *) node_attribute->children->content);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_attribute_mangled(xmlNode *node, types_t *type, int mandatory) {
|
||||
xmlAttrPtr node_attribute;
|
||||
if ((node_attribute = xmlHasProp (node, (xmlChar *) "mangled")) == NULL) {
|
||||
if (mandatory) {
|
||||
g_error("cannot retrieve mangled attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
type->mangled = 0;
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
g_debug("cannot retrieve mangled attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
type->mangled = 0;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
type->mangled = strdup ((char *) node_attribute->children->content);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_attribute_demangled(xmlNode *node, types_t *type, int mandatory) {
|
||||
xmlAttrPtr node_attribute;
|
||||
if ((node_attribute = xmlHasProp (node, (xmlChar *) "mangled")) == NULL) {
|
||||
if (mandatory) {
|
||||
g_error("cannot retrieve demangled attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
type->demangled = 0;
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
g_debug("cannot retrieve demangled attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
type->demangled = 0;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
type->demangled = strdup ((char *) node_attribute->children->content);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_attribute_offset(xmlNode *node, types_t *type, int mandatory) {
|
||||
xmlAttrPtr node_attribute;
|
||||
if ((node_attribute = xmlHasProp (node, (xmlChar *) "offset")) == NULL) {
|
||||
if (mandatory) {
|
||||
g_error("cannot retrieve offset attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
type->offset = -1;
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
g_debug("cannot retrieve offset attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
type->offset = -1;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
type->offset = atoi ((char *) node_attribute->children->content);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_attribute_bits(xmlNode *node, types_t *type, int mandatory) {
|
||||
xmlAttrPtr node_attribute;
|
||||
if ((node_attribute = xmlHasProp (node, (xmlChar *) "bits")) == NULL) {
|
||||
if (mandatory) {
|
||||
g_error("cannot retrieve bits attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
type->bits = -1;
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
g_debug("cannot retrieve bits attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
type->bits = -1;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
type->bits = atoi ((char *) node_attribute->children->content);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_attribute_type(xmlNode *node, types_t *type, int mandatory) {
|
||||
xmlAttrPtr node_attribute;
|
||||
if ((node_attribute = xmlHasProp (node, (xmlChar *) "type")) == NULL) {
|
||||
if (mandatory) {
|
||||
g_error("cannot retrieve type attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
type->type_xml = 0;
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
g_debug("cannot retrieve type attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
type->type_xml = 0;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
type->type_xml = atoi ((char *) &node_attribute->children->content[1]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_attribute_min(xmlNode *node, types_t *type, int mandatory) {
|
||||
xmlAttrPtr node_attribute;
|
||||
if ((node_attribute = xmlHasProp (node, (xmlChar *) "min")) == NULL) {
|
||||
if (mandatory) {
|
||||
g_error("cannot retrieve min attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
type->min = 0;
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
g_debug("cannot retrieve min attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
type->min = 0;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
type->min = atoi ((char *) node_attribute->children->content);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_attribute_max(xmlNode *node, types_t *type, int mandatory) {
|
||||
xmlAttrPtr node_attribute;
|
||||
if ((node_attribute = xmlHasProp (node, (xmlChar *) "max")) == NULL) {
|
||||
if (mandatory) {
|
||||
g_error("cannot retrieve max attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
type->max = 0;
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
g_debug("cannot retrieve max attribute in node %s, %s:%ld",
|
||||
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
|
||||
type->max = 0;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
type->max = atoi ((char *) &node_attribute->children->content[1]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_enum_values(xmlNode *node, types_t *parent) {
|
||||
types_t *new;
|
||||
|
||||
if (node == NULL || parent == NULL)
|
||||
return -1;
|
||||
|
||||
new = type_new (TYPE_ENUMERATION_VALUE);
|
||||
|
||||
CHECK_FCT(parse_attribute_name(node, new, 1));
|
||||
CHECK_FCT(parse_attribute_init(node, new));
|
||||
|
||||
CHECK_FCT(types_insert_tail(&parent->child, new));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_enumeration(xmlNode *node, types_t **head) {
|
||||
types_t *new;
|
||||
xmlNode *enum_value_node;
|
||||
|
||||
if (node == NULL)
|
||||
return -1;
|
||||
|
||||
new = type_new (TYPE_ENUMERATION);
|
||||
|
||||
CHECK_FCT(parse_attribute_name(node, new, 1));
|
||||
CHECK_FCT(parse_attribute_id(node, new));
|
||||
CHECK_FCT(parse_attribute_size(node, new, 1));
|
||||
CHECK_FCT(parse_attribute_align(node, new, 1));
|
||||
CHECK_FCT(parse_attribute_context(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_line(node, new));
|
||||
CHECK_FCT(parse_attribute_file(node, new));
|
||||
CHECK_FCT(parse_attribute_artificial(node, new));
|
||||
|
||||
CHECK_FCT(types_insert_tail(head, new));
|
||||
|
||||
/* Parse enum values */
|
||||
for (enum_value_node = node->children; enum_value_node; enum_value_node = enum_value_node->next) {
|
||||
if (strcmp ((char *) enum_value_node->name, "EnumValue") == 0)
|
||||
CHECK_FCT(parse_enum_values(enum_value_node, new));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_union(xmlNode *node, types_t **head) {
|
||||
types_t *new;
|
||||
|
||||
if (node == NULL)
|
||||
return -1;
|
||||
|
||||
new = type_new (TYPE_UNION);
|
||||
|
||||
CHECK_FCT(parse_attribute_name(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_id(node, new));
|
||||
CHECK_FCT(parse_attribute_size(node, new, 1));
|
||||
CHECK_FCT(parse_attribute_align(node, new, 1));
|
||||
CHECK_FCT(parse_attribute_context(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_members(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_line(node, new));
|
||||
CHECK_FCT(parse_attribute_file(node, new));
|
||||
CHECK_FCT(parse_attribute_artificial(node, new));
|
||||
CHECK_FCT(parse_attribute_mangled(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_demangled(node, new, 0));
|
||||
|
||||
if (new->name)
|
||||
if (strcmp (new->name, "msg_s") == 0)
|
||||
new->type_dissect_from_buffer = union_msg_dissect_from_buffer;
|
||||
|
||||
CHECK_FCT(types_insert_tail(head, new));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_fundamental(xmlNode *node, types_t **head) {
|
||||
types_t *new;
|
||||
|
||||
if (node == NULL)
|
||||
return -1;
|
||||
|
||||
new = type_new (TYPE_FUNDAMENTAL);
|
||||
|
||||
CHECK_FCT(parse_attribute_name(node, new, 1));
|
||||
CHECK_FCT(parse_attribute_id(node, new));
|
||||
CHECK_FCT(parse_attribute_size(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_align(node, new, 0));
|
||||
|
||||
CHECK_FCT(types_insert_tail(head, new));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_struct(xmlNode *node, types_t **head) {
|
||||
types_t *new;
|
||||
|
||||
if (node == NULL)
|
||||
return -1;
|
||||
|
||||
new = type_new (TYPE_STRUCT);
|
||||
|
||||
CHECK_FCT(parse_attribute_name(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_id(node, new));
|
||||
CHECK_FCT(parse_attribute_size(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_align(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_file(node, new));
|
||||
CHECK_FCT(parse_attribute_line(node, new));
|
||||
CHECK_FCT(parse_attribute_context(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_artificial(node, new));
|
||||
CHECK_FCT(parse_attribute_members(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_mangled(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_demangled(node, new, 0));
|
||||
|
||||
CHECK_FCT(types_insert_tail(head, new));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_typedef(xmlNode *node, types_t **head) {
|
||||
types_t *new;
|
||||
|
||||
if (node == NULL)
|
||||
return -1;
|
||||
|
||||
new = type_new (TYPE_TYPEDEF);
|
||||
|
||||
CHECK_FCT(parse_attribute_name(node, new, 1));
|
||||
CHECK_FCT(parse_attribute_id(node, new));
|
||||
CHECK_FCT(parse_attribute_file(node, new));
|
||||
CHECK_FCT(parse_attribute_line(node, new));
|
||||
CHECK_FCT(parse_attribute_type(node, new, 1));
|
||||
CHECK_FCT(parse_attribute_size(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_align(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_context(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_artificial(node, new));
|
||||
CHECK_FCT(parse_attribute_members(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_mangled(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_demangled(node, new, 0));
|
||||
|
||||
CHECK_FCT(types_insert_tail(head, new));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_field(xmlNode *node, types_t **head) {
|
||||
types_t *new;
|
||||
|
||||
if (node == NULL)
|
||||
return -1;
|
||||
|
||||
new = type_new (TYPE_FIELD);
|
||||
|
||||
CHECK_FCT(parse_attribute_name(node, new, 1));
|
||||
CHECK_FCT(parse_attribute_id(node, new));
|
||||
CHECK_FCT(parse_attribute_type(node, new, 1));
|
||||
CHECK_FCT(parse_attribute_size(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_bits(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_offset(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_align(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_context(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_artificial(node, new));
|
||||
CHECK_FCT(parse_attribute_members(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_mangled(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_demangled(node, new, 0));
|
||||
|
||||
CHECK_FCT(types_insert_tail(head, new));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_file(xmlNode *node, types_t **head) {
|
||||
types_t *new;
|
||||
|
||||
if (node == NULL)
|
||||
return -1;
|
||||
|
||||
new = type_new (TYPE_FILE);
|
||||
|
||||
CHECK_FCT(parse_attribute_name(node, new, 1));
|
||||
CHECK_FCT(parse_attribute_id(node, new));
|
||||
|
||||
CHECK_FCT(types_insert_tail(head, new));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_reference_type(xmlNode *node, types_t **head) {
|
||||
types_t *new;
|
||||
|
||||
if (node == NULL)
|
||||
return -1;
|
||||
|
||||
new = type_new (TYPE_REFERENCE);
|
||||
|
||||
CHECK_FCT(parse_attribute_id(node, new));
|
||||
CHECK_FCT(parse_attribute_type(node, new, 1));
|
||||
CHECK_FCT(parse_attribute_size(node, new, 1));
|
||||
CHECK_FCT(parse_attribute_align(node, new, 1));
|
||||
CHECK_FCT(parse_attribute_context(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_offset(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_file(node, new));
|
||||
CHECK_FCT(parse_attribute_line(node, new));
|
||||
|
||||
CHECK_FCT(types_insert_tail(head, new));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_array_type(xmlNode *node, types_t **head) {
|
||||
types_t *new;
|
||||
|
||||
if (node == NULL)
|
||||
return -1;
|
||||
|
||||
new = type_new (TYPE_ARRAY);
|
||||
|
||||
CHECK_FCT(parse_attribute_id(node, new));
|
||||
CHECK_FCT(parse_attribute_type(node, new, 1));
|
||||
CHECK_FCT(parse_attribute_size(node, new, 0));
|
||||
CHECK_FCT(parse_attribute_align(node, new, 1));
|
||||
CHECK_FCT(parse_attribute_min(node, new, 1));
|
||||
CHECK_FCT(parse_attribute_max(node, new, 1));
|
||||
|
||||
CHECK_FCT(types_insert_tail(head, new));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_pointer_type(xmlNode *node, types_t **head) {
|
||||
types_t *new;
|
||||
|
||||
if (node == NULL)
|
||||
return -1;
|
||||
|
||||
new = type_new (TYPE_POINTER);
|
||||
|
||||
CHECK_FCT(parse_attribute_id(node, new));
|
||||
CHECK_FCT(parse_attribute_type(node, new, 1));
|
||||
CHECK_FCT(parse_attribute_size(node, new, 1));
|
||||
CHECK_FCT(parse_attribute_align(node, new, 1));
|
||||
|
||||
CHECK_FCT(types_insert_tail(head, new));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_function_type(xmlNode *node, types_t **head) {
|
||||
types_t *new;
|
||||
|
||||
if (node == NULL)
|
||||
return -1;
|
||||
|
||||
new = type_new (TYPE_FUNCTION);
|
||||
|
||||
CHECK_FCT(parse_attribute_id(node, new));
|
||||
|
||||
CHECK_FCT(types_insert_tail(head, new));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* print_element_names:
|
||||
* @a_node: the initial xml node to consider.
|
||||
*
|
||||
* Prints the names of the all the xml elements
|
||||
* that are siblings or children of a given xml node.
|
||||
*/
|
||||
static int parse_elements(xmlNode * a_node, types_t **head) {
|
||||
xmlNode *cur_node = NULL;
|
||||
xmlNode *child_node = NULL;
|
||||
|
||||
for (cur_node = a_node; cur_node; cur_node = cur_node->next) {
|
||||
for (child_node = cur_node->children; child_node; child_node = child_node->next) {
|
||||
if (child_node->type == XML_ELEMENT_NODE) {
|
||||
if (strcmp ((char *) child_node->name, "Enumeration") == 0) {
|
||||
CHECK_FCT_DO(parse_enumeration(child_node, head), return RC_FAIL);
|
||||
}
|
||||
else
|
||||
if (strcmp ((char *) child_node->name, "FundamentalType") == 0) {
|
||||
CHECK_FCT_DO(parse_fundamental(child_node, head), return RC_FAIL);
|
||||
}
|
||||
else
|
||||
if (strcmp ((char *) child_node->name, "Struct") == 0) {
|
||||
CHECK_FCT_DO(parse_struct(child_node, head), return RC_FAIL);
|
||||
}
|
||||
else
|
||||
if (strcmp ((char *) child_node->name, "Union") == 0) {
|
||||
CHECK_FCT_DO(parse_union(child_node, head), return RC_FAIL);
|
||||
}
|
||||
else
|
||||
if (strcmp ((char *) child_node->name, "Typedef") == 0) {
|
||||
CHECK_FCT_DO(parse_typedef(child_node, head), return RC_FAIL);
|
||||
}
|
||||
else
|
||||
if (strcmp ((char *) child_node->name, "File") == 0) {
|
||||
CHECK_FCT_DO(parse_file(child_node, head), return RC_FAIL);
|
||||
}
|
||||
else
|
||||
if (strcmp ((char *) child_node->name, "Field") == 0) {
|
||||
CHECK_FCT_DO(parse_field(child_node, head), return RC_FAIL);
|
||||
}
|
||||
else
|
||||
if (strcmp ((char *) child_node->name, "ReferenceType") == 0) {
|
||||
CHECK_FCT_DO(parse_reference_type(child_node, head), return RC_FAIL);
|
||||
}
|
||||
else
|
||||
if (strcmp ((char *) child_node->name, "ArrayType") == 0) {
|
||||
CHECK_FCT_DO(parse_array_type(child_node, head), return RC_FAIL);
|
||||
}
|
||||
else
|
||||
if (strcmp ((char *) child_node->name, "PointerType") == 0) {
|
||||
CHECK_FCT_DO(parse_pointer_type(child_node, head), return RC_FAIL);
|
||||
}
|
||||
else
|
||||
if (strcmp ((char *) child_node->name, "FunctionType") == 0) {
|
||||
CHECK_FCT_DO(parse_function_type(child_node, head), return RC_FAIL);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return RC_OK;
|
||||
}
|
||||
|
||||
static int free_elements(types_t *parent, int indent) {
|
||||
types_t *cur_node = parent;
|
||||
types_t *child_node;
|
||||
|
||||
g_debug("%*s%p %s", indent, "", cur_node, cur_node->name != NULL ? cur_node->name : "");
|
||||
|
||||
for (; cur_node != NULL; cur_node = cur_node->next) {
|
||||
if (cur_node->child != NULL) {
|
||||
child_node = cur_node->child;
|
||||
cur_node->child = NULL; /* Clear the child pointer to avoid re-processing it, we are handling a graph with loops */
|
||||
CHECK_FCT_DO(free_elements((child_node), indent + 2), return RC_FAIL);
|
||||
}
|
||||
}
|
||||
free (cur_node);
|
||||
|
||||
return RC_OK;
|
||||
}
|
||||
|
||||
int xml_parse_buffer(char *xml_buffer, const int size) {
|
||||
xmlDocPtr doc; /* the resulting document tree */
|
||||
|
||||
if (xml_buffer == NULL) {
|
||||
return RC_NULL_POINTER;
|
||||
}
|
||||
|
||||
if (xml_raw_data != NULL)
|
||||
{
|
||||
/* Free previous raw data */
|
||||
free (xml_raw_data);
|
||||
}
|
||||
xml_raw_data = xml_buffer;
|
||||
xml_raw_data_size = size;
|
||||
|
||||
if (xml_head != NULL)
|
||||
{
|
||||
/* Free previous definitions */
|
||||
free_elements(xml_head, 0);
|
||||
|
||||
g_info("xml_parse_buffer freed previous definitions");
|
||||
}
|
||||
|
||||
xml_head = NULL;
|
||||
root = NULL;
|
||||
messages_id_enum = NULL;
|
||||
lte_time_type = NULL;
|
||||
lte_time_frame_type = NULL;
|
||||
lte_time_slot_type = NULL;
|
||||
origin_task_id_type = NULL;
|
||||
destination_task_id_type = NULL;
|
||||
instance_type = NULL;
|
||||
message_header_type = NULL;
|
||||
message_type = NULL;
|
||||
message_size_type = NULL;
|
||||
|
||||
g_info("Parsing XML definition from buffer ...");
|
||||
|
||||
doc = xmlReadMemory(xml_buffer, size, NULL, NULL, 0);
|
||||
|
||||
if (doc == NULL) {
|
||||
g_warning("Failed to parse XML buffer: %s", xml_buffer);
|
||||
ui_notification_dialog(GTK_MESSAGE_ERROR, FALSE, "parse messages format definition", "Fail to parse XML buffer");
|
||||
return RC_FAIL;
|
||||
}
|
||||
|
||||
return xml_parse_doc(doc);
|
||||
}
|
||||
|
||||
static int update_filters() {
|
||||
types_t *types;
|
||||
|
||||
ui_init_filters(FALSE, TRUE);
|
||||
|
||||
types = messages_id_enum;
|
||||
if (types != NULL)
|
||||
{
|
||||
types = types->child;
|
||||
|
||||
while (types != NULL)
|
||||
{
|
||||
if (strcmp (types->name, "MESSAGES_ID_MAX") != 0)
|
||||
{
|
||||
ui_filters_add (FILTER_MESSAGES, types->init_value, types->name, ENTRY_ENABLED_UNDEFINED, NULL, NULL);
|
||||
}
|
||||
types = types->next;
|
||||
}
|
||||
}
|
||||
|
||||
types = origin_task_id_type;
|
||||
if (types != NULL)
|
||||
{
|
||||
types = types->child->child;
|
||||
|
||||
while (types != NULL) {
|
||||
if ((strcmp (types->name, "TASK_FIRST") != 0) && (strcmp (types->name, "TASK_MAX") != 0))
|
||||
{
|
||||
ui_filters_add(FILTER_ORIGIN_TASKS, types->init_value, types->name, ENTRY_ENABLED_UNDEFINED, NULL, NULL);
|
||||
}
|
||||
types = types->next;
|
||||
}
|
||||
}
|
||||
|
||||
types = destination_task_id_type;
|
||||
if (types != NULL)
|
||||
{
|
||||
types = types->child->child;
|
||||
|
||||
while (types != NULL) {
|
||||
if ((strcmp (types->name, "TASK_FIRST") != 0) && (strcmp (types->name, "TASK_MAX") != 0))
|
||||
{
|
||||
ui_filters_add(FILTER_DESTINATION_TASKS, types->init_value, types->name, ENTRY_ENABLED_UNDEFINED, NULL, NULL);
|
||||
}
|
||||
types = types->next;
|
||||
}
|
||||
}
|
||||
|
||||
return RC_OK;
|
||||
}
|
||||
|
||||
static int xml_parse_doc(xmlDocPtr doc) {
|
||||
xmlNode *root_element = NULL;
|
||||
int ret = 0;
|
||||
FILE *dissect_file = NULL;
|
||||
|
||||
if (ui_main_data.dissect_file_name != NULL) {
|
||||
dissect_file = fopen (ui_main_data.dissect_file_name, "w");
|
||||
}
|
||||
|
||||
/* Get the root element node */
|
||||
root_element = xmlDocGetRootElement(doc);
|
||||
|
||||
ret = parse_elements(root_element, &xml_head);
|
||||
|
||||
/* Free the document */
|
||||
xmlFreeDoc(doc);
|
||||
|
||||
if (ret == RC_OK) {
|
||||
resolve_typedefs (&xml_head);
|
||||
resolve_pointer_type (&xml_head);
|
||||
resolve_field (&xml_head);
|
||||
resolve_array (&xml_head);
|
||||
resolve_reference (&xml_head);
|
||||
resolve_struct (&xml_head);
|
||||
resolve_file (&xml_head);
|
||||
resolve_union (&xml_head);
|
||||
resolve_function (&xml_head);
|
||||
|
||||
/* Locate the root element which corresponds to the MessageDef struct */
|
||||
CHECK_FCT(locate_root("MessageDef", xml_head, &root));
|
||||
|
||||
/* Locate the LTE time fields */
|
||||
if (locate_type("lte_time", xml_head, <e_time_type) == RC_OK)
|
||||
{
|
||||
CHECK_FCT(locate_type("frame", lte_time_type->child->child, <e_time_frame_type));
|
||||
CHECK_FCT(locate_type("slot", lte_time_type->child->child, <e_time_slot_type));
|
||||
}
|
||||
|
||||
/* Locate the message id field */
|
||||
CHECK_FCT(locate_type("MessagesIds", xml_head, &messages_id_enum));
|
||||
|
||||
/* Locate the header part of a message */
|
||||
CHECK_FCT(locate_type("ittiMsgHeader", xml_head, &message_header_type));
|
||||
/* Locate the main message part */
|
||||
CHECK_FCT(locate_type("ittiMsg", xml_head, &message_type));
|
||||
|
||||
/* Locate the origin task id field */
|
||||
CHECK_FCT(locate_type_children("originTaskId", message_header_type->child->child, &origin_task_id_type));
|
||||
/* Locate the destination task id field */
|
||||
CHECK_FCT(locate_type_children("destinationTaskId", message_header_type->child->child, &destination_task_id_type));
|
||||
/* Locate the instance field */
|
||||
CHECK_FCT(locate_type_children("instance", message_header_type->child->child, &instance_type));
|
||||
/* Locate the message size field */
|
||||
CHECK_FCT(locate_type_children("ittiMsgSize", message_header_type->child->child, &message_size_type));
|
||||
|
||||
// root->type_hr_display(root, 0);
|
||||
|
||||
update_filters();
|
||||
if (dissect_file != NULL) {
|
||||
g_debug("generating dissected types file \"%s\" ...", ui_main_data.dissect_file_name);
|
||||
root->type_file_print (root, 0, dissect_file);
|
||||
}
|
||||
}
|
||||
|
||||
if (dissect_file != NULL) {
|
||||
fclose (dissect_file);
|
||||
}
|
||||
|
||||
g_message("Parsed XML definition");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int dissect_signal_header(buffer_t *buffer, ui_set_signal_text_cb_t ui_set_signal_text_cb,
|
||||
gpointer cb_user_data)
|
||||
{
|
||||
if (message_header_type == NULL) {
|
||||
g_error("No messages format definition provided");
|
||||
return RC_FAIL;
|
||||
}
|
||||
|
||||
if (buffer == NULL) {
|
||||
g_error("Failed buffer is NULL");
|
||||
return RC_FAIL;
|
||||
}
|
||||
|
||||
message_header_type->type_dissect_from_buffer(
|
||||
message_header_type, ui_set_signal_text_cb, cb_user_data,
|
||||
buffer, 0, 0, INDENT_START, TRUE);
|
||||
|
||||
return RC_OK;
|
||||
}
|
||||
|
||||
int dissect_signal(buffer_t *buffer, ui_set_signal_text_cb_t ui_set_signal_text_cb,
|
||||
gpointer cb_user_data)
|
||||
{
|
||||
if (message_type == NULL) {
|
||||
g_error("No messages format definition provided");
|
||||
return RC_FAIL;
|
||||
}
|
||||
|
||||
if (buffer == NULL) {
|
||||
g_error("Failed buffer is NULL");
|
||||
return RC_FAIL;
|
||||
}
|
||||
|
||||
message_type->type_dissect_from_buffer(message_type, ui_set_signal_text_cb, cb_user_data,
|
||||
buffer, 0, 0, INDENT_START, TRUE);
|
||||
|
||||
return RC_OK;
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include "rc.h"
|
||||
#include "types.h"
|
||||
|
||||
#ifndef XML_PARSE_H_
|
||||
#define XML_PARSE_H_
|
||||
|
||||
extern void *xml_raw_data;
|
||||
extern uint32_t xml_raw_data_size;
|
||||
|
||||
extern types_t *root;
|
||||
|
||||
int xml_parse_file(const char *filename);
|
||||
|
||||
int xml_parse_buffer(char *xml_buffer, const int size);
|
||||
|
||||
int dissect_signal(buffer_t *buffer, ui_set_signal_text_cb_t ui_set_signal_text_cb,
|
||||
gpointer user_data);
|
||||
|
||||
int dissect_signal_header(buffer_t *buffer, ui_set_signal_text_cb_t ui_set_signal_text_cb,
|
||||
gpointer cb_user_data);
|
||||
|
||||
#endif /* XML_PARSE_H_ */
|
||||
@@ -1,13 +0,0 @@
|
||||
AM_CFLAGS = \
|
||||
@ADD_CFLAGS@ \
|
||||
-I$(top_srcdir)/common \
|
||||
-I$(top_srcdir)/libparser \
|
||||
-I$(top_srcdir)/libui \
|
||||
-I$(top_srcdir)/libbuffers
|
||||
|
||||
noinst_LTLIBRARIES = libresolver.la
|
||||
|
||||
libresolver_la_LDFLAGS = -all-static
|
||||
libresolver_la_SOURCES = \
|
||||
locate_root.c locate_root.h \
|
||||
resolvers.c resolvers.h
|
||||
@@ -1,251 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define G_LOG_DOMAIN ("RESOLVER")
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#include "logs.h"
|
||||
#include "rc.h"
|
||||
|
||||
#include "types.h"
|
||||
#include "enum_type.h"
|
||||
#include "locate_root.h"
|
||||
#include "xml_parse.h"
|
||||
|
||||
types_t *messages_id_enum;
|
||||
types_t *lte_time_type;
|
||||
types_t *lte_time_frame_type;
|
||||
types_t *lte_time_slot_type;
|
||||
types_t *origin_task_id_type;
|
||||
types_t *destination_task_id_type;
|
||||
types_t *instance_type;
|
||||
types_t *message_header_type;
|
||||
types_t *message_type;
|
||||
types_t *message_size_type;
|
||||
|
||||
int locate_root(const char *root_name, types_t *head, types_t **root_elm) {
|
||||
types_t *next_type;
|
||||
int next_counter = 0;
|
||||
|
||||
/* The root element is for example : MessageDef.
|
||||
* This element is the entry for other sub-types.
|
||||
*/
|
||||
if (!root_name || (strlen (root_name) == 0)) {
|
||||
g_warning("FATAL: no root element name provided");
|
||||
return -1;
|
||||
}
|
||||
if (!head) {
|
||||
g_warning("Empty list detected");
|
||||
return -1;
|
||||
}
|
||||
if (!root_elm) {
|
||||
g_warning("NULL root reference");
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (next_type = head; next_type; next_type = next_type->next) {
|
||||
if (next_type->name == NULL)
|
||||
continue;
|
||||
if (strcmp (root_name, next_type->name) == 0) {
|
||||
/* Matching reference */
|
||||
break;
|
||||
}
|
||||
next_counter ++;
|
||||
}
|
||||
g_info("locate_root: %s %d", root_name, next_counter);
|
||||
|
||||
*root_elm = next_type;
|
||||
return (next_type == NULL) ? -2 : 0;
|
||||
}
|
||||
|
||||
int locate_type(const char *type_name, types_t *head, types_t **type) {
|
||||
types_t *next_type;
|
||||
int next_counter = 0;
|
||||
|
||||
/* The root element is for example : MessageDef.
|
||||
* This element is the entry for other sub-types.
|
||||
*/
|
||||
if (!type_name) {
|
||||
g_warning("FATAL: no element name provided");
|
||||
return RC_BAD_PARAM;
|
||||
}
|
||||
if (!head) {
|
||||
g_warning("Empty list detected");
|
||||
return RC_BAD_PARAM;
|
||||
}
|
||||
|
||||
for (next_type = head; next_type; next_type = next_type->next) {
|
||||
if (next_type->name == NULL)
|
||||
continue;
|
||||
if (strcmp (type_name, next_type->name) == 0) {
|
||||
/* Matching reference */
|
||||
break;
|
||||
}
|
||||
next_counter ++;
|
||||
}
|
||||
g_info("locate_type: %s %d %p", type_name, next_counter, next_type);
|
||||
|
||||
if (type)
|
||||
*type = next_type;
|
||||
return (next_type == NULL) ? RC_FAIL : RC_OK;
|
||||
}
|
||||
|
||||
int locate_type_children(const char *type_name, types_t *head, types_t **type) {
|
||||
types_t *found_type = NULL;
|
||||
int i;
|
||||
|
||||
/* The root element is for example : MessageDef.
|
||||
* This element is the entry for other sub-types.
|
||||
*/
|
||||
if (!type_name) {
|
||||
g_warning("FATAL: no element name provided");
|
||||
return RC_BAD_PARAM;
|
||||
}
|
||||
if (!head) {
|
||||
g_warning("Empty list detected");
|
||||
return RC_BAD_PARAM;
|
||||
}
|
||||
|
||||
for (i = 0; i < head->nb_members; i++) {
|
||||
if (head->members_child[i]->name == NULL)
|
||||
continue;
|
||||
if (strcmp (type_name, head->members_child[i]->name) == 0) {
|
||||
/* Matching reference */
|
||||
found_type = head->members_child[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
g_info("locate_type: %s %d %p", type_name, i, found_type);
|
||||
|
||||
if (type)
|
||||
*type = found_type;
|
||||
return (found_type == NULL) ? RC_FAIL : RC_OK;
|
||||
}
|
||||
|
||||
uint32_t get_message_header_type_size(void)
|
||||
{
|
||||
/* Typedef */
|
||||
if (message_header_type->child != NULL) {
|
||||
/* Struct */
|
||||
if (message_header_type->child->child != NULL) {
|
||||
return message_header_type->child->child->size;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t get_message_size(buffer_t *buffer)
|
||||
{
|
||||
uint32_t value = 0;
|
||||
|
||||
if (message_size_type != NULL)
|
||||
{
|
||||
types_t *temp = message_size_type;
|
||||
|
||||
while (temp->size == -1) {
|
||||
temp = temp->child;
|
||||
}
|
||||
|
||||
/* Fetch instance value */
|
||||
buffer_fetch_bits (buffer, message_size_type->offset, temp->size, &value);
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
uint32_t get_lte_frame(buffer_t *buffer) {
|
||||
uint32_t value = 0;
|
||||
|
||||
if (lte_time_type !=NULL)
|
||||
{
|
||||
/* Fetch instance value */
|
||||
buffer_fetch_bits (buffer, lte_time_type->offset + lte_time_frame_type->offset, lte_time_frame_type->child->child->size, &value);
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
uint32_t get_lte_slot(buffer_t *buffer) {
|
||||
uint32_t value = 0;
|
||||
|
||||
if (lte_time_type !=NULL)
|
||||
{
|
||||
/* Fetch instance value */
|
||||
buffer_fetch_bits (buffer, lte_time_type->offset + lte_time_slot_type->offset, lte_time_slot_type->child->child->size, &value);
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
uint32_t get_message_id(types_t *head, buffer_t *buffer, uint32_t *message_id) {
|
||||
uint32_t value;
|
||||
|
||||
g_assert(message_id != NULL);
|
||||
g_assert(buffer != NULL);
|
||||
|
||||
/* MessageId is an offset from start of buffer */
|
||||
value = buffer_get_uint32_t(buffer, messages_id_enum->offset);
|
||||
|
||||
*message_id = value;
|
||||
return RC_OK;
|
||||
}
|
||||
|
||||
uint32_t get_task_id(buffer_t *buffer, types_t *task_id_type) {
|
||||
uint32_t task_id_value;
|
||||
|
||||
/* Fetch task id value */
|
||||
if (buffer_fetch_bits (buffer, task_id_type->offset, task_id_type->child->size, &task_id_value) != RC_OK)
|
||||
{
|
||||
return ~0;
|
||||
}
|
||||
|
||||
return task_id_value;
|
||||
}
|
||||
|
||||
char *task_id_to_string(uint32_t task_id_value, types_t *task_id_type) {
|
||||
char *task_id = "UNKNOWN";
|
||||
|
||||
if (task_id_value < ((uint32_t) ~0))
|
||||
{
|
||||
/* Search task id name */
|
||||
task_id = enum_type_get_name_from_value (task_id_type->child, task_id_value);
|
||||
}
|
||||
|
||||
return task_id;
|
||||
}
|
||||
|
||||
uint32_t get_instance(buffer_t *buffer) {
|
||||
uint32_t instance_value;
|
||||
|
||||
/* Fetch instance value */
|
||||
buffer_fetch_bits (buffer, instance_type->offset, instance_type->child->child->child->size, &instance_value);
|
||||
|
||||
return instance_value;
|
||||
}
|
||||
|
||||
char *message_id_to_string(uint32_t message_id)
|
||||
{
|
||||
return enum_type_get_name_from_value(messages_id_enum, message_id);
|
||||
}
|
||||
@@ -1,62 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifndef LOCATE_ROOT_H_
|
||||
#define LOCATE_ROOT_H_
|
||||
|
||||
#include "types.h"
|
||||
|
||||
extern types_t *messages_id_enum;
|
||||
extern types_t *lte_time_type;
|
||||
extern types_t *lte_time_frame_type;
|
||||
extern types_t *lte_time_slot_type;
|
||||
extern types_t *origin_task_id_type;
|
||||
extern types_t *destination_task_id_type;
|
||||
extern types_t *instance_type;
|
||||
extern types_t *message_header_type;
|
||||
extern types_t *message_type;
|
||||
extern types_t *message_size_type;
|
||||
|
||||
int locate_root(const char *root_name, types_t *head, types_t **root);
|
||||
|
||||
int locate_type(const char *type_name, types_t *head, types_t **type);
|
||||
|
||||
int locate_type_children(const char *type_name, types_t *head, types_t **type);
|
||||
|
||||
uint32_t get_message_header_type_size(void);
|
||||
|
||||
uint32_t get_message_size(buffer_t *buffer);
|
||||
|
||||
uint32_t get_lte_frame(buffer_t *buffer);
|
||||
|
||||
uint32_t get_lte_slot(buffer_t *buffer);
|
||||
|
||||
uint32_t get_message_id(types_t *head, buffer_t *buffer, uint32_t *message_id);
|
||||
|
||||
char *message_id_to_string(uint32_t message_id);
|
||||
|
||||
uint32_t get_task_id(buffer_t *buffer, types_t *task_id_type);
|
||||
|
||||
char *task_id_to_string(uint32_t task_id_value, types_t *task_id_type);
|
||||
|
||||
uint32_t get_instance(buffer_t *buffer);
|
||||
|
||||
#endif /* LOCATE_ROOT_H_ */
|
||||
@@ -1,384 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define G_LOG_DOMAIN ("RESOLVER")
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#include "types.h"
|
||||
#include "resolvers.h"
|
||||
|
||||
typedef enum {
|
||||
RESOLV_OK = 0,
|
||||
RESOLV_ERROR = -1,
|
||||
RESOLV_LIST_EMPTY = -2,
|
||||
RESOLV_NOT_FOUND = -3,
|
||||
} resolv_rc_e;
|
||||
|
||||
static int search_id(types_t *head, types_t **found, int id)
|
||||
{
|
||||
types_t *next_type;
|
||||
|
||||
if (!head) {
|
||||
g_warning("Empty list detected");
|
||||
return RESOLV_LIST_EMPTY;
|
||||
}
|
||||
|
||||
for (next_type = head; next_type; next_type = next_type->next)
|
||||
{
|
||||
if (next_type->id == id && next_type->type != TYPE_FILE)
|
||||
break;
|
||||
}
|
||||
if (found)
|
||||
*found = next_type;
|
||||
|
||||
return next_type == NULL ? RESOLV_NOT_FOUND : RESOLV_OK;
|
||||
}
|
||||
|
||||
int search_file(types_t *head, types_t **found, int file_id)
|
||||
{
|
||||
types_t *next_type;
|
||||
|
||||
if (!head) {
|
||||
g_warning("Empty list detected");
|
||||
return RESOLV_LIST_EMPTY;
|
||||
}
|
||||
|
||||
for (next_type = head; next_type; next_type = next_type->next)
|
||||
{
|
||||
if (next_type->type != TYPE_FILE)
|
||||
continue;
|
||||
if (file_id == next_type->id)
|
||||
break;
|
||||
}
|
||||
if (found)
|
||||
*found = next_type;
|
||||
|
||||
return next_type == NULL ? RESOLV_NOT_FOUND : RESOLV_OK;
|
||||
}
|
||||
|
||||
int resolve_typedefs(types_t **head)
|
||||
{
|
||||
types_t *next_type;
|
||||
|
||||
if (!head) {
|
||||
g_warning("Empty list detected");
|
||||
return RESOLV_LIST_EMPTY;
|
||||
}
|
||||
|
||||
for (next_type = *head; next_type; next_type = next_type->next)
|
||||
{
|
||||
/* Only resolve typedef */
|
||||
if (next_type->type != TYPE_TYPEDEF)
|
||||
continue;
|
||||
|
||||
// printf("Trying to resolve typedef %s with type %d\n", next_type->name, next_type->id);
|
||||
|
||||
if (search_id(*head, &next_type->child, next_type->type_xml) != RESOLV_OK) {
|
||||
/* We have to remove this reference */
|
||||
}/* else {
|
||||
next_type->type_hr_display(next_type, 0);
|
||||
}*/
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int resolve_struct(types_t **head)
|
||||
{
|
||||
types_t *next_type;
|
||||
|
||||
if (!head) {
|
||||
g_warning("Empty list detected");
|
||||
return RESOLV_LIST_EMPTY;
|
||||
}
|
||||
|
||||
for (next_type = *head; next_type; next_type = next_type->next)
|
||||
{
|
||||
char *member;
|
||||
char *members;
|
||||
|
||||
/* Only resolve typedef */
|
||||
if (next_type->type != TYPE_STRUCT)
|
||||
continue;
|
||||
|
||||
g_debug("Trying to resolve struct members %s with type %d", next_type->name, next_type->id);
|
||||
|
||||
/* Struct may have no member */
|
||||
if (next_type->members == NULL)
|
||||
continue;
|
||||
|
||||
/* We have to copy the string as strtok will split the string in argument */
|
||||
members = strdup(next_type->members);
|
||||
|
||||
/* Split the string on spaces and _ */
|
||||
member = strtok(members, " _");
|
||||
while(member != NULL)
|
||||
{
|
||||
if (next_type->nb_members == 0) {
|
||||
next_type->members_child = malloc(sizeof(types_t *));
|
||||
} else {
|
||||
next_type->members_child = realloc(next_type->members_child,
|
||||
(next_type->nb_members + 1) * sizeof(types_t *));
|
||||
}
|
||||
if (search_id(*head, &next_type->members_child[next_type->nb_members], atoi(member)) != RESOLV_OK) {
|
||||
/* We have to remove this reference */
|
||||
}
|
||||
if ((next_type->members_child[next_type->nb_members] != NULL)
|
||||
&& (next_type->members_child[next_type->nb_members]->type != TYPE_FIELD))
|
||||
{
|
||||
/* Only keep field child for structure, other member can be present
|
||||
* for defining types (union or struct) used by fields but should not be considered. */
|
||||
next_type->members_child[next_type->nb_members] = NULL;
|
||||
/* We have to remove this reference */
|
||||
}
|
||||
next_type->nb_members++;
|
||||
/* Pick up the next string available */
|
||||
member = strtok(NULL, " _");
|
||||
}
|
||||
|
||||
free(members);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int resolve_union(types_t **head)
|
||||
{
|
||||
types_t *next_type;
|
||||
|
||||
if (!head) {
|
||||
g_warning("Empty list detected");
|
||||
return RESOLV_LIST_EMPTY;
|
||||
}
|
||||
|
||||
for (next_type = *head; next_type; next_type = next_type->next)
|
||||
{
|
||||
char *member;
|
||||
char *members;
|
||||
|
||||
/* Only resolve typedef */
|
||||
if (next_type->type != TYPE_UNION)
|
||||
continue;
|
||||
|
||||
g_debug("Trying to resolve union members %s with type %d\n", next_type->name, next_type->id);
|
||||
|
||||
/* Struct may have no member */
|
||||
if (next_type->members == NULL)
|
||||
continue;
|
||||
|
||||
/* We have to copy the string as strtok will modify the string in argument */
|
||||
members = strdup(next_type->members);
|
||||
|
||||
/* Split the string on spaces and _ */
|
||||
member = strtok(members, " _");
|
||||
while(member != NULL)
|
||||
{
|
||||
if (next_type->nb_members == 0) {
|
||||
next_type->members_child = malloc(sizeof(types_t *));
|
||||
} else {
|
||||
next_type->members_child = realloc(next_type->members_child,
|
||||
(next_type->nb_members + 1) * sizeof(types_t *));
|
||||
}
|
||||
if (search_id(*head, &next_type->members_child[next_type->nb_members], atoi(member)) != RESOLV_OK) {
|
||||
/* We have to remove this reference */
|
||||
}
|
||||
next_type->nb_members++;
|
||||
/* Pick up the next string available */
|
||||
member = strtok(NULL, " _");
|
||||
}
|
||||
|
||||
free(members);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int resolve_pointer_type(types_t **head)
|
||||
{
|
||||
types_t *next_type;
|
||||
|
||||
if (!head) {
|
||||
g_warning("Empty list detected");
|
||||
return RESOLV_LIST_EMPTY;
|
||||
}
|
||||
|
||||
for (next_type = *head; next_type; next_type = next_type->next)
|
||||
{
|
||||
/* Only resolve typedef */
|
||||
if (next_type->type != TYPE_POINTER)
|
||||
continue;
|
||||
|
||||
g_debug("Trying to resolve pointer id %d with type %d",
|
||||
next_type->id, next_type->type_xml);
|
||||
|
||||
if (search_id(*head, &next_type->child, next_type->type_xml) != RESOLV_OK) {
|
||||
/* We have to remove this reference */
|
||||
}
|
||||
// next_type->type_hr_display(next_type, 0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int resolve_reference(types_t **head)
|
||||
{
|
||||
types_t *next_type;
|
||||
|
||||
if (!head) {
|
||||
g_warning("Empty list detected");
|
||||
return RESOLV_LIST_EMPTY;
|
||||
}
|
||||
|
||||
for (next_type = *head; next_type; next_type = next_type->next)
|
||||
{
|
||||
/* Only resolve typedef */
|
||||
if (next_type->type != TYPE_REFERENCE)
|
||||
continue;
|
||||
|
||||
g_debug("Trying to resolve reference id %d with type %d\n",
|
||||
next_type->id, next_type->type_xml);
|
||||
|
||||
if (search_id(*head, &next_type->child, next_type->type_xml) != RESOLV_OK) {
|
||||
/* We have to remove this reference */
|
||||
}
|
||||
// next_type->type_hr_display(next_type, 0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int resolve_field(types_t **head)
|
||||
{
|
||||
types_t *next_type;
|
||||
|
||||
if (!head) {
|
||||
g_warning("Empty list detected");
|
||||
return RESOLV_LIST_EMPTY;
|
||||
}
|
||||
|
||||
for (next_type = *head; next_type; next_type = next_type->next)
|
||||
{
|
||||
/* Only resolve typedef */
|
||||
if (next_type->type != TYPE_FIELD)
|
||||
continue;
|
||||
|
||||
g_debug("Trying to resolve pointer id %d with type %d\n",
|
||||
next_type->id, next_type->type_xml);
|
||||
|
||||
if (search_id(*head, &next_type->child, next_type->type_xml) != RESOLV_OK) {
|
||||
/* We have to remove this reference */
|
||||
}
|
||||
// next_type->type_hr_display(next_type, 0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int resolve_array(types_t **head)
|
||||
{
|
||||
types_t *next_type;
|
||||
|
||||
if (!head) {
|
||||
g_warning("Empty list detected");
|
||||
return RESOLV_LIST_EMPTY;
|
||||
}
|
||||
|
||||
for (next_type = *head; next_type; next_type = next_type->next)
|
||||
{
|
||||
/* Only resolve typedef */
|
||||
if (next_type->type != TYPE_ARRAY)
|
||||
continue;
|
||||
|
||||
g_debug("Trying to resolve array id %d with type %d\n",
|
||||
next_type->id, next_type->type_xml);
|
||||
|
||||
if (search_id(*head, &next_type->child, next_type->type_xml) != RESOLV_OK) {
|
||||
/* We have to remove this reference */
|
||||
}
|
||||
// next_type->type_hr_display(next_type, 0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int resolve_function(types_t **head)
|
||||
{
|
||||
types_t *next_type;
|
||||
|
||||
if (!head) {
|
||||
g_warning("Empty list detected");
|
||||
return RESOLV_LIST_EMPTY;
|
||||
}
|
||||
|
||||
for (next_type = *head; next_type; next_type = next_type->next)
|
||||
{
|
||||
/* Only resolve typedef */
|
||||
if (next_type->type != TYPE_FUNCTION)
|
||||
continue;
|
||||
|
||||
g_debug("Trying to resolve function id %d with type %d",
|
||||
next_type->id, next_type->type_xml);
|
||||
|
||||
if (search_id(*head, &next_type->child, next_type->type_xml) != RESOLV_OK) {
|
||||
/* We have to remove this reference */
|
||||
}
|
||||
// next_type->type_hr_display(next_type, 0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int resolve_file(types_t **head)
|
||||
{
|
||||
types_t *next_type;
|
||||
|
||||
if (!head) {
|
||||
g_warning("Empty list detected");
|
||||
return RESOLV_LIST_EMPTY;
|
||||
}
|
||||
|
||||
for (next_type = *head; next_type; next_type = next_type->next)
|
||||
{
|
||||
/* Only resolve typedef */
|
||||
if (next_type->type == TYPE_FILE)
|
||||
continue;
|
||||
|
||||
/* No reference to a file */
|
||||
if (next_type->file == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
g_debug("Trying to resolve file %s\n", next_type->file);
|
||||
|
||||
if (search_file(*head, &next_type->file_ref, atoi(&next_type->file[1])) != RESOLV_OK) {
|
||||
/* We have to remove this reference */
|
||||
}
|
||||
// next_type->type_hr_display(next_type, 0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifndef RESOLVERS_H_
|
||||
#define RESOLVERS_H_
|
||||
|
||||
int resolve_typedefs(types_t **head);
|
||||
|
||||
int resolve_struct(types_t **head);
|
||||
|
||||
int resolve_pointer_type(types_t **head);
|
||||
|
||||
int resolve_field(types_t **head);
|
||||
|
||||
int resolve_array(types_t **head);
|
||||
|
||||
int resolve_reference(types_t **head);
|
||||
|
||||
int resolve_union(types_t **head);
|
||||
|
||||
int resolve_file(types_t **head);
|
||||
|
||||
int resolve_function(types_t **head);
|
||||
|
||||
int search_file(types_t *head, types_t **found, int id);
|
||||
|
||||
#endif /* RESOLVERS_H_ */
|
||||
@@ -1,21 +0,0 @@
|
||||
AM_CFLAGS = \
|
||||
@ADD_CFLAGS@ \
|
||||
-I$(top_srcdir)/common \
|
||||
-I$(top_srcdir)/libbuffers \
|
||||
-I$(top_srcdir)/libparser \
|
||||
-I$(top_srcdir)/libresolver
|
||||
|
||||
noinst_LTLIBRARIES = libui.la
|
||||
|
||||
libui_la_LDFLAGS = -all-static
|
||||
libui_la_SOURCES = \
|
||||
ui_main_screen.c ui_main_screen.h \
|
||||
ui_menu_bar.c ui_menu_bar.h \
|
||||
ui_callbacks.c ui_callbacks.h \
|
||||
ui_tree_view.c ui_tree_view.h \
|
||||
ui_signal_dissect_view.c ui_signal_dissect_view.h \
|
||||
ui_notifications.c ui_notifications.h \
|
||||
ui_notif_dlg.c ui_notif_dlg.h \
|
||||
ui_interface.c ui_interface.h \
|
||||
ui_notebook.c ui_notebook.h \
|
||||
ui_filters.c ui_filters.h
|
||||
@@ -1,983 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#define G_LOG_DOMAIN ("UI_CB")
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include "logs.h"
|
||||
#include "rc.h"
|
||||
|
||||
#include "socket.h"
|
||||
|
||||
#include "ui_notif_dlg.h"
|
||||
#include "ui_main_screen.h"
|
||||
#include "ui_menu_bar.h"
|
||||
#include "ui_callbacks.h"
|
||||
#include "ui_interface.h"
|
||||
#include "ui_notifications.h"
|
||||
#include "ui_tree_view.h"
|
||||
#include "ui_signal_dissect_view.h"
|
||||
#include "ui_filters.h"
|
||||
#include "ui_notebook.h"
|
||||
|
||||
#include "types.h"
|
||||
#include "locate_root.h"
|
||||
#include "xml_parse.h"
|
||||
|
||||
static gboolean refresh_message_list = TRUE;
|
||||
static gboolean filters_changed = FALSE;
|
||||
static gboolean operation_running = FALSE;
|
||||
|
||||
static const char *ui_ip;
|
||||
static uint16_t ui_port;
|
||||
static GtkWidget *dialogbox_connect;
|
||||
static gboolean ui_auto_reconnect;
|
||||
|
||||
gboolean ui_callback_on_open_messages(GtkWidget *widget, gpointer data)
|
||||
{
|
||||
gboolean refresh = (data != NULL) ? TRUE : FALSE;
|
||||
|
||||
g_message("Open messages event occurred %d", refresh);
|
||||
|
||||
if (operation_running == FALSE)
|
||||
{
|
||||
operation_running = TRUE;
|
||||
if (refresh && (ui_main_data.messages_file_name != NULL))
|
||||
{
|
||||
ui_messages_read (ui_main_data.messages_file_name);
|
||||
}
|
||||
else
|
||||
{
|
||||
ui_messages_open_file_chooser ();
|
||||
}
|
||||
operation_running = FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean ui_callback_on_save_messages(GtkWidget *widget, gpointer data)
|
||||
{
|
||||
gboolean filtered = (data != NULL) ? TRUE : FALSE;
|
||||
|
||||
g_message("Save messages event occurred %d", filtered);
|
||||
|
||||
if (operation_running == FALSE)
|
||||
{
|
||||
operation_running = TRUE;
|
||||
ui_messages_save_file_chooser(filtered);
|
||||
operation_running = FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean ui_callback_on_filters_enabled(GtkToolButton *button, gpointer data)
|
||||
{
|
||||
gboolean enabled;
|
||||
gboolean changed;
|
||||
|
||||
enabled = gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON(button));
|
||||
|
||||
g_info("Filters enabled event occurred %d", enabled);
|
||||
|
||||
changed = ui_filters_enable (enabled);
|
||||
|
||||
if (changed)
|
||||
{
|
||||
/* Set the tool tip text */
|
||||
if (enabled)
|
||||
{
|
||||
gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(button), "Disable messages filtering");
|
||||
}
|
||||
else
|
||||
{
|
||||
gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(button), "Enable messages filtering");
|
||||
}
|
||||
ui_tree_view_refilter ();
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean ui_callback_on_open_filters(GtkWidget *widget, gpointer data)
|
||||
{
|
||||
gboolean refresh = (data != NULL) ? TRUE : FALSE;
|
||||
|
||||
g_message("Open filters event occurred");
|
||||
|
||||
if (operation_running == FALSE)
|
||||
{
|
||||
operation_running = TRUE;
|
||||
if (refresh && (ui_main_data.filters_file_name != NULL))
|
||||
{
|
||||
ui_filters_read (ui_main_data.filters_file_name);
|
||||
}
|
||||
else
|
||||
{
|
||||
ui_filters_open_file_chooser ();
|
||||
}
|
||||
operation_running = FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean ui_callback_on_save_filters(GtkWidget *widget, gpointer data)
|
||||
{
|
||||
if (operation_running == FALSE)
|
||||
{
|
||||
operation_running = TRUE;
|
||||
g_message("Save filters event occurred");
|
||||
ui_filters_save_file_chooser();
|
||||
operation_running = FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean ui_callback_on_enable_filters(GtkWidget *widget, gpointer data)
|
||||
{
|
||||
gboolean enabled;
|
||||
|
||||
enabled = gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.filters_enabled));
|
||||
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.filters_enabled), !enabled);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean ui_callback_on_about(GtkWidget *widget, gpointer data)
|
||||
{
|
||||
#if defined(PACKAGE_STRING)
|
||||
ui_notification_dialog (GTK_MESSAGE_INFO, FALSE, "about", "Eurecom %s", PACKAGE_STRING);
|
||||
#else
|
||||
ui_notification_dialog (GTK_MESSAGE_INFO, FALSE, "about", "Eurecom itti_analyzer");
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gint ui_callback_check_string (const char *string, const gint lenght, const guint message_number)
|
||||
{
|
||||
gint real_length;
|
||||
|
||||
real_length = strnlen (string, lenght);
|
||||
if (lenght != real_length)
|
||||
{
|
||||
if (message_number)
|
||||
{
|
||||
g_warning("Bad string format for message %u, '\\0' found before end of string (%d/%d)\n", message_number, real_length, lenght);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_warning("Bad string format, '\\0' found before end of string (%d/%d)\n", real_length, lenght);
|
||||
}
|
||||
return (real_length);
|
||||
}
|
||||
else
|
||||
{
|
||||
return (lenght);
|
||||
}
|
||||
}
|
||||
|
||||
gboolean ui_callback_on_select_signal(GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path,
|
||||
gboolean path_currently_selected, gpointer user_data)
|
||||
{
|
||||
static gpointer buffer_current;
|
||||
ui_text_view_t *text_view;
|
||||
GtkTreeIter iter;
|
||||
|
||||
g_debug("Message selected %d %p %p %s", path_currently_selected, buffer_current, path, gtk_tree_path_to_string(path));
|
||||
|
||||
if (!path_currently_selected)
|
||||
{
|
||||
text_view = (ui_text_view_t *) user_data;
|
||||
|
||||
g_assert(text_view != NULL);
|
||||
|
||||
if (gtk_tree_model_get_iter (model, &iter, path))
|
||||
{
|
||||
gpointer buffer;
|
||||
|
||||
uint32_t message_number;
|
||||
uint32_t message_id;
|
||||
uint32_t origin_task_id;
|
||||
uint32_t destination_task_id;
|
||||
char *instance_name;
|
||||
uint32_t instance;
|
||||
char label[100];
|
||||
|
||||
gtk_tree_model_get (model, &iter, COL_MSG_NUM, &message_number, COL_MESSAGE_ID, &message_id,
|
||||
COL_FROM_TASK_ID, &origin_task_id, COL_TO_TASK_ID, &destination_task_id, COL_INSTANCE, &instance_name,
|
||||
COL_INSTANCE_ID, &instance, COL_BUFFER, &buffer, -1);
|
||||
|
||||
g_debug(" Get iter %p %p", buffer_current, buffer);
|
||||
|
||||
if (ui_tree_view_last_event)
|
||||
{
|
||||
g_debug("last_event %p %d %d", ui_tree_view_last_event, ui_tree_view_last_event->type, ui_tree_view_last_event->button);
|
||||
|
||||
if (ui_tree_view_last_event->type == GDK_BUTTON_PRESS)
|
||||
{
|
||||
/* Callback is due to a button click */
|
||||
if (ui_tree_view_last_event->button == 1)
|
||||
{
|
||||
/* It was a left mouse click */
|
||||
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.signals_go_to_last_button), FALSE);
|
||||
}
|
||||
|
||||
if (ui_tree_view_last_event->button == 3)
|
||||
{
|
||||
/* It was a right mouse click */
|
||||
int item;
|
||||
|
||||
/* Clear event */
|
||||
ui_tree_view_last_event = NULL;
|
||||
|
||||
/* Create filter menus to refers its items in the pop-up menu */
|
||||
ui_create_filter_menus ();
|
||||
|
||||
g_info("Message selected right click %d %d %d %d", message_id, origin_task_id, destination_task_id, instance);
|
||||
|
||||
/* Message Id menu */
|
||||
{
|
||||
/* Invalidate associated menu item to avoid issue with call back when updating the menu item check state */
|
||||
ui_tree_view_menu_enable[MENU_MESSAGE].filter_item = NULL;
|
||||
item = ui_filters_search_id (&ui_filters.messages, message_id);
|
||||
/* Update the menu item check state based on message ID state */
|
||||
gtk_check_menu_item_set_active (
|
||||
GTK_CHECK_MENU_ITEM(ui_tree_view_menu_enable[MENU_MESSAGE].menu_enable),
|
||||
ui_filters.messages.items[item].enabled);
|
||||
/* Set menu item label */
|
||||
sprintf (label, "Message: %s", message_id_to_string (message_id));
|
||||
gtk_menu_item_set_label (GTK_MENU_ITEM(ui_tree_view_menu_enable[MENU_MESSAGE].menu_enable),
|
||||
label);
|
||||
/* Save menu item associated to this row */
|
||||
ui_tree_view_menu_enable[MENU_MESSAGE].filter_item = &ui_filters.messages.items[item];
|
||||
}
|
||||
|
||||
/* Origin task id */
|
||||
{
|
||||
/* Invalidate associated menu item to avoid issue with call back when updating the menu item check state */
|
||||
ui_tree_view_menu_enable[MENU_FROM_TASK].filter_item = NULL;
|
||||
item = ui_filters_search_id (&ui_filters.origin_tasks, origin_task_id);
|
||||
/* Update the menu item check state based on message ID state */
|
||||
gtk_check_menu_item_set_active (
|
||||
GTK_CHECK_MENU_ITEM(ui_tree_view_menu_enable[MENU_FROM_TASK].menu_enable),
|
||||
ui_filters.origin_tasks.items[item].enabled);
|
||||
/* Set menu item label */
|
||||
sprintf (label, "From: %s", task_id_to_string (origin_task_id, origin_task_id_type));
|
||||
gtk_menu_item_set_label (
|
||||
GTK_MENU_ITEM(ui_tree_view_menu_enable[MENU_FROM_TASK].menu_enable), label);
|
||||
/* Save menu item associated to this row */
|
||||
ui_tree_view_menu_enable[MENU_FROM_TASK].filter_item = &ui_filters.origin_tasks.items[item];
|
||||
}
|
||||
|
||||
/* Destination task id */
|
||||
{
|
||||
/* Invalidate associated menu item to avoid issue with call back when updating the menu item check state */
|
||||
ui_tree_view_menu_enable[MENU_TO_TASK].filter_item = NULL;
|
||||
item = ui_filters_search_id (&ui_filters.destination_tasks, destination_task_id);
|
||||
/* Update the menu item check state based on message ID state */
|
||||
gtk_check_menu_item_set_active (
|
||||
GTK_CHECK_MENU_ITEM(ui_tree_view_menu_enable[MENU_TO_TASK].menu_enable),
|
||||
ui_filters.destination_tasks.items[item].enabled);
|
||||
/* Set menu item label */
|
||||
sprintf (label, "To: %s",
|
||||
task_id_to_string (destination_task_id, destination_task_id_type));
|
||||
gtk_menu_item_set_label (GTK_MENU_ITEM(ui_tree_view_menu_enable[MENU_TO_TASK].menu_enable),
|
||||
label);
|
||||
/* Save menu item associated to this row */
|
||||
ui_tree_view_menu_enable[MENU_TO_TASK].filter_item =
|
||||
&ui_filters.destination_tasks.items[item];
|
||||
}
|
||||
|
||||
/* Instance */
|
||||
{
|
||||
/* Invalidate associated menu item to avoid issue with call back when updating the menu item check state */
|
||||
ui_tree_view_menu_enable[MENU_INSTANCE].filter_item = NULL;
|
||||
item = ui_filters_search_id (&ui_filters.instances, instance);
|
||||
/* Update the menu item check state based on message ID state */
|
||||
gtk_check_menu_item_set_active (
|
||||
GTK_CHECK_MENU_ITEM(ui_tree_view_menu_enable[MENU_INSTANCE].menu_enable),
|
||||
ui_filters.instances.items[item].enabled);
|
||||
/* Set menu item label */
|
||||
sprintf (label, "Instance: %s", instance_name);
|
||||
gtk_menu_item_set_label (GTK_MENU_ITEM(ui_tree_view_menu_enable[MENU_INSTANCE].menu_enable),
|
||||
label);
|
||||
/* Save menu item associated to this row */
|
||||
ui_tree_view_menu_enable[MENU_INSTANCE].filter_item = &ui_filters.instances.items[item];
|
||||
}
|
||||
|
||||
gtk_menu_popup (GTK_MENU (ui_tree_view_menu), NULL, NULL, NULL, NULL, 0,
|
||||
gtk_get_current_event_time ());
|
||||
}
|
||||
}
|
||||
|
||||
/* Clear event */
|
||||
ui_tree_view_last_event = NULL;
|
||||
}
|
||||
|
||||
if (buffer_current != buffer)
|
||||
{
|
||||
buffer_current = buffer;
|
||||
|
||||
/* Clear the view */
|
||||
CHECK_FCT_DO(ui_signal_dissect_clear_view(text_view), return FALSE);
|
||||
|
||||
if (ui_main_data.display_message_header)
|
||||
{
|
||||
CHECK_FCT_DO(dissect_signal_header((buffer_t*)buffer, ui_signal_set_text, text_view), return FALSE);
|
||||
}
|
||||
|
||||
if ((strcmp (message_id_to_string (message_id), "ERROR_LOG") == 0)
|
||||
|| (strcmp (message_id_to_string (message_id), "WARNING_LOG") == 0)
|
||||
|| (strcmp (message_id_to_string (message_id), "NOTICE_LOG") == 0)
|
||||
|| (strcmp (message_id_to_string (message_id), "INFO_LOG") == 0)
|
||||
|| (strcmp (message_id_to_string (message_id), "DEBUG_LOG") == 0)
|
||||
|| (strcmp (message_id_to_string (message_id), "GENERIC_LOG") == 0))
|
||||
{
|
||||
gchar *data;
|
||||
gint data_size;
|
||||
uint32_t message_header_type_size;
|
||||
|
||||
if (ui_main_data.display_message_header)
|
||||
{
|
||||
ui_signal_set_text (text_view, "\n", 1);
|
||||
}
|
||||
|
||||
message_header_type_size = get_message_header_type_size ();
|
||||
data = (gchar *) buffer_at_offset ((buffer_t*) buffer, message_header_type_size);
|
||||
data_size = get_message_size ((buffer_t*) buffer);
|
||||
data_size = ui_callback_check_string (data, data_size, message_number);
|
||||
|
||||
g_info(" dump message %d: header type size: %u, data size: %u, buffer %p, follow last %d",
|
||||
message_number, message_header_type_size, data_size, buffer, ui_main_data.follow_last);
|
||||
|
||||
ui_signal_set_text (text_view, data, data_size);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_info(" dissect message %d: id %d, buffer %p, follow last %d", message_number, message_id, buffer, ui_main_data.follow_last);
|
||||
|
||||
/* Dissect the signal */
|
||||
CHECK_FCT_DO(dissect_signal((buffer_t*)buffer, ui_signal_set_text, text_view), return FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean ui_callback_on_menu_enable(GtkWidget *widget, gpointer data)
|
||||
{
|
||||
ui_tree_view_menu_enable_t *menu_enable = data;
|
||||
|
||||
if (menu_enable->filter_item != NULL)
|
||||
{
|
||||
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(menu_enable->filter_item->menu_item),
|
||||
gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM(menu_enable->menu_enable)));
|
||||
menu_enable->filter_item = NULL;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean ui_callback_on_menu_color(GtkWidget *widget, gpointer data)
|
||||
{
|
||||
ui_tree_view_menu_color_t *menu_color = data;
|
||||
|
||||
GdkRGBA color;
|
||||
GtkWidget *color_chooser;
|
||||
gint response;
|
||||
|
||||
color_chooser = gtk_color_chooser_dialog_new ("Select message background color", GTK_WINDOW(ui_main_data.window));
|
||||
gtk_color_chooser_set_use_alpha (GTK_COLOR_CHOOSER(color_chooser), FALSE);
|
||||
response = gtk_dialog_run (GTK_DIALOG (color_chooser));
|
||||
|
||||
if (response == GTK_RESPONSE_OK)
|
||||
{
|
||||
int red, green, blue;
|
||||
char *color_string;
|
||||
|
||||
color_string =
|
||||
menu_color->foreground ?
|
||||
menu_color->menu_enable->filter_item->foreground :
|
||||
menu_color->menu_enable->filter_item->background;
|
||||
|
||||
gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER(color_chooser), &color);
|
||||
|
||||
red = (int) (color.red * 255);
|
||||
green = (int) (color.green * 255);
|
||||
blue = (int) (color.blue * 255);
|
||||
|
||||
snprintf (color_string, COLOR_SIZE, "#%02x%02x%02x", red, green, blue);
|
||||
ui_tree_view_refilter ();
|
||||
|
||||
g_info("Selected color for %s %f->%02x %f->%02x %f->%02x %s",
|
||||
menu_color->menu_enable->filter_item->name, color.red, red, color.green, green, color.blue, blue, color_string);
|
||||
}
|
||||
gtk_widget_destroy (color_chooser);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void ui_signal_add_to_list(gpointer data, gpointer user_data)
|
||||
{
|
||||
gboolean goto_last = user_data ? TRUE : FALSE;
|
||||
buffer_t *signal_buffer;
|
||||
GtkTreePath *path;
|
||||
GtkTreeViewColumn *focus_column;
|
||||
uint32_t lte_frame;
|
||||
uint32_t lte_slot;
|
||||
uint32_t origin_task_id;
|
||||
uint32_t destination_task_id;
|
||||
uint32_t instance;
|
||||
char lte_time[15];
|
||||
|
||||
g_assert(data != NULL);
|
||||
g_assert(origin_task_id_type != NULL);
|
||||
g_assert(destination_task_id_type != NULL);
|
||||
|
||||
gtk_tree_view_get_cursor (GTK_TREE_VIEW(ui_main_data.messages_list), &path, &focus_column);
|
||||
|
||||
signal_buffer = (buffer_t *) data;
|
||||
|
||||
lte_frame = get_lte_frame (signal_buffer);
|
||||
lte_slot = get_lte_slot (signal_buffer);
|
||||
sprintf (lte_time, "%d.%02d", lte_frame, lte_slot);
|
||||
|
||||
get_message_id (root, signal_buffer, &signal_buffer->message_id);
|
||||
origin_task_id = get_task_id (signal_buffer, origin_task_id_type);
|
||||
destination_task_id = get_task_id (signal_buffer, destination_task_id_type);
|
||||
instance = get_instance (signal_buffer);
|
||||
|
||||
ui_tree_view_new_signal_ind (signal_buffer->message_number, lte_time, signal_buffer->message_id,
|
||||
message_id_to_string (signal_buffer->message_id), origin_task_id,
|
||||
task_id_to_string (origin_task_id, origin_task_id_type), destination_task_id,
|
||||
task_id_to_string (destination_task_id, destination_task_id_type), instance, data);
|
||||
|
||||
if ((strcmp (message_id_to_string (signal_buffer->message_id), "ERROR_LOG") == 0)
|
||||
|| (strcmp (message_id_to_string (signal_buffer->message_id), "WARNING_LOG") == 0)
|
||||
|| (strcmp (message_id_to_string (signal_buffer->message_id), "NOTICE_LOG") == 0)
|
||||
|| (strcmp (message_id_to_string (signal_buffer->message_id), "INFO_LOG") == 0)
|
||||
|| (strcmp (message_id_to_string (signal_buffer->message_id), "DEBUG_LOG") == 0)
|
||||
|| (strcmp (message_id_to_string (signal_buffer->message_id), "GENERIC_LOG") == 0))
|
||||
{
|
||||
gchar *string_terminal;
|
||||
gint string_terminal_size;
|
||||
uint32_t message_header_type_size;
|
||||
|
||||
message_header_type_size = get_message_header_type_size ();
|
||||
string_terminal = (gchar *) buffer_at_offset ((buffer_t*) signal_buffer, message_header_type_size);
|
||||
string_terminal_size = get_message_size ((buffer_t*) signal_buffer);
|
||||
string_terminal_size = ui_callback_check_string (string_terminal, string_terminal_size, signal_buffer->message_number);
|
||||
ui_notebook_terminal_append_data(string_terminal, string_terminal_size);
|
||||
}
|
||||
|
||||
/* Increment number of messages */
|
||||
ui_main_data.nb_message_received++;
|
||||
|
||||
if ((ui_main_data.follow_last) && (goto_last))
|
||||
{
|
||||
/* Advance to the new last signal */
|
||||
ui_tree_view_select_row (ui_tree_view_get_filtered_number () - 1);
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean ui_handle_update_signal_list(gint fd, void *data, size_t data_length)
|
||||
{
|
||||
pipe_new_signals_list_message_t *signal_list_message;
|
||||
|
||||
/* Enable buttons to move in the list of signals */
|
||||
ui_set_sensitive_move_buttons (TRUE);
|
||||
|
||||
signal_list_message = (pipe_new_signals_list_message_t *) data;
|
||||
|
||||
g_assert(signal_list_message != NULL);
|
||||
g_assert(signal_list_message->signal_list != NULL);
|
||||
|
||||
g_list_foreach (signal_list_message->signal_list, ui_signal_add_to_list, (gpointer) TRUE);
|
||||
|
||||
/* Free the list but not user data associated with each element */
|
||||
g_list_free (signal_list_message->signal_list);
|
||||
/* Free the message */
|
||||
free (signal_list_message);
|
||||
|
||||
ui_gtk_flush_events ();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean ui_handle_socket_connection_failed(gint fd)
|
||||
{
|
||||
gtk_dialog_response(GTK_DIALOG (dialogbox_connect), GTK_RESPONSE_REJECT);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean ui_handle_socket_connection_lost(gint fd)
|
||||
{
|
||||
if (operation_running)
|
||||
{
|
||||
operation_running = FALSE;
|
||||
if (ui_auto_reconnect)
|
||||
{
|
||||
ui_callback_on_connect (NULL, (gpointer) FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
ui_enable_connect_button();
|
||||
ui_set_sensitive_save_message_buttons (TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean ui_handle_socket_xml_definition(gint fd, void *data, size_t data_length)
|
||||
{
|
||||
pipe_xml_definition_message_t *xml_definition_message;
|
||||
|
||||
xml_definition_message = (pipe_xml_definition_message_t *) data;
|
||||
g_assert(xml_definition_message != NULL);
|
||||
g_assert(data_length == sizeof(pipe_xml_definition_message_t));
|
||||
|
||||
xml_parse_buffer (xml_definition_message->xml_definition, xml_definition_message->xml_definition_length);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean ui_pipe_callback(gint source, gpointer user_data)
|
||||
{
|
||||
void *input_data = NULL;
|
||||
size_t input_data_length = 0;
|
||||
pipe_input_header_t input_header;
|
||||
|
||||
/* Read the header */
|
||||
if (read (source, &input_header, sizeof(input_header)) < 0)
|
||||
{
|
||||
g_warning("Failed to read from pipe %d: %s", source, g_strerror(errno));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
input_data_length = input_header.message_size - sizeof(input_header);
|
||||
|
||||
/* Checking for non-header part */
|
||||
if (input_data_length > 0)
|
||||
{
|
||||
input_data = malloc (input_data_length);
|
||||
|
||||
if (read (source, input_data, input_data_length) < 0)
|
||||
{
|
||||
g_warning("Failed to read from pipe %d: %s", source, g_strerror(errno));
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
switch (input_header.message_type)
|
||||
{
|
||||
case UI_PIPE_CONNECTION_FAILED:
|
||||
return ui_handle_socket_connection_failed (source);
|
||||
|
||||
case UI_PIPE_CONNECTION_LOST:
|
||||
return ui_handle_socket_connection_lost (source);
|
||||
|
||||
case UI_PIPE_XML_DEFINITION:
|
||||
gtk_dialog_response(GTK_DIALOG (dialogbox_connect), GTK_RESPONSE_OK);
|
||||
return ui_handle_socket_xml_definition (source, input_data, input_data_length);
|
||||
|
||||
case UI_PIPE_UPDATE_SIGNAL_LIST:
|
||||
return ui_handle_update_signal_list (source, input_data, input_data_length);
|
||||
|
||||
default:
|
||||
g_warning("[gui] Unhandled message type %u", input_header.message_type);
|
||||
g_assert_not_reached();
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gboolean ui_callback_on_auto_reconnect(GtkWidget *widget, gpointer data)
|
||||
{
|
||||
gboolean enabled;
|
||||
gboolean changed = TRUE;
|
||||
|
||||
gboolean toggle = (data != NULL) ? TRUE : FALSE;
|
||||
|
||||
enabled = gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.auto_reconnect));
|
||||
|
||||
if (toggle)
|
||||
{
|
||||
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.auto_reconnect), !enabled);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
g_info("Auto reconnect event occurred %d %d ", toggle, enabled);
|
||||
|
||||
ui_auto_reconnect = enabled;
|
||||
|
||||
if (changed)
|
||||
{
|
||||
/* Set the tool tip text */
|
||||
if (enabled)
|
||||
{
|
||||
gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(ui_main_data.auto_reconnect), "Disable automatic reconnection");
|
||||
}
|
||||
else
|
||||
{
|
||||
gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(ui_main_data.auto_reconnect), "Enable automatic reconnection");
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void ui_callback_dialogbox_connect_destroy(void)
|
||||
{
|
||||
if (dialogbox_connect != NULL)
|
||||
{
|
||||
gtk_widget_destroy (dialogbox_connect);
|
||||
dialogbox_connect = NULL;
|
||||
g_message("Connect dialogbox destroyed");
|
||||
}
|
||||
}
|
||||
|
||||
gboolean ui_callback_on_connect(GtkWidget *widget, gpointer data)
|
||||
{
|
||||
/* We have to retrieve the ip address and ui_port of remote host */
|
||||
gboolean start = (data != NULL) ? TRUE : FALSE;
|
||||
int pipe_fd[2];
|
||||
|
||||
if (start)
|
||||
{
|
||||
ui_port = atoi (gtk_entry_get_text (GTK_ENTRY(ui_main_data.port_entry)));
|
||||
ui_ip = gtk_entry_get_text (GTK_ENTRY(ui_main_data.ip_entry));
|
||||
}
|
||||
|
||||
g_message("Connect event occurred to %s:%d %s", ui_ip, ui_port, start ? "START" : "RETRY");
|
||||
|
||||
if (start)
|
||||
{
|
||||
if (strlen (ui_ip) == 0)
|
||||
{
|
||||
ui_notification_dialog (GTK_MESSAGE_ERROR, FALSE, "Connect", "Empty host ip address");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (ui_port == 0)
|
||||
{
|
||||
ui_notification_dialog (GTK_MESSAGE_ERROR, FALSE, "Connect", "Invalid host ui_port value");
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (operation_running == FALSE)
|
||||
{
|
||||
operation_running = TRUE;
|
||||
|
||||
ui_pipe_new (pipe_fd, ui_pipe_callback, NULL);
|
||||
|
||||
memcpy (ui_main_data.pipe_fd, pipe_fd, sizeof(int) * 2);
|
||||
|
||||
/* Disable the connect button */
|
||||
ui_disable_connect_button ();
|
||||
|
||||
ui_set_title ("connecting to %s:%d ...", ui_ip, ui_port);
|
||||
{
|
||||
const static char *message_formats[] =
|
||||
{
|
||||
"Connecting to %s:%d ...",
|
||||
"Connection lost!\n\n" "Trying to reconnect to %s:%d ..."
|
||||
};
|
||||
gint response;
|
||||
gint x, y;
|
||||
gint w, h;
|
||||
|
||||
if (socket_connect_to_remote_host (ui_ip, ui_port, pipe_fd[1]) != 0)
|
||||
{
|
||||
ui_enable_connect_button ();
|
||||
operation_running = FALSE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Create dialog box for connect message:
|
||||
* - non modal mode does not seems to work, don't set the parent window to allow some interactions with it!
|
||||
*/
|
||||
dialogbox_connect = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_OTHER,
|
||||
GTK_BUTTONS_CANCEL, message_formats[start ? 0 : 1], ui_ip, ui_port);
|
||||
gtk_window_set_title (GTK_WINDOW(dialogbox_connect), "Connect");
|
||||
|
||||
/* Set the window at center of main window manually as there is no parent defined */
|
||||
gtk_window_get_position (GTK_WINDOW(ui_main_data.window), &x, &y);
|
||||
gtk_window_get_size (GTK_WINDOW(ui_main_data.window), &w, &h);
|
||||
g_message("Main window position: %d,%d dimension: %d,%d", x, y, w, h);
|
||||
x += w / 2;
|
||||
y += h / 2;
|
||||
g_message("Connect window position %d,%d", x, y);
|
||||
gtk_window_set_gravity (GTK_WINDOW(dialogbox_connect), GDK_GRAVITY_CENTER);
|
||||
gtk_window_move (GTK_WINDOW(dialogbox_connect), x, y);
|
||||
|
||||
response = gtk_dialog_run (GTK_DIALOG (dialogbox_connect));
|
||||
g_message("Connect dialog response %s (%d)", gtk_get_respose_string(response), response);
|
||||
|
||||
if (response == GTK_RESPONSE_NONE)
|
||||
{
|
||||
/* Dialogbox has been destroyed when program is exited, do nothing */
|
||||
return (TRUE);
|
||||
}
|
||||
if (response == GTK_RESPONSE_OK)
|
||||
{
|
||||
/* Connection is established */
|
||||
ui_set_sensitive_save_message_buttons (FALSE);
|
||||
ui_callback_signal_clear_list (NULL, NULL);
|
||||
ui_set_title ("%s:%d", ui_ip, ui_port);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Connection can not be established */
|
||||
if (response == GTK_RESPONSE_REJECT)
|
||||
{
|
||||
/* Connection retry time-out */
|
||||
ui_notification_dialog (GTK_MESSAGE_WARNING, FALSE, "Connect", "Failed to connect to provided host/ip address");
|
||||
}
|
||||
|
||||
/* Re-enable connect button */
|
||||
ui_enable_connect_button();
|
||||
operation_running = FALSE;
|
||||
}
|
||||
ui_callback_dialogbox_connect_destroy ();
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean ui_callback_on_disconnect(GtkWidget *widget, gpointer data)
|
||||
{
|
||||
g_message("Disconnect event occurred");
|
||||
|
||||
ui_pipe_write_message (ui_main_data.pipe_fd[0], UI_PIPE_DISCONNECT_EVT, NULL, 0);
|
||||
|
||||
if (dialogbox_connect != NULL)
|
||||
{
|
||||
gtk_dialog_response(GTK_DIALOG (dialogbox_connect), GTK_RESPONSE_CLOSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
ui_enable_connect_button ();
|
||||
operation_running = FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean ui_callback_signal_go_to_first(GtkWidget *widget, gpointer data)
|
||||
{
|
||||
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.signals_go_to_last_button), FALSE);
|
||||
ui_tree_view_select_row (0);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean ui_callback_signal_go_to(GtkWidget *widget, gpointer data)
|
||||
{
|
||||
gtk_window_set_focus (GTK_WINDOW(ui_main_data.window), ui_main_data.signals_go_to_entry);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean ui_callback_signal_go_to_entry(GtkWidget *widget, gpointer data)
|
||||
{
|
||||
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.signals_go_to_last_button), FALSE);
|
||||
// gtk_entry_buffer_set_text(GTK_ENTRY(ui_main_data.signals_go_to_entry), "");
|
||||
gtk_window_set_focus (GTK_WINDOW(ui_main_data.window), ui_main_data.messages_list);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean ui_callback_signal_go_to_last(GtkWidget *widget, gpointer data)
|
||||
{
|
||||
gboolean enable = (data != NULL) ? TRUE : FALSE;
|
||||
gboolean enabled;
|
||||
|
||||
if (enable)
|
||||
{
|
||||
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.signals_go_to_last_button), TRUE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
enabled = gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.signals_go_to_last_button));
|
||||
|
||||
g_info("Button signal go to last event occurred %d %d", enable, enabled);
|
||||
|
||||
if (enabled)
|
||||
{
|
||||
ui_main_data.follow_last = TRUE;
|
||||
ui_tree_view_select_row (ui_tree_view_get_filtered_number () - 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
ui_main_data.follow_last = FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean ui_callback_display_message_header(GtkWidget *widget, gpointer data)
|
||||
{
|
||||
ui_main_data.display_message_header = !ui_main_data.display_message_header;
|
||||
// TODO refresh textview.
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean ui_callback_display_brace(GtkWidget *widget, gpointer data)
|
||||
{
|
||||
ui_main_data.display_brace = !ui_main_data.display_brace;
|
||||
// TODO refresh textview.
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean ui_callback_signal_clear_list(GtkWidget *widget, gpointer data)
|
||||
{
|
||||
/* Disable buttons to move in the list of signals */
|
||||
ui_set_sensitive_move_buttons (FALSE);
|
||||
ui_set_title ("");
|
||||
|
||||
/* Clear list of signals */
|
||||
ui_tree_view_destroy_list (ui_main_data.messages_list);
|
||||
|
||||
if (ui_main_data.text_view != NULL)
|
||||
{
|
||||
ui_signal_dissect_clear_view (ui_main_data.text_view);
|
||||
}
|
||||
|
||||
ui_notebook_terminal_clear();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void ui_callback_on_menu_items_selected(GtkWidget *widget, gpointer data)
|
||||
{
|
||||
gboolean active = data != NULL;
|
||||
|
||||
if (GTK_IS_CHECK_MENU_ITEM(widget))
|
||||
{
|
||||
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(widget), active);
|
||||
}
|
||||
}
|
||||
|
||||
gboolean ui_callback_on_menu_none(GtkWidget *widget, gpointer data)
|
||||
{
|
||||
GtkWidget *menu = (GtkWidget *) data;
|
||||
|
||||
g_info("ui_callback_on_menu_none occurred %lx %lx)", (long) widget, (long) data);
|
||||
|
||||
refresh_message_list = FALSE;
|
||||
gtk_container_foreach (GTK_CONTAINER(menu), ui_callback_on_menu_items_selected, (gpointer) FALSE);
|
||||
refresh_message_list = TRUE;
|
||||
|
||||
if (filters_changed)
|
||||
{
|
||||
ui_tree_view_refilter ();
|
||||
filters_changed = FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean ui_callback_on_menu_all(GtkWidget *widget, gpointer data)
|
||||
{
|
||||
GtkWidget *menu = (GtkWidget *) data;
|
||||
|
||||
g_info("ui_callback_on_menu_all occurred %lx %lx)", (long) widget, (long) data);
|
||||
|
||||
refresh_message_list = FALSE;
|
||||
gtk_container_foreach (GTK_CONTAINER(menu), ui_callback_on_menu_items_selected, (gpointer) TRUE);
|
||||
refresh_message_list = TRUE;
|
||||
|
||||
if (filters_changed)
|
||||
{
|
||||
ui_tree_view_refilter ();
|
||||
filters_changed = FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean ui_callback_on_menu_item_selected(GtkWidget *widget, gpointer data)
|
||||
{
|
||||
ui_filter_item_t *filter_entry = data;
|
||||
gboolean enabled;
|
||||
|
||||
enabled = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM(widget));
|
||||
if (filter_entry->enabled != enabled)
|
||||
{
|
||||
filter_entry->enabled = enabled;
|
||||
if (refresh_message_list)
|
||||
{
|
||||
ui_tree_view_refilter ();
|
||||
}
|
||||
else
|
||||
{
|
||||
filters_changed = TRUE;
|
||||
}
|
||||
}
|
||||
g_info("ui_callback_on_menu_item_selected occurred %p %p %s %d (%d messages to display)", widget, data, filter_entry->name, enabled, ui_tree_view_get_filtered_number());
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean ui_callback_on_tree_column_header_click(GtkWidget *widget, gpointer data)
|
||||
{
|
||||
col_type_t col = (col_type_t) data;
|
||||
|
||||
g_info("ui_callback_on_tree_column_header_click %d", col);
|
||||
switch (col)
|
||||
{
|
||||
case COL_MESSAGE:
|
||||
ui_show_filter_menu (&ui_main_data.menu_filter_messages, &ui_filters.messages);
|
||||
break;
|
||||
|
||||
case COL_FROM_TASK:
|
||||
ui_show_filter_menu (&ui_main_data.menu_filter_origin_tasks, &ui_filters.origin_tasks);
|
||||
break;
|
||||
|
||||
case COL_TO_TASK:
|
||||
ui_show_filter_menu (&ui_main_data.menu_filter_destination_tasks, &ui_filters.destination_tasks);
|
||||
break;
|
||||
|
||||
case COL_INSTANCE:
|
||||
ui_show_filter_menu (&ui_main_data.menu_filter_instances, &ui_filters.instances);
|
||||
break;
|
||||
|
||||
default:
|
||||
g_warning("Unknown column filter %d in call to ui_callback_on_tree_column_header_click", col);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -1,114 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifndef UI_CALLBACKS_H_
|
||||
#define UI_CALLBACKS_H_
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
gboolean ui_callback_on_open_messages(GtkWidget *widget,
|
||||
gpointer data);
|
||||
|
||||
gboolean ui_callback_on_save_messages(GtkWidget *widget,
|
||||
gpointer data);
|
||||
|
||||
gboolean ui_callback_on_filters_enabled(GtkToolButton *button,
|
||||
gpointer data);
|
||||
|
||||
gboolean ui_callback_on_open_filters(GtkWidget *widget,
|
||||
gpointer data);
|
||||
|
||||
gboolean ui_callback_on_save_filters(GtkWidget *widget,
|
||||
gpointer data);
|
||||
|
||||
gboolean ui_callback_on_enable_filters(GtkWidget *widget,
|
||||
gpointer data);
|
||||
|
||||
gboolean ui_callback_on_about(GtkWidget *widget,
|
||||
gpointer data);
|
||||
|
||||
gint ui_callback_check_string (const char *string,
|
||||
const gint lenght,
|
||||
const guint message_number);
|
||||
|
||||
gboolean ui_pipe_callback(gint source, gpointer user_data);
|
||||
|
||||
gboolean ui_callback_on_auto_reconnect(GtkWidget *widget,
|
||||
gpointer data);
|
||||
|
||||
void ui_callback_dialogbox_connect_destroy(void);
|
||||
|
||||
gboolean ui_callback_on_connect(GtkWidget *widget,
|
||||
gpointer data);
|
||||
|
||||
gboolean ui_callback_on_disconnect(GtkWidget *widget,
|
||||
gpointer data);
|
||||
|
||||
gboolean ui_callback_on_tree_view_select(GtkWidget *widget,
|
||||
GdkEvent *event,
|
||||
gpointer data);
|
||||
|
||||
gboolean ui_callback_on_select_signal(GtkTreeSelection *selection,
|
||||
GtkTreeModel *model,
|
||||
GtkTreePath *path,
|
||||
gboolean path_currently_selected,
|
||||
gpointer userdata);
|
||||
|
||||
void ui_signal_add_to_list(gpointer data,
|
||||
gpointer user_data);
|
||||
|
||||
gboolean ui_callback_on_menu_enable (GtkWidget *widget, gpointer data);
|
||||
|
||||
gboolean ui_callback_on_menu_color (GtkWidget *widget, gpointer data);
|
||||
|
||||
gboolean ui_callback_signal_go_to_first(GtkWidget *widget,
|
||||
gpointer data);
|
||||
|
||||
gboolean ui_callback_signal_go_to(GtkWidget *widget,
|
||||
gpointer data);
|
||||
|
||||
gboolean ui_callback_signal_go_to_entry(GtkWidget *widget,
|
||||
gpointer data);
|
||||
|
||||
gboolean ui_callback_signal_go_to_last(GtkWidget *widget,
|
||||
gpointer data);
|
||||
|
||||
gboolean ui_callback_display_message_header(GtkWidget *widget,
|
||||
gpointer data);
|
||||
|
||||
gboolean ui_callback_display_brace(GtkWidget *widget,
|
||||
gpointer data);
|
||||
|
||||
gboolean ui_callback_signal_clear_list(GtkWidget *widget,
|
||||
gpointer data);
|
||||
|
||||
gboolean ui_callback_on_menu_none(GtkWidget *widget,
|
||||
gpointer data);
|
||||
|
||||
gboolean ui_callback_on_menu_all(GtkWidget *widget,
|
||||
gpointer data);
|
||||
|
||||
gboolean ui_callback_on_menu_item_selected(GtkWidget *widget,
|
||||
gpointer data);
|
||||
|
||||
gboolean ui_callback_on_tree_column_header_click(GtkWidget *widget,
|
||||
gpointer data);
|
||||
#endif /* UI_CALLBACKS_H_ */
|
||||
@@ -1,609 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define G_LOG_DOMAIN ("UI_FILTER")
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#include <libxml/parser.h>
|
||||
#include <libxml/tree.h>
|
||||
|
||||
#include "ui_callbacks.h"
|
||||
#include "ui_main_screen.h"
|
||||
#include "ui_filters.h"
|
||||
#include "ui_tree_view.h"
|
||||
#include "ui_notif_dlg.h"
|
||||
#include "rc.h"
|
||||
|
||||
const uint32_t FILTER_ALLOC_NUMBER = 100;
|
||||
const uint32_t FILTER_ID_UNDEFINED = ~0;
|
||||
|
||||
const char * const COLOR_WHITE = "#ffffff";
|
||||
const char * const COLOR_DARK_GREY = "#585858";
|
||||
|
||||
#define ENABLED_NAME "enabled"
|
||||
#define FOREGROUND_NAME "foreground_color"
|
||||
#define BACKGROUND_NAME "background_color"
|
||||
|
||||
ui_filters_t ui_filters;
|
||||
|
||||
static int ui_init_filter(ui_filter_t *filter, int reset, int clear_ids, char *name)
|
||||
{
|
||||
if (filter->items == NULL)
|
||||
{
|
||||
filter->name = name;
|
||||
|
||||
/* Allocate some filter entries */
|
||||
filter->items = malloc (FILTER_ALLOC_NUMBER * sizeof(ui_filter_item_t));
|
||||
filter->allocated = FILTER_ALLOC_NUMBER;
|
||||
}
|
||||
if (reset)
|
||||
{
|
||||
/* Reset number of used filter entries */
|
||||
filter->used = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (clear_ids)
|
||||
{
|
||||
/* Clear entries IDs */
|
||||
int item;
|
||||
|
||||
for (item = 0; item < filter->used; item++)
|
||||
{
|
||||
filter->items[item].id = FILTER_ID_UNDEFINED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (RC_OK);
|
||||
}
|
||||
|
||||
int ui_init_filters(int reset, int clear_ids)
|
||||
{
|
||||
ui_init_filter (&ui_filters.messages, reset, clear_ids, "messages");
|
||||
ui_init_filter (&ui_filters.origin_tasks, reset, clear_ids, "origin_tasks");
|
||||
ui_init_filter (&ui_filters.destination_tasks, reset, clear_ids, "destination_tasks");
|
||||
ui_init_filter (&ui_filters.instances, reset, clear_ids, "instances");
|
||||
|
||||
ui_destroy_filter_menus ();
|
||||
|
||||
return (RC_OK);
|
||||
}
|
||||
|
||||
gboolean ui_filters_enable(gboolean enabled)
|
||||
{
|
||||
gboolean changed = ui_filters.filters_enabled != enabled;
|
||||
|
||||
if (changed)
|
||||
{
|
||||
ui_filters.filters_enabled = enabled;
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
static int ui_filters_search_name(ui_filter_t *filter, const char *name)
|
||||
{
|
||||
int item;
|
||||
|
||||
for (item = 0; item < filter->used; item++)
|
||||
{
|
||||
if (strncmp (name, filter->items[item].name, SIGNAL_NAME_LENGTH) == 0)
|
||||
{
|
||||
return (item);
|
||||
}
|
||||
}
|
||||
|
||||
return (item);
|
||||
}
|
||||
|
||||
int ui_filters_search_id(ui_filter_t *filter, uint32_t value)
|
||||
{
|
||||
int item;
|
||||
|
||||
for (item = 0; item < filter->used; item++)
|
||||
{
|
||||
if (filter->items[item].id == value)
|
||||
{
|
||||
return (item);
|
||||
}
|
||||
}
|
||||
|
||||
return (-1);
|
||||
}
|
||||
|
||||
static void ui_filter_set_enabled(uint8_t *enabled, ui_entry_enabled_e entry_enabled, gboolean new)
|
||||
{
|
||||
if (entry_enabled == ENTRY_ENABLED_UNDEFINED)
|
||||
{
|
||||
if (new)
|
||||
{
|
||||
*enabled = TRUE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (entry_enabled == ENTRY_ENABLED_FALSE)
|
||||
{
|
||||
*enabled = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
*enabled = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int ui_filter_add(ui_filter_t *filter, uint32_t value, const char *name, ui_entry_enabled_e entry_enabled,
|
||||
const char *foreground, const char *background)
|
||||
{
|
||||
int item = ui_filters_search_name (filter, name);
|
||||
|
||||
if (item >= filter->allocated)
|
||||
{
|
||||
/* Increase number of filter entries */
|
||||
filter->items = realloc (filter->items, (filter->allocated + FILTER_ALLOC_NUMBER) * sizeof(ui_filter_item_t));
|
||||
filter->allocated += FILTER_ALLOC_NUMBER;
|
||||
}
|
||||
|
||||
if (value != FILTER_ID_UNDEFINED)
|
||||
{
|
||||
filter->items[item].id = value;
|
||||
}
|
||||
if (item >= filter->used)
|
||||
{
|
||||
/* New entry */
|
||||
strncpy (filter->items[item].name, name, SIGNAL_NAME_LENGTH);
|
||||
ui_filter_set_enabled (&filter->items[item].enabled, entry_enabled, TRUE);
|
||||
strncpy (filter->items[item].foreground, foreground != NULL ? foreground : COLOR_DARK_GREY, COLOR_SIZE);
|
||||
strncpy (filter->items[item].background, background != NULL ? background : COLOR_WHITE, COLOR_SIZE);
|
||||
|
||||
filter->used++;
|
||||
}
|
||||
else
|
||||
{
|
||||
ui_filter_set_enabled (&filter->items[item].enabled, entry_enabled, FALSE);
|
||||
if (foreground != NULL)
|
||||
{
|
||||
strncpy (filter->items[item].foreground, foreground, COLOR_SIZE);
|
||||
}
|
||||
if (background != NULL)
|
||||
{
|
||||
strncpy (filter->items[item].background, background, COLOR_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
g_debug("filter \"%s\" add %d \"%s\" %d", filter->name, value, name, entry_enabled);
|
||||
|
||||
return (item);
|
||||
}
|
||||
|
||||
void ui_filters_add(ui_filter_e filter, uint32_t value, const char *name, ui_entry_enabled_e entry_enabled,
|
||||
const char *foreground, const char *background)
|
||||
{
|
||||
switch (filter)
|
||||
{
|
||||
case FILTER_MESSAGES:
|
||||
ui_filter_add (&ui_filters.messages, value, name, entry_enabled, foreground, background);
|
||||
break;
|
||||
|
||||
case FILTER_ORIGIN_TASKS:
|
||||
ui_filter_add (&ui_filters.origin_tasks, value, name, entry_enabled, foreground, background);
|
||||
break;
|
||||
|
||||
case FILTER_DESTINATION_TASKS:
|
||||
ui_filter_add (&ui_filters.destination_tasks, value, name, entry_enabled, foreground, background);
|
||||
break;
|
||||
|
||||
case FILTER_INSTANCES:
|
||||
ui_filter_add (&ui_filters.instances, value, name, entry_enabled, foreground, background);
|
||||
break;
|
||||
|
||||
default:
|
||||
g_warning("unknown filter type %d", filter);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean ui_item_enabled(ui_filter_t *filter, const uint32_t value)
|
||||
{
|
||||
int item;
|
||||
|
||||
if (value != (uint32_t) ~0)
|
||||
{
|
||||
item = ui_filters_search_id (filter, value);
|
||||
|
||||
if (item >= 0)
|
||||
{
|
||||
return (filter->items[item].enabled ? TRUE : FALSE);
|
||||
}
|
||||
}
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
gboolean ui_filters_message_enabled(const uint32_t message, const uint32_t origin_task, const uint32_t destination_task,
|
||||
const uint32_t instance)
|
||||
{
|
||||
gboolean result;
|
||||
|
||||
result = (ui_item_enabled (&ui_filters.messages, message) && ui_item_enabled (&ui_filters.origin_tasks, origin_task)
|
||||
&& ui_item_enabled (&ui_filters.destination_tasks, destination_task)
|
||||
&& ui_item_enabled (&ui_filters.instances, instance));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static ui_filter_e ui_filter_from_name(const char *name)
|
||||
{
|
||||
if (strcmp (name, ui_filters.messages.name) == 0)
|
||||
{
|
||||
return FILTER_MESSAGES;
|
||||
}
|
||||
if (strcmp (name, ui_filters.origin_tasks.name) == 0)
|
||||
{
|
||||
return FILTER_ORIGIN_TASKS;
|
||||
}
|
||||
if (strcmp (name, ui_filters.destination_tasks.name) == 0)
|
||||
{
|
||||
return FILTER_DESTINATION_TASKS;
|
||||
}
|
||||
if (strcmp (name, ui_filters.instances.name) == 0)
|
||||
{
|
||||
return FILTER_INSTANCES;
|
||||
}
|
||||
return FILTER_UNKNOWN;
|
||||
}
|
||||
|
||||
static int xml_parse_filters(xmlDocPtr doc, const char *file_name)
|
||||
{
|
||||
xmlNode *root_element = NULL;
|
||||
xmlNode *filter_node = NULL;
|
||||
xmlNode *cur_node = NULL;
|
||||
ui_filter_e filter;
|
||||
guint filters_entries = 0;
|
||||
int ret = RC_FAIL;
|
||||
|
||||
/* Get the root element node */
|
||||
root_element = xmlDocGetRootElement (doc);
|
||||
|
||||
if (root_element != NULL)
|
||||
{
|
||||
/* Search for the start of filters definition */
|
||||
for (cur_node = root_element; (cur_node != NULL) && (strcmp ((char *) cur_node->name, "filters") != 0);
|
||||
cur_node = cur_node->next)
|
||||
;
|
||||
|
||||
if (cur_node != NULL)
|
||||
{
|
||||
/* Search for filter header */
|
||||
for (filter_node = cur_node->children; filter_node != NULL;)
|
||||
{
|
||||
/* Search for next element node */
|
||||
for (; (filter_node != NULL) && (filter_node->type != XML_ELEMENT_NODE); filter_node =
|
||||
filter_node->next)
|
||||
;
|
||||
|
||||
if (filter_node != NULL)
|
||||
{
|
||||
filter = ui_filter_from_name ((const char*) filter_node->name);
|
||||
g_debug("Found filter %s %d", filter_node->name, filter);
|
||||
|
||||
if (filter == FILTER_UNKNOWN)
|
||||
{
|
||||
g_warning("Unknown filter \"%s\"", filter_node->name);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Search for entries */
|
||||
for (cur_node = filter_node->children; cur_node != NULL;)
|
||||
{
|
||||
/* Search for next element node */
|
||||
for (; (cur_node != NULL) && (cur_node->type != XML_ELEMENT_NODE); cur_node =
|
||||
cur_node->next)
|
||||
;
|
||||
|
||||
if (cur_node != NULL)
|
||||
{
|
||||
xmlAttr *prop_node;
|
||||
ui_entry_enabled_e enabled = ENTRY_ENABLED_UNDEFINED;
|
||||
char *foreground = NULL;
|
||||
char *background = NULL;
|
||||
|
||||
for (prop_node = cur_node->properties; prop_node != NULL; prop_node = prop_node->next)
|
||||
{
|
||||
if (strcmp ((char *) prop_node->name, ENABLED_NAME) == 0)
|
||||
{
|
||||
enabled =
|
||||
prop_node->children->content[0] == '0' ?
|
||||
ENTRY_ENABLED_FALSE : ENTRY_ENABLED_TRUE;
|
||||
}
|
||||
if (strcmp ((char *) prop_node->name, FOREGROUND_NAME) == 0)
|
||||
{
|
||||
foreground = (char *) prop_node->children->content;
|
||||
}
|
||||
if (strcmp ((char *) prop_node->name, BACKGROUND_NAME) == 0)
|
||||
{
|
||||
background = (char *) prop_node->children->content;
|
||||
}
|
||||
}
|
||||
|
||||
g_debug(" Found entry %s %s", cur_node->name, cur_node->properties->children->content);
|
||||
ui_filters_add (filter, FILTER_ID_UNDEFINED, (const char*) cur_node->name, enabled,
|
||||
foreground, background);
|
||||
|
||||
filters_entries++;
|
||||
cur_node = cur_node->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
filter_node = filter_node->next;
|
||||
}
|
||||
}
|
||||
|
||||
/* Filters have changed destroy filter menus and update tree view */
|
||||
ui_destroy_filter_menus ();
|
||||
|
||||
/* Reactivate filtering */
|
||||
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.filters_enabled), TRUE);
|
||||
ui_tree_view_refilter ();
|
||||
}
|
||||
}
|
||||
/* Free the document */
|
||||
xmlFreeDoc (doc);
|
||||
|
||||
if (filters_entries > 0)
|
||||
{
|
||||
ret = RC_OK;
|
||||
}
|
||||
|
||||
g_message("Parsed XML filters file \"%s\", found %d entries (%d messages to display)", file_name, filters_entries, ui_tree_view_get_filtered_number());
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ui_filters_read(const char *file_name)
|
||||
{
|
||||
xmlDocPtr doc; /* the resulting document tree */
|
||||
int ret;
|
||||
|
||||
if (file_name == NULL)
|
||||
{
|
||||
g_warning("No name for filters file");
|
||||
return RC_FAIL;
|
||||
}
|
||||
|
||||
doc = xmlReadFile (file_name, NULL, 0);
|
||||
if (doc == NULL)
|
||||
{
|
||||
ui_notification_dialog (GTK_MESSAGE_ERROR, FALSE, "open filters", "Failed to parse file \"%s\"", file_name);
|
||||
return RC_FAIL;
|
||||
}
|
||||
|
||||
ret = xml_parse_filters (doc, file_name);
|
||||
if (ret != RC_OK)
|
||||
{
|
||||
ui_notification_dialog (GTK_MESSAGE_WARNING, FALSE, "open filters", "Found no filter definitions in \"%s\"",
|
||||
file_name);
|
||||
return RC_FAIL;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void write_filter(FILE *filter_file, ui_filter_t *filter, gboolean save_colors)
|
||||
{
|
||||
int item;
|
||||
|
||||
fprintf (filter_file, " <%s>\n", filter->name);
|
||||
for (item = 0; item < filter->used; item++)
|
||||
{
|
||||
if (save_colors)
|
||||
{
|
||||
fprintf (filter_file,
|
||||
" <%s " ENABLED_NAME "=\"%d\" " FOREGROUND_NAME "=\"%s\" " BACKGROUND_NAME "=\"%s\"/>\n",
|
||||
filter->items[item].name, filter->items[item].enabled ? 1 : 0, filter->items[item].foreground,
|
||||
filter->items[item].background);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf (filter_file, " <%s " ENABLED_NAME "=\"%d\"/>\n", filter->items[item].name,
|
||||
filter->items[item].enabled ? 1 : 0);
|
||||
}
|
||||
}
|
||||
fprintf (filter_file, " </%s>\n", filter->name);
|
||||
}
|
||||
|
||||
int ui_filters_file_write(const char *file_name)
|
||||
{
|
||||
FILE *filter_file;
|
||||
|
||||
if (file_name == NULL)
|
||||
{
|
||||
g_warning("No name for filters file");
|
||||
return RC_FAIL;
|
||||
}
|
||||
|
||||
filter_file = fopen (file_name, "w");
|
||||
if (filter_file == NULL)
|
||||
{
|
||||
ui_notification_dialog (GTK_MESSAGE_ERROR, FALSE, "Failed to open file \"%s\": %s", file_name, g_strerror (errno));
|
||||
return RC_FAIL;
|
||||
}
|
||||
|
||||
fprintf (filter_file, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
||||
"<filters>\n");
|
||||
|
||||
write_filter (filter_file, &ui_filters.messages, TRUE);
|
||||
write_filter (filter_file, &ui_filters.origin_tasks, FALSE);
|
||||
write_filter (filter_file, &ui_filters.destination_tasks, FALSE);
|
||||
|
||||
fprintf (filter_file, "</filters>\n");
|
||||
|
||||
fclose (filter_file);
|
||||
return RC_OK;
|
||||
}
|
||||
|
||||
static void ui_create_filter_menu(GtkWidget **menu, ui_filter_t *filter)
|
||||
{
|
||||
if (*menu == NULL)
|
||||
{
|
||||
GtkWidget *menu_items;
|
||||
int item;
|
||||
gpointer data;
|
||||
|
||||
*menu = gtk_menu_new ();
|
||||
|
||||
/* Create the "NONE" menu-item */
|
||||
{
|
||||
/* Create a new menu-item with a name */
|
||||
menu_items = gtk_menu_item_new_with_label ("NONE");
|
||||
|
||||
/* Add it to the menu. */
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(*menu), menu_items);
|
||||
|
||||
g_debug("ui_create_filter_menu %lx", (long) menu_items);
|
||||
g_signal_connect(G_OBJECT(menu_items), "activate", G_CALLBACK(ui_callback_on_menu_none), *menu);
|
||||
|
||||
/* Show the widget */
|
||||
gtk_widget_show (menu_items);
|
||||
}
|
||||
|
||||
/* Create the "ALL" menu-item */
|
||||
{
|
||||
/* Create a new menu-item with a name */
|
||||
menu_items = gtk_menu_item_new_with_label ("ALL");
|
||||
|
||||
/* Add it to the menu. */
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(*menu), menu_items);
|
||||
|
||||
g_debug("ui_create_filter_menu %lx", (long) menu_items);
|
||||
g_signal_connect(G_OBJECT(menu_items), "activate", G_CALLBACK(ui_callback_on_menu_all), *menu);
|
||||
|
||||
/* Show the widget */
|
||||
gtk_widget_show (menu_items);
|
||||
}
|
||||
|
||||
/* Create separator */
|
||||
{
|
||||
menu_items = gtk_menu_item_new ();
|
||||
|
||||
/* Add it to the menu. */
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(*menu), menu_items);
|
||||
|
||||
/* Show the widget */
|
||||
gtk_widget_show (menu_items);
|
||||
}
|
||||
|
||||
/* Creates menu-items */
|
||||
for (item = 0; item < filter->used; item++)
|
||||
{
|
||||
/* Create a new menu-item with a name */
|
||||
menu_items = gtk_check_menu_item_new_with_label (filter->items[item].name);
|
||||
|
||||
/* Add it to the menu. */
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(*menu), menu_items);
|
||||
|
||||
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(menu_items), filter->items[item].enabled);
|
||||
|
||||
/* Connect function to be called when the menu item is selected */
|
||||
data = &filter->items[item];
|
||||
g_debug("ui_create_filter_menu %lx %lx", (long) menu_items, (long) data);
|
||||
g_signal_connect(G_OBJECT(menu_items), "activate", G_CALLBACK(ui_callback_on_menu_item_selected), data);
|
||||
/* Save the menu_item reference */
|
||||
filter->items[item].menu_item = menu_items;
|
||||
|
||||
/* Show the widget */
|
||||
gtk_widget_show (menu_items);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ui_create_filter_menus(void)
|
||||
{
|
||||
ui_create_filter_menu (&ui_main_data.menu_filter_messages, &ui_filters.messages);
|
||||
ui_create_filter_menu (&ui_main_data.menu_filter_origin_tasks, &ui_filters.origin_tasks);
|
||||
ui_create_filter_menu (&ui_main_data.menu_filter_destination_tasks, &ui_filters.destination_tasks);
|
||||
ui_create_filter_menu (&ui_main_data.menu_filter_instances, &ui_filters.instances);
|
||||
}
|
||||
|
||||
static void ui_destroy_filter_menu_item(GtkWidget *widget, gpointer data)
|
||||
{
|
||||
if (GTK_IS_MENU_ITEM(widget))
|
||||
{
|
||||
gtk_widget_destroy (widget);
|
||||
}
|
||||
}
|
||||
|
||||
static void ui_destroy_filter_menu_widget(GtkWidget **menu)
|
||||
{
|
||||
if (*menu != NULL)
|
||||
{
|
||||
gtk_container_foreach (GTK_CONTAINER(*menu), ui_destroy_filter_menu_item, NULL);
|
||||
|
||||
gtk_widget_destroy (*menu);
|
||||
*menu = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void ui_destroy_filter_menus(void)
|
||||
{
|
||||
ui_destroy_filter_menu_widget (&ui_main_data.menu_filter_messages);
|
||||
ui_destroy_filter_menu_widget (&ui_main_data.menu_filter_origin_tasks);
|
||||
ui_destroy_filter_menu_widget (&ui_main_data.menu_filter_destination_tasks);
|
||||
ui_destroy_filter_menu_widget (&ui_main_data.menu_filter_instances);
|
||||
}
|
||||
|
||||
void ui_destroy_filter_menu(ui_filter_e filter)
|
||||
{
|
||||
switch (filter)
|
||||
{
|
||||
case FILTER_MESSAGES:
|
||||
ui_destroy_filter_menu_widget (&ui_main_data.menu_filter_messages);
|
||||
break;
|
||||
|
||||
case FILTER_ORIGIN_TASKS:
|
||||
ui_destroy_filter_menu_widget (&ui_main_data.menu_filter_origin_tasks);
|
||||
break;
|
||||
|
||||
case FILTER_DESTINATION_TASKS:
|
||||
ui_destroy_filter_menu_widget (&ui_main_data.menu_filter_destination_tasks);
|
||||
break;
|
||||
|
||||
case FILTER_INSTANCES:
|
||||
ui_destroy_filter_menu_widget (&ui_main_data.menu_filter_instances);
|
||||
break;
|
||||
|
||||
default:
|
||||
g_warning("unknown filter type %d", filter);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void ui_show_filter_menu(GtkWidget **menu, ui_filter_t *filter)
|
||||
{
|
||||
ui_create_filter_menu (menu, filter);
|
||||
|
||||
gtk_menu_popup (GTK_MENU (*menu), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time ());
|
||||
}
|
||||
@@ -1,95 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifndef UI_FILTERS_H_
|
||||
#define UI_FILTERS_H_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "itti_types.h"
|
||||
|
||||
#define SIGNAL_NAME_LENGTH 100
|
||||
#define COLOR_SIZE 10
|
||||
|
||||
typedef enum
|
||||
{
|
||||
FILTER_UNKNOWN, FILTER_MESSAGES, FILTER_ORIGIN_TASKS, FILTER_DESTINATION_TASKS, FILTER_INSTANCES,
|
||||
} ui_filter_e;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
ENTRY_ENABLED_FALSE, ENTRY_ENABLED_TRUE, ENTRY_ENABLED_UNDEFINED,
|
||||
} ui_entry_enabled_e;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32_t id;
|
||||
char name[SIGNAL_NAME_LENGTH];
|
||||
uint8_t enabled;
|
||||
char foreground[COLOR_SIZE];
|
||||
char background[COLOR_SIZE];
|
||||
GtkWidget *menu_item;
|
||||
} ui_filter_item_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char *name;
|
||||
uint32_t allocated;
|
||||
uint32_t used;
|
||||
ui_filter_item_t *items;
|
||||
} ui_filter_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
gboolean filters_enabled;
|
||||
ui_filter_t messages;
|
||||
ui_filter_t origin_tasks;
|
||||
ui_filter_t destination_tasks;
|
||||
ui_filter_t instances;
|
||||
} ui_filters_t;
|
||||
|
||||
extern ui_filters_t ui_filters;
|
||||
|
||||
int ui_init_filters(int reset, int clear_ids);
|
||||
|
||||
gboolean ui_filters_enable(gboolean enabled);
|
||||
|
||||
int ui_filters_search_id(ui_filter_t *filter, uint32_t value);
|
||||
|
||||
void ui_filters_add(ui_filter_e filter, uint32_t value, const char *name, ui_entry_enabled_e entry_enabled,
|
||||
const char *foreground, const char *background);
|
||||
|
||||
gboolean ui_filters_message_enabled(const uint32_t message, const uint32_t origin_task, const uint32_t destination_task,
|
||||
const uint32_t instance);
|
||||
|
||||
int ui_filters_read(const char *file_name);
|
||||
|
||||
int ui_filters_file_write(const char *file_name);
|
||||
|
||||
void ui_create_filter_menus(void);
|
||||
|
||||
void ui_destroy_filter_menus(void);
|
||||
|
||||
void ui_destroy_filter_menu(ui_filter_e filter);
|
||||
|
||||
void ui_show_filter_menu(GtkWidget **menu, ui_filter_t *filter);
|
||||
|
||||
#endif /* UI_FILTERS_H_ */
|
||||
@@ -1,122 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <pthread.h>
|
||||
#include <stdint.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define G_LOG_DOMAIN ("UI_INTER")
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include "ui_interface.h"
|
||||
|
||||
#include "ui_tree_view.h"
|
||||
#include "ui_notifications.h"
|
||||
#include "ui_signal_dissect_view.h"
|
||||
|
||||
#include "socket.h"
|
||||
#include "xml_parse.h"
|
||||
|
||||
static
|
||||
gboolean ui_callback_on_pipe_notification(
|
||||
GIOChannel *source, GIOCondition condition, gpointer user_data)
|
||||
{
|
||||
pipe_input_t *pipe_input = (pipe_input_t *)user_data;
|
||||
|
||||
/* avoid reentrancy problems and stack overflow */
|
||||
g_source_remove(pipe_input->pipe_input_id);
|
||||
|
||||
g_debug("Received new data on pipe %d", pipe_input->pipe_input_id);
|
||||
|
||||
if (pipe_input->input_cb(pipe_input->source_fd, pipe_input->user_data)) {
|
||||
/* restore pipe handler */
|
||||
pipe_input->pipe_input_id = g_io_add_watch_full(pipe_input->pipe_channel,
|
||||
G_PRIORITY_HIGH,
|
||||
(GIOCondition)(G_IO_IN|G_IO_ERR|G_IO_HUP),
|
||||
ui_callback_on_pipe_notification,
|
||||
pipe_input,
|
||||
NULL);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
int ui_pipe_new(int pipe_fd[2], pipe_input_cb_t input_cb, gpointer user_data)
|
||||
{
|
||||
static pipe_input_t pipe_input;
|
||||
|
||||
g_assert(pipe_fd != NULL);
|
||||
|
||||
/* Create a pipe between GUI and a thread or a process */
|
||||
if (socketpair(AF_UNIX, SOCK_DGRAM, 0, pipe_fd) < 0) {
|
||||
g_warning("Failed to create socketpair %s", g_strerror(errno));
|
||||
return RC_FAIL;
|
||||
}
|
||||
|
||||
/* Source taken from wireshark SVN repository */
|
||||
|
||||
pipe_input.source_fd = pipe_fd[0];
|
||||
pipe_input.input_cb = input_cb;
|
||||
pipe_input.user_data = user_data;
|
||||
|
||||
pipe_input.pipe_channel = g_io_channel_unix_new(pipe_fd[0]);
|
||||
g_io_channel_set_encoding(pipe_input.pipe_channel, NULL, NULL);
|
||||
pipe_input.pipe_input_id = g_io_add_watch_full(pipe_input.pipe_channel,
|
||||
G_PRIORITY_HIGH,
|
||||
G_IO_IN | G_IO_ERR | G_IO_HUP,
|
||||
ui_callback_on_pipe_notification,
|
||||
&pipe_input,
|
||||
NULL);
|
||||
|
||||
return RC_OK;
|
||||
}
|
||||
|
||||
int ui_pipe_write_message(int pipe_fd, const uint16_t message_type,
|
||||
const void * const message, const uint16_t message_size)
|
||||
{
|
||||
int ret;
|
||||
pipe_input_header_t pipe_input_header;
|
||||
|
||||
pipe_input_header.message_size = message_size + sizeof(pipe_input_header);
|
||||
pipe_input_header.message_type = message_type;
|
||||
|
||||
if (message_size > 0 && message == NULL) {
|
||||
g_error("message size = %u but message is NULL", message_size);
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
ret = write(pipe_fd, &pipe_input_header, sizeof(pipe_input_header));
|
||||
if (ret < 0) {
|
||||
g_warning("Failed to write header to pipe: %s", g_strerror(errno));
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Only write the message to pipe if valid data to transmit */
|
||||
if (message_size > 0) {
|
||||
ret = write(pipe_fd, message, message_size);
|
||||
if (ret < 0) {
|
||||
g_warning("Failed to write message of size %u at 0x%p to pipe: %s",
|
||||
message_size, message, g_strerror(errno));
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1,78 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#ifndef UI_INTERFACE_H_
|
||||
#define UI_INTERFACE_H_
|
||||
|
||||
/*******************************************************************************
|
||||
* Functions used between dissectors and GUI to update signal dissection
|
||||
******************************************************************************/
|
||||
|
||||
typedef gboolean (*ui_set_signal_text_cb_t) (gpointer user_data, gchar *text, gint length);
|
||||
|
||||
/*******************************************************************************
|
||||
* Pipe interface between GUI thread and other thread
|
||||
******************************************************************************/
|
||||
|
||||
typedef gboolean (*pipe_input_cb_t) (gint source, gpointer user_data);
|
||||
|
||||
typedef struct {
|
||||
int source_fd;
|
||||
guint pipe_input_id;
|
||||
GIOChannel *pipe_channel;
|
||||
|
||||
pipe_input_cb_t input_cb;
|
||||
gpointer user_data;
|
||||
} pipe_input_t;
|
||||
|
||||
int ui_pipe_new(int pipe_fd[2], pipe_input_cb_t input_cb, gpointer user_data);
|
||||
|
||||
int ui_pipe_write_message(int pipe_fd, const uint16_t message_type,
|
||||
const void * const message, const uint16_t message_size);
|
||||
|
||||
typedef struct {
|
||||
uint16_t message_size;
|
||||
uint16_t message_type;
|
||||
} pipe_input_header_t;
|
||||
|
||||
enum ui_pipe_messages_id_e {
|
||||
/* Other thread -> GUI interface ids */
|
||||
UI_PIPE_CONNECTION_FAILED,
|
||||
UI_PIPE_CONNECTION_LOST,
|
||||
UI_PIPE_XML_DEFINITION,
|
||||
UI_PIPE_UPDATE_SIGNAL_LIST,
|
||||
|
||||
/* GUI -> other threads */
|
||||
UI_PIPE_DISCONNECT_EVT
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
char *xml_definition;
|
||||
size_t xml_definition_length;
|
||||
} pipe_xml_definition_message_t;
|
||||
|
||||
typedef struct {
|
||||
GList *signal_list;
|
||||
} pipe_new_signals_list_message_t;
|
||||
|
||||
#endif /* UI_INTERFACE_H_ */
|
||||
@@ -1,238 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define G_LOG_DOMAIN ("UI")
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include "logs.h"
|
||||
#include "rc.h"
|
||||
|
||||
#include "ui_callbacks.h"
|
||||
#include "ui_interface.h"
|
||||
#include "ui_main_screen.h"
|
||||
#include "ui_menu_bar.h"
|
||||
#include "ui_tree_view.h"
|
||||
#include "ui_notebook.h"
|
||||
#include "ui_notifications.h"
|
||||
#include "ui_filters.h"
|
||||
|
||||
ui_main_data_t ui_main_data;
|
||||
|
||||
static void ui_help(void)
|
||||
{
|
||||
printf ("Usage: itti_analyser [options]\n\n"
|
||||
"Options:\n"
|
||||
" -d DISSECT write DISSECT file with message types parse details\n"
|
||||
" -f FILTERS read filters from FILTERS file\n"
|
||||
" -h display this help and exit\n"
|
||||
" -i IP set ip address to IP\n"
|
||||
" -l LEVEL set log level to LEVEL in the range of 2 to 7\n"
|
||||
" -m MESSAGES read messages from MESSAGES file\n"
|
||||
" -p PORT set port to PORT\n");
|
||||
}
|
||||
|
||||
void ui_gtk_parse_arg(int argc, char *argv[])
|
||||
{
|
||||
char c;
|
||||
|
||||
/* Clear of ui_main_data not needed */
|
||||
// memset (&ui_main_data, 0, sizeof(ui_main_data_t));
|
||||
|
||||
/* Set some default initialization value for the IP address */
|
||||
ui_main_data.ip_entry_init = "127.0.0.1";
|
||||
ui_main_data.port_entry_init = "10006";
|
||||
|
||||
/* Set default log level to at least warning level messages */
|
||||
ui_main_data.log_flags = (G_LOG_LEVEL_MASK & (~(G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG)));
|
||||
|
||||
while ((c = getopt (argc, argv, "d:f:hi:l:m:p:")) != -1)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'd':
|
||||
ui_main_data.dissect_file_name = malloc (strlen (optarg) + 1);
|
||||
if (ui_main_data.dissect_file_name != NULL)
|
||||
{
|
||||
strcpy (ui_main_data.dissect_file_name, optarg);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'f':
|
||||
ui_main_data.filters_file_name = malloc (strlen (optarg) + 1);
|
||||
if (ui_main_data.filters_file_name != NULL)
|
||||
{
|
||||
strcpy (ui_main_data.filters_file_name, optarg);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
ui_help ();
|
||||
exit (0);
|
||||
break;
|
||||
|
||||
case 'i':
|
||||
ui_main_data.ip_entry_init = optarg;
|
||||
break;
|
||||
|
||||
case 'l':
|
||||
{
|
||||
GLogLevelFlags log_flag;
|
||||
|
||||
log_flag = 1 << atoi(optarg);
|
||||
if (log_flag < G_LOG_LEVEL_ERROR)
|
||||
{
|
||||
log_flag = G_LOG_LEVEL_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (log_flag > G_LOG_LEVEL_DEBUG)
|
||||
{
|
||||
log_flag = G_LOG_LEVEL_DEBUG;
|
||||
}
|
||||
}
|
||||
ui_main_data.log_flags = ((log_flag << 1) - 1) & G_LOG_LEVEL_MASK;
|
||||
break;
|
||||
}
|
||||
|
||||
case 'm':
|
||||
ui_main_data.messages_file_name = malloc (strlen (optarg) + 1);
|
||||
if (ui_main_data.messages_file_name != NULL)
|
||||
{
|
||||
strcpy (ui_main_data.messages_file_name, optarg);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'p':
|
||||
ui_main_data.port_entry_init = optarg;
|
||||
break;
|
||||
|
||||
default:
|
||||
ui_help ();
|
||||
exit (-1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int ui_idle_callback(gpointer data)
|
||||
{
|
||||
g_info("Entering idle state");
|
||||
|
||||
gtk_window_set_focus (GTK_WINDOW(ui_main_data.window), ui_main_data.messages_list);
|
||||
|
||||
/* Read filters file */
|
||||
if (ui_main_data.filters_file_name != NULL)
|
||||
{
|
||||
ui_filters_read(ui_main_data.filters_file_name);
|
||||
}
|
||||
|
||||
/* Read messages file */
|
||||
if (ui_main_data.messages_file_name != NULL)
|
||||
{
|
||||
ui_messages_read (ui_main_data.messages_file_name);
|
||||
}
|
||||
|
||||
/* One shot execution */
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void ui_set_title(const char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
char *name;
|
||||
char buffer[200];
|
||||
char title[220];
|
||||
|
||||
#if defined(PACKAGE_STRING)
|
||||
name = PACKAGE_NAME;
|
||||
#else
|
||||
name = "itti_analyzer";
|
||||
#endif
|
||||
|
||||
va_start(args, fmt);
|
||||
|
||||
vsnprintf (buffer, sizeof(buffer), fmt, args);
|
||||
snprintf (title, sizeof(title), "%s %s", name, buffer);
|
||||
va_end (args);
|
||||
|
||||
gtk_window_set_title (GTK_WINDOW(ui_main_data.window), title);
|
||||
}
|
||||
|
||||
void ui_main_window_destroy (void)
|
||||
{
|
||||
ui_callback_dialogbox_connect_destroy();
|
||||
ui_progressbar_window_destroy();
|
||||
gtk_main_quit();
|
||||
}
|
||||
|
||||
int ui_gtk_initialize(int argc, char *argv[])
|
||||
{
|
||||
GtkWidget *vbox;
|
||||
|
||||
/* Create the main window */
|
||||
ui_main_data.window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
||||
ui_init_filters (TRUE, FALSE);
|
||||
|
||||
// gtk_window_set_default_icon_from_file ("../analyzer.png", NULL);
|
||||
gtk_window_set_default_icon_name (GTK_STOCK_FIND);
|
||||
|
||||
gtk_window_set_position (GTK_WINDOW(ui_main_data.window), GTK_WIN_POS_CENTER);
|
||||
gtk_window_set_default_size (GTK_WINDOW(ui_main_data.window), 1024, 800);
|
||||
ui_set_title("");
|
||||
gtk_window_set_resizable (GTK_WINDOW(ui_main_data.window), TRUE);
|
||||
|
||||
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||
|
||||
CHECK_FCT(ui_menu_bar_create(vbox));
|
||||
CHECK_FCT(ui_toolbar_create(vbox));
|
||||
CHECK_FCT(ui_notebook_create(vbox));
|
||||
|
||||
gtk_container_add (GTK_CONTAINER(ui_main_data.window), vbox);
|
||||
|
||||
/* Assign the destroy event */
|
||||
g_signal_connect(ui_main_data.window, "destroy", ui_main_window_destroy, NULL);
|
||||
|
||||
/* Show the application window */
|
||||
gtk_widget_show_all (ui_main_data.window);
|
||||
|
||||
g_idle_add (ui_idle_callback, NULL);
|
||||
|
||||
return RC_OK;
|
||||
}
|
||||
|
||||
void ui_gtk_flush_events(void)
|
||||
{
|
||||
while (gtk_events_pending ())
|
||||
{
|
||||
gtk_main_iteration();
|
||||
}
|
||||
}
|
||||
@@ -1,96 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifndef UI_MAIN_SCREEN_H_
|
||||
#define UI_MAIN_SCREEN_H_
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include "ui_signal_dissect_view.h"
|
||||
|
||||
typedef struct {
|
||||
GtkWidget *window;
|
||||
GtkWidget *ip_entry;
|
||||
char *ip_entry_init;
|
||||
GtkWidget *port_entry;
|
||||
char *port_entry_init;
|
||||
|
||||
GtkWidget *progressbar_window;
|
||||
GtkWidget *progressbar;
|
||||
GtkWidget *messages_list;
|
||||
ui_text_view_t *text_view;
|
||||
|
||||
/* Buttons */
|
||||
GtkToolItem *filters_enabled;
|
||||
GtkToolItem *open_filters_file;
|
||||
GtkToolItem *refresh_filters_file;
|
||||
GtkToolItem *save_filters_file;
|
||||
|
||||
GtkToolItem *open_replay_file;
|
||||
GtkToolItem *refresh_replay_file;
|
||||
GtkToolItem *stop_loading;
|
||||
GtkToolItem *save_replay_file;
|
||||
GtkToolItem *save_replay_file_filtered;
|
||||
|
||||
GtkToolItem *auto_reconnect;
|
||||
GtkToolItem *connect;
|
||||
GtkToolItem *disconnect;
|
||||
|
||||
/* Signal list buttons */
|
||||
/* Clear signals button */
|
||||
GtkWidget *signals_go_to_entry;
|
||||
GtkToolItem *signals_go_to_last_button;
|
||||
GtkToolItem *signals_go_to_first_button;
|
||||
gboolean display_message_header;
|
||||
gboolean display_brace;
|
||||
|
||||
GtkTreeSelection *selection;
|
||||
gboolean follow_last;
|
||||
|
||||
/* Nb of messages received */
|
||||
guint nb_message_received;
|
||||
|
||||
GLogLevelFlags log_flags;
|
||||
char *dissect_file_name;
|
||||
char *filters_file_name;
|
||||
char *messages_file_name;
|
||||
|
||||
GtkWidget *menu_filter_messages;
|
||||
GtkWidget *menu_filter_origin_tasks;
|
||||
GtkWidget *menu_filter_destination_tasks;
|
||||
GtkWidget *menu_filter_instances;
|
||||
|
||||
int pipe_fd[2];
|
||||
} ui_main_data_t;
|
||||
|
||||
extern ui_main_data_t ui_main_data;
|
||||
|
||||
void ui_gtk_parse_arg(int argc, char *argv[]);
|
||||
|
||||
void ui_set_title(const char *fmt, ...);
|
||||
|
||||
void ui_main_window_destroy (void);
|
||||
|
||||
int ui_gtk_initialize(int argc, char *argv[]);
|
||||
|
||||
void ui_gtk_flush_events(void);
|
||||
|
||||
#endif /* UI_MAIN_SCREEN_H_ */
|
||||
@@ -1,503 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#define G_LOG_DOMAIN ("UI")
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
#include <gdk/gdkkeysyms.h>
|
||||
|
||||
#include "rc.h"
|
||||
#include "ui_main_screen.h"
|
||||
#include "ui_menu_bar.h"
|
||||
#include "ui_callbacks.h"
|
||||
#include "ui_notifications.h"
|
||||
|
||||
static const guint BUTTON_SPACE = 0;
|
||||
static const guint LABEL_SPACE = 5;
|
||||
static const guint SEPARATOR_SPACE = 5;
|
||||
|
||||
void ui_set_sensitive_move_buttons(gboolean enable)
|
||||
{
|
||||
gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.signals_go_to_last_button), enable);
|
||||
gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.signals_go_to_first_button), enable);
|
||||
}
|
||||
|
||||
void ui_set_sensitive_save_message_buttons(gboolean enable)
|
||||
{
|
||||
if (ui_main_data.nb_message_received == 0)
|
||||
{
|
||||
enable = FALSE;
|
||||
}
|
||||
gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.save_replay_file), enable);
|
||||
gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.save_replay_file_filtered), enable);
|
||||
}
|
||||
|
||||
int ui_menu_bar_create(GtkWidget *vbox)
|
||||
{
|
||||
GtkAccelGroup *accel_group;
|
||||
GtkWidget *menu_bar;
|
||||
|
||||
GtkWidget *system_menu;
|
||||
GtkWidget *system;
|
||||
GtkWidget *quit;
|
||||
|
||||
GtkWidget *filters_menu;
|
||||
GtkWidget *filters;
|
||||
GtkWidget *open_filters;
|
||||
GtkWidget *reload_filters;
|
||||
GtkWidget *save_filters;
|
||||
GtkWidget *enable_filters;
|
||||
|
||||
GtkWidget *messages_menu;
|
||||
GtkWidget *messages;
|
||||
GtkWidget *open_messages;
|
||||
GtkWidget *reload_messages;
|
||||
GtkWidget *stop_loading;
|
||||
GtkWidget *save_messages;
|
||||
GtkWidget *save_messages_filtered;
|
||||
GtkWidget *goto_first_messages;
|
||||
GtkWidget *goto_messages;
|
||||
GtkWidget *goto_last_messages;
|
||||
GtkWidget *display_message_header;
|
||||
GtkWidget *display_brace;
|
||||
|
||||
GtkWidget *connect_menu;
|
||||
GtkWidget *connect;
|
||||
GtkWidget *auto_reconnect;
|
||||
GtkWidget *connect_to;
|
||||
GtkWidget *disconnect;
|
||||
|
||||
GtkWidget *help_menu;
|
||||
GtkWidget *help;
|
||||
GtkWidget *about;
|
||||
|
||||
if (!vbox)
|
||||
return RC_BAD_PARAM;
|
||||
|
||||
accel_group = gtk_accel_group_new();
|
||||
gtk_window_add_accel_group(GTK_WINDOW(ui_main_data.window), accel_group);
|
||||
|
||||
menu_bar = gtk_menu_bar_new();
|
||||
|
||||
/* Create the System sub-menu */
|
||||
{
|
||||
system = gtk_menu_item_new_with_mnemonic ("_System");
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(menu_bar), system);
|
||||
|
||||
system_menu = gtk_menu_new ();
|
||||
gtk_menu_item_set_submenu (GTK_MENU_ITEM(system), system_menu);
|
||||
|
||||
/* Create the Filters menu items */
|
||||
{
|
||||
quit = gtk_menu_item_new_with_mnemonic ("_Quit");
|
||||
gtk_widget_add_accelerator (quit, "activate", accel_group, GDK_KEY_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(system_menu), quit);
|
||||
g_signal_connect(G_OBJECT(quit), "activate", ui_main_window_destroy, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/* Create the Filters sub-menu */
|
||||
{
|
||||
filters = gtk_menu_item_new_with_mnemonic ("_Filters");
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(menu_bar), filters);
|
||||
|
||||
filters_menu = gtk_menu_new ();
|
||||
gtk_menu_item_set_submenu (GTK_MENU_ITEM(filters), filters_menu);
|
||||
|
||||
/* Create the Filters menu items */
|
||||
{
|
||||
open_filters = gtk_menu_item_new_with_mnemonic ("_Open filters file");
|
||||
gtk_widget_add_accelerator (open_filters, "activate", accel_group, GDK_KEY_p, GDK_CONTROL_MASK,
|
||||
GTK_ACCEL_VISIBLE);
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), open_filters);
|
||||
g_signal_connect(G_OBJECT(open_filters), "activate", G_CALLBACK(ui_callback_on_open_filters), (gpointer) FALSE);
|
||||
|
||||
reload_filters = gtk_menu_item_new_with_mnemonic ("_Reload filters file");
|
||||
gtk_widget_add_accelerator (reload_filters, "activate", accel_group, GDK_KEY_d, GDK_CONTROL_MASK,
|
||||
GTK_ACCEL_VISIBLE);
|
||||
gtk_widget_add_accelerator (reload_filters, "activate", accel_group, GDK_KEY_F4, 0, GTK_ACCEL_VISIBLE);
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), reload_filters);
|
||||
g_signal_connect(G_OBJECT(reload_filters), "activate", G_CALLBACK(ui_callback_on_open_filters),
|
||||
(gpointer) TRUE);
|
||||
|
||||
save_filters = gtk_menu_item_new_with_mnemonic ("_Save filters file");
|
||||
gtk_widget_add_accelerator (save_filters, "activate", accel_group, GDK_KEY_v, GDK_CONTROL_MASK,
|
||||
GTK_ACCEL_VISIBLE);
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), save_filters);
|
||||
g_signal_connect(G_OBJECT(save_filters), "activate", G_CALLBACK(ui_callback_on_save_filters), NULL);
|
||||
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), gtk_menu_item_new ()); // Separator
|
||||
|
||||
enable_filters = gtk_menu_item_new_with_mnemonic ("_Enable filtering");
|
||||
gtk_widget_add_accelerator (enable_filters, "activate", accel_group, GDK_KEY_e, GDK_CONTROL_MASK,
|
||||
GTK_ACCEL_VISIBLE);
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), enable_filters);
|
||||
g_signal_connect(G_OBJECT(enable_filters), "activate", G_CALLBACK(ui_callback_on_enable_filters), NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/* Create the Messages sub-menu */
|
||||
{
|
||||
messages = gtk_menu_item_new_with_mnemonic ("_Messages");
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(menu_bar), messages);
|
||||
|
||||
messages_menu = gtk_menu_new ();
|
||||
gtk_menu_item_set_submenu (GTK_MENU_ITEM(messages), messages_menu);
|
||||
|
||||
/* Crate the Messages menu items */
|
||||
{
|
||||
open_messages = gtk_menu_item_new_with_mnemonic ("_Open messages file");
|
||||
gtk_widget_add_accelerator (open_messages, "activate", accel_group, GDK_KEY_o, GDK_CONTROL_MASK,
|
||||
GTK_ACCEL_VISIBLE);
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), open_messages);
|
||||
g_signal_connect(G_OBJECT(open_messages), "activate", G_CALLBACK(ui_callback_on_open_messages),
|
||||
(gpointer) FALSE);
|
||||
|
||||
reload_messages = gtk_menu_item_new_with_mnemonic ("_Reload messages file");
|
||||
gtk_widget_add_accelerator (reload_messages, "activate", accel_group, GDK_KEY_r, GDK_CONTROL_MASK,
|
||||
GTK_ACCEL_VISIBLE);
|
||||
gtk_widget_add_accelerator (reload_messages, "activate", accel_group, GDK_KEY_F5, 0, GTK_ACCEL_VISIBLE);
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), reload_messages);
|
||||
g_signal_connect(G_OBJECT(reload_messages), "activate", G_CALLBACK(ui_callback_on_open_messages),
|
||||
(gpointer) TRUE);
|
||||
|
||||
stop_loading = gtk_menu_item_new_with_mnemonic ("S_top loading messages file");
|
||||
gtk_widget_add_accelerator (stop_loading, "activate", accel_group, GDK_KEY_x, GDK_CONTROL_MASK,
|
||||
GTK_ACCEL_VISIBLE);
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), stop_loading);
|
||||
g_signal_connect(G_OBJECT(stop_loading), "activate", G_CALLBACK(ui_progressbar_window_destroy),
|
||||
NULL);
|
||||
|
||||
save_messages = gtk_menu_item_new_with_mnemonic ("S_ave messages file (all)");
|
||||
gtk_widget_add_accelerator (save_messages, "activate", accel_group, GDK_KEY_a, GDK_CONTROL_MASK,
|
||||
GTK_ACCEL_VISIBLE);
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), save_messages);
|
||||
g_signal_connect(G_OBJECT(save_messages), "activate", G_CALLBACK(ui_callback_on_save_messages),
|
||||
(gpointer) FALSE);
|
||||
|
||||
save_messages_filtered = gtk_menu_item_new_with_mnemonic ("_Save messages file (filtered)");
|
||||
gtk_widget_add_accelerator (save_messages_filtered, "activate", accel_group, GDK_KEY_s, GDK_CONTROL_MASK,
|
||||
GTK_ACCEL_VISIBLE);
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), save_messages_filtered);
|
||||
g_signal_connect(G_OBJECT(save_messages_filtered), "activate", G_CALLBACK(ui_callback_on_save_messages),
|
||||
(gpointer) TRUE);
|
||||
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), gtk_menu_item_new ()); // Separator
|
||||
|
||||
goto_first_messages = gtk_menu_item_new_with_mnemonic ("Go to _first message");
|
||||
gtk_widget_add_accelerator (goto_first_messages, "activate", accel_group, GDK_KEY_f, GDK_CONTROL_MASK,
|
||||
GTK_ACCEL_VISIBLE);
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), goto_first_messages);
|
||||
g_signal_connect(G_OBJECT(goto_first_messages), "activate", G_CALLBACK(ui_callback_signal_go_to_first),
|
||||
NULL);
|
||||
|
||||
goto_messages = gtk_menu_item_new_with_mnemonic ("_Go to message ...");
|
||||
gtk_widget_add_accelerator (goto_messages, "activate", accel_group, GDK_KEY_g, GDK_CONTROL_MASK,
|
||||
GTK_ACCEL_VISIBLE);
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), goto_messages);
|
||||
g_signal_connect(G_OBJECT(goto_messages), "activate", G_CALLBACK(ui_callback_signal_go_to), NULL);
|
||||
|
||||
goto_last_messages = gtk_menu_item_new_with_mnemonic ("Go to _last message");
|
||||
gtk_widget_add_accelerator (goto_last_messages, "activate", accel_group, GDK_KEY_l, GDK_CONTROL_MASK,
|
||||
GTK_ACCEL_VISIBLE);
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), goto_last_messages);
|
||||
g_signal_connect(G_OBJECT(goto_last_messages), "activate", G_CALLBACK(ui_callback_signal_go_to_last), (gpointer) TRUE);
|
||||
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), gtk_menu_item_new ()); // Separator
|
||||
|
||||
display_message_header = gtk_menu_item_new_with_mnemonic ("Display message _header");
|
||||
gtk_widget_add_accelerator (display_message_header, "activate", accel_group, GDK_KEY_h, GDK_CONTROL_MASK,
|
||||
GTK_ACCEL_VISIBLE);
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), display_message_header);
|
||||
g_signal_connect(G_OBJECT(display_message_header), "activate",
|
||||
G_CALLBACK(ui_callback_display_message_header), NULL);
|
||||
|
||||
display_brace = gtk_menu_item_new_with_mnemonic ("Display _brace");
|
||||
gtk_widget_add_accelerator (display_brace, "activate", accel_group, GDK_KEY_b, GDK_CONTROL_MASK,
|
||||
GTK_ACCEL_VISIBLE);
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), display_brace);
|
||||
g_signal_connect(G_OBJECT(display_brace), "activate", G_CALLBACK(ui_callback_display_brace), NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/* Create the Connect sub-menu */
|
||||
{
|
||||
connect = gtk_menu_item_new_with_mnemonic ("_Connect");
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(menu_bar), connect);
|
||||
|
||||
connect_menu = gtk_menu_new ();
|
||||
gtk_menu_item_set_submenu (GTK_MENU_ITEM(connect), connect_menu);
|
||||
|
||||
/* Create the Help menu item */
|
||||
{
|
||||
auto_reconnect = gtk_menu_item_new_with_mnemonic ("_Automatic reconnection");
|
||||
gtk_widget_add_accelerator (auto_reconnect, "activate", accel_group, GDK_KEY_t, GDK_CONTROL_MASK,
|
||||
GTK_ACCEL_VISIBLE);
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(connect_menu), auto_reconnect);
|
||||
g_signal_connect(G_OBJECT(auto_reconnect), "activate", G_CALLBACK(ui_callback_on_auto_reconnect), (gpointer) TRUE);
|
||||
|
||||
connect_to = gtk_menu_item_new_with_mnemonic ("_Connect");
|
||||
gtk_widget_add_accelerator (connect_to, "activate", accel_group, GDK_KEY_c, GDK_CONTROL_MASK,
|
||||
GTK_ACCEL_VISIBLE);
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(connect_menu), connect_to);
|
||||
g_signal_connect(G_OBJECT(connect_to), "activate", G_CALLBACK(ui_callback_on_connect), (gpointer) TRUE);
|
||||
|
||||
disconnect = gtk_menu_item_new_with_mnemonic ("_Disconnect");
|
||||
gtk_widget_add_accelerator (disconnect, "activate", accel_group, GDK_KEY_u, GDK_CONTROL_MASK,
|
||||
GTK_ACCEL_VISIBLE);
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(connect_menu), disconnect);
|
||||
g_signal_connect(G_OBJECT(disconnect), "activate", G_CALLBACK(ui_callback_on_disconnect), NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/* Create the Help sub-menu */
|
||||
{
|
||||
help = gtk_menu_item_new_with_mnemonic ("_Help");
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(menu_bar), help);
|
||||
|
||||
help_menu = gtk_menu_new ();
|
||||
gtk_menu_item_set_submenu (GTK_MENU_ITEM(help), help_menu);
|
||||
|
||||
/* Create the Help menu item */
|
||||
{
|
||||
about = gtk_menu_item_new_with_mnemonic ("_About");
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(help_menu), about);
|
||||
g_signal_connect(G_OBJECT(about), "activate", G_CALLBACK(ui_callback_on_about), NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/* Add the menubar to the vbox */
|
||||
gtk_box_pack_start(GTK_BOX(vbox), menu_bar, FALSE, FALSE, 3);
|
||||
|
||||
return RC_OK;
|
||||
}
|
||||
|
||||
int ui_toolbar_create(GtkWidget *vbox)
|
||||
{
|
||||
GtkWidget *hbox;
|
||||
GtkWidget *messages_label;
|
||||
GtkWidget *ip_label;
|
||||
GtkWidget *port_label;
|
||||
|
||||
if (!vbox)
|
||||
return RC_BAD_PARAM;
|
||||
|
||||
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
|
||||
|
||||
messages_label = gtk_label_new("Messages");
|
||||
|
||||
/* Button to Enable filtering */
|
||||
{
|
||||
ui_main_data.filters_enabled = gtk_toggle_tool_button_new();
|
||||
gtk_tool_button_set_label (GTK_TOOL_BUTTON(ui_main_data.filters_enabled), "Filters");
|
||||
g_signal_connect(G_OBJECT(ui_main_data.filters_enabled), "clicked",
|
||||
G_CALLBACK(ui_callback_on_filters_enabled), NULL);
|
||||
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.filters_enabled), TRUE);
|
||||
}
|
||||
|
||||
/* Button to open filters file */
|
||||
{
|
||||
ui_main_data.open_filters_file = gtk_tool_button_new_from_stock(GTK_STOCK_OPEN);
|
||||
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.open_filters_file), "Open filters file");
|
||||
|
||||
g_signal_connect(G_OBJECT(ui_main_data.open_filters_file), "clicked",
|
||||
G_CALLBACK(ui_callback_on_open_filters), (gpointer) FALSE);
|
||||
}
|
||||
|
||||
/* Button to refresh filters file */
|
||||
{
|
||||
ui_main_data.refresh_filters_file = gtk_tool_button_new_from_stock(GTK_STOCK_REFRESH);
|
||||
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.refresh_filters_file), "Reload filters file");
|
||||
|
||||
g_signal_connect(G_OBJECT(ui_main_data.refresh_filters_file), "clicked",
|
||||
G_CALLBACK(ui_callback_on_open_filters), (gpointer) TRUE);
|
||||
}
|
||||
|
||||
/* Button to save filters file */
|
||||
{
|
||||
ui_main_data.save_filters_file = gtk_tool_button_new_from_stock(GTK_STOCK_SAVE);
|
||||
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.save_filters_file), "Save filters file");
|
||||
|
||||
g_signal_connect(G_OBJECT(ui_main_data.save_filters_file), "clicked",
|
||||
G_CALLBACK(ui_callback_on_save_filters), NULL);
|
||||
}
|
||||
|
||||
/* Button to open messages file */
|
||||
{
|
||||
ui_main_data.open_replay_file = gtk_tool_button_new_from_stock(GTK_STOCK_OPEN);
|
||||
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.open_replay_file), "Open messages file");
|
||||
|
||||
g_signal_connect(G_OBJECT(ui_main_data.open_replay_file), "clicked",
|
||||
G_CALLBACK(ui_callback_on_open_messages), (gpointer) FALSE);
|
||||
}
|
||||
|
||||
/* Button to refresh messages file */
|
||||
{
|
||||
ui_main_data.refresh_replay_file = gtk_tool_button_new_from_stock(GTK_STOCK_REFRESH);
|
||||
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.refresh_replay_file), "Reload messages file");
|
||||
|
||||
g_signal_connect(G_OBJECT(ui_main_data.refresh_replay_file), "clicked",
|
||||
G_CALLBACK(ui_callback_on_open_messages), (gpointer) TRUE);
|
||||
}
|
||||
|
||||
/* Stop reading messages file */
|
||||
{
|
||||
ui_main_data.stop_loading = gtk_tool_button_new_from_stock(GTK_STOCK_STOP);
|
||||
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.stop_loading), "Stop loading messages file");
|
||||
|
||||
g_signal_connect(G_OBJECT(ui_main_data.stop_loading), "clicked",
|
||||
ui_progressbar_window_destroy, NULL);
|
||||
}
|
||||
|
||||
/* Button to save messages file */
|
||||
{
|
||||
ui_main_data.save_replay_file = gtk_tool_button_new_from_stock(GTK_STOCK_SAVE);
|
||||
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.save_replay_file), "Save messages file (all)");
|
||||
|
||||
g_signal_connect(G_OBJECT(ui_main_data.save_replay_file), "clicked",
|
||||
G_CALLBACK(ui_callback_on_save_messages), (gpointer) FALSE);
|
||||
}
|
||||
|
||||
/* Button to save messages file */
|
||||
{
|
||||
ui_main_data.save_replay_file_filtered = gtk_tool_button_new_from_stock(GTK_STOCK_SAVE_AS);
|
||||
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.save_replay_file_filtered), "Save messages file (filtered)");
|
||||
|
||||
g_signal_connect(G_OBJECT(ui_main_data.save_replay_file_filtered), "clicked",
|
||||
G_CALLBACK(ui_callback_on_save_messages), (gpointer) TRUE);
|
||||
}
|
||||
|
||||
/* Button to go to first signal in list */
|
||||
{
|
||||
ui_main_data.signals_go_to_first_button = gtk_tool_button_new_from_stock(GTK_STOCK_GOTO_FIRST);
|
||||
/* Set the tooltip text */
|
||||
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.signals_go_to_first_button), "Goto first signal");
|
||||
|
||||
gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.signals_go_to_first_button), FALSE);
|
||||
|
||||
g_signal_connect(G_OBJECT(ui_main_data.signals_go_to_first_button), "clicked",
|
||||
G_CALLBACK(ui_callback_signal_go_to_first), NULL);
|
||||
}
|
||||
|
||||
/* Entry to go to given signal number */
|
||||
{
|
||||
ui_main_data.signals_go_to_entry = gtk_entry_new ();
|
||||
gtk_entry_set_width_chars (GTK_ENTRY(ui_main_data.signals_go_to_entry), 10);
|
||||
// gtk_entry_set_input_purpose (GTK_ENTRY(ui_main_data.signals_go_to_entry), GTK_INPUT_PURPOSE_DIGITS);
|
||||
|
||||
g_signal_connect(G_OBJECT(ui_main_data.signals_go_to_entry), "activate",
|
||||
G_CALLBACK(ui_callback_signal_go_to_entry), NULL);
|
||||
}
|
||||
|
||||
/* Button to go to last signal in list */
|
||||
{
|
||||
ui_main_data.signals_go_to_last_button = gtk_toggle_tool_button_new_from_stock(GTK_STOCK_GOTO_LAST);
|
||||
/* Set the tooltip text */
|
||||
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.signals_go_to_last_button), "Goto last signal");
|
||||
|
||||
gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.signals_go_to_last_button), FALSE);
|
||||
|
||||
g_signal_connect(G_OBJECT(ui_main_data.signals_go_to_last_button), "clicked",
|
||||
G_CALLBACK(ui_callback_signal_go_to_last), (gpointer) FALSE);
|
||||
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.signals_go_to_last_button), TRUE);
|
||||
}
|
||||
|
||||
/* Button to automatically try to reconnect */
|
||||
{
|
||||
ui_main_data.auto_reconnect = gtk_toggle_tool_button_new();
|
||||
gtk_tool_button_set_label (GTK_TOOL_BUTTON(ui_main_data.auto_reconnect), "Auto");
|
||||
g_signal_connect(G_OBJECT(ui_main_data.auto_reconnect), "clicked",
|
||||
G_CALLBACK(ui_callback_on_auto_reconnect), (gpointer) FALSE);
|
||||
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.auto_reconnect), FALSE);
|
||||
}
|
||||
|
||||
/* Button to connect to remote */
|
||||
{
|
||||
ui_main_data.connect = gtk_tool_button_new_from_stock(GTK_STOCK_CONNECT);
|
||||
/* Set the tooltip text */
|
||||
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.connect), "Connect to remote host");
|
||||
|
||||
g_signal_connect(G_OBJECT(ui_main_data.connect), "clicked",
|
||||
G_CALLBACK(ui_callback_on_connect), (gpointer) TRUE);
|
||||
}
|
||||
|
||||
/* Button to disconnect from remote */
|
||||
{
|
||||
ui_main_data.disconnect = gtk_tool_button_new_from_stock(GTK_STOCK_DISCONNECT);
|
||||
/* Set the tooltip text */
|
||||
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.disconnect), "Disconnect from remote host");
|
||||
|
||||
/* Disabled at startup. Will be activated when a connection is established */
|
||||
gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.disconnect), FALSE);
|
||||
|
||||
g_signal_connect(G_OBJECT(ui_main_data.disconnect), "clicked",
|
||||
G_CALLBACK(ui_callback_on_disconnect), NULL);
|
||||
}
|
||||
|
||||
ip_label = gtk_label_new("ip:");
|
||||
port_label = gtk_label_new("port:");
|
||||
|
||||
ui_main_data.ip_entry = gtk_entry_new();
|
||||
/* Width of 15 characters for port number (ipv4 address) */
|
||||
gtk_entry_set_width_chars(GTK_ENTRY(ui_main_data.ip_entry), 15);
|
||||
gtk_entry_set_text(GTK_ENTRY(ui_main_data.ip_entry), ui_main_data.ip_entry_init);
|
||||
|
||||
ui_main_data.port_entry = gtk_entry_new();
|
||||
/* Width of 5 characters for port number (uint16_t) */
|
||||
gtk_entry_set_width_chars(GTK_ENTRY(ui_main_data.port_entry), 5);
|
||||
gtk_entry_set_text(GTK_ENTRY(ui_main_data.port_entry), ui_main_data.port_entry_init);
|
||||
|
||||
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.filters_enabled), FALSE, FALSE, LABEL_SPACE);
|
||||
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.open_filters_file), FALSE, FALSE, BUTTON_SPACE);
|
||||
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.refresh_filters_file), FALSE, FALSE, BUTTON_SPACE);
|
||||
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.save_filters_file), FALSE, FALSE, BUTTON_SPACE);
|
||||
|
||||
gtk_box_pack_start(GTK_BOX(hbox), gtk_separator_new(GTK_ORIENTATION_VERTICAL), FALSE, FALSE, SEPARATOR_SPACE);
|
||||
|
||||
gtk_box_pack_start(GTK_BOX(hbox), messages_label, FALSE, FALSE, LABEL_SPACE);
|
||||
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.open_replay_file), FALSE, FALSE, BUTTON_SPACE);
|
||||
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.refresh_replay_file), FALSE, FALSE, BUTTON_SPACE);
|
||||
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.stop_loading), FALSE, FALSE, BUTTON_SPACE);
|
||||
gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.stop_loading), FALSE);
|
||||
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.save_replay_file), FALSE, FALSE, BUTTON_SPACE);
|
||||
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.save_replay_file_filtered), FALSE, FALSE, BUTTON_SPACE);
|
||||
ui_set_sensitive_save_message_buttons(FALSE);
|
||||
|
||||
gtk_box_pack_start(GTK_BOX(hbox), gtk_separator_new(GTK_ORIENTATION_VERTICAL), FALSE, FALSE, SEPARATOR_SPACE);
|
||||
|
||||
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.signals_go_to_first_button), FALSE, FALSE, BUTTON_SPACE);
|
||||
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.signals_go_to_entry), FALSE, FALSE, BUTTON_SPACE);
|
||||
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.signals_go_to_last_button), FALSE, FALSE, BUTTON_SPACE);
|
||||
|
||||
gtk_box_pack_start(GTK_BOX(hbox), gtk_separator_new(GTK_ORIENTATION_VERTICAL), FALSE, FALSE, SEPARATOR_SPACE);
|
||||
|
||||
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.auto_reconnect), FALSE, FALSE, LABEL_SPACE);
|
||||
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.connect), FALSE, FALSE, BUTTON_SPACE);
|
||||
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.disconnect), FALSE, FALSE, BUTTON_SPACE);
|
||||
gtk_box_pack_start(GTK_BOX(hbox), ip_label, FALSE, FALSE, LABEL_SPACE);
|
||||
gtk_box_pack_start(GTK_BOX(hbox), ui_main_data.ip_entry, FALSE, FALSE, BUTTON_SPACE);
|
||||
gtk_box_pack_start(GTK_BOX(hbox), port_label, FALSE, FALSE, LABEL_SPACE);
|
||||
gtk_box_pack_start(GTK_BOX(hbox), ui_main_data.port_entry, FALSE, FALSE, BUTTON_SPACE);
|
||||
|
||||
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
|
||||
|
||||
return RC_OK;
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifndef UI_MENU_BAR_H_
|
||||
#define UI_MENU_BAR_H_
|
||||
|
||||
void ui_set_sensitive_move_buttons(gboolean enable);
|
||||
|
||||
void ui_set_sensitive_save_message_buttons(gboolean enable);
|
||||
|
||||
int ui_menu_bar_create(GtkWidget *vbox);
|
||||
|
||||
int ui_toolbar_create(GtkWidget *vbox);
|
||||
|
||||
#endif /* UI_MENU_BAR_H_ */
|
||||
@@ -1,88 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#define G_LOG_DOMAIN ("UI")
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include "rc.h"
|
||||
|
||||
#include "ui_notebook.h"
|
||||
#include "ui_tree_view.h"
|
||||
#include "ui_signal_dissect_view.h"
|
||||
|
||||
static ui_text_view_t *terminal_view;
|
||||
|
||||
void ui_notebook_terminal_clear(void)
|
||||
{
|
||||
ui_signal_dissect_clear_view(terminal_view);
|
||||
}
|
||||
|
||||
void ui_notebook_terminal_append_data(gchar *text, gint length)
|
||||
{
|
||||
ui_signal_set_text(terminal_view, text, length);
|
||||
}
|
||||
|
||||
int ui_notebook_create(GtkWidget *vbox)
|
||||
{
|
||||
GtkWidget *notebook;
|
||||
GtkWidget *vbox_notebook, *vbox_terminal;
|
||||
|
||||
if (!vbox)
|
||||
return RC_BAD_PARAM;
|
||||
|
||||
notebook = gtk_notebook_new();
|
||||
|
||||
vbox_notebook = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
|
||||
ui_tree_view_create(NULL, vbox_notebook);
|
||||
|
||||
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox_notebook, NULL);
|
||||
gtk_notebook_set_tab_label_text (GTK_NOTEBOOK(notebook), vbox_notebook, "Messages list");
|
||||
|
||||
#if defined (FILTERS_TAB)
|
||||
vbox_notebook = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
|
||||
|
||||
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox_notebook, NULL);
|
||||
gtk_notebook_set_tab_label_text (GTK_NOTEBOOK(notebook), vbox_notebook, "Filters");
|
||||
#endif
|
||||
|
||||
vbox_notebook = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
|
||||
|
||||
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox_notebook, NULL);
|
||||
gtk_notebook_set_tab_label_text (GTK_NOTEBOOK(notebook), vbox_notebook, "Terminal");
|
||||
|
||||
vbox_terminal = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
|
||||
|
||||
terminal_view = ui_signal_dissect_new(vbox_terminal);
|
||||
|
||||
gtk_box_pack_start (GTK_BOX(vbox_notebook), vbox_terminal, TRUE, TRUE, 5);
|
||||
|
||||
/* Add the notebook to the vbox of the main window */
|
||||
gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
|
||||
|
||||
return RC_OK;
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifndef UI_NOTEBOOK_H_
|
||||
#define UI_NOTEBOOK_H_
|
||||
|
||||
void ui_notebook_terminal_clear(void);
|
||||
|
||||
int ui_notebook_create(GtkWidget *vbox);
|
||||
|
||||
void ui_notebook_terminal_append_data(gchar *text, gint length);
|
||||
|
||||
#endif /* UI_NOTEBOOK_H_ */
|
||||
@@ -1,83 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#define G_LOG_DOMAIN ("UI")
|
||||
|
||||
#include "rc.h"
|
||||
|
||||
#include "ui_notif_dlg.h"
|
||||
#include "ui_main_screen.h"
|
||||
|
||||
static const char * const gtk_response_strings[] =
|
||||
{"GTK_RESPONSE_NONE", "GTK_RESPONSE_REJECT", "GTK_RESPONSE_ACCEPT", "GTK_RESPONSE_DELETE_EVENT", "GTK_RESPONSE_OK",
|
||||
"GTK_RESPONSE_CANCEL", "GTK_RESPONSE_CLOSE", "GTK_RESPONSE_YES", "GTK_RESPONSE_NO", "GTK_RESPONSE_APPLY", "GTK_RESPONSE_HELP"};
|
||||
|
||||
static const char * const title_type_strings[] =
|
||||
{"Info", "Warning", "Question", "Error", "Other"};
|
||||
|
||||
const char * gtk_get_respose_string (gint response)
|
||||
{
|
||||
gint response_index = - response - 1;
|
||||
|
||||
if ((0 <= response_index) && (response_index < (sizeof (gtk_response_strings) / sizeof (gtk_response_strings[0]))))
|
||||
{
|
||||
return (gtk_response_strings[response_index]);
|
||||
}
|
||||
else
|
||||
{
|
||||
return ("Invalid response value!");
|
||||
}
|
||||
}
|
||||
int ui_notification_dialog(GtkMessageType type, gboolean cancel, const char *title, const char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
GtkWidget *dialogbox;
|
||||
char buffer[200];
|
||||
int result = RC_OK;
|
||||
|
||||
va_start(args, fmt);
|
||||
|
||||
vsnprintf (buffer, sizeof(buffer), fmt, args);
|
||||
|
||||
g_warning("%s", buffer);
|
||||
|
||||
dialogbox = gtk_message_dialog_new (GTK_WINDOW(ui_main_data.window), GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, type,
|
||||
cancel ? GTK_BUTTONS_OK_CANCEL : GTK_BUTTONS_OK, "%s",
|
||||
buffer);
|
||||
/* Set the window at center of main window */
|
||||
gtk_window_set_position (GTK_WINDOW(dialogbox), GTK_WIN_POS_CENTER_ON_PARENT);
|
||||
|
||||
gtk_dialog_set_default_response (GTK_DIALOG(dialogbox), GTK_RESPONSE_OK);
|
||||
|
||||
snprintf (buffer, sizeof(buffer), "%s: %s", title_type_strings[type], title);
|
||||
gtk_window_set_title (GTK_WINDOW(dialogbox), buffer);
|
||||
|
||||
if (gtk_dialog_run (GTK_DIALOG (dialogbox)) == GTK_RESPONSE_CANCEL)
|
||||
{
|
||||
result = RC_FAIL;
|
||||
}
|
||||
|
||||
gtk_widget_destroy (dialogbox);
|
||||
|
||||
va_end(args);
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#ifndef UI_NOTIF_DLG_H_
|
||||
#define UI_NOTIF_DLG_H_
|
||||
|
||||
const char *gtk_get_respose_string (gint response);
|
||||
|
||||
extern int ui_notification_dialog(GtkMessageType type, gboolean cancel, const char *title, const char *fmt, ...);
|
||||
|
||||
#endif /* UI_NOTIF_DLG_H_ */
|
||||
@@ -1,636 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#define G_LOG_DOMAIN ("UI")
|
||||
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include "logs.h"
|
||||
#include "itti_types.h"
|
||||
#include "rc.h"
|
||||
|
||||
#include "ui_interface.h"
|
||||
#include "ui_main_screen.h"
|
||||
#include "ui_menu_bar.h"
|
||||
#include "ui_notifications.h"
|
||||
#include "ui_notif_dlg.h"
|
||||
#include "ui_callbacks.h"
|
||||
#include "ui_filters.h"
|
||||
#include "ui_tree_view.h"
|
||||
|
||||
#include "locate_root.h"
|
||||
#include "xml_parse.h"
|
||||
#include "socket.h"
|
||||
|
||||
static const itti_message_types_t itti_dump_xml_definition_end = ITTI_DUMP_XML_DEFINITION_END;
|
||||
static const itti_message_types_t itti_dump_message_type_end = ITTI_DUMP_MESSAGE_TYPE_END;
|
||||
|
||||
static FILE *messages_file;
|
||||
static uint32_t message_number;
|
||||
static gboolean ui_abort;
|
||||
|
||||
int ui_disable_connect_button(void)
|
||||
{
|
||||
/* Disable Connect button and enable disconnect button */
|
||||
gtk_widget_set_sensitive (GTK_WIDGET (ui_main_data.connect), FALSE);
|
||||
gtk_widget_set_sensitive (GTK_WIDGET (ui_main_data.disconnect), TRUE);
|
||||
socket_abort_connection = FALSE;
|
||||
|
||||
return RC_OK;
|
||||
}
|
||||
|
||||
int ui_enable_connect_button(void)
|
||||
{
|
||||
/* Disable Disconnect button and enable connect button */
|
||||
gtk_widget_set_sensitive (GTK_WIDGET (ui_main_data.connect), TRUE);
|
||||
gtk_widget_set_sensitive (GTK_WIDGET (ui_main_data.disconnect), FALSE);
|
||||
socket_abort_connection = TRUE;
|
||||
ui_set_sensitive_save_message_buttons (TRUE);
|
||||
ui_set_title ("");
|
||||
|
||||
return RC_OK;
|
||||
}
|
||||
|
||||
static void ui_change_cursor(gboolean busy)
|
||||
{
|
||||
static GdkWindow *window;
|
||||
|
||||
if (busy)
|
||||
{
|
||||
GdkDisplay *display;
|
||||
GdkCursor *cursor;
|
||||
// gint x, y;
|
||||
|
||||
cursor = gdk_cursor_new (GDK_WATCH);
|
||||
display = gdk_display_get_default ();
|
||||
window = gtk_widget_get_window (GTK_WIDGET(ui_main_data.window));
|
||||
// window = gdk_display_get_window_at_pointer(display, &x, &y);
|
||||
|
||||
gdk_window_set_cursor (window, cursor);
|
||||
gdk_display_sync (display);
|
||||
g_object_unref (cursor);
|
||||
// gtk_widget_set_sensitive (ui_main_data.window, FALSE);
|
||||
ui_gtk_flush_events ();
|
||||
}
|
||||
else
|
||||
{
|
||||
gdk_window_set_cursor (window, NULL);
|
||||
// gtk_widget_set_sensitive (ui_main_data.window, TRUE);
|
||||
ui_gtk_flush_events ();
|
||||
}
|
||||
}
|
||||
|
||||
static void gtk_filter_add(GtkWidget *file_chooser, const gchar *title, const gchar *pattern)
|
||||
{
|
||||
GtkFileFilter *file_filter = gtk_file_filter_new ();
|
||||
|
||||
gtk_file_filter_set_name (file_filter, title);
|
||||
gtk_file_filter_add_pattern (file_filter, pattern);
|
||||
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(file_chooser), file_filter);
|
||||
}
|
||||
|
||||
int ui_messages_read(char *file_name)
|
||||
{
|
||||
int result = RC_OK;
|
||||
int source;
|
||||
int read_data = 0;
|
||||
void *input_data = NULL;
|
||||
size_t input_data_length = 0;
|
||||
int read_messages = 0;
|
||||
|
||||
ui_change_cursor (TRUE);
|
||||
|
||||
source = open (file_name, O_RDONLY);
|
||||
if (source < 0)
|
||||
{
|
||||
ui_notification_dialog (GTK_MESSAGE_ERROR, FALSE, "open messages", "Failed to open file \"%s\": %s", file_name,
|
||||
g_strerror (errno));
|
||||
result = RC_FAIL;
|
||||
}
|
||||
else
|
||||
{
|
||||
itti_socket_header_t message_header;
|
||||
struct stat st;
|
||||
int size;
|
||||
double read_fraction = 0.f;
|
||||
|
||||
if (stat (file_name, &st) < 0)
|
||||
{
|
||||
ui_notification_dialog (GTK_MESSAGE_ERROR, FALSE, "get file length",
|
||||
"Failed to retrieve length for file \"%s\": %s", file_name, g_strerror (errno));
|
||||
result = RC_FAIL;
|
||||
}
|
||||
size = st.st_size;
|
||||
|
||||
ui_callback_signal_clear_list (NULL, NULL);
|
||||
|
||||
/* Initialize the progress bar */
|
||||
ui_abort = FALSE;
|
||||
ui_progress_bar_set_fraction (0);
|
||||
|
||||
do
|
||||
{
|
||||
read_data = read (source, &message_header, sizeof(itti_socket_header_t));
|
||||
|
||||
if (read_data == -1)
|
||||
{
|
||||
ui_notification_dialog (GTK_MESSAGE_ERROR, FALSE, "open messages", "Failed to read from file \"%s\": %s",
|
||||
file_name, g_strerror (errno));
|
||||
result = RC_FAIL;
|
||||
break;
|
||||
}
|
||||
|
||||
if (read_data == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if (read_data < sizeof(itti_socket_header_t))
|
||||
{
|
||||
if (ui_notification_dialog (GTK_MESSAGE_WARNING, TRUE, "open messages",
|
||||
"Failed to read a complete message header from file \"%s\": %s", file_name, g_strerror (errno)) == RC_FAIL)
|
||||
{
|
||||
read_data = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
read_fraction += (double) read_data / size;
|
||||
|
||||
input_data_length = message_header.message_size - sizeof(itti_socket_header_t);
|
||||
|
||||
g_debug("%x, %x, %zd", message_header.message_type, message_header.message_size, input_data_length);
|
||||
|
||||
/* Checking for non-header part */
|
||||
if (input_data_length > 0)
|
||||
{
|
||||
input_data = malloc (input_data_length);
|
||||
|
||||
read_data = read (source, input_data, input_data_length);
|
||||
if (read_data < input_data_length)
|
||||
{
|
||||
if (ui_notification_dialog (GTK_MESSAGE_WARNING, TRUE, "open messages",
|
||||
"Failed to read a complete message from file \"%s\": %s", file_name, g_strerror (errno)) == RC_FAIL)
|
||||
{
|
||||
read_data = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
read_fraction += (double) input_data_length / size;
|
||||
}
|
||||
|
||||
switch (message_header.message_type)
|
||||
{
|
||||
case ITTI_DUMP_XML_DEFINITION:
|
||||
ui_gtk_flush_events ();
|
||||
if (memcmp (&(((char *) input_data)[input_data_length - sizeof (itti_message_types_t)]),
|
||||
&itti_dump_xml_definition_end, sizeof (itti_message_types_t)) == 0)
|
||||
{
|
||||
result = xml_parse_buffer (input_data, input_data_length - sizeof (itti_message_types_t));
|
||||
if (result != RC_OK)
|
||||
{
|
||||
ui_notification_dialog (GTK_MESSAGE_ERROR, FALSE, "open messages",
|
||||
"Error in parsing XML definitions in file \"%s\": %s", file_name,
|
||||
rc_strings[-result]);
|
||||
read_data = 0;
|
||||
}
|
||||
ui_gtk_flush_events ();
|
||||
g_message("Parsed XML definition from file \"%s\"", file_name);
|
||||
}
|
||||
else
|
||||
{
|
||||
ui_notification_dialog (GTK_MESSAGE_ERROR, FALSE, "open messages",
|
||||
"Error in parsing XML definitions in file \"%s\", end mark is missing", file_name);
|
||||
}
|
||||
/* Data input buffer is kept in case user when to save the log file later */
|
||||
break;
|
||||
|
||||
case ITTI_DUMP_MESSAGE_TYPE:
|
||||
{
|
||||
itti_signal_header_t *itti_signal_header = input_data;
|
||||
buffer_t *buffer;
|
||||
|
||||
if (memcmp (&(((char *) input_data)[input_data_length - sizeof (itti_message_types_t)]),
|
||||
&itti_dump_message_type_end, sizeof (itti_message_types_t)) == 0)
|
||||
{
|
||||
/* Create the new buffer */
|
||||
if (buffer_new_from_data (&buffer, input_data + sizeof(itti_signal_header_t),
|
||||
input_data_length - sizeof(itti_signal_header_t) - sizeof(itti_message_types_t), 0) != RC_OK)
|
||||
{
|
||||
g_error("Failed to create new buffer");
|
||||
g_assert_not_reached ();
|
||||
}
|
||||
|
||||
sscanf (itti_signal_header->message_number_char, MESSAGE_NUMBER_CHAR_FORMAT, &buffer->message_number);
|
||||
|
||||
ui_signal_add_to_list (buffer, ((read_messages % 1000) == 0) ? (gpointer) 1 : NULL);
|
||||
|
||||
if ((read_messages % 100) == 0)
|
||||
{
|
||||
ui_progress_bar_set_fraction (read_fraction);
|
||||
ui_gtk_flush_events ();
|
||||
}
|
||||
|
||||
read_messages++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ui_notification_dialog (GTK_MESSAGE_WARNING, TRUE, "open messages",
|
||||
"Failed to read a message from file \"%s\", end mark is missing", file_name) == RC_FAIL)
|
||||
{
|
||||
read_data = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
free (input_data);
|
||||
break;
|
||||
}
|
||||
|
||||
case ITTI_STATISTIC_MESSAGE_TYPE:
|
||||
default:
|
||||
if (ui_notification_dialog (GTK_MESSAGE_WARNING, TRUE, "open messages",
|
||||
"Unknown (or not implemented) record type: %d in file \"%s\"",
|
||||
message_header.message_type, file_name) == RC_FAIL)
|
||||
{
|
||||
read_data = 0;
|
||||
}
|
||||
|
||||
free (input_data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while ((ui_abort == FALSE) && (read_data > 0));
|
||||
|
||||
if (read_messages > 0)
|
||||
{
|
||||
char *basename;
|
||||
|
||||
/* Enable buttons to move in the list of signals */
|
||||
ui_set_sensitive_move_buttons (TRUE);
|
||||
|
||||
if (ui_main_data.follow_last)
|
||||
{
|
||||
/* Advance to the last signal */
|
||||
ui_tree_view_select_row (ui_tree_view_get_filtered_number () - 1);
|
||||
}
|
||||
|
||||
basename = g_path_get_basename (file_name);
|
||||
ui_set_title ("\"%s\"", basename);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = RC_FAIL;
|
||||
}
|
||||
|
||||
ui_progress_bar_terminate ();
|
||||
|
||||
g_message("Read %d messages (%d to display) from file \"%s\"\n", read_messages, ui_tree_view_get_filtered_number(), file_name);
|
||||
|
||||
close (source);
|
||||
}
|
||||
|
||||
ui_change_cursor (FALSE);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static void ui_message_write_callback(const gpointer buffer, const gchar *signal_name)
|
||||
{
|
||||
buffer_t *signal_buffer = (buffer_t *) buffer;
|
||||
itti_socket_header_t message_header;
|
||||
itti_signal_header_t itti_signal_header;
|
||||
uint32_t message_size;
|
||||
|
||||
message_size = signal_buffer->size_bytes;
|
||||
|
||||
message_header.message_size = sizeof(itti_socket_header_t) + sizeof(itti_signal_header) + message_size + sizeof(itti_message_types_t);
|
||||
message_header.message_type = ITTI_DUMP_MESSAGE_TYPE;
|
||||
|
||||
sprintf(itti_signal_header.message_number_char, MESSAGE_NUMBER_CHAR_FORMAT, message_number);
|
||||
itti_signal_header.message_number_char[sizeof(itti_signal_header.message_number_char) - 1] = '\n';
|
||||
message_number++;
|
||||
|
||||
fwrite (&message_header, sizeof(message_header), 1, messages_file);
|
||||
fwrite (&itti_signal_header, sizeof(itti_signal_header), 1, messages_file);
|
||||
fwrite (signal_buffer->data, message_size, 1, messages_file);
|
||||
fwrite (&itti_dump_message_type_end, sizeof(itti_message_types_t), 1, messages_file);
|
||||
}
|
||||
|
||||
static int ui_messages_file_write(char *file_name, gboolean filtered)
|
||||
{
|
||||
if (file_name == NULL)
|
||||
{
|
||||
g_warning("No name for log file");
|
||||
return RC_FAIL;
|
||||
}
|
||||
|
||||
messages_file = fopen (file_name, "w");
|
||||
if (messages_file == NULL)
|
||||
{
|
||||
ui_notification_dialog (GTK_MESSAGE_ERROR, FALSE, "Failed to open file \"%s\": %s", file_name, g_strerror (errno));
|
||||
return RC_FAIL;
|
||||
}
|
||||
|
||||
/* Write XML definitions */
|
||||
{
|
||||
itti_socket_header_t message_header;
|
||||
|
||||
message_header.message_size = sizeof(itti_socket_header_t) + xml_raw_data_size + sizeof(itti_message_types_t);
|
||||
message_header.message_type = ITTI_DUMP_XML_DEFINITION;
|
||||
|
||||
fwrite (&message_header, sizeof(message_header), 1, messages_file);
|
||||
fwrite (xml_raw_data, xml_raw_data_size, 1, messages_file);
|
||||
fwrite (&itti_dump_xml_definition_end, sizeof(itti_message_types_t), 1, messages_file);
|
||||
}
|
||||
|
||||
/* Write messages */
|
||||
{
|
||||
message_number = 1;
|
||||
ui_tree_view_foreach_message (ui_message_write_callback, filtered);
|
||||
}
|
||||
|
||||
fclose (messages_file);
|
||||
|
||||
return RC_OK;
|
||||
}
|
||||
|
||||
int ui_messages_open_file_chooser(void)
|
||||
{
|
||||
int result = RC_OK;
|
||||
|
||||
GtkWidget *filechooser;
|
||||
gboolean response_accept;
|
||||
char *filename;
|
||||
|
||||
filechooser = gtk_file_chooser_dialog_new ("Select file", GTK_WINDOW (ui_main_data.window),
|
||||
GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
|
||||
GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
|
||||
gtk_filter_add (filechooser, "Log files", "*.log");
|
||||
gtk_filter_add (filechooser, "All files", "*");
|
||||
|
||||
/* Process the response */
|
||||
response_accept = gtk_dialog_run (GTK_DIALOG (filechooser)) == GTK_RESPONSE_ACCEPT;
|
||||
|
||||
if (response_accept)
|
||||
{
|
||||
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filechooser));
|
||||
}
|
||||
gtk_widget_destroy (filechooser);
|
||||
if (response_accept)
|
||||
{
|
||||
ui_set_sensitive_save_message_buttons (FALSE);
|
||||
|
||||
result = ui_messages_read (filename);
|
||||
if (result == RC_OK)
|
||||
{
|
||||
/* Update messages file name for future use */
|
||||
if (ui_main_data.messages_file_name != NULL)
|
||||
{
|
||||
g_free (ui_main_data.messages_file_name);
|
||||
}
|
||||
ui_main_data.messages_file_name = filename;
|
||||
|
||||
ui_set_sensitive_save_message_buttons (TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_free (filename);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
int ui_messages_save_file_chooser(gboolean filtered)
|
||||
{
|
||||
int result = RC_OK;
|
||||
GtkWidget *filechooser;
|
||||
|
||||
/* Check if there is something to save */
|
||||
if (xml_raw_data_size > 0)
|
||||
{
|
||||
static const char *title[] =
|
||||
{
|
||||
"Save file (all messages)",
|
||||
"Save file (filtered messages)",
|
||||
};
|
||||
|
||||
filechooser = gtk_file_chooser_dialog_new (title[filtered], GTK_WINDOW (ui_main_data.window),
|
||||
GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL,
|
||||
GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
|
||||
gtk_filter_add (filechooser, "Log files", "*.log");
|
||||
gtk_filter_add (filechooser, "All files", "*");
|
||||
|
||||
gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (filechooser), TRUE);
|
||||
|
||||
if (ui_main_data.messages_file_name != NULL)
|
||||
{
|
||||
gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (filechooser), ui_main_data.messages_file_name);
|
||||
}
|
||||
else
|
||||
{
|
||||
gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (filechooser), "messages.log");
|
||||
}
|
||||
|
||||
/* Process the response */
|
||||
if (gtk_dialog_run (GTK_DIALOG (filechooser)) == GTK_RESPONSE_ACCEPT)
|
||||
{
|
||||
char *filename;
|
||||
|
||||
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filechooser));
|
||||
result = ui_messages_file_write (filename, filtered);
|
||||
if (result == RC_OK)
|
||||
{
|
||||
/* Update filters file name for future use */
|
||||
if (ui_main_data.messages_file_name != NULL)
|
||||
{
|
||||
g_free (ui_main_data.messages_file_name);
|
||||
}
|
||||
ui_main_data.messages_file_name = filename;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_free (filename);
|
||||
}
|
||||
}
|
||||
gtk_widget_destroy (filechooser);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
int ui_filters_open_file_chooser(void)
|
||||
{
|
||||
int result = RC_OK;
|
||||
GtkWidget *filechooser;
|
||||
gboolean response_accept;
|
||||
char *filename;
|
||||
|
||||
filechooser = gtk_file_chooser_dialog_new ("Select file", GTK_WINDOW (ui_main_data.window),
|
||||
GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
|
||||
GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
|
||||
gtk_filter_add (filechooser, "Filters files", "*.xml");
|
||||
gtk_filter_add (filechooser, "All files", "*");
|
||||
|
||||
/* Process the response */
|
||||
response_accept = gtk_dialog_run (GTK_DIALOG (filechooser)) == GTK_RESPONSE_ACCEPT;
|
||||
|
||||
if (response_accept)
|
||||
{
|
||||
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filechooser));
|
||||
}
|
||||
gtk_widget_destroy (filechooser);
|
||||
if (response_accept)
|
||||
{
|
||||
result = ui_filters_read (filename);
|
||||
if (result == RC_OK)
|
||||
{
|
||||
/* Update filters file name for future use */
|
||||
if (ui_main_data.filters_file_name != NULL)
|
||||
{
|
||||
g_free (ui_main_data.filters_file_name);
|
||||
}
|
||||
ui_main_data.filters_file_name = filename;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_free (filename);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
int ui_filters_save_file_chooser(void)
|
||||
{
|
||||
int result = RC_OK;
|
||||
GtkWidget *filechooser;
|
||||
|
||||
filechooser = gtk_file_chooser_dialog_new ("Save file", GTK_WINDOW (ui_main_data.window),
|
||||
GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
||||
GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
|
||||
gtk_filter_add (filechooser, "Filters files", "*.xml");
|
||||
gtk_filter_add (filechooser, "All files", "*");
|
||||
|
||||
gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (filechooser), TRUE);
|
||||
|
||||
if (ui_main_data.filters_file_name != NULL)
|
||||
{
|
||||
gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (filechooser), ui_main_data.filters_file_name);
|
||||
}
|
||||
else
|
||||
{
|
||||
gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (filechooser), "filters.xml");
|
||||
}
|
||||
|
||||
/* Process the response */
|
||||
if (gtk_dialog_run (GTK_DIALOG (filechooser)) == GTK_RESPONSE_ACCEPT)
|
||||
{
|
||||
char *filename;
|
||||
|
||||
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filechooser));
|
||||
result = ui_filters_file_write (filename);
|
||||
if (result == RC_OK)
|
||||
{
|
||||
/* Update filters file name for future use */
|
||||
if (ui_main_data.filters_file_name != NULL)
|
||||
{
|
||||
g_free (ui_main_data.filters_file_name);
|
||||
}
|
||||
ui_main_data.filters_file_name = filename;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_free (filename);
|
||||
}
|
||||
}
|
||||
gtk_widget_destroy (filechooser);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void ui_progressbar_window_destroy (void)
|
||||
{
|
||||
ui_abort = TRUE;
|
||||
ui_progress_bar_terminate();
|
||||
}
|
||||
|
||||
int ui_progress_bar_set_fraction(double fraction)
|
||||
{
|
||||
if (ui_abort == FALSE)
|
||||
{
|
||||
/* If not exist instantiate */
|
||||
if (!ui_main_data.progressbar && !ui_main_data.progressbar_window)
|
||||
{
|
||||
ui_main_data.progressbar_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
||||
/* Keep progress bar window on top of main window */
|
||||
gtk_window_set_transient_for (GTK_WINDOW(ui_main_data.progressbar_window), GTK_WINDOW(ui_main_data.window));
|
||||
|
||||
/* Set the window at center of main window */
|
||||
gtk_window_set_position (GTK_WINDOW(ui_main_data.progressbar_window), GTK_WIN_POS_CENTER_ON_PARENT);
|
||||
gtk_window_set_title (GTK_WINDOW(ui_main_data.progressbar_window), "Processing");
|
||||
|
||||
gtk_container_set_border_width (GTK_CONTAINER (ui_main_data.progressbar_window), 10);
|
||||
|
||||
ui_main_data.progressbar = gtk_progress_bar_new ();
|
||||
|
||||
gtk_container_add (GTK_CONTAINER (ui_main_data.progressbar_window), ui_main_data.progressbar);
|
||||
|
||||
/* Assign the destroy event */
|
||||
g_signal_connect(ui_main_data.progressbar_window, "destroy", ui_progressbar_window_destroy, NULL);
|
||||
|
||||
gtk_widget_show_all (ui_main_data.progressbar_window);
|
||||
|
||||
gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.stop_loading), TRUE);
|
||||
}
|
||||
|
||||
gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(ui_main_data.progressbar), fraction);
|
||||
|
||||
// ui_gtk_flush_events();
|
||||
}
|
||||
|
||||
return RC_OK;
|
||||
}
|
||||
|
||||
int ui_progress_bar_terminate(void)
|
||||
{
|
||||
if (ui_main_data.progressbar)
|
||||
{
|
||||
gtk_widget_destroy (ui_main_data.progressbar);
|
||||
ui_main_data.progressbar = NULL;
|
||||
}
|
||||
if (ui_main_data.progressbar_window)
|
||||
{
|
||||
gtk_widget_destroy (ui_main_data.progressbar_window);
|
||||
ui_main_data.progressbar_window = NULL;
|
||||
}
|
||||
gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.stop_loading), FALSE);
|
||||
|
||||
return RC_OK;
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifndef UI_NOTIFICATIONS_H_
|
||||
#define UI_NOTIFICATIONS_H_
|
||||
|
||||
typedef void (*message_write_callback_t) (const gpointer buffer, const gchar *signal_name);
|
||||
|
||||
int ui_disable_connect_button(void);
|
||||
|
||||
int ui_enable_connect_button(void);
|
||||
|
||||
int ui_messages_read(char *filename);
|
||||
|
||||
int ui_messages_open_file_chooser(void);
|
||||
|
||||
int ui_messages_save_file_chooser(gboolean filtered);
|
||||
|
||||
int ui_filters_open_file_chooser(void);
|
||||
|
||||
int ui_filters_save_file_chooser(void);
|
||||
|
||||
void ui_progressbar_window_destroy(void);
|
||||
|
||||
int ui_progress_bar_set_fraction(double fraction);
|
||||
|
||||
int ui_progress_bar_terminate(void);
|
||||
|
||||
#endif /* UI_NOTIFICATIONS_H_ */
|
||||
@@ -1,117 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#define G_LOG_DOMAIN ("UI")
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include "rc.h"
|
||||
|
||||
#include "ui_main_screen.h"
|
||||
#include "ui_menu_bar.h"
|
||||
#include "ui_signal_dissect_view.h"
|
||||
|
||||
ui_text_view_t *ui_signal_dissect_new(GtkWidget *hbox)
|
||||
{
|
||||
GtkWidget *scrolled_window;
|
||||
ui_text_view_t *new_text_view;
|
||||
|
||||
new_text_view = malloc(sizeof(ui_text_view_t));
|
||||
|
||||
new_text_view->text_view = gtk_text_view_new();
|
||||
scrolled_window = gtk_scrolled_window_new(NULL, NULL);
|
||||
|
||||
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
|
||||
GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
|
||||
|
||||
/* Change the font of the widget */
|
||||
new_text_view->text_view_font = pango_font_description_new();
|
||||
|
||||
g_debug("Default family is: %s\n", pango_font_description_get_family(new_text_view->text_view_font));
|
||||
|
||||
pango_font_description_set_family(new_text_view->text_view_font, "Monospace");
|
||||
pango_font_description_set_absolute_size(new_text_view->text_view_font, 10 * PANGO_SCALE);
|
||||
|
||||
g_debug("Font family has been set to: %s\n", pango_font_description_get_family(new_text_view->text_view_font));
|
||||
|
||||
gtk_widget_override_font(new_text_view->text_view, new_text_view->text_view_font);
|
||||
|
||||
/* Disable editable attribute */
|
||||
gtk_text_view_set_editable(GTK_TEXT_VIEW(new_text_view->text_view), FALSE);
|
||||
|
||||
gtk_container_add(GTK_CONTAINER(scrolled_window), new_text_view->text_view);
|
||||
|
||||
gtk_paned_pack2 (GTK_PANED (hbox), scrolled_window, TRUE, FALSE);
|
||||
|
||||
return new_text_view;
|
||||
}
|
||||
|
||||
int ui_signal_dissect_clear_view(ui_text_view_t *text_view)
|
||||
{
|
||||
GtkTextBuffer *text_buffer;
|
||||
|
||||
g_assert(text_view != NULL);
|
||||
|
||||
if (text_view->text_view != NULL)
|
||||
{
|
||||
/* Create an empty text buffer */
|
||||
text_buffer = gtk_text_buffer_new(NULL);
|
||||
gtk_text_buffer_set_text(text_buffer, "", 0);
|
||||
|
||||
gtk_text_view_set_buffer(GTK_TEXT_VIEW(text_view->text_view), text_buffer);
|
||||
}
|
||||
|
||||
return RC_OK;
|
||||
}
|
||||
|
||||
gboolean ui_signal_set_text(gpointer user_data, gchar *text, gint length)
|
||||
{
|
||||
GtkTextBuffer *text_buffer;
|
||||
ui_text_view_t *text_view;
|
||||
|
||||
if (length < 0)
|
||||
return FALSE;
|
||||
|
||||
text_view = (ui_text_view_t *)user_data;
|
||||
|
||||
g_assert(text != NULL);
|
||||
g_assert(text_view != NULL);
|
||||
g_assert(text_view->text_view != NULL);
|
||||
|
||||
g_assert(GTK_IS_TEXT_VIEW(GTK_TEXT_VIEW(text_view->text_view)));
|
||||
|
||||
text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view->text_view));
|
||||
|
||||
if (text_buffer) {
|
||||
/* We already have a text buffer, use it */
|
||||
gtk_text_buffer_insert_at_cursor(text_buffer, text, length);
|
||||
} else {
|
||||
/* No buffer currently in use, create a new one */
|
||||
text_buffer = gtk_text_buffer_new(NULL);
|
||||
gtk_text_buffer_set_text(text_buffer, text, length);
|
||||
gtk_text_view_set_buffer(GTK_TEXT_VIEW(text_view->text_view),
|
||||
text_buffer);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifndef UI_SIGNAL_DISSECT_VIEW_H_
|
||||
#define UI_SIGNAL_DISSECT_VIEW_H_
|
||||
|
||||
typedef struct {
|
||||
GtkWidget *text_view;
|
||||
PangoFontDescription *text_view_font;
|
||||
} ui_text_view_t;
|
||||
|
||||
ui_text_view_t *ui_signal_dissect_new(GtkWidget *hbox);
|
||||
|
||||
int ui_signal_dissect_clear_view(ui_text_view_t *text_view);
|
||||
|
||||
gboolean ui_signal_set_text(gpointer user_data, gchar *text, gint length);
|
||||
|
||||
#endif /*UI_SIGNAL_DISSECT_VIEW_H_ */
|
||||
@@ -1,610 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#define G_LOG_DOMAIN ("UI_TREE")
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include "logs.h"
|
||||
#include "rc.h"
|
||||
|
||||
#include "buffers.h"
|
||||
|
||||
#include "ui_main_screen.h"
|
||||
#include "ui_tree_view.h"
|
||||
#include "ui_callbacks.h"
|
||||
#include "ui_filters.h"
|
||||
|
||||
#include "ui_signal_dissect_view.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GtkListStore *store;
|
||||
GtkTreeModelFilter *filtered;
|
||||
uint32_t filtered_last_msg;
|
||||
uint32_t filtered_msg_number;
|
||||
uint32_t instance_number;
|
||||
} ui_store_t;
|
||||
|
||||
static ui_store_t ui_store;
|
||||
|
||||
GtkWidget *ui_tree_view_menu;
|
||||
ui_tree_view_menu_enable_t ui_tree_view_menu_enable[NUM_MENU_TYPE];
|
||||
|
||||
GdkEventButton *ui_tree_view_last_event;
|
||||
|
||||
static gboolean ui_tree_filter_messages(GtkTreeModel *model, GtkTreeIter *iter, ui_store_t *store)
|
||||
{
|
||||
uint32_t msg_number;
|
||||
uint32_t message_id;
|
||||
uint32_t origin_task_id;
|
||||
uint32_t destination_task_id;
|
||||
uint32_t instance;
|
||||
|
||||
gboolean enabled = TRUE;
|
||||
|
||||
if (ui_filters.filters_enabled)
|
||||
{
|
||||
gtk_tree_model_get (model, iter, COL_MSG_NUM, &msg_number, COL_MESSAGE_ID, &message_id, COL_FROM_TASK_ID,
|
||||
&origin_task_id, COL_TO_TASK_ID, &destination_task_id, COL_INSTANCE_ID, &instance, -1);
|
||||
if (msg_number != 0)
|
||||
{
|
||||
enabled = ui_filters_message_enabled (message_id, origin_task_id, destination_task_id, instance);
|
||||
|
||||
if ((enabled) && (store->filtered_last_msg < msg_number))
|
||||
{
|
||||
store->filtered_last_msg = msg_number;
|
||||
store->filtered_msg_number++;
|
||||
}
|
||||
g_debug("ui_tree_filter_messages: %p %p %d m:%d o:%d d:%d i:%d %d %d", model, iter, msg_number, message_id, origin_task_id, destination_task_id, instance, enabled, store->filtered_msg_number);
|
||||
}
|
||||
}
|
||||
|
||||
return enabled;
|
||||
}
|
||||
|
||||
static gboolean onButtonPressed(GtkWidget *treeview, GdkEventButton *event, gpointer userdata)
|
||||
{
|
||||
g_info("onButtonPressed %p %p %p %d %d", treeview, event, userdata, event->type, event->button);
|
||||
ui_tree_view_last_event = event;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
static gboolean onButtonRelease(GtkWidget *treeview, GdkEventButton *event, gpointer userdata)
|
||||
{
|
||||
g_info("onButtonRelease %p %p %p %d %d", treeview, event, userdata, event->type, event->button);
|
||||
// last_event = event;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
*/
|
||||
|
||||
static void ui_tree_view_init_list(GtkWidget *list)
|
||||
{
|
||||
GtkCellRenderer *renderer_left;
|
||||
GtkCellRenderer *renderer_right;
|
||||
GtkTreeViewColumn *column;
|
||||
|
||||
renderer_left = gtk_cell_renderer_text_new ();
|
||||
gtk_cell_renderer_set_padding (renderer_left, 5, 0);
|
||||
|
||||
renderer_right = gtk_cell_renderer_text_new ();
|
||||
gtk_cell_renderer_set_alignment (renderer_right, 1, 0.5);
|
||||
gtk_cell_renderer_set_padding (renderer_right, 5, 0);
|
||||
|
||||
column = gtk_tree_view_column_new_with_attributes ("MN", renderer_right, "text", COL_MSG_NUM, "foreground",
|
||||
COL_FOREGROUND, "background", COL_BACKGROUND, NULL);
|
||||
gtk_tree_view_column_set_resizable (column, TRUE);
|
||||
gtk_tree_view_column_set_alignment (column, 0.5);
|
||||
gtk_tree_view_append_column (GTK_TREE_VIEW(list), column);
|
||||
|
||||
column = gtk_tree_view_column_new_with_attributes ("LTE Time", renderer_right, "text", COL_LTE_TIME, NULL);
|
||||
gtk_tree_view_column_set_resizable (column, TRUE);
|
||||
gtk_tree_view_column_set_alignment (column, 0.5);
|
||||
gtk_tree_view_append_column (GTK_TREE_VIEW(list), column);
|
||||
|
||||
column = gtk_tree_view_column_new_with_attributes ("Message", renderer_left, "text", COL_MESSAGE, "foreground",
|
||||
COL_FOREGROUND, "background", COL_BACKGROUND, "strikethrough",
|
||||
COL_STRIKETHROUGH, "style", COL_STYLE, "weight", COL_WEIGHT, "underline", COL_UNDERLINE, NULL);
|
||||
gtk_tree_view_column_set_resizable (column, TRUE);
|
||||
gtk_tree_view_column_set_alignment (column, 0.5);
|
||||
gtk_tree_view_append_column (GTK_TREE_VIEW(list), column);
|
||||
g_signal_connect(G_OBJECT(column), "clicked", G_CALLBACK(ui_callback_on_tree_column_header_click),
|
||||
(gpointer) COL_MESSAGE);
|
||||
|
||||
column = gtk_tree_view_column_new_with_attributes ("From", renderer_left, "text", COL_FROM_TASK, NULL);
|
||||
gtk_tree_view_column_set_alignment (column, 0.5);
|
||||
gtk_tree_view_column_set_resizable (column, TRUE);
|
||||
gtk_tree_view_append_column (GTK_TREE_VIEW(list), column);
|
||||
g_signal_connect(G_OBJECT(column), "clicked", G_CALLBACK(ui_callback_on_tree_column_header_click),
|
||||
(gpointer) COL_FROM_TASK);
|
||||
|
||||
column = gtk_tree_view_column_new_with_attributes ("To", renderer_left, "text", COL_TO_TASK, NULL);
|
||||
gtk_tree_view_column_set_alignment (column, 0.5);
|
||||
gtk_tree_view_column_set_resizable (column, TRUE);
|
||||
gtk_tree_view_append_column (GTK_TREE_VIEW(list), column);
|
||||
g_signal_connect(G_OBJECT(column), "clicked", G_CALLBACK(ui_callback_on_tree_column_header_click),
|
||||
(gpointer) COL_TO_TASK);
|
||||
|
||||
column = gtk_tree_view_column_new_with_attributes ("Ins", renderer_right, "text", COL_INSTANCE, NULL);
|
||||
gtk_tree_view_column_set_alignment (column, 0.5);
|
||||
gtk_tree_view_append_column (GTK_TREE_VIEW(list), column);
|
||||
g_signal_connect(G_OBJECT(column), "clicked", G_CALLBACK(ui_callback_on_tree_column_header_click),
|
||||
(gpointer) COL_INSTANCE);
|
||||
|
||||
ui_store.store = gtk_list_store_new (NUM_COLS, // Number of columns
|
||||
// Displayed columns
|
||||
G_TYPE_UINT, // COL_MSG_NUM
|
||||
G_TYPE_STRING, // COL_LTE_TIME
|
||||
G_TYPE_STRING, // COL_MESSAGE
|
||||
G_TYPE_STRING, // COL_FROM_TASK
|
||||
G_TYPE_STRING, // COL_TO_TASK
|
||||
G_TYPE_STRING, // COL_INSTANCE
|
||||
// Not displayed columns
|
||||
// Id of some message fields to speed-up filtering
|
||||
G_TYPE_UINT, // COL_MESSAGE_ID
|
||||
G_TYPE_UINT, // COL_FROM_TASK_ID
|
||||
G_TYPE_UINT, // COL_TO_TASK_ID
|
||||
G_TYPE_UINT, // COL_INSTANCE_ID
|
||||
G_TYPE_STRING, // COL_FOREGROUND
|
||||
G_TYPE_STRING, // COL_BACKGROUND
|
||||
G_TYPE_BOOLEAN, // COL_STRIKETHROUGH
|
||||
G_TYPE_UINT,
|
||||
G_TYPE_UINT,
|
||||
G_TYPE_UINT,
|
||||
// Reference to the buffer here to avoid maintaining multiple lists.
|
||||
G_TYPE_POINTER);
|
||||
|
||||
if (ui_store.store == NULL)
|
||||
{
|
||||
g_error("gtk_list_store_new failed");
|
||||
}
|
||||
|
||||
ui_store.filtered = GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (GTK_TREE_MODEL (ui_store.store), NULL));
|
||||
gtk_tree_model_filter_set_visible_func (ui_store.filtered, (GtkTreeModelFilterVisibleFunc) ui_tree_filter_messages,
|
||||
&ui_store, NULL);
|
||||
|
||||
gtk_tree_view_set_model (GTK_TREE_VIEW(list), GTK_TREE_MODEL(ui_store.filtered));
|
||||
|
||||
gtk_tree_view_columns_autosize (GTK_TREE_VIEW(list));
|
||||
}
|
||||
|
||||
static void ui_tree_view_add_to_list(GtkWidget *list, const gchar *lte_time, const uint32_t message_number,
|
||||
const uint32_t message_id, const gchar *signal_name, const uint32_t origin_task_id,
|
||||
const char *origin_task_name, const uint32_t destination_task_id,
|
||||
const char *destination_task_name, uint32_t instance_id, const char *instance_name, gpointer buffer)
|
||||
{
|
||||
static int counter = 0;
|
||||
|
||||
GtkTreeIter iter;
|
||||
gboolean enabled;
|
||||
int message_index;
|
||||
|
||||
g_info("ui_tree_view_add_to_list: %d %d %d %d %d", message_number, message_id, origin_task_id, destination_task_id, instance_id);
|
||||
|
||||
enabled = ui_filters_message_enabled (message_id, origin_task_id, destination_task_id, instance_id);
|
||||
message_index = ui_filters_search_id (&ui_filters.messages, message_id);
|
||||
|
||||
g_info("ui_tree_view_add_to_list: %d %d", enabled, message_index);
|
||||
|
||||
gtk_list_store_append (ui_store.store, &iter);
|
||||
gtk_list_store_set (ui_store.store, &iter,
|
||||
/* Columns */
|
||||
COL_MSG_NUM,
|
||||
message_number, COL_LTE_TIME, lte_time, COL_MESSAGE, signal_name, COL_FROM_TASK, origin_task_name,
|
||||
COL_TO_TASK, destination_task_name, COL_INSTANCE, instance_name, COL_MESSAGE_ID, message_id,
|
||||
COL_FROM_TASK_ID, origin_task_id, COL_TO_TASK_ID, destination_task_id, COL_INSTANCE_ID, instance_id,
|
||||
COL_BUFFER, buffer, COL_FOREGROUND, ui_filters.messages.items[message_index].foreground, COL_BACKGROUND,
|
||||
ui_filters.messages.items[message_index].background, COL_STRIKETHROUGH, !enabled,
|
||||
// COL_STYLE, (counter % 2) == 0 ? PANGO_STYLE_ITALIC : PANGO_STYLE_NORMAL,
|
||||
// COL_WEIGHT, ((counter + 2) % 4) < 2 ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL,
|
||||
// COL_UNDERLINE, ((counter + 4) % 8) < 4 ?PANGO_UNDERLINE_SINGLE : PANGO_UNDERLINE_NONE,
|
||||
COL_STYLE, PANGO_STYLE_NORMAL,
|
||||
COL_WEIGHT, PANGO_WEIGHT_NORMAL,
|
||||
COL_UNDERLINE, PANGO_UNDERLINE_NONE,
|
||||
/* End of columns */
|
||||
-1);
|
||||
counter++;
|
||||
}
|
||||
|
||||
void ui_tree_view_destroy_list(GtkWidget *list)
|
||||
{
|
||||
g_assert(list != NULL);
|
||||
|
||||
gtk_list_store_clear (ui_store.store);
|
||||
ui_store.filtered_last_msg = 0;
|
||||
ui_store.filtered_msg_number = 0;
|
||||
ui_store.instance_number = 0;
|
||||
|
||||
/* Reset number of messages */
|
||||
ui_main_data.nb_message_received = 0;
|
||||
}
|
||||
|
||||
/* Search for the message with its message number equal to the given value or the previous one */
|
||||
static gboolean ui_tree_view_search(GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter,
|
||||
gpointer search_data)
|
||||
{
|
||||
uint32_t msg_number;
|
||||
uint32_t key_value = atoi (key);
|
||||
|
||||
gtk_tree_model_get (model, iter, column, &msg_number, -1);
|
||||
|
||||
g_debug("ui_tree_view_search %d %d", key_value, msg_number);
|
||||
|
||||
if (key_value == msg_number)
|
||||
{
|
||||
/* Value found, use this message */
|
||||
return 0;
|
||||
}
|
||||
|
||||
{
|
||||
GtkTreeIter iter_next = *iter;
|
||||
|
||||
if (gtk_tree_model_iter_next (model, &iter_next))
|
||||
{
|
||||
gtk_tree_model_get (model, &iter_next, column, &msg_number, -1);
|
||||
|
||||
if (key_value < msg_number)
|
||||
{
|
||||
/* Next value will be greater, use this message */
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Last value, use this message */
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void ui_tree_view_create_menu(GtkWidget **menu)
|
||||
{
|
||||
GtkWidget *menu_items;
|
||||
|
||||
*menu = gtk_menu_new ();
|
||||
|
||||
/* Create the "Message enable" menu-item */
|
||||
{
|
||||
/* Create a new menu-item */
|
||||
menu_items = gtk_check_menu_item_new ();
|
||||
ui_tree_view_menu_enable[MENU_MESSAGE].menu_enable = menu_items;
|
||||
|
||||
/* Add it to the menu. */
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(*menu), menu_items);
|
||||
g_signal_connect(G_OBJECT(menu_items), "activate", G_CALLBACK(ui_callback_on_menu_enable),
|
||||
&ui_tree_view_menu_enable[MENU_MESSAGE]);
|
||||
|
||||
/* Show the widget */
|
||||
gtk_widget_show (menu_items);
|
||||
}
|
||||
|
||||
/* Create the "Destination task enable" menu-item */
|
||||
{
|
||||
/* Create a new menu-item */
|
||||
menu_items = gtk_check_menu_item_new ();
|
||||
ui_tree_view_menu_enable[MENU_FROM_TASK].menu_enable = menu_items;
|
||||
|
||||
/* Add it to the menu. */
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(*menu), menu_items);
|
||||
g_signal_connect(G_OBJECT(menu_items), "activate", G_CALLBACK(ui_callback_on_menu_enable),
|
||||
&ui_tree_view_menu_enable[MENU_FROM_TASK]);
|
||||
|
||||
/* Show the widget */
|
||||
gtk_widget_show (menu_items);
|
||||
}
|
||||
|
||||
/* Create the "Origin task enable" menu-item */
|
||||
{
|
||||
/* Create a new menu-item */
|
||||
menu_items = gtk_check_menu_item_new ();
|
||||
ui_tree_view_menu_enable[MENU_TO_TASK].menu_enable = menu_items;
|
||||
|
||||
/* Add it to the menu. */
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(*menu), menu_items);
|
||||
g_signal_connect(G_OBJECT(menu_items), "activate", G_CALLBACK(ui_callback_on_menu_enable),
|
||||
&ui_tree_view_menu_enable[MENU_TO_TASK]);
|
||||
|
||||
/* Show the widget */
|
||||
gtk_widget_show (menu_items);
|
||||
}
|
||||
|
||||
/* Create the "Instance enable" menu-item */
|
||||
{
|
||||
/* Create a new menu-item */
|
||||
menu_items = gtk_check_menu_item_new ();
|
||||
ui_tree_view_menu_enable[MENU_INSTANCE].menu_enable = menu_items;
|
||||
|
||||
/* Add it to the menu. */
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(*menu), menu_items);
|
||||
g_signal_connect(G_OBJECT(menu_items), "activate", G_CALLBACK(ui_callback_on_menu_enable),
|
||||
&ui_tree_view_menu_enable[MENU_INSTANCE]);
|
||||
|
||||
/* Show the widget */
|
||||
gtk_widget_show (menu_items);
|
||||
}
|
||||
|
||||
/* Create the "Foreground color" menu-item */
|
||||
{
|
||||
static ui_tree_view_menu_color_t menu_color_foreground =
|
||||
{TRUE, &ui_tree_view_menu_enable[MENU_MESSAGE]};
|
||||
|
||||
/* Create a new menu-item with a name */
|
||||
menu_items = gtk_menu_item_new_with_label ("Select message foreground color");
|
||||
|
||||
/* Add it to the menu. */
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(*menu), menu_items);
|
||||
g_signal_connect(G_OBJECT(menu_items), "activate", G_CALLBACK(ui_callback_on_menu_color),
|
||||
&menu_color_foreground);
|
||||
|
||||
/* Show the widget */
|
||||
gtk_widget_show (menu_items);
|
||||
}
|
||||
|
||||
/* Create the "Background color" menu-item */
|
||||
{
|
||||
static ui_tree_view_menu_color_t menu_color_background =
|
||||
{FALSE, &ui_tree_view_menu_enable[MENU_MESSAGE]};
|
||||
|
||||
/* Create a new menu-item with a name */
|
||||
menu_items = gtk_menu_item_new_with_label ("Select message background color");
|
||||
|
||||
/* Add it to the menu. */
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL(*menu), menu_items);
|
||||
g_signal_connect(G_OBJECT(menu_items), "activate", G_CALLBACK(ui_callback_on_menu_color),
|
||||
&menu_color_background);
|
||||
|
||||
/* Show the widget */
|
||||
gtk_widget_show (menu_items);
|
||||
}
|
||||
}
|
||||
|
||||
int ui_tree_view_create(GtkWidget *window, GtkWidget *vbox)
|
||||
{
|
||||
GtkWidget *hbox;
|
||||
GtkTreeSelection *selection;
|
||||
GtkWidget *scrolled_window;
|
||||
|
||||
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
|
||||
|
||||
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
|
||||
|
||||
ui_main_data.messages_list = gtk_tree_view_new ();
|
||||
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(ui_main_data.messages_list), TRUE);
|
||||
gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW(ui_main_data.messages_list), ui_tree_view_search, NULL, NULL);
|
||||
gtk_tree_view_set_search_entry (GTK_TREE_VIEW(ui_main_data.messages_list),
|
||||
GTK_ENTRY(ui_main_data.signals_go_to_entry));
|
||||
|
||||
/* Disable multiple selection */
|
||||
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(ui_main_data.messages_list));
|
||||
gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
|
||||
|
||||
hbox = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
|
||||
|
||||
gtk_container_add (GTK_CONTAINER(scrolled_window), ui_main_data.messages_list);
|
||||
|
||||
ui_tree_view_init_list (ui_main_data.messages_list);
|
||||
gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW(ui_main_data.messages_list), TRUE);
|
||||
|
||||
gtk_scrolled_window_set_min_content_width (GTK_SCROLLED_WINDOW(scrolled_window), 680);
|
||||
gtk_paned_pack1 (GTK_PANED (hbox), scrolled_window, FALSE, TRUE);
|
||||
ui_main_data.text_view = ui_signal_dissect_new (hbox);
|
||||
|
||||
gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 5);
|
||||
|
||||
g_signal_connect(G_OBJECT(ui_main_data.messages_list), "button-press-event", G_CALLBACK (onButtonPressed), NULL);
|
||||
// g_signal_connect(G_OBJECT(ui_main_data.signalslist), "button-release-event", G_CALLBACK (onButtonRelease), NULL);
|
||||
|
||||
/* Connect callback on row selection */
|
||||
gtk_tree_selection_set_select_function (selection, ui_callback_on_select_signal, ui_main_data.text_view, NULL);
|
||||
|
||||
ui_store.filtered_last_msg = 0;
|
||||
ui_store.filtered_msg_number = 0;
|
||||
ui_store.instance_number = 0;
|
||||
|
||||
ui_main_data.selection = selection;
|
||||
|
||||
ui_tree_view_create_menu (&ui_tree_view_menu);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ui_tree_view_new_signal_ind(const uint32_t message_number, const gchar *lte_time, const uint32_t message_id,
|
||||
const char *message_name, const uint32_t origin_task_id, const char *origin_task_name,
|
||||
const uint32_t destination_task_id, const char *destination_task_name, uint32_t instance_id,
|
||||
gpointer buffer)
|
||||
{
|
||||
char *instance_name = NULL;
|
||||
char instance_name_buffer[10];
|
||||
|
||||
if (((instance_t) instance_id) < INSTANCE_DEFAULT)
|
||||
{
|
||||
if (ui_store.instance_number < (instance_id + 1))
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = ui_store.instance_number; i <= instance_id; i++)
|
||||
{
|
||||
sprintf (instance_name_buffer, "%d", i);
|
||||
ui_filters_add (FILTER_INSTANCES, i, instance_name_buffer, ENTRY_ENABLED_TRUE, NULL, NULL);
|
||||
}
|
||||
ui_store.instance_number = (instance_id + 1);
|
||||
ui_destroy_filter_menu (FILTER_INSTANCES);
|
||||
}
|
||||
|
||||
sprintf (instance_name_buffer, "%d", instance_id);
|
||||
instance_name = instance_name_buffer;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch ((instance_t) instance_id)
|
||||
{
|
||||
case INSTANCE_DEFAULT:
|
||||
instance_name = "DEF";
|
||||
break;
|
||||
|
||||
case INSTANCE_ALL:
|
||||
instance_name = "ALL";
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if ((instance_name != NULL) && (ui_filters_search_id (&ui_filters.instances, instance_id) < 0))
|
||||
{
|
||||
ui_filters_add (FILTER_INSTANCES, instance_id, instance_name, ENTRY_ENABLED_TRUE, NULL, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
ui_tree_view_add_to_list (ui_main_data.messages_list, lte_time, message_number, message_id, message_name,
|
||||
origin_task_id, origin_task_name, destination_task_id, destination_task_name, instance_id, instance_name,
|
||||
buffer);
|
||||
|
||||
return RC_OK;
|
||||
}
|
||||
|
||||
void ui_tree_view_select_row(gint row)
|
||||
{
|
||||
GtkTreePath *path_row;
|
||||
|
||||
if (row >= 0)
|
||||
{
|
||||
path_row = gtk_tree_path_new_from_indices (row, -1);
|
||||
|
||||
if ((ui_main_data.messages_list != NULL) && (path_row != NULL))
|
||||
{
|
||||
g_info("Select row %d", row);
|
||||
|
||||
/* Select the message in requested row */
|
||||
gtk_tree_view_set_cursor (GTK_TREE_VIEW(ui_main_data.messages_list), path_row, NULL, FALSE);
|
||||
/* Center the message in the middle of the list if possible */
|
||||
gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW(ui_main_data.messages_list), path_row, NULL, TRUE, 0.5, 0.0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean updateColors(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
|
||||
{
|
||||
uint32_t message_id;
|
||||
uint32_t origin_task_id;
|
||||
uint32_t destination_task_id;
|
||||
uint32_t instance;
|
||||
|
||||
gboolean enabled = FALSE;
|
||||
int message_index;
|
||||
|
||||
gtk_tree_model_get (model, iter, COL_MESSAGE_ID, &message_id, COL_FROM_TASK_ID, &origin_task_id, COL_TO_TASK_ID,
|
||||
&destination_task_id, COL_INSTANCE_ID, &instance, -1);
|
||||
enabled = ui_filters_message_enabled (message_id, origin_task_id, destination_task_id, instance);
|
||||
message_index = ui_filters_search_id (&ui_filters.messages, message_id);
|
||||
|
||||
gtk_list_store_set (GTK_LIST_STORE(model), iter, COL_FOREGROUND,
|
||||
ui_filters.messages.items[message_index].foreground, COL_BACKGROUND,
|
||||
ui_filters.messages.items[message_index].background, COL_STRIKETHROUGH, !enabled, -1);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void ui_tree_view_refilter()
|
||||
{
|
||||
ui_store.filtered_last_msg = 0;
|
||||
ui_store.filtered_msg_number = 0;
|
||||
|
||||
/* Update foreground color of messages, this will also update filtered model */
|
||||
if (ui_store.store != NULL)
|
||||
{
|
||||
gtk_tree_model_foreach (GTK_TREE_MODEL(ui_store.store), updateColors, NULL);
|
||||
|
||||
if (ui_main_data.messages_list != NULL)
|
||||
{
|
||||
GtkTreePath *path_row;
|
||||
|
||||
/* Get the currently selected message */
|
||||
gtk_tree_view_get_cursor (GTK_TREE_VIEW(ui_main_data.messages_list), &path_row, NULL);
|
||||
if (path_row != NULL)
|
||||
{
|
||||
/* Center the message in the middle of the list if possible */
|
||||
gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW(ui_main_data.messages_list), path_row, NULL, TRUE, 0.5,
|
||||
0.0);
|
||||
g_info("ui_tree_view_refilter: center on message");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
g_info("ui_tree_view_refilter: last message %d, %d messages displayed", ui_store.filtered_last_msg, ui_store.filtered_msg_number);
|
||||
}
|
||||
|
||||
typedef struct foreach_message_params_s
|
||||
{
|
||||
message_write_callback_t callback;
|
||||
gboolean filter;
|
||||
} foreach_message_params_t;
|
||||
|
||||
static gboolean foreach_message(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
|
||||
{
|
||||
foreach_message_params_t *params = (foreach_message_params_t *) data;
|
||||
const gchar *signal_name;
|
||||
uint32_t message_id;
|
||||
uint32_t origin_task_id;
|
||||
uint32_t destination_task_id;
|
||||
uint32_t instance;
|
||||
gpointer buffer = NULL;
|
||||
|
||||
gtk_tree_model_get (model, iter, COL_MESSAGE, &signal_name, COL_MESSAGE_ID, &message_id, COL_FROM_TASK_ID, &origin_task_id, COL_TO_TASK_ID,
|
||||
&destination_task_id, COL_INSTANCE_ID, &instance, COL_BUFFER, &buffer, -1);
|
||||
|
||||
if (params->filter == TRUE)
|
||||
{
|
||||
gboolean enabled = FALSE;
|
||||
|
||||
enabled = ui_filters_message_enabled (message_id, origin_task_id, destination_task_id, instance);
|
||||
if (enabled == FALSE)
|
||||
{
|
||||
buffer = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (buffer != NULL)
|
||||
{
|
||||
params->callback(buffer, signal_name);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void ui_tree_view_foreach_message(message_write_callback_t callback, gboolean filter)
|
||||
{
|
||||
foreach_message_params_t params = {callback, filter};
|
||||
|
||||
gtk_tree_model_foreach (GTK_TREE_MODEL(ui_store.store), foreach_message, (void *) ¶ms);
|
||||
}
|
||||
|
||||
guint ui_tree_view_get_filtered_number(void)
|
||||
{
|
||||
return ui_store.filtered_msg_number;
|
||||
}
|
||||
@@ -1,96 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifndef UI_TREE_VIEW_H_
|
||||
#define UI_TREE_VIEW_H_
|
||||
|
||||
#include "ui_filters.h"
|
||||
#include "ui_notifications.h"
|
||||
|
||||
typedef enum col_type_e
|
||||
{
|
||||
COL_MSG_NUM = 0,
|
||||
COL_LTE_TIME,
|
||||
COL_MESSAGE,
|
||||
COL_FROM_TASK,
|
||||
COL_TO_TASK,
|
||||
COL_INSTANCE,
|
||||
|
||||
COL_MESSAGE_ID,
|
||||
COL_FROM_TASK_ID,
|
||||
COL_TO_TASK_ID,
|
||||
COL_INSTANCE_ID,
|
||||
COL_FOREGROUND,
|
||||
COL_BACKGROUND,
|
||||
COL_STRIKETHROUGH,
|
||||
COL_STYLE,
|
||||
COL_WEIGHT,
|
||||
COL_UNDERLINE,
|
||||
|
||||
COL_BUFFER,
|
||||
NUM_COLS
|
||||
} col_type_t;
|
||||
|
||||
typedef enum ui_tree_view_menu_type_e
|
||||
{
|
||||
MENU_MESSAGE = 0,
|
||||
MENU_FROM_TASK,
|
||||
MENU_TO_TASK,
|
||||
MENU_INSTANCE,
|
||||
NUM_MENU_TYPE,
|
||||
} ui_tree_view_menu_type_t;
|
||||
|
||||
typedef struct ui_tree_view_menu_enable_s
|
||||
{
|
||||
GtkWidget *menu_enable;
|
||||
ui_filter_item_t *filter_item;
|
||||
} ui_tree_view_menu_enable_t;
|
||||
|
||||
typedef struct ui_tree_view_menu_color_s
|
||||
{
|
||||
gboolean foreground;
|
||||
ui_tree_view_menu_enable_t *menu_enable;
|
||||
} ui_tree_view_menu_color_t;
|
||||
|
||||
extern GtkWidget *ui_tree_view_menu;
|
||||
extern ui_tree_view_menu_enable_t ui_tree_view_menu_enable[NUM_MENU_TYPE];
|
||||
|
||||
extern GdkEventButton *ui_tree_view_last_event;
|
||||
|
||||
int ui_tree_view_create(GtkWidget *window, GtkWidget *vbox);
|
||||
|
||||
int ui_tree_view_new_signal_ind(const uint32_t message_number, const gchar *lte_time,
|
||||
const uint32_t message_id, const char *message_name,
|
||||
const uint32_t origin_task_id, const char *origin_task,
|
||||
const uint32_t destination_task_id, const char *to_task,
|
||||
uint32_t instance, gpointer buffer);
|
||||
|
||||
void ui_tree_view_destroy_list(GtkWidget *list);
|
||||
|
||||
void ui_tree_view_select_row(gint row);
|
||||
|
||||
void ui_tree_view_refilter(void);
|
||||
|
||||
void ui_tree_view_foreach_message(message_write_callback_t callback, gboolean filter);
|
||||
|
||||
guint ui_tree_view_get_filtered_number(void);
|
||||
|
||||
#endif /* UI_TREE_VIEW_H_ */
|
||||
@@ -88,7 +88,7 @@ void *msc_task(void *args_p)
|
||||
|
||||
if (received_message_p != NULL) {
|
||||
// msg_name = ITTI_MSG_NAME (received_message_p);
|
||||
// instance = ITTI_MSG_INSTANCE (received_message_p);
|
||||
// instance = ITTI_MSG_DESTINATION_INSTANCE (received_message_p);
|
||||
switch (ITTI_MSG_ID(received_message_p)) {
|
||||
case TIMER_HAS_EXPIRED: {
|
||||
msc_flush_messages();
|
||||
|
||||
@@ -30,30 +30,32 @@ extern "C" {
|
||||
#include <intertask_interface.h>
|
||||
#include <common/utils/system.h>
|
||||
|
||||
typedef struct timer_elm_s {
|
||||
timer_type_t type; ///< Timer type
|
||||
long instance;
|
||||
long duration;
|
||||
uint64_t timeout;
|
||||
void *timer_arg; ///< Optional argument that will be passed when timer expires
|
||||
} timer_elm_t ;
|
||||
typedef struct timer_elm_s {
|
||||
timer_type_t type; ///< Timer type
|
||||
long instance;
|
||||
long duration;
|
||||
uint64_t timeout;
|
||||
void *timer_arg; ///< Optional argument that will be passed when timer expires
|
||||
} timer_elm_t ;
|
||||
|
||||
typedef struct task_list_s {
|
||||
task_info_t admin;
|
||||
pthread_t thread;
|
||||
pthread_mutex_t queue_cond_lock;
|
||||
std::vector<MessageDef *> message_queue;
|
||||
std::map<long,timer_elm_t> timer_map;
|
||||
uint64_t next_timer=UINT64_MAX;
|
||||
struct epoll_event *events =NULL;
|
||||
int nb_fd_epoll=0;
|
||||
int nb_events=0;
|
||||
int epoll_fd=-1;
|
||||
int sem_fd=-1;
|
||||
} task_list_t;
|
||||
typedef struct task_list_s {
|
||||
task_info_t admin;
|
||||
pthread_t thread;
|
||||
pthread_mutex_t queue_cond_lock;
|
||||
std::vector<MessageDef *> message_queue;
|
||||
std::map<long,timer_elm_t> timer_map;
|
||||
uint64_t next_timer=UINT64_MAX;
|
||||
struct epoll_event *events =NULL;
|
||||
int nb_fd_epoll=0;
|
||||
int nb_events=0;
|
||||
int epoll_fd=-1;
|
||||
int sem_fd=-1;
|
||||
} task_list_t;
|
||||
|
||||
int timer_expired(int fd);
|
||||
task_list_t tasks[TASK_MAX];
|
||||
int timer_expired(int fd);
|
||||
static task_list_t **tasks=NULL;
|
||||
static int nb_queues=0;
|
||||
static pthread_mutex_t lock_nb_queues;
|
||||
|
||||
void *pool_buffer_init (void) {
|
||||
return 0;
|
||||
@@ -99,7 +101,7 @@ task_list_t tasks[TASK_MAX];
|
||||
// #define S1AP_REGISTER_ENB_REQ(mSGpTR) (mSGpTR)->ittiMsg.s1ap_register_enb_req
|
||||
// would become
|
||||
// #define S1AP_REGISTER_ENB_REQ(mSGpTR) (s1ap_register_enb_req) mSGpTR)->ittiMsg
|
||||
MessageDef *itti_alloc_new_message_sized(task_id_t origin_task_id, MessagesIds message_id, MessageHeaderSize size) {
|
||||
MessageDef *itti_alloc_new_message_sized(task_id_t origin_task_id, instance_t originInstance, MessagesIds message_id, MessageHeaderSize size) {
|
||||
MessageDef *temp = (MessageDef *)itti_malloc (origin_task_id, TASK_UNKNOWN, sizeof(MessageHeader) +32 + size);
|
||||
temp->ittiMsgHeader.messageId = message_id;
|
||||
temp->ittiMsgHeader.originTaskId = origin_task_id;
|
||||
@@ -107,23 +109,24 @@ task_list_t tasks[TASK_MAX];
|
||||
return temp;
|
||||
}
|
||||
|
||||
MessageDef *itti_alloc_new_message(task_id_t origin_task_id, MessagesIds message_id) {
|
||||
MessageDef *itti_alloc_new_message(task_id_t origin_task_id, instance_t originInstance, MessagesIds message_id) {
|
||||
int size=sizeof(MessageHeader) + 32 + messages_info[message_id].size;
|
||||
MessageDef *temp = (MessageDef *)itti_malloc (origin_task_id, TASK_UNKNOWN, size);
|
||||
temp->ittiMsgHeader.messageId = message_id;
|
||||
temp->ittiMsgHeader.originTaskId = origin_task_id;
|
||||
temp->ittiMsgHeader.ittiMsgSize = size;
|
||||
temp->ittiMsgHeader.destinationTaskId=TASK_UNKNOWN;
|
||||
temp->ittiMsgHeader.instance=0;
|
||||
temp->ittiMsgHeader.lte_time={0};
|
||||
temp->ittiMsgHeader.originInstance=originInstance;
|
||||
temp->ittiMsgHeader.destinationInstance=0;
|
||||
temp->ittiMsgHeader.lte_time= {0};
|
||||
return temp;
|
||||
//return itti_alloc_new_message_sized(origin_task_id, message_id, messages_info[message_id].size);
|
||||
}
|
||||
|
||||
static inline int itti_send_msg_to_task_locked(task_id_t destination_task_id, instance_t instance, MessageDef *message) {
|
||||
task_list_t *t=tasks+destination_task_id;
|
||||
static inline int itti_send_msg_to_task_locked(task_id_t destination_task_id, instance_t destinationInstance, MessageDef *message) {
|
||||
task_list_t *t=tasks[destination_task_id];
|
||||
message->ittiMsgHeader.destinationTaskId = destination_task_id;
|
||||
message->ittiMsgHeader.instance = instance;
|
||||
message->ittiMsgHeader.destinationInstance = destinationInstance;
|
||||
message->ittiMsgHeader.lte_time.frame = 0;
|
||||
message->ittiMsgHeader.lte_time.slot = 0;
|
||||
int message_id = message->ittiMsgHeader.messageId;
|
||||
@@ -142,25 +145,27 @@ task_list_t tasks[TASK_MAX];
|
||||
return 0;
|
||||
}
|
||||
|
||||
int itti_send_msg_to_task(task_id_t destination_task_id, instance_t instance, MessageDef *message) {
|
||||
task_list_t *t=&tasks[destination_task_id];
|
||||
int itti_send_msg_to_task(task_id_t destination_task_id, instance_t destinationInstance, MessageDef *message) {
|
||||
task_list_t *t=tasks[destination_task_id];
|
||||
pthread_mutex_lock (&t->queue_cond_lock);
|
||||
int ret=itti_send_msg_to_task_locked(destination_task_id, instance, message);
|
||||
int ret=itti_send_msg_to_task_locked(destination_task_id, destinationInstance, message);
|
||||
|
||||
while ( t->message_queue.size()>0 && t->admin.func != NULL ) {
|
||||
if (t->message_queue.size()>1)
|
||||
LOG_W(TMR,"queue in no thread mode is %ld\n", t->message_queue.size());
|
||||
LOG_W(TMR,"queue in no thread mode is %ld\n", t->message_queue.size());
|
||||
|
||||
pthread_mutex_unlock (&t->queue_cond_lock);
|
||||
t->admin.func(NULL);
|
||||
pthread_mutex_lock (&t->queue_cond_lock);
|
||||
}
|
||||
|
||||
pthread_mutex_unlock (&t->queue_cond_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void itti_subscribe_event_fd(task_id_t task_id, int fd) {
|
||||
struct epoll_event event;
|
||||
task_list_t *t=&tasks[task_id];
|
||||
task_list_t *t=tasks[task_id];
|
||||
t->nb_fd_epoll++;
|
||||
t->events = (struct epoll_event *)realloc((void *)t->events,
|
||||
t->nb_fd_epoll * sizeof(struct epoll_event));
|
||||
@@ -173,7 +178,7 @@ task_list_t tasks[TASK_MAX];
|
||||
}
|
||||
|
||||
void itti_unsubscribe_event_fd(task_id_t task_id, int fd) {
|
||||
task_list_t *t=&tasks[task_id];
|
||||
task_list_t *t=tasks[task_id];
|
||||
AssertFatal (epoll_ctl(t->epoll_fd, EPOLL_CTL_DEL, fd, NULL) == 0,
|
||||
"epoll_ctl (EPOLL_CTL_DEL) failed for task %s, fd %d: %s!\n",
|
||||
itti_get_task_name(task_id), fd, strerror(errno));
|
||||
@@ -181,7 +186,7 @@ task_list_t tasks[TASK_MAX];
|
||||
}
|
||||
|
||||
static inline int itti_get_events_locked(task_id_t task_id, struct epoll_event **events) {
|
||||
task_list_t *t=&tasks[task_id];
|
||||
task_list_t *t=tasks[task_id];
|
||||
uint64_t current_time=0;
|
||||
|
||||
do {
|
||||
@@ -194,10 +199,11 @@ task_list_t tasks[TASK_MAX];
|
||||
t->next_timer=UINT64_MAX;
|
||||
|
||||
// Proceed expired timer
|
||||
for ( auto it=t->timer_map.begin() , next_it = it; it != t->timer_map.end() ; it = next_it ) {
|
||||
for ( auto it=t->timer_map.begin(), next_it = it; it != t->timer_map.end() ; it = next_it ) {
|
||||
++next_it;
|
||||
|
||||
if ( it->second.timeout < current_time ) {
|
||||
MessageDef *message = itti_alloc_new_message(TASK_TIMER, TIMER_HAS_EXPIRED);
|
||||
MessageDef *message = itti_alloc_new_message(TASK_TIMER, it->second.instance,TIMER_HAS_EXPIRED);
|
||||
message->ittiMsg.timer_has_expired.timer_id=it->first;
|
||||
message->ittiMsg.timer_has_expired.arg=it->second.timer_arg;
|
||||
|
||||
@@ -229,8 +235,9 @@ task_list_t tasks[TASK_MAX];
|
||||
pthread_mutex_unlock(&t->queue_cond_lock);
|
||||
LOG_D(TMR,"enter blocking wait for %s\n", itti_get_task_name(task_id));
|
||||
t->nb_events = epoll_wait(t->epoll_fd,t->events,t->nb_fd_epoll, epoll_timeout);
|
||||
|
||||
if ( t->nb_events < 0 && (errno == EINTR || errno == EAGAIN ) )
|
||||
pthread_mutex_lock(&t->queue_cond_lock);
|
||||
pthread_mutex_lock(&t->queue_cond_lock);
|
||||
} while (t->nb_events < 0 && (errno == EINTR || errno == EAGAIN ) );
|
||||
|
||||
AssertFatal (t->nb_events >=0,
|
||||
@@ -259,13 +266,13 @@ task_list_t tasks[TASK_MAX];
|
||||
}
|
||||
|
||||
int itti_get_events(task_id_t task_id, struct epoll_event **events) {
|
||||
pthread_mutex_lock(&tasks[task_id].queue_cond_lock);
|
||||
pthread_mutex_lock(&tasks[task_id]->queue_cond_lock);
|
||||
return itti_get_events_locked(task_id, events);
|
||||
}
|
||||
|
||||
void itti_receive_msg(task_id_t task_id, MessageDef **received_msg) {
|
||||
// Reception of one message, blocking caller
|
||||
task_list_t *t=&tasks[task_id];
|
||||
task_list_t *t=tasks[task_id];
|
||||
pthread_mutex_lock(&t->queue_cond_lock);
|
||||
|
||||
// Weird condition to deal with crap legacy itti interface
|
||||
@@ -295,10 +302,9 @@ task_list_t tasks[TASK_MAX];
|
||||
pthread_mutex_unlock (&t->queue_cond_lock);
|
||||
}
|
||||
|
||||
void itti_poll_msg(task_id_t task_id, MessageDef **received_msg)
|
||||
{
|
||||
void itti_poll_msg(task_id_t task_id, MessageDef **received_msg) {
|
||||
//reception of one message, non-blocking
|
||||
task_list_t *t=&tasks[task_id];
|
||||
task_list_t *t=tasks[task_id];
|
||||
pthread_mutex_lock(&t->queue_cond_lock);
|
||||
|
||||
if (!t->message_queue.empty()) {
|
||||
@@ -312,11 +318,10 @@ task_list_t tasks[TASK_MAX];
|
||||
}
|
||||
|
||||
int itti_create_task(task_id_t task_id,
|
||||
void *(*start_routine)(void *),
|
||||
void *args_p)
|
||||
{
|
||||
task_list_t *t=&tasks[task_id];
|
||||
threadCreate (&t->thread, start_routine, args_p, (char*)itti_get_task_name(task_id),-1,OAI_PRIORITY_RT);
|
||||
void *(*start_routine)(void *),
|
||||
void *args_p) {
|
||||
task_list_t *t=tasks[task_id];
|
||||
threadCreate (&t->thread, start_routine, args_p, (char *)itti_get_task_name(task_id),-1,OAI_PRIORITY_RT);
|
||||
LOG_I(TMR,"Created Posix thread %s\n", itti_get_task_name(task_id) );
|
||||
return 0;
|
||||
}
|
||||
@@ -325,31 +330,39 @@ task_list_t tasks[TASK_MAX];
|
||||
pthread_exit (NULL);
|
||||
}
|
||||
|
||||
void itti_terminate_tasks(task_id_t task_id)
|
||||
{
|
||||
void itti_terminate_tasks(task_id_t task_id) {
|
||||
// Sends Terminate signals to all tasks.
|
||||
itti_send_terminate_message (task_id);
|
||||
usleep(100*1000); // Allow the tasks to receive the message before going returning to main thread
|
||||
}
|
||||
|
||||
int itti_create_queue(const task_info_t *taskInfo) {
|
||||
pthread_mutex_lock (&lock_nb_queues);
|
||||
int newQueue=nb_queues++;
|
||||
AssertFatal(tasks=(task_list_t **) realloc(tasks, nb_queues * sizeof(*tasks)),"");
|
||||
tasks[newQueue]= new task_list_t;
|
||||
pthread_mutex_unlock (&lock_nb_queues);
|
||||
LOG_I(TMR,"Starting itti queue: %s as task %d\n", taskInfo->name, newQueue);
|
||||
pthread_mutex_init(&tasks[newQueue]->queue_cond_lock, NULL);
|
||||
memcpy(&tasks[newQueue]->admin, taskInfo, sizeof(task_info_t));
|
||||
AssertFatal( ( tasks[newQueue]->epoll_fd = epoll_create1(0) ) >=0, "");
|
||||
AssertFatal( ( tasks[newQueue]->sem_fd = eventfd(0, EFD_SEMAPHORE) ) >=0, "");
|
||||
itti_subscribe_event_fd((task_id_t)newQueue, tasks[newQueue]->sem_fd);
|
||||
|
||||
if (tasks[newQueue]->admin.threadFunc != NULL)
|
||||
itti_create_task((task_id_t)newQueue, tasks[newQueue]->admin.threadFunc, NULL);
|
||||
|
||||
return newQueue;
|
||||
}
|
||||
|
||||
int itti_init(task_id_t task_max,
|
||||
thread_id_t thread_max,
|
||||
MessagesIds messages_id_max,
|
||||
const task_info_t *tasks_info,
|
||||
const message_info_t *messages_info)
|
||||
{
|
||||
AssertFatal(TASK_MAX<UINT16_MAX, "Max itti tasks");
|
||||
const task_info_t *tasks
|
||||
) {
|
||||
pthread_mutex_init(&lock_nb_queues, NULL);
|
||||
nb_queues=0;
|
||||
|
||||
for(int i=0; i<task_max; ++i) {
|
||||
LOG_I(TMR,"Starting itti queue: %s as task %d\n", tasks_info[i].name, i);
|
||||
pthread_mutex_init(&tasks[i].queue_cond_lock, NULL);
|
||||
memcpy(&tasks[i].admin, &tasks_info[i], sizeof(task_info_t));
|
||||
AssertFatal( ( tasks[i].epoll_fd = epoll_create1(0) ) >=0, "");
|
||||
AssertFatal( ( tasks[i].sem_fd = eventfd(0, EFD_SEMAPHORE) ) >=0, "");
|
||||
itti_subscribe_event_fd((task_id_t)i, tasks[i].sem_fd);
|
||||
|
||||
if (tasks[i].admin.threadFunc != NULL)
|
||||
itti_create_task((task_id_t)i, tasks[i].admin.threadFunc, NULL);
|
||||
itti_create_queue(&tasks[i]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -359,12 +372,11 @@ task_list_t tasks[TASK_MAX];
|
||||
uint32_t interval_sec,
|
||||
uint32_t interval_us,
|
||||
task_id_t task_id,
|
||||
int32_t instance,
|
||||
instance_t instance,
|
||||
timer_type_t type,
|
||||
void *timer_arg,
|
||||
long *timer_id)
|
||||
{
|
||||
task_list_t *t=&tasks[task_id];
|
||||
long *timer_id) {
|
||||
task_list_t *t=tasks[task_id];
|
||||
|
||||
do {
|
||||
// set the taskid in the timer id to keep compatible with the legacy API
|
||||
@@ -397,13 +409,12 @@ task_list_t tasks[TASK_MAX];
|
||||
return 0;
|
||||
}
|
||||
|
||||
int timer_remove(long timer_id)
|
||||
{
|
||||
int timer_remove(long timer_id) {
|
||||
task_id_t task_id=(task_id_t)(timer_id&0xffff);
|
||||
int ret;
|
||||
pthread_mutex_lock (&tasks[task_id].queue_cond_lock);
|
||||
ret=tasks[task_id].timer_map.erase(timer_id);
|
||||
pthread_mutex_unlock (&tasks[task_id].queue_cond_lock);
|
||||
pthread_mutex_lock (&tasks[task_id]->queue_cond_lock);
|
||||
ret=tasks[task_id]->timer_map.erase(timer_id);
|
||||
pthread_mutex_unlock (&tasks[task_id]->queue_cond_lock);
|
||||
|
||||
if (ret==1)
|
||||
return 0;
|
||||
@@ -418,7 +429,7 @@ task_list_t tasks[TASK_MAX];
|
||||
}
|
||||
|
||||
const char *itti_get_task_name(task_id_t task_id) {
|
||||
return tasks[task_id].admin.name;
|
||||
return tasks[task_id]->admin.name;
|
||||
}
|
||||
|
||||
// void for compatibility
|
||||
@@ -439,5 +450,7 @@ task_list_t tasks[TASK_MAX];
|
||||
void itti_wait_ready(int wait_tasks) {
|
||||
// Stupid function, kept for compatibility (the parameter is meaningless!!!)
|
||||
}
|
||||
int signal_mask(void) { return 0;}
|
||||
int signal_mask(void) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ typedef struct {
|
||||
uint32_t interval_sec;
|
||||
uint32_t interval_us;
|
||||
long task_id;
|
||||
int32_t instance;
|
||||
instance_t instance;
|
||||
timer_type_t type;
|
||||
void *timer_arg;
|
||||
long timer_id;
|
||||
@@ -264,7 +264,7 @@ void *rrc_enb_process_itti_msg(void *);
|
||||
#include <openair3/NGAP/ngap_gNB.h>
|
||||
|
||||
#ifdef ITTI_SIM
|
||||
#include <openair2/COMMON/itti_sim_messages_types.h>
|
||||
#include <openair2/COMMON/itti_sim_messages_types.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -301,7 +301,7 @@ typedef struct {
|
||||
//TASK_DEF(TASK_RRC_ENB, TASK_PRIORITY_MED, 200, NULL, NULL)
|
||||
//TASK_DEF(TASK_GTPV1_U, TASK_PRIORITY_MED, 1000,NULL, NULL)
|
||||
//TASK_DEF(TASK_UDP, TASK_PRIORITY_MED, 1000, NULL, NULL)
|
||||
void * rrc_enb_process_msg(void*);
|
||||
void *rrc_enb_process_msg(void *);
|
||||
#define FOREACH_TASK(TASK_DEF) \
|
||||
TASK_DEF(TASK_UNKNOWN, TASK_PRIORITY_MED, 50, NULL, NULL) \
|
||||
TASK_DEF(TASK_TIMER, TASK_PRIORITY_MED, 10, NULL, NULL) \
|
||||
@@ -403,7 +403,8 @@ typedef struct MessageHeader_s {
|
||||
MessagesIds messageId; /**< Unique message id as referenced in enum MessagesIds */
|
||||
task_id_t originTaskId; /**< ID of the sender task */
|
||||
task_id_t destinationTaskId; /**< ID of the destination task */
|
||||
instance_t instance; /**< Task instance for virtualization */
|
||||
instance_t originInstance;
|
||||
instance_t destinationInstance;
|
||||
itti_lte_time_t lte_time;
|
||||
MessageHeaderSize ittiMsgSize; /**< Message size (not including header size) */
|
||||
} MessageHeader;
|
||||
@@ -433,11 +434,11 @@ typedef struct MessageDef_s {
|
||||
|
||||
|
||||
/* Extract the instance from a message */
|
||||
#define ITTI_MESSAGE_GET_INSTANCE(mESSAGE) ((mESSAGE)->ittiMsgHeader.instance)
|
||||
#define ITTI_MSG_ID(mSGpTR) ((mSGpTR)->ittiMsgHeader.messageId)
|
||||
#define ITTI_MSG_ORIGIN_ID(mSGpTR) ((mSGpTR)->ittiMsgHeader.originTaskId)
|
||||
#define ITTI_MSG_DESTINATION_ID(mSGpTR) ((mSGpTR)->ittiMsgHeader.destinationTaskId)
|
||||
#define ITTI_MSG_INSTANCE(mSGpTR) ((mSGpTR)->ittiMsgHeader.instance)
|
||||
#define ITTI_MSG_ORIGIN_INSTANCE(mSGpTR) ((mSGpTR)->ittiMsgHeader.originInstance)
|
||||
#define ITTI_MSG_DESTINATION_INSTANCE(mSGpTR) ((mSGpTR)->ittiMsgHeader.destinationInstance)
|
||||
#define ITTI_MSG_NAME(mSGpTR) itti_get_message_name(ITTI_MSG_ID(mSGpTR))
|
||||
#define ITTI_MSG_ORIGIN_NAME(mSGpTR) itti_get_task_name(ITTI_MSG_ORIGIN_ID(mSGpTR))
|
||||
#define ITTI_MSG_DESTINATION_NAME(mSGpTR) itti_get_task_name(ITTI_MSG_DESTINATION_ID(mSGpTR))
|
||||
@@ -500,6 +501,8 @@ int itti_create_task(task_id_t task_id,
|
||||
void *(*start_routine) (void *),
|
||||
void *args_p);
|
||||
|
||||
int itti_create_queue(const task_info_t *task_info);
|
||||
|
||||
/** \brief Exit the current task.
|
||||
**/
|
||||
void itti_exit_task(void);
|
||||
@@ -530,6 +533,7 @@ const char *itti_get_task_name(task_id_t task_id);
|
||||
**/
|
||||
MessageDef *itti_alloc_new_message(
|
||||
task_id_t origin_task_id,
|
||||
instance_t originInstance,
|
||||
MessagesIds message_id);
|
||||
|
||||
/** \brief Alloc and memset(0) a new itti message.
|
||||
@@ -540,6 +544,7 @@ MessageDef *itti_alloc_new_message(
|
||||
**/
|
||||
MessageDef *itti_alloc_new_message_sized(
|
||||
task_id_t origin_task_id,
|
||||
instance_t originInstance,
|
||||
MessagesIds message_id,
|
||||
MessageHeaderSize size);
|
||||
|
||||
@@ -547,7 +552,7 @@ MessageDef *itti_alloc_new_message_sized(
|
||||
This function should be called from the main thread after having created all ITTI tasks.
|
||||
**/
|
||||
void itti_wait_tasks_end(void);
|
||||
#define THREAD_MAX 0 //for compatibility
|
||||
#define ADDED_QUEUES_MAX 10 // Fix me: MSC component too hard to understand, we keep room for 10 queues created dynamically
|
||||
void itti_set_task_real_time(task_id_t task_id);
|
||||
|
||||
/** \brief Send a termination message to all tasks.
|
||||
@@ -561,13 +566,12 @@ void *malloc_or_fail(size_t size);
|
||||
int memory_read(const char *datafile, void *data, size_t size);
|
||||
int itti_free(task_id_t task_id, void *ptr);
|
||||
|
||||
int itti_init(task_id_t task_max, thread_id_t thread_max, MessagesIds messages_id_max, const task_info_t *tasks_info,
|
||||
const message_info_t *messages_info);
|
||||
int itti_init(task_id_t task_max, const task_info_t *tasks_info);
|
||||
int timer_setup(
|
||||
uint32_t interval_sec,
|
||||
uint32_t interval_us,
|
||||
task_id_t task_id,
|
||||
int32_t instance,
|
||||
instance_t instance,
|
||||
timer_type_t type,
|
||||
void *timer_arg,
|
||||
long *timer_id);
|
||||
|
||||
Reference in New Issue
Block a user