[sushi] Add error reporting for renderers



commit 4c7acf5e72f26f92170448981e89ce21db546f51
Author: Cosimo Cecchi <cosimo endlessm com>
Date:   Fri Jun 21 22:28:18 2019 -0700

    Add error reporting for renderers
    
    At the moment errors are ignored while loading data from files.
    
    To fix that We want to add an error state to the main window,
    so this commit adds error reporting from renderers as a first step.

 src/libsushi/sushi-font-widget.c |  4 ++--
 src/libsushi/sushi-utils.c       |  9 ++++++++-
 src/libsushi/sushi-utils.h       |  4 +++-
 src/ui/renderer.js               |  5 ++++-
 src/viewers/audio.js             |  4 ++++
 src/viewers/evince.js            | 11 +++++++++--
 src/viewers/html.js              |  3 +++
 src/viewers/image.js             | 10 ++++++++--
 src/viewers/text.js              |  2 +-
 9 files changed, 42 insertions(+), 10 deletions(-)
---
diff --git a/src/libsushi/sushi-font-widget.c b/src/libsushi/sushi-font-widget.c
index d601b58..06b3c67 100644
--- a/src/libsushi/sushi-font-widget.c
+++ b/src/libsushi/sushi-font-widget.c
@@ -676,7 +676,7 @@ font_face_async_ready_cb (GObject *object,
                                        &error);
 
   if (error != NULL) {
-    g_signal_emit (self, signals[ERROR], 0, error->message);
+    g_signal_emit (self, signals[ERROR], 0, error);
     g_print ("Can't load the font face: %s\n", error->message);
     g_error_free (error);
 
@@ -831,7 +831,7 @@ sushi_font_widget_class_init (SushiFontWidgetClass *klass)
                   G_SIGNAL_RUN_FIRST,
                   0, NULL, NULL,
                   g_cclosure_marshal_VOID__STRING,
-                  G_TYPE_NONE, 1, G_TYPE_STRING);
+                  G_TYPE_NONE, 1, G_TYPE_ERROR);
 
   g_object_class_install_properties (oclass, NUM_PROPERTIES, properties);
 }
diff --git a/src/libsushi/sushi-utils.c b/src/libsushi/sushi-utils.c
index dcd7e93..81f690d 100644
--- a/src/libsushi/sushi-utils.c
+++ b/src/libsushi/sushi-utils.c
@@ -55,12 +55,19 @@ sushi_create_foreign_window (guint xid)
 /**
  * sushi_get_evince_document_from_job:
  * @job:
+ * @error:
  *
  * Returns: (transfer none):
  */
 EvDocument *
-sushi_get_evince_document_from_job (EvJob *job)
+sushi_get_evince_document_from_job (EvJob   *job,
+                                    GError **error)
 {
+  if (job->failed) {
+    g_propagate_error (error, job->error);
+    return NULL;
+  }
+
   return job->document;
 }
 
diff --git a/src/libsushi/sushi-utils.h b/src/libsushi/sushi-utils.h
index 96af3cc..83f7ea0 100644
--- a/src/libsushi/sushi-utils.h
+++ b/src/libsushi/sushi-utils.h
@@ -36,7 +36,9 @@ G_BEGIN_DECLS
 
 GdkWindow *    sushi_create_foreign_window (guint xid);
 gchar **       sushi_query_supported_document_types (void);
