/** * xml_reader_load_from_file: * @reader: a #XmlReader * @filename: the full path to an XML file * @error: return location for a #GError, or %NULL * * Loads an XML file at @filename into @reader and sets the #XmlReader * to be ready to walk the XML document object model. * * See also xml_reader_load_from_file(). * * Return value: %TRUE if the file was successfully loaded. */ gboolean xml_reader_load_from_file (XmlReader *reader, const gchar *filename, GError **error) { XmlReaderPrivate *priv; GError *internal_error; gchar *buffer; gboolean retval; g_return_val_if_fail (XML_IS_READER (reader), FALSE); g_return_val_if_fail (filename != NULL, FALSE); priv = reader->priv; internal_error = NULL; if (!g_file_get_contents (filename, &buffer, NULL, &internal_error)) { g_propagate_error (error, internal_error); return FALSE; } g_free (priv->filename); priv->is_filename = TRUE; priv->filename = g_strdup (filename); retval = xml_reader_load_from_data (reader, buffer, &internal_error); if (!retval) g_propagate_error (error, internal_error); g_free (buffer); return retval; }
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); }
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); }