modulemanager: Added reload support, with callbacks for saving and restoring state
authorWaqas Hussain <waqas20@gmail.com>
Tue, 13 Jan 2009 17:37:07 +0000 (22:37 +0500)
committerWaqas Hussain <waqas20@gmail.com>
Tue, 13 Jan 2009 17:37:07 +0000 (22:37 +0500)
core/modulemanager.lua

index 52fbc65d9337d233be75cd8d8d759c589cd92f69..c1caaacc9dd5c112ee9ff166c9cdb856964382cd 100644 (file)
@@ -140,8 +140,8 @@ function unload(host, name, ...)
        local mod = modulemap[host] and modulemap[host][name];
        if not mod then return nil, "module-not-loaded"; end
        
-       if type(rawget(mod, "unload")) == "function" then
-               local ok, err = pcall(rawget(mod, "unload"), ...)
+       if type(mod.module.unload) == "function" then
+               local ok, err = pcall(mod.module.unload, ...)
                if (not ok) and err then
                        log("warn", "Non-fatal error unloading module '%s' from '%s': %s", name, host, err);
                end
@@ -160,6 +160,33 @@ function unload(host, name, ...)
        return true;
 end
 
+function reload(host, name, ...)
+       local mod = modulemap[host] and modulemap[host][name];
+       if not mod then return nil, "module-not-loaded"; end
+
+       local saved;
+       if type(mod.module.save) == "function" then
+               local ok, err = pcall(mod.module.save)
+               if (not ok) and err then
+                       log("warn", "Non-fatal error unloading module '%s' from '%s': %s", name, host, err);
+               else
+                       saved = err;
+               end
+       end
+
+       unload(host, name, ...);
+       if load(host, name, ...) then
+               mod = modulemap[host] and modulemap[host][name];
+               if type(mod.module.restore) == "function" then
+                       local ok, err = pcall(mod.module.restore, saved or {})
+                       if (not ok) and err then
+                               log("warn", "Non-fatal error unloading module '%s' from '%s': %s", name, host, err);
+                       end
+               end
+               return true;
+       end
+end
+
 function handle_stanza(host, origin, stanza)
        local name, xmlns, origin_type = stanza.name, stanza.attr.xmlns, origin.type;
        if name == "iq" and xmlns == "jabber:client" then