Merge branch 'master' of ssh://opensimulator.org/var/git/opensim
						commit
						227685bea4
					
				|  | @ -134,6 +134,7 @@ what it is today. | ||||||
| * Micheil Merlin | * Micheil Merlin | ||||||
| * Mike Osias (IBM) | * Mike Osias (IBM) | ||||||
| * Mike Pitman (IBM) | * Mike Pitman (IBM) | ||||||
|  | * mikemig | ||||||
| * mikkopa/_someone - RealXtend | * mikkopa/_someone - RealXtend | ||||||
| * Misterblue | * Misterblue | ||||||
| * Mircea Kitsune | * Mircea Kitsune | ||||||
|  |  | ||||||
|  | @ -46,6 +46,11 @@ namespace OpenSim.Framework.Console | ||||||
|         // private readonly object m_syncRoot = new object(); |         // private readonly object m_syncRoot = new object(); | ||||||
|         private const string LOGLEVEL_NONE = "(none)"; |         private const string LOGLEVEL_NONE = "(none)"; | ||||||
| 
 | 
 | ||||||
|  |         // Used to extract categories for colourization. | ||||||
|  |         private Regex m_categoryRegex  | ||||||
|  |             = new Regex( | ||||||
|  |                 @"^(?<Front>.*?)\[(?<Category>[^\]]+)\]:?(?<End>.*)", RegexOptions.Singleline | RegexOptions.Compiled); | ||||||
|  | 
 | ||||||
|         private int m_cursorYPosition = -1; |         private int m_cursorYPosition = -1; | ||||||
|         private int m_cursorXPosition = 0; |         private int m_cursorXPosition = 0; | ||||||
|         private StringBuilder m_commandLine = new StringBuilder(); |         private StringBuilder m_commandLine = new StringBuilder(); | ||||||
|  | @ -280,11 +285,8 @@ namespace OpenSim.Framework.Console | ||||||
|             string outText = text; |             string outText = text; | ||||||
| 
 | 
 | ||||||
