* refactor: Move module handling code up into SceneBase from Scene, reducing the large number of different things that Scene does
parent
efcf00ee60
commit
d04025ff3d
|
@ -52,7 +52,7 @@ using OpenSim.Region.Physics.Manager;
|
|||
namespace OpenSim
|
||||
{
|
||||
/// <summary>
|
||||
/// Common OpenSim region service code
|
||||
/// Common OpenSim simulator code
|
||||
/// </summary>
|
||||
public class OpenSimBase : RegionApplicationBase
|
||||
{
|
||||
|
@ -76,13 +76,12 @@ namespace OpenSim
|
|||
/// </summary>
|
||||
protected const string DEFAULT_INV_BACKUP_FILENAME = "opensim_inv.tar.gz";
|
||||
|
||||
protected ConfigSettings m_configSettings;
|
||||
|
||||
public ConfigSettings ConfigurationSettings
|
||||
{
|
||||
get { return m_configSettings; }
|
||||
set { m_configSettings = value; }
|
||||
}
|
||||
protected ConfigSettings m_configSettings;
|
||||
|
||||
protected ConfigurationLoader m_configLoader;
|
||||
|
||||
|
@ -125,13 +124,12 @@ namespace OpenSim
|
|||
get { return m_httpServerPort; }
|
||||
}
|
||||
|
||||
protected ModuleLoader m_moduleLoader;
|
||||
|
||||
public ModuleLoader ModuleLoader
|
||||
{
|
||||
get { return m_moduleLoader; }
|
||||
set { m_moduleLoader = value; }
|
||||
}
|
||||
protected ModuleLoader m_moduleLoader;
|
||||
|
||||
/// <summary>
|
||||
/// Constructor.
|
||||
|
@ -441,7 +439,7 @@ namespace OpenSim
|
|||
if (!String.IsNullOrEmpty(scene.RegionInfo.RegionFile))
|
||||
{
|
||||
File.Delete(scene.RegionInfo.RegionFile);
|
||||
m_log.InfoFormat("[OPENSIM MAIN] deleting region file \"{0}\"", scene.RegionInfo.RegionFile);
|
||||
m_log.InfoFormat("[OPENSIM]: deleting region file \"{0}\"", scene.RegionInfo.RegionFile);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -480,7 +478,7 @@ namespace OpenSim
|
|||
|
||||
public void handleRestartRegion(RegionInfo whichRegion)
|
||||
{
|
||||
m_log.Error("[OPENSIM MAIN]: Got restart signal from SceneManager");
|
||||
m_log.Info("[OPENSIM]: Got restart signal from SceneManager");
|
||||
|
||||
// Shutting down the client server
|
||||
bool foundClientServer = false;
|
||||
|
@ -488,8 +486,6 @@ namespace OpenSim
|
|||
|
||||
for (int i = 0; i < m_clientServers.Count; i++)
|
||||
{
|
||||
//--> Melanie, the following needs to be fixed
|
||||
// the Equals override is not returning true if the locations are actually equal
|
||||
if (m_clientServers[i].HandlesRegion(new Location(whichRegion.RegionHandle)))
|
||||
{
|
||||
clientServerElement = i;
|
||||
|
@ -497,6 +493,7 @@ namespace OpenSim
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (foundClientServer)
|
||||
{
|
||||
m_clientServers[clientServerElement].Server.Close();
|
||||
|
|
|
@ -263,6 +263,7 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain
|
|||
throw new TerrainException(String.Format("unable to load heightmap: parser {0} does not support loading", loader.Value));
|
||||
}
|
||||
}
|
||||
|
||||
CheckForTerrainUpdates();
|
||||
m_log.Info("[TERRAIN]: File (" + filename + ") loaded successfully");
|
||||
return;
|
||||
|
|
|
@ -113,25 +113,6 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
get { return m_sceneGridService; }
|
||||
}
|
||||
|
||||
/// <value>
|
||||
/// All the region modules attached to this scene.
|
||||
/// </value>
|
||||
public Dictionary<string, IRegionModule> Modules
|
||||
{
|
||||
get { return m_modules; }
|
||||
}
|
||||
protected Dictionary<string, IRegionModule> m_modules = new Dictionary<string, IRegionModule>();
|
||||
|
||||
/// <value>
|
||||
/// The module interfaces available from this scene.
|
||||
/// </value>
|
||||
protected Dictionary<Type, List<object> > ModuleInterfaces = new Dictionary<Type, List<object> >();
|
||||
|
||||
protected Dictionary<string, object> ModuleAPIMethods = new Dictionary<string, object>();
|
||||
protected Dictionary<string, ICommander> m_moduleCommanders = new Dictionary<string, ICommander>();
|
||||
|
||||
//API module interfaces
|
||||
|
||||
public IXfer XferManager;
|
||||
|
||||
protected IXMLRPC m_xmlrpcModule;
|
||||
|
@ -281,11 +262,6 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
|
||||
public int objectCapacity = 45000;
|
||||
|
||||
/// <value>
|
||||
/// Registered classes that are capable of creating entities.
|
||||
/// </value>
|
||||
protected Dictionary<PCode, IEntityCreator> m_entityCreators = new Dictionary<PCode, IEntityCreator>();
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
|
@ -737,16 +713,6 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
// De-register with region communications (events cleanup)
|
||||
UnRegisterRegionWithComms();
|
||||
|
||||
// Shut down all non shared modules.
|
||||
foreach (IRegionModule module in Modules.Values)
|
||||
{
|
||||
if (!module.IsSharedModule)
|
||||
{
|
||||
module.Close();
|
||||
}
|
||||
}
|
||||
Modules.Clear();
|
||||
|
||||
// call the base class Close method.
|
||||
base.Close();
|
||||
}
|
||||
|
@ -1838,6 +1804,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
/// <summary>
|
||||
/// Add an object into the scene that has come from storage
|
||||
/// </summary>
|
||||
///
|
||||
/// <param name="sceneObject"></param>
|
||||
/// <param name="attachToBackup">
|
||||
/// If true, changes to the object will be reflected in its persisted data
|
||||
|
@ -3158,127 +3125,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
|
||||
#endregion
|
||||
|
||||
#region Module Methods
|
||||
|
||||
/// <summary>
|
||||
/// Add a module to this scene.
|
||||
/// </summary>
|
||||
/// <param name="name"></param>
|
||||
/// <param name="module"></param>
|
||||
public void AddModule(string name, IRegionModule module)
|
||||
{
|
||||
if (!Modules.ContainsKey(name))
|
||||
{
|
||||
Modules.Add(name, module);
|
||||
}
|
||||
}
|
||||
|
||||
public void RegisterModuleCommander(string name, ICommander commander)
|
||||
{
|
||||
lock (m_moduleCommanders)
|
||||
{
|
||||
m_moduleCommanders.Add(name, commander);
|
||||
}
|
||||
}
|
||||
|
||||
public ICommander GetCommander(string name)
|
||||
{
|
||||
lock (m_moduleCommanders)
|
||||
{
|
||||
return m_moduleCommanders[name];
|
||||
}
|
||||
}
|
||||
|
||||
public Dictionary<string, ICommander> GetCommanders()
|
||||
{
|
||||
return m_moduleCommanders;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Register an interface to a region module. This allows module methods to be called directly as
|
||||
/// well as via events. If there is already a module registered for this interface, it is not replaced
|
||||
/// (is this the best behaviour?)
|
||||
/// </summary>
|
||||
/// <param name="mod"></param>
|
||||
public void RegisterModuleInterface<M>(M mod)
|
||||
{
|
||||
if (!ModuleInterfaces.ContainsKey(typeof(M)))
|
||||
{
|
||||
List<Object> l = new List<Object>();
|
||||
l.Add(mod);
|
||||
ModuleInterfaces.Add(typeof(M), l);
|
||||
|
||||
if (mod is IEntityCreator)
|
||||
{
|
||||
IEntityCreator entityCreator = (IEntityCreator)mod;
|
||||
foreach (PCode pcode in entityCreator.CreationCapabilities)
|
||||
{
|
||||
m_entityCreators[pcode] = entityCreator;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void StackModuleInterface<M>(M mod)
|
||||
{
|
||||
List<Object> l;
|
||||
if (ModuleInterfaces.ContainsKey(typeof(M)))
|
||||
l = ModuleInterfaces[typeof(M)];
|
||||
else
|
||||
l = new List<Object>();
|
||||
|
||||
if (l.Contains(mod))
|
||||
return;
|
||||
|
||||
l.Add(mod);
|
||||
|
||||
if (mod is IEntityCreator)
|
||||
{
|
||||
IEntityCreator entityCreator = (IEntityCreator)mod;
|
||||
foreach (PCode pcode in entityCreator.CreationCapabilities)
|
||||
{
|
||||
m_entityCreators[pcode] = entityCreator;
|
||||
}
|
||||
}
|
||||
|
||||
ModuleInterfaces[typeof(M)] = l;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// For the given interface, retrieve the region module which implements it.
|
||||
/// </summary>
|
||||
/// <returns>null if there is no registered module implementing that interface</returns>
|
||||
public override T RequestModuleInterface<T>()
|
||||
{
|
||||
if (ModuleInterfaces.ContainsKey(typeof(T)))
|
||||
{
|
||||
return (T)ModuleInterfaces[typeof(T)][0];
|
||||
}
|
||||
else
|
||||
{
|
||||
return default(T);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// For the given interface, retrieve an array of region modules that implement it.
|
||||
/// </summary>
|
||||
/// <returns>an empty array if there are no registered modules implementing that interface</returns>
|
||||
public override T[] RequestModuleInterfaces<T>()
|
||||
{
|
||||
if (ModuleInterfaces.ContainsKey(typeof(T)))
|
||||
{
|
||||
List<T> ret = new List<T>();
|
||||
|
||||
foreach (Object o in ModuleInterfaces[typeof(T)])
|
||||
ret.Add((T)o);
|
||||
return ret.ToArray();
|
||||
}
|
||||
else
|
||||
{
|
||||
return new T[] { default(T) };
|
||||
}
|
||||
}
|
||||
#region Other Methods
|
||||
|
||||
public void SetObjectCapacity(int objects)
|
||||
{
|
||||
|
@ -3314,10 +3161,6 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
return CommsManager.TriggerTerminateFriend(regionHandle, agentID, exFriendID);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Other Methods
|
||||
|
||||
public virtual void StoreAddFriendship(UUID ownerID, UUID friendID, uint perms)
|
||||
{
|
||||
m_sceneGridService.AddNewUserFriend(ownerID, friendID, perms);
|
||||
|
@ -3563,12 +3406,10 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Shows various details about the sim based on the parameters supplied by the console command in openSimMain.
|
||||
/// </summary>
|
||||
/// <param name="showParams">What to show</param>
|
||||
public void Show(string[] showParams)
|
||||
public override void Show(string[] showParams)
|
||||
{
|
||||
base.Show(showParams);
|
||||
|
||||
switch (showParams[0])
|
||||
{
|
||||
case "users":
|
||||
|
@ -3587,16 +3428,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
"Unknown",
|
||||
RegionInfo.RegionName);
|
||||
}
|
||||
break;
|
||||
case "modules":
|
||||
m_log.Error("The currently loaded modules in " + RegionInfo.RegionName + " are:");
|
||||
foreach (IRegionModule module in Modules.Values)
|
||||
{
|
||||
if (!module.IsSharedModule)
|
||||
{
|
||||
m_log.Error("Region Module: " + module.Name);
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -49,6 +49,30 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
|
||||
#region Fields
|
||||
|
||||
/// <value>
|
||||
/// All the region modules attached to this scene.
|
||||
/// </value>
|
||||
public Dictionary<string, IRegionModule> Modules
|
||||
{
|
||||
get { return m_modules; }
|
||||
}
|
||||
protected Dictionary<string, IRegionModule> m_modules = new Dictionary<string, IRegionModule>();
|
||||
|
||||
/// <value>
|
||||
/// The module interfaces available from this scene.
|
||||
/// </value>
|
||||
protected Dictionary<Type, List<object> > ModuleInterfaces = new Dictionary<Type, List<object> >();
|
||||
|
||||
protected Dictionary<string, object> ModuleAPIMethods = new Dictionary<string, object>();
|
||||
protected Dictionary<string, ICommander> m_moduleCommanders = new Dictionary<string, ICommander>();
|
||||
|
||||
/// <value>
|
||||
/// Registered classes that are capable of creating entities.
|
||||
/// </value>
|
||||
protected Dictionary<PCode, IEntityCreator> m_entityCreators = new Dictionary<PCode, IEntityCreator>();
|
||||
|
||||
//API module interfaces
|
||||
|
||||
/// <summary>
|
||||
/// The last allocated local prim id. When a new local id is requested, the next number in the sequence is
|
||||
/// dispensed.
|
||||
|
@ -202,6 +226,16 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
/// </summary>
|
||||
public virtual void Close()
|
||||
{
|
||||
// Shut down all non shared modules.
|
||||
foreach (IRegionModule module in Modules.Values)
|
||||
{
|
||||
if (!module.IsSharedModule)
|
||||
{
|
||||
module.Close();
|
||||
}
|
||||
}
|
||||
Modules.Clear();
|
||||
|
||||
try
|
||||
{
|
||||
EventManager.TriggerShutdown();
|
||||
|
@ -229,14 +263,149 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
return myID;
|
||||
}
|
||||
|
||||
public virtual T RequestModuleInterface<T>()
|
||||
#region Module Methods
|
||||
|
||||
/// <summary>
|
||||
/// Add a module to this scene.
|
||||
/// </summary>
|
||||
/// <param name="name"></param>
|
||||
/// <param name="module"></param>
|
||||
public void AddModule(string name, IRegionModule module)
|
||||
{
|
||||
if (!Modules.ContainsKey(name))
|
||||
{
|
||||
Modules.Add(name, module);
|
||||
}
|
||||
}
|
||||
|
||||
public void RegisterModuleCommander(string name, ICommander commander)
|
||||
{
|
||||
lock (m_moduleCommanders)
|
||||
{
|
||||
m_moduleCommanders.Add(name, commander);
|
||||
}
|
||||
}
|
||||
|
||||
public ICommander GetCommander(string name)
|
||||
{
|
||||
lock (m_moduleCommanders)
|
||||
{
|
||||
return m_moduleCommanders[name];
|
||||
}
|
||||
}
|
||||
|
||||
public Dictionary<string, ICommander> GetCommanders()
|
||||
{
|
||||
return m_moduleCommanders;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Register an interface to a region module. This allows module methods to be called directly as
|
||||
/// well as via events. If there is already a module registered for this interface, it is not replaced
|
||||
/// (is this the best behaviour?)
|
||||
/// </summary>
|
||||
/// <param name="mod"></param>
|
||||
public void RegisterModuleInterface<M>(M mod)
|
||||
{
|
||||
if (!ModuleInterfaces.ContainsKey(typeof(M)))
|
||||
{
|
||||
List<Object> l = new List<Object>();
|
||||
l.Add(mod);
|
||||
ModuleInterfaces.Add(typeof(M), l);
|
||||
|
||||
if (mod is IEntityCreator)
|
||||
{
|
||||
IEntityCreator entityCreator = (IEntityCreator)mod;
|
||||
foreach (PCode pcode in entityCreator.CreationCapabilities)
|
||||
{
|
||||
m_entityCreators[pcode] = entityCreator;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void StackModuleInterface<M>(M mod)
|
||||
{
|
||||
List<Object> l;
|
||||
if (ModuleInterfaces.ContainsKey(typeof(M)))
|
||||
l = ModuleInterfaces[typeof(M)];
|
||||
else
|
||||
l = new List<Object>();
|
||||
|
||||
if (l.Contains(mod))
|
||||
return;
|
||||
|
||||
l.Add(mod);
|
||||
|
||||
if (mod is IEntityCreator)
|
||||
{
|
||||
IEntityCreator entityCreator = (IEntityCreator)mod;
|
||||
foreach (PCode pcode in entityCreator.CreationCapabilities)
|
||||
{
|
||||
m_entityCreators[pcode] = entityCreator;
|
||||
}
|
||||
}
|
||||
|
||||
ModuleInterfaces[typeof(M)] = l;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// For the given interface, retrieve the region module which implements it.
|
||||
/// </summary>
|
||||
/// <returns>null if there is no registered module implementing that interface</returns>
|
||||
public T RequestModuleInterface<T>()
|
||||
{
|
||||
if (ModuleInterfaces.ContainsKey(typeof(T)))
|
||||
{
|
||||
return (T)ModuleInterfaces[typeof(T)][0];
|
||||
}
|
||||
else
|
||||
{
|
||||
return default(T);
|
||||
}
|
||||
}
|
||||
|
||||
public virtual T[] RequestModuleInterfaces<T>()
|
||||
/// <summary>
|
||||
/// For the given interface, retrieve an array of region modules that implement it.
|
||||
/// </summary>
|
||||
/// <returns>an empty array if there are no registered modules implementing that interface</returns>
|
||||
public T[] RequestModuleInterfaces<T>()
|
||||
{
|
||||
if (ModuleInterfaces.ContainsKey(typeof(T)))
|
||||
{
|
||||
List<T> ret = new List<T>();
|
||||
|
||||
foreach (Object o in ModuleInterfaces[typeof(T)])
|
||||
ret.Add((T)o);
|
||||
return ret.ToArray();
|
||||
}
|
||||
else
|
||||
{
|
||||
return new T[] { default(T) };
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// Shows various details about the sim based on the parameters supplied by the console command in openSimMain.
|
||||
/// </summary>
|
||||
/// <param name="showParams">What to show</param>
|
||||
public virtual void Show(string[] showParams)
|
||||
{
|
||||
switch (showParams[0])
|
||||
{
|
||||
case "modules":
|
||||
m_log.Error("The currently loaded modules in " + RegionInfo.RegionName + " are:");
|
||||
foreach (IRegionModule module in Modules.Values)
|
||||
{
|
||||
if (!module.IsSharedModule)
|
||||
{
|
||||
m_log.Error("Region Module: " + module.Name);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue