f325b2
From 9a1d485f937bf92ae860078b94a5372b3a4ce718 Mon Sep 17 00:00:00 2001
f325b2
From: Pranav Kant <pranavk@gnome.org>
f325b2
Date: Thu, 18 Jun 2015 21:52:22 +0530
f325b2
Subject: [PATCH 055/398] lokdocview: Use GInitable
f325b2
f325b2
The construction of LokDocView widget can fail because it
f325b2
involves initializing the lok context via lok_init.
f325b2
f325b2
Having lok_init calls in constructed virtual method is a bad idea
f325b2
since it assumes that construction will never fail. So, implement
f325b2
GInitable for this class, and move the object initialization from
f325b2
constructed to initable.
f325b2
f325b2
Change-Id: Idf18a054cf8ef2e946392458ec52cb0107bd7454
f325b2
(cherry picked from commit a2aaf911e2e7b63af920186acb2a5e03bc58bd54)
f325b2
---
f325b2
 include/LibreOfficeKit/LibreOfficeKitGtk.h         |  6 ++-
f325b2
 .../qa/gtktiledviewer/gtktiledviewer.cxx           |  2 +-
f325b2
 libreofficekit/source/gtk/lokdocview.cxx           | 49 +++++++++++++++-------
f325b2
 3 files changed, 39 insertions(+), 18 deletions(-)
f325b2
f325b2
diff --git a/include/LibreOfficeKit/LibreOfficeKitGtk.h b/include/LibreOfficeKit/LibreOfficeKitGtk.h
f325b2
index 7048dbefc0a1..3eaf28352a11 100644
f325b2
--- a/include/LibreOfficeKit/LibreOfficeKitGtk.h
f325b2
+++ b/include/LibreOfficeKit/LibreOfficeKitGtk.h
f325b2
@@ -42,10 +42,12 @@ struct _LOKDocViewClass
f325b2
 
f325b2
 GType                          lok_doc_view_get_type               (void) G_GNUC_CONST;
f325b2
 
f325b2
-GtkWidget*                     lok_doc_view_new                    (const char* pPath);
f325b2
+GtkWidget*                     lok_doc_view_new                    (const gchar* pPath,
f325b2
+                                                                    GCancellable *cancellable,
f325b2
+                                                                    GError **error);
f325b2
 
f325b2
 gboolean                       lok_doc_view_open_document          (LOKDocView* pDocView,
f325b2
-                                                                    char* pPath);
f325b2
+                                                                    const gchar* pPath);
f325b2
 
f325b2
 /// Gets the document the viewer displays.
f325b2
 LibreOfficeKitDocument*        lok_doc_view_get_document           (LOKDocView* pDocView);
f325b2
diff --git a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
f325b2
index 57556616d803..fedd6c9fdf13 100644
f325b2
--- a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
f325b2
+++ b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
f325b2
@@ -520,7 +520,7 @@ int main( int argc, char* argv[] )
f325b2
     gtk_box_pack_end(GTK_BOX(pVBox), pFindbar, FALSE, FALSE, 0);
f325b2
 
f325b2
     // Docview
f325b2
-    pDocView = lok_doc_view_new(argv[1]);
f325b2
+    pDocView = lok_doc_view_new (argv[1], NULL, NULL);
f325b2
     if (pDocView == NULL)
f325b2
         g_error ("Error while creating LOKDocView widget");
f325b2
     g_signal_connect(pDocView, "edit-changed", G_CALLBACK(signalEdit), NULL);
f325b2
diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx
f325b2
index 20b1aa6b837e..144f17efba94 100644
f325b2
--- a/libreofficekit/source/gtk/lokdocview.cxx
f325b2
+++ b/libreofficekit/source/gtk/lokdocview.cxx
f325b2
@@ -137,12 +137,16 @@ enum
f325b2
 
f325b2
 static guint doc_view_signals[LAST_SIGNAL] = { 0 };
f325b2
 
f325b2
+static void lok_doc_view_initable_iface_init (GInitableIface *iface);
f325b2
+
f325b2
 SAL_DLLPUBLIC_EXPORT GType lok_doc_view_get_type();
f325b2
 #ifdef __GNUC__
f325b2
 #pragma GCC diagnostic push
f325b2
 #pragma GCC diagnostic ignored "-Wunused-function"
f325b2
 #endif
f325b2
-G_DEFINE_TYPE_WITH_PRIVATE (LOKDocView, lok_doc_view, GTK_TYPE_DRAWING_AREA)
f325b2
+G_DEFINE_TYPE_WITH_CODE (LOKDocView, lok_doc_view, GTK_TYPE_DRAWING_AREA,
f325b2
+                         G_ADD_PRIVATE (LOKDocView)
f325b2
+                         G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, lok_doc_view_initable_iface_init));
f325b2
 #ifdef __GNUC__
f325b2
 #pragma GCC diagnostic pop
f325b2
 #endif
f325b2
@@ -1103,14 +1107,30 @@ static void lok_doc_view_finalize (GObject* object)
f325b2
     G_OBJECT_CLASS (lok_doc_view_parent_class)->finalize (object);
f325b2
 }
f325b2
 
