load "iupe-hexview.lua" load "iupe-hexview-toolbox.lua" dalosp.hexview = { activate = function (self) self.extra.hvdlg:show() end, input_change = function (self, ind) local extra = self.extra local hv = extra.hv local h = self:get_linked_input(ind) if not h then self.color = cd.YELLOW hv:updatehandle(nil) self.dcanvas:draw() return end if not h:canread() or not h:canseek() then self.color = cd.RED hv:updatehandle(nil) self.dcanvas:draw() return end self.color = cd.GREEN for i = 1, 12 do self:set_houtput(nil, i) self.oldcursors[i] = -1 end hv:updatehandle(h) self.dcanvas:draw() end, configure = function (self) end, output_change = function (self, ind) self.watchees[ind] = self.outputs[ind] and true or false end, update_houtput = function (self, ind, cursor) local h = self:get_linked_input(1) local maxsixe = h:getsize() if h and self.watchees[ind] then if cursor < maxsize then self:set_houtput(nil, ind) end local obj = { h = h, hvo = self, ind = ind, origin = cursor, offset = 0, size = maxsize - cursor, canread = function (self) return true end, canwrite = function (self) return false end, canseek = function (self) return true end, canwatch = function (self) return self.h:canwatch() end, getname = function (self) return self.hvo.name .. ":" .. self.ind end, tell = function (self) return self.offset end, getsize = function (self) return self.size end, getmodif = function (self) return self.hvo:getmodif() end, flush = function (self) return self.hvo:flush() end, seek = function (self, offset, wheel) if wheel == SEEK_SET then self.offset = offset elseif wheel == SEEK_CUR then self.offset = self.offset + offset elseif wheel == SEEK_END then self.offset = self.size + offset else error "Unknown wheel" end if self.offset < 0 then self.offset = 0 end if self.offset >= self.size then self.offset = self.size end self.h:seek(self.offset + self.origin) return self.offset end, read = function (self, userdata, count) count = math.min(count, self.size - self.offset) if count == 0 then if self.got_eof then self.lh:close() end self.got_eof = true return 0 end self.got_eof = false local r = self.h:read(count, userdata) self.offset = self.offset + r if r == 0 then self.got_eof = true end return r end, } local newh = HandleLua(obj) obj.lh = newh self:set_houtput(newh, ind) end end, dalos_hv_cb = function (self, hv, reset) local m for i = 1, 10 do m = hv.markers[i] if self.oldcursors[i] ~= m then self:update_houtput(i, m) self.oldcursors[i] = m end end m = hv.kcursor if self.oldcursors[11] ~= m then self:update_houtput(11, m) self.oldcursors[11] = m end m = hv.mcursor if self.oldcursors[12] ~= m then self:update_houtput(12, m) self.oldcursors[12] = m end end, create = function (d, tab) tab.otype = dalos.objtype.LUA_FILTER tab.activate = dalosp.hexview.activate tab.input_change = dalosp.hexview.input_change tab.output_change = dalosp.hexview.output_change tab.configure = dalosp.hexview.configure tab.ninputs = 1 tab.noutputs = 12 tab.default_name = "Hexview" local extra = { } local obj = dalos.object(d, tab, extra) local hv = iupe.hexview { } local hvtb = iupe.hexview_toolbox { hexview = hv } local hvdlg = iup.dialog { iup.hbox { iup.frame { hv }, iup.sbox { direction = "WEST", hvtb } }, title = obj.name } extra.hv = hv extra.hvtb = hvtb extra.hvdlg = hvdlg obj.oldcursors = { } obj.watchees = { } obj.update_houtput = dalosp.hexview.update_houtput for i = 1, 12 do obj.oldcursors[i] = -1 end hv:registercb(dalosp.hexview.dalos_hv_cb, obj) return obj end, } dalos.hexview = dalosp.hexview.create dalos:register_obj("Hexview", dalos.hexview)