aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/CoreModules/Avatar/Inventory/Transfer')
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs166
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/Tests/InventoryTransferModuleTests.cs448
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
28using System;
29using System.Collections.Generic;
30using System.Reflection;
31using log4net.Config;
32using Nini.Config;
33using NUnit.Framework;
34using OpenMetaverse;
35using OpenMetaverse.Assets;
36using OpenSim.Framework;
37using OpenSim.Region.CoreModules.Avatar.Inventory.Transfer;
38using OpenSim.Region.Framework.Interfaces;
39using OpenSim.Region.Framework.Scenes;
40using OpenSim.Services.Interfaces;
41using OpenSim.Tests.Common;
42
43namespace 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