f325b2
-static void lok_doc_view_constructed (GObject* object)
f325b2
+static gboolean lok_doc_view_initable_init (GInitable *initable, GCancellable* /*cancellable*/, GError **error)
f325b2
 {
f325b2
-    LOKDocView* pDocView = LOK_DOC_VIEW (object);
f325b2
-    LOKDocViewPrivate* priv = pDocView->priv;
f325b2
+    LOKDocView *pDocView = LOK_DOC_VIEW (initable);
f325b2
+
f325b2
+    if (pDocView->priv->m_pOffice != NULL)
f325b2
+        return TRUE;
f325b2
+
f325b2
+    pDocView->priv->m_pOffice = lok_init (pDocView->priv->m_aLOPath);
f325b2
+
f325b2
+    if (pDocView->priv->m_pOffice == NULL)
f325b2
+    {
f325b2
+        g_set_error (error,
f325b2
+                     g_quark_from_static_string ("LOK initialization error"), 0,
f325b2
+                     "Failed to get LibreOfficeKit context. Make sure path (%s) is correct",
f325b2
+                     pDocView->priv->m_aLOPath);
f325b2
+        return FALSE;
f325b2
+    }
f325b2
 
f325b2
-    G_OBJECT_CLASS (lok_doc_view_parent_class)->constructed (object);
f325b2
+    return TRUE;
f325b2
+}
f325b2
 
f325b2
-    pDocView->priv->m_pOffice = lok_init (priv->m_aLOPath);
f325b2
+static void lok_doc_view_initable_iface_init (GInitableIface *iface)
f325b2
+{
f325b2
+    iface->init = lok_doc_view_initable_init;
f325b2
 }
f325b2
 
f325b2
 static void lok_doc_view_class_init (LOKDocViewClass* pClass)
f325b2
@@ -1121,7 +1141,6 @@ static void lok_doc_view_class_init (LOKDocViewClass* pClass)
f325b2
     pGObjectClass->get_property = lok_doc_view_get_property;
f325b2
     pGObjectClass->set_property = lok_doc_view_set_property;
f325b2
     pGObjectClass->finalize = lok_doc_view_finalize;
f325b2
-    pGObjectClass->constructed = lok_doc_view_constructed;
f325b2
 
f325b2
     pWidgetClass->draw = lok_doc_view_draw;
f325b2
     pWidgetClass->button_press_event = lok_doc_view_signal_button;
f325b2
@@ -1343,18 +1362,19 @@ static void lok_doc_view_class_init (LOKDocViewClass* pClass)
f325b2
                      G_TYPE_STRING);
f325b2
 }
f325b2
 
f325b2
-
f325b2
-
f325b2
 /**
f325b2
  * lok_doc_view_new:
f325b2
  * @pPath: LibreOffice install path.
f325b2
+ * @cancellable: The cancellable object that you can use to cancel this
f325b2
+ * operation.
f325b2
+ * @error: The error that will be set if the object fails to initialize.
f325b2
  *
f325b2
- * Returns: The #LOKDocView widget instance.
f325b2
+ * Returns: (transfer none): The #LOKDocView widget instance.
f325b2
  */
f325b2
 SAL_DLLPUBLIC_EXPORT GtkWidget*
f325b2
-lok_doc_view_new (const char* pPath)
f325b2
+lok_doc_view_new (const gchar* pPath, GCancellable *cancellable, GError **error)
f325b2
 {
f325b2
-    return GTK_WIDGET (g_object_new(LOK_TYPE_DOC_VIEW, "lopath", pPath, NULL));
f325b2
+    return GTK_WIDGET (g_initable_new (LOK_TYPE_DOC_VIEW, cancellable, error, "lopath", pPath, NULL));
f325b2
 }
f325b2
 
f325b2
 /**
f325b2
@@ -1365,7 +1385,7 @@ lok_doc_view_new (const char* pPath)
f325b2
  * Returns: %TRUE if the document is loaded succesfully, %FALSE otherwise
f325b2
  */
f325b2
 SAL_DLLPUBLIC_EXPORT gboolean
f325b2
-lok_doc_view_open_document (LOKDocView* pDocView, char* pPath)
f325b2
+lok_doc_view_open_document (LOKDocView* pDocView, const gchar* pPath)
f325b2
 {
f325b2
     if ( pDocView->priv->m_pDocument )
f325b2
     {
f325b2
@@ -1374,8 +1394,7 @@ lok_doc_view_open_document (LOKDocView* pDocView, char* pPath)
f325b2
     }
f325b2
 
f325b2
     pDocView->priv->m_pOffice->pClass->registerCallback(pDocView->priv->m_pOffice, globalCallbackWorker, pDocView);
f325b2
-    pDocView->priv->m_pDocument = pDocView->priv->m_pOffice->pClass->documentLoad( pDocView->priv->m_pOffice,
f325b2
-                                                                   pPath );
f325b2
+    pDocView->priv->m_pDocument = pDocView->priv->m_pOffice->pClass->documentLoad( pDocView->priv->m_pOffice, pPath );
f325b2
     if ( !pDocView->priv->m_pDocument )
f325b2
     {
f325b2
         // FIXME: should have a GError parameter and populate it.
f325b2
-- 
f325b2
2.12.0
f325b2