static NewsFeed * news_format_rss_read (NewsFormat *format, GInputStream *stream, GError **error) { NewsFormatRssPrivate *priv; NewsFormatRss *rss = (NewsFormatRss *)format; GomAdapter *adapter; NewsSource *source; XmlReader *reader; NewsFeed *feed; gchar *source_id; ENTRY; g_return_val_if_fail(NEWS_IS_FORMAT_RSS(rss), NULL); priv = rss->priv; if (!(source = news_format_get_source(format))) { g_assert_not_reached(); RETURN(NULL); } if (!(adapter = news_format_get_adapter(format))) { g_assert_not_reached(); RETURN(NULL); } reader = xml_reader_new(); if (!xml_reader_load_from_stream(reader, stream, error)) { g_object_unref(reader); RETURN(NULL); } g_signal_connect(reader, "error", G_CALLBACK(news_format_rss_on_error), format); g_object_get(source, "id", &source_id, NULL); feed = g_object_new(NEWS_TYPE_FEED, "adapter", adapter, "is-new", TRUE, "source-id", source_id, NULL); if (!news_format_rss_read_from_xml(rss, reader, feed, error)) { g_clear_object(&feed); } else if (priv->error) { g_clear_object(&feed); if (error) { *error = g_error_copy(priv->error); } } g_free(source_id); g_object_unref(reader); RETURN(feed); }
gboolean ide_doap_load_from_data (IdeDoap *self, const gchar *data, gsize length, GError **error) { g_autoptr(XmlReader) reader = NULL; g_return_val_if_fail (IDE_IS_DOAP (self), FALSE); g_return_val_if_fail (data != NULL, FALSE); reader = xml_reader_new (); if (!xml_reader_load_from_data (reader, (const gchar *)data, length, NULL, NULL)) return FALSE; return load_doap (self, reader, error); }
gboolean ide_doap_load_from_file (IdeDoap *self, GFile *file, GCancellable *cancellable, GError **error) { g_autoptr(XmlReader) reader = NULL; g_return_val_if_fail (IDE_IS_DOAP (self), FALSE); g_return_val_if_fail (G_IS_FILE (file), FALSE); g_return_val_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable), FALSE); reader = xml_reader_new (); if (!xml_reader_load_from_file (reader, file, cancellable, error)) return FALSE; return load_doap (self, reader, error); }
gboolean ide_doap_load_from_file (IdeDoap *self, GFile *file, GCancellable *cancellable, GError **error) { g_autoptr(XmlReader) reader = NULL; g_return_val_if_fail (IDE_IS_DOAP (self), FALSE); g_return_val_if_fail (G_IS_FILE (file), FALSE); g_return_val_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable), FALSE); reader = xml_reader_new (); if (!xml_reader_load_from_file (reader, file, cancellable, error)) return FALSE; if (!xml_reader_read_start_element (reader, "Project")) { g_set_error (error, IDE_DOAP_ERROR, IDE_DOAP_ERROR_INVALID_FORMAT, "Project element is missing from doap."); return FALSE; } g_object_freeze_notify (G_OBJECT (self)); xml_reader_read (reader); do { const gchar *element_name; element_name = xml_reader_get_local_name (reader); if (ide_str_equal0 (element_name, "name") || ide_str_equal0 (element_name, "shortdesc") || ide_str_equal0 (element_name, "description")) { gchar *str; str = xml_reader_read_string (reader); if (str != NULL) g_object_set (self, element_name, g_strstrip (str), NULL); g_free (str); } else if (ide_str_equal0 (element_name, "category") || ide_str_equal0 (element_name, "homepage") || ide_str_equal0 (element_name, "download-page") || ide_str_equal0 (element_name, "bug-database")) { gchar *str; str = xml_reader_get_attribute (reader, "rdf:resource"); if (str != NULL) g_object_set (self, element_name, g_strstrip (str), NULL); g_free (str); } else if (ide_str_equal0 (element_name, "programming-language")) { gchar *str; str = xml_reader_read_string (reader); if (!ide_str_empty0 (str)) ide_doap_add_language (self, g_strstrip (str)); g_free (str); } else if (ide_str_equal0 (element_name, "maintainer")) { if (!ide_doap_parse_maintainer (self, reader)) break; } } while (xml_reader_read_to_next (reader)); g_object_thaw_notify (G_OBJECT (self)); return TRUE; }
static void parse_opml (IrisTask *task, gpointer user_data) { MarinaGoogleReaderSource *google_source; XmlReader *reader; GList *sources = NULL; MarinaSource *source; gchar *id; GValue value = {0,}; g_return_if_fail (MARINA_IS_GOOGLE_READER_SOURCE (user_data)); google_source = MARINA_GOOGLE_READER_SOURCE (user_data); reader = xml_reader_new (); iris_task_get_result (task, &value); if (!xml_reader_load_from_data (reader, g_value_get_string (&value), -1, OPML_URI, NULL)) goto cleanup; if (!xml_reader_read_start_element (reader, "opml")) // set error goto cleanup; if (!xml_reader_read_start_element (reader, "body")) // set error goto cleanup; while (xml_reader_read_start_element (reader, "outline")) { source = marina_soup_source_new (); id = g_strconcat (marina_source_get_id (MARINA_SOURCE (google_source)), "+", xml_reader_get_attribute (reader, "xmlUrl"), NULL); MARINA_SOURCE_BASE (source)->id = g_strdup (id); g_object_set (source, "title", xml_reader_get_attribute (reader, "title"), "uri", xml_reader_get_attribute (reader, "xmlUrl"), NULL); sources = g_list_prepend (sources, source); g_free (id); } sources = g_list_reverse (sources); if (!google_source->priv->children) { google_source->priv->children = sources; GList *iter; for (iter = sources; iter; iter = iter->next) { marina_source_child_added (MARINA_SOURCE (google_source), iter->data); marina_sync_source (iter->data); } } else { g_list_foreach (sources, (GFunc)g_object_unref, NULL); g_list_free (sources); sources = NULL; // set error } // update the unread counts marina_sources_stat (marina_sources_get_default ()); cleanup: g_object_unref (reader); }