Merge 0.6->0.7
[prosody.git] / util / pluginloader.lua
1 -- Prosody IM
2 -- Copyright (C) 2008-2010 Matthew Wild
3 -- Copyright (C) 2008-2010 Waqas Hussain
4 -- 
5 -- This project is MIT/X11 licensed. Please see the
6 -- COPYING file in the source package for more information.
7 --
8
9
10 local plugin_dir = CFG_PLUGINDIR or "./plugins/";
11
12 local io_open, os_time = io.open, os.time;
13 local loadstring, pairs = loadstring, pairs;
14
15 local datamanager = require "util.datamanager";
16
17 module "pluginloader"
18
19 local function load_from_datastore(name)
20         local content = datamanager.load(name, nil, "plugins");
21         if not content or not content[1] then return nil, "Resource not found"; end
22         return content[1], name;
23 end
24
25 local function load_file(name)
26         local file, err = io_open(plugin_dir..name);
27         if not file then return file, err; end
28         local content = file:read("*a");
29         file:close();
30         return content, name;
31 end
32
33 function load_resource(plugin, resource, loader)
34         if not resource then
35                 resource = "mod_"..plugin..".lua";
36         end
37         loader = loader or load_file;
38
39         local content, err = loader(plugin.."/"..resource);
40         if not content then content, err = loader(resource); end
41         -- TODO add support for packed plugins
42         
43         if not content and loader == load_file then
44                 return load_resource(plugin, resource, load_from_datastore);
45         end
46         
47         return content, err;
48 end
49
50 function store_resource(plugin, resource, content, metadata)
51         if not resource then
52                 resource = "mod_"..plugin..".lua";
53         end
54         local store = { content };
55         if metadata then
56                 for k,v in pairs(metadata) do
57                         store[k] = v;
58                 end
59         end
60         datamanager.store(plugin.."/"..resource, nil, "plugins", store);
61 end
62
63 function load_code(plugin, resource)
64         local content, err = load_resource(plugin, resource);
65         if not content then return content, err; end
66         return loadstring(content, "@"..err);
67 end
68
69 return _M;