void subscription_set_homepage (subscriptionPtr subscription, const gchar *newHtmlUrl) { gchar *htmlUrl = NULL; if (newHtmlUrl) { if (strstr (newHtmlUrl, "://")) { /* absolute URI can be used directly */ htmlUrl = g_strchomp (g_strdup (newHtmlUrl)); } else { /* relative URI part needs to be expanded */ gchar *tmp, *source; source = g_strdup (subscription_get_source (subscription)); tmp = strrchr (source, '/'); if (tmp) *(tmp+1) = '\0'; htmlUrl = common_build_url (newHtmlUrl, source); g_free (source); } metadata_list_set (&subscription->metadata, "homepage", htmlUrl); g_free (htmlUrl); } }
gchar * html_discover_favicon (const gchar * data, const gchar * baseUri) { gchar *res, *tmp; debug0 (DEBUG_UPDATE, "searching through link tags"); res = search_links (data, LINK_FAVICON); debug1 (DEBUG_UPDATE, "search result: %s", res? res : "none found"); if (res) { /* turn relative URIs into absolute URIs */ tmp = res; res = common_build_url (res, baseUri); g_free (tmp); } return res; }
/* Note: this function is called for both item and feed context */ static gchar * atom10_parse_link (xmlNodePtr cur, feedParserCtxtPtr ctxt, struct atom10ParserState *state) { gchar *href, *alternate = NULL; href = xml_get_ns_attribute (cur, "href", NULL); if (href) { xmlChar *baseURL = xmlNodeGetBase (cur->doc, cur); gchar *url, *relation, *type, *escTitle = NULL, *title; const gchar *feedURL = subscription_get_homepage (ctxt->subscription); if (!baseURL && feedURL && feedURL[0] != '|' && strstr (feedURL, "://")) baseURL = xmlStrdup (BAD_CAST (feedURL)); url = (gchar *)common_build_url (href, (gchar *)baseURL); type = xml_get_ns_attribute (cur, "type", NULL); relation = xml_get_ns_attribute (cur, "rel", NULL); title = xml_get_ns_attribute (cur, "title", NULL); if (title) escTitle = g_markup_escape_text (title, -1); if (!xmlHasNsProp (cur, BAD_CAST"rel", NULL) || !relation || g_str_equal (relation, BAD_CAST"alternate")) alternate = g_strdup (url); else if (g_str_equal (relation, "replies")) { if (!type || g_str_equal (type, BAD_CAST"application/atom+xml")) { gchar *commentUri = (gchar *)common_build_url ((gchar *)url, subscription_get_homepage (ctxt->subscription)); if (ctxt->item) metadata_list_set (&ctxt->item->metadata, "commentFeedUri", commentUri); g_free (commentUri); } } else if (g_str_equal (relation, "enclosure")) { if (ctxt->item) { gsize length = 0; gchar *lengthStr = xml_get_ns_attribute (cur, "length", NULL); if (lengthStr) length = atol (lengthStr); g_free (lengthStr); gchar *encStr = enclosure_values_to_string (url, type, length, FALSE /* not yet downloaded */); ctxt->item->metadata = metadata_list_append (ctxt->item->metadata, "enclosure", encStr); ctxt->item->hasEnclosure = TRUE; g_free (encStr); } } else if (g_str_equal (relation, "related") || g_str_equal (relation, "via")) { if (ctxt->item) ctxt->item->metadata = metadata_list_append (ctxt->item->metadata, relation, url); } else { /* g_warning ("Unhandled Atom link with unexpected relation \"%s\"\n", relation); */ } xmlFree (title); xmlFree (baseURL); g_free (escTitle); g_free (url); g_free(relation); g_free(type); g_free(href); } else { /* FIXME: @href is required, this document is not valid Atom */; } return alternate; }