static GMarkupParseContext * create_parser_context (GESBaseXmlFormatter * self, const gchar * uri, GError ** error) { gsize xmlsize; GFile *file = NULL; gchar *xmlcontent = NULL; GMarkupParseContext *parsecontext = NULL; GESBaseXmlFormatterClass *self_class = GES_BASE_XML_FORMATTER_GET_CLASS (self); GError *err = NULL; GST_DEBUG_OBJECT (self, "loading xml from %s", uri); file = g_file_new_for_uri (uri); /* TODO Handle GCancellable */ if (!g_file_query_exists (file, NULL)) { err = g_error_new (GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_FAILED, "Invalid URI: \"%s\"", uri); goto failed; } if (!g_file_load_contents (file, NULL, &xmlcontent, &xmlsize, NULL, &err)) goto failed; if (g_strcmp0 (xmlcontent, "") == 0) goto failed; parsecontext = g_markup_parse_context_new (&self_class->content_parser, G_MARKUP_TREAT_CDATA_AS_TEXT, self, NULL); if (g_markup_parse_context_parse (parsecontext, xmlcontent, xmlsize, &err) == FALSE) goto failed; if (!g_markup_parse_context_end_parse (parsecontext, &err)) goto failed; done: g_free (xmlcontent); g_object_unref (file); return parsecontext; failed: GST_WARNING ("failed to load contents from \"%s\"", uri); g_propagate_error (error, err); if (parsecontext) { g_markup_parse_context_free (parsecontext); parsecontext = NULL; } goto done; }
static GMarkupParseContext * create_parser_context (GESBaseXmlFormatter * self, const gchar * uri, GError ** error) { gsize xmlsize; GFile *file = NULL; gchar *xmlcontent = NULL; GMarkupParseContext *parsecontext = NULL; GESBaseXmlFormatterClass *self_class = GES_BASE_XML_FORMATTER_GET_CLASS (self); GError *err = NULL; if ((file = g_file_new_for_uri (uri)) == NULL) goto wrong_uri; /* TODO Handle GCancellable */ if (!g_file_load_contents (file, NULL, &xmlcontent, &xmlsize, NULL, &err)) goto failed; if (g_strcmp0 (xmlcontent, "") == 0) goto failed; parsecontext = g_markup_parse_context_new (&self_class->content_parser, G_MARKUP_TREAT_CDATA_AS_TEXT, self, NULL); if (g_markup_parse_context_parse (parsecontext, xmlcontent, xmlsize, &err) == FALSE) goto failed; done: if (xmlcontent) g_free (xmlcontent); if (file) gst_object_unref (file); return parsecontext; wrong_uri: GST_WARNING ("%s wrong uri", uri); goto done; failed: g_propagate_error (error, err); if (parsecontext) { g_markup_parse_context_free (parsecontext); parsecontext = NULL; } goto done; }
static gboolean _save_to_uri (GESFormatter * formatter, GESTimeline * timeline, const gchar * uri, gboolean overwrite, GError ** error) { GFile *file; gboolean ret; GString *str; GOutputStream *stream; GError *lerror = NULL; g_return_val_if_fail (formatter->project, FALSE); file = g_file_new_for_uri (uri); stream = G_OUTPUT_STREAM (g_file_create (file, G_FILE_CREATE_NONE, NULL, &lerror)); if (stream == NULL) { if (overwrite && lerror->code == G_IO_ERROR_EXISTS) { g_clear_error (&lerror); stream = G_OUTPUT_STREAM (g_file_replace (file, NULL, FALSE, G_FILE_CREATE_NONE, NULL, &lerror)); } if (stream == NULL) goto failed_opening_file; } str = GES_BASE_XML_FORMATTER_GET_CLASS (formatter)->save (formatter, timeline, error); if (str == NULL) goto serialization_failed; ret = g_output_stream_write_all (stream, str->str, str->len, NULL, NULL, &lerror); ret = g_output_stream_close (stream, NULL, &lerror); if (ret == FALSE) GST_WARNING_OBJECT (formatter, "Could not save %s because: %s", uri, lerror->message); g_string_free (str, TRUE); gst_object_unref (file); gst_object_unref (stream); if (lerror) g_propagate_error (error, lerror); return ret; serialization_failed: gst_object_unref (file); g_output_stream_close (stream, NULL, NULL); gst_object_unref (stream); if (lerror) g_propagate_error (error, lerror); return FALSE; failed_opening_file: gst_object_unref (file); GST_WARNING_OBJECT (formatter, "Could not open %s because: %s", uri, lerror->message); if (lerror) g_propagate_error (error, lerror); return FALSE; }