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; }
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; }