static void update_job_free (updateJobPtr job) { if (!job) return; jobs = g_slist_remove (jobs, job); update_request_free (job->request); update_result_free (job->result); g_free (job); }
static void inoreader_feed_subscription_process_update_result (subscriptionPtr subscription, const struct updateResult* const result, updateFlags flags) { debug_start_measurement (DEBUG_UPDATE); if (result->data) { updateResultPtr resultCopy; /* FIXME: The following is a very dirty hack to edit the feed's XML before processing it */ resultCopy = update_result_new () ; resultCopy->source = g_strdup (result->source); resultCopy->httpstatus = result->httpstatus; resultCopy->contentType = g_strdup (result->contentType); g_free (resultCopy->updateState); resultCopy->updateState = update_state_copy (result->updateState); /* update the XML by removing 'read', 'reading-list' etc. as labels. */ xmlDocPtr doc = xml_parse (result->data, result->size, NULL); xmlXPathContextPtr xpathCtxt = xmlXPathNewContext (doc) ; xmlXPathRegisterNs (xpathCtxt, "atom", "http://www.w3.org/2005/Atom"); inoreader_source_xpath_foreach_match ("/atom:feed/atom:entry/atom:category[@scheme='http://www.inoreader.com/reader/']", xpathCtxt, inoreader_source_xml_unlink_node, NULL); xmlXPathFreeContext (xpathCtxt); /* good now we have removed the read and unread labels. */ xmlChar *newXml; int newXmlSize ; xmlDocDumpMemory (doc, &newXml, &newXmlSize); resultCopy->data = g_strndup ((gchar*) newXml, newXmlSize); resultCopy->size = newXmlSize; xmlFree (newXml); xmlFreeDoc (doc); feed_get_subscription_type ()->process_update_result (subscription, resultCopy, flags); update_result_free (resultCopy); } else { feed_get_subscription_type ()->process_update_result (subscription, result, flags); return ; } xmlDocPtr doc = xml_parse (result->data, result->size, NULL); if (doc) { xmlNodePtr root = xmlDocGetRootElement (doc); xmlNodePtr entry = root->children ; GHashTable *cache = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); while (entry) { if (!g_str_equal (entry->name, "entry")) { entry = entry->next; continue; /* not an entry */ } inoreader_source_item_retrieve_status (entry, subscription, cache); entry = entry->next; } g_hash_table_unref (cache); xmlFreeDoc (doc); } else { debug0 (DEBUG_UPDATE, "google_feed_subscription_process_update_result(): Couldn't parse XML!"); g_warning ("google_feed_subscription_process_update_result(): Couldn't parse XML!"); } debug_end_measurement (DEBUG_UPDATE, "time taken to update statuses"); }