1. Restored SceneObjectSerializer.SOGToXml2() as in opensim trunk (master), so that objects

are serialized properly.
2. Added code to pass ActorType from a particular ActorSyncModule to RegionSyncModule.
dsg
Huaiyu (Kitty) Liu 2010-12-23 11:33:12 -08:00
parent dc6964444e
commit 650b0bfe54
4 changed files with 70 additions and 65 deletions

View File

@ -53,17 +53,18 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
m_actorID = m_sysConfig.GetString("ActorID", "");
if (m_actorID == "")
{
m_log.Error("ActorID not defined in [RegionSyncModule] section in config file");
m_log.Error("ActorID not defined in [RegionSyncModule] section in config file. Shutting down.");
return;
}
m_isSyncRelay = m_sysConfig.GetBoolean("IsSyncRelay", false);
m_isSyncListenerLocal = m_sysConfig.GetBoolean("IsSyncListenerLocal", false);
m_active = true;
m_log.Warn("[REGION SYNC MODULE] Initialised for actor "+ m_actorID);
//The ActorType configuration will be read in and process by an ActorSyncModule, not here.
}
//Called after Initialise()
@ -127,10 +128,16 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
// Synchronization related members and functions, exposed through IRegionSyncModule interface
///////////////////////////////////////////////////////////////////////////////////////////////////
private DSGActorTypes m_actorType;
private DSGActorTypes m_actorType = DSGActorTypes.Unknown;
/// <summary>
/// The type of the actor running locally. This value will be set by an ActorSyncModule, so that
/// no hard code needed in RegionSyncModule to recoganize the actor's type, thus make it easier
/// to add new ActorSyncModules w/o chaning the code in RegionSyncModule.
/// </summary>
public DSGActorTypes DSGActorType
{
get { return m_actorType; }
set { m_actorType = value; }
}
private string m_actorID;
@ -298,8 +305,14 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
m_remoteSyncListeners.Add(info);
}
//Start SyncListener if a listener is supposed to run on this actor; Otherwise, initiate connections to remote listeners.
private void SyncStart(Object[] args)
{
if (m_actorType == DSGActorTypes.Unknown)
{
m_log.Error(LogHeader + ": SyncStart -- ActorType not set yet. Either it's not defined in config file (DSGActorType), or the ActorSyncModule (ScenePersistenceSyncModule, etc) didn't pass it on to RegionSyncModule");
return;
}
if (m_isSyncListenerLocal)
{
@ -421,7 +434,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
m_log.WarnFormat("Sending region name: \"{0}\"", m_scene.RegionInfo.RegionName);
SendSyncMessage(SymmetricSyncMessage.MsgType.GetTerrain);
//Send(new RegionSyncMessage(RegionSyncMessage.MsgType.GetObjects));
SendSyncMessage(SymmetricSyncMessage.MsgType.GetObjects);
//Send(new RegionSyncMessage(RegionSyncMessage.MsgType.GetAvatars));
//We'll deal with Event a bit later
@ -532,8 +545,16 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
private void HandleAddNewObject(SceneObjectGroup sog)
{
if (m_scene.AddNewSceneObject(sog, true)){
bool attachToBackup = false;
//only need to persist the scene if this is the ScenePersistence
if (m_actorType == DSGActorTypes.ScenePersistence)
{
attachToBackup = true;
}
if (m_scene.AddNewSceneObject(sog, attachToBackup))
{
m_log.Debug(LogHeader + ": added obj " + sog.UUID);
}
}

View File

@ -38,7 +38,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
}
* */
public class ScenePersistenceSyncModule : INonSharedRegionModule, IScenePersistenceSyncModule
public class ScenePersistenceSyncModule : INonSharedRegionModule, IDSGActorSyncModule
{
#region INonSharedRegionModule
@ -77,8 +77,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
//connect with scene
m_scene = scene;
//register the module
m_scene.RegisterModuleInterface<IScenePersistenceSyncModule>(this);
//register the module with SceneGraph. If needed, SceneGraph checks the module's ActorType to know what type of module it is.
m_scene.RegisterModuleInterface<IDSGActorSyncModule>(this);
// Setup the command line interface
//m_scene.EventManager.OnPluginConsole += EventManager_OnPluginConsole;
@ -88,7 +88,14 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
//Called after AddRegion() has been called for all region modules of the scene
public void RegionLoaded(Scene scene)
{
if (m_scene.RegionSyncModule != null)
{
m_scene.RegionSyncModule.DSGActorType = m_actorType;
}
else
{
m_log.Warn("RegionSyncModule is not initiated!!");
}
}
public void RemoveRegion(Scene scene)
@ -114,8 +121,17 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
#endregion //IRegionModule
#region RegionSyncModule members and functions
#region IDSGActorSyncModule members and functions
private DSGActorTypes m_actorType = DSGActorTypes.ScenePersistence;
public DSGActorTypes ActorType
{
get { return m_actorType; }
}
#endregion //INonSharedRegionModule
#region ScenePersistenceSyncModule memebers and functions
private ILog m_log;
private bool m_active = false;
public bool Active
@ -124,56 +140,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
}
private Scene m_scene;
public Scene LocalScene
{
get { return m_scene; }
}
#endregion //INonSharedRegionModule members and functions
}
/*
public class RegionSyncListener
{
// Start the listener
public void Start()
{
m_listenerThread = new Thread(new ThreadStart(Listen));
m_listenerThread.Name = "RegionSyncServer Listener";
m_log.WarnFormat("[REGION SYNC SERVER] Starting {0} thread", m_listenerThread.Name);
m_listenerThread.Start();
//m_log.Warn("[REGION SYNC SERVER] Started");
#endregion //ScenePersistenceSyncModule
}
// Listen for connections from a new RegionSyncClient
// When connected, start the ReceiveLoop for the new client
private void Listen()
{
m_listener = new TcpListener(m_addr, m_port);
try
{
// Start listening for clients
m_listener.Start();
while (true)
{
// *** Move/Add TRY/CATCH to here, but we don't want to spin loop on the same error
m_log.WarnFormat("[REGION SYNC SERVER] Listening for new connections on {0}:{1}...", m_addr.ToString(), m_port.ToString());
TcpClient tcpclient = m_listener.AcceptTcpClient();
IPAddress addr = ((IPEndPoint)tcpclient.Client.RemoteEndPoint).Address;
int port = ((IPEndPoint)tcpclient.Client.RemoteEndPoint).Port;
//pass the tcpclient information to RegionSyncModule, who will then create a SyncConnector
}
}
catch (SocketException e)
{
m_log.WarnFormat("[REGION SYNC SERVER] [Listen] SocketException: {0}", e);
}
}
}
* */
}

