aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs4
-rw-r--r--OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs4
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs7
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs20
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs5
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs8
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs115
-rw-r--r--OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs152
-rw-r--r--OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs8
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs43
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs51
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs15
-rw-r--r--OpenSim/Region/CoreModules/World/Land/LandObject.cs7
-rw-r--r--OpenSim/Region/Framework/Scenes/EventManager.cs49
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Inventory.cs81
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs8
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs41
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs82
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs16
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs3
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs125
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs10
-rw-r--r--OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs72
-rw-r--r--OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs47
-rw-r--r--OpenSim/Services/HypergridService/HGInventoryService.cs6
-rw-r--r--OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs292
-rw-r--r--OpenSim/Services/InventoryService/XInventoryService.cs62
27 files changed, 960 insertions, 373 deletions
diff --git a/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs b/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs
index 8b44f72..d5c062b 100644
--- a/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs
+++ b/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs
@@ -162,7 +162,7 @@ namespace OpenSim.Capabilities.Handlers
162 invFetch.owner_id, invFetch.folder_id, invFetch.owner_id, 162 invFetch.owner_id, invFetch.folder_id, invFetch.owner_id,
163 invFetch.fetch_folders, invFetch.fetch_items, invFetch.sort_order, out version); 163 invFetch.fetch_folders, invFetch.fetch_items, invFetch.sort_order, out version);
164 164
165 if (inv.Folders != null) 165 if (inv != null && inv.Folders != null)
166 { 166 {
167 foreach (InventoryFolderBase invFolder in inv.Folders) 167 foreach (InventoryFolderBase invFolder in inv.Folders)
168 { 168 {
@@ -170,7 +170,7 @@ namespace OpenSim.Capabilities.Handlers
170 } 170 }
171 } 171 }
172 172
173 if (inv.Items != null) 173 if (inv != null && inv.Items != null)
174 { 174 {
175 foreach (InventoryItemBase invItem in inv.Items) 175 foreach (InventoryItemBase invItem in inv.Items)
176 { 176 {
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
index 2c0d8f0..ad5af1f 100644
--- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
+++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
@@ -662,11 +662,11 @@ namespace OpenSim.Framework.Servers.HttpServer
662 } 662 }
663 catch (IOException e) 663 catch (IOException e)
664 { 664 {
665 m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw ", e); 665 m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}", e);
666 } 666 }
667 catch (Exception e) 667 catch (Exception e)
668 { 668 {
669 m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw " + e.ToString()); 669 m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}", e.StackTrace);
670 SendHTML500(response); 670 SendHTML500(response);
671 } 671 }
672 finally 672 finally
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index 3118613..1004be6 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -1923,7 +1923,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1923 1923
1924 folderBlock.FolderID = folder.ID; 1924 folderBlock.FolderID = folder.ID;
1925 folderBlock.ParentID = folder.ParentID; 1925 folderBlock.ParentID = folder.ParentID;
1926 folderBlock.Type = -1; 1926 //folderBlock.Type = -1;
1927 folderBlock.Type = (sbyte)folder.Type;
1927 folderBlock.Name = Util.StringToBytes256(folder.Name); 1928 folderBlock.Name = Util.StringToBytes256(folder.Name);
1928 1929
1929 return folderBlock; 1930 return folderBlock;
@@ -4360,7 +4361,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4360 block.OwnerID = sop.OwnerID; 4361 block.OwnerID = sop.OwnerID;
4361 4362
4362 block.ItemID = sop.FromUserInventoryItemID; 4363 block.ItemID = sop.FromUserInventoryItemID;
4363 block.FolderID = UUID.Zero; // sop.FromFolderID ?? 4364 block.FolderID = UUID.Zero; // sog.FromFolderID ??
4364 block.FromTaskID = UUID.Zero; // ??? 4365 block.FromTaskID = UUID.Zero; // ???
4365 block.InventorySerial = (short)sop.InventorySerial; 4366 block.InventorySerial = (short)sop.InventorySerial;
4366 4367
@@ -5082,7 +5083,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5082 update.MediaURL = Utils.EmptyBytes; // FIXME: Support this in OpenSim 5083 update.MediaURL = Utils.EmptyBytes; // FIXME: Support this in OpenSim
5083 if (data.ParentGroup.IsAttachment) 5084 if (data.ParentGroup.IsAttachment)
5084 { 5085 {
5085 update.NameValue = Util.StringToBytes256("AttachItemID STRING RW SV " + data.FromItemID); 5086 update.NameValue = Util.StringToBytes256("AttachItemID STRING RW SV " + data.ParentGroup.FromItemID);
5086 update.State = (byte)((data.ParentGroup.AttachmentPoint % 16) * 16 + (data.ParentGroup.AttachmentPoint / 16)); 5087 update.State = (byte)((data.ParentGroup.AttachmentPoint % 16) * 16 + (data.ParentGroup.AttachmentPoint / 16));
5087 } 5088 }
5088 else 5089 else
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index c5cec59..78ae5e9 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -285,7 +285,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
285 // At the moment we can only deal with a single attachment 285 // At the moment we can only deal with a single attachment
286 if (attachments.Count != 0) 286 if (attachments.Count != 0)
287 { 287 {
288 UUID oldAttachmentItemID = attachments[0].GetFromItemID(); 288 UUID oldAttachmentItemID = attachments[0].FromItemID;
289 289
290 if (oldAttachmentItemID != UUID.Zero) 290 if (oldAttachmentItemID != UUID.Zero)
291 DetachSingleAttachmentToInvInternal(sp, oldAttachmentItemID); 291 DetachSingleAttachmentToInvInternal(sp, oldAttachmentItemID);
@@ -296,7 +296,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
296 } 296 }
297 297
298 // Add the new attachment to inventory if we don't already have it. 298 // Add the new attachment to inventory if we don't already have it.
299 UUID newAttachmentItemID = group.GetFromItemID(); 299 UUID newAttachmentItemID = group.FromItemID;
300 if (newAttachmentItemID == UUID.Zero) 300 if (newAttachmentItemID == UUID.Zero)
301 newAttachmentItemID = AddSceneObjectAsNewAttachmentInInv(sp, group).ID; 301 newAttachmentItemID = AddSceneObjectAsNewAttachmentInInv(sp, group).ID;
302 302
@@ -336,7 +336,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
336 List<SceneObjectGroup> existingAttachments = sp.GetAttachments(); 336 List<SceneObjectGroup> existingAttachments = sp.GetAttachments();
337 foreach (SceneObjectGroup so in existingAttachments) 337 foreach (SceneObjectGroup so in existingAttachments)
338 { 338 {
339 if (so.GetFromItemID() == itemID) 339 if (so.FromItemID == itemID)
340 { 340 {
341 alreadyOn = true; 341 alreadyOn = true;
342 break; 342 break;
@@ -393,7 +393,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
393 if (so.AttachedAvatar != sp.UUID) 393 if (so.AttachedAvatar != sp.UUID)
394 return; 394 return;
395 395
396 UUID inventoryID = so.GetFromItemID(); 396 UUID inventoryID = so.FromItemID;
397 397
398// m_log.DebugFormat( 398// m_log.DebugFormat(
399// "[ATTACHMENTS MODULE]: In DetachSingleAttachmentToGround(), object is {0} {1}, associated item is {2}", 399// "[ATTACHMENTS MODULE]: In DetachSingleAttachmentToGround(), object is {0} {1}, associated item is {2}",
@@ -410,9 +410,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
410 m_scene.AvatarFactory.QueueAppearanceSave(sp.UUID); 410 m_scene.AvatarFactory.QueueAppearanceSave(sp.UUID);
411 411
412 sp.RemoveAttachment(so); 412 sp.RemoveAttachment(so);
413 so.FromItemID = UUID.Zero;
413 414
414 SceneObjectPart rootPart = so.RootPart; 415 SceneObjectPart rootPart = so.RootPart;
415 rootPart.FromItemID = UUID.Zero;
416 so.AbsolutePosition = sp.AbsolutePosition; 416 so.AbsolutePosition = sp.AbsolutePosition;
417 so.AttachedAvatar = UUID.Zero; 417 so.AttachedAvatar = UUID.Zero;
418 rootPart.SetParentLocalId(0); 418 rootPart.SetParentLocalId(0);
@@ -526,7 +526,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
526 526
527 string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp); 527 string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp);
528 528
529 InventoryItemBase item = new InventoryItemBase(grp.GetFromItemID(), sp.UUID); 529 InventoryItemBase item = new InventoryItemBase(grp.FromItemID, sp.UUID);
530 item = m_scene.InventoryService.GetItem(item); 530 item = m_scene.InventoryService.GetItem(item);
531 531
532 if (item != null) 532 if (item != null)
@@ -698,7 +698,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
698 item.CreationDate = Util.UnixTimeSinceEpoch(); 698 item.CreationDate = Util.UnixTimeSinceEpoch();
699 699
700 // sets itemID so client can show item as 'attached' in inventory 700 // sets itemID so client can show item as 'attached' in inventory
701 grp.SetFromItemID(item.ID); 701 grp.FromItemID = item.ID;
702 702
703 if (m_scene.AddInventoryItem(item)) 703 if (m_scene.AddInventoryItem(item))
704 { 704 {
@@ -734,7 +734,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
734 if (entity is SceneObjectGroup) 734 if (entity is SceneObjectGroup)
735 { 735 {
736 group = (SceneObjectGroup)entity; 736 group = (SceneObjectGroup)entity;
737 if (group.GetFromItemID() == itemID) 737 if (group.FromItemID == itemID)
738 { 738 {
739 m_scene.EventManager.TriggerOnAttach(group.LocalId, itemID, UUID.Zero); 739 m_scene.EventManager.TriggerOnAttach(group.LocalId, itemID, UUID.Zero);
740 sp.RemoveAttachment(group); 740 sp.RemoveAttachment(group);
@@ -946,7 +946,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
946 // Calls attach with a Zero position 946 // Calls attach with a Zero position
947 if (AttachObject(sp, part.ParentGroup, AttachmentPt, false)) 947 if (AttachObject(sp, part.ParentGroup, AttachmentPt, false))
948 { 948 {
949 m_scene.EventManager.TriggerOnAttach(objectLocalID, part.ParentGroup.GetFromItemID(), remoteClient.AgentId); 949 m_scene.EventManager.TriggerOnAttach(objectLocalID, part.ParentGroup.FromItemID, remoteClient.AgentId);
950 950
951 // Save avatar attachment information 951 // Save avatar attachment information
952 m_log.Debug( 952 m_log.Debug(
@@ -969,7 +969,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
969 ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId); 969 ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId);
970 SceneObjectGroup group = m_scene.GetGroupByPrim(objectLocalID); 970 SceneObjectGroup group = m_scene.GetGroupByPrim(objectLocalID);
971 if (sp != null && group != null) 971 if (sp != null && group != null)
972 DetachSingleAttachmentToInv(sp, group.GetFromItemID()); 972 DetachSingleAttachmentToInv(sp, group.FromItemID);
973 } 973 }
974 974
975 private void Client_OnDetachAttachmentIntoInv(UUID itemID, IClientAPI remoteClient) 975 private void Client_OnDetachAttachmentIntoInv(UUID itemID, IClientAPI remoteClient)
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs
index 86cfb32..bfe5e4a 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs
@@ -120,8 +120,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
120 Assert.That(attSo.IsTemporary, Is.False); 120 Assert.That(attSo.IsTemporary, Is.False);
121 121
122 // Check item status 122 // Check item status
123 Assert.That(m_presence.Appearance.GetAttachpoint( 123 Assert.That(
124 attSo.GetFromItemID()), Is.EqualTo((int)AttachmentPoint.Chest)); 124 m_presence.Appearance.GetAttachpoint(attSo.FromItemID),
125 Is.EqualTo((int)AttachmentPoint.Chest));
125 } 126 }
126 127
127 [Test] 128 [Test]
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index b64d372..2b790f4 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -562,12 +562,18 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
562 // Finally, kill the agent we just created at the destination. 562 // Finally, kill the agent we just created at the destination.
563 m_aScene.SimulationService.CloseAgent(finalDestination, sp.UUID); 563 m_aScene.SimulationService.CloseAgent(finalDestination, sp.UUID);
564 564
565 sp.Scene.EventManager.TriggerTeleportFail(sp.ControllingClient, logout);
565 } 566 }
566 567
567 protected virtual bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason, out bool logout) 568 protected virtual bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason, out bool logout)
568 { 569 {
569 logout = false; 570 logout = false;
570 return m_aScene.SimulationService.CreateAgent(finalDestination, agentCircuit, teleportFlags, out reason); 571 bool success = m_aScene.SimulationService.CreateAgent(finalDestination, agentCircuit, teleportFlags, out reason);
572
573 if (success)
574 sp.Scene.EventManager.TriggerTeleportStart(sp.ControllingClient, reg, finalDestination, teleportFlags, logout);
575
576 return success;
571 } 577 }
572 578
573 protected virtual bool UpdateAgent(GridRegion reg, GridRegion finalDestination, AgentData agent) 579 protected virtual bool UpdateAgent(GridRegion reg, GridRegion finalDestination, AgentData agent)
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
index 6fc8e4d..8b5ad23 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
@@ -51,8 +51,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
51 51
52 private bool m_Initialized = false; 52 private bool m_Initialized = false;
53 53
54 private bool m_RestrictInventoryAccessAbroad = false;
55
56 private GatekeeperServiceConnector m_GatekeeperConnector; 54 private GatekeeperServiceConnector m_GatekeeperConnector;
57 55
58 #region ISharedRegionModule 56 #region ISharedRegionModule
@@ -71,10 +69,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
71 if (name == Name) 69 if (name == Name)
72 { 70 {
73 InitialiseCommon(source); 71 InitialiseCommon(source);
74 IConfig transferConfig = source.Configs["HGEntityTransferModule"];
75 if (transferConfig != null)
76 m_RestrictInventoryAccessAbroad = transferConfig.GetBoolean("RestrictInventoryAccessAbroad", false);
77
78 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: {0} enabled.", Name); 72 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: {0} enabled.", Name);
79 } 73 }
80 } 74 }
@@ -94,34 +88,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
94 client.OnTeleportHomeRequest += TriggerTeleportHome; 88 client.OnTeleportHomeRequest += TriggerTeleportHome;
95 client.OnTeleportLandmarkRequest += RequestTeleportLandmark; 89 client.OnTeleportLandmarkRequest += RequestTeleportLandmark;
96 client.OnConnectionClosed += new Action<IClientAPI>(OnConnectionClosed); 90 client.OnConnectionClosed += new Action<IClientAPI>(OnConnectionClosed);
97 client.OnCompleteMovementToRegion += new Action<IClientAPI, bool>(OnCompleteMovementToRegion);
98 }
99
100 protected void OnCompleteMovementToRegion(IClientAPI client, bool arg2)
101 {
102 // HACK HACK -- just seeing how the viewer responds
103 // Let's send the Suitcase or the real root folder folder for incoming HG agents
104 // Visiting agents get their suitcase contents; incoming local users get their real root folder's content
105 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: OnCompleteMovementToRegion of user {0}", client.AgentId);
106 object sp = null;
107 if (client.Scene.TryGetScenePresence(client.AgentId, out sp))
108 {
109 if (sp is ScenePresence)
110 {
111 AgentCircuitData aCircuit = ((ScenePresence)sp).Scene.AuthenticateHandler.GetAgentCircuitData(client.AgentId);
112 if ((aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0)
113 {
114 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: ViaHGLogin");
115 if (m_RestrictInventoryAccessAbroad)
116 {
117 RestoreRootFolderContents(client);
118 }
119 }
120 }
121 }
122 } 91 }
123 92
124
125 public override void RegionLoaded(Scene scene) 93 public override void RegionLoaded(Scene scene)
126 { 94 {
127 base.RegionLoaded(scene); 95 base.RegionLoaded(scene);
@@ -131,12 +99,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
131 m_GatekeeperConnector = new GatekeeperServiceConnector(scene.AssetService); 99 m_GatekeeperConnector = new GatekeeperServiceConnector(scene.AssetService);
132 m_Initialized = true; 100 m_Initialized = true;
133 101
134 scene.AddCommand(
135 "HG", this, "send inventory",
136 "send inventory",
137 "Don't use this",
138 HandleSendInventory);
139
140 } 102 }
141 103
142 } 104 }
@@ -209,8 +171,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
209 bool success = connector.LoginAgentToGrid(agentCircuit, reg, finalDestination, out reason); 171 bool success = connector.LoginAgentToGrid(agentCircuit, reg, finalDestination, out reason);
210 logout = success; // flag for later logout from this grid; this is an HG TP 172 logout = success; // flag for later logout from this grid; this is an HG TP
211 173
212 if (success && m_RestrictInventoryAccessAbroad) 174 if (success)
213 RemoveRootFolderContents(sp.ControllingClient); 175 sp.Scene.EventManager.TriggerTeleportStart(sp.ControllingClient, reg, finalDestination, teleportFlags, logout);
214 176
215 return success; 177 return success;
216 } 178 }
@@ -221,7 +183,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
221 } 183 }
222 } 184 }
223 185
224 return m_aScene.SimulationService.CreateAgent(reg, agentCircuit, teleportFlags, out reason); 186 return base.CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout);
225 } 187 }
226 188
227 public void TriggerTeleportHome(UUID id, IClientAPI client) 189 public void TriggerTeleportHome(UUID id, IClientAPI client)
@@ -330,15 +292,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
330 292
331 } 293 }
332 294
333 protected override void Fail(ScenePresence sp, GridRegion finalDestination, bool logout)
334 {
335 base.Fail(sp, finalDestination, logout);
336 if (logout && m_RestrictInventoryAccessAbroad)
337 {
338 RestoreRootFolderContents(sp.ControllingClient);
339 }
340 }
341
342 #endregion 295 #endregion
343 296
344 #region IUserAgentVerificationModule 297 #region IUserAgentVerificationModule
@@ -393,60 +346,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
393 346
394 #endregion 347 #endregion
395 348
396 private void RemoveRootFolderContents(IClientAPI client)
397 {
398 // TODO tell the viewer to remove the root folder's content
399 if (client is IClientCore)
400 {
401 IClientCore core = (IClientCore)client;
402 IClientInventory inv;
403
404 if (core.TryGet<IClientInventory>(out inv))
405 {
406 InventoryFolderBase root = m_Scenes[0].InventoryService.GetRootFolder(client.AgentId);
407 if (root != null)
408 {
409 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Removing root inventory for user {0}", client.AgentId);
410 InventoryCollection content = m_Scenes[0].InventoryService.GetFolderContent(client.AgentId, root.ID);
411 UUID[] ids = new UUID[content.Folders.Count];
412 int i = 0;
413 foreach (InventoryFolderBase f in content.Folders)
414 ids[i++] = f.ID;
415 inv.SendRemoveInventoryFolders(ids);
416 ids = new UUID[content.Items.Count];
417 i = 0;
418 foreach (InventoryItemBase it in content.Items)
419 ids[i++] = it.ID;
420 inv.SendRemoveInventoryItems(ids);
421 }
422 }
423 }
424 }
425
426 private void RestoreRootFolderContents(IClientAPI client)
427 {
428 if (client is IClientCore)
429 {
430 IClientCore core = (IClientCore)client;
431 IClientInventory inv;
432
433 if (core.TryGet<IClientInventory>(out inv))
434 {
435 InventoryFolderBase root = m_Scenes[0].InventoryService.GetRootFolder(client.AgentId);
436 client.SendBulkUpdateInventory(root);
437 //if (root != null)
438 //{
439 // m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Restoring root inventory for user {0}", client.AgentId);
440 // InventoryCollection content = m_Scenes[0].InventoryService.GetFolderContent(client.AgentId, root.ID);
441 // m_log.DebugFormat("[XXX]: Folder name {0}, id {1}, parent {2}", root.Name, root.ID, root.ParentID);
442 // foreach (InventoryItemBase i in content.Items)
443 // m_log.DebugFormat("[XXX]: Name={0}, folderID={1}", i.Name, i.Folder);
444
445 // inv.SendBulkUpdateInventory(content.Folders.ToArray(), content.Items.ToArray());
446 //}
447 }
448 }
449 }
450 349
451 private GridRegion MakeRegion(AgentCircuitData aCircuit) 350 private GridRegion MakeRegion(AgentCircuitData aCircuit)
452 { 351 {
@@ -465,13 +364,5 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
465 return region; 364 return region;
466 } 365 }
467 366
468 protected void HandleSendInventory(string module, string[] cmd)
469 {
470 m_Scenes[0].ForEachClient(delegate(IClientAPI client)
471 {
472 RestoreRootFolderContents(client);
473 });
474 }
475
476 } 367 }
477} 368}
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
index d2fe388..a71584a 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
@@ -30,6 +30,7 @@ using System.Collections.Generic;
30using System.Reflection; 30using System.Reflection;
31 31
32using OpenSim.Framework; 32using OpenSim.Framework;
33using OpenSim.Framework.Client;
33using OpenSim.Region.Framework.Interfaces; 34using OpenSim.Region.Framework.Interfaces;
34using OpenSim.Region.Framework.Scenes; 35using OpenSim.Region.Framework.Scenes;
35using OpenSim.Services.Connectors.Hypergrid; 36using OpenSim.Services.Connectors.Hypergrid;
@@ -57,6 +58,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
57 private string m_HomeURI; 58 private string m_HomeURI;
58 private bool m_OutboundPermission; 59 private bool m_OutboundPermission;
59 private string m_ThisGatekeeper; 60 private string m_ThisGatekeeper;
61 private bool m_RestrictInventoryAccessAbroad;
60 62
61// private bool m_Initialized = false; 63// private bool m_Initialized = false;
62 64
@@ -90,6 +92,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
90 m_HomeURI = thisModuleConfig.GetString("HomeURI", m_HomeURI); 92 m_HomeURI = thisModuleConfig.GetString("HomeURI", m_HomeURI);
91 m_OutboundPermission = thisModuleConfig.GetBoolean("OutboundPermission", true); 93 m_OutboundPermission = thisModuleConfig.GetBoolean("OutboundPermission", true);
92 m_ThisGatekeeper = thisModuleConfig.GetString("Gatekeeper", string.Empty); 94 m_ThisGatekeeper = thisModuleConfig.GetString("Gatekeeper", string.Empty);
95 m_RestrictInventoryAccessAbroad = thisModuleConfig.GetBoolean("RestrictInventoryAccessAbroad", false);
93 } 96 }
94 else 97 else
95 m_log.Warn("[HG INVENTORY ACCESS MODULE]: HGInventoryAccessModule configs not found. ProfileServerURI not set!"); 98 m_log.Warn("[HG INVENTORY ACCESS MODULE]: HGInventoryAccessModule configs not found. ProfileServerURI not set!");
@@ -105,13 +108,79 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
105 base.AddRegion(scene); 108 base.AddRegion(scene);
106 m_assMapper = new HGAssetMapper(scene, m_HomeURI); 109 m_assMapper = new HGAssetMapper(scene, m_HomeURI);
107 scene.EventManager.OnNewInventoryItemUploadComplete += UploadInventoryItem; 110 scene.EventManager.OnNewInventoryItemUploadComplete += UploadInventoryItem;
108 111 scene.EventManager.OnTeleportStart += TeleportStart;
112 scene.EventManager.OnTeleportFail += TeleportFail;
109 } 113 }
110 114
111 #endregion 115 #endregion
112 116
113 #region Event handlers 117 #region Event handlers
114 118
119 protected override void OnNewClient(IClientAPI client)
120 {
121 base.OnNewClient(client);
122 client.OnCompleteMovementToRegion += new Action<IClientAPI, bool>(OnCompleteMovementToRegion);
123 }
124
125 protected void OnCompleteMovementToRegion(IClientAPI client, bool arg2)
126 {
127 //m_log.DebugFormat("[HG INVENTORY ACCESS MODULE]: OnCompleteMovementToRegion of user {0}", client.Name);
128 object sp = null;
129 if (client.Scene.TryGetScenePresence(client.AgentId, out sp))
130 {
131 if (sp is ScenePresence)
132 {
133 AgentCircuitData aCircuit = ((ScenePresence)sp).Scene.AuthenticateHandler.GetAgentCircuitData(client.AgentId);
134 if ((aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0)
135 {
136 if (m_RestrictInventoryAccessAbroad)
137 {
138 IUserManagement uMan = m_Scene.RequestModuleInterface<IUserManagement>();
139 if (uMan.IsLocalGridUser(client.AgentId))
140 ProcessInventoryForComingHome(client);
141 else
142 ProcessInventoryForArriving(client);
143 }
144 }
145 }
146 }
147 }
148
149 protected void TeleportStart(IClientAPI client, GridRegion destination, GridRegion finalDestination, uint teleportFlags, bool gridLogout)
150 {
151 if (gridLogout && m_RestrictInventoryAccessAbroad)
152 {
153 IUserManagement uMan = m_Scene.RequestModuleInterface<IUserManagement>();
154 if (uMan != null && uMan.IsLocalGridUser(client.AgentId))
155 {
156 // local grid user
157 ProcessInventoryForHypergriding(client);
158 }
159 else
160 {
161 // Foreigner
162 ProcessInventoryForLeaving(client);
163 }
164 }
165
166 }
167
168 protected void TeleportFail(IClientAPI client, bool gridLogout)
169 {
170 if (gridLogout && m_RestrictInventoryAccessAbroad)
171 {
172 IUserManagement uMan = m_Scene.RequestModuleInterface<IUserManagement>();
173 if (uMan.IsLocalGridUser(client.AgentId))
174 {
175 ProcessInventoryForComingHome(client);
176 }
177 else
178 {
179 ProcessInventoryForArriving(client);
180 }
181 }
182 }
183
115 public void UploadInventoryItem(UUID avatarID, UUID assetID, string name, int userlevel) 184 public void UploadInventoryItem(UUID avatarID, UUID assetID, string name, int userlevel)
116 { 185 {
117 string userAssetServer = string.Empty; 186 string userAssetServer = string.Empty;
@@ -236,8 +305,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
236 return false; 305 return false;
237 } 306 }
238 307
239 #endregion
240
241 protected override InventoryItemBase GetItem(UUID agentID, UUID itemID) 308 protected override InventoryItemBase GetItem(UUID agentID, UUID itemID)
242 { 309 {
243 InventoryItemBase item = base.GetItem(agentID, itemID); 310 InventoryItemBase item = base.GetItem(agentID, itemID);
@@ -248,5 +315,84 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
248 315
249 return item; 316 return item;
250 } 317 }
318
319 #endregion
320
321 #region Inventory manipulation upon arriving/leaving
322
323 //
324 // These 2 are for local and foreign users coming back, respectively
325 //
326
327 private void ProcessInventoryForComingHome(IClientAPI client)
328 {
329 m_log.DebugFormat("[HG INVENTORY ACCESS MODULE]: Restoring root folder for local user {0}", client.Name);
330 if (client is IClientCore)
331 {
332 IClientCore core = (IClientCore)client;
333 IClientInventory inv;
334
335 if (core.TryGet<IClientInventory>(out inv))
336 {
337 InventoryFolderBase root = m_Scene.InventoryService.GetRootFolder(client.AgentId);
338 InventoryCollection content = m_Scene.InventoryService.GetFolderContent(client.AgentId, root.ID);
339
340 inv.SendBulkUpdateInventory(content.Folders.ToArray(), content.Items.ToArray());
341 }
342 }
343 }
344
345 private void ProcessInventoryForArriving(IClientAPI client)
346 {
347 }
348
349 //
350 // These 2 are for local and foreign users going away respectively
351 //
352
353 private void ProcessInventoryForHypergriding(IClientAPI client)
354 {
355 if (client is IClientCore)
356 {
357 IClientCore core = (IClientCore)client;
358 IClientInventory inv;
359
360 if (core.TryGet<IClientInventory>(out inv))
361 {
362 InventoryFolderBase root = m_Scene.InventoryService.GetRootFolder(client.AgentId);
363 if (root != null)
364 {
365 m_log.DebugFormat("[HG INVENTORY ACCESS MODULE]: Changing root inventory for user {0}", client.Name);
366 InventoryCollection content = m_Scene.InventoryService.GetFolderContent(client.AgentId, root.ID);
367 List<UUID> fids = new List<UUID>();
368 List<UUID> iids = new List<UUID>();
369 List<InventoryFolderBase> keep = new List<InventoryFolderBase>();
370
371 foreach (InventoryFolderBase f in content.Folders)
372 {
373 if (f.Name != "My Suitcase")
374 {
375 f.Name = f.Name + " (Unavailable)";
376 keep.Add(f);
377 }
378 }
379
380 // items directly under the root folder
381 foreach (InventoryItemBase it in content.Items)
382 it.Name = it.Name + " (Unavailable)"; ;
383
384 // Send the new names
385 inv.SendBulkUpdateInventory(keep.ToArray(), content.Items.ToArray());
386
387 }
388 }
389 }
390 }
391
392 private void ProcessInventoryForLeaving(IClientAPI client)
393 {
394 }
395
396 #endregion
251 } 397 }
252} 398}
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
index aa99692..74701a5 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
@@ -674,9 +674,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
674 // 674 //
675 if (action == DeRezAction.Take || action == DeRezAction.TakeCopy) 675 if (action == DeRezAction.Take || action == DeRezAction.TakeCopy)
676 { 676 {
677 if (so.RootPart.FromFolderID != UUID.Zero && userID == remoteClient.AgentId) 677 if (so.FromFolderID != UUID.Zero && userID == remoteClient.AgentId)
678 { 678 {
679 InventoryFolderBase f = new InventoryFolderBase(so.RootPart.FromFolderID, userID); 679 InventoryFolderBase f = new InventoryFolderBase(so.FromFolderID, userID);
680 if (f != null) 680 if (f != null)
681 folder = m_Scene.InventoryService.GetFolder(f); 681 folder = m_Scene.InventoryService.GetFolder(f);
682 } 682 }
@@ -1012,7 +1012,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
1012 } 1012 }
1013 } 1013 }
1014 1014
1015 rootPart.FromFolderID = item.Folder; 1015 so.FromFolderID = item.Folder;
1016 1016
1017// Console.WriteLine("rootPart.OwnedID {0}, item.Owner {1}, item.CurrentPermissions {2:X}", 1017// Console.WriteLine("rootPart.OwnedID {0}, item.Owner {1}, item.CurrentPermissions {2:X}",
1018// rootPart.OwnerID, item.Owner, item.CurrentPermissions); 1018// rootPart.OwnerID, item.Owner, item.CurrentPermissions);
@@ -1071,7 +1071,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
1071 rootPart.TrimPermissions(); 1071 rootPart.TrimPermissions();
1072 1072
1073 if (isAttachment) 1073 if (isAttachment)
1074 so.SetFromItemID(item.ID); 1074 so.FromItemID = item.ID;
1075 } 1075 }
1076 1076
1077 return true; 1077 return true;
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs
index 4be3804..cf6d2f7 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs
@@ -297,14 +297,35 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
297 return m_LocalGridInventoryService.CreateUserInventory(userID); 297 return m_LocalGridInventoryService.CreateUserInventory(userID);
298 } 298 }
299 299
300 public List<InventoryFolderBase> GetInventorySkeleton(UUID userId) 300 public List<InventoryFolderBase> GetInventorySkeleton(UUID userID)
301 { 301 {
302 return m_LocalGridInventoryService.GetInventorySkeleton(userId); 302 string invURL = GetInventoryServiceURL(userID);
303
304 if (invURL == null) // not there, forward to local inventory connector to resolve
305 return m_LocalGridInventoryService.GetInventorySkeleton(userID);
306
307 IInventoryService connector = GetConnector(invURL);
308
309 return connector.GetInventorySkeleton(userID);
303 } 310 }
304 311
305 public InventoryCollection GetUserInventory(UUID userID) 312 public InventoryCollection GetUserInventory(UUID userID)
306 { 313 {
307 return null; 314 string invURL = GetInventoryServiceURL(userID);
315 m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetUserInventory for {0} {1}", userID, invURL);
316
317 if (invURL == null) // not there, forward to local inventory connector to resolve
318 return m_LocalGridInventoryService.GetUserInventory(userID);
319
320 InventoryCollection c = m_Cache.GetUserInventory(userID);
321 if (c != null)
322 return c;
323
324 IInventoryService connector = GetConnector(invURL);
325 c = connector.GetUserInventory(userID);
326
327 m_Cache.Cache(userID, c);
328 return c;
308 } 329 }
309 330
310 public void GetUserInventory(UUID userID, InventoryReceiptCallback callback) 331 public void GetUserInventory(UUID userID, InventoryReceiptCallback callback)
@@ -362,8 +383,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
362 if (invURL == null) // not there, forward to local inventory connector to resolve 383 if (invURL == null) // not there, forward to local inventory connector to resolve
363 return m_LocalGridInventoryService.GetFolderContent(userID, folderID); 384 return m_LocalGridInventoryService.GetFolderContent(userID, folderID);
364 385
365 IInventoryService connector = GetConnector(invURL); 386 InventoryCollection c = m_Cache.GetFolderContent(userID, folderID);
387 if (c != null)
388 {
389 m_log.Debug("[HG INVENTORY CONNECTOR]: GetFolderContent found content in cache " + folderID);
390 return c;
391 }
366 392
393 IInventoryService connector = GetConnector(invURL);
367 return connector.GetFolderContent(userID, folderID); 394 return connector.GetFolderContent(userID, folderID);
368 395
369 } 396 }
@@ -377,8 +404,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
377 if (invURL == null) // not there, forward to local inventory connector to resolve 404 if (invURL == null) // not there, forward to local inventory connector to resolve
378 return m_LocalGridInventoryService.GetFolderItems(userID, folderID); 405 return m_LocalGridInventoryService.GetFolderItems(userID, folderID);
379 406
380 IInventoryService connector = GetConnector(invURL); 407 List<InventoryItemBase> items = m_Cache.GetFolderItems(userID, folderID);
408 if (items != null)
409 {
410 m_log.Debug("[HG INVENTORY CONNECTOR]: GetFolderItems found items in cache " + folderID);
411 return items;
412 }
381 413
414 IInventoryService connector = GetConnector(invURL);
382 return connector.GetFolderItems(userID, folderID); 415 return connector.GetFolderItems(userID, folderID);
383 416
384 } 417 }
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs
index 0fe778d..1e434b9 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs
@@ -12,6 +12,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
12 12
13 private static ExpiringCache<UUID, InventoryFolderBase> m_RootFolders = new ExpiringCache<UUID, InventoryFolderBase>(); 13 private static ExpiringCache<UUID, InventoryFolderBase> m_RootFolders = new ExpiringCache<UUID, InventoryFolderBase>();
14 private static ExpiringCache<UUID, Dictionary<AssetType, InventoryFolderBase>> m_FolderTypes = new ExpiringCache<UUID, Dictionary<AssetType, InventoryFolderBase>>(); 14 private static ExpiringCache<UUID, Dictionary<AssetType, InventoryFolderBase>> m_FolderTypes = new ExpiringCache<UUID, Dictionary<AssetType, InventoryFolderBase>>();
15 private static ExpiringCache<UUID, InventoryCollection> m_Inventories = new ExpiringCache<UUID, InventoryCollection>();
15 16
16 public void Cache(UUID userID, InventoryFolderBase root) 17 public void Cache(UUID userID, InventoryFolderBase root)
17 { 18 {
@@ -55,5 +56,55 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
55 56
56 return null; 57 return null;
57 } 58 }
59
60 public void Cache(UUID userID, InventoryCollection inv)
61 {
62 lock (m_Inventories)
63 m_Inventories.AddOrUpdate(userID, inv, 120);
64 }
65
66 public InventoryCollection GetUserInventory(UUID userID)
67 {
68 InventoryCollection inv = null;
69 if (m_Inventories.TryGetValue(userID, out inv))
70 return inv;
71 return null;
72 }
73
74 public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
75 {
76 InventoryCollection inv = null;
77 InventoryCollection c;
78 if (m_Inventories.TryGetValue(userID, out inv))
79 {
80 c = new InventoryCollection();
81 c.UserID = userID;
82
83 c.Folders = inv.Folders.FindAll(delegate(InventoryFolderBase f)
84 {
85 return f.ParentID == folderID;
86 });
87 c.Items = inv.Items.FindAll(delegate(InventoryItemBase i)
88 {
89 return i.Folder == folderID;
90 });
91 return c;
92 }
93 return null;
94 }
95
96 public List<InventoryItemBase> GetFolderItems(UUID userID, UUID folderID)
97 {
98 InventoryCollection inv = null;
99 if (m_Inventories.TryGetValue(userID, out inv))
100 {
101 List<InventoryItemBase> items = inv.Items.FindAll(delegate(InventoryItemBase i)
102 {
103 return i.Folder == folderID;
104 });
105 return items;
106 }
107 return null;
108 }
58 } 109 }
59} 110}
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs
index 77573c3..990dffb 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs
@@ -172,7 +172,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
172 172
173 public InventoryCollection GetUserInventory(UUID userID) 173 public InventoryCollection GetUserInventory(UUID userID)
174 { 174 {
175 return null; 175 return m_RemoteConnector.GetUserInventory(userID);
176 } 176 }
177 177
178 public void GetUserInventory(UUID userID, InventoryReceiptCallback callback) 178 public void GetUserInventory(UUID userID, InventoryReceiptCallback callback)
@@ -193,16 +193,17 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
193 { 193 {
194 InventoryCollection invCol = m_RemoteConnector.GetFolderContent(userID, folderID); 194 InventoryCollection invCol = m_RemoteConnector.GetFolderContent(userID, folderID);
195 195
196 if (UserManager != null) 196 if (invCol != null && UserManager != null)
197 { 197 {
198 // Protect ourselves against the caller subsequently modifying the items list 198 // Protect ourselves against the caller subsequently modifying the items list
199 List<InventoryItemBase> items = new List<InventoryItemBase>(invCol.Items); 199 List<InventoryItemBase> items = new List<InventoryItemBase>(invCol.Items);
200 200
201 Util.FireAndForget(delegate 201 if (items != null && items.Count > 0)
202 { 202 Util.FireAndForget(delegate
203 foreach (InventoryItemBase item in items) 203 {
204 UserManager.AddUser(item.CreatorIdAsUuid, item.CreatorData); 204 foreach (InventoryItemBase item in items)
205 }); 205 UserManager.AddUser(item.CreatorIdAsUuid, item.CreatorData);
206 });
206 } 207 }
207 208
208 return invCol; 209 return invCol;
diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs
index 1f3f075..509c4d7 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs
@@ -464,7 +464,7 @@ namespace OpenSim.Region.CoreModules.World.Land
464 { 464 {
465 if (d.GroupID == LandData.GroupID) 465 if (d.GroupID == LandData.GroupID)
466 { 466 {
467 m_groupMemberCache.Add(avatar, false, m_groupMemberCacheTimeout); 467 m_groupMemberCache.Add(avatar, true, m_groupMemberCacheTimeout);
468 return true; 468 return true;
469 } 469 }
470 } 470 }
@@ -472,10 +472,7 @@ namespace OpenSim.Region.CoreModules.World.Land
472 return false; 472 return false;
473 } 473 }
474 474
475 if (!sp.ControllingClient.IsGroupMember(LandData.GroupID)) 475 return sp.ControllingClient.IsGroupMember(LandData.GroupID);
476 return false;
477
478 return true;
479 } 476 }
480 return false; 477 return false;
481 } 478 }
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs
index 741d233..2365cfe 100644
--- a/OpenSim/Region/Framework/Scenes/EventManager.cs
+++ b/OpenSim/Region/Framework/Scenes/EventManager.cs
@@ -506,6 +506,12 @@ namespace OpenSim.Region.Framework.Scenes
506 public delegate void PrimsLoaded(Scene s); 506 public delegate void PrimsLoaded(Scene s);
507 public event PrimsLoaded OnPrimsLoaded; 507 public event PrimsLoaded OnPrimsLoaded;
508 508
509 public delegate void TeleportStart(IClientAPI client, GridRegion destination, GridRegion finalDestination, uint teleportFlags, bool gridLogout);
510 public event TeleportStart OnTeleportStart;
511
512 public delegate void TeleportFail(IClientAPI client, bool gridLogout);
513 public event TeleportFail OnTeleportFail;
514
509 public class MoneyTransferArgs : EventArgs 515 public class MoneyTransferArgs : EventArgs
510 { 516 {
511 public UUID sender; 517 public UUID sender;
@@ -2487,5 +2493,48 @@ namespace OpenSim.Region.Framework.Scenes
2487 } 2493 }
2488 } 2494 }
2489 } 2495 }
2496
2497 public void TriggerTeleportStart(IClientAPI client, GridRegion destination, GridRegion finalDestination, uint teleportFlags, bool gridLogout)
2498 {
2499 TeleportStart handler = OnTeleportStart;
2500
2501 if (handler != null)
2502 {
2503 foreach (TeleportStart d in handler.GetInvocationList())
2504 {
2505 try
2506 {
2507 d(client, destination, finalDestination, teleportFlags, gridLogout);
2508 }
2509 catch (Exception e)
2510 {
2511 m_log.ErrorFormat("[EVENT MANAGER]: Delegate for TeleportStart failed - continuing {0} - {1}",
2512 e.Message, e.StackTrace);
2513 }
2514 }
2515 }
2516 }
2517
2518 public void TriggerTeleportFail(IClientAPI client, bool gridLogout)
2519 {
2520 TeleportFail handler = OnTeleportFail;
2521
2522 if (handler != null)
2523 {
2524 foreach (TeleportFail d in handler.GetInvocationList())
2525 {
2526 try
2527 {
2528 d(client, gridLogout);
2529 }
2530 catch (Exception e)
2531 {
2532 m_log.ErrorFormat("[EVENT MANAGER]: Delegate for TeleportFail failed - continuing {0} - {1}",
2533 e.Message, e.StackTrace);
2534 }
2535 }
2536 }
2537 }
2538
2490 } 2539 }
2491} 2540}
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 6cf1067..0089c7d 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -36,6 +36,7 @@ using OpenMetaverse.Packets;
36using log4net; 36using log4net;
37using OpenSim.Framework; 37using OpenSim.Framework;
38using OpenSim.Region.Framework; 38using OpenSim.Region.Framework;
39using OpenSim.Framework.Client;
39using OpenSim.Region.Framework.Interfaces; 40using OpenSim.Region.Framework.Interfaces;
40using OpenSim.Region.Framework.Scenes.Serialization; 41using OpenSim.Region.Framework.Scenes.Serialization;
41 42
@@ -117,20 +118,43 @@ namespace OpenSim.Region.Framework.Scenes
117 /// <param name="item"></param> 118 /// <param name="item"></param>
118 public bool AddInventoryItem(InventoryItemBase item) 119 public bool AddInventoryItem(InventoryItemBase item)
119 { 120 {
120 InventoryFolderBase folder; 121 if (item.Folder != UUID.Zero && InventoryService.AddItem(item))
121
122 if (item.Folder == UUID.Zero)
123 { 122 {
124 folder = InventoryService.GetFolderForType(item.Owner, (AssetType)item.AssetType); 123 int userlevel = 0;
125 if (folder == null) 124 if (Permissions.IsGod(item.Owner))
126 { 125 {
127 folder = InventoryService.GetRootFolder(item.Owner); 126 userlevel = 1;
128
129 if (folder == null)
130 return false;
131 } 127 }
128 EventManager.TriggerOnNewInventoryItemUploadComplete(item.Owner, item.AssetID, item.Name, userlevel);
129
130 return true;
131 }
132 132
133 item.Folder = folder.ID; 133 // OK so either the viewer didn't send a folderID or AddItem failed
134 UUID originalFolder = item.Folder;
135 InventoryFolderBase f = InventoryService.GetFolderForType(item.Owner, (AssetType)item.AssetType);
136 if (f != null)
137 {
138 m_log.DebugFormat(
139 "[AGENT INVENTORY]: Found folder {0} type {1} for item {2}",
140 f.Name, (AssetType)f.Type, item.Name);
141
142 item.Folder = f.ID;
143 }
144 else
145 {
146 f = InventoryService.GetRootFolder(item.Owner);
147 if (f != null)
148 {
149 item.Folder = f.ID;
150 }
151 else
152 {
153 m_log.WarnFormat(
154 "[AGENT INVENTORY]: Could not find root folder for {0} when trying to add item {1} with no parent folder specified",
155 item.Owner, item.Name);
156 return false;
157 }
134 } 158 }
135 159
136 if (InventoryService.AddItem(item)) 160 if (InventoryService.AddItem(item))
@@ -141,7 +165,13 @@ namespace OpenSim.Region.Framework.Scenes
141 userlevel = 1; 165 userlevel = 1;
142 } 166 }
143 EventManager.TriggerOnNewInventoryItemUploadComplete(item.Owner, item.AssetID, item.Name, userlevel); 167 EventManager.TriggerOnNewInventoryItemUploadComplete(item.Owner, item.AssetID, item.Name, userlevel);
144 168
169 if (originalFolder != UUID.Zero)
170 {
171 // Tell the viewer that the item didn't go there
172 ChangePlacement(item, f);
173 }
174
145 return true; 175 return true;
146 } 176 }
147 else 177 else
@@ -153,7 +183,32 @@ namespace OpenSim.Region.Framework.Scenes
153 return false; 183 return false;
154 } 184 }
155 } 185 }
156 186
187 private void ChangePlacement(InventoryItemBase item, InventoryFolderBase f)
188 {
189 ScenePresence sp = GetScenePresence(item.Owner);
190 if (sp != null)
191 {
192 if (sp.ControllingClient is IClientCore)
193 {
194 IClientCore core = (IClientCore)sp.ControllingClient;
195 IClientInventory inv;
196
197 if (core.TryGet<IClientInventory>(out inv))
198 {
199 InventoryFolderBase parent = new InventoryFolderBase(f.ParentID, f.Owner);
200 parent = InventoryService.GetFolder(parent);
201 inv.SendRemoveInventoryItems(new UUID[] { item.ID });
202 inv.SendBulkUpdateInventory(new InventoryFolderBase[0], new InventoryItemBase[] { item });
203 string message = "The item was placed in folder " + f.Name;
204 if (parent != null)
205 message += " under " + parent.Name;
206 sp.ControllingClient.SendAgentAlertMessage(message, false);
207 }
208 }
209 }
210 }
211
157 /// <summary> 212 /// <summary>
158 /// Add the given inventory item to a user's inventory. 213 /// Add the given inventory item to a user's inventory.
159 /// </summary> 214 /// </summary>
@@ -2085,7 +2140,7 @@ namespace OpenSim.Region.Framework.Scenes
2085 item.CreationDate = Util.UnixTimeSinceEpoch(); 2140 item.CreationDate = Util.UnixTimeSinceEpoch();
2086 2141
2087 // sets itemID so client can show item as 'attached' in inventory 2142 // sets itemID so client can show item as 'attached' in inventory
2088 grp.SetFromItemID(item.ID); 2143 grp.FromItemID = item.ID;
2089 2144
2090 if (AddInventoryItem(item)) 2145 if (AddInventoryItem(item))
2091 remoteClient.SendInventoryItemCreateUpdate(item, 0); 2146 remoteClient.SendInventoryItemCreateUpdate(item, 0);
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index df37b98..a34079c 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2248,12 +2248,6 @@ namespace OpenSim.Region.Framework.Scenes
2248 part.RemoveFromPhysics(); 2248 part.RemoveFromPhysics();
2249 } 2249 }
2250 } 2250 }
2251
2252// if (rootPart.PhysActor != null)
2253// {
2254// PhysicsScene.RemovePrim(rootPart.PhysActor);
2255// rootPart.PhysActor = null;
2256// }
2257 2251
2258 if (UnlinkSceneObject(group, false)) 2252 if (UnlinkSceneObject(group, false))
2259 { 2253 {
@@ -2668,7 +2662,7 @@ namespace OpenSim.Region.Framework.Scenes
2668 SceneObjectGroup grp = sceneObject; 2662 SceneObjectGroup grp = sceneObject;
2669 2663
2670 m_log.DebugFormat( 2664 m_log.DebugFormat(
2671 "[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.GetFromItemID(), grp.UUID); 2665 "[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.FromItemID, grp.UUID);
2672 m_log.DebugFormat( 2666 m_log.DebugFormat(
2673 "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition); 2667 "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition);
2674 2668
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 54e8d50..107d9b6 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -775,7 +775,9 @@ namespace OpenSim.Region.Framework.Scenes
775 set { m_LoopSoundSlavePrims = value; } 775 set { m_LoopSoundSlavePrims = value; }
776 } 776 }
777 777
778 // The UUID for the Region this Object is in. 778 /// <summary>
779 /// The UUID for the region this object is in.
780 /// </summary>
779 public UUID RegionUUID 781 public UUID RegionUUID
780 { 782 {
781 get 783 get
@@ -788,6 +790,22 @@ namespace OpenSim.Region.Framework.Scenes
788 } 790 }
789 } 791 }
790 792
793 /// <summary>
794 /// The item ID that this object was rezzed from, if applicable.
795 /// </summary>
796 /// <remarks>
797 /// If not applicable will be UUID.Zero
798 /// </remarks>
799 public UUID FromItemID { get; set; }
800
801 /// <summary>
802 /// The folder ID that this object was rezzed from, if applicable.
803 /// </summary>
804 /// <remarks>
805 /// If not applicable will be UUID.Zero
806 /// </remarks>
807 public UUID FromFolderID { get; set; }
808
791 #endregion 809 #endregion
792 810
793// ~SceneObjectGroup() 811// ~SceneObjectGroup()
@@ -851,18 +869,6 @@ namespace OpenSim.Region.Framework.Scenes
851 } 869 }
852 } 870 }
853 871
854 public void SetFromItemID(UUID AssetId)
855 {
856 SceneObjectPart[] parts = m_parts.GetArray();
857 for (int i = 0; i < parts.Length; i++)
858 parts[i].FromItemID = AssetId;
859 }
860
861 public UUID GetFromItemID()
862 {
863 return m_rootPart.FromItemID;
864 }
865
866 /// <summary> 872 /// <summary>
867 /// Hooks this object up to the backup event so that it is persisted to the database when the update thread executes. 873 /// Hooks this object up to the backup event so that it is persisted to the database when the update thread executes.
868 /// </summary> 874 /// </summary>
@@ -1498,7 +1504,7 @@ namespace OpenSim.Region.Framework.Scenes
1498 return; 1504 return;
1499 1505
1500 detachedpos = avatar.AbsolutePosition; 1506 detachedpos = avatar.AbsolutePosition;
1501 RootPart.FromItemID = UUID.Zero; 1507 FromItemID = UUID.Zero;
1502 1508
1503 AbsolutePosition = detachedpos; 1509 AbsolutePosition = detachedpos;
1504 AttachedAvatar = UUID.Zero; 1510 AttachedAvatar = UUID.Zero;
@@ -3379,6 +3385,7 @@ namespace OpenSim.Region.Framework.Scenes
3379 { 3385 {
3380 m_rootPart.AttachedPos = pos; 3386 m_rootPart.AttachedPos = pos;
3381 } 3387 }
3388
3382 if (RootPart.GetStatusSandbox()) 3389 if (RootPart.GetStatusSandbox())
3383 { 3390 {
3384 if (Util.GetDistanceTo(RootPart.StatusSandboxPos, pos) > 10) 3391 if (Util.GetDistanceTo(RootPart.StatusSandboxPos, pos) > 10)
@@ -3389,8 +3396,8 @@ namespace OpenSim.Region.Framework.Scenes
3389 ChatTypeEnum.DebugChannel, 0x7FFFFFFF, RootPart.AbsolutePosition, Name, UUID, false); 3396 ChatTypeEnum.DebugChannel, 0x7FFFFFFF, RootPart.AbsolutePosition, Name, UUID, false);
3390 } 3397 }
3391 } 3398 }
3392 AbsolutePosition = pos;
3393 3399
3400 AbsolutePosition = pos;
3394 HasGroupChanged = true; 3401 HasGroupChanged = true;
3395 } 3402 }
3396 3403
@@ -4032,7 +4039,7 @@ namespace OpenSim.Region.Framework.Scenes
4032 4039
4033 public virtual string ExtraToXmlString() 4040 public virtual string ExtraToXmlString()
4034 { 4041 {
4035 return "<ExtraFromItemID>" + GetFromItemID().ToString() + "</ExtraFromItemID>"; 4042 return "<ExtraFromItemID>" + FromItemID.ToString() + "</ExtraFromItemID>";
4036 } 4043 }
4037 4044
4038 public virtual void ExtraFromXmlString(string xmlstr) 4045 public virtual void ExtraFromXmlString(string xmlstr)
@@ -4044,7 +4051,7 @@ namespace OpenSim.Region.Framework.Scenes
4044 UUID uuid = UUID.Zero; 4051 UUID uuid = UUID.Zero;
4045 UUID.TryParse(id, out uuid); 4052 UUID.TryParse(id, out uuid);
4046 4053
4047 SetFromItemID(uuid); 4054 FromItemID = uuid;
4048 } 4055 }
4049 4056
4050 public void ResetOwnerChangeFlag() 4057 public void ResetOwnerChangeFlag()
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 951e987..969ddaf 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -126,12 +126,14 @@ namespace OpenSim.Region.Framework.Scenes
126 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 126 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
127 127
128 /// <value> 128 /// <value>
129 /// Is this sop a root part? 129 /// Is this a root part?
130 /// </value> 130 /// </value>
131 131 /// <remarks>
132 /// This will return true even if the whole object is attached to an avatar.
133 /// </remarks>
132 public bool IsRoot 134 public bool IsRoot
133 { 135 {
134 get { return ParentGroup.RootPart == this; } 136 get { return ParentGroup.RootPart == this; }
135 } 137 }
136 138
137 #region Fields 139 #region Fields
@@ -160,15 +162,7 @@ namespace OpenSim.Region.Framework.Scenes
160 /// If another thread is simultaneously turning physics off on this part then this refernece could become 162 /// If another thread is simultaneously turning physics off on this part then this refernece could become
161 /// null at any time. 163 /// null at any time.
162 /// </remarks> 164 /// </remarks>
163 public PhysicsActor PhysActor 165 public PhysicsActor PhysActor { get; set; }
164 {
165 get { return m_physActor; }
166 set
167 {
168// m_log.DebugFormat("[SOP]: PhysActor set to {0} for {1} {2}", value, Name, UUID);
169 m_physActor = value;
170 }
171 }
172 166
173 //Xantor 20080528 Sound stuff: 167 //Xantor 20080528 Sound stuff:
174 // Note: This isn't persisted in the database right now, as the fields for that aren't just there yet. 168 // Note: This isn't persisted in the database right now, as the fields for that aren't just there yet.
@@ -188,10 +182,6 @@ namespace OpenSim.Region.Framework.Scenes
188 public uint TimeStampLastActivity; // Will be used for AutoReturn 182 public uint TimeStampLastActivity; // Will be used for AutoReturn
189 183
190 public uint TimeStampTerse; 184 public uint TimeStampTerse;
191
192 public UUID FromItemID;
193
194 public UUID FromFolderID;
195 185
196 // The following two are to hold the attachment data 186 // The following two are to hold the attachment data
197 // while an object is inworld 187 // while an object is inworld
@@ -275,7 +265,6 @@ namespace OpenSim.Region.Framework.Scenes
275 265
276 private bool m_passTouches; 266 private bool m_passTouches;
277 267
278 private PhysicsActor m_physActor;
279 protected Vector3 m_acceleration; 268 protected Vector3 m_acceleration;
280 protected Vector3 m_angularVelocity; 269 protected Vector3 m_angularVelocity;
281 270
@@ -1149,6 +1138,14 @@ namespace OpenSim.Region.Framework.Scenes
1149 } 1138 }
1150 } 1139 }
1151 1140
1141 /// <summary>
1142 /// The parent ID of this part.
1143 /// </summary>
1144 /// <remarks>
1145 /// If this is a root part which is not attached to an avatar then the value will be 0.
1146 /// If this is a root part which is attached to an avatar then the value is the local id of that avatar.
1147 /// If this is a child part then the value is the local ID of the root part.
1148 /// </remarks>
1152 public uint ParentID 1149 public uint ParentID
1153 { 1150 {
1154 get { return _parentID; } 1151 get { return _parentID; }
@@ -1847,9 +1844,6 @@ namespace OpenSim.Region.Framework.Scenes
1847// if (VolumeDetectActive) 1844// if (VolumeDetectActive)
1848// isPhantom = false; 1845// isPhantom = false;
1849 1846
1850 // Added clarification.. since A rigid body is an object that you can kick around, etc.
1851// bool RigidBody = isPhysical && !isPhantom;
1852
1853 // The only time the physics scene shouldn't know about the prim is if it's phantom or an attachment, which is phantom by definition 1847 // The only time the physics scene shouldn't know about the prim is if it's phantom or an attachment, which is phantom by definition
1854 // or flexible 1848 // or flexible
1855 // if (!isPhantom && !ParentGroup.IsAttachment && !(Shape.PathCurve == (byte)Extrusion.Flexible)) 1849 // if (!isPhantom && !ParentGroup.IsAttachment && !(Shape.PathCurve == (byte)Extrusion.Flexible))
@@ -1876,7 +1870,6 @@ namespace OpenSim.Region.Framework.Scenes
1876 PhysActor = null; 1870 PhysActor = null;
1877 } 1871 }
1878 1872
1879 // Basic Physics can also return null as well as an exception catch.
1880 PhysicsActor pa = PhysActor; 1873 PhysicsActor pa = PhysActor;
1881 1874
1882 if (pa != null) 1875 if (pa != null)
@@ -4859,7 +4852,52 @@ namespace OpenSim.Region.Framework.Scenes
4859 } 4852 }
4860 4853
4861 /// <summary> 4854 /// <summary>
4862 /// This removes the part from physics 4855 /// Adds this part to the physics scene.
4856 /// </summary>
4857 /// <remarks>This method also sets the PhysActor property.</remarks>
4858 /// <param name="rigidBody">Add this prim with a rigid body.</param>
4859 /// <returns>
4860 /// The physics actor. null if there was a failure.
4861 /// </returns>
4862 private PhysicsActor AddToPhysics(bool rigidBody)
4863 {
4864 PhysicsActor pa;
4865
4866 try
4867 {
4868 pa = ParentGroup.Scene.PhysicsScene.AddPrimShape(
4869 string.Format("{0}/{1}", Name, UUID),
4870 Shape,
4871 AbsolutePosition,
4872 Scale,
4873 RotationOffset,
4874 rigidBody,
4875 m_localId);
4876 }
4877 catch
4878 {
4879 m_log.ErrorFormat("[SCENE]: caught exception meshing object {0}. Object set to phantom.", m_uuid);
4880 pa = null;
4881 }
4882
4883 // FIXME: Ideally we wouldn't set the property here to reduce situations where threads changing physical
4884 // properties can stop on each other. However, DoPhysicsPropertyUpdate() currently relies on PhysActor
4885 // being set.
4886 PhysActor = pa;
4887
4888 // Basic Physics can also return null as well as an exception catch.
4889 if (pa != null)
4890 {
4891 pa.SOPName = this.Name; // save object into the PhysActor so ODE internals know the joint/body info
4892 pa.SetMaterial(Material);
4893 DoPhysicsPropertyUpdate(rigidBody, true);
4894 }
4895
4896 return pa;
4897 }
4898
4899 /// <summary>
4900 /// This removes the part from the physics scene.
4863 /// </summary> 4901 /// </summary>
4864 /// <remarks> 4902 /// <remarks>
4865 /// This isn't the same as turning off physical, since even without being physical the prim has a physics 4903 /// This isn't the same as turning off physical, since even without being physical the prim has a physics
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index ed3a7f1..b51d41b 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -3617,6 +3617,22 @@ namespace OpenSim.Region.Framework.Scenes
3617 }); 3617 });
3618 } 3618 }
3619 3619
3620 /// <summary>
3621 /// Gets the mass.
3622 /// </summary>
3623 /// <returns>
3624 /// The mass.
3625 /// </returns>
3626 public float GetMass()
3627 {
3628 PhysicsActor pa = PhysicsActor;
3629
3630 if (pa != null)
3631 return pa.Mass;
3632 else
3633 return 0;
3634 }
3635
3620 internal void PushForce(Vector3 impulse) 3636 internal void PushForce(Vector3 impulse)
3621 { 3637 {
3622 if (PhysicsActor != null) 3638 if (PhysicsActor != null)
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
index 9ff3652..65bd26c 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
@@ -1294,7 +1294,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1294 1294
1295 OnAgentDataUpdateRequest(remoteClient, dataForAgentID, UUID.Zero); 1295 OnAgentDataUpdateRequest(remoteClient, dataForAgentID, UUID.Zero);
1296 1296
1297
1298 // Need to send a group membership update to the client 1297 // Need to send a group membership update to the client
1299 // UDP version doesn't seem to behave nicely. But we're going to send it out here 1298 // UDP version doesn't seem to behave nicely. But we're going to send it out here
1300 // with an empty group membership to hopefully remove groups being displayed due 1299 // with an empty group membership to hopefully remove groups being displayed due
@@ -1305,6 +1304,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1305 SendGroupMembershipInfoViaCaps(remoteClient, dataForAgentID, membershipArray); 1304 SendGroupMembershipInfoViaCaps(remoteClient, dataForAgentID, membershipArray);
1306 remoteClient.SendAvatarGroupsReply(dataForAgentID, membershipArray); 1305 remoteClient.SendAvatarGroupsReply(dataForAgentID, membershipArray);
1307 1306
1307 if (remoteClient.AgentId == dataForAgentID)
1308 remoteClient.RefreshGroupMembership();
1308 } 1309 }
1309 1310
1310 /// <summary> 1311 /// <summary>
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 5268ade..7cf284d 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -2271,11 +2271,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2271 protected LSL_Vector GetPartLocalPos(SceneObjectPart part) 2271 protected LSL_Vector GetPartLocalPos(SceneObjectPart part)
2272 { 2272 {
2273 m_host.AddScriptLPS(1); 2273 m_host.AddScriptLPS(1);
2274 if (part.ParentID == 0) 2274
2275 Vector3 pos;
2276
2277 if (!part.IsRoot)
2275 { 2278 {
2276 return new LSL_Vector(part.AbsolutePosition.X, 2279 pos = part.OffsetPosition;
2277 part.AbsolutePosition.Y,
2278 part.AbsolutePosition.Z);
2279 } 2280 }
2280 else 2281 else
2281 { 2282 {
@@ -2287,11 +2288,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2287 } 2288 }
2288 else 2289 else
2289 { 2290 {
2290 return new LSL_Vector(part.OffsetPosition.X, 2291 pos = part.AbsolutePosition;
2291 part.OffsetPosition.Y,
2292 part.OffsetPosition.Z);
2293 } 2292 }
2294 } 2293 }
2294
2295// m_log.DebugFormat("[LSL API]: Returning {0} in GetPartLocalPos()", pos);
2296
2297 return new LSL_Vector(pos.X, pos.Y, pos.Z);
2295 } 2298 }
2296 2299
2297 public void llSetRot(LSL_Rotation rot) 2300 public void llSetRot(LSL_Rotation rot)
@@ -3165,7 +3168,31 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3165 public LSL_Float llGetMass() 3168 public LSL_Float llGetMass()
3166 { 3169 {
3167 m_host.AddScriptLPS(1); 3170 m_host.AddScriptLPS(1);
3168 return m_host.GetMass(); 3171
3172 if (m_host.ParentGroup.IsAttachment)
3173 {
3174 ScenePresence attachedAvatar = World.GetScenePresence(m_host.ParentGroup.AttachedAvatar);
3175
3176 if (attachedAvatar != null)
3177 {
3178 return attachedAvatar.GetMass();
3179 }
3180 else
3181 {
3182 return 0;
3183 }
3184 }
3185 else
3186 {
3187 if (m_host.IsRoot)
3188 {
3189 return m_host.ParentGroup.GetMass();
3190 }
3191 else
3192 {
3193 return m_host.GetMass();
3194 }
3195 }
3169 } 3196 }
3170 3197
3171 public void llCollisionFilter(string name, string id, int accept) 3198 public void llCollisionFilter(string name, string id, int accept)
@@ -3334,7 +3361,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3334 SceneObjectPart host = (SceneObjectPart)o; 3361 SceneObjectPart host = (SceneObjectPart)o;
3335 3362
3336 SceneObjectGroup grp = host.ParentGroup; 3363 SceneObjectGroup grp = host.ParentGroup;
3337 UUID itemID = grp.GetFromItemID(); 3364 UUID itemID = grp.FromItemID;
3338 ScenePresence presence = World.GetScenePresence(host.OwnerID); 3365 ScenePresence presence = World.GetScenePresence(host.OwnerID);
3339 3366
3340 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; 3367 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
@@ -7782,14 +7809,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7782 switch (code) 7809 switch (code)
7783 { 7810 {
7784 case (int)ScriptBaseClass.PRIM_POSITION: 7811 case (int)ScriptBaseClass.PRIM_POSITION:
7785 if (remain < 1)
7786 return;
7787
7788 v=rules.GetVector3Item(idx++);
7789 positionChanged = true;
7790 currentPosition = GetSetPosTarget(part, v, currentPosition);
7791
7792 break;
7793 case (int)ScriptBaseClass.PRIM_POS_LOCAL: 7812 case (int)ScriptBaseClass.PRIM_POS_LOCAL:
7794 if (remain < 1) 7813 if (remain < 1)
7795 return; 7814 return;
@@ -11154,6 +11173,35 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11154 case ScriptBaseClass.OBJECT_CREATOR: 11173 case ScriptBaseClass.OBJECT_CREATOR:
11155 ret.Add(new LSL_String(UUID.Zero.ToString())); 11174 ret.Add(new LSL_String(UUID.Zero.ToString()));
11156 break; 11175 break;
11176 // For the following 8 see the Object version below
11177 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT:
11178 ret.Add(new LSL_Integer(0));
11179 break;
11180 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT:
11181 ret.Add(new LSL_Integer(0));
11182 break;
11183 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY:
11184 ret.Add(new LSL_Integer(0));
11185 break;
11186 case ScriptBaseClass.OBJECT_SCRIPT_TIME:
11187 ret.Add(new LSL_Float(0));
11188 break;
11189 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE:
11190 ret.Add(new LSL_Integer(0));
11191 break;
11192 case ScriptBaseClass.OBJECT_SERVER_COST:
11193 ret.Add(new LSL_Float(0));
11194 break;
11195 case ScriptBaseClass.OBJECT_STREAMING_COST:
11196 ret.Add(new LSL_Float(0));
11197 break;
11198 case ScriptBaseClass.OBJECT_PHYSICS_COST:
11199 ret.Add(new LSL_Float(0));
11200 break;
11201 default:
11202 // Invalid or unhandled constant.
11203 ret.Add(new LSL_Integer(ScriptBaseClass.OBJECT_UNKNOWN_DETAIL));
11204 break;
11157 } 11205 }
11158 } 11206 }
11159 11207
@@ -11191,6 +11239,49 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11191 case ScriptBaseClass.OBJECT_CREATOR: 11239 case ScriptBaseClass.OBJECT_CREATOR:
11192 ret.Add(new LSL_String(obj.CreatorID.ToString())); 11240 ret.Add(new LSL_String(obj.CreatorID.ToString()));
11193 break; 11241 break;
11242 // The following 8 I have intentionaly coded to return zero. They are part of
11243 // "Land Impact" calculations. These calculations are probably not applicable
11244 // to OpenSim, required figures (cpu/memory usage) are not currently tracked
11245 // I have intentionally left these all at zero rather than return possibly
11246 // missleading numbers
11247 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT:
11248 // in SL this currently includes crashed scripts
11249 ret.Add(new LSL_Integer(0));
11250 break;
11251 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT:
11252 ret.Add(new LSL_Integer(0));
11253 break;
11254 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY:
11255 // The value returned in SL for mono scripts is 65536 * number of active scripts
11256 ret.Add(new LSL_Integer(0));
11257 break;
11258 case ScriptBaseClass.OBJECT_SCRIPT_TIME:
11259 // Average cpu time per simulator frame expended on all scripts in the objetc
11260 ret.Add(new LSL_Float(0));
11261 break;
11262 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE:
11263 // according to the SL wiki A prim or linkset will have prim
11264 // equivalent of the number of prims in a linkset if it does not
11265 // contain a mesh anywhere in the link set or is not a normal prim
11266 // The value returned in SL for normal prims is prim count
11267 ret.Add(new LSL_Integer(0));
11268 break;
11269 case ScriptBaseClass.OBJECT_SERVER_COST:
11270 // The value returned in SL for normal prims is prim count
11271 ret.Add(new LSL_Float(0));
11272 break;
11273 case ScriptBaseClass.OBJECT_STREAMING_COST:
11274 // The value returned in SL for normal prims is prim count * 0.06
11275 ret.Add(new LSL_Float(0));
11276 break;
11277 case ScriptBaseClass.OBJECT_PHYSICS_COST:
11278 // The value returned in SL for normal prims is prim count
11279 ret.Add(new LSL_Float(0));
11280 break;
11281 default:
11282 // Invalid or unhandled constant.
11283 ret.Add(new LSL_Integer(ScriptBaseClass.OBJECT_UNKNOWN_DETAIL));
11284 break;
11194 } 11285 }
11195 } 11286 }
11196 11287
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
index 4ce3cf1..6246b57 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
@@ -481,6 +481,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
481 public const int DEBUG_CHANNEL = 0x7FFFFFFF; 481 public const int DEBUG_CHANNEL = 0x7FFFFFFF;
482 public const int PUBLIC_CHANNEL = 0x00000000; 482 public const int PUBLIC_CHANNEL = 0x00000000;
483 483
484 // Constants for llGetObjectDetails
485 public const int OBJECT_UNKNOWN_DETAIL = -1;
484 public const int OBJECT_NAME = 1; 486 public const int OBJECT_NAME = 1;
485 public const int OBJECT_DESC = 2; 487 public const int OBJECT_DESC = 2;
486 public const int OBJECT_POS = 3; 488 public const int OBJECT_POS = 3;
@@ -489,6 +491,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
489 public const int OBJECT_OWNER = 6; 491 public const int OBJECT_OWNER = 6;
490 public const int OBJECT_GROUP = 7; 492 public const int OBJECT_GROUP = 7;
491 public const int OBJECT_CREATOR = 8; 493 public const int OBJECT_CREATOR = 8;
494 public const int OBJECT_RUNNING_SCRIPT_COUNT = 9;
495 public const int OBJECT_TOTAL_SCRIPT_COUNT = 10;
496 public const int OBJECT_SCRIPT_MEMORY = 11;
497 public const int OBJECT_SCRIPT_TIME = 12;
498 public const int OBJECT_PRIM_EQUIVALENCE = 13;
499 public const int OBJECT_SERVER_COST = 14;
500 public const int OBJECT_STREAMING_COST = 15;
501 public const int OBJECT_PHYSICS_COST = 16;
492 502
493 // Can not be public const? 503 // Can not be public const?
494 public static readonly vector ZERO_VECTOR = new vector(0.0, 0.0, 0.0); 504 public static readonly vector ZERO_VECTOR = new vector(0.0, 0.0, 0.0);
diff --git a/OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs b/OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs
index 040c840..cb9b65d 100644
--- a/OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs
+++ b/OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs
@@ -114,6 +114,8 @@ namespace OpenSim.Server.Handlers.Asset
114 return HandleCreateUserInventory(request); 114 return HandleCreateUserInventory(request);
115 case "GETINVENTORYSKELETON": 115 case "GETINVENTORYSKELETON":
116 return HandleGetInventorySkeleton(request); 116 return HandleGetInventorySkeleton(request);
117 case "GETUSERINVENTORY":
118 return HandleGetUserInventory(request);
117 case "GETROOTFOLDER": 119 case "GETROOTFOLDER":
118 return HandleGetRootFolder(request); 120 return HandleGetRootFolder(request);
119 case "GETFOLDERFORTYPE": 121 case "GETFOLDERFORTYPE":
@@ -153,7 +155,7 @@ namespace OpenSim.Server.Handlers.Asset
153 } 155 }
154 catch (Exception e) 156 catch (Exception e)
155 { 157 {
156 m_log.DebugFormat("[XINVENTORY HANDLER]: Exception {0}", e); 158 m_log.DebugFormat("[XINVENTORY HANDLER]: Exception {0}", e.StackTrace);
157 } 159 }
158 160
159 return FailureResult(); 161 return FailureResult();
@@ -248,6 +250,45 @@ namespace OpenSim.Server.Handlers.Asset
248 return encoding.GetBytes(xmlString); 250 return encoding.GetBytes(xmlString);
249 } 251 }
250 252
253 byte[] HandleGetUserInventory(Dictionary<string, object> request)
254 {
255 Dictionary<string, object> result = new Dictionary<string, object>();
256 UUID principal = UUID.Zero;
257 UUID.TryParse(request["PRINCIPAL"].ToString(), out principal);
258
259 InventoryCollection icoll = m_InventoryService.GetUserInventory(principal);
260 if (icoll != null)
261 {
262 Dictionary<string, object> folders = new Dictionary<string, object>();
263 int i = 0;
264 if (icoll.Folders != null)
265 {
266 foreach (InventoryFolderBase f in icoll.Folders)
267 {
268 folders["folder_" + i.ToString()] = EncodeFolder(f);
269 i++;
270 }
271 result["FOLDERS"] = folders;
272 }
273 if (icoll.Items != null)
274 {
275 i = 0;
276 Dictionary<string, object> items = new Dictionary<string, object>();
277 foreach (InventoryItemBase it in icoll.Items)
278 {
279 items["item_" + i.ToString()] = EncodeItem(it);
280 i++;
281 }
282 result["ITEMS"] = items;
283 }
284 }
285
286 string xmlString = ServerUtils.BuildXmlResponse(result);
287 //m_log.DebugFormat("[XXX]: resp string: {0}", xmlString);
288 UTF8Encoding encoding = new UTF8Encoding();
289 return encoding.GetBytes(xmlString);
290 }
291
251 byte[] HandleGetRootFolder(Dictionary<string,object> request) 292 byte[] HandleGetRootFolder(Dictionary<string,object> request)
252 { 293 {
253 Dictionary<string,object> result = new Dictionary<string,object>(); 294 Dictionary<string,object> result = new Dictionary<string,object>();
@@ -293,22 +334,27 @@ namespace OpenSim.Server.Handlers.Asset
293 if (icoll != null) 334 if (icoll != null)
294 { 335 {
295 Dictionary<string, object> folders = new Dictionary<string, object>(); 336 Dictionary<string, object> folders = new Dictionary<string, object>();
296 int i = 0; 337 int i = 0;
297 foreach (InventoryFolderBase f in icoll.Folders) 338 if (icoll.Folders != null)
298 { 339 {
299 folders["folder_" + i.ToString()] = EncodeFolder(f); 340 foreach (InventoryFolderBase f in icoll.Folders)
300 i++; 341 {
342 folders["folder_" + i.ToString()] = EncodeFolder(f);
343 i++;
344 }
345 result["FOLDERS"] = folders;
301 } 346 }
302 result["FOLDERS"] = folders; 347 if (icoll.Items != null)
303
304 i = 0;
305 Dictionary<string, object> items = new Dictionary<string, object>();
306 foreach (InventoryItemBase it in icoll.Items)
307 { 348 {
308 items["item_" + i.ToString()] = EncodeItem(it); 349 i = 0;
309 i++; 350 Dictionary<string, object> items = new Dictionary<string, object>();
351 foreach (InventoryItemBase it in icoll.Items)
352 {
353 items["item_" + i.ToString()] = EncodeItem(it);
354 i++;
355 }
356 result["ITEMS"] = items;
310 } 357 }
311 result["ITEMS"] = items;
312 } 358 }
313 359
314 string xmlString = ServerUtils.BuildXmlResponse(result); 360 string xmlString = ServerUtils.BuildXmlResponse(result);
diff --git a/OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs b/OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs
index 39e983b..9d96703 100644
--- a/OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs
+++ b/OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs
@@ -111,19 +111,21 @@ namespace OpenSim.Services.Connectors
111 if (ret.Count == 0) 111 if (ret.Count == 0)
112 return null; 112 return null;
113 113
114 List<InventoryFolderBase> folders = new List<InventoryFolderBase>(); 114 Dictionary<string, object> folders = (Dictionary<string, object>)ret["FOLDERS"];
115
116 List<InventoryFolderBase> fldrs = new List<InventoryFolderBase>();
115 117
116 try 118 try
117 { 119 {
118 foreach (Object o in ret.Values) 120 foreach (Object o in folders.Values)
119 folders.Add(BuildFolder((Dictionary<string, object>)o)); 121 fldrs.Add(BuildFolder((Dictionary<string, object>)o));
120 } 122 }
121 catch (Exception e) 123 catch (Exception e)
122 { 124 {
123 m_log.DebugFormat("[XINVENTORY CONNECTOR STUB]: Exception unwrapping folder list: {0}", e.Message); 125 m_log.DebugFormat("[XINVENTORY CONNECTOR STUB]: Exception unwrapping folder list: {0}", e.Message);
124 } 126 }
125 127
126 return folders; 128 return fldrs;
127 } 129 }
128 130
129 public InventoryFolderBase GetRootFolder(UUID principalID) 131 public InventoryFolderBase GetRootFolder(UUID principalID)
@@ -492,12 +494,41 @@ namespace OpenSim.Services.Connectors
492 return int.Parse(ret["RESULT"].ToString()); 494 return int.Parse(ret["RESULT"].ToString());
493 } 495 }
494 496
495
496 // These are either obsolete or unused
497 //
498 public InventoryCollection GetUserInventory(UUID principalID) 497 public InventoryCollection GetUserInventory(UUID principalID)
499 { 498 {
500 return null; 499 InventoryCollection inventory = new InventoryCollection();
500 inventory.Folders = new List<InventoryFolderBase>();
501 inventory.Items = new List<InventoryItemBase>();
502 inventory.UserID = principalID;
503
504 try
505 {
506 Dictionary<string, object> ret = MakeRequest("GETUSERINVENTORY",
507 new Dictionary<string, object> {
508 { "PRINCIPAL", principalID.ToString() }
509 });
510
511 if (ret == null)
512 return null;
513 if (ret.Count == 0)
514 return null;
515
516 Dictionary<string, object> folders =
517 (Dictionary<string, object>)ret["FOLDERS"];
518 Dictionary<string, object> items =
519 (Dictionary<string, object>)ret["ITEMS"];
520
521 foreach (Object o in folders.Values) // getting the values directly, we don't care about the keys folder_i
522 inventory.Folders.Add(BuildFolder((Dictionary<string, object>)o));
523 foreach (Object o in items.Values) // getting the values directly, we don't care about the keys item_i
524 inventory.Items.Add(BuildItem((Dictionary<string, object>)o));
525 }
526 catch (Exception e)
527 {
528 m_log.DebugFormat("[XINVENTORY CONNECTOR STUB]: Exception in GetUserInventory: {0}", e.Message);
529 }
530
531 return inventory;
501 } 532 }
502 533
503 public void GetUserInventory(UUID principalID, InventoryReceiptCallback callback) 534 public void GetUserInventory(UUID principalID, InventoryReceiptCallback callback)
diff --git a/OpenSim/Services/HypergridService/HGInventoryService.cs b/OpenSim/Services/HypergridService/HGInventoryService.cs
index b29d803..2e9bd40 100644
--- a/OpenSim/Services/HypergridService/HGInventoryService.cs
+++ b/OpenSim/Services/HypergridService/HGInventoryService.cs
@@ -105,6 +105,12 @@ namespace OpenSim.Services.HypergridService
105 return new List<InventoryFolderBase>(); 105 return new List<InventoryFolderBase>();
106 } 106 }
107 107
108 public override InventoryCollection GetUserInventory(UUID userID)
109 {
110 // NOGO for this inventory service
111 return null;
112 }
113
108 public override InventoryFolderBase GetRootFolder(UUID principalID) 114 public override InventoryFolderBase GetRootFolder(UUID principalID)
109 { 115 {
110 //m_log.DebugFormat("[HG INVENTORY SERVICE]: GetRootFolder for {0}", principalID); 116 //m_log.DebugFormat("[HG INVENTORY SERVICE]: GetRootFolder for {0}", principalID);
diff --git a/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs b/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs
index cb686e2..b6ec558 100644
--- a/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs
+++ b/OpenSim/Services/HypergridService/HGSuitcaseInventoryService.cs
@@ -59,7 +59,7 @@ namespace OpenSim.Services.HypergridService
59 59
60 private UserAccountCache m_Cache; 60 private UserAccountCache m_Cache;
61 61
62 private ExpiringCache<UUID, List<XInventoryFolder>> m_SuitcaseTrees = new ExpiringCache<UUID,List<XInventoryFolder>>(); 62 private ExpiringCache<UUID, List<XInventoryFolder>> m_SuitcaseTrees = new ExpiringCache<UUID, List<XInventoryFolder>>();
63 63
64 public HGSuitcaseInventoryService(IConfigSource config, string configName) 64 public HGSuitcaseInventoryService(IConfigSource config, string configName)
65 : base(config, configName) 65 : base(config, configName)
@@ -104,11 +104,72 @@ namespace OpenSim.Services.HypergridService
104 return false; 104 return false;
105 } 105 }
106 106
107
108 public override List<InventoryFolderBase> GetInventorySkeleton(UUID principalID) 107 public override List<InventoryFolderBase> GetInventorySkeleton(UUID principalID)
109 { 108 {
110 // NOGO for this inventory service 109 XInventoryFolder suitcase = GetSuitcaseXFolder(principalID);
111 return new List<InventoryFolderBase>(); 110 XInventoryFolder root = GetRootXFolder(principalID);
111
112 List<XInventoryFolder> tree = GetFolderTree(suitcase.folderID);
113 if (tree == null || (tree != null && tree.Count == 0))
114 return null;
115
116 List<InventoryFolderBase> folders = new List<InventoryFolderBase>();
117 foreach (XInventoryFolder x in tree)
118 {
119 folders.Add(ConvertToOpenSim(x));
120 }
121
122 SetAsRootFolder(suitcase, root);
123 folders.Add(ConvertToOpenSim(suitcase));
124
125 return folders;
126 }
127
128 public override InventoryCollection GetUserInventory(UUID userID)
129 {
130 m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: Get Suitcase inventory for user {0}", userID);
131 InventoryCollection userInventory = new InventoryCollection();
132 userInventory.UserID = userID;
133 userInventory.Folders = new List<InventoryFolderBase>();
134 userInventory.Items = new List<InventoryItemBase>();
135
136 XInventoryFolder suitcase = GetSuitcaseXFolder(userID);
137 XInventoryFolder root = GetRootXFolder(userID);
138
139 List<XInventoryFolder> tree = GetFolderTree(suitcase.folderID);
140 if (tree == null || (tree != null && tree.Count == 0))
141 {
142 SetAsRootFolder(suitcase, root);
143 userInventory.Folders.Add(ConvertToOpenSim(suitcase));
144 return userInventory;
145 }
146
147 List<InventoryItemBase> items;
148 foreach (XInventoryFolder f in tree)
149 {
150 // Add the items of this subfolder
151 items = GetFolderItems(userID, f.folderID);
152 if (items != null && items.Count > 0)
153 {
154 userInventory.Items.AddRange(items);
155 }
156
157 // Add the folder itself
158 userInventory.Folders.Add(ConvertToOpenSim(f));
159 }
160
161 items = GetFolderItems(userID, suitcase.folderID);
162 if (items != null && items.Count > 0)
163 {
164 userInventory.Items.AddRange(items);
165 }
166
167 SetAsRootFolder(suitcase, root);
168 userInventory.Folders.Add(ConvertToOpenSim(suitcase));
169
170 m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: GetUserInventory for user {0} returning {1} folders and {2} items",
171 userID, userInventory.Folders.Count, userInventory.Items.Count);
172 return userInventory;
112 } 173 }
113 174
114 public override InventoryFolderBase GetRootFolder(UUID principalID) 175 public override InventoryFolderBase GetRootFolder(UUID principalID)
@@ -131,51 +192,92 @@ namespace OpenSim.Services.HypergridService
131 { 192 {
132 m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: User {0} does not have a Suitcase folder. Creating it...", principalID); 193 m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: User {0} does not have a Suitcase folder. Creating it...", principalID);
133 // make one, and let's add it to the user's inventory as a direct child of the root folder 194 // make one, and let's add it to the user's inventory as a direct child of the root folder
195 // In the DB we tag it as type 100, but we use -1 (Unknown) outside
134 suitcase = CreateFolder(principalID, root.folderID, 100, "My Suitcase"); 196 suitcase = CreateFolder(principalID, root.folderID, 100, "My Suitcase");
135 if (suitcase == null) 197 if (suitcase == null)
136 m_log.ErrorFormat("[HG SUITCASE INVENTORY SERVICE]: Unable to create suitcase folder"); 198 m_log.ErrorFormat("[HG SUITCASE INVENTORY SERVICE]: Unable to create suitcase folder");
137
138 m_Database.StoreFolder(suitcase); 199 m_Database.StoreFolder(suitcase);
200
201 // Create System folders
202 CreateSystemFolders(principalID, suitcase.folderID);
139 } 203 }
140 204
141 // Now let's change the folder ID to match that of the real root folder 205 SetAsRootFolder(suitcase, root);
142 SetAsRootFolder(suitcase, root.folderID);
143 206
144 return ConvertToOpenSim(suitcase); 207 return ConvertToOpenSim(suitcase);
145 } 208 }
146 209
210 protected void CreateSystemFolders(UUID principalID, UUID rootID)
211 {
212 m_log.Debug("[HG SUITCASE INVENTORY SERVICE]: Creating System folders under Suitcase...");
213 XInventoryFolder[] sysFolders = GetSystemFolders(principalID, rootID);
214
215 if (!Array.Exists(sysFolders, delegate(XInventoryFolder f) { if (f.type == (int)AssetType.Animation) return true; return false; }))
216 CreateFolder(principalID, rootID, (int)AssetType.Animation, "Animations");
217 if (!Array.Exists(sysFolders, delegate(XInventoryFolder f) { if (f.type == (int)AssetType.Bodypart) return true; return false; }))
218 CreateFolder(principalID, rootID, (int)AssetType.Bodypart, "Body Parts");
219 if (!Array.Exists(sysFolders, delegate(XInventoryFolder f) { if (f.type == (int)AssetType.CallingCard) return true; return false; }))
220 CreateFolder(principalID, rootID, (int)AssetType.CallingCard, "Calling Cards");
221 if (!Array.Exists(sysFolders, delegate(XInventoryFolder f) { if (f.type == (int)AssetType.Clothing) return true; return false; }))
222 CreateFolder(principalID, rootID, (int)AssetType.Clothing, "Clothing");
223 if (!Array.Exists(sysFolders, delegate(XInventoryFolder f) { if (f.type == (int)AssetType.Gesture) return true; return false; }))
224 CreateFolder(principalID, rootID, (int)AssetType.Gesture, "Gestures");
225 if (!Array.Exists(sysFolders, delegate(XInventoryFolder f) { if (f.type == (int)AssetType.Landmark) return true; return false; }))
226 CreateFolder(principalID, rootID, (int)AssetType.Landmark, "Landmarks");
227 if (!Array.Exists(sysFolders, delegate(XInventoryFolder f) { if (f.type == (int)AssetType.LostAndFoundFolder) return true; return false; }))
228 CreateFolder(principalID, rootID, (int)AssetType.LostAndFoundFolder, "Lost And Found");
229 if (!Array.Exists(sysFolders, delegate(XInventoryFolder f) { if (f.type == (int)AssetType.Notecard) return true; return false; }))
230 CreateFolder(principalID, rootID, (int)AssetType.Notecard, "Notecards");
231 if (!Array.Exists(sysFolders, delegate(XInventoryFolder f) { if (f.type == (int)AssetType.Object) return true; return false; }))
232 CreateFolder(principalID, rootID, (int)AssetType.Object, "Objects");
233 if (!Array.Exists(sysFolders, delegate(XInventoryFolder f) { if (f.type == (int)AssetType.SnapshotFolder) return true; return false; }))
234 CreateFolder(principalID, rootID, (int)AssetType.SnapshotFolder, "Photo Album");
235 if (!Array.Exists(sysFolders, delegate(XInventoryFolder f) { if (f.type == (int)AssetType.LSLText) return true; return false; }))
236 CreateFolder(principalID, rootID, (int)AssetType.LSLText, "Scripts");
237 if (!Array.Exists(sysFolders, delegate(XInventoryFolder f) { if (f.type == (int)AssetType.Sound) return true; return false; }))
238 CreateFolder(principalID, rootID, (int)AssetType.Sound, "Sounds");
239 if (!Array.Exists(sysFolders, delegate(XInventoryFolder f) { if (f.type == (int)AssetType.Texture) return true; return false; }))
240 CreateFolder(principalID, rootID, (int)AssetType.Texture, "Textures");
241 if (!Array.Exists(sysFolders, delegate(XInventoryFolder f) { if (f.type == (int)AssetType.TrashFolder) return true; return false; }))
242 CreateFolder(principalID, rootID, (int)AssetType.TrashFolder, "Trash");
243 if (!Array.Exists(sysFolders, delegate(XInventoryFolder f) { if (f.type == (int)AssetType.FavoriteFolder) return true; return false; }))
244 CreateFolder(principalID, rootID, (int)AssetType.FavoriteFolder, "Favorites");
245 if (!Array.Exists(sysFolders, delegate(XInventoryFolder f) { if (f.type == (int)AssetType.CurrentOutfitFolder) return true; return false; }))
246 CreateFolder(principalID, rootID, (int)AssetType.CurrentOutfitFolder, "Current Outfit");
247
248 }
249
147 public override InventoryFolderBase GetFolderForType(UUID principalID, AssetType type) 250 public override InventoryFolderBase GetFolderForType(UUID principalID, AssetType type)
148 { 251 {
149 //m_log.DebugFormat("[HG INVENTORY SERVICE]: GetFolderForType for {0} {0}", principalID, type); 252 //m_log.DebugFormat("[HG INVENTORY SERVICE]: GetFolderForType for {0} {0}", principalID, type);
150 return GetRootFolder(principalID); 253 XInventoryFolder suitcase = GetSuitcaseXFolder(principalID);
254 XInventoryFolder[] folders = m_Database.GetFolders(
255 new string[] { "agentID", "type", "parentFolderID" },
256 new string[] { principalID.ToString(), ((int)type).ToString(), suitcase.folderID.ToString() });
257
258 if (folders.Length == 0)
259 {
260 m_log.WarnFormat("[HG SUITCASE INVENTORY SERVICE]: Found no folder for type {0} for user {1}", type, principalID);
261 return null;
262 }
263
264 m_log.DebugFormat(
265 "[HG SUITCASE INVENTORY SERVICE]: Found folder {0} {1} for type {2} for user {3}",
266 folders[0].folderName, folders[0].folderID, type, principalID);
267
268 return ConvertToOpenSim(folders[0]);
151 } 269 }
152 270
153 public override InventoryCollection GetFolderContent(UUID principalID, UUID folderID) 271 public override InventoryCollection GetFolderContent(UUID principalID, UUID folderID)
154 { 272 {
155 InventoryCollection coll = null; 273 InventoryCollection coll = null;
156 XInventoryFolder suitcase = GetSuitcaseXFolder(principalID); 274 XInventoryFolder suitcase = GetSuitcaseXFolder(principalID);
157 XInventoryFolder root = GetRootXFolder(principalID);
158 275
159 if (!IsWithinSuitcaseTree(folderID, root, suitcase)) 276 if (!IsWithinSuitcaseTree(folderID, suitcase))
160 return new InventoryCollection(); 277 return new InventoryCollection();
161 278
162 if (folderID == root.folderID) // someone's asking for the root folder, we'll give them the suitcase 279 coll = base.GetFolderContent(principalID, folderID);
163 { 280
164 if (suitcase != null)
165 {
166 coll = base.GetFolderContent(principalID, suitcase.folderID);
167 foreach (InventoryFolderBase f in coll.Folders)
168 f.ParentID = root.folderID;
169 foreach (InventoryItemBase i in coll.Items)
170 i.Folder = root.folderID;
171 m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: GetFolderContent for root folder returned content for suitcase folder");
172 }
173 }
174 else
175 {
176 coll = base.GetFolderContent(principalID, folderID);
177 m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: GetFolderContent for non-root folder {0}", folderID);
178 }
179 if (coll == null) 281 if (coll == null)
180 { 282 {
181 m_log.WarnFormat("[HG SUITCASE INVENTORY SERVICE]: Something wrong with user {0}'s suitcase folder", principalID); 283 m_log.WarnFormat("[HG SUITCASE INVENTORY SERVICE]: Something wrong with user {0}'s suitcase folder", principalID);
@@ -188,10 +290,9 @@ namespace OpenSim.Services.HypergridService
188 { 290 {
189 // Let's do a bit of sanity checking, more than the base service does 291 // Let's do a bit of sanity checking, more than the base service does
190 // make sure the given folder exists under the suitcase tree of this user 292 // make sure the given folder exists under the suitcase tree of this user
191 XInventoryFolder root = GetRootXFolder(principalID);
192 XInventoryFolder suitcase = GetSuitcaseXFolder(principalID); 293 XInventoryFolder suitcase = GetSuitcaseXFolder(principalID);
193 294
194 if (!IsWithinSuitcaseTree(folderID, root, suitcase)) 295 if (!IsWithinSuitcaseTree(folderID, suitcase))
195 return new List<InventoryItemBase>(); 296 return new List<InventoryItemBase>();
196 297
197 return base.GetFolderItems(principalID, folderID); 298 return base.GetFolderItems(principalID, folderID);
@@ -199,52 +300,40 @@ namespace OpenSim.Services.HypergridService
199 300
200 public override bool AddFolder(InventoryFolderBase folder) 301 public override bool AddFolder(InventoryFolderBase folder)
201 { 302 {
303 m_log.WarnFormat("[HG SUITCASE INVENTORY SERVICE]: AddFolder {0} {1}", folder.Name, folder.ParentID);
202 // Let's do a bit of sanity checking, more than the base service does 304 // Let's do a bit of sanity checking, more than the base service does
203 // make sure the given folder's parent folder exists under the suitcase tree of this user 305 // make sure the given folder's parent folder exists under the suitcase tree of this user
204 XInventoryFolder root = GetRootXFolder(folder.Owner);
205 XInventoryFolder suitcase = GetSuitcaseXFolder(folder.Owner); 306 XInventoryFolder suitcase = GetSuitcaseXFolder(folder.Owner);
206 307
207 if (!IsWithinSuitcaseTree(folder.ParentID, root, suitcase)) 308 if (!IsWithinSuitcaseTree(folder.ParentID, suitcase))
208 return false; 309 return false;
209 310
210 // OK, it's legit 311 // OK, it's legit
211 // Check if it's under the Root folder directly
212 if (folder.ParentID == root.folderID)
213 {
214 // someone's trying to add a subfolder of the root folder, we'll add it to the suitcase instead
215 m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: AddFolder for root folder for user {0}. Adding in suitcase instead", folder.Owner);
216 folder.ParentID = suitcase.folderID;
217 }
218
219 return base.AddFolder(folder); 312 return base.AddFolder(folder);
220 } 313 }
221 314
222 public bool UpdateFolder(InventoryFolderBase folder) 315 public override bool UpdateFolder(InventoryFolderBase folder)
223 { 316 {
224 XInventoryFolder root = GetRootXFolder(folder.Owner);
225 XInventoryFolder suitcase = GetSuitcaseXFolder(folder.Owner); 317 XInventoryFolder suitcase = GetSuitcaseXFolder(folder.Owner);
226 318
227 if (!IsWithinSuitcaseTree(folder.ID, root, suitcase)) 319 m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: Update folder {0}, version {1}", folder.ID, folder.Version);
320 if (!IsWithinSuitcaseTree(folder.ID, suitcase))
321 {
322 m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: folder {0} not within Suitcase tree", folder.Name);
228 return false; 323 return false;
324 }
229 325
326 // For all others
230 return base.UpdateFolder(folder); 327 return base.UpdateFolder(folder);
231 } 328 }
232 329
233 public override bool MoveFolder(InventoryFolderBase folder) 330 public override bool MoveFolder(InventoryFolderBase folder)
234 { 331 {
235 XInventoryFolder root = GetRootXFolder(folder.Owner);
236 XInventoryFolder suitcase = GetSuitcaseXFolder(folder.Owner); 332 XInventoryFolder suitcase = GetSuitcaseXFolder(folder.Owner);
237 333
238 if (!IsWithinSuitcaseTree(folder.ID, root, suitcase) || !IsWithinSuitcaseTree(folder.ParentID, root, suitcase)) 334 if (!IsWithinSuitcaseTree(folder.ID, suitcase) || !IsWithinSuitcaseTree(folder.ParentID, suitcase))
239 return false; 335 return false;
240 336
241 if (folder.ParentID == root.folderID)
242 {
243 // someone's trying to add a subfolder of the root folder, we'll add it to the suitcase instead
244 m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: MoveFolder to root folder for user {0}. Moving it to suitcase instead", folder.Owner);
245 folder.ParentID = suitcase.folderID;
246 }
247
248 return base.MoveFolder(folder); 337 return base.MoveFolder(folder);
249 } 338 }
250 339
@@ -264,31 +353,21 @@ namespace OpenSim.Services.HypergridService
264 { 353 {
265 // Let's do a bit of sanity checking, more than the base service does 354 // Let's do a bit of sanity checking, more than the base service does
266 // make sure the given folder's parent folder exists under the suitcase tree of this user 355 // make sure the given folder's parent folder exists under the suitcase tree of this user
267 XInventoryFolder root = GetRootXFolder(item.Owner);
268 XInventoryFolder suitcase = GetSuitcaseXFolder(item.Owner); 356 XInventoryFolder suitcase = GetSuitcaseXFolder(item.Owner);
269 357
270 if (!IsWithinSuitcaseTree(item.Folder, root, suitcase)) 358 if (!IsWithinSuitcaseTree(item.Folder, suitcase))
271 return false; 359 return false;
272 360
273 // OK, it's legit 361 // OK, it's legit
274 // Check if it's under the Root folder directly
275 if (item.Folder == root.folderID)
276 {
277 // someone's trying to add a subfolder of the root folder, we'll add it to the suitcase instead
278 m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: AddItem for root folder for user {0}. Adding in suitcase instead", item.Owner);
279 item.Folder = suitcase.folderID;
280 }
281
282 return base.AddItem(item); 362 return base.AddItem(item);
283 363
284 } 364 }
285 365
286 public override bool UpdateItem(InventoryItemBase item) 366 public override bool UpdateItem(InventoryItemBase item)
287 { 367 {
288 XInventoryFolder root = GetRootXFolder(item.Owner);
289 XInventoryFolder suitcase = GetSuitcaseXFolder(item.Owner); 368 XInventoryFolder suitcase = GetSuitcaseXFolder(item.Owner);
290 369
291 if (!IsWithinSuitcaseTree(item.Folder, root, suitcase)) 370 if (!IsWithinSuitcaseTree(item.Folder, suitcase))
292 return false; 371 return false;
293 372
294 return base.UpdateItem(item); 373 return base.UpdateItem(item);
@@ -298,68 +377,64 @@ namespace OpenSim.Services.HypergridService
298 { 377 {
299 // Principal is b0rked. *sigh* 378 // Principal is b0rked. *sigh*
300 379
301 XInventoryFolder root = GetRootXFolder(items[0].Owner);
302 XInventoryFolder suitcase = GetSuitcaseXFolder(items[0].Owner); 380 XInventoryFolder suitcase = GetSuitcaseXFolder(items[0].Owner);
303 381
304 if (!IsWithinSuitcaseTree(items[0].Folder, root, suitcase)) 382 if (!IsWithinSuitcaseTree(items[0].Folder, suitcase))
305 return false; 383 return false;
306 384
307 foreach (InventoryItemBase it in items)
308 if (it.Folder == root.folderID)
309 {
310 // someone's trying to add a subfolder of the root folder, we'll add it to the suitcase instead
311 m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: MoveItem to root folder for user {0}. Moving it to suitcase instead", it.Owner);
312 it.Folder = suitcase.folderID;
313 }
314
315 return base.MoveItems(principalID, items); 385 return base.MoveItems(principalID, items);
316 386
317 } 387 }
318 388
319 // Let these pass. Use inherited methods.
320 public override bool DeleteItems(UUID principalID, List<UUID> itemIDs) 389 public override bool DeleteItems(UUID principalID, List<UUID> itemIDs)
321 { 390 {
322 return false; 391 return false;
323 } 392 }
324 393
325 public override InventoryItemBase GetItem(InventoryItemBase item) 394 public new InventoryItemBase GetItem(InventoryItemBase item)
326 { 395 {
327 InventoryItemBase it = base.GetItem(item); 396 InventoryItemBase it = base.GetItem(item);
328 XInventoryFolder root = GetRootXFolder(it.Owner); 397 if (it == null)
398 {
399 m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: Unable to retrieve item {0} ({1}) in folder {2}",
400 item.Name, item.ID, item.Folder);
401 return null;
402 }
329 XInventoryFolder suitcase = GetSuitcaseXFolder(it.Owner); 403 XInventoryFolder suitcase = GetSuitcaseXFolder(it.Owner);
330 404 if (suitcase == null)
331 if (it != null)
332 { 405 {
333 if (!IsWithinSuitcaseTree(it.Folder, root, suitcase)) 406 m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: Root or Suitcase are null for user {0}",
334 return null; 407 it.Owner);
408 return null;
409 }
335 410
336 if (it.Folder == suitcase.folderID) 411 if (!IsWithinSuitcaseTree(it.Folder, suitcase))
337 it.Folder = root.folderID; 412 {
413 m_log.DebugFormat("[HG SUITCASE INVENTORY SERVICE]: Item {0} (folder {1}) is not within Suitcase",
414 it.Name, it.Folder);
415 return null;
416 }
338 417
339 // UserAccount user = m_Cache.GetUser(it.CreatorId); 418 // UserAccount user = m_Cache.GetUser(it.CreatorId);
340 419
341 // // Adjust the creator data 420 // // Adjust the creator data
342 // if (user != null && it != null && (it.CreatorData == null || it.CreatorData == string.Empty)) 421 // if (user != null && it != null && (it.CreatorData == null || it.CreatorData == string.Empty))
343 // it.CreatorData = m_HomeURL + ";" + user.FirstName + " " + user.LastName; 422 // it.CreatorData = m_HomeURL + ";" + user.FirstName + " " + user.LastName;
344 //} 423 //}
345 }
346 424
347 return it; 425 return it;
348 } 426 }
349 427
350 public override InventoryFolderBase GetFolder(InventoryFolderBase folder) 428 public new InventoryFolderBase GetFolder(InventoryFolderBase folder)
351 { 429 {
352 InventoryFolderBase f = base.GetFolder(folder); 430 InventoryFolderBase f = base.GetFolder(folder);
353 XInventoryFolder root = GetRootXFolder(f.Owner);
354 XInventoryFolder suitcase = GetSuitcaseXFolder(f.Owner);
355 431
356 if (f != null) 432 if (f != null)
357 { 433 {
358 if (!IsWithinSuitcaseTree(f.ID, root, suitcase)) 434 XInventoryFolder suitcase = GetSuitcaseXFolder(f.Owner);
359 return null;
360 435
361 if (f.ParentID == suitcase.folderID) 436 if (!IsWithinSuitcaseTree(f.ID, suitcase))
362 f.ParentID = root.folderID; 437 return null;
363 } 438 }
364 439
365 return f; 440 return f;
@@ -409,20 +484,19 @@ namespace OpenSim.Services.HypergridService
409 return null; 484 return null;
410 } 485 }
411 486
412 private void SetAsRootFolder(XInventoryFolder suitcase, UUID rootID) 487 private void SetAsRootFolder(XInventoryFolder suitcase, XInventoryFolder root)
413 { 488 {
414 suitcase.folderID = rootID; 489 suitcase.type = (short)AssetType.Folder;
415 suitcase.parentFolderID = UUID.Zero;
416 } 490 }
417 491
418 private List<XInventoryFolder> GetFolderTree(UUID root) 492 private List<XInventoryFolder> GetFolderTree(UUID folder)
419 { 493 {
420 List<XInventoryFolder> t = null; 494 List<XInventoryFolder> t = null;
421 if (m_SuitcaseTrees.TryGetValue(root, out t)) 495 if (m_SuitcaseTrees.TryGetValue(folder, out t))
422 return t; 496 return t;
423 497
424 t = GetFolderTreeRecursive(root); 498 t = GetFolderTreeRecursive(folder);
425 m_SuitcaseTrees.AddOrUpdate(root, t, 120); 499 m_SuitcaseTrees.AddOrUpdate(folder, t, 120);
426 return t; 500 return t;
427 } 501 }
428 502
@@ -447,10 +521,17 @@ namespace OpenSim.Services.HypergridService
447 521
448 } 522 }
449 523
450 private bool IsWithinSuitcaseTree(UUID folderID, XInventoryFolder root, XInventoryFolder suitcase) 524 /// <summary>
525 /// Return true if the folderID is a subfolder of the Suitcase or the suitcase folder itself
526 /// </summary>
527 /// <param name="folderID"></param>
528 /// <param name="root"></param>
529 /// <param name="suitcase"></param>
530 /// <returns></returns>
531 private bool IsWithinSuitcaseTree(UUID folderID, XInventoryFolder suitcase)
451 { 532 {
452 List<XInventoryFolder> tree = new List<XInventoryFolder>(); 533 List<XInventoryFolder> tree = new List<XInventoryFolder>();
453 tree.Add(root); // Warp! the tree is the real root folder plus the children of the suitcase folder 534 tree.Add(suitcase); // Warp! the tree is the real root folder plus the children of the suitcase folder
454 tree.AddRange(GetFolderTree(suitcase.folderID)); 535 tree.AddRange(GetFolderTree(suitcase.folderID));
455 XInventoryFolder f = tree.Find(delegate(XInventoryFolder fl) 536 XInventoryFolder f = tree.Find(delegate(XInventoryFolder fl)
456 { 537 {
@@ -463,4 +544,5 @@ namespace OpenSim.Services.HypergridService
463 } 544 }
464 #endregion 545 #endregion
465 } 546 }
547
466} 548}
diff --git a/OpenSim/Services/InventoryService/XInventoryService.cs b/OpenSim/Services/InventoryService/XInventoryService.cs
index 7b2c3a6..0e7a358 100644
--- a/OpenSim/Services/InventoryService/XInventoryService.cs
+++ b/OpenSim/Services/InventoryService/XInventoryService.cs
@@ -40,9 +40,9 @@ namespace OpenSim.Services.InventoryService
40{ 40{
41 public class XInventoryService : ServiceBase, IInventoryService 41 public class XInventoryService : ServiceBase, IInventoryService
42 { 42 {
43// private static readonly ILog m_log = 43 private static readonly ILog m_log =
44// LogManager.GetLogger( 44 LogManager.GetLogger(
45// MethodBase.GetCurrentMethod().DeclaringType); 45 MethodBase.GetCurrentMethod().DeclaringType);
46 46
47 protected IXInventoryData m_Database; 47 protected IXInventoryData m_Database;
48 protected bool m_AllowDelete = true; 48 protected bool m_AllowDelete = true;
@@ -113,7 +113,7 @@ namespace OpenSim.Services.InventoryService
113 result = true; 113 result = true;
114 } 114 }
115 115
116 XInventoryFolder[] sysFolders = GetSystemFolders(principalID); 116 XInventoryFolder[] sysFolders = GetSystemFolders(principalID, rootFolder.ID);
117 117
118 if (!Array.Exists(sysFolders, delegate (XInventoryFolder f) { if (f.type == (int)AssetType.Animation) return true; return false; })) 118 if (!Array.Exists(sysFolders, delegate (XInventoryFolder f) { if (f.type == (int)AssetType.Animation) return true; return false; }))
119 CreateFolder(principalID, rootFolder.ID, (int)AssetType.Animation, "Animations"); 119 CreateFolder(principalID, rootFolder.ID, (int)AssetType.Animation, "Animations");
@@ -163,13 +163,13 @@ namespace OpenSim.Services.InventoryService
163 return newFolder; 163 return newFolder;
164 } 164 }
165 165
166 protected virtual XInventoryFolder[] GetSystemFolders(UUID principalID) 166 protected virtual XInventoryFolder[] GetSystemFolders(UUID principalID, UUID rootID)
167 { 167 {
168// m_log.DebugFormat("[XINVENTORY SERVICE]: Getting system folders for {0}", principalID); 168// m_log.DebugFormat("[XINVENTORY SERVICE]: Getting system folders for {0}", principalID);
169 169
170 XInventoryFolder[] allFolders = m_Database.GetFolders( 170 XInventoryFolder[] allFolders = m_Database.GetFolders(
171 new string[] { "agentID" }, 171 new string[] { "agentID", "parentFolderID" },
172 new string[] { principalID.ToString() }); 172 new string[] { principalID.ToString(), rootID.ToString() });
173 173
174 XInventoryFolder[] sysFolders = Array.FindAll( 174 XInventoryFolder[] sysFolders = Array.FindAll(
175 allFolders, 175 allFolders,
@@ -301,16 +301,26 @@ namespace OpenSim.Services.InventoryService
301 301
302 public virtual bool AddFolder(InventoryFolderBase folder) 302 public virtual bool AddFolder(InventoryFolderBase folder)
303 { 303 {
304 //m_log.DebugFormat("[XINVENTORY]: Add folder {0} type {1} in parent {2}", folder.Name, folder.Type, folder.ParentID);
304 InventoryFolderBase check = GetFolder(folder); 305 InventoryFolderBase check = GetFolder(folder);
305 if (check != null) 306 if (check != null)
306 return false; 307 return false;
307 308
308 XInventoryFolder xFolder = ConvertFromOpenSim(folder); 309 if (folder.Type == (short)AssetType.Folder || folder.Type == (short)AssetType.Unknown ||
309 return m_Database.StoreFolder(xFolder); 310 GetFolderForType(folder.Owner, (AssetType)(folder.Type)) == null)
311 {
312 XInventoryFolder xFolder = ConvertFromOpenSim(folder);
313 return m_Database.StoreFolder(xFolder);
314 }
315 else
316 m_log.DebugFormat("[XINVENTORY]: Folder {0} of type {1} already exists", folder.Name, folder.Type);
317
318 return false;
310 } 319 }
311 320
312 public virtual bool UpdateFolder(InventoryFolderBase folder) 321 public virtual bool UpdateFolder(InventoryFolderBase folder)
313 { 322 {
323 //m_log.DebugFormat("[XINVENTORY]: Update folder {0} {1} ({2})", folder.Name, folder.Type, folder.ID);
314 XInventoryFolder xFolder = ConvertFromOpenSim(folder); 324 XInventoryFolder xFolder = ConvertFromOpenSim(folder);
315 InventoryFolderBase check = GetFolder(folder); 325 InventoryFolderBase check = GetFolder(folder);
316 if (check == null) 326 if (check == null)
@@ -319,9 +329,13 @@ namespace OpenSim.Services.InventoryService
319 if (check.Type != -1 || xFolder.type != -1) 329 if (check.Type != -1 || xFolder.type != -1)
320 { 330 {
321 if (xFolder.version < check.Version) 331 if (xFolder.version < check.Version)
332 {
333 //m_log.DebugFormat("[XINVENTORY]: {0} < {1} can't do", xFolder.version, check.Version);
322 return false; 334 return false;
335 }
323 check.Version = (ushort)xFolder.version; 336 check.Version = (ushort)xFolder.version;
324 xFolder = ConvertFromOpenSim(check); 337 xFolder = ConvertFromOpenSim(check);
338 //m_log.DebugFormat("[XINVENTORY]: Storing {0} {1} {2}", xFolder.folderName, xFolder.version, xFolder.type);
325 return m_Database.StoreFolder(xFolder); 339 return m_Database.StoreFolder(xFolder);
326 } 340 }
327 341
@@ -499,13 +513,30 @@ namespace OpenSim.Services.InventoryService
499 return m_Database.GetAssetPermissions(principalID, assetID); 513 return m_Database.GetAssetPermissions(principalID, assetID);
500 } 514 }
501 515
502 // CM never needed those. Left unimplemented. 516 public virtual InventoryCollection GetUserInventory(UUID userID)
503 // Obsolete in core
504 //
505 public InventoryCollection GetUserInventory(UUID userID)
506 { 517 {
507 return null; 518 InventoryCollection userInventory = new InventoryCollection();
519 userInventory.UserID = userID;
520 userInventory.Folders = new List<InventoryFolderBase>();
521 userInventory.Items = new List<InventoryItemBase>();
522
523 List<InventoryFolderBase> skel = GetInventorySkeleton(userID);
524 if (skel != null)
525 {
526 foreach (InventoryFolderBase f in skel)
527 {
528 InventoryCollection c = GetFolderContent(userID, f.ID);
529 if (c != null && c.Items != null && c.Items.Count > 0)
530 userInventory.Items.AddRange(c.Items);
531 if (c != null && c.Folders != null && c.Folders.Count > 0)
532 userInventory.Folders.AddRange(c.Folders);
533 }
534 }
535 m_log.DebugFormat("[XINVENTORY SERVICE]: GetUserInventory for user {0} returning {1} folders and {2} items",
536 userID, userInventory.Folders.Count, userInventory.Items.Count);
537 return userInventory;
508 } 538 }
539
509 public void GetUserInventory(UUID userID, InventoryReceiptCallback callback) 540 public void GetUserInventory(UUID userID, InventoryReceiptCallback callback)
510 { 541 {
511 } 542 }
@@ -525,6 +556,9 @@ namespace OpenSim.Services.InventoryService
525 556
526 newFolder.ParentID = folder.parentFolderID; 557 newFolder.ParentID = folder.parentFolderID;
527 newFolder.Type = (short)folder.type; 558 newFolder.Type = (short)folder.type;
559 // Viewer can't understand anything that's not in it's LLFolderType enum
560 if (newFolder.Type == 100)
561 newFolder.Type = -1;
528 newFolder.Version = (ushort)folder.version; 562 newFolder.Version = (ushort)folder.version;
529 newFolder.Name = folder.folderName; 563 newFolder.Name = folder.folderName;
530 newFolder.Owner = folder.agentID; 564 newFolder.Owner = folder.agentID;