X-Git-Url: http://git.openwrt.org/?p=project%2Fluci.git;a=blobdiff_plain;f=src%2Fffluci%2Fcbi.lua;h=149c1d70fae4b071079cb2ad5c78fd1601d28fcc;hp=fc8b1aed3d54393a29fef169d0c0538ec01d34dc;hb=e9461f898cdd8f740accdf8c0c99dd1cfe48d1ea;hpb=f41539e5493dc8ba3059730f77a6fbb7595aae5a diff --git a/src/ffluci/cbi.lua b/src/ffluci/cbi.lua index fc8b1aed3d..149c1d70fa 100644 --- a/src/ffluci/cbi.lua +++ b/src/ffluci/cbi.lua @@ -27,6 +27,9 @@ limitations under the License. module("ffluci.cbi", package.seeall) require("ffluci.template") require("ffluci.util") +require("ffluci.http") +require("ffluci.model.uci") +local Template = ffluci.template.Template local class = ffluci.util.class local instanceof = ffluci.util.instanceof @@ -45,6 +48,16 @@ function Node.append(self, obj) table.insert(self.children, obj) end +function Node.parse(self) + for k, child in ipairs(self.children) do + child:parse() + end +end + +function Node.render(self) + ffluci.template.render(self.template) +end + --[[ Map - A map describing a configuration file @@ -57,37 +70,39 @@ function Map.__init__(self, config, ...) self.template = "cbi/map" end -function Map.render(self) - ffluci.template.render(self.template) -end - function Map.section(self, class, ...) - if instanceof(class, AbstractClass) then - local obj = class(...) - obj.map = self - table.insert(self.children, obj) + if instanceof(class, AbstractSection) then + local obj = class(...) + obj.map = self + obj.config = self.config + self:append(obj) return obj else error("class must be a descendent of AbstractSection") end end +function Map.read(self) + self.ucidata = self.ucidata or ffluci.model.uci.show(self.config) + return self.ucidata +end --[[ AbstractSection ]]-- AbstractSection = class(Node) -function AbstractSection.__init__(self, ...) +function AbstractSection.__init__(self, sectiontype, ...) Node.__init__(self, ...) + self.sectiontype = sectiontype end function AbstractSection.option(self, class, ...) if instanceof(class, AbstractValue) then - local obj = class(...) - obj.section = self - obj.map = self.map - table.insert(self.children, obj) + local obj = class(...) + obj.map = self.map + obj.config = self.config + self:append(obj) return obj else error("class must be a descendent of AbstractValue") @@ -103,8 +118,15 @@ NamedSection = class(AbstractSection) function NamedSection.__init__(self, section, ...) AbstractSection.__init__(self, ...) - self.section = section self.template = "cbi/nsection" + + self.section = section +end + +function NamedSection.option(self, ...) + local obj = AbstractSection.option(self, ...) + obj.section = self.section + return obj end @@ -116,9 +138,8 @@ TypedSection - A (set of) configuration section(s) defined by the type ]]-- TypedSection = class(AbstractSection) -function TypedSection.__init__(self, sectiontype, ...) +function TypedSection.__init__(self, ...) AbstractSection.__init__(self, ...) - self.sectiontype = sectiontype self.template = "cbi/tsection" self.addremove = true @@ -130,8 +151,9 @@ end --[[ AbstractValue - An abstract Value Type null: Value can be empty - valid: A table with valid names or a function returning nil if invalid + valid: A function returning the value if it is valid otherwise nil depends: A table of option => value pairs of which one must be true + default: The default value ]]-- AbstractValue = class(Node) @@ -139,14 +161,32 @@ function AbstractValue.__init__(self, option, ...) Node.__init__(self, ...) self.option = option - self.null = true self.valid = nil self.depends = nil + self.default = nil +end + + +function AbstractValue.formvalue(self) + local key = "uci."..self.map.config.."."..self.section.."."..self.option + return ffluci.http.formvalue(key) +end + +function AbstractValue.ucivalue(self) + return self.map.read()[self.section][self.option] end - + +function AbstractValue.validate(self, value) + return ffluci.util.validate(value, nil, nil, self.valid) +end + +function AbstractValue.write(self, value) + ffluci.model.uci.set(self.config, self.section, self.option, value) +end + --[[ -Value - A one-line value +Value - A one-line value maxlength: The maximum length isnumber: The value must be a valid (floating point) number isinteger: The value must be a valid integer @@ -164,11 +204,18 @@ end --[[ -Boolean - A simple boolean value +ListValue - A one-line value predefined in a list ]]-- -Boolean = class(AbstractValue) +ListValue = class(AbstractValue) -function Boolean.__init__(self, ...) +function ListValue.__init__(self, ...) AbstractValue.__init__(self, ...) - self.template = "cbi/boolean" + self.template = "cbi/lvalue" + + self.list = {} +end + +function ListValue.addValue(self, key, val) + val = val or key + self.list[key] = val end \ No newline at end of file