[grilo-plugins] lua-factory: use wrapper for lua_pcall



commit 311600c07463721c61b639a510fddaa18574ef95
Author: Victor Toso <me victortoso com>
Date:   Mon Mar 7 22:54:26 2016 +0100

    lua-factory: use wrapper for lua_pcall
    
    Due improvements later in the patch series, it becomes useful to have
    such wrapper. We always call the lua_gc after lua_pcall as current logic
    flow expects it.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=763046

 src/lua-factory/Makefile.am                  |    1 +
 src/lua-factory/grl-lua-common.h             |    3 +
 src/lua-factory/grl-lua-factory.c            |   50 +++++++++++++------------
 src/lua-factory/grl-lua-library-operations.c |   52 ++++++++++++++++++++++++++
 src/lua-factory/grl-lua-library.c            |   18 +++++----
 5 files changed, 92 insertions(+), 32 deletions(-)
---
diff --git a/src/lua-factory/Makefile.am b/src/lua-factory/Makefile.am
index fa64ef4..5092834 100644
--- a/src/lua-factory/Makefile.am
+++ b/src/lua-factory/Makefile.am
@@ -30,6 +30,7 @@ libgrlluafactory_la_SOURCES =                                 \
        grl-lua-factory.h                                       \
        grl-lua-library.c                                       \
        grl-lua-library.h                                       \
+       grl-lua-library-operations.c                            \
        grl-lua-common.h                                        \
        luafactoryresources.c                                   \
        luafactoryresources.h                                   \
diff --git a/src/lua-factory/grl-lua-common.h b/src/lua-factory/grl-lua-common.h
index 603c139..fa5c12e 100644
--- a/src/lua-factory/grl-lua-common.h
+++ b/src/lua-factory/grl-lua-common.h
@@ -86,4 +86,7 @@ void grl_lua_library_push_grl_media (lua_State *L, GrlMedia *media);
 void grl_lua_library_push_grl_options (lua_State *L, guint operation_id, GrlOperationOptions *options, GList 
*keys);
 void grl_lua_library_push_grl_callback (lua_State *L, OperationSpec *os);
 
+/* grl-lua-library-operations */
+gboolean grl_lua_operations_pcall (lua_State *L, gint nargs, OperationSpec *os, GError **err);
+
 #endif /* _GRL_LUA_LIBRARY_COMMON_H_ */
diff --git a/src/lua-factory/grl-lua-factory.c b/src/lua-factory/grl-lua-factory.c
index 193008c..1cf2978 100644
--- a/src/lua-factory/grl-lua-factory.c
+++ b/src/lua-factory/grl-lua-factory.c
@@ -596,6 +596,8 @@ lua_plugin_source_init (GrlLuaFactorySource *lua_source)
     lua_pushnil (L);
   }
 