View File

@ -406,7 +406,10 @@ namespace OpenSim.Region.Framework.Scenes
{
get { return m_AvatarFactory; }
}
#region REGION SYNC
#region REGION SYNC -- Asymmetric sync, old style, depreciated ---------
protected IRegionSyncServerModule m_regionSyncServerModule;
protected IRegionSyncClientModule m_regionSyncClientModule;
@ -574,6 +577,21 @@ namespace OpenSim.Region.Framework.Scenes
// }
#endregion
#region SYMMETRIC SYNC
///////////////////////////////////////////////////////////////////////////////////////////////
//KittyL: 12/23/2010. SYMMETRIC SYNC: Implementation for the symmetric synchronization model.
///////////////////////////////////////////////////////////////////////////////////////////////
private IRegionSyncModule m_regionSyncModule = null;
public IRegionSyncModule RegionSyncModule
{
get { return m_regionSyncModule; }
set { m_regionSyncModule = value; }
}
#endregion //SYMMETRIC SYNC
public ICapabilitiesModule CapsModule
{
get { return m_capsModule; }

View File

@ -1057,15 +1057,10 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
////////// Write /////////
public static void SOGToXml2(XmlTextWriter writer, SceneObjectGroup sog, Dictionary<string, object>options)
public static void SOGToXml2(XmlTextWriter writer, SceneObjectGroup sog, Dictionary<string, object> options)
{
writer.WriteStartElement(String.Empty, "SceneObjectGroup", String.Empty);
//REGION SYNG
//Need to add LocX,LocY of the Scene that the object is located in.
//writer.WriteStartElement(String.Empty, "LocX", String.Empty);
//end of REGION SYGN
SOPToXml2(writer, sog.RootPart, options);
writer.WriteStartElement(String.Empty, "OtherParts", String.Empty);
sog.ForEachPart(delegate(SceneObjectPart sop)