From 64eb4b8408ed6d305dae2ec6877b55af1f553932 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Tue, 20 Mar 2012 00:40:03 +0000
Subject: Fix crash where two scene loop threads could changes
 m_MeshToTriMeshMap at the same time.

Have to lock m_MeshToTriMeshMap as property is static and with more than one region two scene loops could try to manipulate at the same time.
---
 OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 26 ++++++++++++++++----------
 1 file changed, 16 insertions(+), 10 deletions(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
index 97890ee..1f79cd8 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
@@ -842,17 +842,23 @@ namespace OpenSim.Region.Physics.OdePlugin
             mesh.getIndexListAsPtrToIntArray(out indices, out triStride, out indexCount); // Also fixed, needs release after usage
 
             mesh.releaseSourceMeshData(); // free up the original mesh data to save memory
-            if (m_MeshToTriMeshMap.ContainsKey(mesh))
-            {
-                _triMeshData = m_MeshToTriMeshMap[mesh];
-            }
-            else
-            {
-                _triMeshData = d.GeomTriMeshDataCreate();
 
-                d.GeomTriMeshDataBuildSimple(_triMeshData, vertices, vertexStride, vertexCount, indices, indexCount, triStride);
-                d.GeomTriMeshDataPreprocess(_triMeshData);
-                m_MeshToTriMeshMap[mesh] = _triMeshData;
+            // We must lock here since m_MeshToTriMeshMap is static and multiple scene threads may call this method at
+            // the same time.
+            lock (m_MeshToTriMeshMap)
+            {
+                if (m_MeshToTriMeshMap.ContainsKey(mesh))
+                {
+                    _triMeshData = m_MeshToTriMeshMap[mesh];
+                }
+                else
+                {
+                    _triMeshData = d.GeomTriMeshDataCreate();
+    
+                    d.GeomTriMeshDataBuildSimple(_triMeshData, vertices, vertexStride, vertexCount, indices, indexCount, triStride);
+                    d.GeomTriMeshDataPreprocess(_triMeshData);
+                    m_MeshToTriMeshMap[mesh] = _triMeshData;
+                }
             }
 
 //            _parent_scene.waitForSpaceUnlock(m_targetSpace);
-- 
cgit v1.1


From 6ecf36d49c3d74d23e439d9e354dfb9eaf1ee463 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Tue, 20 Mar 2012 00:53:33 +0000
Subject: Fix small typo

---
 OpenSim/Services/UserAccountService/UserAccountService.cs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Services/UserAccountService/UserAccountService.cs b/OpenSim/Services/UserAccountService/UserAccountService.cs
index 4a29690..79a7dce 100644
--- a/OpenSim/Services/UserAccountService/UserAccountService.cs
+++ b/OpenSim/Services/UserAccountService/UserAccountService.cs
@@ -521,7 +521,7 @@ namespace OpenSim.Services.UserAccountService
                         else
                         {
                             m_log.DebugFormat(
-                                "[USER ACCOUNT SERVICE]; Created user inventory for {0} {1}", firstName, lastName);
+                                "[USER ACCOUNT SERVICE]: Created user inventory for {0} {1}", firstName, lastName);
                         }
 
                         if (m_CreateDefaultAvatarEntries)
-- 
cgit v1.1


From 381517b4517cb8878b9a979425a05e5fce6d84d4 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Tue, 20 Mar 2012 23:35:50 +0000
Subject: Add prim name to "[MESH]: No recognized physics mesh..." log message

---
 OpenSim/Region/Physics/Meshing/Meshmerizer.cs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
index 6f6ed7f..3bd15ce 100644
--- a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
+++ b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
@@ -358,7 +358,7 @@ namespace OpenSim.Region.Physics.Meshing
 
                 if (physicsParms == null)
                 {
-                    m_log.Warn("[MESH]: no recognized physics mesh found in mesh asset");
+                    m_log.WarnFormat("[MESH]: No recognized physics mesh found in mesh asset for {0}", primName);
                     return false;
                 }
 
-- 
cgit v1.1


From 3c13f5c3aae3d70f1e8dd3ccdee70baaeb79f0f8 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 22 Mar 2012 22:17:07 +0000
Subject: Add llGiveInventory() test from object to object where both objects
 are owned by the same user.

---
 .../CoreModules/World/Terrain/TerrainModule.cs     |   6 ++
 .../Framework/Interfaces/IEntityInventory.cs       |  11 +-
 .../Framework/Scenes/SceneObjectPartInventory.cs   |   6 +-
 .../Framework/Scenes/Tests/TaskInventoryTests.cs   |   6 +-
 .../Shared/Tests/LSL_ApiInventoryTests.cs          | 111 +++++++++++++++++++++
 OpenSim/Server/Handlers/Login/LLLoginHandlers.cs   |  12 +++
 .../Handlers/Login/LLLoginServiceInConnector.cs    |   1 -
 7 files changed, 146 insertions(+), 7 deletions(-)
 create mode 100644 OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs

(limited to 'OpenSim')

diff --git a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
index ef9c95c..f6ddc66 100644
--- a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
+++ b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
@@ -598,6 +598,12 @@ namespace OpenSim.Region.CoreModules.World.Terrain
                     "[TERRAIN]: Could not save terrain from {0} to {1}.  Valid file extensions are {2}",
                     m_scene.RegionInfo.RegionName, filename, m_supportedFileExtensions);
             }
