Files
openairinterface5g/common/utils/itti_analyzer/libresolver/locate_root.c
T
winckel 7a178e0190 Reorganized and completed menus:
- Separated "File" into "Filters and "Messages" menus.
- Added "Enable filtering".
- Added "Reload messages file".
- Added "Go to first message".
- Added "Go to message".
- Added "Go to last message".
- Added "Display message header"
- Added "Display brace"
- Added menu key shortcuts (mnemonic and accelerator).
Created an entry box for message goto input number and modified the search function to select the closest lower number if input number is not present in messages list.
Cleared message content view when needed.
Blocked message content redisplay when not needed.
Added a signal handler to capture events on message list tree view.
Modified message content display format.
Modified some log points.

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4426 818b1a75-f10b-46b9-bf7c-635c3b92a50f
2013-11-18 10:32:48 +00:00

188 lines
4.6 KiB
C

#include <stdio.h>
#include <string.h>
#include <glib.h>
#include "rc.h"
#include "types.h"
#include "enum_type.h"
#include "locate_root.h"
#include "xml_parse.h"
types_t *messages_id_enum = NULL;
types_t *lte_time_type = NULL;
types_t *lte_time_frame_type = NULL;
types_t *lte_time_slot_type = NULL;
types_t *origin_task_id_type = NULL;
types_t *destination_task_id_type = NULL;
types_t *instance_type = NULL;
types_t *message_header_type = NULL;
types_t *message_type = NULL;
types_t *message_size_type = NULL;
int locate_root(const char *root_name, types_t *head, types_t **root_elm) {
types_t *next_type;
/* 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;
}
}
*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;
/* 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;
}
}
if (type)
*type = next_type;
return (next_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);
}