862
relative_uri_remove_query (const char *uri, char **query)
867
qmark = strrchr (uri, '?');
872
*query = g_strdup (qmark);
873
return g_strndup (uri, qmark - uri);
876
static const char *suffixes[] = {
883
is_probably_dir (const char *filename)
886
char *content_type, *short_name;
888
short_name = relative_uri_remove_query (filename, NULL);
889
if (short_name == NULL)
890
short_name = g_strdup (filename);
891
content_type = g_content_type_guess (short_name, NULL, -1, NULL);
892
if (g_content_type_is_unknown (content_type) != FALSE) {
894
for (i = 0; i < G_N_ELEMENTS (suffixes); i++) {
895
if (g_str_has_suffix (short_name, suffixes[i]) != FALSE) {
896
g_free (content_type);
905
g_free (content_type);
912
totem_pl_parser_resolve_uri (GFile *base_gfile,
913
const char *relative_uri)
915
char *uri, *scheme, *query, *new_relative_uri, *base_uri;
916
GFile *base_parent_gfile, *resolved_gfile;
918
if (relative_uri == NULL) {
919
if (base_gfile == NULL)
921
return g_file_get_uri (base_gfile);
924
if (base_gfile == NULL)
925
return g_strdup (relative_uri);
927
/* If |relative_uri| has a scheme, it's a full URI, just return it */
928
scheme = g_uri_parse_scheme (relative_uri);
929
if (scheme != NULL) {
931
return g_strdup (relative_uri);
934
/* Check whether we need to get the parent for the base or not */
935
base_uri = g_file_get_path (base_gfile);
936
if (base_uri == NULL)
937
base_uri = g_file_get_uri (base_gfile);
938
if (is_probably_dir (base_uri) == FALSE)
939
base_parent_gfile = g_file_get_parent (base_gfile);
941
base_parent_gfile = g_object_ref (base_gfile);
944
if (base_parent_gfile == NULL) {
945
resolved_gfile = g_file_resolve_relative_path (base_gfile, relative_uri);
946
uri = g_file_get_uri (resolved_gfile);
947
g_object_unref (resolved_gfile);
951
/* Remove the query portion of the URI, to transplant it again
954
new_relative_uri = relative_uri_remove_query (relative_uri, &query);
956
if (new_relative_uri) {
959
resolved_gfile = g_file_resolve_relative_path (base_parent_gfile, new_relative_uri);
960
g_object_unref (base_parent_gfile);
961
if (!resolved_gfile) {
963
base_uri = g_file_get_uri (base_gfile);
964
g_warning ("Failed to resolve relative URI '%s' against base '%s'\n", relative_uri, base_uri);
966
g_free (new_relative_uri);
971
tmpuri = g_file_get_uri (resolved_gfile);
972
g_object_unref (resolved_gfile);
973
uri = g_strdup_printf ("%s%s", tmpuri, query);
976
g_free (new_relative_uri);
981
resolved_gfile = g_file_resolve_relative_path (base_parent_gfile, relative_uri);
982
g_object_unref (base_parent_gfile);
983
if (!resolved_gfile) {
985
base_uri = g_file_get_uri (base_gfile);
986
g_warning ("Failed to resolve relative URI '%s' against base '%s'\n", relative_uri, base_uri);
991
uri = g_file_get_uri (resolved_gfile);
992
g_object_unref (resolved_gfile);
861
998
#ifndef TOTEM_PL_PARSER_MINI
863
1000
* totem_pl_parser_write_with_title:
1555
totem_pl_parser_parse_xml_relaxed (char *contents,
1558
xml_node_t* doc, *node;
1559
char *encoding, *new_contents;
1562
totem_pl_parser_cleanup_xml (contents);
1563
xml_parser_init (contents, size, XML_PARSER_CASE_INSENSITIVE);
1564
if (xml_parser_build_tree_with_options (&doc, XML_PARSER_RELAXED | XML_PARSER_MULTI_TEXT) < 0)
1568
for (node = doc; node != NULL; node = node->next) {
1569
if (node->name == NULL || g_str_equal (node->name, "?XML") == FALSE)
1571
encoding = g_strdup (xml_parser_get_property (node, "ENCODING"));
1575
if (encoding == NULL || g_str_equal (encoding, "UTF-8") != FALSE) {
1580
xml_parser_free_tree (doc);
1582
new_contents = g_convert (contents, size, "UTF-8", encoding, NULL, &new_size, NULL);
1583
if (new_contents == NULL) {
1584
g_warning ("Failed to convert XML data to UTF-8");
1590
xml_parser_init (new_contents, new_size, XML_PARSER_CASE_INSENSITIVE);
1591
if (xml_parser_build_tree_with_options (&doc, XML_PARSER_RELAXED | XML_PARSER_MULTI_TEXT) < 0) {
1592
g_free (new_contents);
1596
g_free (new_contents);
1417
1601
static gboolean
1418
1602
totem_pl_parser_ignore_from_mimetype (TotemPlParser *parser, const char *mimetype)