summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Kolesa <d.kolesa@samsung.com>2015-03-03 16:16:59 +0000
committerDaniel Kolesa <d.kolesa@samsung.com>2015-03-03 16:16:59 +0000
commitadbac89310e26920ac168ebecda557dcde9b3750 (patch)
treef5e1114eb7eac808b121b229b4750dbd45693586
parente55ecf6d4c830dc0a4c1d9612bd4f71e55043929 (diff)
downloadefl-adbac89310e26920ac168ebecda557dcde9b3750.tar.gz
elua: implement callback disconnect + better error handling
-rw-r--r--src/bindings/luajit/eo.lua43
1 files changed, 31 insertions, 12 deletions
diff --git a/src/bindings/luajit/eo.lua b/src/bindings/luajit/eo.lua
index 856de56ca6..9d15aa4661 100644
--- a/src/bindings/luajit/eo.lua
+++ b/src/bindings/luajit/eo.lua
@@ -133,15 +133,7 @@ local eo_classes = {}
local callbacks = {}
-local eo_event_cb_add, eo_event_cb_del, eo_event_del, eo_event_cb
-
-eo_event_cb_add = ffi.cast("Eo_Event_Cb", function(data, obj, desc, einfo)
- local acb = ffi.cast("Eo_Callback_Array_Item *", data)
-end)
-
-eo_event_cb_del = ffi.cast("Eo_Event_Cb", function(data, obj, desc, einfo)
- local dcb = ffi.cast("Eo_Callback_Array_Item *", data)
-end)
+local eo_event_del, eo_event_cb
eo_event_del = ffi.cast("Eo_Event_Cb", function(data, obj, desc, einfo)
end)
@@ -159,10 +151,9 @@ end)
local connect = function(self, ename, func, priority)
local ev = self.__events[ename]
if not ev then
- error("invalid event '" .. ename .. "'", 2)
+ return false, "attempt to connect an invalid event '" .. ename .. "'"
end
local cl = eo_classes["Eo_Base"]
- M.__do_start(self, cl)
-- add the callback to the respective array
local addr = eo_obj_addr_get(self)
local cbs = callbacks[addr]
@@ -172,13 +163,41 @@ local connect = function(self, ename, func, priority)
end
local cidx = #cbs + 1
cbs[cidx] = func
+ M.__do_start(self, cl)
eo.eo_event_callback_priority_add(ev, priority or 0,
eo_event_cb, ffi.cast("void *", cidx))
M.__do_end()
+ return true
end
local disconnect = function(self, ename, func)
- -- TODO: implement
+ local ev = self.__events[ename]
+ if not ev then
+ return false, "attempt to disconnect an invalid event '" .. ename .. "'"
+ end
+ local cl = eo_classes["Eo_Base"]
+ -- like connect, but the other way around
+ local addr = eo_obj_addr_get(self)
+ local cbs = callbacks[addr]
+ if not cbs then
+ return false
+ end
+ -- TODO: make a hash table for func-to-index conversions
+ local cidx = -1
+ for i = 1, #cbs do
+ if cbs[i] == func then
+ cidx = i
+ break
+ end
+ end
+ if cidx < 0 then
+ return false
+ end
+ cbs[cidx] = nil
+ M.__do_start(self, cl)
+ eo.eo_event_callback_del(ev, eo_event_cb, ffi.cast("void *", cidx))
+ M.__do_end()
+ return true
end
local init = function()