[goffice] UI: handle compressed ui files.
- From: Morten Welinder <mortenw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [goffice] UI: handle compressed ui files.
- Date: Tue, 18 Oct 2011 18:24:56 +0000 (UTC)
commit c7877d3906d93f3fa1c8d8d50c86439ffa684b37
Author: Morten Welinder <terra gnome org>
Date: Tue Oct 18 14:24:39 2011 -0400
UI: handle compressed ui files.
ChangeLog | 5 ++++
NEWS | 1 +
goffice/gtk/goffice-gtk.c | 56 +++++++++++++++++++++++++++++++++++++-------
3 files changed, 53 insertions(+), 9 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 5a45305..2ade617 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2011-10-18 Morten Welinder <terra gnome org>
+
+ * goffice/gtk/goffice-gtk.c (go_gtk_builder_new): Handle
+ compressed ui data (regardless of source).
+
2011-10-17 Morten Welinder <terra gnome org>
* goffice/utils/go-rsm.c: New file.
diff --git a/NEWS b/NEWS
index 3f099a8..ed9f13a 100644
--- a/NEWS
+++ b/NEWS
@@ -35,6 +35,7 @@ Morten:
* Recognize scientific formats with longer exponents.
* Fix problem with sticky format colouring.
* Improve certain range functions in corner cases. [#660564]
+ * Add resource manager for embedded files.
Gerald Niel:
* Plugins not found when using in bundle for Mac OSX. [#661264]
diff --git a/goffice/gtk/goffice-gtk.c b/goffice/gtk/goffice-gtk.c
index f131108..128d7dc 100644
--- a/goffice/gtk/goffice-gtk.c
+++ b/goffice/gtk/goffice-gtk.c
@@ -31,6 +31,7 @@
#include <glib/gstdio.h>
#include <gsf/gsf-input-stdio.h>
#include <gsf/gsf-input-textline.h>
+#include <gsf/gsf-input-memory.h>
#include <string.h>
#ifdef HAVE_UNISTD_H
@@ -103,6 +104,27 @@ go_gtk_dialog_add_button (GtkDialog *dialog, char const* text, char const* stock
return button;
}
+
+static gboolean
+apply_ui_from_file (GtkBuilder *gui, GsfInput *src, GError **error)
+{
+ size_t size;
+ gconstpointer data;
+ gboolean res;
+
+ if (!src)
+ return FALSE;
+
+ /* Takes ownership of src. */
+ src = gsf_input_uncompress (src);
+ size = gsf_input_size (src);
+ data = gsf_input_read (src, size, NULL);
+ res = gtk_builder_add_from_string (gui, data, size, error);
+ g_object_unref (src);
+ return res;
+}
+
+
/**
* go_gtk_builder_new :
* @uifile : the name of the file load
@@ -112,13 +134,22 @@ go_gtk_dialog_add_button (GtkDialog *dialog, char const* text, char const* stock
* Simple utility to open ui files
*
* Returns: a new #GtkBuilder or NULL
- **/
+ *
+ * @uifile should be one of these:
+ *
+ * res:NAME -- data from resource manager
+ * data:DATA -- data right here
+ * filename -- data from local file
+ *
+ * Data may be compressed, regardless of source.
+**/
GtkBuilder *
go_gtk_builder_new (char const *uifile,
char const *domain, GOCmdContext *gcc)
{
GtkBuilder *gui;
GError *error = NULL;
+ gboolean ok = FALSE;
g_return_val_if_fail (uifile != NULL, NULL);
@@ -129,17 +160,24 @@ go_gtk_builder_new (char const *uifile,
if (strncmp (uifile, "res:", 4) == 0) {
size_t len;
gconstpointer data = go_rsm_lookup (uifile + 4, &len);
- if (!data) {
- g_object_unref (gui);
- gui = NULL;
- } else if (!gtk_builder_add_from_string (gui, data, len, &error)) {
- g_object_unref (gui);
- gui = NULL;
- }
- } else if (!gtk_builder_add_from_file (gui, uifile, &error)) {
+ GsfInput *src = data
+ ? gsf_input_memory_new (data, len, FALSE)
+ : NULL;
+ ok = apply_ui_from_file (gui, src, &error);
+ } else if (strncmp (uifile, "data:", 5) == 0) {
+ const char *data = uifile + 5;
+ GsfInput *src = gsf_input_memory_new (data, strlen (data), FALSE);
+ ok = apply_ui_from_file (gui, src, &error);
+ } else {
+ GsfInput *src = gsf_input_stdio_new (uifile, &error);
+ ok = apply_ui_from_file (gui, src, &error);
+ }
+
+ if (!ok) {
g_object_unref (gui);
gui = NULL;
}
+
if (gui == NULL && gcc != NULL) {
char *msg;
if (error) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]