diff options
Diffstat (limited to 'OpenSim/Region/CoreModules/Avatar/Inventory/Transfer')
-rw-r--r-- | OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs | 166 | ||||
-rw-r--r-- | OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/Tests/InventoryTransferModuleTests.cs | 448 |
2 files changed, 513 insertions, 101 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs index bcb7f42..bba48cc 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs | |||
@@ -47,10 +47,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
47 | 47 | ||
48 | /// <summary> | 48 | /// <summary> |
49 | private List<Scene> m_Scenelist = new List<Scene>(); | 49 | private List<Scene> m_Scenelist = new List<Scene>(); |
50 | // private Dictionary<UUID, Scene> m_AgentRegions = | ||
51 | // new Dictionary<UUID, Scene>(); | ||
52 | 50 | ||
53 | private IMessageTransferModule m_TransferModule = null; | 51 | private IMessageTransferModule m_TransferModule; |
54 | private bool m_Enabled = true; | 52 | private bool m_Enabled = true; |
55 | 53 | ||
56 | #region Region Module interface | 54 | #region Region Module interface |
@@ -81,9 +79,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
81 | // scene.RegisterModuleInterface<IInventoryTransferModule>(this); | 79 | // scene.RegisterModuleInterface<IInventoryTransferModule>(this); |
82 | 80 | ||
83 | scene.EventManager.OnNewClient += OnNewClient; | 81 | scene.EventManager.OnNewClient += OnNewClient; |
84 | // scene.EventManager.OnClientClosed += ClientLoggedOut; | ||
85 | scene.EventManager.OnIncomingInstantMessage += OnGridInstantMessage; | 82 | scene.EventManager.OnIncomingInstantMessage += OnGridInstantMessage; |
86 | // scene.EventManager.OnSetRootAgentScene += OnSetRootAgentScene; | ||
87 | } | 83 | } |
88 | 84 | ||
89 | public void RegionLoaded(Scene scene) | 85 | public void RegionLoaded(Scene scene) |
@@ -96,11 +92,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
96 | m_log.Error("[INVENTORY TRANSFER]: No Message transfer module found, transfers will be local only"); | 92 | m_log.Error("[INVENTORY TRANSFER]: No Message transfer module found, transfers will be local only"); |
97 | m_Enabled = false; | 93 | m_Enabled = false; |
98 | 94 | ||
99 | m_Scenelist.Clear(); | 95 | // m_Scenelist.Clear(); |
100 | scene.EventManager.OnNewClient -= OnNewClient; | 96 | // scene.EventManager.OnNewClient -= OnNewClient; |
101 | // scene.EventManager.OnClientClosed -= ClientLoggedOut; | ||
102 | scene.EventManager.OnIncomingInstantMessage -= OnGridInstantMessage; | 97 | scene.EventManager.OnIncomingInstantMessage -= OnGridInstantMessage; |
103 | // scene.EventManager.OnSetRootAgentScene -= OnSetRootAgentScene; | ||
104 | } | 98 | } |
105 | } | 99 | } |
106 | } | 100 | } |
@@ -108,9 +102,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
108 | public void RemoveRegion(Scene scene) | 102 | public void RemoveRegion(Scene scene) |
109 | { | 103 | { |
110 | scene.EventManager.OnNewClient -= OnNewClient; | 104 | scene.EventManager.OnNewClient -= OnNewClient; |
111 | // scene.EventManager.OnClientClosed -= ClientLoggedOut; | ||
112 | scene.EventManager.OnIncomingInstantMessage -= OnGridInstantMessage; | 105 | scene.EventManager.OnIncomingInstantMessage -= OnGridInstantMessage; |
113 | // scene.EventManager.OnSetRootAgentScene -= OnSetRootAgentScene; | ||
114 | m_Scenelist.Remove(scene); | 106 | m_Scenelist.Remove(scene); |
115 | } | 107 | } |
116 | 108 | ||
@@ -139,11 +131,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
139 | // Inventory giving is conducted via instant message | 131 | // Inventory giving is conducted via instant message |
140 | client.OnInstantMessage += OnInstantMessage; | 132 | client.OnInstantMessage += OnInstantMessage; |
141 | } | 133 | } |
142 | |||
143 | // protected void OnSetRootAgentScene(UUID id, Scene scene) | ||
144 | // { | ||
145 | // m_AgentRegions[id] = scene; | ||
146 | // } | ||
147 | 134 | ||
148 | private Scene FindClientScene(UUID agentId) | 135 | private Scene FindClientScene(UUID agentId) |
149 | { | 136 | { |
@@ -162,8 +149,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
162 | private void OnInstantMessage(IClientAPI client, GridInstantMessage im) | 149 | private void OnInstantMessage(IClientAPI client, GridInstantMessage im) |
163 | { | 150 | { |
164 | // m_log.DebugFormat( | 151 | // m_log.DebugFormat( |
165 | // "[INVENTORY TRANSFER]: {0} IM type received from {1}", | 152 | // "[INVENTORY TRANSFER]: {0} IM type received from client {1}. From={2} ({3}), To={4}", |
166 | // (InstantMessageDialog)im.dialog, client.Name); | 153 | // (InstantMessageDialog)im.dialog, client.Name, |
154 | // im.fromAgentID, im.fromAgentName, im.toAgentID); | ||
167 | 155 | ||
168 | Scene scene = FindClientScene(client.AgentId); | 156 | Scene scene = FindClientScene(client.AgentId); |
169 | 157 | ||
@@ -188,12 +176,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
188 | { | 176 | { |
189 | UUID folderID = new UUID(im.binaryBucket, 1); | 177 | UUID folderID = new UUID(im.binaryBucket, 1); |
190 | 178 | ||
191 | m_log.DebugFormat("[INVENTORY TRANSFER]: Inserting original folder {0} "+ | 179 | m_log.DebugFormat( |
192 | "into agent {1}'s inventory", | 180 | "[INVENTORY TRANSFER]: Inserting original folder {0} into agent {1}'s inventory", |
193 | folderID, new UUID(im.toAgentID)); | 181 | folderID, new UUID(im.toAgentID)); |
194 | 182 | ||
195 | InventoryFolderBase folderCopy | 183 | InventoryFolderBase folderCopy |
196 | = scene.GiveInventoryFolder(receipientID, client.AgentId, folderID, UUID.Zero); | 184 | = scene.GiveInventoryFolder(client, receipientID, client.AgentId, folderID, UUID.Zero); |
197 | 185 | ||
198 | if (folderCopy == null) | 186 | if (folderCopy == null) |
199 | { | 187 | { |
@@ -213,7 +201,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
213 | user.ControllingClient.SendBulkUpdateInventory(folderCopy); | 201 | user.ControllingClient.SendBulkUpdateInventory(folderCopy); |
214 | 202 | ||
215 | // HACK!! | 203 | // HACK!! |
216 | im.imSessionID = folderID.Guid; | 204 | // Insert the ID of the copied folder into the IM so that we know which item to move to trash if it |
205 | // is rejected. | ||
206 | // XXX: This is probably a misuse of the session ID slot. | ||
207 | im.imSessionID = copyID.Guid; | ||
217 | } | 208 | } |
218 | else | 209 | else |
219 | { | 210 | { |
@@ -226,13 +217,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
226 | "into agent {1}'s inventory", | 217 | "into agent {1}'s inventory", |
227 | itemID, new UUID(im.toAgentID)); | 218 | itemID, new UUID(im.toAgentID)); |
228 | 219 | ||
229 | InventoryItemBase itemCopy = scene.GiveInventoryItem( | 220 | string message; |
230 | new UUID(im.toAgentID), | 221 | InventoryItemBase itemCopy = scene.GiveInventoryItem(new UUID(im.toAgentID), client.AgentId, itemID, out message); |
231 | client.AgentId, itemID); | ||
232 | 222 | ||
233 | if (itemCopy == null) | 223 | if (itemCopy == null) |
234 | { | 224 | { |
235 | client.SendAgentAlertMessage("Can't find item to give. Nothing given.", false); | 225 | client.SendAgentAlertMessage(message, false); |
236 | return; | 226 | return; |
237 | } | 227 | } |
238 | 228 | ||
@@ -243,7 +233,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
243 | user.ControllingClient.SendBulkUpdateInventory(itemCopy); | 233 | user.ControllingClient.SendBulkUpdateInventory(itemCopy); |
244 | 234 | ||
245 | // HACK!! | 235 | // HACK!! |
246 | im.imSessionID = itemID.Guid; | 236 | // Insert the ID of the copied item into the IM so that we know which item to move to trash if it |
237 | // is rejected. | ||
238 | // XXX: This is probably a misuse of the session ID slot. | ||
239 | im.imSessionID = copyID.Guid; | ||
247 | } | 240 | } |
248 | 241 | ||
249 | // Send the IM to the recipient. The item is already | 242 | // Send the IM to the recipient. The item is already |
@@ -379,7 +372,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
379 | IInventoryService invService = scene.InventoryService; | 372 | IInventoryService invService = scene.InventoryService; |
380 | 373 | ||
381 | InventoryFolderBase trashFolder = | 374 | InventoryFolderBase trashFolder = |
382 | invService.GetFolderForType(client.AgentId, AssetType.TrashFolder); | 375 | invService.GetFolderForType(client.AgentId, FolderType.Trash); |
383 | 376 | ||
384 | UUID inventoryID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip | 377 | UUID inventoryID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip |
385 | 378 | ||
@@ -403,7 +396,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
403 | { | 396 | { |
404 | folder = new InventoryFolderBase(inventoryID, client.AgentId); | 397 | folder = new InventoryFolderBase(inventoryID, client.AgentId); |
405 | folder = invService.GetFolder(folder); | 398 | folder = invService.GetFolder(folder); |
406 | 399 | ||
407 | if (folder != null & trashFolder != null) | 400 | if (folder != null & trashFolder != null) |
408 | { | 401 | { |
409 | previousParentFolderID = folder.ParentID; | 402 | previousParentFolderID = folder.ParentID; |
@@ -454,90 +447,61 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
454 | } | 447 | } |
455 | } | 448 | } |
456 | 449 | ||
457 | // public bool NeedSceneCacheClear(UUID agentID, Scene scene) | ||
458 | // { | ||
459 | // if (!m_AgentRegions.ContainsKey(agentID)) | ||
460 | // { | ||
461 | // // Since we can get here two ways, we need to scan | ||
462 | // // the scenes here. This is somewhat more expensive | ||
463 | // // but helps avoid a nasty bug | ||
464 | // // | ||
465 | // | ||
466 | // foreach (Scene s in m_Scenelist) | ||
467 | // { | ||
468 | // ScenePresence presence; | ||
469 | // | ||
470 | // if (s.TryGetScenePresence(agentID, out presence)) | ||
471 | // { | ||
472 | // // If the agent is in this scene, then we | ||
473 | // // are being called twice in a single | ||
474 | // // teleport. This is wasteful of cycles | ||
475 | // // but harmless due to this 2nd level check | ||
476 | // // | ||
477 | // // If the agent is found in another scene | ||
478 | // // then the list wasn't current | ||
479 | // // | ||
480 | // // If the agent is totally unknown, then what | ||
481 | // // are we even doing here?? | ||
482 | // // | ||
483 | // if (s == scene) | ||
484 | // { | ||
485 | // //m_log.Debug("[INVTRANSFERMOD]: s == scene. Returning true in " + scene.RegionInfo.RegionName); | ||
486 | // return true; | ||
487 | // } | ||
488 | // else | ||
489 | // { | ||
490 | // //m_log.Debug("[INVTRANSFERMOD]: s != scene. Returning false in " + scene.RegionInfo.RegionName); | ||
491 | // return false; | ||
492 | // } | ||
493 | // } | ||
494 | // } | ||
495 | // //m_log.Debug("[INVTRANSFERMOD]: agent not in scene. Returning true in " + scene.RegionInfo.RegionName); | ||
496 | // return true; | ||
497 | // } | ||
498 | // | ||
499 | // // The agent is left in current Scene, so we must be | ||
500 | // // going to another instance | ||
501 | // // | ||
502 | // if (m_AgentRegions[agentID] == scene) | ||
503 | // { | ||
504 | // //m_log.Debug("[INVTRANSFERMOD]: m_AgentRegions[agentID] == scene. Returning true in " + scene.RegionInfo.RegionName); | ||
505 | // m_AgentRegions.Remove(agentID); | ||
506 | // return true; | ||
507 | // } | ||
508 | // | ||
509 | // // Another region has claimed the agent | ||
510 | // // | ||
511 | // //m_log.Debug("[INVTRANSFERMOD]: last resort. Returning false in " + scene.RegionInfo.RegionName); | ||
512 | // return false; | ||
513 | // } | ||
514 | // | ||
515 | // public void ClientLoggedOut(UUID agentID, Scene scene) | ||
516 | // { | ||
517 | // if (m_AgentRegions.ContainsKey(agentID)) | ||
518 | // m_AgentRegions.Remove(agentID); | ||
519 | // } | ||
520 | |||
521 | /// <summary> | 450 | /// <summary> |
522 | /// | 451 | /// |
523 | /// </summary> | 452 | /// </summary> |
524 | /// <param name="msg"></param> | 453 | /// <param name="im"></param> |
525 | private void OnGridInstantMessage(GridInstantMessage msg) | 454 | private void OnGridInstantMessage(GridInstantMessage im) |
526 | { | 455 | { |
456 | // Check if it's a type of message that we should handle | ||
457 | if (!((im.dialog == (byte) InstantMessageDialog.InventoryOffered) | ||
458 | || (im.dialog == (byte) InstantMessageDialog.TaskInventoryOffered) | ||
459 | || (im.dialog == (byte) InstantMessageDialog.InventoryAccepted) | ||
460 | || (im.dialog == (byte) InstantMessageDialog.InventoryDeclined) | ||
461 | || (im.dialog == (byte) InstantMessageDialog.TaskInventoryDeclined))) | ||
462 | return; | ||
463 | |||
464 | m_log.DebugFormat( | ||
465 | "[INVENTORY TRANSFER]: {0} IM type received from grid. From={1} ({2}), To={3}", | ||
466 | (InstantMessageDialog)im.dialog, im.fromAgentID, im.fromAgentName, im.toAgentID); | ||
467 | |||
527 | // Check if this is ours to handle | 468 | // Check if this is ours to handle |
528 | // | 469 | // |
529 | Scene scene = FindClientScene(new UUID(msg.toAgentID)); | 470 | Scene scene = FindClientScene(new UUID(im.toAgentID)); |
530 | 471 | ||
531 | if (scene == null) | 472 | if (scene == null) |
532 | return; | 473 | return; |
533 | 474 | ||
534 | // Find agent to deliver to | 475 | // Find agent to deliver to |
535 | // | 476 | // |
536 | ScenePresence user = scene.GetScenePresence(new UUID(msg.toAgentID)); | 477 | ScenePresence user = scene.GetScenePresence(new UUID(im.toAgentID)); |
537 | 478 | ||
538 | // Just forward to local handling | 479 | if (user != null) |
539 | OnInstantMessage(user.ControllingClient, msg); | 480 | { |
481 | user.ControllingClient.SendInstantMessage(im); | ||
482 | |||
483 | if (im.dialog == (byte)InstantMessageDialog.InventoryOffered) | ||
484 | { | ||
485 | AssetType assetType = (AssetType)im.binaryBucket[0]; | ||
486 | UUID inventoryID = new UUID(im.binaryBucket, 1); | ||
487 | |||
488 | IInventoryService invService = scene.InventoryService; | ||
489 | InventoryNodeBase node = null; | ||
490 | if (AssetType.Folder == assetType) | ||
491 | { | ||
492 | InventoryFolderBase folder = new InventoryFolderBase(inventoryID, new UUID(im.toAgentID)); | ||
493 | node = invService.GetFolder(folder); | ||
494 | } | ||
495 | else | ||
496 | { | ||
497 | InventoryItemBase item = new InventoryItemBase(inventoryID, new UUID(im.toAgentID)); | ||
498 | node = invService.GetItem(item); | ||
499 | } | ||
540 | 500 | ||
501 | if (node != null) | ||
502 | user.ControllingClient.SendBulkUpdateInventory(node); | ||
503 | } | ||
504 | } | ||
541 | } | 505 | } |
542 | } | 506 | } |
543 | } | 507 | } |
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/Tests/InventoryTransferModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/Tests/InventoryTransferModuleTests.cs new file mode 100644 index 0000000..7ddc396 --- /dev/null +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/Tests/InventoryTransferModuleTests.cs | |||
@@ -0,0 +1,448 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Reflection; | ||
31 | using log4net.Config; | ||
32 | using Nini.Config; | ||
33 | using NUnit.Framework; | ||
34 | using OpenMetaverse; | ||
35 | using OpenMetaverse.Assets; | ||
36 | using OpenSim.Framework; | ||
37 | using OpenSim.Region.CoreModules.Avatar.Inventory.Transfer; | ||
38 | using OpenSim.Region.Framework.Interfaces; | ||
39 | using OpenSim.Region.Framework.Scenes; | ||
40 | using OpenSim.Services.Interfaces; | ||
41 | using OpenSim.Tests.Common; | ||
42 | |||
43 | namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer.Tests | ||
44 | { | ||
45 | [TestFixture] | ||
46 | public class InventoryTransferModuleTests : OpenSimTestCase | ||
47 | { | ||
48 | protected TestScene m_scene; | ||
49 | |||
50 | [SetUp] | ||
51 | public override void SetUp() | ||
52 | { | ||
53 | base.SetUp(); | ||
54 | |||
55 | IConfigSource config = new IniConfigSource(); | ||
56 | config.AddConfig("Messaging"); | ||
57 | config.Configs["Messaging"].Set("InventoryTransferModule", "InventoryTransferModule"); | ||
58 | |||
59 | m_scene = new SceneHelpers().SetupScene(); | ||
60 | SceneHelpers.SetupSceneModules(m_scene, config, new InventoryTransferModule()); | ||
61 | } | ||
62 | |||
63 | [Test] | ||
64 | public void TestAcceptGivenItem() | ||
65 | { | ||
66 | // TestHelpers.EnableLogging(); | ||
67 | |||
68 | UUID initialSessionId = TestHelpers.ParseTail(0x10); | ||
69 | UUID itemId = TestHelpers.ParseTail(0x100); | ||
70 | UUID assetId = TestHelpers.ParseTail(0x200); | ||
71 | |||
72 | UserAccount ua1 | ||
73 | = UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "One", TestHelpers.ParseTail(0x1), "pw"); | ||
74 | UserAccount ua2 | ||
75 | = UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "Two", TestHelpers.ParseTail(0x2), "pw"); | ||
76 | |||
77 | ScenePresence giverSp = SceneHelpers.AddScenePresence(m_scene, ua1); | ||
78 | TestClient giverClient = (TestClient)giverSp.ControllingClient; | ||
79 | |||
80 | ScenePresence receiverSp = SceneHelpers.AddScenePresence(m_scene, ua2); | ||
81 | TestClient receiverClient = (TestClient)receiverSp.ControllingClient; | ||
82 | |||
83 | // Create the object to test give | ||
84 | InventoryItemBase originalItem | ||
85 | = UserInventoryHelpers.CreateInventoryItem( | ||
86 | m_scene, "givenObj", itemId, assetId, giverSp.UUID, InventoryType.Object); | ||
87 | |||
88 | byte[] giveImBinaryBucket = new byte[17]; | ||
89 | byte[] itemIdBytes = itemId.GetBytes(); | ||
90 | Array.Copy(itemIdBytes, 0, giveImBinaryBucket, 1, itemIdBytes.Length); | ||
91 | |||
92 | GridInstantMessage giveIm | ||
93 | = new GridInstantMessage( | ||
94 | m_scene, | ||
95 | giverSp.UUID, | ||
96 | giverSp.Name, | ||
97 | receiverSp.UUID, | ||
98 | (byte)InstantMessageDialog.InventoryOffered, | ||
99 | false, | ||
100 | "inventory offered msg", | ||
101 | initialSessionId, | ||
102 | false, | ||
103 | Vector3.Zero, | ||
104 | giveImBinaryBucket, | ||
105 | true); | ||
106 | |||
107 | giverClient.HandleImprovedInstantMessage(giveIm); | ||
108 | |||
109 | // These details might not all be correct. | ||
110 | GridInstantMessage acceptIm | ||
111 | = new GridInstantMessage( | ||
112 | m_scene, | ||
113 | receiverSp.UUID, | ||
114 | receiverSp.Name, | ||
115 | giverSp.UUID, | ||
116 | (byte)InstantMessageDialog.InventoryAccepted, | ||
117 | false, | ||
118 | "inventory accepted msg", | ||
119 | initialSessionId, | ||
120 | false, | ||
121 | Vector3.Zero, | ||
122 | null, | ||
123 | true); | ||
124 | |||
125 | receiverClient.HandleImprovedInstantMessage(acceptIm); | ||
126 | |||
127 | // Test for item remaining in the giver's inventory (here we assume a copy item) | ||
128 | // TODO: Test no-copy items. | ||
129 | InventoryItemBase originalItemAfterGive | ||
130 | = UserInventoryHelpers.GetInventoryItem(m_scene.InventoryService, giverSp.UUID, "Objects/givenObj"); | ||
131 | |||
132 | Assert.That(originalItemAfterGive, Is.Not.Null); | ||
133 | Assert.That(originalItemAfterGive.ID, Is.EqualTo(originalItem.ID)); | ||
134 | |||
135 | // Test for item successfully making it into the receiver's inventory | ||
136 | InventoryItemBase receivedItem | ||
137 | = UserInventoryHelpers.GetInventoryItem(m_scene.InventoryService, receiverSp.UUID, "Objects/givenObj"); | ||
138 | |||
139 | Assert.That(receivedItem, Is.Not.Null); | ||
140 | Assert.That(receivedItem.ID, Is.Not.EqualTo(originalItem.ID)); | ||
141 | |||
142 | // Test that on a delete, item still exists and is accessible for the giver. | ||
143 | m_scene.InventoryService.DeleteItems(receiverSp.UUID, new List<UUID>() { receivedItem.ID }); | ||
144 | |||
145 | InventoryItemBase originalItemAfterDelete | ||
146 | = UserInventoryHelpers.GetInventoryItem(m_scene.InventoryService, giverSp.UUID, "Objects/givenObj"); | ||
147 | |||
148 | Assert.That(originalItemAfterDelete, Is.Not.Null); | ||
149 | |||
150 | // TODO: Test scenario where giver deletes their item first. | ||
151 | } | ||
152 | |||
153 | /// <summary> | ||
154 | /// Test user rejection of a given item. | ||
155 | /// </summary> | ||
156 | /// <remarks> | ||
157 | /// A rejected item still ends up in the user's trash folder. | ||
158 | /// </remarks> | ||
159 | [Test] | ||
160 | public void TestRejectGivenItem() | ||
161 | { | ||
162 | // TestHelpers.EnableLogging(); | ||
163 | |||
164 | UUID initialSessionId = TestHelpers.ParseTail(0x10); | ||
165 | UUID itemId = TestHelpers.ParseTail(0x100); | ||
166 | UUID assetId = TestHelpers.ParseTail(0x200); | ||
167 | |||
168 | UserAccount ua1 | ||
169 | = UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "One", TestHelpers.ParseTail(0x1), "pw"); | ||
170 | UserAccount ua2 | ||
171 | = UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "Two", TestHelpers.ParseTail(0x2), "pw"); | ||
172 | |||
173 | ScenePresence giverSp = SceneHelpers.AddScenePresence(m_scene, ua1); | ||
174 | TestClient giverClient = (TestClient)giverSp.ControllingClient; | ||
175 | |||
176 | ScenePresence receiverSp = SceneHelpers.AddScenePresence(m_scene, ua2); | ||
177 | TestClient receiverClient = (TestClient)receiverSp.ControllingClient; | ||
178 | |||
179 | // Create the object to test give | ||
180 | InventoryItemBase originalItem | ||
181 | = UserInventoryHelpers.CreateInventoryItem( | ||
182 | m_scene, "givenObj", itemId, assetId, giverSp.UUID, InventoryType.Object); | ||
183 | |||
184 | GridInstantMessage receivedIm = null; | ||
185 | receiverClient.OnReceivedInstantMessage += im => receivedIm = im; | ||
186 | |||
187 | byte[] giveImBinaryBucket = new byte[17]; | ||
188 | byte[] itemIdBytes = itemId.GetBytes(); | ||
189 | Array.Copy(itemIdBytes, 0, giveImBinaryBucket, 1, itemIdBytes.Length); | ||
190 | |||
191 | GridInstantMessage giveIm | ||
192 | = new GridInstantMessage( | ||
193 | m_scene, | ||
194 | giverSp.UUID, | ||
195 | giverSp.Name, | ||
196 | receiverSp.UUID, | ||
197 | (byte)InstantMessageDialog.InventoryOffered, | ||
198 | false, | ||
199 | "inventory offered msg", | ||
200 | initialSessionId, | ||
201 | false, | ||
202 | Vector3.Zero, | ||
203 | giveImBinaryBucket, | ||
204 | true); | ||
205 | |||
206 | giverClient.HandleImprovedInstantMessage(giveIm); | ||
207 | |||
208 | // These details might not all be correct. | ||
209 | // Session ID is now the created item ID (!) | ||
210 | GridInstantMessage rejectIm | ||
211 | = new GridInstantMessage( | ||
212 | m_scene, | ||
213 | receiverSp.UUID, | ||
214 | receiverSp.Name, | ||
215 | giverSp.UUID, | ||
216 | (byte)InstantMessageDialog.InventoryDeclined, | ||
217 | false, | ||
218 | "inventory declined msg", | ||
219 | new UUID(receivedIm.imSessionID), | ||
220 | false, | ||
221 | Vector3.Zero, | ||
222 | null, | ||
223 | true); | ||
224 | |||
225 | receiverClient.HandleImprovedInstantMessage(rejectIm); | ||
226 | |||
227 | // Test for item remaining in the giver's inventory (here we assume a copy item) | ||
228 | // TODO: Test no-copy items. | ||
229 | InventoryItemBase originalItemAfterGive | ||
230 | = UserInventoryHelpers.GetInventoryItem(m_scene.InventoryService, giverSp.UUID, "Objects/givenObj"); | ||
231 | |||
232 | Assert.That(originalItemAfterGive, Is.Not.Null); | ||
233 | Assert.That(originalItemAfterGive.ID, Is.EqualTo(originalItem.ID)); | ||
234 | |||
235 | // Test for item successfully making it into the receiver's inventory | ||
236 | InventoryItemBase receivedItem | ||
237 | = UserInventoryHelpers.GetInventoryItem(m_scene.InventoryService, receiverSp.UUID, "Trash/givenObj"); | ||
238 | |||
239 | InventoryFolderBase trashFolder | ||
240 | = m_scene.InventoryService.GetFolderForType(receiverSp.UUID, FolderType.Trash); | ||
241 | |||
242 | Assert.That(receivedItem, Is.Not.Null); | ||
243 | Assert.That(receivedItem.ID, Is.Not.EqualTo(originalItem.ID)); | ||
244 | Assert.That(receivedItem.Folder, Is.EqualTo(trashFolder.ID)); | ||
245 | |||
246 | // Test that on a delete, item still exists and is accessible for the giver. | ||
247 | m_scene.InventoryService.PurgeFolder(trashFolder); | ||
248 | |||
249 | InventoryItemBase originalItemAfterDelete | ||
250 | = UserInventoryHelpers.GetInventoryItem(m_scene.InventoryService, giverSp.UUID, "Objects/givenObj"); | ||
251 | |||
252 | Assert.That(originalItemAfterDelete, Is.Not.Null); | ||
253 | } | ||
254 | |||
255 | [Test] | ||
256 | public void TestAcceptGivenFolder() | ||
257 | { | ||
258 | TestHelpers.InMethod(); | ||
259 | // TestHelpers.EnableLogging(); | ||
260 | |||
261 | UUID initialSessionId = TestHelpers.ParseTail(0x10); | ||
262 | UUID folderId = TestHelpers.ParseTail(0x100); | ||
263 | |||
264 | UserAccount ua1 | ||
265 | = UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "One", TestHelpers.ParseTail(0x1), "pw"); | ||
266 | UserAccount ua2 | ||
267 | = UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "Two", TestHelpers.ParseTail(0x2), "pw"); | ||
268 | |||
269 | ScenePresence giverSp = SceneHelpers.AddScenePresence(m_scene, ua1); | ||
270 | TestClient giverClient = (TestClient)giverSp.ControllingClient; | ||
271 | |||
272 | ScenePresence receiverSp = SceneHelpers.AddScenePresence(m_scene, ua2); | ||
273 | TestClient receiverClient = (TestClient)receiverSp.ControllingClient; | ||
274 | |||
275 | InventoryFolderBase originalFolder | ||
276 | = UserInventoryHelpers.CreateInventoryFolder( | ||
277 | m_scene.InventoryService, giverSp.UUID, folderId, "f1", true); | ||
278 | |||
279 | byte[] giveImBinaryBucket = new byte[17]; | ||
280 | giveImBinaryBucket[0] = (byte)AssetType.Folder; | ||
281 | byte[] itemIdBytes = folderId.GetBytes(); | ||
282 | Array.Copy(itemIdBytes, 0, giveImBinaryBucket, 1, itemIdBytes.Length); | ||
283 | |||
284 | GridInstantMessage giveIm | ||
285 | = new GridInstantMessage( | ||
286 | m_scene, | ||
287 | giverSp.UUID, | ||
288 | giverSp.Name, | ||
289 | receiverSp.UUID, | ||
290 | (byte)InstantMessageDialog.InventoryOffered, | ||
291 | false, | ||
292 | "inventory offered msg", | ||
293 | initialSessionId, | ||
294 | false, | ||
295 | Vector3.Zero, | ||
296 | giveImBinaryBucket, | ||
297 | true); | ||
298 | |||
299 | giverClient.HandleImprovedInstantMessage(giveIm); | ||
300 | |||
301 | // These details might not all be correct. | ||
302 | GridInstantMessage acceptIm | ||
303 | = new GridInstantMessage( | ||
304 | m_scene, | ||
305 | receiverSp.UUID, | ||
306 | receiverSp.Name, | ||
307 | giverSp.UUID, | ||
308 | (byte)InstantMessageDialog.InventoryAccepted, | ||
309 | false, | ||
310 | "inventory accepted msg", | ||
311 | initialSessionId, | ||
312 | false, | ||
313 | Vector3.Zero, | ||
314 | null, | ||
315 | true); | ||
316 | |||
317 | receiverClient.HandleImprovedInstantMessage(acceptIm); | ||
318 | |||
319 | // Test for item remaining in the giver's inventory (here we assume a copy item) | ||
320 | // TODO: Test no-copy items. | ||
321 | InventoryFolderBase originalFolderAfterGive | ||
322 | = UserInventoryHelpers.GetInventoryFolder(m_scene.InventoryService, giverSp.UUID, "f1"); | ||
323 | |||
324 | Assert.That(originalFolderAfterGive, Is.Not.Null); | ||
325 | Assert.That(originalFolderAfterGive.ID, Is.EqualTo(originalFolder.ID)); | ||
326 | |||
327 | // Test for item successfully making it into the receiver's inventory | ||
328 | InventoryFolderBase receivedFolder | ||
329 | = UserInventoryHelpers.GetInventoryFolder(m_scene.InventoryService, receiverSp.UUID, "f1"); | ||
330 | |||
331 | Assert.That(receivedFolder, Is.Not.Null); | ||
332 | Assert.That(receivedFolder.ID, Is.Not.EqualTo(originalFolder.ID)); | ||
333 | |||
334 | // Test that on a delete, item still exists and is accessible for the giver. | ||
335 | m_scene.InventoryService.DeleteFolders(receiverSp.UUID, new List<UUID>() { receivedFolder.ID }); | ||
336 | |||
337 | InventoryFolderBase originalFolderAfterDelete | ||
338 | = UserInventoryHelpers.GetInventoryFolder(m_scene.InventoryService, giverSp.UUID, "f1"); | ||
339 | |||
340 | Assert.That(originalFolderAfterDelete, Is.Not.Null); | ||
341 | |||
342 | // TODO: Test scenario where giver deletes their item first. | ||
343 | } | ||
344 | |||
345 | /// <summary> | ||
346 | /// Test user rejection of a given item. | ||
347 | /// </summary> | ||
348 | /// <remarks> | ||
349 | /// A rejected item still ends up in the user's trash folder. | ||
350 | /// </remarks> | ||
351 | [Test] | ||
352 | public void TestRejectGivenFolder() | ||
353 | { | ||
354 | TestHelpers.InMethod(); | ||
355 | // TestHelpers.EnableLogging(); | ||
356 | |||
357 | UUID initialSessionId = TestHelpers.ParseTail(0x10); | ||
358 | UUID folderId = TestHelpers.ParseTail(0x100); | ||
359 | |||
360 | UserAccount ua1 | ||
361 | = UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "One", TestHelpers.ParseTail(0x1), "pw"); | ||
362 | UserAccount ua2 | ||
363 | = UserAccountHelpers.CreateUserWithInventory(m_scene, "User", "Two", TestHelpers.ParseTail(0x2), "pw"); | ||
364 | |||
365 | ScenePresence giverSp = SceneHelpers.AddScenePresence(m_scene, ua1); | ||
366 | TestClient giverClient = (TestClient)giverSp.ControllingClient; | ||
367 | |||
368 | ScenePresence receiverSp = SceneHelpers.AddScenePresence(m_scene, ua2); | ||
369 | TestClient receiverClient = (TestClient)receiverSp.ControllingClient; | ||
370 | |||
371 | // Create the folder to test give | ||
372 | InventoryFolderBase originalFolder | ||
373 | = UserInventoryHelpers.CreateInventoryFolder( | ||
374 | m_scene.InventoryService, giverSp.UUID, folderId, "f1", true); | ||
375 | |||
376 | GridInstantMessage receivedIm = null; | ||
377 | receiverClient.OnReceivedInstantMessage += im => receivedIm = im; | ||
378 | |||
379 | byte[] giveImBinaryBucket = new byte[17]; | ||
380 | giveImBinaryBucket[0] = (byte)AssetType.Folder; | ||
381 | byte[] itemIdBytes = folderId.GetBytes(); | ||
382 | Array.Copy(itemIdBytes, 0, giveImBinaryBucket, 1, itemIdBytes.Length); | ||
383 | |||
384 | GridInstantMessage giveIm | ||
385 | = new GridInstantMessage( | ||
386 | m_scene, | ||
387 | giverSp.UUID, | ||
388 | giverSp.Name, | ||
389 | receiverSp.UUID, | ||
390 | (byte)InstantMessageDialog.InventoryOffered, | ||
391 | false, | ||
392 | "inventory offered msg", | ||
393 | initialSessionId, | ||
394 | false, | ||
395 | Vector3.Zero, | ||
396 | giveImBinaryBucket, | ||
397 | true); | ||
398 | |||
399 | giverClient.HandleImprovedInstantMessage(giveIm); | ||
400 | |||
401 | // These details might not all be correct. | ||
402 | // Session ID is now the created item ID (!) | ||
403 | GridInstantMessage rejectIm | ||
404 | = new GridInstantMessage( | ||
405 | m_scene, | ||
406 | receiverSp.UUID, | ||
407 | receiverSp.Name, | ||
408 | giverSp.UUID, | ||
409 | (byte)InstantMessageDialog.InventoryDeclined, | ||
410 | false, | ||
411 | "inventory declined msg", | ||
412 | new UUID(receivedIm.imSessionID), | ||
413 | false, | ||
414 | Vector3.Zero, | ||
415 | null, | ||
416 | true); | ||
417 | |||
418 | receiverClient.HandleImprovedInstantMessage(rejectIm); | ||
419 | |||
420 | // Test for item remaining in the giver's inventory (here we assume a copy item) | ||
421 | // TODO: Test no-copy items. | ||
422 | InventoryFolderBase originalFolderAfterGive | ||
423 | = UserInventoryHelpers.GetInventoryFolder(m_scene.InventoryService, giverSp.UUID, "f1"); | ||
424 | |||
425 | Assert.That(originalFolderAfterGive, Is.Not.Null); | ||
426 | Assert.That(originalFolderAfterGive.ID, Is.EqualTo(originalFolder.ID)); | ||
427 | |||
428 | // Test for folder successfully making it into the receiver's inventory | ||
429 | InventoryFolderBase receivedFolder | ||
430 | = UserInventoryHelpers.GetInventoryFolder(m_scene.InventoryService, receiverSp.UUID, "Trash/f1"); | ||
431 | |||
432 | InventoryFolderBase trashFolder | ||
433 | = m_scene.InventoryService.GetFolderForType(receiverSp.UUID, FolderType.Trash); | ||
434 | |||
435 | Assert.That(receivedFolder, Is.Not.Null); | ||
436 | Assert.That(receivedFolder.ID, Is.Not.EqualTo(originalFolder.ID)); | ||
437 | Assert.That(receivedFolder.ParentID, Is.EqualTo(trashFolder.ID)); | ||
438 | |||
439 | // Test that on a delete, item still exists and is accessible for the giver. | ||
440 | m_scene.InventoryService.PurgeFolder(trashFolder); | ||
441 | |||
442 | InventoryFolderBase originalFolderAfterDelete | ||
443 | = UserInventoryHelpers.GetInventoryFolder(m_scene.InventoryService, giverSp.UUID, "f1"); | ||
444 | |||
445 | Assert.That(originalFolderAfterDelete, Is.Not.Null); | ||
446 | } | ||
447 | } | ||
448 | } \ No newline at end of file | ||