diff options
author | Justin Clark-Casey (justincc) | 2011-05-13 03:24:19 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2011-05-13 03:24:19 +0100 |
commit | 5f9edd195c702fac57ab76bca1c0357bce224868 (patch) | |
tree | 46c2c2e155987c77abed27af3169315fcf97bd1f /OpenSim | |
parent | One more debug message for offline IMs. (diff) | |
download | opensim-SC-5f9edd195c702fac57ab76bca1c0357bce224868.zip opensim-SC-5f9edd195c702fac57ab76bca1c0357bce224868.tar.gz opensim-SC-5f9edd195c702fac57ab76bca1c0357bce224868.tar.bz2 opensim-SC-5f9edd195c702fac57ab76bca1c0357bce224868.tar.xz |
Fix broken inventory links on viewer 2.
It appears that if the viewer requests a folder containing links, we must also send the folders that contain the link targets first.
This was tested with Kokua 0.1.0 WIP though I predict it will also work with other viewer 2s
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 7 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 21 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs | 4 |
3 files changed, 29 insertions, 3 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 1da9d5e..5a2c45c 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | |||
@@ -1612,14 +1612,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1612 | currentPacket.ItemData[itemsSent % MAX_ITEMS_PER_PACKET] = CreateItemDataBlock(items[itemsSent++]); | 1612 | currentPacket.ItemData[itemsSent % MAX_ITEMS_PER_PACKET] = CreateItemDataBlock(items[itemsSent++]); |
1613 | else | 1613 | else |
1614 | { | 1614 | { |
1615 | // m_log.DebugFormat( | ||
1616 | // "[LLCLIENTVIEW]: Sending inventory folder details packet to {0} for folder {1}", Name, folderID); | ||
1615 | OutPacket(currentPacket, ThrottleOutPacketType.Asset, false); | 1617 | OutPacket(currentPacket, ThrottleOutPacketType.Asset, false); |
1616 | currentPacket = null; | 1618 | currentPacket = null; |
1617 | } | 1619 | } |
1618 | |||
1619 | } | 1620 | } |
1620 | 1621 | ||
1621 | if (currentPacket != null) | 1622 | if (currentPacket != null) |
1623 | { | ||
1624 | // m_log.DebugFormat( | ||
1625 | // "[LLCLIENTVIEW]: Sending inventory folder details packet to {0} for folder {1}", Name, folderID); | ||
1622 | OutPacket(currentPacket, ThrottleOutPacketType.Asset, false); | 1626 | OutPacket(currentPacket, ThrottleOutPacketType.Asset, false); |
1627 | } | ||
1623 | } | 1628 | } |
1624 | 1629 | ||
1625 | private InventoryDescendentsPacket.FolderDataBlock CreateFolderDataBlock(InventoryFolderBase folder) | 1630 | private InventoryDescendentsPacket.FolderDataBlock CreateFolderDataBlock(InventoryFolderBase folder) |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index a65ceeb..3bf2c2b 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -1382,11 +1382,28 @@ namespace OpenSim.Region.Framework.Scenes | |||
1382 | InventoryFolderBase containingFolder = new InventoryFolderBase(folder.ID, client.AgentId); | 1382 | InventoryFolderBase containingFolder = new InventoryFolderBase(folder.ID, client.AgentId); |
1383 | containingFolder = InventoryService.GetFolder(containingFolder); | 1383 | containingFolder = InventoryService.GetFolder(containingFolder); |
1384 | 1384 | ||
1385 | //m_log.DebugFormat("[AGENT INVENTORY]: Sending inventory folder contents ({0} nodes) for \"{1}\" to {2} {3}", | 1385 | // m_log.DebugFormat("[AGENT INVENTORY]: Sending inventory folder contents ({0} nodes) for \"{1}\" to {2} {3}", |
1386 | // contents.Folders.Count + contents.Items.Count, containingFolder.Name, client.FirstName, client.LastName); | 1386 | // contents.Folders.Count + contents.Items.Count, containingFolder.Name, client.FirstName, client.LastName); |
1387 | 1387 | ||
1388 | if (containingFolder != null && containingFolder != null) | 1388 | if (containingFolder != null && containingFolder != null) |
1389 | { | ||
1390 | // If the folder requested contains links, then we need to send those folders first, otherwise the links | ||
1391 | // will be broken in the viewer. | ||
1392 | HashSet<UUID> linkedItemFolderIdsToSend = new HashSet<UUID>(); | ||
1393 | foreach (InventoryItemBase item in contents.Items) | ||
1394 | { | ||
1395 | if (item.AssetType == (int)AssetType.Link) | ||
1396 | { | ||
1397 | InventoryItemBase linkedItem = InventoryService.GetItem(new InventoryItemBase(item.AssetID)); | ||
1398 | linkedItemFolderIdsToSend.Add(linkedItem.Folder); | ||
1399 | } | ||
1400 | } | ||
1401 | |||
1402 | foreach (UUID linkedItemFolderId in linkedItemFolderIdsToSend) | ||
1403 | SendInventoryUpdate(client, new InventoryFolderBase(linkedItemFolderId), false, true); | ||
1404 | |||
1389 | client.SendInventoryFolderDetails(client.AgentId, folder.ID, contents.Items, contents.Folders, containingFolder.Version, fetchFolders, fetchItems); | 1405 | client.SendInventoryFolderDetails(client.AgentId, folder.ID, contents.Items, contents.Folders, containingFolder.Version, fetchFolders, fetchItems); |
1406 | } | ||
1390 | } | 1407 | } |
1391 | 1408 | ||
1392 | /// <summary> | 1409 | /// <summary> |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index ab567fb..e2d7208 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs | |||
@@ -499,6 +499,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
499 | public void HandleFetchInventoryDescendents(IClientAPI remoteClient, UUID folderID, UUID ownerID, | 499 | public void HandleFetchInventoryDescendents(IClientAPI remoteClient, UUID folderID, UUID ownerID, |
500 | bool fetchFolders, bool fetchItems, int sortOrder) | 500 | bool fetchFolders, bool fetchItems, int sortOrder) |
501 | { | 501 | { |
502 | // m_log.DebugFormat( | ||
503 | // "[USER INVENTORY]: HandleFetchInventoryDescendents() for {0}, folder={1}, fetchFolders={2}, fetchItems={3}, sortOrder={4}", | ||
504 | // remoteClient.Name, folderID, fetchFolders, fetchItems, sortOrder); | ||
505 | |||
502 | if (folderID == UUID.Zero) | 506 | if (folderID == UUID.Zero) |
503 | return; | 507 | return; |
504 | 508 | ||