diff options
-rw-r--r-- | OpenSim/Region/ClientStack/ClientView.cs | 44 |
1 files changed, 28 insertions, 16 deletions
diff --git a/OpenSim/Region/ClientStack/ClientView.cs b/OpenSim/Region/ClientStack/ClientView.cs index 9e695ea..823214a 100644 --- a/OpenSim/Region/ClientStack/ClientView.cs +++ b/OpenSim/Region/ClientStack/ClientView.cs | |||
@@ -918,6 +918,18 @@ namespace OpenSim.Region.ClientStack | |||
918 | List<InventoryFolderBase> folders, | 918 | List<InventoryFolderBase> folders, |
919 | bool fetchFolders, bool fetchItems) | 919 | bool fetchFolders, bool fetchItems) |
920 | { | 920 | { |
921 | // An inventory descendents packet consists of a single agent section and an inventory details | ||
922 | // section for each inventory item. The size of each inventory item is approximately 550 bytes. | ||
923 | // In theory, UDP has a maximum packet size of 64k, so it should be possible to send descendent | ||
924 | // packets containing metadata for in excess of 100 items. But in practice, there may be other | ||
925 | // factors (e.g. firewalls) restraining the maximum UDP packet size. See, | ||
926 | // | ||
927 | // http://opensimulator.org/mantis/view.php?id=226 | ||
928 | // | ||
929 | // for one example of this kind of thing. So we'll go for a cautious max | ||
930 | // items of 20 which gives a packet size of about 11k | ||
931 | int MAX_ITEMS_PER_PACKET = 20; | ||
932 | |||
921 | Encoding enc = Encoding.ASCII; | 933 | Encoding enc = Encoding.ASCII; |
922 | uint FULL_MASK_PERMISSIONS = 2147483647; | 934 | uint FULL_MASK_PERMISSIONS = 2147483647; |
923 | 935 | ||
@@ -925,15 +937,15 @@ namespace OpenSim.Region.ClientStack | |||
925 | { | 937 | { |
926 | InventoryDescendentsPacket descend = CreateInventoryDescendentsPacket(ownerID, folderID); | 938 | InventoryDescendentsPacket descend = CreateInventoryDescendentsPacket(ownerID, folderID); |
927 | 939 | ||
928 | if (items.Count < 40) | 940 | if (items.Count < MAX_ITEMS_PER_PACKET) |
929 | { | 941 | { |
930 | descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[items.Count]; | 942 | descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[items.Count]; |
931 | descend.AgentData.Descendents = items.Count; | 943 | descend.AgentData.Descendents = items.Count; |
932 | } | 944 | } |
933 | else | 945 | else |
934 | { | 946 | { |
935 | descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[40]; | 947 | descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[MAX_ITEMS_PER_PACKET]; |
936 | descend.AgentData.Descendents = 40; | 948 | descend.AgentData.Descendents = MAX_ITEMS_PER_PACKET; |
937 | } | 949 | } |
938 | 950 | ||
939 | // Even if we aren't fetching the folders, we still need to include the folder count | 951 | // Even if we aren't fetching the folders, we still need to include the folder count |
@@ -979,29 +991,29 @@ namespace OpenSim.Region.ClientStack | |||
979 | 991 | ||
980 | i++; | 992 | i++; |
981 | count++; | 993 | count++; |
982 | if (i == 40) | 994 | if (i == MAX_ITEMS_PER_PACKET) |
983 | { | 995 | { |
984 | OutPacket(descend, ThrottleOutPacketType.Asset); | 996 | OutPacket(descend, ThrottleOutPacketType.Asset); |
985 | 997 | ||
986 | if ((items.Count - count) > 0) | 998 | if ((items.Count - count) > 0) |
987 | { | 999 | { |
988 | descend = CreateInventoryDescendentsPacket(ownerID, folderID); | 1000 | descend = CreateInventoryDescendentsPacket(ownerID, folderID); |
989 | if ((items.Count - count) < 40) | 1001 | if ((items.Count - count) < MAX_ITEMS_PER_PACKET) |
990 | { | 1002 | { |
991 | descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[items.Count - count]; | 1003 | descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[items.Count - count]; |
992 | descend.AgentData.Descendents = items.Count - count; | 1004 | descend.AgentData.Descendents = items.Count - count; |
993 | } | 1005 | } |
994 | else | 1006 | else |
995 | { | 1007 | { |
996 | descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[40]; | 1008 | descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[MAX_ITEMS_PER_PACKET]; |
997 | descend.AgentData.Descendents = 40; | 1009 | descend.AgentData.Descendents = MAX_ITEMS_PER_PACKET; |
998 | } | 1010 | } |
999 | i = 0; | 1011 | i = 0; |
1000 | } | 1012 | } |
1001 | } | 1013 | } |
1002 | } | 1014 | } |
1003 | 1015 | ||
1004 | if (i < 40) | 1016 | if (i < MAX_ITEMS_PER_PACKET) |
1005 | { | 1017 | { |
1006 | OutPacket(descend, ThrottleOutPacketType.Asset); | 1018 | OutPacket(descend, ThrottleOutPacketType.Asset); |
1007 | } | 1019 | } |
@@ -1012,15 +1024,15 @@ namespace OpenSim.Region.ClientStack | |||
1012 | { | 1024 | { |
1013 | InventoryDescendentsPacket descend = CreateInventoryDescendentsPacket(ownerID, folderID); | 1025 | InventoryDescendentsPacket descend = CreateInventoryDescendentsPacket(ownerID, folderID); |
1014 | 1026 | ||
1015 | if (folders.Count < 40) | 1027 | if (folders.Count < MAX_ITEMS_PER_PACKET) |
1016 | { | 1028 | { |
1017 | descend.FolderData = new InventoryDescendentsPacket.FolderDataBlock[folders.Count]; | 1029 | descend.FolderData = new InventoryDescendentsPacket.FolderDataBlock[folders.Count]; |
1018 | descend.AgentData.Descendents = folders.Count; | 1030 | descend.AgentData.Descendents = folders.Count; |
1019 | } | 1031 | } |
1020 | else | 1032 | else |
1021 | { | 1033 | { |
1022 | descend.FolderData = new InventoryDescendentsPacket.FolderDataBlock[40]; | 1034 | descend.FolderData = new InventoryDescendentsPacket.FolderDataBlock[MAX_ITEMS_PER_PACKET]; |
1023 | descend.AgentData.Descendents = 40; | 1035 | descend.AgentData.Descendents = MAX_ITEMS_PER_PACKET; |
1024 | } | 1036 | } |
1025 | 1037 | ||
1026 | // Not sure if this scenario ever actually occurs, but nonetheless we include the items | 1038 | // Not sure if this scenario ever actually occurs, but nonetheless we include the items |
@@ -1042,29 +1054,29 @@ namespace OpenSim.Region.ClientStack | |||
1042 | 1054 | ||
1043 | i++; | 1055 | i++; |
1044 | count++; | 1056 | count++; |
1045 | if (i == 40) | 1057 | if (i == MAX_ITEMS_PER_PACKET) |
1046 | { | 1058 | { |
1047 | OutPacket(descend, ThrottleOutPacketType.Asset); | 1059 | OutPacket(descend, ThrottleOutPacketType.Asset); |
1048 | 1060 | ||
1049 | if ((folders.Count - count) > 0) | 1061 | if ((folders.Count - count) > 0) |
1050 | { | 1062 | { |
1051 | descend = CreateInventoryDescendentsPacket(ownerID, folderID); | 1063 | descend = CreateInventoryDescendentsPacket(ownerID, folderID); |
1052 | if ((folders.Count - count) < 40) | 1064 | if ((folders.Count - count) < MAX_ITEMS_PER_PACKET) |
1053 | { | 1065 | { |
1054 | descend.FolderData = new InventoryDescendentsPacket.FolderDataBlock[folders.Count - count]; | 1066 | descend.FolderData = new InventoryDescendentsPacket.FolderDataBlock[folders.Count - count]; |
1055 | descend.AgentData.Descendents = folders.Count - count; | 1067 | descend.AgentData.Descendents = folders.Count - count; |
1056 | } | 1068 | } |
1057 | else | 1069 | else |
1058 | { | 1070 | { |
1059 | descend.FolderData = new InventoryDescendentsPacket.FolderDataBlock[40]; | 1071 | descend.FolderData = new InventoryDescendentsPacket.FolderDataBlock[MAX_ITEMS_PER_PACKET]; |
1060 | descend.AgentData.Descendents = 40; | 1072 | descend.AgentData.Descendents = MAX_ITEMS_PER_PACKET; |
1061 | } | 1073 | } |
1062 | i = 0; | 1074 | i = 0; |
1063 | } | 1075 | } |
1064 | } | 1076 | } |
1065 | } | 1077 | } |
1066 | 1078 | ||
1067 | if (i < 40) | 1079 | if (i < MAX_ITEMS_PER_PACKET) |
1068 | { | 1080 | { |
1069 | OutPacket(descend, ThrottleOutPacketType.Asset); | 1081 | OutPacket(descend, ThrottleOutPacketType.Asset); |
1070 | } | 1082 | } |