+            else
+            {
+                m_log.ErrorFormat(
+                    "[TERRAIN]: Could not save terrain from {0} to {1}.  {2} {3} {4} {5} {6} {7}",
+                    m_scene.RegionInfo.RegionName, filename, fileWidth, fileHeight, fileStartX, fileStartY, offsetX, offsetY);
+            }
         }
 
         /// <summary>
diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
index 15060fd..1334905 100644
--- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
+++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
@@ -155,6 +155,15 @@ namespace OpenSim.Region.Framework.Interfaces
         TaskInventoryItem GetInventoryItem(UUID itemId);
 
         /// <summary>
+        /// Get all inventory items.
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns>
+        /// If there are no inventory items then an empty list is returned.
+        /// </returns>
+        List<TaskInventoryItem> GetInventoryItems();
+
+        /// <summary>
         /// Get inventory items by name.
         /// </summary>
         /// <param name="name"></param>
@@ -162,7 +171,7 @@ namespace OpenSim.Region.Framework.Interfaces
         /// A list of inventory items with that name.
         /// If no inventory item has that name then an empty list is returned.
         /// </returns>
-        IList<TaskInventoryItem> GetInventoryItems(string name);
+        List<TaskInventoryItem> GetInventoryItems(string name);
         
         /// <summary>
         /// Get the scene object referenced by an inventory item.
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index f2d1915..71a9084 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -590,9 +590,9 @@ namespace OpenSim.Region.Framework.Scenes
         /// A list of inventory items with that name.
         /// If no inventory item has that name then an empty list is returned.
         /// </returns>
