]>
Commit | Line | Data |
---|---|---|
db50981b | 1 | import sys |
e4255e70 | 2 | import modlib |
db50981b | 3 | |
4 | modules = {} | |
e4255e70 | 5 | dependents = {} |
db50981b | 6 | |
7 | def isloaded(modname): return modname in modules | |
8 | def modhas(modname, attname): return getattr(self.modules[modname], attname, None) is not None | |
9 | ||
10 | def load(parent, modname): | |
11 | if not isloaded(modname): | |
12 | mod = __import__(modname) | |
e4255e70 | 13 | reload(mod) |
14 | ||
15 | if 1 not in mod.modinfo['compatible']: | |
16 | return modlib.error('API-incompatible') | |
17 | ||
db50981b | 18 | modules[modname] = mod |
e4255e70 | 19 | dependents[modname] = [] |
20 | ||
21 | for dep in mod.modinfo['depends']: | |
22 | if dep not in modules: | |
23 | depret = load(parent, dep) | |
24 | if not depret: | |
25 | return | |
26 | dependents[dep].append(modname) | |
27 | ||
28 | ||
db50981b | 29 | ret = mod.modstart(parent) |
e4255e70 | 30 | if ret is not None and not ret: |
db50981b | 31 | del modules[modname] |
e4255e70 | 32 | del dependents[modname] |
33 | for dep in mod.modinfo['depends']: | |
34 | dependents[dep].remove(modname) | |
db50981b | 35 | return ret |
e4255e70 | 36 | else: #if not isloaded...else: |
37 | return modlib.error('already loaded') | |
db50981b | 38 | |
39 | def unload(parent, modname): | |
40 | if isloaded(modname): | |
e4255e70 | 41 | for dependent in dependents[modname]: |
42 | unload(parent, dependent) | |
43 | for dep in dependents[modname]: | |
44 | dependents[dep].remove(modname) | |
db50981b | 45 | self.modules[modname].modstop(parent) |
46 | else: | |
e4255e70 | 47 | return modlib.error('already unloaded') |
db50981b | 48 | |
49 | def reloadmod(parent, modname): | |
50 | if isloaded(modname): | |
51 | if modhas(modname, 'modrestart'): self.modules[modname].modrestart(parent) | |
52 | else: self.modules[modname].modstop(parent) | |
53 | ||
54 | reload(self.modules[modname]) | |
55 | ||
56 | if modhas(modname, 'modrestarted'): self.modules[modname].modrestarted(parent) | |
57 | else: self.modules[modname].modstart(parent) | |
58 | ||
59 | else: | |
60 | load(parent, modname) | |
61 | ||
62 | def loadall(parent, modlist): | |
63 | for m in modlist: load(parent, m) | |
64 | def unloadall(parent, modlist): | |
65 | for m in modlist: unload(parent, m) | |
66 | def reloadall(parent, modlist): | |
67 | for m in modlist: reloadmod(parent, m) | |
68 | ||
69 | sys.path.append('modules') |