static GFile * idol_pl_parser_get_feed_uri (char *data, gsize len) { xml_node_t* doc; const char *uri; GFile *ret; uri = NULL; doc = idol_pl_parser_parse_xml_relaxed (data, len); if (doc == NULL) return NULL; /* If the document has no name */ if (doc->name == NULL || g_ascii_strcasecmp (doc->name , "Document") != 0) { xml_parser_free_tree (doc); return NULL; } uri = idol_pl_parser_parse_itms_doc (doc); if (uri == NULL) { /* Maybe it's just a link instead */ const char *link; GByteArray *content; GFile *feed_file; link = idol_pl_parser_parse_itms_link_doc (doc); if (link == NULL) { xml_parser_free_tree (doc); return NULL; } content = idol_pl_parser_load_http_itunes (link); if (content == NULL) { xml_parser_free_tree (doc); return NULL; } xml_parser_free_tree (doc); feed_file = idol_pl_parser_get_feed_uri ((char *) content->data, content->len); g_byte_array_free (content, TRUE); return feed_file; } ret = g_file_new_for_uri (uri); xml_parser_free_tree (doc); return ret; }
IdolPlParserResult idol_pl_parser_add_rss (IdolPlParser *parser, GFile *file, GFile *base_file, IdolPlParseData *parse_data, gpointer data) { #ifndef HAVE_GMIME WARN_NO_GMIME; #else xml_node_t* doc, *channel; char *contents; gsize size; if (g_file_load_contents (file, NULL, &contents, &size, NULL, NULL) == FALSE) return IDOL_PL_PARSER_RESULT_ERROR; doc = idol_pl_parser_parse_xml_relaxed (contents, size); if (doc == NULL) { g_free (contents); return IDOL_PL_PARSER_RESULT_ERROR; } /* If the document has no name */ if (doc->name == NULL || (g_ascii_strcasecmp (doc->name , "rss") != 0 && g_ascii_strcasecmp (doc->name , "rss\n") != 0)) { g_free (contents); xml_parser_free_tree (doc); return IDOL_PL_PARSER_RESULT_ERROR; } for (channel = doc->child; channel != NULL; channel = channel->next) { if (g_ascii_strcasecmp (channel->name, "channel") == 0) { char *uri; uri = g_file_get_uri (file); parse_rss_items (parser, uri, channel); g_free (uri); /* One channel per file */ break; } } g_free (contents); xml_parser_free_tree (doc); return IDOL_PL_PARSER_RESULT_SUCCESS; #endif /* !HAVE_GMIME */ }
int main (int argc, char **argv) { int i, ret = 0; for (i = 1; argv[i]; ++i) { xml_node_t *tree; int fd; void *buf; struct stat st; if (stat (argv[i], &st)) { perror (argv[i]); ret = 1; continue; } if (!S_ISREG (st.st_mode)) { printf ("%s: not a file\n", argv[i]); ret = 1; continue; } fd = open (argv[i], O_RDONLY); if (!fd) { perror (argv[i]); ret = 1; continue; } buf = mmap (NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0); if (!buf) { perror (argv[i]); if (close (fd)) perror (argv[i]); ret = 1; continue; } xml_parser_init (buf, st.st_size, 0); if (!xml_parser_build_tree (&tree)) { puts (argv[i]); xml_parser_dump_tree (tree); xml_parser_free_tree (tree); } else printf ("%s: parser failure\n", argv[i]); if (close (fd)) { perror (argv[i]); ret = 1; } } return ret; }
XplayerPlParserResult xplayer_pl_parser_add_asx (XplayerPlParser *parser, GFile *file, GFile *base_file, XplayerPlParseData *parse_data, gpointer data) { xml_node_t* doc; char *contents, *uri; gsize size; XplayerPlParserResult retval = XPLAYER_PL_PARSER_RESULT_UNHANDLED; if (data != NULL && xplayer_pl_parser_is_uri_list (data, strlen (data)) != FALSE) { return xplayer_pl_parser_add_ram (parser, file, parse_data, data); } if (g_file_load_contents (file, NULL, &contents, &size, NULL, NULL) == FALSE) return XPLAYER_PL_PARSER_RESULT_ERROR; doc = xplayer_pl_parser_parse_xml_relaxed (contents, size); if (doc == NULL) { g_free (contents); return XPLAYER_PL_PARSER_RESULT_ERROR; } /* If the document has no name */ if (doc->name == NULL || g_ascii_strcasecmp (doc->name , "asx") != 0) { g_free (contents); xml_parser_free_tree (doc); return XPLAYER_PL_PARSER_RESULT_ERROR; } uri = g_file_get_uri (file); if (parse_asx_entries (parser, uri, base_file, doc, parse_data) != FALSE) retval = XPLAYER_PL_PARSER_RESULT_SUCCESS; g_free (uri); g_free (contents); xml_parser_free_tree (doc); return retval; }
IdolPlParserResult idol_pl_parser_add_opml (IdolPlParser *parser, GFile *file, GFile *base_file, IdolPlParseData *parse_data, gpointer data) { #ifndef HAVE_GMIME WARN_NO_GMIME; #else xml_node_t* doc; char *contents, *uri; gsize size; if (g_file_load_contents (file, NULL, &contents, &size, NULL, NULL) == FALSE) return IDOL_PL_PARSER_RESULT_ERROR; doc = idol_pl_parser_parse_xml_relaxed (contents, size); if (doc == NULL) { g_free (contents); return IDOL_PL_PARSER_RESULT_ERROR; } /* If the document has no name */ if (doc->name == NULL || g_ascii_strcasecmp (doc->name , "opml") != 0) { g_free (contents); xml_parser_free_tree (doc); return IDOL_PL_PARSER_RESULT_ERROR; } uri = g_file_get_uri (file); parse_opml_head_body (parser, uri, doc); g_free (uri); g_free (contents); xml_parser_free_tree (doc); return IDOL_PL_PARSER_RESULT_SUCCESS; #endif /* !HAVE_GMIME */ }
TotemPlParserResult totem_pl_parser_add_opml (TotemPlParser *parser, GFile *file, GFile *base_file, TotemPlParseData *parse_data, gpointer data) { xml_node_t* doc; char *contents, *uri; gsize size; if (g_file_load_contents (file, NULL, &contents, &size, NULL, NULL) == FALSE) return TOTEM_PL_PARSER_RESULT_ERROR; doc = totem_pl_parser_parse_xml_relaxed (contents, size); if (doc == NULL) { g_free (contents); return TOTEM_PL_PARSER_RESULT_ERROR; } /* If the document has no name */ if (doc->name == NULL || g_ascii_strcasecmp (doc->name , "opml") != 0) { g_free (contents); xml_parser_free_tree (doc); return TOTEM_PL_PARSER_RESULT_ERROR; } uri = g_file_get_uri (file); parse_opml_head_body (parser, uri, doc); g_free (uri); g_free (contents); xml_parser_free_tree (doc); return TOTEM_PL_PARSER_RESULT_SUCCESS; }
int xml_parser_build_tree_with_options_r(xml_parser_t *xml_parser, xml_node_t **root_node, int flags) { xml_node_t *tmp_node, *pri_node, *q_node; int res; tmp_node = new_xml_node(); res = xml_parser_get_node(xml_parser, tmp_node, flags); /* delete any top-level [CDATA] nodes */; pri_node = tmp_node->child; q_node = NULL; while (pri_node) { if (pri_node->name == cdata) { xml_node_t *old = pri_node; if (q_node) q_node->next = pri_node->next; else q_node = pri_node; pri_node = pri_node->next; free_xml_node (old); } else { q_node = pri_node; pri_node = pri_node->next; } } /* find first non-<?...?> node */; for (pri_node = tmp_node->child, q_node = NULL; pri_node && pri_node->name[0] == '?'; pri_node = pri_node->next) q_node = pri_node; /* last <?...?> node (eventually), or NULL */ if (pri_node && !pri_node->next) { /* move the tail to the head (for compatibility reasons) */ if (q_node) { pri_node->next = tmp_node->child; q_node->next = NULL; } *root_node = pri_node; free_xml_node(tmp_node); res = 0; } else { lprintf("error: xml struct\n"); xml_parser_free_tree(tmp_node); res = -1; } return res; }
XplayerPlParserResult xplayer_pl_parser_add_smil_with_data (XplayerPlParser *parser, GFile *file, GFile *base_file, const char *contents, int size) { xml_node_t* doc; XplayerPlParserResult retval; char *contents_dup; contents_dup = g_strndup (contents, size); doc = xplayer_pl_parser_parse_xml_relaxed (contents_dup, size); if (doc == NULL) { g_free (contents_dup); return XPLAYER_PL_PARSER_RESULT_ERROR; } retval = xplayer_pl_parser_add_smil_with_doc (parser, file, base_file, doc); g_free (contents_dup); xml_parser_free_tree (doc); return retval; }
static IdolPlParserResult idol_pl_parser_add_quicktime_metalink (IdolPlParser *parser, GFile *file, GFile *base_file, IdolPlParseData *parse_data, gpointer data) { xml_node_t *doc, *node; gsize size; char *contents; const char *item_uri, *autoplay; gboolean found; if (g_str_has_prefix (data, "RTSPtext") != FALSE || g_str_has_prefix (data, "rtsptext") != FALSE) { return idol_pl_parser_add_quicktime_rtsptext (parser, file, base_file, parse_data, data); } if (g_str_has_prefix (data, "SMILtext") != FALSE) { char *contents; gsize size; IdolPlParserResult retval; if (g_file_load_contents (file, NULL, &contents, &size, NULL, NULL) == FALSE) return IDOL_PL_PARSER_RESULT_ERROR; retval = idol_pl_parser_add_smil_with_data (parser, file, base_file, contents + strlen ("SMILtext"), size - strlen ("SMILtext")); g_free (contents); return retval; } if (g_file_load_contents (file, NULL, &contents, &size, NULL, NULL) == FALSE) return IDOL_PL_PARSER_RESULT_ERROR; doc = idol_pl_parser_parse_xml_relaxed (contents, size); if (doc == NULL) { g_free (contents); return IDOL_PL_PARSER_RESULT_ERROR; } g_free (contents); /* Check for quicktime type */ for (node = doc, found = FALSE; node != NULL; node = node->next) { const char *type; if (node->name == NULL) continue; if (g_ascii_strcasecmp (node->name , "?quicktime") != 0) continue; type = xml_parser_get_property (node, "type"); if (g_ascii_strcasecmp ("application/x-quicktime-media-link", type) != 0) continue; found = TRUE; } if (found == FALSE) { xml_parser_free_tree (doc); return IDOL_PL_PARSER_RESULT_ERROR; } if (!doc || !doc->name || g_ascii_strcasecmp (doc->name, "embed") != 0) { xml_parser_free_tree (doc); return IDOL_PL_PARSER_RESULT_ERROR; } item_uri = xml_parser_get_property (doc, "src"); if (!item_uri) { xml_parser_free_tree (doc); return IDOL_PL_PARSER_RESULT_ERROR; } autoplay = xml_parser_get_property (doc, "autoplay"); /* Add a default as per the QuickTime docs */ if (autoplay == NULL) autoplay = "true"; idol_pl_parser_add_uri (parser, IDOL_PL_PARSER_FIELD_URI, item_uri, IDOL_PL_PARSER_FIELD_AUTOPLAY, autoplay, NULL); xml_parser_free_tree (doc); return IDOL_PL_PARSER_RESULT_SUCCESS; }