-EvDocument *   sushi_get_evince_document_from_job (EvJob *job);
+
+EvDocument *   sushi_get_evince_document_from_job (EvJob   *job,
+                                                   GError **error);
 
 void           sushi_convert_libreoffice (GFile *file,
                                           GAsyncReadyCallback callback,
diff --git a/src/ui/renderer.js b/src/ui/renderer.js
index 82fb618..19dc29c 100644
--- a/src/ui/renderer.js
+++ b/src/ui/renderer.js
@@ -1,4 +1,4 @@
-const {GObject, Gtk} = imports.gi;
+const {GLib, GObject, Gtk} = imports.gi;
 
 var ResizePolicy = {
     MAX_SIZE: 0,
@@ -17,6 +17,9 @@ var Renderer = GObject.registerClass({
                                          GObject.ParamFlags.READABLE,
                                          false)
     },
+    Signals: {
+        'error': { param_types: [GLib.Error.$gtype] }
+    }
 }, class Renderer extends GObject.Interface {
     isReady() {
         this._ready = true;
diff --git a/src/viewers/audio.js b/src/viewers/audio.js
index 0f38b11..a12cd67 100644
--- a/src/viewers/audio.js
+++ b/src/viewers/audio.js
@@ -258,6 +258,10 @@ var Klass = GObject.registerClass({
         this._player.connect('tags-change', (p) => {
             this._updateFromTags(this._player.get_audio_tags());
         });
+        this._player.connect('error', (p, error) => {
+            this.emit('error', error);
+            return false;
+        });
         this.add_overlay(this._player);
 
         this._autoplayId = GLib.idle_add(0, () => {
diff --git a/src/viewers/evince.js b/src/viewers/evince.js
index aadf8eb..cd62bb1 100644
--- a/src/viewers/evince.js
+++ b/src/viewers/evince.js
@@ -55,7 +55,7 @@ var Klass = GObject.registerClass({
                 try {
                     convertedFile = Sushi.convert_libreoffice_finish(res);
                 } catch (e) {
-                    logError(e, 'Unable to convert Libreoffice document to PDF');
+                    this.emit('error', e);
                     return;
                 }
 
@@ -87,7 +87,14 @@ var Klass = GObject.registerClass({
     }
 
     _onLoadJobFinished(job) {
-        let document = Sushi.get_evince_document_from_job(job);
+        let document;
+        try {
+            document = Sushi.get_evince_document_from_job(job);
+        } catch (e) {
+            this.emit('error', e);
+            return;
+        }
+
         this._model = EvinceView.DocumentModel.new_with_document(document);
         this._model.set_sizing_mode(EvinceView.SizingMode.FIT_WIDTH);
         this._model.set_continuous(true);
diff --git a/src/viewers/html.js b/src/viewers/html.js
index 2f10093..7c782bf 100644
--- a/src/viewers/html.js
+++ b/src/viewers/html.js
@@ -47,6 +47,9 @@ var Klass = GObject.registerClass({
                      function() {return true;});
 
         this.load_uri(file.get_uri());
+        this.connect('load-failed', (view, loadEvent, uri, error) => {
+            this.emit('error', error);
+        });
         this.isReady();
     }
 
diff --git a/src/viewers/image.js b/src/viewers/image.js
index 4dd86c2..a58cfff 100644
--- a/src/viewers/image.js
+++ b/src/viewers/image.js
@@ -88,7 +88,7 @@ var Klass = GObject.registerClass({
                 let stream = obj.read_finish(res);
                 this._textureFromStream(stream);
             } catch (e) {
-                logError(e, `Unable to read image file ${file.get_uri()}`);
+                this.emit('error', e);
             }
         });
     }
@@ -144,7 +144,13 @@ var Klass = GObject.registerClass({
 
     _textureFromStream(stream) {
         GdkPixbuf.PixbufAnimation.new_from_stream_async(stream, null, (obj, res) => {
-            let anim = GdkPixbuf.PixbufAnimation.new_from_stream_finish(res);
+            let anim;
+            try {
+                anim = GdkPixbuf.PixbufAnimation.new_from_stream_finish(res);
+            } catch (e) {
+                this.emit('error', e);
+                return;
+            }
 
             this._iter = anim.get_iter(null);
             if (!anim.is_static_image())
diff --git a/src/viewers/text.js b/src/viewers/text.js
index 5d10a2a..14f567f 100644
--- a/src/viewers/text.js
+++ b/src/viewers/text.js
@@ -95,7 +95,7 @@ var Klass = GObject.registerClass({
             try {
                 loader.load_finish(result);
             } catch (e) {
-                logError(e, `Unable to load the text file at ${loader.location.get_uri()}`);
+                this.emit('error', e);
             }
         });
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]