0.3->0.4
[prosody.git] / core / configmanager.lua
index cc7ffb7e46e541ebe24235f7065c523b0a5f1624..f04c557541c1c943484fb2c1b5e199676d49c32c 100644 (file)
@@ -1,5 +1,17 @@
+-- Prosody IM v0.4
+-- Copyright (C) 2008-2009 Matthew Wild
+-- Copyright (C) 2008-2009 Waqas Hussain
+-- 
+-- This project is MIT/X11 licensed. Please see the
+-- COPYING file in the source package for more information.
+--
+
+
 
 local _G = _G;
+local  setmetatable, loadfile, pcall, rawget, rawset, io, error, dofile, type = 
+               setmetatable, loadfile, pcall, rawget, rawset, io, error, dofile, type;
+
 module "configmanager"
 
 local parsers = {};
@@ -21,6 +33,10 @@ function section_mt(section_name)
                                                        end };
 end
 
+function getconfig()
+       return config;
+end
+
 function get(host, section, key)
        local sec = config[host][section];
        if sec then
@@ -45,15 +61,23 @@ function set(host, section, key, value)
 end
 
 function load(filename, format)
+       format = format or filename:match("%w+$");
+
        if parsers[format] and parsers[format].load then
-               local f = io.open(filename);
+               local f, err = io.open(filename);
                if f then 
-                       local ok, err = parsers[format](f:read("*a"));
+                       local ok, err = parsers[format].load(f:read("*a"));
                        f:close();
-                       return ok, err;
+                       return ok, "parser", err;
                end
+               return f, "file", err;
+       end
+
+       if not format then
+               return nil, "file", "no parser specified";
+       else
+               return nil, "file", "no parser for "..(format);
        end
-       return false, "no parser";
 end
 
 function save(filename, format)
@@ -65,21 +89,55 @@ function addparser(format, parser)
        end
 end
 
+-- Built-in Lua parser
 do
+       local loadstring, pcall, setmetatable = _G.loadstring, _G.pcall, _G.setmetatable;
+       local setfenv, rawget, tostring = _G.setfenv, _G.rawget, _G.tostring;
        parsers.lua = {};
        function parsers.lua.load(data)
-               local env = setmetatable({}, { __index = function (t, k)
-                                                                                       if k:match("^mod_") then
-                                                                                               return function (settings_table)
+               local env;
+               -- The ' = true' are needed so as not to set off __newindex when we assign the functions below
+               env = setmetatable({ Host = true; host = true; Component = true, component = true,
+                                                       Include = true, include = true, RunScript = dofile }, { __index = function (t, k)
+                                                                                               return rawget(_G, k) or
+                                                                                                               function (settings_table)
                                                                                                                        config[__currenthost or "*"][k] = settings_table;
                                                                                                                end;
-                                                                                       end
-                                                                                       return rawget(_G, k);
+                                                                               end,
+                                                               __newindex = function (t, k, v)
+                                                                                       set(env.__currenthost or "*", "core", k, v);
                                                                                end});
                
                function env.Host(name)
-                       env.__currenthost = name;
+                       rawset(env, "__currenthost", name);
+                       -- Needs at least one setting to logically exist :)
+                       set(name or "*", "core", "defined", true);
+               end
+               env.host = env.Host;
+               
+               function env.Component(name)
+                       return function (module)
+                                       if type(module) == "string" then
+                                               set(name, "core", "component_module", module);
+                                               -- Don't load the global modules by default
+                                               set(name, "core", "modules_enable", false);
+                                               rawset(env, "__currenthost", name);
+                                       end
+                               end
                end
+               env.component = env.Component;
+               
+               function env.Include(file)
+                       local f, err = io.open(file);
+                       if f then
+                               local data = f:read("*a");
+                               local ok, err = parsers.lua.load(data);
+                               if not ok then error(err:gsub("%[string.-%]", file), 0); end
+                       end
+                       if not f then error("Error loading included "..file..": "..err, 0); end
+                       return f, err;
+               end
+               env.include = env.Include;
                
                local chunk, err = loadstring(data);
                
@@ -95,11 +153,9 @@ do
                        return nil, err;
                end
                
-               
-               
                return true;
        end
        
 end
 
-return _M;
\ No newline at end of file
+return _M;