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 */
}
예제 #3
0
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;
}
예제 #7
0
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;
}
예제 #9
0
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;
}