-        public IList<TaskInventoryItem> GetInventoryItems(string name)
+        public List<TaskInventoryItem> GetInventoryItems(string name)
         {
-            IList<TaskInventoryItem> items = new List<TaskInventoryItem>();
+            List<TaskInventoryItem> items = new List<TaskInventoryItem>();
 
             lock (m_items)
             {
@@ -1100,7 +1100,7 @@ namespace OpenSim.Region.Framework.Scenes
 
         public List<TaskInventoryItem> GetInventoryItems()
         {
-           List<TaskInventoryItem> ret = new List<TaskInventoryItem>();
+            List<TaskInventoryItem> ret = new List<TaskInventoryItem>();
 
             lock (m_items)
                 ret = new List<TaskInventoryItem>(m_items.Values);
diff --git a/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs
index e4b607d..f946b00 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs
@@ -114,7 +114,7 @@ namespace OpenSim.Region.Framework.Tests
         }
 
         /// <summary>
-        /// Test MoveTaskInventoryItem where the item has no parent folder assigned.
+        /// Test MoveTaskInventoryItem from a part inventory to a user inventory where the item has no parent folder assigned.
         /// </summary>
         /// <remarks>
         /// This should place it in the most suitable user folder.
@@ -143,9 +143,11 @@ namespace OpenSim.Region.Framework.Tests
         }
         
         /// <summary>
-        /// Test MoveTaskInventoryItem where the item has no parent folder assigned.
+        /// Test MoveTaskInventoryItem from a part inventory to a user inventory where the item has no parent folder assigned.
         /// </summary>
+        /// <remarks>
         /// This should place it in the most suitable user folder.
+        /// </remarks>
         [Test]
         public void TestMoveTaskInventoryItemNoParent()
         {
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs
new file mode 100644
index 0000000..ca27b27
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs
@@ -0,0 +1,111 @@
+/*
+ * 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 System.Reflection;
+using System.Text;
+using log4net;
+using Nini.Config;
+using NUnit.Framework;
+using OpenMetaverse;
+using OpenMetaverse.Assets;
+using OpenMetaverse.StructuredData;
+using OpenSim.Framework;
+using OpenSim.Region.CoreModules.Avatar.AvatarFactory;
+using OpenSim.Region.OptionalModules.World.NPC;
+using OpenSim.Region.Framework.Scenes;
+using OpenSim.Region.ScriptEngine.Shared;
+using OpenSim.Region.ScriptEngine.Shared.Api;
+using OpenSim.Services.Interfaces;
+using OpenSim.Tests.Common;
+using OpenSim.Tests.Common.Mock;
+
+namespace OpenSim.Region.ScriptEngine.Shared.Tests
+{
+    /// <summary>
+    /// Tests for inventory functions in LSL
+    /// </summary>
+    [TestFixture]
+    public class LSL_ApiInventoryTests
+    {
+        protected Scene m_scene;
+        protected XEngine.XEngine m_engine;
+
+        [SetUp]
+        public void SetUp()
+        {
+            IConfigSource initConfigSource = new IniConfigSource();
+            IConfig config = initConfigSource.AddConfig("XEngine");
+            config.Set("Enabled", "true");
+
+            m_scene = SceneHelpers.SetupScene();
+            SceneHelpers.SetupSceneModules(m_scene, initConfigSource);
+
+            m_engine = new XEngine.XEngine();
+            m_engine.Initialise(initConfigSource);
+            m_engine.AddRegion(m_scene);
+        }
+
+        /// <summary>
+        /// Test giving inventory from an object to an object where both are owned by the same user.
+        /// </summary>
+        [Test]
+        public void TestLlGiveInventorySameOwner()
+        {
+            TestHelpers.InMethod();
+//            log4net.Config.XmlConfigurator.Configure();
+
+            UUID userId = TestHelpers.ParseTail(0x1);
+            string inventoryItemName = "item1";
+
+            SceneObjectGroup so1 = SceneHelpers.CreateSceneObject(1, userId, "so1", 0x10);
+            m_scene.AddSceneObject(so1);
+
+            // Create an object embedded inside the first
+            UUID itemId = TestHelpers.ParseTail(0x20);
+            TaskInventoryHelpers.AddSceneObject(m_scene, so1.RootPart, inventoryItemName, itemId, userId);
+
+            LSL_Api api = new LSL_Api();
+            api.Initialize(m_engine, so1.RootPart, so1.RootPart.LocalId, so1.RootPart.UUID);
+
+            // Create a second object
+            SceneObjectGroup so2 = SceneHelpers.CreateSceneObject(1, userId, "so2", 0x100);
+            m_scene.AddSceneObject(so2);
+
+            api.llGiveInventory(so2.UUID.ToString(), inventoryItemName);
+
+            // Item has copy permissions so original should stay intact.
+            List<TaskInventoryItem> originalItems = so1.RootPart.Inventory.GetInventoryItems();
+            Assert.That(originalItems.Count, Is.EqualTo(1));
+
+            List<TaskInventoryItem> copiedItems = so2.RootPart.Inventory.GetInventoryItems(inventoryItemName);
+            Assert.That(copiedItems.Count, Is.EqualTo(1));
+            Assert.That(copiedItems[0].Name, Is.EqualTo(inventoryItemName));
+        }
+    }
+}
\ No newline at end of file
diff --git a/OpenSim/Server/Handlers/Login/LLLoginHandlers.cs b/OpenSim/Server/Handlers/Login/LLLoginHandlers.cs
index 8048f86..ed62f95 100644
--- a/OpenSim/Server/Handlers/Login/LLLoginHandlers.cs
+++ b/OpenSim/Server/Handlers/Login/LLLoginHandlers.cs
@@ -73,6 +73,18 @@ namespace OpenSim.Server.Handlers.Login
 
             if (requestData != null)
             {
+                foreach (string key in requestData.Keys)
+                {
+                    object value = requestData[key];
+                    Console.WriteLine("{0}:{1}", key, value);
+                    if (value is ArrayList)
+                    {
+                        ICollection col = value as ICollection;
+                        foreach (object item in col)
+                            Console.WriteLine("  {0}", item);
+                    }
+                }
+
                 if (requestData.ContainsKey("first") && requestData["first"] != null &&
                     requestData.ContainsKey("last") && requestData["last"] != null && (
                         (requestData.ContainsKey("passwd") && requestData["passwd"] != null) ||
diff --git a/OpenSim/Server/Handlers/Login/LLLoginServiceInConnector.cs b/OpenSim/Server/Handlers/Login/LLLoginServiceInConnector.cs
index 16c93c8..9a7ad34 100644
--- a/OpenSim/Server/Handlers/Login/LLLoginServiceInConnector.cs
+++ b/OpenSim/Server/Handlers/Login/LLLoginServiceInConnector.cs
@@ -94,6 +94,5 @@ namespace OpenSim.Server.Handlers.Login
             server.AddXmlRPCHandler("set_login_level", loginHandlers.HandleXMLRPCSetLoginLevel, false);
             server.SetDefaultLLSDHandler(loginHandlers.HandleLLSDLogin);
         }
-
     }
 }
-- 
cgit v1.1


From 4021709371c6923897c11e55b6645f7174107352 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 22 Mar 2012 22:33:37 +0000
Subject: Fix llGiveInventory() so that it checks the destination part for
 AllowInventoryDrop, not the source.

This allows llAllowInventoryDrop() to work.
Regression test added for this case.
---
 OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 10 ++--
 .../Shared/Tests/LSL_ApiInventoryTests.cs          | 59 +++++++++++++++++++++-
 2 files changed, 63 insertions(+), 6 deletions(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 23f39a8..b5558d1 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1210,9 +1210,9 @@ namespace OpenSim.Region.Framework.Scenes
         /// <summary>
         /// Copy a task (prim) inventory item to another task (prim)
         /// </summary>
-        /// <param name="destId"></param>
-        /// <param name="part"></param>
-        /// <param name="itemId"></param>
+        /// <param name="destId">ID of destination part</param>
+        /// <param name="part">Source part</param>
+        /// <param name="itemId">Source item id to transfer</param>
         public void MoveTaskInventoryItem(UUID destId, SceneObjectPart part, UUID itemId)
         {
             TaskInventoryItem srcTaskItem = part.Inventory.GetInventoryItem(itemId);
@@ -1240,10 +1240,10 @@ namespace OpenSim.Region.Framework.Scenes
 
             // Can't transfer this
             //
-            if ((part.OwnerID != destPart.OwnerID) && ((srcTaskItem.CurrentPermissions & (uint)PermissionMask.Transfer) == 0))
+            if (part.OwnerID != destPart.OwnerID && (srcTaskItem.CurrentPermissions & (uint)PermissionMask.Transfer) == 0)
                 return;
 
-            if (part.OwnerID != destPart.OwnerID && (part.GetEffectiveObjectFlags() & (uint)PrimFlags.AllowInventoryDrop) == 0)
+            if (part.OwnerID != destPart.OwnerID && (destPart.GetEffectiveObjectFlags() & (uint)PrimFlags.AllowInventoryDrop) == 0)
             {
                 // object cannot copy items to an object owned by a different owner
                 // unless llAllowInventoryDrop has been called
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs
index ca27b27..e2d0db2 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs
@@ -75,7 +75,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
         /// Test giving inventory from an object to an object where both are owned by the same user.
         /// </summary>
         [Test]
-        public void TestLlGiveInventorySameOwner()
+        public void TestLlGiveInventoryO2OSameOwner()
         {
             TestHelpers.InMethod();
 //            log4net.Config.XmlConfigurator.Configure();
@@ -107,5 +107,62 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
             Assert.That(copiedItems.Count, Is.EqualTo(1));
             Assert.That(copiedItems[0].Name, Is.EqualTo(inventoryItemName));
         }
+
+        /// <summary>
+        /// Test giving inventory from an object to an object where they have different owners
+        /// </summary>
+        [Test]
+        public void TestLlGiveInventoryO2ODifferentOwners()
+        {
+            TestHelpers.InMethod();
+//            log4net.Config.XmlConfigurator.Configure();
+
+            UUID user1Id = TestHelpers.ParseTail(0x1);
+            UUID user2Id = TestHelpers.ParseTail(0x2);
+            string inventoryItemName = "item1";
+
+            SceneObjectGroup so1 = SceneHelpers.CreateSceneObject(1, user1Id, "so1", 0x10);
+            m_scene.AddSceneObject(so1);
+            LSL_Api api = new LSL_Api();
+            api.Initialize(m_engine, so1.RootPart, so1.RootPart.LocalId, so1.RootPart.UUID);
+
+            // Create an object embedded inside the first
+            UUID itemId = TestHelpers.ParseTail(0x20);
+            TaskInventoryHelpers.AddSceneObject(m_scene, so1.RootPart, inventoryItemName, itemId, user1Id);
+
+            // Create a second object
+            SceneObjectGroup so2 = SceneHelpers.CreateSceneObject(1, user2Id, "so2", 0x100);
+            m_scene.AddSceneObject(so2);
+            LSL_Api api2 = new LSL_Api();
+            api2.Initialize(m_engine, so2.RootPart, so2.RootPart.LocalId, so2.RootPart.UUID);
+
+            // *** Firstly, we test where llAllowInventoryDrop() has not been called. ***
+            api.llGiveInventory(so2.UUID.ToString(), inventoryItemName);
+
+            {
+                // Item has copy permissions so original should stay intact.
+                List<TaskInventoryItem> originalItems = so1.RootPart.Inventory.GetInventoryItems();
+                Assert.That(originalItems.Count, Is.EqualTo(1));
+
+                // Should have not copied
+                List<TaskInventoryItem> copiedItems = so2.RootPart.Inventory.GetInventoryItems(inventoryItemName);
+                Assert.That(copiedItems.Count, Is.EqualTo(0));
+            }
+
+            // *** Secondly, we turn on allow inventory drop in the target and retest. ***
+            api2.llAllowInventoryDrop(1);
+            api.llGiveInventory(so2.UUID.ToString(), inventoryItemName);
+
+            {
+                // Item has copy permissions so original should stay intact.
+                List<TaskInventoryItem> originalItems = so1.RootPart.Inventory.GetInventoryItems();
+                Assert.That(originalItems.Count, Is.EqualTo(1));
+    
+                // Should now have copied.
+                List<TaskInventoryItem> copiedItems = so2.RootPart.Inventory.GetInventoryItems(inventoryItemName);
+                Assert.That(copiedItems.Count, Is.EqualTo(1));
+                Assert.That(copiedItems[0].Name, Is.EqualTo(inventoryItemName));
+            }
+        }
     }
 }
\ No newline at end of file
-- 
cgit v1.1


From 4d15ad63bf110820c10f5cbf5add0bded2c8a8e3 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 22 Mar 2012 22:40:38 +0000
Subject: refactor: simplify code for checks when part.OwnerID !=
 destPart.OwnerID in MoveTaskInventoryItem()

---
 OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 19 ++++++++-----------
 1 file changed, 8 insertions(+), 11 deletions(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index b5558d1..2ca9353 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1238,24 +1238,21 @@ namespace OpenSim.Region.Framework.Scenes
                 return;
             }
 
-            // Can't transfer this
-            //
-            if (part.OwnerID != destPart.OwnerID && (srcTaskItem.CurrentPermissions & (uint)PermissionMask.Transfer) == 0)
-                return;
-
-            if (part.OwnerID != destPart.OwnerID && (destPart.GetEffectiveObjectFlags() & (uint)PrimFlags.AllowInventoryDrop) == 0)
+            if (part.OwnerID != destPart.OwnerID)
             {
-                // object cannot copy items to an object owned by a different owner
-                // unless llAllowInventoryDrop has been called
+                // Source must have transfer permissions
+                if ((srcTaskItem.CurrentPermissions & (uint)PermissionMask.Transfer) == 0)
+                    return;
 
-                return;
+                // Object cannot copy items to an object owned by a different owner
+                // unless llAllowInventoryDrop has been called on the destination
+                if ((destPart.GetEffectiveObjectFlags() & (uint)PrimFlags.AllowInventoryDrop) == 0)
+                    return;
             }
 
             // must have both move and modify permission to put an item in an object
             if ((part.OwnerMask & ((uint)PermissionMask.Move | (uint)PermissionMask.Modify)) == 0)
-            {
                 return;
-            }
 
             TaskInventoryItem destTaskItem = new TaskInventoryItem();
 
-- 
cgit v1.1


From 9edb57e5e932ff809c9f4af630c4cc2ddd7717f7 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 22 Mar 2012 23:16:52 +0000
Subject: Comment out a terrain save-tile debugging message that accidentally
 crept in with c4b2d24

---
 OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
index f6ddc66..9cd8f2b 100644
--- a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
+++ b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs
@@ -598,12 +598,12 @@ namespace OpenSim.Region.CoreModules.World.Terrain
                     "[TERRAIN]: Could not save terrain from {0} to {1}.  Valid file extensions are {2}",
                     m_scene.RegionInfo.RegionName, filename, m_supportedFileExtensions);
             }
-            else
-            {
-                m_log.ErrorFormat(
-                    "[TERRAIN]: Could not save terrain from {0} to {1}.  {2} {3} {4} {5} {6} {7}",
-                    m_scene.RegionInfo.RegionName, filename, fileWidth, fileHeight, fileStartX, fileStartY, offsetX, offsetY);
-            }
+//            else
+//            {
+//                m_log.ErrorFormat(
+//                    "[TERRAIN]: Could not save terrain from {0} to {1}.  {2} {3} {4} {5} {6} {7}",
+//                    m_scene.RegionInfo.RegionName, filename, fileWidth, fileHeight, fileStartX, fileStartY, offsetX, offsetY);
+//            }
         }
 
         /// <summary>
-- 
cgit v1.1


From 4dbf9377075d446f005a383a474ea22c463ac57d Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 22 Mar 2012 23:31:41 +0000
Subject: Comment out login parameters debug output accidentally included with
 c4b2d24

---
 OpenSim/Server/Handlers/Login/LLLoginHandlers.cs | 24 +++++++++++++-----------
 1 file changed, 13 insertions(+), 11 deletions(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Server/Handlers/Login/LLLoginHandlers.cs b/OpenSim/Server/Handlers/Login/LLLoginHandlers.cs
index ed62f95..f83a239 100644
--- a/OpenSim/Server/Handlers/Login/LLLoginHandlers.cs
+++ b/OpenSim/Server/Handlers/Login/LLLoginHandlers.cs
@@ -73,17 +73,19 @@ namespace OpenSim.Server.Handlers.Login
 
             if (requestData != null)
             {
-                foreach (string key in requestData.Keys)
-                {
-                    object value = requestData[key];
-                    Console.WriteLine("{0}:{1}", key, value);
-                    if (value is ArrayList)
-                    {
-                        ICollection col = value as ICollection;
-                        foreach (object item in col)
-                            Console.WriteLine("  {0}", item);
-                    }
-                }
+                // Debug code to show exactly what login parameters the viewer is sending us.
+                // TODO: Extract into a method that can be generally applied if one doesn't already exist.
+//                foreach (string key in requestData.Keys)
+//                {
+//                    object value = requestData[key];
+//                    Console.WriteLine("{0}:{1}", key, value);
+//                    if (value is ArrayList)
+//                    {
+//                        ICollection col = value as ICollection;
+//                        foreach (object item in col)
+//                            Console.WriteLine("  {0}", item);
+//                    }
+//                }
 
                 if (requestData.ContainsKey("first") && requestData["first"] != null &&
                     requestData.ContainsKey("last") && requestData["last"] != null && (
-- 
cgit v1.1