|             if (level != LOGLEVEL_NONE) |             if (level != LOGLEVEL_NONE) | ||||||
|             { |             {                | ||||||
|                 string regex = @"^(?<Front>.*?)\[(?<Category>[^\]]+)\]:?(?<End>.*)"; |                 MatchCollection matches = m_categoryRegex.Matches(text); | ||||||
| 
 |  | ||||||
|                 Regex RE = new Regex(regex, RegexOptions.Multiline); |  | ||||||
|                 MatchCollection matches = RE.Matches(text); |  | ||||||
| 
 | 
 | ||||||
|                 if (matches.Count == 1) |                 if (matches.Count == 1) | ||||||
|                 { |                 { | ||||||
|  |  | ||||||
|  | @ -0,0 +1,286 @@ | ||||||
|  | /* | ||||||
|  |  * Copyright (c) Contributors, http://opensimulator.org/ | ||||||
|  |  * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions are met: | ||||||
|  |  *     * Redistributions of source code must retain the above copyright | ||||||
|  |  *       notice, this list of conditions and the following disclaimer. | ||||||
|  |  *     * Redistributions in binary form must reproduce the above copyright | ||||||
|  |  *       notice, this list of conditions and the following disclaimer in the | ||||||
|  |  *       documentation and/or other materials provided with the distribution. | ||||||
|  |  *     * Neither the name of the OpenSimulator Project nor the | ||||||
|  |  *       names of its contributors may be used to endorse or promote products | ||||||
|  |  *       derived from this software without specific prior written permission. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||||
|  |  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||||
|  |  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||||
|  |  * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||||
|  |  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||||
|  |  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||||
|  |  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||||
|  |  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||||
|  |  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||||
|  |  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using log4net.Config; | ||||||
|  | using Nini.Config; | ||||||
|  | using NUnit.Framework; | ||||||
|  | using OpenMetaverse; | ||||||
|  | using OpenSim.Framework; | ||||||
|  | using OpenSim.Framework.Servers; | ||||||
|  | using OpenSim.Framework.Servers.HttpServer; | ||||||
|  | using OpenSim.Region.CoreModules.Avatar.Chat; | ||||||
|  | using OpenSim.Region.CoreModules.Framework; | ||||||
|  | using OpenSim.Region.CoreModules.Framework.EntityTransfer; | ||||||
|  | using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation; | ||||||
|  | using OpenSim.Region.Framework.Scenes; | ||||||
|  | using OpenSim.Services.Interfaces; | ||||||
|  | using OpenSim.Tests.Common; | ||||||
|  | using OpenSim.Tests.Common.Mock; | ||||||
|  | 
 | ||||||
|  | namespace OpenSim.Region.CoreModules.Avatar.Chat.Tests | ||||||
|  | { | ||||||
|  |     [TestFixture] | ||||||
|  |     public class ChatModuleTests : OpenSimTestCase | ||||||
|  |     {   | ||||||
|  |         [TestFixtureSetUp] | ||||||
|  |         public void FixtureInit() | ||||||
|  |         { | ||||||
|  |             // Don't allow tests to be bamboozled by asynchronous events.  Execute everything on the same thread. | ||||||
|  |             // We must do this here so that child agent positions are updated in a predictable manner. | ||||||
|  |             Util.FireAndForgetMethod = FireAndForgetMethod.RegressionTest; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         [TestFixtureTearDown] | ||||||
|  |         public void TearDown() | ||||||
|  |         { | ||||||
|  |             // We must set this back afterwards, otherwise later tests will fail since they're expecting multiple | ||||||
|  |             // threads.  Possibly, later tests should be rewritten so none of them require async stuff (which regression | ||||||
|  |             // tests really shouldn't). | ||||||
|  |             Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private void SetupNeighbourRegions(TestScene sceneA, TestScene sceneB) | ||||||
|  |         {             | ||||||
|  |             // XXX: HTTP server is not (and should not be) necessary for this test, though it's absence makes the  | ||||||
|  |             // CapabilitiesModule complain when it can't set up HTTP endpoints. | ||||||
|  |             //            BaseHttpServer httpServer = new BaseHttpServer(99999); | ||||||
|  |             //            MainServer.AddHttpServer(httpServer); | ||||||
|  |             //            MainServer.Instance = httpServer; | ||||||
|  | 
 | ||||||
|  |             // We need entity transfer modules so that when sp2 logs into the east region, the region calls  | ||||||
|  |             // EntityTransferModuleto set up a child agent on the west region. | ||||||
|  |             // XXX: However, this is not an entity transfer so is misleading. | ||||||
|  |             EntityTransferModule etmA = new EntityTransferModule(); | ||||||
|  |             EntityTransferModule etmB = new EntityTransferModule(); | ||||||
|  |             LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule(); | ||||||
|  | 
 | ||||||
|  |             IConfigSource config = new IniConfigSource(); | ||||||
|  |             config.AddConfig("Chat"); | ||||||
|  |             IConfig modulesConfig = config.AddConfig("Modules"); | ||||||
|  |             modulesConfig.Set("EntityTransferModule", etmA.Name); | ||||||
|  |             modulesConfig.Set("SimulationServices", lscm.Name); | ||||||
|  | 
 | ||||||
|  |             SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm); | ||||||
|  |             SceneHelpers.SetupSceneModules(sceneA, config, new CapabilitiesModule(), etmA, new ChatModule());            | ||||||
|  |             SceneHelpers.SetupSceneModules(sceneB, config, new CapabilitiesModule(), etmB, new ChatModule()); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /// <summary> | ||||||
|  |         /// Tests chat between neighbour regions on the east-west axis | ||||||
|  |         /// </summary> | ||||||
|  |         /// <remarks> | ||||||
|  |         /// Really, this is a combination of a child agent position update test and a chat range test.  These need | ||||||
|  |         /// to be separated later on. | ||||||
|  |         /// </remarks> | ||||||
|  |         [Test] | ||||||
|  |         public void TestInterRegionChatDistanceEastWest() | ||||||
|  |         { | ||||||
|  |             TestHelpers.InMethod(); | ||||||
|  | //            TestHelpers.EnableLogging(); | ||||||
|  | 
 | ||||||
|  |             UUID sp1Uuid = TestHelpers.ParseTail(0x11); | ||||||
|  |             UUID sp2Uuid = TestHelpers.ParseTail(0x12); | ||||||
|  | 
 | ||||||
|  |             Vector3 sp1Position = new Vector3(6, 128, 20); | ||||||
|  |             Vector3 sp2Position = new Vector3(250, 128, 20); | ||||||
|  | 
 | ||||||
|  |             SceneHelpers sh = new SceneHelpers(); | ||||||
|  |             TestScene sceneWest = sh.SetupScene("sceneWest", TestHelpers.ParseTail(0x1), 1000, 1000);             | ||||||
|  |             TestScene sceneEast = sh.SetupScene("sceneEast", TestHelpers.ParseTail(0x2), 1001, 1000);             | ||||||
|  | 
 | ||||||
|  |             SetupNeighbourRegions(sceneWest, sceneEast); | ||||||
|  | 
 | ||||||
|  |             ScenePresence sp1 = SceneHelpers.AddScenePresence(sceneEast, sp1Uuid); | ||||||
|  |             TestClient sp1Client = (TestClient)sp1.ControllingClient; | ||||||
|  | 
 | ||||||
|  |             // If we don't set agents to flying, test will go wrong as they instantly fall to z = 0. | ||||||
|  |             // TODO: May need to create special complete no-op test physics module rather than basic physics, since | ||||||
|  |             // physics is irrelevant to this test. | ||||||
|  |             sp1.Flying = true; | ||||||
|  | 
 | ||||||
|  |             // When sp1 logs in to sceneEast, it sets up a child agent in sceneWest and informs the sp2 client to  | ||||||
|  |             // make the connection.  For this test, will simplify this chain by making the connection directly. | ||||||
|  |             ScenePresence sp1Child = SceneHelpers.AddChildScenePresence(sceneWest, sp1Uuid); | ||||||
|  |             TestClient sp1ChildClient = (TestClient)sp1Child.ControllingClient; | ||||||
|  | 
 | ||||||
|  |             sp1.AbsolutePosition = sp1Position;                 | ||||||
|  | 
 | ||||||
|  |             ScenePresence sp2 = SceneHelpers.AddScenePresence(sceneWest, sp2Uuid); | ||||||
|  |             TestClient sp2Client = (TestClient)sp2.ControllingClient; | ||||||
|  |             sp2.Flying = true; | ||||||
|  | 
 | ||||||
|  |             ScenePresence sp2Child = SceneHelpers.AddChildScenePresence(sceneEast, sp2Uuid); | ||||||
|  |             TestClient sp2ChildClient = (TestClient)sp2Child.ControllingClient; | ||||||
|  | 
 | ||||||
|  |             sp2.AbsolutePosition = sp2Position;            | ||||||
|  | 
 | ||||||
|  |             // We must update the scenes in order to make the root new root agents trigger position updates in their | ||||||
|  |             // children. | ||||||
|  |             sceneWest.Update(1); | ||||||
|  |             sceneEast.Update(1); | ||||||
|  | 
 | ||||||
|  |             // Check child positions are correct. | ||||||
|  |             Assert.AreEqual( | ||||||
|  |                 new Vector3(sp1Position.X + sceneEast.RegionInfo.RegionSizeX, sp1Position.Y, sp1Position.Z),  | ||||||
|  |                 sp1ChildClient.SceneAgent.AbsolutePosition); | ||||||
|  | 
 | ||||||
|  |             Assert.AreEqual( | ||||||
|  |                 new Vector3(sp2Position.X - sceneWest.RegionInfo.RegionSizeX, sp2Position.Y, sp2Position.Z),  | ||||||
|  |                 sp2ChildClient.SceneAgent.AbsolutePosition); | ||||||
|  | 
 | ||||||
|  |             string receivedSp1ChatMessage = ""; | ||||||
|  |             string receivedSp2ChatMessage = ""; | ||||||
|  | 
 | ||||||
|  |             sp1ChildClient.OnReceivedChatMessage  | ||||||
|  |                 += (message, type, fromPos, fromName, fromAgentID, ownerID, source, audible) => receivedSp1ChatMessage = message; | ||||||
|  |             sp2ChildClient.OnReceivedChatMessage  | ||||||
|  |                 += (message, type, fromPos, fromName, fromAgentID, ownerID, source, audible) => receivedSp2ChatMessage = message; | ||||||
|  | 
 | ||||||
|  |             TestUserInRange(sp1Client, "ello darling", ref receivedSp2ChatMessage); | ||||||
|  |             TestUserInRange(sp2Client, "fantastic cats", ref receivedSp1ChatMessage); | ||||||
|  | 
 | ||||||
|  |             sp1Position = new Vector3(30, 128, 20); | ||||||
|  |             sp1.AbsolutePosition = sp1Position; | ||||||
|  |             sceneEast.Update(1); | ||||||
|  | 
 | ||||||
|  |             // Check child position is correct. | ||||||
|  |             Assert.AreEqual( | ||||||
|  |                 new Vector3(sp1Position.X + sceneEast.RegionInfo.RegionSizeX, sp1Position.Y, sp1Position.Z),  | ||||||
|  |                 sp1ChildClient.SceneAgent.AbsolutePosition); | ||||||
|  | 
 | ||||||
|  |             TestUserOutOfRange(sp1Client, "beef", ref receivedSp2ChatMessage); | ||||||
|  |             TestUserOutOfRange(sp2Client, "lentils", ref receivedSp1ChatMessage); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         /// <summary> | ||||||
|  |         /// Tests chat between neighbour regions on the north-south axis | ||||||
|  |         /// </summary> | ||||||
|  |         /// <remarks> | ||||||
|  |         /// Really, this is a combination of a child agent position update test and a chat range test.  These need | ||||||
|  |         /// to be separated later on. | ||||||
|  |         /// </remarks> | ||||||
|  |         [Test] | ||||||
|  |         public void TestInterRegionChatDistanceNorthSouth() | ||||||
|  |         { | ||||||
|  |             TestHelpers.InMethod(); | ||||||
|  |             //            TestHelpers.EnableLogging(); | ||||||
|  | 
 | ||||||
|  |             UUID sp1Uuid = TestHelpers.ParseTail(0x11); | ||||||
|  |             UUID sp2Uuid = TestHelpers.ParseTail(0x12); | ||||||
|  | 
 | ||||||
|  |             Vector3 sp1Position = new Vector3(128, 250, 20); | ||||||
|  |             Vector3 sp2Position = new Vector3(128, 6, 20); | ||||||
|  | 
 | ||||||
|  |             SceneHelpers sh = new SceneHelpers(); | ||||||
|  |             TestScene sceneNorth = sh.SetupScene("sceneNorth", TestHelpers.ParseTail(0x1), 1000, 1000);             | ||||||
|  |             TestScene sceneSouth = sh.SetupScene("sceneSouth", TestHelpers.ParseTail(0x2), 1000, 1001);             | ||||||
|  | 
 | ||||||
|  |             SetupNeighbourRegions(sceneNorth, sceneSouth); | ||||||
|  | 
 | ||||||
|  |             ScenePresence sp1 = SceneHelpers.AddScenePresence(sceneNorth, sp1Uuid); | ||||||
|  |             TestClient sp1Client = (TestClient)sp1.ControllingClient; | ||||||
|  | 
 | ||||||
|  |             // If we don't set agents to flying, test will go wrong as they instantly fall to z = 0. | ||||||
|  |             // TODO: May need to create special complete no-op test physics module rather than basic physics, since | ||||||
|  |             // physics is irrelevant to this test. | ||||||
|  |             sp1.Flying = true; | ||||||
|  | 
 | ||||||
|  |             // When sp1 logs in to sceneEast, it sets up a child agent in sceneNorth and informs the sp2 client to  | ||||||
|  |             // make the connection.  For this test, will simplify this chain by making the connection directly. | ||||||
|  |             ScenePresence sp1Child = SceneHelpers.AddChildScenePresence(sceneSouth, sp1Uuid); | ||||||
|  |             TestClient sp1ChildClient = (TestClient)sp1Child.ControllingClient; | ||||||
|  | 
 | ||||||
|  |             sp1.AbsolutePosition = sp1Position;                 | ||||||
|  | 
 | ||||||
|  |             ScenePresence sp2 = SceneHelpers.AddScenePresence(sceneSouth, sp2Uuid); | ||||||
|  |             TestClient sp2Client = (TestClient)sp2.ControllingClient; | ||||||
|  |             sp2.Flying = true; | ||||||
|  | 
 | ||||||
|  |             ScenePresence sp2Child = SceneHelpers.AddChildScenePresence(sceneNorth, sp2Uuid); | ||||||
|  |             TestClient sp2ChildClient = (TestClient)sp2Child.ControllingClient; | ||||||
|  | 
 | ||||||
|  |             sp2.AbsolutePosition = sp2Position;            | ||||||
|  | 
 | ||||||
|  |             // We must update the scenes in order to make the root new root agents trigger position updates in their | ||||||
|  |             // children. | ||||||
|  |             sceneNorth.Update(1); | ||||||
|  |             sceneSouth.Update(1); | ||||||
|  | 
 | ||||||
|  |             // Check child positions are correct. | ||||||
|  |             Assert.AreEqual( | ||||||
|  |                 new Vector3(sp1Position.X, sp1Position.Y - sceneNorth.RegionInfo.RegionSizeY, sp1Position.Z),  | ||||||
|  |                 sp1ChildClient.SceneAgent.AbsolutePosition); | ||||||
|  | 
 | ||||||
|  |             Assert.AreEqual( | ||||||
|  |                 new Vector3(sp2Position.X, sp2Position.Y + sceneSouth.RegionInfo.RegionSizeY, sp2Position.Z),  | ||||||
|  |                 sp2ChildClient.SceneAgent.AbsolutePosition); | ||||||
|  | 
 | ||||||
|  |             string receivedSp1ChatMessage = ""; | ||||||
|  |             string receivedSp2ChatMessage = ""; | ||||||
|  | 
 | ||||||
|  |             sp1ChildClient.OnReceivedChatMessage  | ||||||
|  |                 += (message, type, fromPos, fromName, fromAgentID, ownerID, source, audible) => receivedSp1ChatMessage = message; | ||||||
|  |             sp2ChildClient.OnReceivedChatMessage  | ||||||
|  |                 += (message, type, fromPos, fromName, fromAgentID, ownerID, source, audible) => receivedSp2ChatMessage = message; | ||||||
|  | 
 | ||||||
|  |             TestUserInRange(sp1Client, "ello darling", ref receivedSp2ChatMessage); | ||||||
|  |             TestUserInRange(sp2Client, "fantastic cats", ref receivedSp1ChatMessage); | ||||||
|  | 
 | ||||||
|  |             sp1Position = new Vector3(30, 128, 20); | ||||||
|  |             sp1.AbsolutePosition = sp1Position; | ||||||
|  |             sceneNorth.Update(1); | ||||||
|  | 
 | ||||||
|  |             // Check child position is correct. | ||||||
|  |             Assert.AreEqual( | ||||||
|  |                 new Vector3(sp1Position.X, sp1Position.Y - sceneNorth.RegionInfo.RegionSizeY, sp1Position.Z),  | ||||||
|  |                 sp1ChildClient.SceneAgent.AbsolutePosition); | ||||||
|  | 
 | ||||||
|  |             TestUserOutOfRange(sp1Client, "beef", ref receivedSp2ChatMessage); | ||||||
|  |             TestUserOutOfRange(sp2Client, "lentils", ref receivedSp1ChatMessage); | ||||||
|  |         } | ||||||
|  |      | ||||||
|  |         private void TestUserInRange(TestClient speakClient, string testMessage, ref string receivedMessage) | ||||||
|  |         { | ||||||
|  |             receivedMessage = ""; | ||||||
|  | 
 | ||||||
|  |             speakClient.Chat(0, ChatTypeEnum.Say, testMessage); | ||||||
|  | 
 | ||||||
|  |             Assert.AreEqual(testMessage, receivedMessage); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private void TestUserOutOfRange(TestClient speakClient, string testMessage, ref string receivedMessage) | ||||||
|  |         { | ||||||
|  |             receivedMessage = ""; | ||||||
|  | 
 | ||||||
|  |             speakClient.Chat(0, ChatTypeEnum.Say, testMessage); | ||||||
|  | 
 | ||||||
|  |             Assert.AreNotEqual(testMessage, receivedMessage); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -428,7 +428,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// delegate for sending a grid instant message asynchronously |         /// delegate for sending a grid instant message asynchronously | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         public delegate void GridInstantMessageDelegate(GridInstantMessage im, MessageResultNotification result, UUID prevRegionID); |         public delegate void GridInstantMessageDelegate(GridInstantMessage im, MessageResultNotification result); | ||||||
| 
 | 
 | ||||||
|         protected virtual void GridInstantMessageCompleted(IAsyncResult iar) |         protected virtual void GridInstantMessageCompleted(IAsyncResult iar) | ||||||
|         { |         { | ||||||
|  | @ -442,138 +442,87 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | ||||||
|         { |         { | ||||||
|             GridInstantMessageDelegate d = SendGridInstantMessageViaXMLRPCAsync; |             GridInstantMessageDelegate d = SendGridInstantMessageViaXMLRPCAsync; | ||||||
| 
 | 
 | ||||||
|             d.BeginInvoke(im, result, UUID.Zero, GridInstantMessageCompleted, d); |             d.BeginInvoke(im, result, GridInstantMessageCompleted, d); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Recursive SendGridInstantMessage over XMLRPC method. |         /// Internal SendGridInstantMessage over XMLRPC method. | ||||||
|         /// This is called from within a dedicated thread. |  | ||||||
|         /// The first time this is called, prevRegionHandle will be 0 Subsequent times this is called from  |  | ||||||
|         /// itself, prevRegionHandle will be the last region handle that we tried to send. |  | ||||||
|         /// If the handles are the same, we look up the user's location using the grid. |  | ||||||
|         /// If the handles are still the same, we end.  The send failed. |  | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         /// <param name="prevRegionHandle"> |         /// <remarks> | ||||||
|         /// Pass in 0 the first time this method is called.  It will be called recursively with the last  |         /// This is called from within a dedicated thread. | ||||||
|         /// regionhandle tried |         /// </remarks> | ||||||
|         /// </param> |         private void SendGridInstantMessageViaXMLRPCAsync(GridInstantMessage im, MessageResultNotification result) | ||||||
|         protected virtual void SendGridInstantMessageViaXMLRPCAsync(GridInstantMessage im, MessageResultNotification result, UUID prevRegionID) |  | ||||||
|         { |         { | ||||||
|             UUID toAgentID = new UUID(im.toAgentID); |             UUID toAgentID = new UUID(im.toAgentID); | ||||||
| 
 |             UUID regionID; | ||||||
|             PresenceInfo upd = null; |             bool needToLookupAgent; | ||||||
| 
 |  | ||||||
|             bool lookupAgent = false; |  | ||||||
| 
 | 
 | ||||||
|             lock (m_UserRegionMap) |             lock (m_UserRegionMap) | ||||||
|             { |                 needToLookupAgent = !m_UserRegionMap.TryGetValue(toAgentID, out regionID); | ||||||
|                 if (m_UserRegionMap.ContainsKey(toAgentID)) |  | ||||||
|                 { |  | ||||||
|                     upd = new PresenceInfo(); |  | ||||||
|                     upd.RegionID = m_UserRegionMap[toAgentID]; |  | ||||||
| 
 | 
 | ||||||
|                     // We need to compare the current regionhandle with the previous region handle |             while (true) | ||||||
|                     // or the recursive loop will never end because it will never try to lookup the agent again |  | ||||||
|                     if (prevRegionID == upd.RegionID) |  | ||||||
|                     { |  | ||||||
|                         lookupAgent = true; |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|                 else |  | ||||||
|                 { |  | ||||||
|                     lookupAgent = true; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|              |  | ||||||
| 
 |  | ||||||
|             // Are we needing to look-up an agent? |  | ||||||
|             if (lookupAgent) |  | ||||||
|             { |             { | ||||||
|                 // Non-cached user agent lookup. |                 if (needToLookupAgent) | ||||||
|                 PresenceInfo[] presences = PresenceService.GetAgents(new string[] { toAgentID.ToString() });  |  | ||||||
|                 if (presences != null && presences.Length > 0) |  | ||||||
|                 { |                 { | ||||||
|                     foreach (PresenceInfo p in presences) |                     PresenceInfo[] presences = PresenceService.GetAgents(new string[] { toAgentID.ToString() });  | ||||||
|  | 
 | ||||||
|  |                     UUID foundRegionID = UUID.Zero; | ||||||
|  | 
 | ||||||
|  |                     if (presences != null) | ||||||
|                     { |                     { | ||||||
|                         if (p.RegionID != UUID.Zero) |                         foreach (PresenceInfo p in presences) | ||||||
|                         { |                         { | ||||||
|                             upd = p; |                             if (p.RegionID != UUID.Zero) | ||||||
|                             break; |                             { | ||||||
|  |                                 foundRegionID = p.RegionID; | ||||||
|  |                                 break; | ||||||
|  |                             } | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|  | 
 | ||||||
|  |                     // If not found or the found region is the same as the last lookup, then message is undeliverable | ||||||
|  |                     if (foundRegionID == UUID.Zero || foundRegionID == regionID) | ||||||
|  |                         break; | ||||||
|  |                     else | ||||||
|  |                         regionID = foundRegionID; | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 if (upd != null) |                 GridRegion reginfo = m_Scenes[0].GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, regionID); | ||||||
|  |                 if (reginfo == null) | ||||||
|                 { |                 { | ||||||
|                     // check if we've tried this before.. |                     m_log.WarnFormat("[GRID INSTANT MESSAGE]: Unable to find region {0}", regionID); | ||||||
|                     // This is one way to end the recursive loop |                     break; | ||||||
|                     // |  | ||||||
|                     if (upd.RegionID == prevRegionID) |  | ||||||
|                     { |  | ||||||
|                         // m_log.Error("[GRID INSTANT MESSAGE]: Unable to deliver an instant message"); |  | ||||||
|                         HandleUndeliverableMessage(im, result); |  | ||||||
|                         return; |  | ||||||
|                     } |  | ||||||
|                 } |                 } | ||||||
|                 else | 
 | ||||||
|  |                 // Try to send the message to the agent via the retrieved region. | ||||||
|  |                 Hashtable msgdata = ConvertGridInstantMessageToXMLRPC(im); | ||||||
|  |                 msgdata["region_handle"] = 0; | ||||||
|  |                 bool imresult = doIMSending(reginfo, msgdata); | ||||||
|  | 
 | ||||||
|  |                 // If the message delivery was successful, then cache the entry. | ||||||
|  |                 if (imresult) | ||||||
|                 { |                 { | ||||||
|                     // m_log.Error("[GRID INSTANT MESSAGE]: Unable to deliver an instant message"); |                     lock (m_UserRegionMap) | ||||||
|                     HandleUndeliverableMessage(im, result); |                     { | ||||||
|  |                         m_UserRegionMap[toAgentID] = regionID; | ||||||
|  |                     } | ||||||
|  |                     result(true); | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|  | 
 | ||||||
|  |                 // If we reach this point in the first iteration of the while, then we may have unsuccessfully tried | ||||||
|  |                 // to use a locally cached region ID.  All subsequent attempts need to lookup agent details from | ||||||
|  |                 // the presence service. | ||||||
|  |                 needToLookupAgent = true; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             if (upd != null) |             // If we reached this point then the message was not deliverable.  Remove the bad cache entry and  | ||||||
|             { |             // signal the delivery failure. | ||||||
|                 GridRegion reginfo = m_Scenes[0].GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, |             lock (m_UserRegionMap) | ||||||
|                     upd.RegionID); |                 m_UserRegionMap.Remove(toAgentID); | ||||||
|                 if (reginfo != null) |  | ||||||
|                 { |  | ||||||
|                     Hashtable msgdata = ConvertGridInstantMessageToXMLRPC(im); |  | ||||||
|                     // Not actually used anymore, left in for compatibility |  | ||||||
|                     // Remove at next interface change |  | ||||||
|                     // |  | ||||||
|                     msgdata["region_handle"] = 0; |  | ||||||
|                     bool imresult = doIMSending(reginfo, msgdata); |  | ||||||
|                     if (imresult) |  | ||||||
|                     { |  | ||||||
|                         // IM delivery successful, so store the Agent's location in our local cache. |  | ||||||
|                         lock (m_UserRegionMap) |  | ||||||
|                         { |  | ||||||
|                             if (m_UserRegionMap.ContainsKey(toAgentID)) |  | ||||||
|                             { |  | ||||||
|                                 m_UserRegionMap[toAgentID] = upd.RegionID; |  | ||||||
|                             } |  | ||||||
|                             else |  | ||||||
|                             { |  | ||||||
|                                 m_UserRegionMap.Add(toAgentID, upd.RegionID); |  | ||||||
|                             } |  | ||||||
|                         } |  | ||||||
|                         result(true); |  | ||||||
|                     } |  | ||||||
|                     else |  | ||||||
|                     { |  | ||||||
|                         // try again, but lookup user this time. |  | ||||||
|                         // Warning, this must call the Async version |  | ||||||
|                         // of this method or we'll be making thousands of threads |  | ||||||
|                         // The version within the spawned thread is SendGridInstantMessageViaXMLRPCAsync |  | ||||||
|                         // The version that spawns the thread is SendGridInstantMessageViaXMLRPC |  | ||||||
| 
 | 
 | ||||||
|                         // This is recursive!!!!! |             // m_log.Error("[GRID INSTANT MESSAGE]: Unable to deliver an instant message"); | ||||||
|                         SendGridInstantMessageViaXMLRPCAsync(im, result, |             HandleUndeliverableMessage(im, result); | ||||||
|                                 upd.RegionID); |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|                 else |  | ||||||
|                 { |  | ||||||
|                     m_log.WarnFormat("[GRID INSTANT MESSAGE]: Unable to find region {0}", upd.RegionID); |  | ||||||
|                     HandleUndeliverableMessage(im, result); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 HandleUndeliverableMessage(im, result); |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|  | @ -584,7 +533,6 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | ||||||
|         /// <returns>Bool if the message was successfully delivered at the other side.</returns> |         /// <returns>Bool if the message was successfully delivered at the other side.</returns> | ||||||
|         protected virtual bool doIMSending(GridRegion reginfo, Hashtable xmlrpcdata) |         protected virtual bool doIMSending(GridRegion reginfo, Hashtable xmlrpcdata) | ||||||
|         { |         { | ||||||
| 
 |  | ||||||
|             ArrayList SendParams = new ArrayList(); |             ArrayList SendParams = new ArrayList(); | ||||||
|             SendParams.Add(xmlrpcdata); |             SendParams.Add(xmlrpcdata); | ||||||
|             XmlRpcRequest GridReq = new XmlRpcRequest("grid_instant_message", SendParams); |             XmlRpcRequest GridReq = new XmlRpcRequest("grid_instant_message", SendParams); | ||||||
|  |  | ||||||
|  | @ -4133,7 +4133,10 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|         /// <returns>true if we handled it.</returns> |         /// <returns>true if we handled it.</returns> | ||||||
|         public virtual bool IncomingUpdateChildAgent(AgentPosition cAgentData) |         public virtual bool IncomingUpdateChildAgent(AgentPosition cAgentData) | ||||||
|         { |         { | ||||||
|             //m_log.Debug(" XXX Scene IncomingChildAgentDataUpdate POSITION in " + RegionInfo.RegionName); | //            m_log.DebugFormat( | ||||||
|  | //                "[SCENE PRESENCE]: IncomingChildAgentDataUpdate POSITION for {0} in {1}, position {2}",  | ||||||
|  | //                cAgentData.AgentID, Name, cAgentData.Position); | ||||||
|  | 
 | ||||||
|             ScenePresence childAgentUpdate = GetScenePresence(cAgentData.AgentID); |             ScenePresence childAgentUpdate = GetScenePresence(cAgentData.AgentID); | ||||||
|             if (childAgentUpdate != null) |             if (childAgentUpdate != null) | ||||||
|             { |             { | ||||||
|  |  | ||||||
|  | @ -2754,7 +2754,34 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|                 part.AddSittingAvatar(this); |                 part.AddSittingAvatar(this); | ||||||
| 
 | 
 | ||||||
|                 cameraAtOffset = part.GetCameraAtOffset(); |                 cameraAtOffset = part.GetCameraAtOffset(); | ||||||
|  | 
 | ||||||
|  |                 if (!part.IsRoot && cameraAtOffset == Vector3.Zero) | ||||||
|  |                     cameraAtOffset = part.ParentGroup.RootPart.GetCameraAtOffset(); | ||||||
|  | 
 | ||||||
|  |                 bool cameraEyeOffsetFromRootForChild = false; | ||||||
|                 cameraEyeOffset = part.GetCameraEyeOffset(); |                 cameraEyeOffset = part.GetCameraEyeOffset(); | ||||||
|  | 
 | ||||||
|  |                 if (!part.IsRoot && cameraEyeOffset == Vector3.Zero) | ||||||
|  |                 {                  | ||||||
|  |                     cameraEyeOffset = part.ParentGroup.RootPart.GetCameraEyeOffset(); | ||||||
|  |                     cameraEyeOffsetFromRootForChild = true; | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 if ((cameraEyeOffset != Vector3.Zero && !cameraEyeOffsetFromRootForChild) || cameraAtOffset != Vector3.Zero) | ||||||
|  |                 { | ||||||
|  |                     if (!part.IsRoot) | ||||||
|  |                     { | ||||||
|  |                         cameraEyeOffset = cameraEyeOffset * part.RotationOffset; | ||||||
|  |                         cameraAtOffset += part.OffsetPosition; | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|  |                     cameraEyeOffset += part.OffsetPosition; | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  | //                m_log.DebugFormat( | ||||||
|  | //                    "[SCENE PRESENCE]: Using cameraAtOffset {0}, cameraEyeOffset {1} for sit on {2} by {3} in {4}",  | ||||||
|  | //                    cameraAtOffset, cameraEyeOffset, part.Name, Name, Scene.Name); | ||||||
|  | 
 | ||||||
|                 forceMouselook = part.GetForceMouselook(); |                 forceMouselook = part.GetForceMouselook(); | ||||||
| 
 | 
 | ||||||
|                 // An viewer expects to specify sit positions as offsets to the root prim, even if a child prim is |                 // An viewer expects to specify sit positions as offsets to the root prim, even if a child prim is | ||||||
|  |  | ||||||
|  | @ -147,6 +147,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin | ||||||
|                     terrainHeight = _heightMap[(int)actor.Position.Y * (int)m_regionExtent.Y + (int)actor.Position.X]; |                     terrainHeight = _heightMap[(int)actor.Position.Y * (int)m_regionExtent.Y + (int)actor.Position.X]; | ||||||
| 
 | 
 | ||||||
|                 float height = terrainHeight + actor.Size.Z; |                 float height = terrainHeight + actor.Size.Z; | ||||||
|  | //                Console.WriteLine("height {0}, actorPosition {1}", height, actorPosition); | ||||||
| 
 | 
 | ||||||
|                 if (actor.Flying) |                 if (actor.Flying) | ||||||
|                 { |                 { | ||||||
|  |  | ||||||
|  | @ -6846,12 +6846,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | ||||||
|         { |         { | ||||||
|             m_host.AddScriptLPS(1); |             m_host.AddScriptLPS(1); | ||||||
|             m_host.SetCameraEyeOffset(offset); |             m_host.SetCameraEyeOffset(offset); | ||||||
|  | 
 | ||||||
|  |             if (m_host.ParentGroup.RootPart.GetCameraEyeOffset() == Vector3.Zero) | ||||||
|  |                 m_host.ParentGroup.RootPart.SetCameraEyeOffset(offset); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public void llSetCameraAtOffset(LSL_Vector offset) |         public void llSetCameraAtOffset(LSL_Vector offset) | ||||||
|         { |         { | ||||||
|             m_host.AddScriptLPS(1); |             m_host.AddScriptLPS(1); | ||||||
|             m_host.SetCameraAtOffset(offset); |             m_host.SetCameraAtOffset(offset); | ||||||
|  | 
 | ||||||
|  |             if (m_host.ParentGroup.RootPart.GetCameraAtOffset() == Vector3.Zero) | ||||||
|  |                 m_host.ParentGroup.RootPart.SetCameraAtOffset(offset); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public void llSetLinkCamera(LSL_Integer link, LSL_Vector eye, LSL_Vector at) |         public void llSetLinkCamera(LSL_Integer link, LSL_Vector eye, LSL_Vector at) | ||||||
|  |  | ||||||
|  | @ -162,7 +162,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | ||||||
|             m_braceCount++; |             m_braceCount++; | ||||||
| 
 | 
 | ||||||
|             // line number |             // line number | ||||||
|             m_CSharpLine += 3; |             m_CSharpLine += 9; | ||||||
| 
 | 
 | ||||||
|             // here's the payload |             // here's the payload | ||||||
|             retstr += GenerateLine(); |             retstr += GenerateLine(); | ||||||
|  |  | ||||||
|  | @ -444,7 +444,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | ||||||
| //            return compileScript; | //            return compileScript; | ||||||
| //        } | //        } | ||||||
| 
 | 
 | ||||||
|         private static string CreateCSCompilerScript( |         public static string CreateCSCompilerScript( | ||||||
|             string compileScript, string className, string baseClassName, ParameterInfo[] constructorParameters) |             string compileScript, string className, string baseClassName, ParameterInfo[] constructorParameters) | ||||||
|         { |         { | ||||||
|             compileScript = string.Format(     |             compileScript = string.Format(     | ||||||
|  | @ -472,7 +472,7 @@ namespace SecondLife | ||||||
|             return compileScript; |             return compileScript; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         private static string CreateVBCompilerScript(string compileScript, string className, string baseClassName) |         public static string CreateVBCompilerScript(string compileScript, string className, string baseClassName) | ||||||
|         { |         { | ||||||
|             compileScript = String.Empty + |             compileScript = String.Empty + | ||||||
|                 "Imports OpenSim.Region.ScriptEngine.Shared: Imports System.Collections.Generic: " + |                 "Imports OpenSim.Region.ScriptEngine.Shared: Imports System.Collections.Generic: " + | ||||||
|  |  | ||||||
|  | @ -31,6 +31,7 @@ using System.Collections.Generic; | ||||||
| using Microsoft.CSharp; | using Microsoft.CSharp; | ||||||
| using NUnit.Framework; | using NUnit.Framework; | ||||||
| using OpenSim.Region.ScriptEngine.Shared.CodeTools; | using OpenSim.Region.ScriptEngine.Shared.CodeTools; | ||||||
|  | using OpenSim.Region.ScriptEngine.Shared.ScriptBase; | ||||||
| using OpenSim.Tests.Common; | using OpenSim.Tests.Common; | ||||||
| 
 | 
 | ||||||
| namespace OpenSim.Region.ScriptEngine.Shared.CodeTools.Tests | namespace OpenSim.Region.ScriptEngine.Shared.CodeTools.Tests | ||||||
|  | @ -66,9 +67,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools.Tests | ||||||
|             m_CSCodeProvider = new CSharpCodeProvider(); |             m_CSCodeProvider = new CSharpCodeProvider(); | ||||||
|             m_compilerParameters = new CompilerParameters(); |             m_compilerParameters = new CompilerParameters(); | ||||||
| 
 | 
 | ||||||
|             string rootPath = Path.Combine(Path.GetDirectoryName(System.AppDomain.CurrentDomain.BaseDirectory), "bin"); |             string rootPath = Path.Combine(Path.GetDirectoryName(System.AppDomain.CurrentDomain.BaseDirectory)); | ||||||
|             m_compilerParameters.ReferencedAssemblies.Add(Path.Combine(rootPath, "OpenSim.Region.ScriptEngine.Shared.dll")); |             m_compilerParameters.ReferencedAssemblies.Add(Path.Combine(rootPath, "OpenSim.Region.ScriptEngine.Shared.dll")); | ||||||
|             m_compilerParameters.ReferencedAssemblies.Add(Path.Combine(rootPath, "OpenSim.Region.ScriptEngine.Shared.Api.Runtime.dll")); |             m_compilerParameters.ReferencedAssemblies.Add(Path.Combine(rootPath, "OpenSim.Region.ScriptEngine.Shared.Api.Runtime.dll")); | ||||||
|  |             m_compilerParameters.ReferencedAssemblies.Add(Path.Combine(rootPath, "OpenMetaverseTypes.dll")); | ||||||
|             m_compilerParameters.GenerateExecutable = false; |             m_compilerParameters.GenerateExecutable = false; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | @ -90,7 +92,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools.Tests | ||||||
|         /// Test the C# compiler error message can be mapped to the correct |         /// Test the C# compiler error message can be mapped to the correct | ||||||
|         /// line/column in the LSL source when an undeclared variable is used. |         /// line/column in the LSL source when an undeclared variable is used. | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         //[Test] |         [Test] | ||||||
|         public void TestUseUndeclaredVariable() |         public void TestUseUndeclaredVariable() | ||||||
|         { |         { | ||||||
|             TestHelpers.InMethod(); |             TestHelpers.InMethod(); | ||||||
|  | @ -106,25 +108,37 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools.Tests | ||||||
| }";
 | }";
 | ||||||
| 
 | 
 | ||||||
|             CSCodeGenerator cg = new CSCodeGenerator(); |             CSCodeGenerator cg = new CSCodeGenerator(); | ||||||
|             string output = "using OpenSim.Region.ScriptEngine.Shared; using System.Collections.Generic;\n" + |             string output = cg.Convert(input); | ||||||
|                             "namespace SecondLife { " + | 
 | ||||||
|                             "public class Script : OpenSim.Region.ScriptEngine.Shared.ScriptBase.ScriptBaseClass {\n" + |             output = Compiler.CreateCSCompilerScript(output, "script1", typeof(ScriptBaseClass).FullName, null);          | ||||||
|                             "public Script() { } " + | //            System.Console.WriteLine(output); | ||||||
|                             cg.Convert(input) + | 
 | ||||||
|                             "} }\n"; |  | ||||||
|             Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>> positionMap = cg.PositionMap; |             Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>> positionMap = cg.PositionMap; | ||||||
| 
 | 
 | ||||||
|             m_compilerResults = m_CSCodeProvider.CompileAssemblyFromSource(m_compilerParameters, output); |             m_compilerResults = m_CSCodeProvider.CompileAssemblyFromSource(m_compilerParameters, output); | ||||||
|  | // | ||||||
|  | //            foreach (KeyValuePair<int, int> key in positionMap.Keys) | ||||||
|  | //            { | ||||||
|  | //                KeyValuePair<int, int> val = positionMap[key]; | ||||||
|  | // | ||||||
|  | //                System.Console.WriteLine("{0},{1} => {2},{3}", key.Key, key.Value, val.Key, val.Value); | ||||||
|  | //            } | ||||||
|  | // | ||||||
|  | //            foreach (CompilerError compErr in m_compilerResults.Errors) | ||||||
|  | //            { | ||||||
|  | //                System.Console.WriteLine("Error: {0},{1} => {2}", compErr.Line, compErr.Column, compErr); | ||||||
|  | //            } | ||||||
| 
 | 
 | ||||||
|             Assert.AreEqual(new KeyValuePair<int, int>(5, 21), |             Assert.AreEqual( | ||||||
|                             positionMap[new KeyValuePair<int, int>(m_compilerResults.Errors[0].Line, m_compilerResults.Errors[0].Column)]); |                 new KeyValuePair<int, int>(5, 21), | ||||||
|  |                 positionMap[new KeyValuePair<int, int>(m_compilerResults.Errors[0].Line, m_compilerResults.Errors[0].Column)]); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Test that a string can be cast to string and another string |         /// Test that a string can be cast to string and another string | ||||||
|         /// concatenated. |         /// concatenated. | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         //[Test] |         [Test] | ||||||
|         public void TestCastAndConcatString() |         public void TestCastAndConcatString() | ||||||
|         { |         { | ||||||
|             TestHelpers.InMethod(); |             TestHelpers.InMethod(); | ||||||
|  | @ -143,15 +157,20 @@ default | ||||||
|     } |     } | ||||||
| }";
 | }";
 | ||||||
| 
 | 
 | ||||||
|  | //            System.Console.WriteLine(input); | ||||||
|             CSCodeGenerator cg = new CSCodeGenerator(); |             CSCodeGenerator cg = new CSCodeGenerator(); | ||||||
|             string output = "using OpenSim.Region.ScriptEngine.Shared; using System.Collections.Generic;\n" + |             string output = cg.Convert(input); | ||||||
|                             "namespace SecondLife { " + | 
 | ||||||
|                             "public class Script : OpenSim.Region.ScriptEngine.Shared.ScriptBase.ScriptBaseClass {\n" + |             output = Compiler.CreateCSCompilerScript(output, "script1", typeof(ScriptBaseClass).FullName, null); | ||||||
|                             "public Script() { } " + | //            System.Console.WriteLine(output); | ||||||
|                             cg.Convert(input) + | 
 | ||||||
|                             "} }\n"; |  | ||||||
|             m_compilerResults = m_CSCodeProvider.CompileAssemblyFromSource(m_compilerParameters, output); |             m_compilerResults = m_CSCodeProvider.CompileAssemblyFromSource(m_compilerParameters, output); | ||||||
| 
 | 
 | ||||||
|  | //            foreach (CompilerError compErr in m_compilerResults.Errors) | ||||||
|  | //            { | ||||||
|  | //                System.Console.WriteLine("Error: {0}", compErr); | ||||||
|  | //            } | ||||||
|  | 
 | ||||||
|             Assert.AreEqual(0, m_compilerResults.Errors.Count); |             Assert.AreEqual(0, m_compilerResults.Errors.Count); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -574,7 +574,11 @@ namespace OpenSim.Tests.Common | ||||||
| 
 | 
 | ||||||
|         public static ScenePresence AddChildScenePresence(Scene scene, UUID agentId) |         public static ScenePresence AddChildScenePresence(Scene scene, UUID agentId) | ||||||
|         { |         { | ||||||
|             AgentCircuitData acd = GenerateAgentData(agentId); |             return AddChildScenePresence(scene, GenerateAgentData(agentId)); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public static ScenePresence AddChildScenePresence(Scene scene, AgentCircuitData acd) | ||||||
|  |         { | ||||||
|             acd.child = true; |             acd.child = true; | ||||||
| 
 | 
 | ||||||
|             // XXX: ViaLogin may not be correct for child agents |             // XXX: ViaLogin may not be correct for child agents | ||||||
|  |  | ||||||
|  | @ -62,14 +62,23 @@ namespace OpenSim.Tests.Common.Mock | ||||||
|         public event Action<RegionInfo, Vector3, Vector3> OnReceivedMoveAgentIntoRegion; |         public event Action<RegionInfo, Vector3, Vector3> OnReceivedMoveAgentIntoRegion; | ||||||
|         public event Action<ulong, IPEndPoint> OnTestClientInformClientOfNeighbour; |         public event Action<ulong, IPEndPoint> OnTestClientInformClientOfNeighbour; | ||||||
|         public event TestClientOnSendRegionTeleportDelegate OnTestClientSendRegionTeleport; |         public event TestClientOnSendRegionTeleportDelegate OnTestClientSendRegionTeleport; | ||||||
|  | 
 | ||||||
|         public event Action<ISceneEntity, PrimUpdateFlags> OnReceivedEntityUpdate; |         public event Action<ISceneEntity, PrimUpdateFlags> OnReceivedEntityUpdate; | ||||||
|  | 
 | ||||||
|  |         public event OnReceivedChatMessageDelegate OnReceivedChatMessage; | ||||||
|         public event Action<GridInstantMessage> OnReceivedInstantMessage; |         public event Action<GridInstantMessage> OnReceivedInstantMessage; | ||||||
|  | 
 | ||||||
|         public event Action<UUID> OnReceivedSendRebakeAvatarTextures; |         public event Action<UUID> OnReceivedSendRebakeAvatarTextures; | ||||||
| 
 | 
 | ||||||
|         public delegate void TestClientOnSendRegionTeleportDelegate( |         public delegate void TestClientOnSendRegionTeleportDelegate( | ||||||
|             ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint, |             ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint, | ||||||
|             uint locationID, uint flags, string capsURL); |             uint locationID, uint flags, string capsURL); | ||||||
| 
 | 
 | ||||||
|  |         public delegate void OnReceivedChatMessageDelegate( | ||||||
|  |             string message, byte type, Vector3 fromPos, string fromName, | ||||||
|  |             UUID fromAgentID, UUID ownerID, byte source, byte audible); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| // disable warning: public events, part of the public API | // disable warning: public events, part of the public API | ||||||
| #pragma warning disable 67 | #pragma warning disable 67 | ||||||
| 
 | 
 | ||||||
|  | @ -466,6 +475,34 @@ namespace OpenSim.Tests.Common.Mock | ||||||
|             SentImageNotInDatabasePackets = new List<ImageNotInDatabasePacket>(); |             SentImageNotInDatabasePackets = new List<ImageNotInDatabasePacket>(); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         /// <summary> | ||||||
|  |         /// Trigger chat coming from this connection. | ||||||
|  |         /// </summary> | ||||||
|  |         /// <param name="channel"></param> | ||||||
|  |         /// <param name="type"></param> | ||||||
|  |         /// <param name="message"></param> | ||||||
|  |         public bool Chat(int channel, ChatTypeEnum type, string message) | ||||||
|  |         { | ||||||
|  |             ChatMessage handlerChatFromClient = OnChatFromClient; | ||||||
|  | 
 | ||||||
|  |             if (handlerChatFromClient != null) | ||||||
|  |             { | ||||||
|  |                 OSChatMessage args = new OSChatMessage(); | ||||||
|  |                 args.Channel = channel; | ||||||
|  |                 args.From = Name; | ||||||
|  |                 args.Message = message; | ||||||
|  |                 args.Type = type; | ||||||
|  | 
 | ||||||
|  |                 args.Scene = Scene; | ||||||
|  |                 args.Sender = this; | ||||||
|  |                 args.SenderUUID = AgentId; | ||||||
|  | 
 | ||||||
|  |                 handlerChatFromClient(this, args); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Attempt a teleport to the given region. |         /// Attempt a teleport to the given region. | ||||||
|         /// </summary> |         /// </summary> | ||||||
|  | @ -550,6 +587,9 @@ namespace OpenSim.Tests.Common.Mock | ||||||
|             string message, byte type, Vector3 fromPos, string fromName, |             string message, byte type, Vector3 fromPos, string fromName, | ||||||
|             UUID fromAgentID, UUID ownerID, byte source, byte audible) |             UUID fromAgentID, UUID ownerID, byte source, byte audible) | ||||||
|         { |         { | ||||||
|  | //            Console.WriteLine("mmm {0} {1} {2}", message, Name, AgentId); | ||||||
|  |             if (OnReceivedChatMessage != null) | ||||||
|  |                 OnReceivedChatMessage(message, type, fromPos, fromName, fromAgentID, ownerID, source, audible); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public void SendInstantMessage(GridInstantMessage im) |         public void SendInstantMessage(GridInstantMessage im) | ||||||
|  |  | ||||||
|  | @ -3082,6 +3082,7 @@ | ||||||
|         <Match path="Asset/Tests" pattern="*.cs" recurse="true"/> |         <Match path="Asset/Tests" pattern="*.cs" recurse="true"/> | ||||||
|         <Match path="Avatar/Attachments/Tests" pattern="*.cs" recurse="true"/> |         <Match path="Avatar/Attachments/Tests" pattern="*.cs" recurse="true"/> | ||||||
|         <Match path="Avatar/AvatarFactory/Tests" pattern="*.cs" recurse="true"/> |         <Match path="Avatar/AvatarFactory/Tests" pattern="*.cs" recurse="true"/> | ||||||
|  |         <Match path="Avatar/Chat/Tests" pattern="*.cs" recurse="true"/> | ||||||
|         <Match path="Avatar/Friends/Tests" pattern="*.cs" recurse="true"/> |         <Match path="Avatar/Friends/Tests" pattern="*.cs" recurse="true"/> | ||||||
|         <Match path="Avatar/Inventory/Archiver/Tests" pattern="*.cs" recurse="true"/> |         <Match path="Avatar/Inventory/Archiver/Tests" pattern="*.cs" recurse="true"/> | ||||||
|         <Match path="Avatar/Inventory/Transfer/Tests" pattern="*.cs" recurse="true"/> |         <Match path="Avatar/Inventory/Transfer/Tests" pattern="*.cs" recurse="true"/> | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Diva Canto
						Diva Canto