Example #1
0
VMINT vm_xml_parse(
	VM_XML_PARSER_STRUCT *parser,
	const VMCHAR *xmlsource,
	VMINT length)
{
	int ret = VM_XML_RESULT_FAIL;

	ret = xml_new_parser(&mtk_xml_parser);

	if (XML_RESULT_OK != ret)
	{
		MMI_TRACE(MMI_MRE_TRC_ERROR, TRC_MRE_VMXML_336 , ret);
		xml_close_parser(&mtk_xml_parser);
		return -1;
	}
	
	xml_configure_memory(&mtk_xml_parser, vm_malloc, vm_free);

		
    xml_register_doctype_handler(
	   	&mtk_xml_parser, 
	   	parser->start_doctype_hdlr, 
	   	parser->end_doctype_hdlr);
	   
    xml_register_element_handler(
	   	&mtk_xml_parser, 
	   	parser->start_elem_hdlr, 
	   	parser->end_elem_hdlr);
	   
    xml_register_data_handler(
	   	&mtk_xml_parser, 
	   	parser->data_hdlr);
	   
	if(0 == length)
	{
		ret = xml_parse(&mtk_xml_parser, (VMUWSTR)vm_ucs2_string_by_ascii((VMSTR)xmlsource));
	}
	else
	{
		ret = xml_parse_buffer(&mtk_xml_parser, xmlsource, length);
	}

	xml_close_parser(&mtk_xml_parser);

	if (XML_RESULT_OK!= ret)
	{
 		return -1;
	}

	return VM_XML_RESULT_OK;
}
Example #2
0
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;
}