aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorSean Dague2008-04-21 12:42:56 +0000
committerSean Dague2008-04-21 12:42:56 +0000
commitbf1580fba45df7624180b07599c8170074500c99 (patch)
tree696a69c94554f0789b123c82fb34c658e9a0b6af
parent* Various refactorings. (diff)
downloadopensim-SC-bf1580fba45df7624180b07599c8170074500c99.zip
opensim-SC-bf1580fba45df7624180b07599c8170074500c99.tar.gz
opensim-SC-bf1580fba45df7624180b07599c8170074500c99.tar.bz2
opensim-SC-bf1580fba45df7624180b07599c8170074500c99.tar.xz
From: Dr Scofield <hud@zurich.ibm.com>
the attached patch set is centered around RemoteAdminPlugin and focuses mainly on making it more robust (i.e. more parameter checking and better error reporting) but also we've re-implemented the LoadTerrain stuff that got disabled during the terrain code reworking: * missing PostInitialize() calls on region modules that were loaded for regions created via RemoteAdmin's CreateRegion XmlRpc call * re-implements RemoteAdmin's LoadTerrain XmlRpc call (probably lost during the TerrainModule rework) * adds lots more parameter checking and error reporting to RemoteAdmin * adds a read-only property to RegionApplicationBase so that we can access the CommsManager * adds Exceptions to TerrainModule so that we get better error case feedback (and can report more meaningful errors in turn) * adds a CheckForTerrainUpdate() call to TerrainModule.LoadFromFile() to make terrain changes effective * adds TryGetCurrentScene(LLUUID) to SceneManager so that we can retrieve Scenes not only by name but also by LLUUID cheers, dr scofield
Diffstat (limited to '')
-rw-r--r--OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs160
-rw-r--r--OpenSim/Framework/Communications/Capabilities/CapsHandlers.cs4
-rw-r--r--OpenSim/Framework/RegionLoader/Filesystem/RegionLoaderFileSystem.cs2
-rw-r--r--OpenSim/Region/Application/OpenSimMain.cs33
-rw-r--r--OpenSim/Region/ClientStack/RegionApplicationBase.cs3
-rw-r--r--OpenSim/Region/Environment/ModuleLoader.cs11
-rw-r--r--OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs9
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneManager.cs16
8 files changed, 170 insertions, 68 deletions
diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
index 3e0f4f6..b8ee3ee 100644
--- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
+++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
@@ -38,6 +38,7 @@ using Nwc.XmlRpc;
38using OpenSim.Framework; 38using OpenSim.Framework;
39using OpenSim.Framework.Servers; 39using OpenSim.Framework.Servers;
40using OpenSim.Region.Environment.Scenes; 40using OpenSim.Region.Environment.Scenes;
41using OpenSim.Region.Environment.Modules.Terrain;
41 42
42[assembly : Addin] 43[assembly : Addin]
43[assembly : AddinDependency("OpenSim", "0.5")] 44[assembly : AddinDependency("OpenSim", "0.5")]
@@ -88,6 +89,9 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
88 LLUUID regionID = new LLUUID((string) requestData["regionID"]); 89 LLUUID regionID = new LLUUID((string) requestData["regionID"]);
89 90
90 Hashtable responseData = new Hashtable(); 91 Hashtable responseData = new Hashtable();
92
93 m_log.Info("[RADMIN]: Request to restart Region.");
94
91 if (requiredPassword != String.Empty && 95 if (requiredPassword != String.Empty &&
92 (!requestData.Contains("password") || (string) requestData["password"] != requiredPassword)) 96 (!requestData.Contains("password") || (string) requestData["password"] != requiredPassword))
93 { 97 {
@@ -119,24 +123,30 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
119 { 123 {
120 XmlRpcResponse response = new XmlRpcResponse(); 124 XmlRpcResponse response = new XmlRpcResponse();
121 Hashtable requestData = (Hashtable) request.Params[0]; 125 Hashtable requestData = (Hashtable) request.Params[0];
122
123 Hashtable responseData = new Hashtable(); 126 Hashtable responseData = new Hashtable();
124 if (requiredPassword != String.Empty && 127
125 (!requestData.Contains("password") || (string) requestData["password"] != requiredPassword)) 128 try {
126 { 129 checkStringParameters(request, new string[] { "password", "message" });
127 responseData["accepted"] = "false"; 130
128 response.Value = responseData; 131 if (requiredPassword != String.Empty &&
129 } 132 (!requestData.Contains("password") || (string) requestData["password"] != requiredPassword))
130 else 133 throw new Exception("wrong password");
131 { 134
132 string message = (string) requestData["message"]; 135 string message = (string) requestData["message"];
133 m_log.Info("[RADMIN]: Broadcasting: " + message); 136 m_log.InfoFormat("[RADMIN]: Broadcasting: {0}", message);
134 137
135 responseData["accepted"] = "true"; 138 responseData["accepted"] = "true";
136 response.Value = responseData; 139 response.Value = responseData;
137 140
138 m_app.SceneManager.SendGeneralMessage(message); 141 m_app.SceneManager.SendGeneralMessage(message);
139 } 142 }
143 catch(Exception e)
144 {
145 m_log.ErrorFormat("[RADMIN]: Broadcasting: failed: {0}", e.Message);
146 m_log.DebugFormat("[RADMIN]: Broadcasting: failed: {0}", e.ToString());
147 responseData["accepted"] = "false";
148 response.Value = responseData;
149 }
140 150
141 return response; 151 return response;
142 } 152 }
@@ -146,35 +156,48 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
146 XmlRpcResponse response = new XmlRpcResponse(); 156 XmlRpcResponse response = new XmlRpcResponse();
147 Hashtable requestData = (Hashtable)request.Params[0]; 157 Hashtable requestData = (Hashtable)request.Params[0];
148 158
149 Hashtable responseData = new Hashtable(); 159 m_log.DebugFormat("[RADMIN]: Load Terrain: XmlRpc {0}", request.ToString());
150 if (requiredPassword != String.Empty && 160 foreach (string k in requestData.Keys)
151 (!requestData.Contains("password") || (string)requestData["password"] != requiredPassword))
152 { 161 {
153 responseData["accepted"] = "false"; 162 m_log.DebugFormat("[RADMIN]: Load Terrain: XmlRpc {0}: >{1}< {2}",
154 response.Value = responseData; 163 k, (string)requestData[k], ((string)requestData[k]).Length);
155 } 164 }
156 else 165
157 { 166 Hashtable responseData = new Hashtable();
167 try {
168 checkStringParameters(request, new string[] { "password", "filename", "regionid"});
169
170 if (requiredPassword != String.Empty &&
171 (!requestData.Contains("password") || (string)requestData["password"] != requiredPassword))
172 throw new Exception("wrong password");
173
158 string file = (string)requestData["filename"]; 174 string file = (string)requestData["filename"];
159 LLUUID regionID = LLUUID.Parse((string)requestData["regionid"]); 175 LLUUID regionID = (string) requestData["regionid"];
160 m_log.Info("[RADMIN]: Terrain Loading: " + file); 176 m_log.InfoFormat("[RADMIN]: Terrain Loading: {0}", file);
161 177
162 responseData["accepted"] = "true"; 178 responseData["accepted"] = "true";
163 179
164 Scene region = null; 180 Scene region = null;
165 181
166 if (m_app.SceneManager.TryGetScene(regionID, out region)) 182 if (!m_app.SceneManager.TryGetScene(regionID, out region))
167 { 183 throw new Exception("1: unable to get a scene with that name");
168 //region.LoadWorldMap(file); 184
169 responseData["success"] = "true"; 185 ITerrainModule terrainModule = region.RequestModuleInterface<ITerrainModule>();
170 } 186 if (null == terrainModule) throw new Exception("terrain module not available");
171 else 187 terrainModule.LoadFromFile(file);
172 { 188
173 responseData["success"] = "false"; 189 responseData["success"] = "true";
174 responseData["error"] = "1: Unable to get a scene with that name."; 190
175 }
176 response.Value = responseData; 191 response.Value = responseData;
177 } 192 }
193 catch (Exception e)
194 {
195 m_log.ErrorFormat("[RADMIN] Terrain Loading: failed: {0}", e.Message);
196 m_log.DebugFormat("[RADMIN] Terrain Loading: failed: {0}", e.ToString());
197
198 responseData["success"] = "false";
199 responseData["error"] = e.Message;
200 }
178 201
179 return response; 202 return response;
180 } 203 }
@@ -185,37 +208,32 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
185 XmlRpcResponse response = new XmlRpcResponse(); 208 XmlRpcResponse response = new XmlRpcResponse();
186 Hashtable requestData = (Hashtable) request.Params[0]; 209 Hashtable requestData = (Hashtable) request.Params[0];
187 Hashtable responseData = new Hashtable(); 210 Hashtable responseData = new Hashtable();
188 if (requiredPassword != String.Empty && 211
189 (!requestData.Contains("password") || (string) requestData["password"] != requiredPassword)) 212 try {
190 { 213 checkStringParameters(request, new string[] { "password", "shutdown" });
191 responseData["accepted"] = "false"; 214 checkIntegerParams(request, new string[] { "milliseconds"});
215
216 if (requiredPassword != String.Empty &&
217 (!requestData.Contains("password") || (string) requestData["password"] != requiredPassword))
218 throw new Exception("wrong password");
219
220 responseData["accepted"] = "true";
192 response.Value = responseData; 221 response.Value = responseData;
193 } 222
194 else
195 {
196 if ((string) requestData["shutdown"] == "delayed") 223 if ((string) requestData["shutdown"] == "delayed")
197 { 224 {
198 int timeout = (Int32) requestData["milliseconds"]; 225 int timeout = (Int32) requestData["milliseconds"];
199
200 responseData["accepted"] = "true";
201 response.Value = responseData;
202
203 m_app.SceneManager.SendGeneralMessage("Region is going down in " + ((int) (timeout/1000)).ToString() + 226 m_app.SceneManager.SendGeneralMessage("Region is going down in " + ((int) (timeout/1000)).ToString() +
204 " second(s). Please save what you are doing and log out."); 227 " second(s). Please save what you are doing and log out.");
205 228
206 // Perform shutdown 229 // Perform shutdown
207 Timer shutdownTimer = new Timer(timeout); // Wait before firing 230 Timer shutdownTimer = new Timer(timeout); // Wait before firing
208 shutdownTimer.AutoReset = false; 231 shutdownTimer.AutoReset = false;
209 shutdownTimer.Elapsed += new ElapsedEventHandler(shutdownTimer_Elapsed); 232 shutdownTimer.Elapsed += new ElapsedEventHandler(shutdownTimer_Elapsed);
210 shutdownTimer.Start(); 233 shutdownTimer.Start();
211 234 }
212 return response;
213 }
214 else 235 else
215 { 236 {
216 responseData["accepted"] = "true";
217 response.Value = responseData;
218
219 m_app.SceneManager.SendGeneralMessage("Region is going down now."); 237 m_app.SceneManager.SendGeneralMessage("Region is going down now.");
220 238
221 // Perform shutdown 239 // Perform shutdown
@@ -223,10 +241,18 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
223 shutdownTimer.AutoReset = false; 241 shutdownTimer.AutoReset = false;
224 shutdownTimer.Elapsed += new ElapsedEventHandler(shutdownTimer_Elapsed); 242 shutdownTimer.Elapsed += new ElapsedEventHandler(shutdownTimer_Elapsed);
225 shutdownTimer.Start(); 243 shutdownTimer.Start();
226
227 return response;
228 } 244 }
229 } 245 }
246 catch (Exception e)
247 {
248 m_log.ErrorFormat("[RADMIN] Shutdown: failed: {0}", e.Message);
249 m_log.DebugFormat("[RADMIN] Shutdown: failed: {0}", e.ToString());
250
251 responseData["accepted"] = "false";
252 responseData["error"] = e.Message;
253
254 response.Value = responseData;
255 }
230 return response; 256 return response;
231 } 257 }
232 258
@@ -401,7 +427,7 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
401 region.SaveRegionToFile("dynamic region", regionConfigPath); 427 region.SaveRegionToFile("dynamic region", regionConfigPath);
402 } 428 }
403 429
404 m_app.CreateRegion(region, true); 430 m_app.CreateRegion(region);
405 431
406 responseData["success"] = "true"; 432 responseData["success"] = "true";
407 responseData["region_name"] = region.RegionName; 433 responseData["region_name"] = region.RegionName;
@@ -484,8 +510,10 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
484 uint regX = Convert.ToUInt32((Int32)requestData["start_region_x"]); 510 uint regX = Convert.ToUInt32((Int32)requestData["start_region_x"]);
485 uint regY = Convert.ToUInt32((Int32)requestData["start_region_y"]); 511 uint regY = Convert.ToUInt32((Int32)requestData["start_region_y"]);
486 512
487 // FIXME: need to check whether "firstname lastname" 513 UserProfileData userProfile = m_app.CommunicationsManager.UserService.GetUserProfile(firstname, lastname);
488 // already exists! 514 if (null != userProfile)
515 throw new Exception(String.Format("avatar {0} {1} already exists", firstname, lastname));
516
489 LLUUID userID = m_app.CreateUser(firstname, lastname, passwd, regX, regY); 517 LLUUID userID = m_app.CreateUser(firstname, lastname, passwd, regX, regY);
490 518
491 if (userID == LLUUID.Zero) throw new Exception(String.Format("failed to create new user {0} {1}", 519 if (userID == LLUUID.Zero) throw new Exception(String.Format("failed to create new user {0} {1}",
@@ -523,22 +551,34 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
523 try 551 try
524 { 552 {
525 // check completeness 553 // check completeness
526 foreach (string p in new string[] { "password", "region_name", "filename" }) 554 foreach (string p in new string[] { "password", "filename" })
527 { 555 {
528 if (!requestData.Contains(p)) 556 if (!requestData.Contains(p))
529 throw new Exception(String.Format("missing parameter {0}", p)); 557 throw new Exception(String.Format("missing parameter {0}", p));
558 if (String.IsNullOrEmpty((string)requestData[p]))
559 throw new Exception(String.Format("parameter {0} is empty"));
530 } 560 }
531 561
532 // check password 562 // check password
533 if (!String.IsNullOrEmpty(requiredPassword) && 563 if (!String.IsNullOrEmpty(requiredPassword) &&
534 (string)requestData["password"] != requiredPassword) throw new Exception("wrong password"); 564 (string)requestData["password"] != requiredPassword) throw new Exception("wrong password");
535 565
536 string region_name = (string)requestData["region_name"]; 566 string filename = (string)requestData["filename"];
537 string filename = (string)requestData["filename"]; 567 if (requestData.Contains("region_uuid"))
538 568 {
539 if (!m_app.SceneManager.TrySetCurrentScene(region_name)) 569 LLUUID region_uuid = (string)requestData["region_uuid"];
540 throw new Exception(String.Format("failed to switch to region {0}", region_name)); 570 if (!m_app.SceneManager.TrySetCurrentScene(region_uuid))
541 m_log.InfoFormat("[RADMIN] Switched to region {0}"); 571 throw new Exception(String.Format("failed to switch to region {0}", region_uuid.ToString()));
572 m_log.InfoFormat("[RADMIN] Switched to region {0}", region_uuid.ToString());
573 }
574 else if (requestData.Contains("region_name"))
575 {
576 string region_name = (string)requestData["region_name"];
577 if (!m_app.SceneManager.TrySetCurrentScene(region_name))
578 throw new Exception(String.Format("failed to switch to region {0}", region_name));
579 m_log.InfoFormat("[RADMIN] Switched to region {0}", region_name);
580 }
581 else throw new Exception("neither region_name nor region_uuid given");
542 582
543 responseData["switched"] = "true"; 583 responseData["switched"] = "true";
544 584
@@ -550,7 +590,7 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
550 catch (Exception e) 590 catch (Exception e)
551 { 591 {
552 m_log.InfoFormat("[RADMIN] LoadXml: {0}", e.Message); 592 m_log.InfoFormat("[RADMIN] LoadXml: {0}", e.Message);
553 m_log.DebugFormat("[RADMIN] LoadXML {0}: {1}", e.ToString()); 593 m_log.DebugFormat("[RADMIN] LoadXml: {0}", e.ToString());
554 594
555 responseData["loaded"] = "false"; 595 responseData["loaded"] = "false";
556 responseData["switched"] = "false"; 596 responseData["switched"] = "false";
diff --git a/OpenSim/Framework/Communications/Capabilities/CapsHandlers.cs b/OpenSim/Framework/Communications/Capabilities/CapsHandlers.cs
index 3e3ae16..f101131 100644
--- a/OpenSim/Framework/Communications/Capabilities/CapsHandlers.cs
+++ b/OpenSim/Framework/Communications/Capabilities/CapsHandlers.cs
@@ -44,6 +44,10 @@ namespace OpenSim.Region.Capabilities
44 private uint m_httpListenerPort; 44 private uint m_httpListenerPort;
45 45
46 /// <summary></summary> 46 /// <summary></summary>
47 /// CapsHandlers is a cap handler container but also takes
48 /// care of adding and removing cap handlers to and from the
49 /// supplied BaseHttpServer.
50 /// </summary>
47 /// <param name="httpListener">base HTTP server</param> 51 /// <param name="httpListener">base HTTP server</param>
48 /// <param name="httpListenerHostname">host name of the HTTP 52 /// <param name="httpListenerHostname">host name of the HTTP
49 /// server</param> 53 /// server</param>
diff --git a/OpenSim/Framework/RegionLoader/Filesystem/RegionLoaderFileSystem.cs b/OpenSim/Framework/RegionLoader/Filesystem/RegionLoaderFileSystem.cs
index cfaaf02..0c01c5a 100644
--- a/OpenSim/Framework/RegionLoader/Filesystem/RegionLoaderFileSystem.cs
+++ b/OpenSim/Framework/RegionLoader/Filesystem/RegionLoaderFileSystem.cs
@@ -63,7 +63,7 @@ namespace OpenSim.Framework.RegionLoader.Filesystem
63 63
64 if (configFiles.Length == 0) 64 if (configFiles.Length == 0)
65 { 65 {
66 new RegionInfo("DEFAULT REGION CONFIG", Path.Combine(regionConfigPath, "default.xml"),false); 66 new RegionInfo("DEFAULT REGION CONFIG", Path.Combine(regionConfigPath, "default.xml"), false);
67 configFiles = Directory.GetFiles(regionConfigPath, "*.xml"); 67 configFiles = Directory.GetFiles(regionConfigPath, "*.xml");
68 } 68 }
69 69
diff --git a/OpenSim/Region/Application/OpenSimMain.cs b/OpenSim/Region/Application/OpenSimMain.cs
index aa08f81..26ae525 100644
--- a/OpenSim/Region/Application/OpenSimMain.cs
+++ b/OpenSim/Region/Application/OpenSimMain.cs
@@ -462,7 +462,28 @@ namespace OpenSim
462 /// <param name="regionInfo"></param> 462 /// <param name="regionInfo"></param>
463 /// <param name="portadd_flag"></param> 463 /// <param name="portadd_flag"></param>
464 /// <returns></returns> 464 /// <returns></returns>
465 public UDPServer CreateRegion(RegionInfo regionInfo, bool portadd_flag) 465 public UDPServer CreateRegion(RegionInfo regionInfo, bool portadd_flag) {
466 return CreateRegion(regionInfo, portadd_flag, false);
467 }
468
469 /// <summary>
470 /// Execute the region creation process. This includes setting up scene infrastructure.
471 /// </summary>
472 /// <param name="regionInfo"></param>
473 /// <param name="portadd_flag"></param>
474 /// <returns></returns>
475 public UDPServer CreateRegion(RegionInfo regionInfo) {
476 return CreateRegion(regionInfo, false, true);
477 }
478
479 /// <summary>
480 /// Execute the region creation process. This includes setting up scene infrastructure.
481 /// </summary>
482 /// <param name="regionInfo"></param>
483 /// <param name="portadd_flag"></param>
484 /// <param name="do_post_init"></param>
485 /// <returns></returns>
486 public UDPServer CreateRegion(RegionInfo regionInfo, bool portadd_flag, bool do_post_init)
466 { 487 {
467 int port = regionInfo.InternalEndPoint.Port; 488 int port = regionInfo.InternalEndPoint.Port;
468 489
@@ -487,7 +508,7 @@ namespace OpenSim
487 508
488 m_log.Info("[MODULES]: Loading Region's modules"); 509 m_log.Info("[MODULES]: Loading Region's modules");
489 510
490 m_moduleLoader.PickupModules(scene, "."); 511 List<IRegionModule> modules = m_moduleLoader.PickupModules(scene, ".");
491 //m_moduleLoader.PickupModules(scene, "ScriptEngines"); 512 //m_moduleLoader.PickupModules(scene, "ScriptEngines");
492 //m_moduleLoader.LoadRegionModules(Path.Combine("ScriptEngines", m_scriptEngine), scene); 513 //m_moduleLoader.LoadRegionModules(Path.Combine("ScriptEngines", m_scriptEngine), scene);
493 514
@@ -536,6 +557,14 @@ namespace OpenSim
536 m_regionData.Add(regionInfo); 557 m_regionData.Add(regionInfo);
537 udpServer.ServerListener(); 558 udpServer.ServerListener();
538 559
560 if (do_post_init)
561 {
562 foreach (IRegionModule module in modules)
563 {
564 module.PostInitialise();
565 }
566 }
567
539 return udpServer; 568 return udpServer;
540 } 569 }
541 570
diff --git a/OpenSim/Region/ClientStack/RegionApplicationBase.cs b/OpenSim/Region/ClientStack/RegionApplicationBase.cs
index bc0bea3..a6124a9 100644
--- a/OpenSim/Region/ClientStack/RegionApplicationBase.cs
+++ b/OpenSim/Region/ClientStack/RegionApplicationBase.cs
@@ -54,6 +54,9 @@ namespace OpenSim.Region.ClientStack
54 protected uint m_httpServerPort; 54 protected uint m_httpServerPort;
55 55
56 protected CommunicationsManager m_commsManager; 56 protected CommunicationsManager m_commsManager;
57 public CommunicationsManager CommunicationsManager {
58 get { return m_commsManager; }
59 }
57 60
58 protected SceneManager m_sceneManager = new SceneManager(); 61 protected SceneManager m_sceneManager = new SceneManager();
59 62
diff --git a/OpenSim/Region/Environment/ModuleLoader.cs b/OpenSim/Region/Environment/ModuleLoader.cs
index 43ca7bd..52a6fbd 100644
--- a/OpenSim/Region/Environment/ModuleLoader.cs
+++ b/OpenSim/Region/Environment/ModuleLoader.cs
@@ -62,14 +62,16 @@ namespace OpenSim.Region.Environment
62 } 62 }
63 } 63 }
64 64
65 public void PickupModules(Scene scene, string moduleDir) 65 public List<IRegionModule> PickupModules(Scene scene, string moduleDir)
66 { 66 {
67 DirectoryInfo dir = new DirectoryInfo(moduleDir); 67 DirectoryInfo dir = new DirectoryInfo(moduleDir);
68 List<IRegionModule> modules = new List<IRegionModule>();
68 69
69 foreach (FileInfo fileInfo in dir.GetFiles("*.dll")) 70 foreach (FileInfo fileInfo in dir.GetFiles("*.dll"))
70 { 71 {
71 LoadRegionModules(fileInfo.FullName, scene); 72 modules.AddRange(LoadRegionModules(fileInfo.FullName, scene));
72 } 73 }
74 return modules;
73 } 75 }
74 76
75 public void LoadDefaultSharedModules() 77 public void LoadDefaultSharedModules()
@@ -190,9 +192,10 @@ namespace OpenSim.Region.Environment
190 } 192 }
191 } 193 }
192 194
193 public void LoadRegionModules(string dllName, Scene scene) 195 public List<IRegionModule> LoadRegionModules(string dllName, Scene scene)
194 { 196 {
195 IRegionModule[] modules = LoadModules(dllName); 197 IRegionModule[] modules = LoadModules(dllName);
198 List<IRegionModule> initializedModules = new List<IRegionModule>();
196 199
197 if (modules.Length > 0) 200 if (modules.Length > 0)
198 { 201 {
@@ -203,6 +206,7 @@ namespace OpenSim.Region.Environment
203 { 206 {
204 m_log.InfoFormat("[MODULES]: [{0}]: Initializing.", module.Name); 207 m_log.InfoFormat("[MODULES]: [{0}]: Initializing.", module.Name);
205 InitializeModule(module, scene); 208 InitializeModule(module, scene);
209 initializedModules.Add(module);
206 } 210 }
207 else 211 else
208 { 212 {
@@ -211,6 +215,7 @@ namespace OpenSim.Region.Environment
211 } 215 }
212 } 216 }
213 } 217 }
218 return initializedModules;
214 } 219 }
215 220
216 public void LoadRegionModule(string dllName, string moduleName, Scene scene) 221 public void LoadRegionModule(string dllName, string moduleName, Scene scene)
diff --git a/OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs b/OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs
index 987c3d0..f758c91 100644
--- a/OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs
+++ b/OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs
@@ -178,20 +178,24 @@ namespace OpenSim.Region.Environment.Modules.Terrain
178 { 178 {
179 m_log.Error("[TERRAIN]: Unable to load heightmap, the " + loader.Value + 179 m_log.Error("[TERRAIN]: Unable to load heightmap, the " + loader.Value +
180 " parser does not support file loading. (May be save only)"); 180 " parser does not support file loading. (May be save only)");
181 return; 181 throw new Exception(String.Format("unable to load heightmap: parser {0} does not support loading", loader.Value));
182 } 182 }
183 catch (FileNotFoundException) 183 catch (FileNotFoundException)
184 { 184 {
185 m_log.Error( 185 m_log.Error(
186 "[TERRAIN]: Unable to load heightmap, file not found. (A directory permissions error may also cause this)"); 186 "[TERRAIN]: Unable to load heightmap, file not found. (A directory permissions error may also cause this)");
187 return; 187 throw new Exception(String.Format("unable to load heightmap: file {0} not found (or permissions do not allow access",
188 filename));
188 } 189 }
189 } 190 }
191 CheckForTerrainUpdates();
190 m_log.Info("[TERRAIN]: File (" + filename + ") loaded successfully"); 192 m_log.Info("[TERRAIN]: File (" + filename + ") loaded successfully");
191 return; 193 return;
192 } 194 }
193 } 195 }
194 m_log.Error("[TERRAIN]: Unable to load heightmap, no file loader availible for that format."); 196 m_log.Error("[TERRAIN]: Unable to load heightmap, no file loader availible for that format.");
197 throw new Exception(String.Format("unable to load heightmap from file {0}: no loader available for that format",
198 filename));
195 } 199 }
196 200
197 /// <summary> 201 /// <summary>
@@ -214,6 +218,7 @@ namespace OpenSim.Region.Environment.Modules.Terrain
214 catch (NotImplementedException) 218 catch (NotImplementedException)
215 { 219 {
216 m_log.Error("Unable to save to " + filename + ", saving of this file format has not been implemented."); 220 m_log.Error("Unable to save to " + filename + ", saving of this file format has not been implemented.");
221 throw new Exception(String.Format("unable to save heightmap: {0}: saving of this file format not implemented"));
217 } 222 }
218 } 223 }
219 224
diff --git a/OpenSim/Region/Environment/Scenes/SceneManager.cs b/OpenSim/Region/Environment/Scenes/SceneManager.cs
index 61a4eae..40e313a 100644
--- a/OpenSim/Region/Environment/Scenes/SceneManager.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneManager.cs
@@ -250,6 +250,22 @@ namespace OpenSim.Region.Environment.Scenes
250 } 250 }
251 } 251 }
252 252
253 public bool TrySetCurrentScene(LLUUID regionID)
254 {
255 Console.WriteLine("Searching for Region: '{0}'", regionID.ToString());
256
257 foreach (Scene scene in m_localScenes)
258 {
259 if (scene.RegionInfo.RegionID == regionID)
260 {
261 m_currentScene = scene;
262 return true;
263 }
264 }
265
266 return false;
267 }
268
253 public bool TryGetScene(string regionName, out Scene scene) 269 public bool TryGetScene(string regionName, out Scene scene)
254 { 270 {
255 foreach (Scene mscene in m_localScenes) 271 foreach (Scene mscene in m_localScenes)