Merge branch 'master' into careminster
Conflicts: OpenSim/Region/Framework/Scenes/Scene.csavinationmerge
commit
b89d18e6f4
|
@ -75,6 +75,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
|
||||||
[SetUp]
|
[SetUp]
|
||||||
public void SetUp()
|
public void SetUp()
|
||||||
{
|
{
|
||||||
|
base.SetUp();
|
||||||
|
|
||||||
UUID userId = TestHelpers.ParseTail(0x3);
|
UUID userId = TestHelpers.ParseTail(0x3);
|
||||||
|
|
||||||
J2KDecoderModule j2kdm = new J2KDecoderModule();
|
J2KDecoderModule j2kdm = new J2KDecoderModule();
|
||||||
|
|
|
@ -47,10 +47,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
private List<Scene> m_Scenelist = new List<Scene>();
|
private List<Scene> m_Scenelist = new List<Scene>();
|
||||||
// private Dictionary<UUID, Scene> m_AgentRegions =
|
|
||||||
// new Dictionary<UUID, Scene>();
|
|
||||||
|
|
||||||
private IMessageTransferModule m_TransferModule = null;
|
private IMessageTransferModule m_TransferModule;
|
||||||
private bool m_Enabled = true;
|
private bool m_Enabled = true;
|
||||||
|
|
||||||
#region Region Module interface
|
#region Region Module interface
|
||||||
|
@ -81,9 +79,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
|
||||||
// scene.RegisterModuleInterface<IInventoryTransferModule>(this);
|
// scene.RegisterModuleInterface<IInventoryTransferModule>(this);
|
||||||
|
|
||||||
scene.EventManager.OnNewClient += OnNewClient;
|
scene.EventManager.OnNewClient += OnNewClient;
|
||||||
// scene.EventManager.OnClientClosed += ClientLoggedOut;
|
|
||||||
scene.EventManager.OnIncomingInstantMessage += OnGridInstantMessage;
|
scene.EventManager.OnIncomingInstantMessage += OnGridInstantMessage;
|
||||||
// scene.EventManager.OnSetRootAgentScene += OnSetRootAgentScene;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RegionLoaded(Scene scene)
|
public void RegionLoaded(Scene scene)
|
||||||
|
@ -96,11 +92,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
|
||||||
m_log.Error("[INVENTORY TRANSFER]: No Message transfer module found, transfers will be local only");
|
m_log.Error("[INVENTORY TRANSFER]: No Message transfer module found, transfers will be local only");
|
||||||
m_Enabled = false;
|
m_Enabled = false;
|
||||||
|
|
||||||
m_Scenelist.Clear();
|
// m_Scenelist.Clear();
|
||||||
scene.EventManager.OnNewClient -= OnNewClient;
|
// scene.EventManager.OnNewClient -= OnNewClient;
|
||||||
// scene.EventManager.OnClientClosed -= ClientLoggedOut;
|
|
||||||
scene.EventManager.OnIncomingInstantMessage -= OnGridInstantMessage;
|
scene.EventManager.OnIncomingInstantMessage -= OnGridInstantMessage;
|
||||||
// scene.EventManager.OnSetRootAgentScene -= OnSetRootAgentScene;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -108,9 +102,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
|
||||||
public void RemoveRegion(Scene scene)
|
public void RemoveRegion(Scene scene)
|
||||||
{
|
{
|
||||||
scene.EventManager.OnNewClient -= OnNewClient;
|
scene.EventManager.OnNewClient -= OnNewClient;
|
||||||
// scene.EventManager.OnClientClosed -= ClientLoggedOut;
|
|
||||||
scene.EventManager.OnIncomingInstantMessage -= OnGridInstantMessage;
|
scene.EventManager.OnIncomingInstantMessage -= OnGridInstantMessage;
|
||||||
// scene.EventManager.OnSetRootAgentScene -= OnSetRootAgentScene;
|
|
||||||
m_Scenelist.Remove(scene);
|
m_Scenelist.Remove(scene);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,11 +131,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
|
||||||
// Inventory giving is conducted via instant message
|
// Inventory giving is conducted via instant message
|
||||||
client.OnInstantMessage += OnInstantMessage;
|
client.OnInstantMessage += OnInstantMessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
// protected void OnSetRootAgentScene(UUID id, Scene scene)
|
|
||||||
// {
|
|
||||||
// m_AgentRegions[id] = scene;
|
|
||||||
// }
|
|
||||||
|
|
||||||
private Scene FindClientScene(UUID agentId)
|
private Scene FindClientScene(UUID agentId)
|
||||||
{
|
{
|
||||||
|
@ -188,9 +175,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
|
||||||
{
|
{
|
||||||
UUID folderID = new UUID(im.binaryBucket, 1);
|
UUID folderID = new UUID(im.binaryBucket, 1);
|
||||||
|
|
||||||
m_log.DebugFormat("[INVENTORY TRANSFER]: Inserting original folder {0} "+
|
m_log.DebugFormat(
|
||||||
"into agent {1}'s inventory",
|
"[INVENTORY TRANSFER]: Inserting original folder {0} into agent {1}'s inventory",
|
||||||
folderID, new UUID(im.toAgentID));
|
folderID, new UUID(im.toAgentID));
|
||||||
|
|
||||||
InventoryFolderBase folderCopy
|
InventoryFolderBase folderCopy
|
||||||
= scene.GiveInventoryFolder(recipientID, client.AgentId, folderID, UUID.Zero);
|
= scene.GiveInventoryFolder(recipientID, client.AgentId, folderID, UUID.Zero);
|
||||||
|
@ -213,7 +200,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
|
||||||
user.ControllingClient.SendBulkUpdateInventory(folderCopy);
|
user.ControllingClient.SendBulkUpdateInventory(folderCopy);
|
||||||
|
|
||||||
// HACK!!
|
// HACK!!
|
||||||
im.imSessionID = folderID.Guid;
|
// Insert the ID of the copied folder into the IM so that we know which item to move to trash if it
|
||||||
|
// is rejected.
|
||||||
|
// XXX: This is probably a misuse of the session ID slot.
|
||||||
|
im.imSessionID = copyID.Guid;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -243,7 +233,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
|
||||||
user.ControllingClient.SendBulkUpdateInventory(itemCopy);
|
user.ControllingClient.SendBulkUpdateInventory(itemCopy);
|
||||||
|
|
||||||
// HACK!!
|
// HACK!!
|
||||||
im.imSessionID = itemID.Guid;
|
// Insert the ID of the copied item into the IM so that we know which item to move to trash if it
|
||||||
|
// is rejected.
|
||||||
|
// XXX: This is probably a misuse of the session ID slot.
|
||||||
|
im.imSessionID = copyID.Guid;
|
||||||
}
|
}
|
||||||
|
|
||||||
im.offline = 0;
|
im.offline = 0;
|
||||||
|
@ -419,7 +412,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
|
||||||
{
|
{
|
||||||
folder = new InventoryFolderBase(inventoryID, client.AgentId);
|
folder = new InventoryFolderBase(inventoryID, client.AgentId);
|
||||||
folder = invService.GetFolder(folder);
|
folder = invService.GetFolder(folder);
|
||||||
|
|
||||||
if (folder != null & trashFolder != null)
|
if (folder != null & trashFolder != null)
|
||||||
{
|
{
|
||||||
previousParentFolderID = folder.ParentID;
|
previousParentFolderID = folder.ParentID;
|
||||||
|
@ -471,70 +464,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// public bool NeedSceneCacheClear(UUID agentID, Scene scene)
|
|
||||||
// {
|
|
||||||
// if (!m_AgentRegions.ContainsKey(agentID))
|
|
||||||
// {
|
|
||||||
// // Since we can get here two ways, we need to scan
|
|
||||||
// // the scenes here. This is somewhat more expensive
|
|
||||||
// // but helps avoid a nasty bug
|
|
||||||
// //
|
|
||||||
//
|
|
||||||
// foreach (Scene s in m_Scenelist)
|
|
||||||
// {
|
|
||||||
// ScenePresence presence;
|
|
||||||
//
|
|
||||||
// if (s.TryGetScenePresence(agentID, out presence))
|
|
||||||
// {
|
|
||||||
// // If the agent is in this scene, then we
|
|
||||||
// // are being called twice in a single
|
|
||||||
// // teleport. This is wasteful of cycles
|
|
||||||
// // but harmless due to this 2nd level check
|
|
||||||
// //
|
|
||||||
// // If the agent is found in another scene
|
|
||||||
// // then the list wasn't current
|
|
||||||
// //
|
|
||||||
// // If the agent is totally unknown, then what
|
|
||||||
// // are we even doing here??
|
|
||||||
// //
|
|
||||||
// if (s == scene)
|
|
||||||
// {
|
|
||||||
// //m_log.Debug("[INVTRANSFERMOD]: s == scene. Returning true in " + scene.RegionInfo.RegionName);
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// //m_log.Debug("[INVTRANSFERMOD]: s != scene. Returning false in " + scene.RegionInfo.RegionName);
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// //m_log.Debug("[INVTRANSFERMOD]: agent not in scene. Returning true in " + scene.RegionInfo.RegionName);
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// // The agent is left in current Scene, so we must be
|
|
||||||
// // going to another instance
|
|
||||||
// //
|
|
||||||
// if (m_AgentRegions[agentID] == scene)
|
|
||||||
// {
|
|
||||||
// //m_log.Debug("[INVTRANSFERMOD]: m_AgentRegions[agentID] == scene. Returning true in " + scene.RegionInfo.RegionName);
|
|
||||||
// m_AgentRegions.Remove(agentID);
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// // Another region has claimed the agent
|
|
||||||
// //
|
|
||||||
// //m_log.Debug("[INVTRANSFERMOD]: last resort. Returning false in " + scene.RegionInfo.RegionName);
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void ClientLoggedOut(UUID agentID, Scene scene)
|
|
||||||
// {
|
|
||||||
// if (m_AgentRegions.ContainsKey(agentID))
|
|
||||||
// m_AgentRegions.Remove(agentID);
|
|
||||||
// }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -0,0 +1,449 @@
|
||||||
|
/*
|
||||||
|
* 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 log4net.Config;
|
||||||
|
using Nini.Config;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using OpenMetaverse;
|
||||||
|
using OpenMetaverse.Assets;
|
||||||
|
using OpenSim.Framework;
|
||||||
|
using OpenSim.Region.CoreModules.Avatar.Inventory.Transfer;
|
||||||
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
|
using OpenSim.Region.Framework.Scenes;
|
||||||
|
using OpenSim.Services.Interfaces;
|
||||||
|
using OpenSim.Tests.Common;
|
||||||
|
using OpenSim.Tests.Common.Mock;
|
||||||
|
|
||||||
|
namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer.Tests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class InventoryTransferModuleTests : OpenSimTestCase
|
||||||
|
{
|
||||||
|
protected TestScene m_scene;
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
public override void SetUp()
|
||||||
|
{
|
||||||
|
base.SetUp();
|
||||||
|
|
||||||
|
IConfigSource config = new IniConfigSource();
|
||||||
|
config.AddConfig("Messaging");
|
||||||
|
config.Configs["Messaging"].Set("InventoryTransferModule", "InventoryTransferModule");
|
||||||
|
|
||||||
|
m_scene = new SceneHelpers().SetupScene();
|
||||||
|
SceneHelpers.SetupSceneModules(m_scene, config, new InventoryTransferModule());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestAcceptGivenItem()
|
||||||
|
{
|
||||||
|
// TestHelpers.EnableLogging();
|
||||||
|
|
||||||
|
UUID initialSessionId = TestHelpers.ParseTail(0x10);
|
||||||
|
UUID itemId = TestHelpers.ParseTail(0x100);
|
||||||
|
UUID assetId = TestHelpers.ParseTail(0x200);
|
||||||
|
|
||||||
|
UserAccount ua1
|
||||||
|
= UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "One", TestHelpers.ParseTail(0x1), "pw");
|
||||||
|
UserAccount ua2
|
||||||
|
= UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "Two", TestHelpers.ParseTail(0x2), "pw");
|
||||||
|
|
||||||
|
ScenePresence giverSp = SceneHelpers.AddScenePresence(m_scene, ua1);
|
||||||
|
TestClient giverClient = (TestClient)giverSp.ControllingClient;
|
||||||
|
|
||||||
|
ScenePresence receiverSp = SceneHelpers.AddScenePresence(m_scene, ua2);
|
||||||
|
TestClient receiverClient = (TestClient)receiverSp.ControllingClient;
|
||||||
|
|
||||||
|
// Create the object to test give
|
||||||
|
InventoryItemBase originalItem
|
||||||
|
= UserInventoryHelpers.CreateInventoryItem(
|
||||||
|
m_scene, "givenObj", itemId, assetId, giverSp.UUID, InventoryType.Object);
|
||||||
|
|
||||||
|
byte[] giveImBinaryBucket = new byte[17];
|
||||||
|
byte[] itemIdBytes = itemId.GetBytes();
|
||||||
|
Array.Copy(itemIdBytes, 0, giveImBinaryBucket, 1, itemIdBytes.Length);
|
||||||
|
|
||||||
|
GridInstantMessage giveIm
|
||||||
|
= new GridInstantMessage(
|
||||||
|
m_scene,
|
||||||
|
giverSp.UUID,
|
||||||
|
giverSp.Name,
|
||||||
|
receiverSp.UUID,
|
||||||
|
(byte)InstantMessageDialog.InventoryOffered,
|
||||||
|
false,
|
||||||
|
"inventory offered msg",
|
||||||
|
initialSessionId,
|
||||||
|
false,
|
||||||
|
Vector3.Zero,
|
||||||
|
giveImBinaryBucket,
|
||||||
|
true);
|
||||||
|
|
||||||
|
giverClient.HandleImprovedInstantMessage(giveIm);
|
||||||
|
|
||||||
|
// These details might not all be correct.
|
||||||
|
GridInstantMessage acceptIm
|
||||||
|
= new GridInstantMessage(
|
||||||
|
m_scene,
|
||||||
|
receiverSp.UUID,
|
||||||
|
receiverSp.Name,
|
||||||
|
giverSp.UUID,
|
||||||
|
(byte)InstantMessageDialog.InventoryAccepted,
|
||||||
|
false,
|
||||||
|
"inventory accepted msg",
|
||||||
|
initialSessionId,
|
||||||
|
false,
|
||||||
|
Vector3.Zero,
|
||||||
|
null,
|
||||||
|
true);
|
||||||
|
|
||||||
|
receiverClient.HandleImprovedInstantMessage(acceptIm);
|
||||||
|
|
||||||
|
// Test for item remaining in the giver's inventory (here we assume a copy item)
|
||||||
|
// TODO: Test no-copy items.
|
||||||
|
InventoryItemBase originalItemAfterGive
|
||||||
|
= UserInventoryHelpers.GetInventoryItem(m_scene.InventoryService, giverSp.UUID, "Objects/givenObj");
|
||||||
|
|
||||||
|
Assert.That(originalItemAfterGive, Is.Not.Null);
|
||||||
|
Assert.That(originalItemAfterGive.ID, Is.EqualTo(originalItem.ID));
|
||||||
|
|
||||||
|
// Test for item successfully making it into the receiver's inventory
|
||||||
|
InventoryItemBase receivedItem
|
||||||
|
= UserInventoryHelpers.GetInventoryItem(m_scene.InventoryService, receiverSp.UUID, "Objects/givenObj");
|
||||||
|
|
||||||
|
Assert.That(receivedItem, Is.Not.Null);
|
||||||
|
Assert.That(receivedItem.ID, Is.Not.EqualTo(originalItem.ID));
|
||||||
|
|
||||||
|
// Test that on a delete, item still exists and is accessible for the giver.
|
||||||
|
m_scene.InventoryService.DeleteItems(receiverSp.UUID, new List<UUID>() { receivedItem.ID });
|
||||||
|
|
||||||
|
InventoryItemBase originalItemAfterDelete
|
||||||
|
= UserInventoryHelpers.GetInventoryItem(m_scene.InventoryService, giverSp.UUID, "Objects/givenObj");
|
||||||
|
|
||||||
|
Assert.That(originalItemAfterDelete, Is.Not.Null);
|
||||||
|
|
||||||
|
// TODO: Test scenario where giver deletes their item first.
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Test user rejection of a given item.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// A rejected item still ends up in the user's trash folder.
|
||||||
|
/// </remarks>
|
||||||
|
[Test]
|
||||||
|
public void TestRejectGivenItem()
|
||||||
|
{
|
||||||
|
// TestHelpers.EnableLogging();
|
||||||
|
|
||||||
|
UUID initialSessionId = TestHelpers.ParseTail(0x10);
|
||||||
|
UUID itemId = TestHelpers.ParseTail(0x100);
|
||||||
|
UUID assetId = TestHelpers.ParseTail(0x200);
|
||||||
|
|
||||||
|
UserAccount ua1
|
||||||
|
= UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "One", TestHelpers.ParseTail(0x1), "pw");
|
||||||
|
UserAccount ua2
|
||||||
|
= UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "Two", TestHelpers.ParseTail(0x2), "pw");
|
||||||
|
|
||||||
|
ScenePresence giverSp = SceneHelpers.AddScenePresence(m_scene, ua1);
|
||||||
|
TestClient giverClient = (TestClient)giverSp.ControllingClient;
|
||||||
|
|
||||||
|
ScenePresence receiverSp = SceneHelpers.AddScenePresence(m_scene, ua2);
|
||||||
|
TestClient receiverClient = (TestClient)receiverSp.ControllingClient;
|
||||||
|
|
||||||
|
// Create the object to test give
|
||||||
|
InventoryItemBase originalItem
|
||||||
|
= UserInventoryHelpers.CreateInventoryItem(
|
||||||
|
m_scene, "givenObj", itemId, assetId, giverSp.UUID, InventoryType.Object);
|
||||||
|
|
||||||
|
GridInstantMessage receivedIm = null;
|
||||||
|
receiverClient.OnReceivedInstantMessage += im => receivedIm = im;
|
||||||
|
|
||||||
|
byte[] giveImBinaryBucket = new byte[17];
|
||||||
|
byte[] itemIdBytes = itemId.GetBytes();
|
||||||
|
Array.Copy(itemIdBytes, 0, giveImBinaryBucket, 1, itemIdBytes.Length);
|
||||||
|
|
||||||
|
GridInstantMessage giveIm
|
||||||
|
= new GridInstantMessage(
|
||||||
|
m_scene,
|
||||||
|
giverSp.UUID,
|
||||||
|
giverSp.Name,
|
||||||
|
receiverSp.UUID,
|
||||||
|
(byte)InstantMessageDialog.InventoryOffered,
|
||||||
|
false,
|
||||||
|
"inventory offered msg",
|
||||||
|
initialSessionId,
|
||||||
|
false,
|
||||||
|
Vector3.Zero,
|
||||||
|
giveImBinaryBucket,
|
||||||
|
true);
|
||||||
|
|
||||||
|
giverClient.HandleImprovedInstantMessage(giveIm);
|
||||||
|
|
||||||
|
// These details might not all be correct.
|
||||||
|
// Session ID is now the created item ID (!)
|
||||||
|
GridInstantMessage rejectIm
|
||||||
|
= new GridInstantMessage(
|
||||||
|
m_scene,
|
||||||
|
receiverSp.UUID,
|
||||||
|
receiverSp.Name,
|
||||||
|
giverSp.UUID,
|
||||||
|
(byte)InstantMessageDialog.InventoryDeclined,
|
||||||
|
false,
|
||||||
|
"inventory declined msg",
|
||||||
|
new UUID(receivedIm.imSessionID),
|
||||||
|
false,
|
||||||
|
Vector3.Zero,
|
||||||
|
null,
|
||||||
|
true);
|
||||||
|
|
||||||
|
receiverClient.HandleImprovedInstantMessage(rejectIm);
|
||||||
|
|
||||||
|
// Test for item remaining in the giver's inventory (here we assume a copy item)
|
||||||
|
// TODO: Test no-copy items.
|
||||||
|
InventoryItemBase originalItemAfterGive
|
||||||
|
= UserInventoryHelpers.GetInventoryItem(m_scene.InventoryService, giverSp.UUID, "Objects/givenObj");
|
||||||
|
|
||||||
|
Assert.That(originalItemAfterGive, Is.Not.Null);
|
||||||
|
Assert.That(originalItemAfterGive.ID, Is.EqualTo(originalItem.ID));
|
||||||
|
|
||||||
|
// Test for item successfully making it into the receiver's inventory
|
||||||
|
InventoryItemBase receivedItem
|
||||||
|
= UserInventoryHelpers.GetInventoryItem(m_scene.InventoryService, receiverSp.UUID, "Trash/givenObj");
|
||||||
|
|
||||||
|
InventoryFolderBase trashFolder
|
||||||
|
= m_scene.InventoryService.GetFolderForType(receiverSp.UUID, AssetType.TrashFolder);
|
||||||
|
|
||||||
|
Assert.That(receivedItem, Is.Not.Null);
|
||||||
|
Assert.That(receivedItem.ID, Is.Not.EqualTo(originalItem.ID));
|
||||||
|
Assert.That(receivedItem.Folder, Is.EqualTo(trashFolder.ID));
|
||||||
|
|
||||||
|
// Test that on a delete, item still exists and is accessible for the giver.
|
||||||
|
m_scene.InventoryService.PurgeFolder(trashFolder);
|
||||||
|
|
||||||
|
InventoryItemBase originalItemAfterDelete
|
||||||
|
= UserInventoryHelpers.GetInventoryItem(m_scene.InventoryService, giverSp.UUID, "Objects/givenObj");
|
||||||
|
|
||||||
|
Assert.That(originalItemAfterDelete, Is.Not.Null);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestAcceptGivenFolder()
|
||||||
|
{
|
||||||
|
TestHelpers.InMethod();
|
||||||
|
// TestHelpers.EnableLogging();
|
||||||
|
|
||||||
|
UUID initialSessionId = TestHelpers.ParseTail(0x10);
|
||||||
|
UUID folderId = TestHelpers.ParseTail(0x100);
|
||||||
|
|
||||||
|
UserAccount ua1
|
||||||
|
= UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "One", TestHelpers.ParseTail(0x1), "pw");
|
||||||
|
UserAccount ua2
|
||||||
|
= UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "Two", TestHelpers.ParseTail(0x2), "pw");
|
||||||
|
|
||||||
|
ScenePresence giverSp = SceneHelpers.AddScenePresence(m_scene, ua1);
|
||||||
|
TestClient giverClient = (TestClient)giverSp.ControllingClient;
|
||||||
|
|
||||||
|
ScenePresence receiverSp = SceneHelpers.AddScenePresence(m_scene, ua2);
|
||||||
|
TestClient receiverClient = (TestClient)receiverSp.ControllingClient;
|
||||||
|
|
||||||
|
InventoryFolderBase originalFolder
|
||||||
|
= UserInventoryHelpers.CreateInventoryFolder(
|
||||||
|
m_scene.InventoryService, giverSp.UUID, folderId, "f1", true);
|
||||||
|
|
||||||
|
byte[] giveImBinaryBucket = new byte[17];
|
||||||
|
giveImBinaryBucket[0] = (byte)AssetType.Folder;
|
||||||
|
byte[] itemIdBytes = folderId.GetBytes();
|
||||||
|
Array.Copy(itemIdBytes, 0, giveImBinaryBucket, 1, itemIdBytes.Length);
|
||||||
|
|
||||||
|
GridInstantMessage giveIm
|
||||||
|
= new GridInstantMessage(
|
||||||
|
m_scene,
|
||||||
|
giverSp.UUID,
|
||||||
|
giverSp.Name,
|
||||||
|
receiverSp.UUID,
|
||||||
|
(byte)InstantMessageDialog.InventoryOffered,
|
||||||
|
false,
|
||||||
|
"inventory offered msg",
|
||||||
|
initialSessionId,
|
||||||
|
false,
|
||||||
|
Vector3.Zero,
|
||||||
|
giveImBinaryBucket,
|
||||||
|
true);
|
||||||
|
|
||||||
|
giverClient.HandleImprovedInstantMessage(giveIm);
|
||||||
|
|
||||||
|
// These details might not all be correct.
|
||||||
|
GridInstantMessage acceptIm
|
||||||
|
= new GridInstantMessage(
|
||||||
|
m_scene,
|
||||||
|
receiverSp.UUID,
|
||||||
|
receiverSp.Name,
|
||||||
|
giverSp.UUID,
|
||||||
|
(byte)InstantMessageDialog.InventoryAccepted,
|
||||||
|
false,
|
||||||
|
"inventory accepted msg",
|
||||||
|
initialSessionId,
|
||||||
|
false,
|
||||||
|
Vector3.Zero,
|
||||||
|
null,
|
||||||
|
true);
|
||||||
|
|
||||||
|
receiverClient.HandleImprovedInstantMessage(acceptIm);
|
||||||
|
|
||||||
|
// Test for item remaining in the giver's inventory (here we assume a copy item)
|
||||||
|
// TODO: Test no-copy items.
|
||||||
|
InventoryFolderBase originalFolderAfterGive
|
||||||
|
= UserInventoryHelpers.GetInventoryFolder(m_scene.InventoryService, giverSp.UUID, "f1");
|
||||||
|
|
||||||
|
Assert.That(originalFolderAfterGive, Is.Not.Null);
|
||||||
|
Assert.That(originalFolderAfterGive.ID, Is.EqualTo(originalFolder.ID));
|
||||||
|
|
||||||
|
// Test for item successfully making it into the receiver's inventory
|
||||||
|
InventoryFolderBase receivedFolder
|
||||||
|
= UserInventoryHelpers.GetInventoryFolder(m_scene.InventoryService, receiverSp.UUID, "f1");
|
||||||
|
|
||||||
|
Assert.That(receivedFolder, Is.Not.Null);
|
||||||
|
Assert.That(receivedFolder.ID, Is.Not.EqualTo(originalFolder.ID));
|
||||||
|
|
||||||
|
// Test that on a delete, item still exists and is accessible for the giver.
|
||||||
|
m_scene.InventoryService.DeleteFolders(receiverSp.UUID, new List<UUID>() { receivedFolder.ID });
|
||||||
|
|
||||||
|
InventoryFolderBase originalFolderAfterDelete
|
||||||
|
= UserInventoryHelpers.GetInventoryFolder(m_scene.InventoryService, giverSp.UUID, "f1");
|
||||||
|
|
||||||
|
Assert.That(originalFolderAfterDelete, Is.Not.Null);
|
||||||
|
|
||||||
|
// TODO: Test scenario where giver deletes their item first.
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Test user rejection of a given item.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// A rejected item still ends up in the user's trash folder.
|
||||||
|
/// </remarks>
|
||||||
|
[Test]
|
||||||
|
public void TestRejectGivenFolder()
|
||||||
|
{
|
||||||
|
TestHelpers.InMethod();
|
||||||
|
// TestHelpers.EnableLogging();
|
||||||
|
|
||||||
|
UUID initialSessionId = TestHelpers.ParseTail(0x10);
|
||||||
|
UUID folderId = TestHelpers.ParseTail(0x100);
|
||||||
|
|
||||||
|
UserAccount ua1
|
||||||
|
= UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "One", TestHelpers.ParseTail(0x1), "pw");
|
||||||
|
UserAccount ua2
|
||||||
|
= UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "Two", TestHelpers.ParseTail(0x2), "pw");
|
||||||
|
|
||||||
|
ScenePresence giverSp = SceneHelpers.AddScenePresence(m_scene, ua1);
|
||||||
|
TestClient giverClient = (TestClient)giverSp.ControllingClient;
|
||||||
|
|
||||||
|
ScenePresence receiverSp = SceneHelpers.AddScenePresence(m_scene, ua2);
|
||||||
|
TestClient receiverClient = (TestClient)receiverSp.ControllingClient;
|
||||||
|
|
||||||
|
// Create the folder to test give
|
||||||
|
InventoryFolderBase originalFolder
|
||||||
|
= UserInventoryHelpers.CreateInventoryFolder(
|
||||||
|
m_scene.InventoryService, giverSp.UUID, folderId, "f1", true);
|
||||||
|
|
||||||
|
GridInstantMessage receivedIm = null;
|
||||||
|
receiverClient.OnReceivedInstantMessage += im => receivedIm = im;
|
||||||
|
|
||||||
|
byte[] giveImBinaryBucket = new byte[17];
|
||||||
|
giveImBinaryBucket[0] = (byte)AssetType.Folder;
|
||||||
|
byte[] itemIdBytes = folderId.GetBytes();
|
||||||
|
Array.Copy(itemIdBytes, 0, giveImBinaryBucket, 1, itemIdBytes.Length);
|
||||||
|
|
||||||
|
GridInstantMessage giveIm
|
||||||
|
= new GridInstantMessage(
|
||||||
|
m_scene,
|
||||||
|
giverSp.UUID,
|
||||||
|
giverSp.Name,
|
||||||
|
receiverSp.UUID,
|
||||||
|
(byte)InstantMessageDialog.InventoryOffered,
|
||||||
|
false,
|
||||||
|
"inventory offered msg",
|
||||||
|
initialSessionId,
|
||||||
|
false,
|
||||||
|
Vector3.Zero,
|
||||||
|
giveImBinaryBucket,
|
||||||
|
true);
|
||||||
|
|
||||||
|
giverClient.HandleImprovedInstantMessage(giveIm);
|
||||||
|
|
||||||
|
// These details might not all be correct.
|
||||||
|
// Session ID is now the created item ID (!)
|
||||||
|
GridInstantMessage rejectIm
|
||||||
|
= new GridInstantMessage(
|
||||||
|
m_scene,
|
||||||
|
receiverSp.UUID,
|
||||||
|
receiverSp.Name,
|
||||||
|
giverSp.UUID,
|
||||||
|
(byte)InstantMessageDialog.InventoryDeclined,
|
||||||
|
false,
|
||||||
|
"inventory declined msg",
|
||||||
|
new UUID(receivedIm.imSessionID),
|
||||||
|
false,
|
||||||
|
Vector3.Zero,
|
||||||
|
null,
|
||||||
|
true);
|
||||||
|
|
||||||
|
receiverClient.HandleImprovedInstantMessage(rejectIm);
|
||||||
|
|
||||||
|
// Test for item remaining in the giver's inventory (here we assume a copy item)
|
||||||
|
// TODO: Test no-copy items.
|
||||||
|
InventoryFolderBase originalFolderAfterGive
|
||||||
|
= UserInventoryHelpers.GetInventoryFolder(m_scene.InventoryService, giverSp.UUID, "f1");
|
||||||
|
|
||||||
|
Assert.That(originalFolderAfterGive, Is.Not.Null);
|
||||||
|
Assert.That(originalFolderAfterGive.ID, Is.EqualTo(originalFolder.ID));
|
||||||
|
|
||||||
|
// Test for folder successfully making it into the receiver's inventory
|
||||||
|
InventoryFolderBase receivedFolder
|
||||||
|
= UserInventoryHelpers.GetInventoryFolder(m_scene.InventoryService, receiverSp.UUID, "Trash/f1");
|
||||||
|
|
||||||
|
InventoryFolderBase trashFolder
|
||||||
|
= m_scene.InventoryService.GetFolderForType(receiverSp.UUID, AssetType.TrashFolder);
|
||||||
|
|
||||||
|
Assert.That(receivedFolder, Is.Not.Null);
|
||||||
|
Assert.That(receivedFolder.ID, Is.Not.EqualTo(originalFolder.ID));
|
||||||
|
Assert.That(receivedFolder.ParentID, Is.EqualTo(trashFolder.ID));
|
||||||
|
|
||||||
|
// Test that on a delete, item still exists and is accessible for the giver.
|
||||||
|
m_scene.InventoryService.PurgeFolder(trashFolder);
|
||||||
|
|
||||||
|
InventoryFolderBase originalFolderAfterDelete
|
||||||
|
= UserInventoryHelpers.GetInventoryFolder(m_scene.InventoryService, giverSp.UUID, "f1");
|
||||||
|
|
||||||
|
Assert.That(originalFolderAfterDelete, Is.Not.Null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -97,6 +97,9 @@ public abstract class BSPhysObject : PhysicsActor
|
||||||
|
|
||||||
CollisionCollection = new CollisionEventUpdate();
|
CollisionCollection = new CollisionEventUpdate();
|
||||||
CollisionsLastReported = CollisionCollection;
|
CollisionsLastReported = CollisionCollection;
|
||||||
|
CollisionsLastTick = new CollisionEventUpdate();
|
||||||
|
CollisionsLastTickStep = -1;
|
||||||
|
|
||||||
SubscribedEventsMs = 0;
|
SubscribedEventsMs = 0;
|
||||||
CollidingStep = 0;
|
CollidingStep = 0;
|
||||||
CollidingGroundStep = 0;
|
CollidingGroundStep = 0;
|
||||||
|
|
|
@ -171,11 +171,6 @@ namespace OpenSim.Server.Base
|
||||||
|
|
||||||
m_console = MainConsole.Instance;
|
m_console = MainConsole.Instance;
|
||||||
|
|
||||||
// Configure the appenders for log4net
|
|
||||||
//
|
|
||||||
OpenSimAppender consoleAppender = null;
|
|
||||||
FileAppender fileAppender = null;
|
|
||||||
|
|
||||||
if (logConfig != null)
|
if (logConfig != null)
|
||||||
{
|
{
|
||||||
FileInfo cfg = new FileInfo(logConfig);
|
FileInfo cfg = new FileInfo(logConfig);
|
||||||
|
|
|
@ -217,13 +217,38 @@ namespace OpenSim.Tests.Common
|
||||||
/// </returns>
|
/// </returns>
|
||||||
public static InventoryFolderBase CreateInventoryFolder(
|
public static InventoryFolderBase CreateInventoryFolder(
|
||||||
IInventoryService inventoryService, UUID userId, string path, bool useExistingFolders)
|
IInventoryService inventoryService, UUID userId, string path, bool useExistingFolders)
|
||||||
|
{
|
||||||
|
return CreateInventoryFolder(inventoryService, userId, UUID.Random(), path, useExistingFolders);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create inventory folders starting from the user's root folder.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="inventoryService"></param>
|
||||||
|
/// <param name="userId"></param>
|
||||||
|
/// <param name="folderId"></param>
|
||||||
|
/// <param name="path">
|
||||||
|
/// The folders to create. Multiple folders can be specified on a path delimited by the PATH_DELIMITER
|
||||||
|
/// </param>
|
||||||
|
/// <param name="useExistingFolders">
|
||||||
|
/// If true, then folders in the path which already the same name are
|
||||||
|
/// used. This applies to the terminal folder as well.
|
||||||
|
/// If false, then all folders in the path are created, even if there is already a folder at a particular
|
||||||
|
/// level with the same name.
|
||||||
|
/// </param>
|
||||||
|
/// <returns>
|
||||||
|
/// The folder created. If the path contains multiple folders then the last one created is returned.
|
||||||
|
/// Will return null if the root folder could not be found.
|
||||||
|
/// </returns>
|
||||||
|
public static InventoryFolderBase CreateInventoryFolder(
|
||||||
|
IInventoryService inventoryService, UUID userId, UUID folderId, string path, bool useExistingFolders)
|
||||||
{
|
{
|
||||||
InventoryFolderBase rootFolder = inventoryService.GetRootFolder(userId);
|
InventoryFolderBase rootFolder = inventoryService.GetRootFolder(userId);
|
||||||
|
|
||||||
if (null == rootFolder)
|
if (null == rootFolder)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
return CreateInventoryFolder(inventoryService, rootFolder, path, useExistingFolders);
|
return CreateInventoryFolder(inventoryService, folderId, rootFolder, path, useExistingFolders);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -235,6 +260,7 @@ namespace OpenSim.Tests.Common
|
||||||
/// TODO: May need to make it an option to create duplicate folders.
|
/// TODO: May need to make it an option to create duplicate folders.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
/// <param name="inventoryService"></param>
|
/// <param name="inventoryService"></param>
|
||||||
|
/// <param name="folderId">ID of the folder to create</param>
|
||||||
/// <param name="parentFolder"></param>
|
/// <param name="parentFolder"></param>
|
||||||
/// <param name="path">
|
/// <param name="path">
|
||||||
/// The folder to create.
|
/// The folder to create.
|
||||||
|
@ -249,7 +275,7 @@ namespace OpenSim.Tests.Common
|
||||||
/// The folder created. If the path contains multiple folders then the last one created is returned.
|
/// The folder created. If the path contains multiple folders then the last one created is returned.
|
||||||
/// </returns>
|
/// </returns>
|
||||||
public static InventoryFolderBase CreateInventoryFolder(
|
public static InventoryFolderBase CreateInventoryFolder(
|
||||||
IInventoryService inventoryService, InventoryFolderBase parentFolder, string path, bool useExistingFolders)
|
IInventoryService inventoryService, UUID folderId, InventoryFolderBase parentFolder, string path, bool useExistingFolders)
|
||||||
{
|
{
|
||||||
string[] components = path.Split(new string[] { PATH_DELIMITER }, 2, StringSplitOptions.None);
|
string[] components = path.Split(new string[] { PATH_DELIMITER }, 2, StringSplitOptions.None);
|
||||||
|
|
||||||
|
@ -262,9 +288,16 @@ namespace OpenSim.Tests.Common
|
||||||
{
|
{
|
||||||
// Console.WriteLine("Creating folder {0} at {1}", components[0], parentFolder.Name);
|
// Console.WriteLine("Creating folder {0} at {1}", components[0], parentFolder.Name);
|
||||||
|
|
||||||
|
UUID folderIdForCreate;
|
||||||
|
|
||||||
|
if (components.Length > 1)
|
||||||
|
folderIdForCreate = UUID.Random();
|
||||||
|
else
|
||||||
|
folderIdForCreate = folderId;
|
||||||
|
|
||||||
folder
|
folder
|
||||||
= new InventoryFolderBase(
|
= new InventoryFolderBase(
|
||||||
UUID.Random(), components[0], parentFolder.Owner, (short)AssetType.Unknown, parentFolder.ID, 0);
|
folderIdForCreate, components[0], parentFolder.Owner, (short)AssetType.Unknown, parentFolder.ID, 0);
|
||||||
|
|
||||||
inventoryService.AddFolder(folder);
|
inventoryService.AddFolder(folder);
|
||||||
}
|
}
|
||||||
|
@ -274,7 +307,7 @@ namespace OpenSim.Tests.Common
|
||||||
// }
|
// }
|
||||||
|
|
||||||
if (components.Length > 1)
|
if (components.Length > 1)
|
||||||
return CreateInventoryFolder(inventoryService, folder, components[1], useExistingFolders);
|
return CreateInventoryFolder(inventoryService, folderId, folder, components[1], useExistingFolders);
|
||||||
else
|
else
|
||||||
return folder;
|
return folder;
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,6 +61,7 @@ namespace OpenSim.Tests.Common.Mock
|
||||||
// Test client specific events - for use by tests to implement some IClientAPI behaviour.
|
// Test client specific events - for use by tests to implement some IClientAPI behaviour.
|
||||||
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 Action<GridInstantMessage> OnReceivedInstantMessage;
|
||||||
|
|
||||||
// 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
|
||||||
|
@ -487,6 +488,18 @@ namespace OpenSim.Tests.Common.Mock
|
||||||
OnCompleteMovementToRegion(this, true);
|
OnCompleteMovementToRegion(this, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Emulate sending an IM from the viewer to the simulator.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name='im'></param>
|
||||||
|
public void HandleImprovedInstantMessage(GridInstantMessage im)
|
||||||
|
{
|
||||||
|
ImprovedInstantMessage handlerInstantMessage = OnInstantMessage;
|
||||||
|
|
||||||
|
if (handlerInstantMessage != null)
|
||||||
|
handlerInstantMessage(this, im);
|
||||||
|
}
|
||||||
|
|
||||||
public virtual void ActivateGesture(UUID assetId, UUID gestureId)
|
public virtual void ActivateGesture(UUID assetId, UUID gestureId)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -547,7 +560,8 @@ namespace OpenSim.Tests.Common.Mock
|
||||||
|
|
||||||
public void SendInstantMessage(GridInstantMessage im)
|
public void SendInstantMessage(GridInstantMessage im)
|
||||||
{
|
{
|
||||||
|
if (OnReceivedInstantMessage != null)
|
||||||
|
OnReceivedInstantMessage(im);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendGenericMessage(string method, UUID invoice, List<string> message)
|
public void SendGenericMessage(string method, UUID invoice, List<string> message)
|
||||||
|
|
|
@ -53,6 +53,9 @@ namespace OpenSim.Tests.Common.Mock
|
||||||
|
|
||||||
public XInventoryFolder[] GetFolders(string[] fields, string[] vals)
|
public XInventoryFolder[] GetFolders(string[] fields, string[] vals)
|
||||||
{
|
{
|
||||||
|
// Console.WriteLine(
|
||||||
|
// "Requesting folders, fields {0}, vals {1}", string.Join(",", fields), string.Join(",", vals));
|
||||||
|
|
||||||
List<XInventoryFolder> origFolders
|
List<XInventoryFolder> origFolders
|
||||||
= Get<XInventoryFolder>(fields, vals, m_allFolders.Values.ToList());
|
= Get<XInventoryFolder>(fields, vals, m_allFolders.Values.ToList());
|
||||||
|
|
||||||
|
@ -104,7 +107,30 @@ namespace OpenSim.Tests.Common.Mock
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool MoveItem(string id, string newParent) { throw new NotImplementedException(); }
|
public bool MoveItem(string id, string newParent) { throw new NotImplementedException(); }
|
||||||
public bool MoveFolder(string id, string newParent) { throw new NotImplementedException(); }
|
|
||||||
|
public bool MoveFolder(string id, string newParent)
|
||||||
|
{
|
||||||
|
// Don't use GetFolders() here - it takes a clone!
|
||||||
|
XInventoryFolder folder = m_allFolders[new UUID(id)];
|
||||||
|
|
||||||
|
if (folder == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
folder.parentFolderID = new UUID(newParent);
|
||||||
|
|
||||||
|
XInventoryFolder[] newParentFolders
|
||||||
|
= GetFolders(new string[] { "folderID" }, new string[] { folder.parentFolderID.ToString() });
|
||||||
|
|
||||||
|
// Console.WriteLine(
|
||||||
|
// "Moved folder {0} {1}, to {2} {3}",
|
||||||
|
// folder.folderName, folder.folderID, newParentFolders[0].folderName, folder.parentFolderID);
|
||||||
|
|
||||||
|
// TODO: Really need to implement folder version incrementing, though this should be common code anyway,
|
||||||
|
// not reimplemented in each db plugin.
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public XInventoryItem[] GetActiveGestures(UUID principalID) { throw new NotImplementedException(); }
|
public XInventoryItem[] GetActiveGestures(UUID principalID) { throw new NotImplementedException(); }
|
||||||
public int GetAssetPermissions(UUID principalID, UUID assetID) { throw new NotImplementedException(); }
|
public int GetAssetPermissions(UUID principalID, UUID assetID) { throw new NotImplementedException(); }
|
||||||
}
|
}
|
||||||
|
|
|
@ -3180,6 +3180,7 @@
|
||||||
<Match path="Avatar/AvatarFactory/Tests" pattern="*.cs" recurse="true"/>
|
<Match path="Avatar/AvatarFactory/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="Framework/InventoryAccess/Tests" pattern="*.cs" recurse="true"/>
|
<Match path="Framework/InventoryAccess/Tests" pattern="*.cs" recurse="true"/>
|
||||||
<Match path="Scripting/VectorRender/Tests" pattern="*.cs" recurse="true"/>
|
<Match path="Scripting/VectorRender/Tests" pattern="*.cs" recurse="true"/>
|
||||||
<Match path="World/Archiver/Tests" pattern="*.cs" recurse="true"/>
|
<Match path="World/Archiver/Tests" pattern="*.cs" recurse="true"/>
|
||||||
|
|
Loading…
Reference in New Issue