diff options
author | Jo-Philipp Wich <jow@openwrt.org> | 2008-09-23 13:30:07 +0000 |
---|---|---|
committer | Jo-Philipp Wich <jow@openwrt.org> | 2008-09-23 13:30:07 +0000 |
commit | c0b2cda50edbe5bd39e47f776b2bc73e3d175bc4 (patch) | |
tree | 83054a28d952b42353239624c8b1fa8f24453fbc /libs/cbi/luasrc | |
parent | 251502e2cd0c47b426cfd4d4f183128ca528b91b (diff) |
* luci/libs: move upload dispatching from dispatcher to cbi.load()
Diffstat (limited to 'libs/cbi/luasrc')
-rw-r--r-- | libs/cbi/luasrc/cbi.lua | 55 |
1 files changed, 54 insertions, 1 deletions
diff --git a/libs/cbi/luasrc/cbi.lua b/libs/cbi/luasrc/cbi.lua index 8cde0a1777..296ec815ff 100644 --- a/libs/cbi/luasrc/cbi.lua +++ b/libs/cbi/luasrc/cbi.lua @@ -52,6 +52,7 @@ function load(cbimap, ...) require("luci.config") require("luci.util") + local upldir = "/lib/uci/upload/" local cbidir = luci.util.libpath() .. "/model/cbi/" local func, err = loadfile(cbimap) or loadfile(cbidir..cbimap..".lua") assert(func, err) @@ -70,7 +71,9 @@ function load(cbimap, ...) return rawget(tbl, key) or _M[key] or _G[key] end})) - local maps = {func()} + local maps = { func() } + local uploads = { } + local has_upload = false for i, map in ipairs(maps) do if not instanceof(map, Node) then @@ -78,9 +81,59 @@ function load(cbimap, ...) return nil else map:prepare() + if map.upload_fields then + has_upload = true + for _, field in ipairs(map.upload_fields) do + uploads[ + field.config .. '.' .. + field.section.sectiontype .. '.' .. + field.option + ] = true + end + end end end + if has_upload then + local uci = luci.model.uci.cursor() + local prm = luci.http.context.request.message.params + local fd, cbid + + luci.http.setfilehandler( + function( field, chunk, eof ) + if not field then return end + if field.name and not cbid then + local c, s, o = field.name:gmatch( + "cbid%.([^%.]+)%.([^%.]+)%.([^%.]+)" + )() + + if c and s and o then + local t = uci:get( c, s ) + if t and uploads[c.."."..t.."."..o] then + local path = upldir .. field.name + fd = io.open(path, "w") + if fd then + cbid = field.name + prm[cbid] = path + end + end + end + end + + if field.name == cbid and fd then + io.stderr:write("*** CHUNK:"..tostring(#chunk).." ***\n") + fd:write(chunk) + end + + if eof and fd then + fd:close() + fd = nil + cbid = nil + end + end + ) + end + return maps end |