diff --git a/frontend/ui/message/filemessagequeue.lua b/frontend/ui/message/filemessagequeue.lua index 6e8a8d557..eb88e2874 100644 --- a/frontend/ui/message/filemessagequeue.lua +++ b/frontend/ui/message/filemessagequeue.lua @@ -5,6 +5,7 @@ local Event = require("ui/event") local MessageQueue = require("ui/message/messagequeue") local dummy = require("ffi/zeromq_h") +local czmq = ffi.load("libs/libczmq.so.1") local filemq = ffi.load("libs/libfmq.so.1") local FileMessageQueue = MessageQueue:new{ @@ -14,11 +15,15 @@ local FileMessageQueue = MessageQueue:new{ function FileMessageQueue:init() if self.client ~= nil then - self.fmq_recv = filemq.fmq_client_recv_nowait + self.fmq_recv = filemq.fmq_client_recv self.filemq = self.client + self.poller = czmq.zpoller_new(filemq.fmq_client_handle(self.client), nil) elseif self.server ~= nil then - self.fmq_recv = filemq.fmq_server_recv_nowait + -- TODO: currently fmq_server_recv API is not available + --self.fmq_recv = filemq.fmq_server_recv self.filemq = self.server + -- TODO: currently fmq_server_handle API is not available + --self.poller = czmq.zpoller_new(filemq.fmq_server_handle(self.server), nil) end end @@ -31,13 +36,18 @@ function FileMessageQueue:stop() DEBUG("stop filemq server") filemq.fmq_server_destroy(ffi.new('fmq_server_t *[1]', self.server)) end + if self.poller ~= nil then + czmq.zpoller_destroy(ffi.new('zpoller_t *[1]', self.poller)) + end end function FileMessageQueue:waitEvent() - local msg = self.fmq_recv(self.filemq) - while msg ~= nil do - table.insert(self.messages, msg) - msg = self.fmq_recv(self.filemq) + if not self.poller then return end + if czmq.zpoller_wait(self.poller, 0) ~= nil then + local msg = self.fmq_recv(self.filemq) + if msg ~= nil then + table.insert(self.messages, msg) + end end return self:handleZMsgs(self.messages) end diff --git a/frontend/ui/message/messagequeue.lua b/frontend/ui/message/messagequeue.lua index beafc38b1..0d3a06065 100644 --- a/frontend/ui/message/messagequeue.lua +++ b/frontend/ui/message/messagequeue.lua @@ -67,7 +67,7 @@ function MessageQueue:handleZMsgs(messages) local message_size = czmq.zmsg_size(messages[1]) local command = pop_string() DEBUG("ØMQ message", command) - if command == "ENTER" and #messages >= 4 then + if command == "ENTER" then local id = pop_string() local name = pop_string() local header = pop_header() diff --git a/frontend/ui/message/zyremessagequeue.lua b/frontend/ui/message/zyremessagequeue.lua index 5c0fa07c5..3f2d988b5 100644 --- a/frontend/ui/message/zyremessagequeue.lua +++ b/frontend/ui/message/zyremessagequeue.lua @@ -5,6 +5,7 @@ local Event = require("ui/event") local MessageQueue = require("ui/message/messagequeue") local dummy = require("ffi/zeromq_h") +local czmq = ffi.load("libs/libczmq.so.1") local zyre = ffi.load("libs/libzyre.so.1") local ZyreMessageQueue = MessageQueue:new{ @@ -13,12 +14,15 @@ local ZyreMessageQueue = MessageQueue:new{ function ZyreMessageQueue:start() self.node = zyre.zyre_new() + self.poller = czmq.zpoller_new(zyre.zyre_socket(self.node), nil) for key, value in pairs(self.header) do zyre.zyre_set_header(self.node, key, value) end - zyre.zyre_set_verbose(self.node) + --zyre.zyre_set_verbose(self.node) + zyre.zyre_set_interface(self.node, "wlan0") zyre.zyre_start(self.node) zyre.zyre_join(self.node, "GLOBAL") + --zyre.zyre_dump(self.node) end function ZyreMessageQueue:stop() @@ -27,13 +31,17 @@ function ZyreMessageQueue:stop() zyre.zyre_stop(self.node) zyre.zyre_destroy(ffi.new('zyre_t *[1]', self.node)) end + if self.poller ~= nil then + czmq.zpoller_destroy(ffi.new('zpoller_t *[1]', self.poller)) + end end function ZyreMessageQueue:waitEvent() - local msg = zyre.zyre_recv_nowait(self.node) - while msg ~= nil do - table.insert(self.messages, msg) - msg = zyre.zyre_recv_nowait(self.node) + if czmq.zpoller_wait(self.poller, 0) ~= nil then + local msg = zyre.zyre_recv(self.node) + if msg ~= nil then + table.insert(self.messages, msg) + end end return self:handleZMsgs(self.messages) end diff --git a/frontend/ui/uimanager.lua b/frontend/ui/uimanager.lua index 7b82c8252..ac6027e9b 100644 --- a/frontend/ui/uimanager.lua +++ b/frontend/ui/uimanager.lua @@ -317,7 +317,7 @@ function UIManager:run() if #self._zeromqs > 0 then -- pending message queue, wait 100ms for input input_event = Input:waitEvent(1000*100) - if input_event and input_event.handler == "onInputError" then + if not input_event or input_event.handler == "onInputError" then for _, zeromq in ipairs(self._zeromqs) do input_event = zeromq:waitEvent() if input_event then break end diff --git a/kindle/koreader.sh b/kindle/koreader.sh index e6aa5463c..99ec213d2 100755 --- a/kindle/koreader.sh +++ b/kindle/koreader.sh @@ -33,6 +33,10 @@ export TESSDATA_PREFIX="data" # export dict directory export STARDICT_DATA_DIR="data/dict" +# accept input ports for zsync plugin +iptables -A INPUT -i wlan0 -p udp --dport 5670 -j ACCEPT +iptables -A INPUT -i wlan0 -p tcp --dport 49152:49162 -j ACCEPT + # bind-mount system fonts if ! grep /mnt/us/koreader/fonts/host /proc/mounts ; then mount -o bind /usr/java/lib/fonts /mnt/us/koreader/fonts/host diff --git a/kobo/koreader.sh b/kobo/koreader.sh index 236431d0b..1b9777b42 100755 --- a/kobo/koreader.sh +++ b/kobo/koreader.sh @@ -10,10 +10,14 @@ export TESSDATA_PREFIX="data" # export dict directory export STARDICT_DATA_DIR="data/dict" +# accept input ports for zsync plugin +iptables -A INPUT -i wlan0 -p udp --dport 5670 -j ACCEPT +iptables -A INPUT -i wlan0 -p tcp --dport 49152:49162 -j ACCEPT + # exit from nickel killall nickel killall hindenburg - + # finally call the launcher ./reader.lua /mnt/onboard 2> crash.log diff --git a/koreader-base b/koreader-base index 7108ec4fd..a276f2fde 160000 --- a/koreader-base +++ b/koreader-base @@ -1 +1 @@ -Subproject commit 7108ec4fd145d32d7abe32c25f5811001f5f570c +Subproject commit a276f2fde1fb118f3104b10077fb8a38f2855120 diff --git a/plugins/zsync.koplugin/main.lua b/plugins/zsync.koplugin/main.lua index 544c18dcf..5691047a3 100644 --- a/plugins/zsync.koplugin/main.lua +++ b/plugins/zsync.koplugin/main.lua @@ -300,12 +300,14 @@ end function ZSync:subscribe() DEBUG("subscribe documents") + self.received = {} self.inbox_chooser = InboxChooser:new{zsync = self} UIManager:show(self.inbox_chooser) end function ZSync:unsubscribe() DEBUG("ZSync unsubscribe") + self.received = {} self:stopFileMQ() self:stopZyreMQ() end @@ -329,10 +331,13 @@ function ZSync:onZyreEnter(id, name, header, endpoint) end function ZSync:onFileDeliver(filename, fullname) + -- sometimes several FileDelever msgs are sent from filemq + if self.received[filename] then return end UIManager:show(InfoMessage:new{ text = _("Received file:") .. "\n" .. filename, timeout = 1, }) + self.received[filename] = true end --[[