+  /* FIXME in order to supported async calls we should use
+   * grl_lua_operations_pcall */
   if (lua_pcall (L, 1, 1, 0)) {
     GRL_WARNING ("calling grl_source_init function failed: %s",
                  lua_tolstring (L, -1, NULL));
@@ -1507,6 +1509,7 @@ grl_lua_factory_source_search (GrlSource *source,
   lua_State *L = lua_source->priv->l_st;
   OperationSpec *os = NULL;
   const gchar *text = NULL;
+  GError *err = NULL;
 
   GRL_DEBUG ("grl_lua_factory_source_search");
 
@@ -1525,13 +1528,12 @@ grl_lua_factory_source_search (GrlSource *source,
   lua_pushstring (L, text);
   grl_lua_library_push_grl_options (L, ss->operation_id, ss->options, ss->keys);
   grl_lua_library_push_grl_callback (L, os);
-
-  if (lua_pcall (L, 3, 0, 0)) {
-    GRL_WARNING ("%s '%s'", "calling search function fail:",
-                 lua_tolstring (L, -1, NULL));
-    lua_pop (L, 1);
+  if (!grl_lua_operations_pcall (L, 3, os, &err)) {
+    if (err != NULL) {
+      GRL_WARNING ("calling search function failed: %s", err->message);
+      g_error_free (err);
+    }
   }
-  lua_gc (L, LUA_GCCOLLECT, 0);
 }
 
 static void
@@ -1541,6 +1543,7 @@ grl_lua_factory_source_browse (GrlSource *source,
   GrlLuaFactorySource *lua_source = GRL_LUA_FACTORY_SOURCE (source);
   lua_State *L = lua_source->priv->l_st;
   OperationSpec *os = NULL;
+  GError *err = NULL;
 
   GRL_DEBUG ("grl_lua_factory_source_browse");
 
@@ -1557,13 +1560,12 @@ grl_lua_factory_source_browse (GrlSource *source,
   grl_lua_library_push_grl_media (L, bs->container);
   grl_lua_library_push_grl_options (L, bs->operation_id, bs->options, bs->keys);
   grl_lua_library_push_grl_callback (L, os);
-
-  if (lua_pcall (L, 3, 0, 0)) {
-    GRL_WARNING ("%s '%s'", "calling browse function fail:",
-                 lua_tolstring (L, -1, NULL));
-    lua_pop (L, 1);
+  if (!grl_lua_operations_pcall (L, 3, os, &err)) {
+    if (err != NULL) {
+      GRL_WARNING ("calling browse function failed: %s", err->message);
+      g_error_free (err);
+    }
   }
-  lua_gc (L, LUA_GCCOLLECT, 0);
 }
 
 static void
@@ -1574,6 +1576,7 @@ grl_lua_factory_source_query (GrlSource *source,
   lua_State *L = lua_source->priv->l_st;
   OperationSpec *os = NULL;
   const gchar *query = NULL;
+  GError *err = NULL;
 
   GRL_DEBUG ("grl_lua_factory_source_query");
 
@@ -1592,13 +1595,12 @@ grl_lua_factory_source_query (GrlSource *source,
   lua_pushstring (L, query);
   grl_lua_library_push_grl_options (L, qs->operation_id, qs->options, qs->keys);
   grl_lua_library_push_grl_callback (L, os);
-
-  if (lua_pcall (L, 3, 0, 0)) {
-    GRL_WARNING ("%s '%s'", "calling query function fail:",
-                 lua_tolstring (L, -1, NULL));
-    lua_pop (L, 1);
+  if (!grl_lua_operations_pcall (L, 3, os, &err)) {
+    if (err != NULL) {
+      GRL_WARNING ("calling query function failed: %s", err->message);
+      g_error_free (err);
+    }
   }
-  lua_gc (L, LUA_GCCOLLECT, 0);
 }
 
 static void
@@ -1608,6 +1610,7 @@ grl_lua_factory_source_resolve (GrlSource *source,
   GrlLuaFactorySource *lua_source = GRL_LUA_FACTORY_SOURCE (source);
   lua_State *L = lua_source->priv->l_st;
   OperationSpec *os = NULL;
+  GError *err = NULL;
 
   GRL_DEBUG ("grl_lua_factory_source_resolve");
 
@@ -1625,13 +1628,12 @@ grl_lua_factory_source_resolve (GrlSource *source,
   grl_lua_library_push_grl_media (L, rs->media);
   grl_lua_library_push_grl_options (L, rs->operation_id, rs->options, rs->keys);
   grl_lua_library_push_grl_callback (L, os);
-
-  if (lua_pcall (L, 3, 0, 0)) {
-    GRL_WARNING ("%s '%s'", "calling resolve function fail:",
-                 lua_tolstring (L, -1, NULL));
-    lua_pop (L, 1);
+  if (!grl_lua_operations_pcall (L, 3, os, &err)) {
+    if (err != NULL) {
+      GRL_WARNING ("calling resolve function failed: %s", err->message);
+      g_error_free (err);
+    }
   }
-  lua_gc (L, LUA_GCCOLLECT, 0);
 }
 
 static gboolean
diff --git a/src/lua-factory/grl-lua-library-operations.c b/src/lua-factory/grl-lua-library-operations.c
new file mode 100644
index 0000000..031b624
--- /dev/null
+++ b/src/lua-factory/grl-lua-library-operations.c
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2016 Victor Toso.
+ *
+ * Contact: Victor Toso <me victortoso com>
+ *
+ * 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; 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ */
+
+#include "config.h"
+#include "grl-lua-common.h"
+
+/* =========================================================================
+ * Exported functions ======================================================
+ * ========================================================================= */
+
+/*
+ * This is a wrapper to do execute the lua_pcall and all internals that might
+ * be necessary to Lua-Library before calling the Lua function. The stack
+ * requirements are the same of lua_pcall, function and arguments in expected
+ * order.
+ */
+gboolean
+grl_lua_operations_pcall (lua_State *L,
+                          gint nargs,
+                          OperationSpec *os,
+                          GError **err)
+{
+  if (lua_pcall (L, nargs, 0, 0)) {
+    gint error_code = (os) ? os->error_code : G_IO_ERROR_CANCELLED;
+    *err = g_error_new_literal (GRL_CORE_ERROR,
+                                error_code,
+                                lua_tolstring (L, -1, NULL));
+    lua_pop (L, 1);
+  }
+
+  lua_gc (L, LUA_GCCOLLECT, 0);
+  return (*err == NULL);
+}
diff --git a/src/lua-factory/grl-lua-library.c b/src/lua-factory/grl-lua-library.c
index a03a995..9b66da8 100644
--- a/src/lua-factory/grl-lua-library.c
+++ b/src/lua-factory/grl-lua-library.c
@@ -524,14 +524,15 @@ grl_util_fetch_done (GObject *source_object,
   /* get userdata from the registry */
   lua_rawgeti (L, LUA_REGISTRYINDEX, fo->lua_userdata);
 
-  if (lua_pcall (L, 2, 0, 0)) {
-    GRL_WARNING ("%s '%s'", "calling source callback function fail",
-                 lua_tolstring (L, -1, NULL));
+  if (!grl_lua_operations_pcall (L, 2, NULL, &err)) {
+    if (err != NULL) {
+      GRL_WARNING ("calling source callback function fail: %s", err->message);
+      g_error_free (err);
+    }
   }
 
   luaL_unref (L, LUA_REGISTRYINDEX, fo->lua_userdata);
   luaL_unref (L, LUA_REGISTRYINDEX, fo->lua_callback);
-  lua_gc (L, LUA_GCCOLLECT, 0);
 
   for (i = 0; i < fo->num_urls; i++)
     g_free (fo->results[i]);
@@ -660,14 +661,15 @@ grl_util_unzip_done (GObject *source_object,
   /* get userdata from the registry */
   lua_rawgeti (L, LUA_REGISTRYINDEX, uo->lua_userdata);
 
-  if (lua_pcall (L, 2, 0, 0)) {
-    GRL_WARNING ("%s '%s'", "calling source callback function fail",
-                 lua_tolstring (L, -1, NULL));
+  if (!grl_lua_operations_pcall (L, 2, NULL, &err)) {
+    if (err != NULL) {
+      GRL_WARNING ("calling source callback function fail: %s", err->message);
+      g_error_free (err);
+    }
   }
 
   luaL_unref (L, LUA_REGISTRYINDEX, uo->lua_userdata);
   luaL_unref (L, LUA_REGISTRYINDEX, uo->lua_callback);
-  lua_gc (L, LUA_GCCOLLECT, 0);
 
   g_strfreev (results);
 


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