Merge branch 'master' of ssh://diva@opensimulator.org/var/git/opensim

arthursv
Diva Canto 2009-08-15 08:21:15 -07:00
commit dd8b9d5810
5 changed files with 337 additions and 29 deletions

View File

@ -77,7 +77,6 @@ what it is today.
* Intimidated
* Jeremy Bongio (IBM)
* jhurliman
* Mike Osias (IBM)
* John R Sohn (XenReborn)
* jonc
* Junta Kohime
@ -91,6 +90,7 @@ what it is today.
* maimedleech
* Mic Bowman
* Michelle Argus
* Mike Osias (IBM)
* Mike Pitman (IBM)
* mikkopa/_someone - RealXtend
* Mircea Kitsune
@ -119,9 +119,11 @@ what it is today.
* Xantor
* Y. Nitta
* YZh
* Zackary Geers aka Kunnis Basiat
* Zha Ewry
LSL Devs
* Alondria

View File

@ -1038,6 +1038,10 @@ namespace OpenSim.Region.Framework.Scenes
}
}
/// <summary>
/// Send out simstats data to all clients
/// </summary>
/// <param name="stats">Stats on the Simulator's performance</param>
private void SendSimStatsPackets(SimStats stats)
{
List<ScenePresence> StatSendAgents = GetScenePresences();
@ -1050,6 +1054,9 @@ namespace OpenSim.Region.Framework.Scenes
}
}
/// <summary>
/// Recount SceneObjectPart in parcel aabb
/// </summary>
private void UpdateLand()
{
if (LandChannel != null)
@ -1061,11 +1068,17 @@ namespace OpenSim.Region.Framework.Scenes
}
}
/// <summary>
/// Update the terrain if it needs to be updated.
/// </summary>
private void UpdateTerrain()
{
EventManager.TriggerTerrainTick();
}
/// <summary>
/// Back up queued up changes
/// </summary>
private void UpdateStorageBackup()
{
if (!m_backingup)
@ -1078,6 +1091,9 @@ namespace OpenSim.Region.Framework.Scenes
}
}
/// <summary>
/// Sends out the OnFrame event to the modules
/// </summary>
private void UpdateEvents()
{
m_eventManager.TriggerOnFrame();
@ -1133,6 +1149,10 @@ namespace OpenSim.Region.Framework.Scenes
}
}
/// <summary>
/// Synchronous force backup. For deletes and links/unlinks
/// </summary>
/// <param name="group">Object to be backed up</param>
public void ForceSceneObjectBackup(SceneObjectGroup group)
{
if (group != null)
@ -1141,6 +1161,13 @@ namespace OpenSim.Region.Framework.Scenes
}
}
/// <summary>
/// Return object to avatar Message
/// </summary>
/// <param name="agentID">Avatar Unique Id</param>
/// <param name="objectName">Name of object returned</param>
/// <param name="location">Location of object returned</param>
/// <param name="reason">Reasion for object return</param>
public void AddReturn(UUID agentID, string objectName, Vector3 location, string reason)
{
lock (m_returns)
@ -1167,6 +1194,9 @@ namespace OpenSim.Region.Framework.Scenes
#region Load Terrain
/// <summary>
/// Store the terrain in the persistant data store
/// </summary>
public void SaveTerrain()
{
m_storageManager.DataStore.StoreTerrain(Heightmap.GetDoubles(), RegionInfo.RegionID);
@ -1269,6 +1299,10 @@ namespace OpenSim.Region.Framework.Scenes
#region Load Land
/// <summary>
/// Loads all Parcel data from the datastore for region identified by regionID
/// </summary>
/// <param name="regionID">Unique Identifier of the Region to load parcel data for</param>
public void loadAllLandObjectsFromStorage(UUID regionID)
{
m_log.Info("[SCENE]: Loading land objects from storage");
@ -1322,6 +1356,20 @@ namespace OpenSim.Region.Framework.Scenes
m_log.Info("[SCENE]: Loaded " + PrimsFromDB.Count.ToString() + " SceneObject(s)");
}
/// <summary>
/// Gets a new rez location based on the raycast and the size of the object that is being rezzed.
/// </summary>
/// <param name="RayStart"></param>
/// <param name="RayEnd"></param>
/// <param name="RayTargetID"></param>
/// <param name="rot"></param>
/// <param name="bypassRayCast"></param>
/// <param name="RayEndIsIntersection"></param>
/// <param name="frontFacesOnly"></param>
/// <param name="scale"></param>
/// <param name="FaceCenter"></param>
/// <returns></returns>
public Vector3 GetNewRezLocation(Vector3 RayStart, Vector3 RayEnd, UUID RayTargetID, Quaternion rot, byte bypassRayCast, byte RayEndIsIntersection, bool frontFacesOnly, Vector3 scale, bool FaceCenter)
{
Vector3 pos = Vector3.Zero;
@ -1412,6 +1460,19 @@ namespace OpenSim.Region.Framework.Scenes
}
}
/// <summary>
/// Create a New SceneObjectGroup/Part by raycasting
/// </summary>
/// <param name="ownerID"></param>
/// <param name="groupID"></param>
/// <param name="RayEnd"></param>
/// <param name="rot"></param>
/// <param name="shape"></param>
/// <param name="bypassRaycast"></param>
/// <param name="RayStart"></param>
/// <param name="RayTargetID"></param>
/// <param name="RayEndIsIntersection"></param>
public virtual void AddNewPrim(UUID ownerID, UUID groupID, Vector3 RayEnd, Quaternion rot, PrimitiveBaseShape shape,
byte bypassRaycast, Vector3 RayStart, UUID RayTargetID,
byte RayEndIsIntersection)
@ -1829,6 +1890,12 @@ namespace OpenSim.Region.Framework.Scenes
return true;
}
/// <summary>
/// Attachment rezzing
/// </summary>
/// <param name="userID">Agent Unique ID</param>
/// <param name="itemID">Object ID</param>
/// <returns>False</returns>
public virtual bool IncomingCreateObject(UUID userID, UUID itemID)
{
ScenePresence sp = GetScenePresence(userID);
@ -1841,6 +1908,13 @@ namespace OpenSim.Region.Framework.Scenes
return false;
}
/// <summary>
/// Adds a Scene Object group to the Scene.
/// Verifies that the creator of the object is not banned from the simulator.
/// Checks if the item is an Attachment
/// </summary>
/// <param name="sceneObject"></param>
/// <returns>True if the SceneObjectGroup was added, False if it was not</returns>
public bool AddSceneObject(SceneObjectGroup sceneObject)
{
// If the user is banned, we won't let any of their objects
@ -1933,6 +2007,10 @@ namespace OpenSim.Region.Framework.Scenes
#region Add/Remove Avatar Methods
/// <summary>
/// Adding a New Client and Create a Presence for it.
/// </summary>
/// <param name="client"></param>
public override void AddNewClient(IClientAPI client)
{
SubscribeToClientEvents(client);
@ -1977,6 +2055,10 @@ namespace OpenSim.Region.Framework.Scenes
EventManager.TriggerOnNewClient(client);
}
/// <summary>
/// Register for events from the client
/// </summary>
/// <param name="client">The IClientAPI of the connected client</param>
protected virtual void SubscribeToClientEvents(IClientAPI client)
{
client.OnRegionHandShakeReply += SendLayerData;
@ -2070,8 +2152,8 @@ namespace OpenSim.Region.Framework.Scenes
/// <summary>
/// Teleport an avatar to their home region
/// </summary>
/// <param name="agentId"></param>
/// <param name="client"></param>
/// <param name="agentId">The avatar's Unique ID</param>
/// <param name="client">The IClientAPI for the client</param>
public virtual void TeleportClientHome(UUID agentId, IClientAPI client)
{
UserProfileData UserProfile = CommsManager.UserService.GetUserProfile(agentId);
@ -2099,6 +2181,21 @@ namespace OpenSim.Region.Framework.Scenes
}
}
/// <summary>
/// Duplicates object specified by localID at position raycasted against RayTargetObject using
/// RayEnd and RayStart to determine what the angle of the ray is
/// </summary>
/// <param name="localID">ID of object to duplicate</param>
/// <param name="dupeFlags"></param>
/// <param name="AgentID">Agent doing the duplication</param>
/// <param name="GroupID">Group of new object</param>
/// <param name="RayTargetObj">The target of the Ray</param>
/// <param name="RayEnd">The ending of the ray (farthest away point)</param>
/// <param name="RayStart">The Beginning of the ray (closest point)</param>
/// <param name="BypassRaycast">Bool to bypass raycasting</param>
/// <param name="RayEndIsIntersection">The End specified is the place to add the object</param>
/// <param name="CopyCenters">Position the object at the center of the face that it's colliding with</param>
/// <param name="CopyRotates">Rotate the object the same as the localID object</param>
public void doObjectDuplicateOnRay(uint localID, uint dupeFlags, UUID AgentID, UUID GroupID,
UUID RayTargetObj, Vector3 RayEnd, Vector3 RayStart,
bool BypassRaycast, bool RayEndIsIntersection, bool CopyCenters, bool CopyRotates)
@ -2170,6 +2267,14 @@ namespace OpenSim.Region.Framework.Scenes
}
}
/// <summary>
/// Sets the Home Point. The GridService uses this to know where to put a user when they log-in
/// </summary>
/// <param name="remoteClient"></param>
/// <param name="regionHandle"></param>
/// <param name="position"></param>
/// <param name="lookAt"></param>
/// <param name="flags"></param>
public virtual void SetHomeRezPoint(IClientAPI remoteClient, ulong regionHandle, Vector3 position, Vector3 lookAt, uint flags)
{
UserProfileData UserProfile = CommsManager.UserService.GetUserProfile(remoteClient.AgentId);
@ -2340,6 +2445,12 @@ namespace OpenSim.Region.Framework.Scenes
}
}
/// <summary>
/// Removes region from an avatar's known region list. This coincides with child agents. For each child agent, there will be a known region entry.
///
/// </summary>
/// <param name="avatarID"></param>
/// <param name="regionslst"></param>
public void HandleRemoveKnownRegionsFromAvatar(UUID avatarID, List<ulong> regionslst)
{
ScenePresence av = GetScenePresence(avatarID);
@ -2355,12 +2466,19 @@ namespace OpenSim.Region.Framework.Scenes
}
}
/// <summary>
/// Closes all endpoints with the circuitcode provided.
/// </summary>
/// <param name="circuitcode">Circuit Code of the endpoint to close</param>
public override void CloseAllAgents(uint circuitcode)
{
// Called by ClientView to kill all circuit codes
ClientManager.CloseAllAgents(circuitcode);
}
/// <summary>
/// Inform all other ScenePresences on this Scene that someone else has changed position on the minimap.
/// </summary>
public void NotifyMyCoarseLocationChange()
{
ForEachScenePresence(delegate(ScenePresence presence) { presence.CoarseLocationChange(); });
@ -2455,9 +2573,10 @@ namespace OpenSim.Region.Framework.Scenes
/// The return bool should allow for connections to be refused, but as not all calling paths
/// take proper notice of it let, we allowed banned users in still.
/// </summary>
/// <param name="regionHandle"></param>
/// <param name="agent"></param>
/// <param name="reason"></param>
/// <param name="agent">CircuitData of the agent who is connecting</param>
/// <param name="reason">Outputs the reason for the false response on this string</param>
/// <returns>True if the region accepts this agent. False if it does not. False will
/// also return a reason.</returns>
public bool NewUserConnection(AgentCircuitData agent, out string reason)
{
// Don't disable this log message - it's too helpful
@ -2530,6 +2649,13 @@ namespace OpenSim.Region.Framework.Scenes
return true;
}
/// <summary>
/// Verifies that the user has a session on the Grid
/// </summary>
/// <param name="agent">Circuit Data of the Agent we're verifying</param>
/// <param name="reason">Outputs the reason for the false response on this string</param>
/// <returns>True if the user has a session on the grid. False if it does not. False will
/// also return a reason.</returns>
public virtual bool AuthenticateUser(AgentCircuitData agent, out string reason)
{
reason = String.Empty;
@ -2542,6 +2668,13 @@ namespace OpenSim.Region.Framework.Scenes
return result;
}
/// <summary>
/// Verify if the user can connect to this region. Checks the banlist and ensures that the region is set for public access
/// </summary>
/// <param name="agent">The circuit data for the agent</param>
/// <param name="reason">outputs the reason to this string</param>
/// <returns>True if the region accepts this agent. False if it does not. False will
/// also return a reason.</returns>
protected virtual bool AuthorizeUser(AgentCircuitData agent, out string reason)
{
reason = String.Empty;
@ -2600,16 +2733,32 @@ namespace OpenSim.Region.Framework.Scenes
return true;
}
/// <summary>
/// Update an AgentCircuitData object with new information
/// </summary>
/// <param name="data">Information to update the AgentCircuitData with</param>
public void UpdateCircuitData(AgentCircuitData data)
{
m_authenticateHandler.UpdateAgentData(data);
}
/// <summary>
/// Change the Circuit Code for the user's Circuit Data
/// </summary>
/// <param name="oldcc">The old Circuit Code. Must match a previous circuit code</param>
/// <param name="newcc">The new Circuit Code. Must not be an already existing circuit code</param>
/// <returns>True if we successfully changed it. False if we did not</returns>
public bool ChangeCircuitCode(uint oldcc, uint newcc)
{
return m_authenticateHandler.TryChangeCiruitCode(oldcc, newcc);
}
/// <summary>
/// The Grid has requested that we log-off a user. Log them off.
/// </summary>
/// <param name="AvatarID">Unique ID of the avatar to log-off</param>
/// <param name="RegionSecret">SecureSessionID of the user, or the RegionSecret text when logging on to the grid</param>
/// <param name="message">message to display to the user. Reason for being logged off</param>
public void HandleLogOffUserFromGrid(UUID AvatarID, UUID RegionSecret, string message)
{
ScenePresence loggingOffUser = null;
@ -2675,6 +2824,13 @@ namespace OpenSim.Region.Framework.Scenes
}
}
/// <summary>
/// We've got an update about an agent that sees into this region,
/// send it to ScenePresence for processing It's the full data.
/// </summary>
/// <param name="cAgentData">Agent that contains all of the relevant things about an agent.
/// Appearance, animations, position, etc.</param>
/// <returns>true if we handled it.</returns>
public virtual bool IncomingChildAgentDataUpdate(AgentData cAgentData)
{
// m_log.DebugFormat(
@ -2692,6 +2848,12 @@ namespace OpenSim.Region.Framework.Scenes
return false;
}
/// <summary>
/// We've got an update about an agent that sees into this region,
/// send it to ScenePresence for processing It's only positional data
/// </summary>
/// <param name="cAgentData">AgentPosition that contains agent positional data so we can know what to send</param>
/// <returns>true if we handled it.</returns>
public virtual bool IncomingChildAgentDataUpdate(AgentPosition cAgentData)
{
//m_log.Debug(" XXX Scene IncomingChildAgentDataUpdate POSITION in " + RegionInfo.RegionName);

View File

@ -48,6 +48,9 @@ namespace OpenSim.Region.Framework.Scenes
public delegate void RemoveKnownRegionsFromAvatarList(UUID avatarID, List<ulong> regionlst);
/// <summary>
/// Class that Region communications runs through
/// </summary>
public class SceneCommunicationService //one instance per region
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
@ -60,15 +63,46 @@ namespace OpenSim.Region.Framework.Scenes
protected List<UUID> m_agentsInTransit;
/// <summary>
/// An agent is crossing into this region
/// </summary>
public event AgentCrossing OnAvatarCrossingIntoRegion;
/// <summary>
/// A user will arrive shortly, set up appropriate credentials so it can connect
/// </summary>
public event ExpectUserDelegate OnExpectUser;
/// <summary>
/// A Prim will arrive shortly
/// </summary>
public event ExpectPrimDelegate OnExpectPrim;
public event CloseAgentConnection OnCloseAgentConnection;
/// <summary>
/// A new prim has arrived
/// </summary>
public event PrimCrossing OnPrimCrossingIntoRegion;
/// <summary>
/// A New Region is up and available
/// </summary>
public event RegionUp OnRegionUp;
/// <summary>
/// We have a child agent for this avatar and we're getting a status update about it
/// </summary>
public event ChildAgentUpdate OnChildAgentUpdate;
//public event RemoveKnownRegionsFromAvatarList OnRemoveKnownRegionFromAvatar;
/// <summary>
/// Time to log one of our users off. Grid Service sends this mostly
/// </summary>
public event LogOffUser OnLogOffUser;
/// <summary>
/// A region wants land data from us!
/// </summary>
public event GetLandData OnGetLandData;
private AgentCrossing handlerAvatarCrossingIntoRegion = null; // OnAvatarCrossingIntoRegion;
@ -123,11 +157,20 @@ namespace OpenSim.Region.Framework.Scenes
}
}
/// <summary>
/// Returns a region with the name closest to string provided
/// </summary>
/// <param name="name">Partial Region Name for matching</param>
/// <returns>Region Information for the region</returns>
public RegionInfo RequestClosestRegion(string name)
{
return m_commsProvider.GridService.RequestClosestRegion(name);
}
/// <summary>
/// This region is shutting down, de-register all events!
/// De-Register region from Grid!
/// </summary>
public void Close()
{
if (regionCommsHost != null)
@ -159,10 +202,9 @@ namespace OpenSim.Region.Framework.Scenes
#region CommsManager Event handlers
/// <summary>
///
/// A New User will arrive shortly, Informs the scene that there's a new user on the way
/// </summary>
/// <param name="regionHandle"></param>
/// <param name="agent"></param>
/// <param name="agent">Data we need to ensure that the agent can connect</param>
///
protected void NewUserConnection(AgentCircuitData agent)
{
@ -174,6 +216,12 @@ namespace OpenSim.Region.Framework.Scenes
}
}
/// <summary>
/// The Grid has requested us to log-off the user
/// </summary>
/// <param name="AgentID">Unique ID of agent to log-off</param>
/// <param name="RegionSecret">The secret string that the region establishes with the grid when registering</param>
/// <param name="message">The message to send to the user that tells them why they were logged off</param>
protected void GridLogOffUser(UUID AgentID, UUID RegionSecret, string message)
{
handlerLogOffUser = OnLogOffUser;
@ -183,6 +231,11 @@ namespace OpenSim.Region.Framework.Scenes
}
}
/// <summary>
/// A New Region is now available. Inform the scene that there is a new region available.
/// </summary>
/// <param name="region">Information about the new region that is available</param>
/// <returns>True if the event was handled</returns>
protected bool newRegionUp(RegionInfo region)
{
handlerRegionUp = OnRegionUp;
@ -194,6 +247,11 @@ namespace OpenSim.Region.Framework.Scenes
return true;
}
/// <summary>
/// Inform the scene that we've got an update about a child agent that we have
/// </summary>
/// <param name="cAgentData"></param>
/// <returns></returns>
protected bool ChildAgentUpdate(ChildAgentDataUpdate cAgentData)
{
handlerChildAgentUpdate = OnChildAgentUpdate;
@ -204,6 +262,7 @@ namespace OpenSim.Region.Framework.Scenes
return true;
}
protected void AgentCrossing(UUID agentID, Vector3 position, bool isFlying)
{
handlerAvatarCrossingIntoRegion = OnAvatarCrossingIntoRegion;
@ -213,6 +272,13 @@ namespace OpenSim.Region.Framework.Scenes
}
}
/// <summary>
/// We have a new prim from a neighbor
/// </summary>
/// <param name="primID">unique ID for the primative</param>
/// <param name="objXMLData">XML2 encoded data of the primative</param>
/// <param name="XMLMethod">An Int that represents the version of the XMLMethod</param>
/// <returns>True if the prim was accepted, false if it was not</returns>
protected bool IncomingPrimCrossing(UUID primID, String objXMLData, int XMLMethod)
{
handlerExpectPrim = OnExpectPrim;

View File

@ -38,6 +38,7 @@ using OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion;
using OpenSim.Tests.Common;
using OpenSim.Tests.Common.Mock;
using OpenSim.Tests.Common.Setup;
using System.Threading;
namespace OpenSim.Region.Framework.Scenes.Tests
{
@ -55,9 +56,47 @@ namespace OpenSim.Region.Framework.Scenes.Tests
public void TestSimpleNotNeighboursTeleport()
{
TestHelper.InMethod();
ThreadRunResults results = new ThreadRunResults();
results.Result = false;
results.Message = "Test did not run";
TestRunning testClass = new TestRunning(results);
Thread testThread = new Thread(testClass.run);
try
{
// Seems kind of redundant to start a thread and then join it, however.. We need to protect against
// A thread abort exception in the simulator code.
testThread.Start();
testThread.Join();
}
catch (ThreadAbortException)
{
}
Assert.That(testClass.results.Result, Is.EqualTo(true), testClass.results.Message);
// Console.WriteLine("Beginning test {0}", MethodBase.GetCurrentMethod());
}
}
public class ThreadRunResults
{
public bool Result = false;
public string Message = string.Empty;
}
public class TestRunning
{
public ThreadRunResults results;
public TestRunning(ThreadRunResults t)
{
results = t;
}
public void run(object o)
{
//results.Result = true;
log4net.Config.XmlConfigurator.Configure();
UUID sceneAId = UUID.Parse("00000000-0000-0000-0000-000000000100");
@ -80,26 +119,62 @@ namespace OpenSim.Region.Framework.Scenes.Tests
ICapabilitiesModule sceneACapsModule = sceneA.RequestModuleInterface<ICapabilitiesModule>();
results.Result = (sceneACapsModule.GetCapsPath(agentId) == client.CapsSeedUrl);
if (!results.Result)
{
results.Message = "Incorrect caps object path set up in sceneA";
return;
}
/*
Assert.That(
sceneACapsModule.GetCapsPath(agentId),
Is.EqualTo(client.CapsSeedUrl),
"Incorrect caps object path set up in sceneA");
*/
// FIXME: This is a hack to get the test working - really the normal OpenSim mechanisms should be used.
client.TeleportTargetScene = sceneB;
client.Teleport(sceneB.RegionInfo.RegionHandle, new Vector3(100, 100, 100), new Vector3(40, 40, 40));
Assert.That(sceneB.GetScenePresence(agentId), Is.Not.Null, "Client does not have an agent in sceneB");
Assert.That(sceneA.GetScenePresence(agentId), Is.Null, "Client still had an agent in sceneA");
results.Result = (sceneB.GetScenePresence(agentId) != null);
if (!results.Result)
{
results.Message = "Client does not have an agent in sceneB";
return;
}
//Assert.That(sceneB.GetScenePresence(agentId), Is.Not.Null, "Client does not have an agent in sceneB");
//Assert.That(sceneA.GetScenePresence(agentId), Is.Null, "Client still had an agent in sceneA");
results.Result = (sceneA.GetScenePresence(agentId) == null);
if (!results.Result)
{
results.Message = "Client still had an agent in sceneA";
return;
}
ICapabilitiesModule sceneBCapsModule = sceneB.RequestModuleInterface<ICapabilitiesModule>();
results.Result = ("http://" + sceneB.RegionInfo.ExternalHostName + ":" + sceneB.RegionInfo.HttpPort +
"/CAPS/" + sceneBCapsModule.GetCapsPath(agentId) + "0000/" == client.CapsSeedUrl);
if (!results.Result)
{
results.Message = "Incorrect caps object path set up in sceneB";
return;
}
// Temporary assertion - caps url construction should at least be doable through a method.
/*
Assert.That(
"http://" + sceneB.RegionInfo.ExternalHostName + ":" + sceneB.RegionInfo.HttpPort + "/CAPS/" + sceneBCapsModule.GetCapsPath(agentId) + "0000/",
Is.EqualTo(client.CapsSeedUrl),
"Incorrect caps object path set up in sceneB");
*/
// This assertion will currently fail since we don't remove the caps paths when no longer needed
//Assert.That(sceneACapsModule.GetCapsPath(agentId), Is.Null, "sceneA still had a caps object path");

View File

@ -40,6 +40,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine.Tests
/// <summary>
/// Scene presence tests
/// </summary>
/// Commented out XEngineTests that don't do anything
/*
[TestFixture]
public class XEngineTest
{
@ -65,4 +67,5 @@ namespace OpenSim.Region.ScriptEngine.XEngine.Tests
xengine.RegionLoaded(scene);
}
}
*/
}