Software / code / prosody
Comparison
core/modulemanager.lua @ 710:56f6c115bc69
modulemanager: Added reload support, with callbacks for saving and restoring state
| author | Waqas Hussain <waqas20@gmail.com> |
|---|---|
| date | Tue, 13 Jan 2009 22:37:07 +0500 |
| parent | 709:8bb83563cb21 |
| child | 713:2afd6d9e21cd |
comparison
equal
deleted
inserted
replaced
| 709:8bb83563cb21 | 710:56f6c115bc69 |
|---|---|
| 138 | 138 |
| 139 function unload(host, name, ...) | 139 function unload(host, name, ...) |
| 140 local mod = modulemap[host] and modulemap[host][name]; | 140 local mod = modulemap[host] and modulemap[host][name]; |
| 141 if not mod then return nil, "module-not-loaded"; end | 141 if not mod then return nil, "module-not-loaded"; end |
| 142 | 142 |
| 143 if type(rawget(mod, "unload")) == "function" then | 143 if type(mod.module.unload) == "function" then |
| 144 local ok, err = pcall(rawget(mod, "unload"), ...) | 144 local ok, err = pcall(mod.module.unload, ...) |
| 145 if (not ok) and err then | 145 if (not ok) and err then |
| 146 log("warn", "Non-fatal error unloading module '%s' from '%s': %s", name, host, err); | 146 log("warn", "Non-fatal error unloading module '%s' from '%s': %s", name, host, err); |
| 147 end | 147 end |
| 148 end | 148 end |
| 149 modulemap[host][name] = nil; | 149 modulemap[host][name] = nil; |
| 156 stanza_handlers:remove(param[1], param[2], param[3], param[4]); | 156 stanza_handlers:remove(param[1], param[2], param[3], param[4]); |
| 157 end | 157 end |
| 158 end | 158 end |
| 159 event_hooks:remove(host, name); | 159 event_hooks:remove(host, name); |
| 160 return true; | 160 return true; |
| 161 end | |
| 162 | |
| 163 function reload(host, name, ...) | |
| 164 local mod = modulemap[host] and modulemap[host][name]; | |
| 165 if not mod then return nil, "module-not-loaded"; end | |
| 166 | |
| 167 local saved; | |
| 168 if type(mod.module.save) == "function" then | |
| 169 local ok, err = pcall(mod.module.save) | |
| 170 if (not ok) and err then | |
| 171 log("warn", "Non-fatal error unloading module '%s' from '%s': %s", name, host, err); | |
| 172 else | |
| 173 saved = err; | |
| 174 end | |
| 175 end | |
| 176 | |
| 177 unload(host, name, ...); | |
| 178 if load(host, name, ...) then | |
| 179 mod = modulemap[host] and modulemap[host][name]; | |
| 180 if type(mod.module.restore) == "function" then | |
| 181 local ok, err = pcall(mod.module.restore, saved or {}) | |
| 182 if (not ok) and err then | |
| 183 log("warn", "Non-fatal error unloading module '%s' from '%s': %s", name, host, err); | |
| 184 end | |
| 185 end | |
| 186 return true; | |
| 187 end | |
| 161 end | 188 end |
| 162 | 189 |
| 163 function handle_stanza(host, origin, stanza) | 190 function handle_stanza(host, origin, stanza) |
| 164 local name, xmlns, origin_type = stanza.name, stanza.attr.xmlns, origin.type; | 191 local name, xmlns, origin_type = stanza.name, stanza.attr.xmlns, origin.type; |
| 165 if name == "iq" and xmlns == "jabber:client" then | 192 if name == "iq" and xmlns == "jabber:client" then |