GAsyncInitable: fix subclassibility
authorDan Winship <danw@gnome.org>
Thu, 5 Jan 2012 18:04:37 +0000 (13:04 -0500)
committerDan Winship <danw@gnome.org>
Mon, 16 Jan 2012 14:42:50 +0000 (09:42 -0500)
If a class implements GAsyncInitable, and its parent also implements
it, then the subclass needs to call its parent's init_async() before
running its own. This was made more complicated by the fact that the
default init_finish() behavior was handled by the wrapper method
(which can't be used when making the super call) rather than the
default implementation itself. Fix that.

https://bugzilla.gnome.org/show_bug.cgi?id=667375

gio/gasyncinitable.c

index 0cfde8d..e2264e0 100644 (file)
@@ -294,7 +294,19 @@ g_async_initable_real_init_finish (GAsyncInitable  *initable,
                                   GAsyncResult    *res,
                                   GError         **error)
 {
-  return TRUE; /* Errors handled by base impl */
+  /* Although g_async_initable_init_finish() does this error handling
+   * as well, we do it here too, so that a class that reimplements
+   * GAsyncInitable can properly run its parent class's implementation
+   * by directly invoking its ->init_async() and ->init_finish().
+   */
+  if (G_IS_SIMPLE_ASYNC_RESULT (res))
+    {
+      GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
+      if (g_simple_async_result_propagate_error (simple, error))
+       return FALSE;
+    }
+
+  return TRUE;
 }
 
 /**