Thank you kindly, RandomHuman for a patch that:

The admin_close_region method removes a region from the simulator without deleting it. 
The region can then be recreated by calling admin_create_region with the same UUID. 
There is also a change to admin_create_region to facilitate this.The reason I want 
to have this functionality is to make it possible to detach regions when they are 
idle and recreate them on demand through a web interface. It's probably doable 
using the existing methods by saving and loading oars, but it also doesn't seem 
like that should be necessary.
trunk
Charles Krinke 2009-07-08 20:53:22 +00:00
parent 9d5d2f8fd4
commit 525ab2c278
2 changed files with 125 additions and 0 deletions

View File

@ -107,6 +107,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
Dictionary<string, XmlRpcMethod> availableMethods = new Dictionary<string, XmlRpcMethod>();
availableMethods["admin_create_region"] = XmlRpcCreateRegionMethod;
availableMethods["admin_delete_region"] = XmlRpcDeleteRegionMethod;
availableMethods["admin_close_region"] = XmlRpcCloseRegionMethod;
availableMethods["admin_modify_region"] = XmlRpcModifyRegionMethod;
availableMethods["admin_region_query"] = XmlRpcRegionQueryMethod;
availableMethods["admin_shutdown"] = XmlRpcShutdownMethod;
@ -507,6 +508,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
RegionInfo region = new RegionInfo();
region.RegionID = regionID;
region.originRegionID = regionID;
region.RegionName = (string) requestData["region_name"];
region.RegionLocX = Convert.ToUInt32(requestData["region_x"]);
region.RegionLocY = Convert.ToUInt32(requestData["region_y"]);
@ -735,6 +737,98 @@ namespace OpenSim.ApplicationPlugins.RemoteController
return response;
}
}
/// <summary>
/// Close a region.
/// <summary>
/// <param name="request">incoming XML RPC request</param>
/// <remarks>
/// XmlRpcCloseRegionMethod takes the following XMLRPC
/// parameters
/// <list type="table">
/// <listheader><term>parameter name</term><description>description</description></listheader>
/// <item><term>password</term>
/// <description>admin password as set in OpenSim.ini</description></item>
/// <item><term>region_name</term>
/// <description>desired region name</description></item>
/// <item><term>region_id</term>
/// <description>(optional) desired region UUID</description></item>
/// </list>
///
/// XmlRpcShutdownRegionMethod returns
/// <list type="table">
/// <listheader><term>name</term><description>description</description></listheader>
/// <item><term>success</term>
/// <description>true or false</description></item>
/// <item><term>region_name</term>
/// <description>the region name if success is true</description></item>
/// <item><term>error</term>
/// <description>error message if success is false</description></item>
/// </list>
/// </remarks>
public XmlRpcResponse XmlRpcCloseRegionMethod(XmlRpcRequest request, IPEndPoint remoteClient)
{
m_log.Info("[RADMIN]: CloseRegion: new request");
XmlRpcResponse response = new XmlRpcResponse();
Hashtable responseData = new Hashtable();
Scene scene = null;
lock (rslock)
{
try
{
Hashtable requestData = (Hashtable) request.Params[0];
checkStringParameters(request, new string[] {"password"});
if (requestData.ContainsKey("region_id") &&
!String.IsNullOrEmpty((string) requestData["region_id"]))
{
// Region specified by UUID
UUID regionID = (UUID) (string) requestData["region_id"];
if (!m_app.SceneManager.TryGetScene(regionID, out scene))
throw new Exception(String.Format("region \"{0}\" does not exist", regionID));
m_app.CloseRegion(scene);
responseData["success"] = true;
responseData["region_id"] = regionID;
response.Value = responseData;
}
else if (requestData.ContainsKey("region_name") &&
!String.IsNullOrEmpty((string) requestData["region_name"]))
{
// Region specified by name
string regionName = (string) requestData["region_name"];
if (!m_app.SceneManager.TryGetScene(regionName, out scene))
throw new Exception(String.Format("region \"{0}\" does not exist", regionName));
m_app.CloseRegion(scene);
responseData["success"] = true;
responseData["region_name"] = regionName;
response.Value = responseData;
}
else
throw new Exception("no region specified");
}
catch (Exception e)
{
m_log.ErrorFormat("[RADMIN] CloseRegion: failed {0}", e.Message);
m_log.DebugFormat("[RADMIN] CloseRegion: failed {0}", e.ToString());
responseData["success"] = false;
responseData["error"] = e.Message;
response.Value = responseData;
}
m_log.Info("[RADMIN]: CloseRegion: request complete");
return response;
}
}
/// <summary>
/// Change characteristics of an existing region.

View File

@ -503,6 +503,37 @@ namespace OpenSim
RemoveRegion(target, cleanUp);
}
/// <summary>
/// Remove a region from the simulator without deleting it permanently.
/// </summary>
/// <param name="scene"></param>
/// <returns></returns>
public void CloseRegion(Scene scene)
{
// only need to check this if we are not at the
// root level
if ((m_sceneManager.CurrentScene != null) &&
(m_sceneManager.CurrentScene.RegionInfo.RegionID == scene.RegionInfo.RegionID))
{
m_sceneManager.TrySetCurrentScene("..");
}
m_sceneManager.CloseScene(scene);
}
/// <summary>
/// Remove a region from the simulator without deleting it permanently.
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public void CloseRegion(string name)
{
Scene target;
if (m_sceneManager.TryGetScene(name, out target))
CloseRegion(target);
}
/// <summary>
/// Create a scene and its initial base structures.
/// </summary>