summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Fergeau <cfergeau@redhat.com>2013-06-26 10:47:16 +0200
committerChristophe Fergeau <cfergeau@redhat.com>2013-06-28 16:44:50 +0200
commita63c691b2f1d1dd4d212b27fea0534f2481ebcc8 (patch)
tree164bf03be3d7da1c8873cb37e0f5acc223e79a56
parent2b363686aa1cbfa2d778a16b813472f1bf309cbf (diff)
downloadlibrest-a63c691b2f1d1dd4d212b27fea0534f2481ebcc8.tar.gz
Fix compilation with older glibs
configure.ac requires glib 2.24, but librest is making use of glib functions that were added in later releases (g_clear_object, g_simple_async_report_take_gerror_in_idle, ...). This commit adds reimplementation of these functions which will be used when an older glib is present at build time. glib-compat.[ch] come from spice-gtk. https://bugzilla.gnome.org/show_bug.cgi?id=703103
-rw-r--r--rest/Makefile.am2
-rw-r--r--rest/glib-compat.c105
-rw-r--r--rest/glib-compat.h53
-rw-r--r--rest/rest-private.h1
-rw-r--r--rest/rest-proxy-auth.c1
5 files changed, 162 insertions, 0 deletions
diff --git a/rest/Makefile.am b/rest/Makefile.am
index 69e7f5b..f33fcf7 100644
--- a/rest/Makefile.am
+++ b/rest/Makefile.am
@@ -3,6 +3,8 @@ CLEANFILES =
# For some reason I can't use $(librest_@API_VERSION@_la_SOURCES) in
# test_runner_SOURCES, so we have to do this
lib_sources = \
+ glib-compat.h \
+ glib-compat.c \
rest-param.c \
rest-params.c \
rest-proxy.c \
diff --git a/rest/glib-compat.c b/rest/glib-compat.c
new file mode 100644
index 0000000..01e2c9a
--- /dev/null
+++ b/rest/glib-compat.c
@@ -0,0 +1,105 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "glib-compat.h"
+
+#if !GLIB_CHECK_VERSION(2,28,0)
+/**
+ * g_simple_async_result_new_take_error: (skip)
+ * @source_object: (allow-none): a #GObject, or %NULL
+ * @callback: (scope async): a #GAsyncReadyCallback
+ * @user_data: (closure): user data passed to @callback
+ * @error: a #GError
+ *
+ * Creates a #GSimpleAsyncResult from an error condition, and takes over the
+ * caller's ownership of @error, so the caller does not need to free it anymore.
+ *
+ * Returns: a #GSimpleAsyncResult
+ *
+ * Since: 2.28
+ **/
+G_GNUC_INTERNAL GSimpleAsyncResult *
+g_simple_async_result_new_take_error (GObject *source_object,
+ GAsyncReadyCallback callback,
+ gpointer user_data,
+ GError *error)
+{
+ GSimpleAsyncResult *simple;
+
+ g_return_val_if_fail (!source_object || G_IS_OBJECT (source_object), NULL);
+
+ simple = g_simple_async_result_new (source_object,
+ callback,
+ user_data, NULL);
+ g_simple_async_result_take_error (simple, error);
+
+ return simple;
+}
+
+/**
+ * spice_simple_async_result_take_error: (skip)
+ * @simple: a #GSimpleAsyncResult
+ * @error: a #GError
+ *
+ * Sets the result from @error, and takes over the caller's ownership
+ * of @error, so the caller does not need to free it any more.
+ *
+ * Since: 2.28
+ **/
+G_GNUC_INTERNAL void
+g_simple_async_result_take_error (GSimpleAsyncResult *simple,
+ GError *error)
+{
+ /* this code is different from upstream */
+ /* we can't avoid extra copy/free, since the simple struct is
+ opaque */
+ g_simple_async_result_set_from_error (simple, error);
+ g_error_free (error);
+}
+
+/**
+ * g_simple_async_report_take_gerror_in_idle: (skip)
+ * @object: (allow-none): a #GObject, or %NULL
+ * @callback: a #GAsyncReadyCallback.
+ * @user_data: user data passed to @callback.
+ * @error: the #GError to report
+ *
+ * Reports an error in an idle function. Similar to
+ * g_simple_async_report_gerror_in_idle(), but takes over the caller's
+ * ownership of @error, so the caller does not have to free it any more.
+ *
+ * Since: 2.28
+ **/
+G_GNUC_INTERNAL void
+g_simple_async_report_take_gerror_in_idle (GObject *object,
+ GAsyncReadyCallback callback,
+ gpointer user_data,
+ GError *error)
+{
+ GSimpleAsyncResult *simple;
+
+ g_return_if_fail (!object || G_IS_OBJECT (object));
+ g_return_if_fail (error != NULL);
+
+ simple = g_simple_async_result_new_take_error (object,
+ callback,
+ user_data,
+ error);
+ g_simple_async_result_complete_in_idle (simple);
+ g_object_unref (simple);
+}
+
+#endif /* 2.28 */
diff --git a/rest/glib-compat.h b/rest/glib-compat.h
new file mode 100644
index 0000000..9ce59e1
--- /dev/null
+++ b/rest/glib-compat.h
@@ -0,0 +1,53 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#ifndef GLIB_COMPAT_H
+#define GLIB_COMPAT_H
+
+#include <glib-object.h>
+#include <gio/gio.h>
+
+#if !GLIB_CHECK_VERSION(2,28,0)
+#define g_clear_object(object_ptr) \
+ G_STMT_START { \
+ /* Only one access, please */ \
+ gpointer *_p = (gpointer) (object_ptr); \
+ gpointer _o; \
+ \
+ do \
+ _o = g_atomic_pointer_get (_p); \
+ while G_UNLIKELY (!g_atomic_pointer_compare_and_exchange (_p, _o, NULL));\
+ \
+ if (_o) \
+ g_object_unref (_o); \
+ } G_STMT_END
+
+GSimpleAsyncResult *
+g_simple_async_result_new_take_error (GObject *source_object,
+ GAsyncReadyCallback callback,
+ gpointer user_data,
+ GError *error);
+void
+g_simple_async_result_take_error(GSimpleAsyncResult *simple,
+ GError *error);
+void
+g_simple_async_report_take_gerror_in_idle (GObject *object,
+ GAsyncReadyCallback callback,
+ gpointer user_data,
+ GError *error);
+
+#endif /* glib 2.28 */
+
+#endif /* GLIB_COMPAT_H */
diff --git a/rest/rest-private.h b/rest/rest-private.h
index b0f1fe4..1a78f80 100644
--- a/rest/rest-private.h
+++ b/rest/rest-private.h
@@ -28,6 +28,7 @@
#include <rest/rest-proxy-call.h>
#include <rest/rest-xml-node.h>
#include <libsoup/soup.h>
+#include "glib-compat.h"
G_BEGIN_DECLS
diff --git a/rest/rest-proxy-auth.c b/rest/rest-proxy-auth.c
index 3d808d4..86cd197 100644
--- a/rest/rest-proxy-auth.c
+++ b/rest/rest-proxy-auth.c
@@ -22,6 +22,7 @@
#include <rest/rest-proxy-auth.h>
#include <rest/rest-proxy-auth-private.h>
+#include "rest-private.h"
G_DEFINE_TYPE (RestProxyAuth, rest_proxy_auth, G_TYPE_OBJECT)