diff options
Diffstat (limited to 'OpenSim/Region/Environment/ModuleLoader.cs')
-rw-r--r-- | OpenSim/Region/Environment/ModuleLoader.cs | 407 |
1 files changed, 205 insertions, 202 deletions
diff --git a/OpenSim/Region/Environment/ModuleLoader.cs b/OpenSim/Region/Environment/ModuleLoader.cs index 69cc379..f88f9ac 100644 --- a/OpenSim/Region/Environment/ModuleLoader.cs +++ b/OpenSim/Region/Environment/ModuleLoader.cs | |||
@@ -1,202 +1,205 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | 2 | * Copyright (c) Contributors, http://opensimulator.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | 22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | 28 | ||
29 | using System; | 29 | using System; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.IO; | 31 | using System.IO; |
32 | using System.Reflection; | 32 | using System.Reflection; |
33 | using OpenSim.Framework.Console; | 33 | using OpenSim.Framework.Console; |
34 | using OpenSim.Region.Environment.Interfaces; | 34 | using OpenSim.Region.Environment.Interfaces; |
35 | using OpenSim.Region.Environment.Modules; | 35 | using OpenSim.Region.Environment.Modules; |
36 | using OpenSim.Region.Environment.Scenes; | 36 | using OpenSim.Region.Environment.Scenes; |
37 | 37 | using Nini.Config; | |
38 | namespace OpenSim.Region.Environment | 38 | |
39 | { | 39 | namespace OpenSim.Region.Environment |
40 | public class ModuleLoader | 40 | { |
41 | { | 41 | public class ModuleLoader |
42 | public Dictionary<string, Assembly> LoadedAssemblys = new Dictionary<string, Assembly>(); | 42 | { |
43 | 43 | public Dictionary<string, Assembly> LoadedAssemblys = new Dictionary<string, Assembly>(); | |
44 | public List<IRegionModule> LoadedModules = new List<IRegionModule>(); | 44 | |
45 | public Dictionary<string, IRegionModule> LoadedSharedModules = new Dictionary<string, IRegionModule>(); | 45 | public List<IRegionModule> LoadedModules = new List<IRegionModule>(); |
46 | private readonly LogBase m_log; | 46 | public Dictionary<string, IRegionModule> LoadedSharedModules = new Dictionary<string, IRegionModule>(); |
47 | 47 | private readonly LogBase m_log; | |
48 | public ModuleLoader(LogBase log) | 48 | private IConfigSource m_config; |
49 | { | 49 | |
50 | m_log = log; | 50 | public ModuleLoader(LogBase log, IConfigSource config) |
51 | } | 51 | { |
52 | 52 | m_log = log; | |
53 | public void PickupModules(Scene scene, string moduleDir) | 53 | m_config = config; |
54 | { | 54 | } |
55 | DirectoryInfo dir = new DirectoryInfo(moduleDir); | 55 | |
56 | 56 | public void PickupModules(Scene scene, string moduleDir) | |
57 | foreach (FileInfo fileInfo in dir.GetFiles("*.dll")) | 57 | { |
58 | { | 58 | DirectoryInfo dir = new DirectoryInfo(moduleDir); |
59 | LoadRegionModules(fileInfo.FullName, scene); | 59 | |
60 | } | 60 | foreach (FileInfo fileInfo in dir.GetFiles("*.dll")) |
61 | } | 61 | { |
62 | 62 | LoadRegionModules(fileInfo.FullName, scene); | |
63 | public void LoadDefaultSharedModules() | 63 | } |
64 | { | 64 | } |
65 | DynamicTextureModule dynamicModule = new DynamicTextureModule(); | 65 | |
66 | LoadedSharedModules.Add(dynamicModule.Name, dynamicModule); | 66 | public void LoadDefaultSharedModules() |
67 | } | 67 | { |
68 | 68 | DynamicTextureModule dynamicModule = new DynamicTextureModule(); | |
69 | public void InitialiseSharedModules(Scene scene) | 69 | LoadedSharedModules.Add(dynamicModule.Name, dynamicModule); |
70 | { | 70 | } |
71 | foreach (IRegionModule module in LoadedSharedModules.Values) | 71 | |
72 | { | 72 | public void InitialiseSharedModules(Scene scene) |
73 | module.Initialise(scene); | 73 | { |
74 | scene.AddModule(module.Name, module); //should be doing this? | 74 | foreach (IRegionModule module in LoadedSharedModules.Values) |
75 | } | 75 | { |
76 | } | 76 | module.Initialise(scene, m_config); |
77 | 77 | scene.AddModule(module.Name, module); //should be doing this? | |
78 | public void InitializeModule(IRegionModule module, Scene scene) | 78 | } |
79 | { | 79 | } |
80 | module.Initialise(scene); | 80 | |
81 | scene.AddModule(module.Name, module); | 81 | public void InitializeModule(IRegionModule module, Scene scene) |
82 | LoadedModules.Add(module); | 82 | { |
83 | } | 83 | module.Initialise(scene, m_config); |
84 | 84 | scene.AddModule(module.Name, module); | |
85 | /// <summary> | 85 | LoadedModules.Add(module); |
86 | /// Loads/initialises a Module instance that can be used by mutliple Regions | 86 | } |
87 | /// </summary> | 87 | |
88 | /// <param name="dllName"></param> | 88 | /// <summary> |
89 | /// <param name="moduleName"></param> | 89 | /// Loads/initialises a Module instance that can be used by mutliple Regions |
90 | /// <param name="scene"></param> | 90 | /// </summary> |
91 | public void LoadSharedModule(string dllName, string moduleName) | 91 | /// <param name="dllName"></param> |
92 | { | 92 | /// <param name="moduleName"></param> |
93 | IRegionModule module = LoadModule(dllName, moduleName); | 93 | /// <param name="scene"></param> |
94 | if (module != null) | 94 | public void LoadSharedModule(string dllName, string moduleName) |
95 | { | 95 | { |
96 | LoadedSharedModules.Add(module.Name, module); | 96 | IRegionModule module = LoadModule(dllName, moduleName); |
97 | } | 97 | if (module != null) |
98 | } | 98 | { |
99 | 99 | LoadedSharedModules.Add(module.Name, module); | |
100 | public void LoadRegionModules(string dllName, Scene scene) | 100 | } |
101 | { | 101 | } |
102 | IRegionModule[] modules = LoadModules(dllName); | 102 | |
103 | 103 | public void LoadRegionModules(string dllName, Scene scene) | |
104 | if (modules.Length > 0) | 104 | { |
105 | { | 105 | IRegionModule[] modules = LoadModules(dllName); |
106 | m_log.Verbose("MODULES", "Found Module Library [{0}]", dllName ); | 106 | |
107 | foreach (IRegionModule module in modules) | 107 | if (modules.Length > 0) |
108 | { | 108 | { |
109 | m_log.Verbose("MODULES", " [{0}]: Initializing.", module.Name); | 109 | m_log.Verbose("MODULES", "Found Module Library [{0}]", dllName ); |
110 | InitializeModule(module, scene); | 110 | foreach (IRegionModule module in modules) |
111 | } | 111 | { |
112 | } | 112 | m_log.Verbose("MODULES", " [{0}]: Initializing.", module.Name); |
113 | } | 113 | InitializeModule(module, scene); |
114 | 114 | } | |
115 | public void LoadRegionModule(string dllName, string moduleName, Scene scene) | 115 | } |
116 | { | 116 | } |
117 | IRegionModule module = LoadModule(dllName, moduleName); | 117 | |
118 | if (module != null) | 118 | public void LoadRegionModule(string dllName, string moduleName, Scene scene) |
119 | { | 119 | { |
120 | InitializeModule(module, scene); | 120 | IRegionModule module = LoadModule(dllName, moduleName); |
121 | } | 121 | if (module != null) |
122 | } | 122 | { |
123 | 123 | InitializeModule(module, scene); | |
124 | /// <summary> | 124 | } |
125 | /// Loads a external Module (if not already loaded) and creates a new instance of it. | 125 | } |
126 | /// </summary> | 126 | |
127 | /// <param name="dllName"></param> | 127 | /// <summary> |
128 | /// <param name="moduleName"></param> | 128 | /// Loads a external Module (if not already loaded) and creates a new instance of it. |
129 | /// <param name="scene"></param> | 129 | /// </summary> |
130 | public IRegionModule LoadModule(string dllName, string moduleName) | 130 | /// <param name="dllName"></param> |
131 | { | 131 | /// <param name="moduleName"></param> |
132 | IRegionModule[] modules = LoadModules(dllName); | 132 | /// <param name="scene"></param> |
133 | 133 | public IRegionModule LoadModule(string dllName, string moduleName) | |
134 | foreach (IRegionModule module in modules) | 134 | { |
135 | { | 135 | IRegionModule[] modules = LoadModules(dllName); |
136 | if ((module != null) && (module.Name == moduleName)) | 136 | |
137 | { | 137 | foreach (IRegionModule module in modules) |
138 | return module; | 138 | { |
139 | } | 139 | if ((module != null) && (module.Name == moduleName)) |
140 | } | 140 | { |
141 | 141 | return module; | |
142 | return null; | 142 | } |
143 | } | 143 | } |
144 | 144 | ||
145 | public IRegionModule[] LoadModules(string dllName) | 145 | return null; |
146 | { | 146 | } |
147 | List<IRegionModule> modules = new List<IRegionModule>(); | 147 | |
148 | 148 | public IRegionModule[] LoadModules(string dllName) | |
149 | Assembly pluginAssembly; | 149 | { |
150 | if (!LoadedAssemblys.TryGetValue(dllName, out pluginAssembly )) | 150 | List<IRegionModule> modules = new List<IRegionModule>(); |
151 | { | 151 | |
152 | try | 152 | Assembly pluginAssembly; |
153 | { | 153 | if (!LoadedAssemblys.TryGetValue(dllName, out pluginAssembly )) |
154 | pluginAssembly = Assembly.LoadFrom(dllName); | 154 | { |
155 | LoadedAssemblys.Add(dllName, pluginAssembly); | 155 | try |
156 | } | 156 | { |
157 | catch( BadImageFormatException e ) | 157 | pluginAssembly = Assembly.LoadFrom(dllName); |
158 | { | 158 | LoadedAssemblys.Add(dllName, pluginAssembly); |
159 | m_log.Warn( "MODULES", "The file [{0}] is not a module assembly.", e.FileName ); | 159 | } |
160 | } | 160 | catch( BadImageFormatException e ) |
161 | } | 161 | { |
162 | 162 | m_log.Warn( "MODULES", "The file [{0}] is not a module assembly.", e.FileName ); | |
163 | 163 | } | |
164 | if (pluginAssembly != null) | 164 | } |
165 | { | 165 | |
166 | foreach (Type pluginType in pluginAssembly.GetTypes()) | 166 | |
167 | { | 167 | if (pluginAssembly != null) |
168 | if (pluginType.IsPublic) | 168 | { |
169 | { | 169 | foreach (Type pluginType in pluginAssembly.GetTypes()) |
170 | if (!pluginType.IsAbstract) | 170 | { |
171 | { | 171 | if (pluginType.IsPublic) |
172 | if( pluginType.GetInterface("IRegionModule") != null ) | 172 | { |
173 | { | 173 | if (!pluginType.IsAbstract) |
174 | modules.Add((IRegionModule) Activator.CreateInstance(pluginType)); | 174 | { |
175 | } | 175 | if( pluginType.GetInterface("IRegionModule") != null ) |
176 | } | 176 | { |
177 | } | 177 | modules.Add((IRegionModule) Activator.CreateInstance(pluginType)); |
178 | } | 178 | } |
179 | } | 179 | } |
180 | 180 | } | |
181 | return modules.ToArray(); | 181 | } |
182 | } | 182 | } |
183 | 183 | ||
184 | public void PostInitialise() | 184 | return modules.ToArray(); |
185 | { | 185 | } |
186 | foreach (IRegionModule module in LoadedSharedModules.Values) | 186 | |
187 | { | 187 | public void PostInitialise() |
188 | module.PostInitialise(); | 188 | { |
189 | } | 189 | foreach (IRegionModule module in LoadedSharedModules.Values) |
190 | 190 | { | |
191 | foreach (IRegionModule module in LoadedModules) | 191 | module.PostInitialise(); |
192 | { | 192 | } |
193 | module.PostInitialise(); | 193 | |
194 | } | 194 | foreach (IRegionModule module in LoadedModules) |
195 | } | 195 | { |
196 | 196 | module.PostInitialise(); | |
197 | public void ClearCache() | 197 | } |
198 | { | 198 | } |
199 | LoadedAssemblys.Clear(); | 199 | |
200 | } | 200 | public void ClearCache() |
201 | } | 201 | { |
202 | } | 202 | LoadedAssemblys.Clear(); |
203 | } | ||
204 | } | ||
205 | } | ||