aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Client/MXP/ClientStack/MXPClientView.cs6
-rw-r--r--OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs5
-rw-r--r--OpenSim/Framework/Capabilities/Caps.cs12
-rw-r--r--OpenSim/Framework/IClientAPI.cs2
-rw-r--r--OpenSim/Framework/Servers/HttpServer/BinaryStreamHandler.cs4
-rw-r--r--OpenSim/Framework/Watchdog.cs2
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs7
-rw-r--r--OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs122
-rw-r--r--OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs3
-rw-r--r--OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs6
-rw-r--r--OpenSim/Region/Framework/Interfaces/IEntityInventory.cs7
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Inventory.cs23
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs3
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs43
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs169
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneViewer.cs2
-rw-r--r--OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs5
-rw-r--r--OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs4
-rw-r--r--OpenSim/Tests/Common/Mock/TestClient.cs5
19 files changed, 244 insertions, 186 deletions
diff --git a/OpenSim/Client/MXP/ClientStack/MXPClientView.cs b/OpenSim/Client/MXP/ClientStack/MXPClientView.cs
index 06110c3..1f6dc5f 100644
--- a/OpenSim/Client/MXP/ClientStack/MXPClientView.cs
+++ b/OpenSim/Client/MXP/ClientStack/MXPClientView.cs
@@ -1131,6 +1131,12 @@ namespace OpenSim.Client.MXP.ClientStack
1131 // SL Specific, Ignore. (Remove from IClient) 1131 // SL Specific, Ignore. (Remove from IClient)
1132 } 1132 }
1133 1133
1134 public void SendAbortXferPacket(ulong xferID)
1135 {
1136
1137 }
1138
1139
1134 public void SendEconomyData(float EnergyEfficiency, int ObjectCapacity, int ObjectCount, int PriceEnergyUnit, int PriceGroupCreate, int PriceObjectClaim, float PriceObjectRent, float PriceObjectScaleFactor, int PriceParcelClaim, float PriceParcelClaimFactor, int PriceParcelRent, int PricePublicObjectDecay, int PricePublicObjectDelete, int PriceRentLight, int PriceUpload, int TeleportMinPrice, float TeleportPriceExponent) 1140 public void SendEconomyData(float EnergyEfficiency, int ObjectCapacity, int ObjectCount, int PriceEnergyUnit, int PriceGroupCreate, int PriceObjectClaim, float PriceObjectRent, float PriceObjectScaleFactor, int PriceParcelClaim, float PriceParcelClaimFactor, int PriceParcelRent, int PricePublicObjectDecay, int PricePublicObjectDelete, int PriceRentLight, int PriceUpload, int TeleportMinPrice, float TeleportPriceExponent)
1135 { 1141 {
1136 // SL Specific, Ignore. (Remove from IClient) 1142 // SL Specific, Ignore. (Remove from IClient)
diff --git a/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs b/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs
index bc5dc9e..8a49c62 100644
--- a/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs
+++ b/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs
@@ -675,6 +675,11 @@ namespace OpenSim.Client.VWoHTTP.ClientStack
675 throw new System.NotImplementedException(); 675 throw new System.NotImplementedException();
676 } 676 }
677 677
678 public virtual void SendAbortXferPacket(ulong xferID)
679 {
680 throw new System.NotImplementedException();
681 }
682
678 public void SendEconomyData(float EnergyEfficiency, int ObjectCapacity, int ObjectCount, int PriceEnergyUnit, int PriceGroupCreate, int PriceObjectClaim, float PriceObjectRent, float PriceObjectScaleFactor, int PriceParcelClaim, float PriceParcelClaimFactor, int PriceParcelRent, int PricePublicObjectDecay, int PricePublicObjectDelete, int PriceRentLight, int PriceUpload, int TeleportMinPrice, float TeleportPriceExponent) 683 public void SendEconomyData(float EnergyEfficiency, int ObjectCapacity, int ObjectCount, int PriceEnergyUnit, int PriceGroupCreate, int PriceObjectClaim, float PriceObjectRent, float PriceObjectScaleFactor, int PriceParcelClaim, float PriceParcelClaimFactor, int PriceParcelRent, int PricePublicObjectDecay, int PricePublicObjectDelete, int PriceRentLight, int PriceUpload, int TeleportMinPrice, float TeleportPriceExponent)
679 { 684 {
680 throw new System.NotImplementedException(); 685 throw new System.NotImplementedException();
diff --git a/OpenSim/Framework/Capabilities/Caps.cs b/OpenSim/Framework/Capabilities/Caps.cs
index 5937ae6..dbb0781 100644
--- a/OpenSim/Framework/Capabilities/Caps.cs
+++ b/OpenSim/Framework/Capabilities/Caps.cs
@@ -1344,7 +1344,11 @@ namespace OpenSim.Framework.Capabilities
1344 /// <returns></returns> 1344 /// <returns></returns>
1345 public string uploaderCaps(byte[] data, string path, string param) 1345 public string uploaderCaps(byte[] data, string path, string param)
1346 { 1346 {
1347 m_log.WarnFormat("[CAPS] baked texture upload completed for {0}",newAssetID); 1347 handlerUpLoad = OnUpLoad;
1348 if (handlerUpLoad != null)
1349 {
1350 Util.FireAndForget(delegate(object o) { handlerUpLoad(newAssetID, data); });
1351 }
1348 1352
1349 string res = String.Empty; 1353 string res = String.Empty;
1350 LLSDAssetUploadComplete uploadComplete = new LLSDAssetUploadComplete(); 1354 LLSDAssetUploadComplete uploadComplete = new LLSDAssetUploadComplete();
@@ -1356,12 +1360,6 @@ namespace OpenSim.Framework.Capabilities
1356 1360
1357 httpListener.RemoveStreamHandler("POST", uploaderPath); 1361 httpListener.RemoveStreamHandler("POST", uploaderPath);
1358 1362
1359 handlerUpLoad = OnUpLoad;
1360 if (handlerUpLoad != null)
1361 {
1362 handlerUpLoad(newAssetID, data);
1363 }
1364
1365 m_log.InfoFormat("[CAPS] baked texture upload completed for {0}",newAssetID); 1363 m_log.InfoFormat("[CAPS] baked texture upload completed for {0}",newAssetID);
1366 1364
1367 return res; 1365 return res;
diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs
index 1a59cf4..34ec420 100644
--- a/OpenSim/Framework/IClientAPI.cs
+++ b/OpenSim/Framework/IClientAPI.cs
@@ -1062,6 +1062,8 @@ namespace OpenSim.Framework
1062 1062
1063 void SendXferPacket(ulong xferID, uint packet, byte[] data); 1063 void SendXferPacket(ulong xferID, uint packet, byte[] data);
1064 1064
1065 void SendAbortXferPacket(ulong xferID);
1066
1065 void SendEconomyData(float EnergyEfficiency, int ObjectCapacity, int ObjectCount, int PriceEnergyUnit, 1067 void SendEconomyData(float EnergyEfficiency, int ObjectCapacity, int ObjectCount, int PriceEnergyUnit,
1066 int PriceGroupCreate, int PriceObjectClaim, float PriceObjectRent, 1068 int PriceGroupCreate, int PriceObjectClaim, float PriceObjectRent,
1067 float PriceObjectScaleFactor, 1069 float PriceObjectScaleFactor,
diff --git a/OpenSim/Framework/Servers/HttpServer/BinaryStreamHandler.cs b/OpenSim/Framework/Servers/HttpServer/BinaryStreamHandler.cs
index 86fa44d..bae4e1b 100644
--- a/OpenSim/Framework/Servers/HttpServer/BinaryStreamHandler.cs
+++ b/OpenSim/Framework/Servers/HttpServer/BinaryStreamHandler.cs
@@ -53,8 +53,8 @@ namespace OpenSim.Framework.Servers.HttpServer
53 53
54 private static byte[] ReadFully(Stream stream) 54 private static byte[] ReadFully(Stream stream)
55 { 55 {
56 byte[] buffer = new byte[32768]; 56 byte[] buffer = new byte[1024];
57 using (MemoryStream ms = new MemoryStream()) 57 using (MemoryStream ms = new MemoryStream(1024*256))
58 { 58 {
59 while (true) 59 while (true)
60 { 60 {
diff --git a/OpenSim/Framework/Watchdog.cs b/OpenSim/Framework/Watchdog.cs
index 9baf3a0..3389ecb 100644
--- a/OpenSim/Framework/Watchdog.cs
+++ b/OpenSim/Framework/Watchdog.cs
@@ -127,7 +127,7 @@ namespace OpenSim.Framework
127 m_threads.Add(threadInfo.Thread.ManagedThreadId, threadInfo); 127 m_threads.Add(threadInfo.Thread.ManagedThreadId, threadInfo);
128 } 128 }
129 129
130 private static bool RemoveThread(int threadID) 130 public static bool RemoveThread(int threadID)
131 { 131 {
132 lock (m_threads) 132 lock (m_threads)
133 return m_threads.Remove(threadID); 133 return m_threads.Remove(threadID);
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index 00a605e..6a6bd12 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -2097,6 +2097,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
2097 OutPacket(sendXfer, ThrottleOutPacketType.Asset); 2097 OutPacket(sendXfer, ThrottleOutPacketType.Asset);
2098 } 2098 }
2099 2099
2100 public void SendAbortXferPacket(ulong xferID)
2101 {
2102 AbortXferPacket xferItem = (AbortXferPacket)PacketPool.Instance.GetPacket(PacketType.AbortXfer);
2103 xferItem.XferID.ID = xferID;
2104 OutPacket(xferItem, ThrottleOutPacketType.Asset);
2105 }
2106
2100 public void SendEconomyData(float EnergyEfficiency, int ObjectCapacity, int ObjectCount, int PriceEnergyUnit, 2107 public void SendEconomyData(float EnergyEfficiency, int ObjectCapacity, int ObjectCount, int PriceEnergyUnit,
2101 int PriceGroupCreate, int PriceObjectClaim, float PriceObjectRent, float PriceObjectScaleFactor, 2108 int PriceGroupCreate, int PriceObjectClaim, float PriceObjectRent, float PriceObjectScaleFactor,
2102 int PriceParcelClaim, float PriceParcelClaimFactor, int PriceParcelRent, int PricePublicObjectDecay, 2109 int PriceParcelClaim, float PriceParcelClaimFactor, int PriceParcelRent, int PricePublicObjectDecay,
diff --git a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs
index ef7dce8..c5a6e62 100644
--- a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs
+++ b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs
@@ -40,8 +40,8 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
40 private Scene m_scene; 40 private Scene m_scene;
41 private Dictionary<string, XferRequest> Requests = new Dictionary<string, XferRequest>(); 41 private Dictionary<string, XferRequest> Requests = new Dictionary<string, XferRequest>();
42 private List<XferRequest> RequestTime = new List<XferRequest>(); 42 private List<XferRequest> RequestTime = new List<XferRequest>();
43 public Dictionary<string, byte[]> NewFiles = new Dictionary<string, byte[]>(); 43 private Dictionary<string, FileData> NewFiles = new Dictionary<string, FileData>();
44 public Dictionary<ulong, XferDownLoad> Transfers = new Dictionary<ulong, XferDownLoad>(); 44 private Dictionary<ulong, XferDownLoad> Transfers = new Dictionary<ulong, XferDownLoad>();
45 45
46 46
47 public struct XferRequest 47 public struct XferRequest
@@ -51,6 +51,12 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
51 public string fileName; 51 public string fileName;
52 public DateTime timeStamp; 52 public DateTime timeStamp;
53 } 53 }
54
55 private class FileData
56 {
57 public byte[] Data;
58 public int Count;
59 }
54 60
55 #region IRegionModule Members 61 #region IRegionModule Members
56 62
@@ -89,20 +95,22 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
89 lock (NewFiles) 95 lock (NewFiles)
90 { 96 {
91 if (NewFiles.ContainsKey(fileName)) 97 if (NewFiles.ContainsKey(fileName))
92 { 98 NewFiles[fileName].Count++;
93 NewFiles[fileName] = data;
94 }
95 else 99 else
96 { 100 {
97 NewFiles.Add(fileName, data); 101 FileData fd = new FileData();
102 fd.Count = 1;
103 fd.Data = data;
104 NewFiles.Add(fileName, fd);
98 } 105 }
99 } 106 }
100 107
101 if (Requests.ContainsKey(fileName)) 108 // This should not be here
102 { 109 //if (Requests.ContainsKey(fileName))
103 RequestXfer(Requests[fileName].remoteClient, Requests[fileName].xferID, fileName); 110 //{
104 Requests.Remove(fileName); 111 // RequestXfer(Requests[fileName].remoteClient, Requests[fileName].xferID, fileName);
105 } 112 // Requests.Remove(fileName);
113 //}
106 114
107 return true; 115 return true;
108 } 116 }
@@ -113,6 +121,7 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
113 { 121 {
114 client.OnRequestXfer += RequestXfer; 122 client.OnRequestXfer += RequestXfer;
115 client.OnConfirmXfer += AckPacket; 123 client.OnConfirmXfer += AckPacket;
124 client.OnAbortXfer += AbortXfer;
116 } 125 }
117 126
118 /// <summary> 127 /// <summary>
@@ -125,20 +134,35 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
125 { 134 {
126 lock (NewFiles) 135 lock (NewFiles)
127 { 136 {
137 if (RequestTime.Count > 0)
138 {
139 TimeSpan ts = new TimeSpan(DateTime.UtcNow.Ticks - RequestTime[0].timeStamp.Ticks);
140 if (ts.TotalSeconds > 30)
141 {
142 ulong zxferid = RequestTime[0].xferID;
143 remoteClient.SendAbortXferPacket(zxferid);
144 RemoveXferData(zxferid);
145 RemoveOrDecrement(fileName);
146 }
147 }
148
128 if (NewFiles.ContainsKey(fileName)) 149 if (NewFiles.ContainsKey(fileName))
129 { 150 {
130 if (!Transfers.ContainsKey(xferID)) 151 if (!Transfers.ContainsKey(xferID))
131 { 152 {
132 byte[] fileData = NewFiles[fileName]; 153 byte[] fileData = NewFiles[fileName].Data;
133 XferDownLoad transaction = new XferDownLoad(fileName, fileData, xferID, remoteClient); 154 XferDownLoad transaction = new XferDownLoad(fileName, fileData, xferID, remoteClient);
134 155
135 Transfers.Add(xferID, transaction); 156 Transfers.Add(xferID, transaction);
136 NewFiles.Remove(fileName);
137 157
138 if (transaction.StartSend()) 158 if (transaction.StartSend())
139 { 159 {
140 Transfers.Remove(xferID); 160 RemoveXferData(xferID);
141 } 161 }
162
163 // The transaction for this file is either complete or on its way
164 RemoveOrDecrement(fileName);
165
142 } 166 }
143 } 167 }
144 else 168 else
@@ -150,6 +174,8 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
150 { 174 {
151 Requests.Remove(RequestTime[0].fileName); 175 Requests.Remove(RequestTime[0].fileName);
152 RequestTime.RemoveAt(0); 176 RequestTime.RemoveAt(0);
177 // Do we want to abort this here?
178 //remoteClient.SendAbortXfer(xferID);
153 } 179 }
154 } 180 }
155 181
@@ -165,22 +191,84 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
165 } 191 }
166 192
167 } 193 }
194
168 } 195 }
169 } 196 }
170 197
171 public void AckPacket(IClientAPI remoteClient, ulong xferID, uint packet) 198 public void AckPacket(IClientAPI remoteClient, ulong xferID, uint packet)
172 { 199 {
173 if (Transfers.ContainsKey(xferID)) 200 lock (NewFiles) // This is actually to lock Transfers
174 { 201 {
175 if (Transfers[xferID].AckPacket(packet)) 202 if (Transfers.ContainsKey(xferID))
176 { 203 {
204 XferDownLoad dl = Transfers[xferID];
205 if (Transfers[xferID].AckPacket(packet))
206 {
207 {
208 RemoveXferData(xferID);
209 RemoveOrDecrement(dl.FileName);
210 }
211 }
212 else
177 { 213 {
178 Transfers.Remove(xferID); 214
215 if (Requests.ContainsKey(dl.FileName))
216 {
217 //
218 XferRequest req = Requests[dl.FileName];
219 req.timeStamp = DateTime.UtcNow;
220 Requests[dl.FileName] = req;
221 }
179 } 222 }
180 } 223 }
181 } 224 }
182 } 225 }
183 226
227 private void RemoveXferData(ulong xferID)
228 {
229 // NewFiles must be locked!
230 if (Transfers.ContainsKey(xferID))
231 {
232 // Qualifier distinguishes between the OpenMetaverse version and the nested class
233
234 XferModule.XferDownLoad xferItem = Transfers[xferID];
235 //string filename = xferItem.FileName;
236 Transfers.Remove(xferID);
237 xferItem.Data = new byte[0]; // Clear the data
238 xferItem.DataPointer = 0;
239
240 // If the abort comes in
241
242 if (Requests.ContainsKey(xferItem.FileName))
243 Requests.Remove(xferItem.FileName);
244
245 }
246 }
247
248 public void AbortXfer(IClientAPI remoteClient, ulong xferID)
249 {
250 lock (NewFiles)
251 {
252 if (Transfers.ContainsKey(xferID))
253 RemoveOrDecrement(Transfers[xferID].FileName);
254
255 RemoveXferData(xferID);
256 }
257 }
258
259 private void RemoveOrDecrement(string fileName)
260 {
261 // NewFiles must be locked
262
263 if (NewFiles.ContainsKey(fileName))
264 {
265 if (NewFiles[fileName].Count == 1)
266 NewFiles.Remove(fileName);
267 else
268 NewFiles[fileName].Count--;
269 }
270 }
271
184 #region Nested type: XferDownLoad 272 #region Nested type: XferDownLoad
185 273
186 public class XferDownLoad 274 public class XferDownLoad
diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs
index 80adc46..a3e3b4e 100644
--- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs
@@ -620,8 +620,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
620 } 620 }
621 catch (WebException e) 621 catch (WebException e)
622 { 622 {
623 m_log.ErrorFormat("[GRID INSTANT MESSAGE]: Error sending message to {0}} the host didn't respond ({2})", 623 m_log.ErrorFormat("[GRID INSTANT MESSAGE]: Error sending message to {0} the host didn't respond " + e.ToString(), reginfo.ServerURI.ToString());
624 reginfo.ServerURI, e.Message);
625 } 624 }
626 625
627 return false; 626 return false;
diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs
index 7441a60..a6e2c03 100644
--- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs
+++ b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs
@@ -602,6 +602,12 @@ namespace OpenSim.Region.Examples.SimpleModule
602 { 602 {
603 } 603 }
604 604
605 public virtual void SendAbortXferPacket(ulong xferID)
606 {
607
608 }
609
610
605 public virtual void SendEconomyData(float EnergyEfficiency, int ObjectCapacity, int ObjectCount, int PriceEnergyUnit, 611 public virtual void SendEconomyData(float EnergyEfficiency, int ObjectCapacity, int ObjectCount, int PriceEnergyUnit,
606 int PriceGroupCreate, int PriceObjectClaim, float PriceObjectRent, float PriceObjectScaleFactor, 612 int PriceGroupCreate, int PriceObjectClaim, float PriceObjectRent, float PriceObjectScaleFactor,
607 int PriceParcelClaim, float PriceParcelClaimFactor, int PriceParcelRent, int PricePublicObjectDecay, 613 int PriceParcelClaim, float PriceParcelClaimFactor, int PriceParcelRent, int PricePublicObjectDecay,
diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
index ed40da9..4b17b9a 100644
--- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
+++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
@@ -196,13 +196,6 @@ namespace OpenSim.Region.Framework.Interfaces
196 int RemoveInventoryItem(UUID itemID); 196 int RemoveInventoryItem(UUID itemID);
197 197
198 /// <summary> 198 /// <summary>
199 /// Return the name with which a client can request a xfer of this prim's inventory metadata
200 /// </summary>
201 string GetInventoryFileName();
202
203 bool GetInventoryFileName(IClientAPI client, uint localID);
204
205 /// <summary>
206 /// Serialize all the metadata for the items in this prim's inventory ready for sending to the client 199 /// Serialize all the metadata for the items in this prim's inventory ready for sending to the client
207 /// </summary> 200 /// </summary>
208 /// <param name="xferManager"></param> 201 /// <param name="xferManager"></param>
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index a1f1ea5..47c574a 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -951,23 +951,12 @@ namespace OpenSim.Region.Framework.Scenes
951 /// <param name="primLocalID"></param> 951 /// <param name="primLocalID"></param>
952 public void RequestTaskInventory(IClientAPI remoteClient, uint primLocalID) 952 public void RequestTaskInventory(IClientAPI remoteClient, uint primLocalID)
953 { 953 {
954 SceneObjectGroup group = GetGroupByPrim(primLocalID); 954 SceneObjectPart part = GetSceneObjectPart(primLocalID);
955 if (group != null) 955 if (part == null)
956 { 956 return;
957 bool fileChange = group.GetPartInventoryFileName(remoteClient, primLocalID); 957
958 if (fileChange) 958 if (XferManager != null)
959 { 959 part.Inventory.RequestInventoryFile(remoteClient, XferManager);
960 if (XferManager != null)
961 {
962 group.RequestInventoryFile(remoteClient, primLocalID, XferManager);
963 }
964 }
965 }
966 else
967 {
968 m_log.ErrorFormat(
969 "[PRIM INVENTORY]: Inventory requested of prim {0} which doesn't exist", primLocalID);
970 }
971 } 960 }
972 961
973 /// <summary> 962 /// <summary>
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index d915807..deeb817 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1093,6 +1093,7 @@ namespace OpenSim.Region.Framework.Scenes
1093 { 1093 {
1094 m_log.ErrorFormat("[SCENE]: Restarting heartbeat thread because it hasn't reported in in region {0}", RegionInfo.RegionName); 1094 m_log.ErrorFormat("[SCENE]: Restarting heartbeat thread because it hasn't reported in in region {0}", RegionInfo.RegionName);
1095 HeartbeatThread.Abort(); 1095 HeartbeatThread.Abort();
1096 Watchdog.RemoveThread(HeartbeatThread.ManagedThreadId);
1096 HeartbeatThread = null; 1097 HeartbeatThread = null;
1097 } 1098 }
1098 m_lastUpdate = Util.EnvironmentTickCount(); 1099 m_lastUpdate = Util.EnvironmentTickCount();
@@ -4801,7 +4802,7 @@ namespace OpenSim.Region.Framework.Scenes
4801 if (m_firstHeartbeat) 4802 if (m_firstHeartbeat)
4802 return; 4803 return;
4803 4804
4804 if (Util.EnvironmentTickCountSubtract(m_lastUpdate) > 2000) 4805 if (Util.EnvironmentTickCountSubtract(m_lastUpdate) > 10000)
4805 StartTimer(); 4806 StartTimer();
4806 } 4807 }
4807 4808
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
index 6cc7231..50521c4 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
@@ -77,49 +77,6 @@ namespace OpenSim.Region.Framework.Scenes
77 } 77 }
78 78
79 /// <summary> 79 /// <summary>
80 ///
81 /// </summary>
82 /// <param name="remoteClient"></param>
83 /// <param name="localID"></param>
84 public bool GetPartInventoryFileName(IClientAPI remoteClient, uint localID)
85 {
86 SceneObjectPart part = GetChildPart(localID);
87 if (part != null)
88 {
89 return part.Inventory.GetInventoryFileName(remoteClient, localID);
90 }
91 else
92 {
93 m_log.ErrorFormat(
94 "[PRIM INVENTORY]: " +
95 "Couldn't find part {0} in object group {1}, {2} to retreive prim inventory",
96 localID, Name, UUID);
97 }
98 return false;
99 }
100
101 /// <summary>
102 /// Return serialized inventory metadata for the given constituent prim
103 /// </summary>
104 /// <param name="localID"></param>
105 /// <param name="xferManager"></param>
106 public void RequestInventoryFile(IClientAPI client, uint localID, IXfer xferManager)
107 {
108 SceneObjectPart part = GetChildPart(localID);
109 if (part != null)
110 {
111 part.Inventory.RequestInventoryFile(client, xferManager);
112 }
113 else
114 {
115 m_log.ErrorFormat(
116 "[PRIM INVENTORY]: " +
117 "Couldn't find part {0} in object group {1}, {2} to request inventory data",
118 localID, Name, UUID);
119 }
120 }
121
122 /// <summary>
123 /// Add an inventory item to a prim in this group. 80 /// Add an inventory item to a prim in this group.
124 /// </summary> 81 /// </summary>
125 /// <param name="remoteClient"></param> 82 /// <param name="remoteClient"></param>
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 8fcfcc5..9412e09 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -46,7 +46,8 @@ namespace OpenSim.Region.Framework.Scenes
46 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 46 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
47 47
48 private string m_inventoryFileName = String.Empty; 48 private string m_inventoryFileName = String.Empty;
49 private int m_inventoryFileNameSerial = 0; 49 private byte[] m_inventoryFileData = new byte[0];
50 private uint m_inventoryFileNameSerial = 0;
50 51
51 private Dictionary<UUID, ArrayList> m_scriptErrors = new Dictionary<UUID, ArrayList>(); 52 private Dictionary<UUID, ArrayList> m_scriptErrors = new Dictionary<UUID, ArrayList>();
52 53
@@ -930,39 +931,17 @@ namespace OpenSim.Region.Framework.Scenes
930 return -1; 931 return -1;
931 } 932 }
932 933
933 public string GetInventoryFileName() 934 private bool CreateInventoryFileName()
934 { 935 {
935 if (m_inventoryFileName == String.Empty) 936 if (m_inventoryFileName == String.Empty ||
936 m_inventoryFileName = "inventory_" + UUID.Random().ToString() + ".tmp"; 937 m_inventoryFileNameSerial < m_inventorySerial)
937 if (m_inventoryFileNameSerial < m_inventorySerial)
938 { 938 {
939 m_inventoryFileName = "inventory_" + UUID.Random().ToString() + ".tmp"; 939 m_inventoryFileName = "inventory_" + UUID.Random().ToString() + ".tmp";
940 } 940 m_inventoryFileNameSerial = m_inventorySerial;
941 return m_inventoryFileName;
942 }
943
944 /// <summary>
945 /// Return the name with which a client can request a xfer of this prim's inventory metadata
946 /// </summary>
947 /// <param name="client"></param>
948 /// <param name="localID"></param>
949 public bool GetInventoryFileName(IClientAPI client, uint localID)
950 {
951// m_log.DebugFormat(
952// "[PRIM INVENTORY]: Received request from client {0} for inventory file name of {1}, {2}",
953// client.AgentId, Name, UUID);
954
955 if (m_inventorySerial > 0)
956 {
957 client.SendTaskInventory(m_part.UUID, (short)m_inventorySerial,
958 Utils.StringToBytes(GetInventoryFileName()));
959 return true; 941 return true;
960 } 942 }
961 else 943
962 { 944 return false;
963 client.SendTaskInventory(m_part.UUID, 0, new byte[0]);
964 return false;
965 }
966 } 945 }
967 946
968 /// <summary> 947 /// <summary>
@@ -971,78 +950,92 @@ namespace OpenSim.Region.Framework.Scenes
971 /// <param name="xferManager"></param> 950 /// <param name="xferManager"></param>
972 public void RequestInventoryFile(IClientAPI client, IXfer xferManager) 951 public void RequestInventoryFile(IClientAPI client, IXfer xferManager)
973 { 952 {
974 byte[] fileData = new byte[0]; 953 bool changed = CreateInventoryFileName();
975 954
976 // Confusingly, the folder item has to be the object id, while the 'parent id' has to be zero. This matches
977 // what appears to happen in the Second Life protocol. If this isn't the case. then various functionality
978 // isn't available (such as drag from prim inventory to agent inventory)
979 InventoryStringBuilder invString = new InventoryStringBuilder(m_part.UUID, UUID.Zero); 955 InventoryStringBuilder invString = new InventoryStringBuilder(m_part.UUID, UUID.Zero);
980 956
957 Items.LockItemsForRead(true);
958
959 if (m_inventorySerial == 0) // No inventory
960 {
961 client.SendTaskInventory(m_part.UUID, 0, new byte[0]);
962 Items.LockItemsForRead(false);
963 return;
964 }
965
966 client.SendTaskInventory(m_part.UUID, (short)m_inventorySerial,
967 Util.StringToBytes256(m_inventoryFileName));
968
969 if (!changed)
970 {
971 if (m_inventoryFileData.Length > 2)
972 {
973 xferManager.AddNewFile(m_inventoryFileName,
974 m_inventoryFileData);
975 Items.LockItemsForRead(false);
976 return;
977 }
978 }
979
981 bool includeAssets = false; 980 bool includeAssets = false;
982 if (m_part.ParentGroup.Scene.Permissions.CanEditObjectInventory(m_part.UUID, client.AgentId)) 981 if (m_part.ParentGroup.Scene.Permissions.CanEditObjectInventory(m_part.UUID, client.AgentId))
983 includeAssets = true; 982 includeAssets = true;
984 983
985 lock (m_items) 984 foreach (TaskInventoryItem item in m_items.Values)
986 { 985 {
987 foreach (TaskInventoryItem item in m_items.Values) 986 UUID ownerID = item.OwnerID;
988 { 987 uint everyoneMask = 0;
989 UUID ownerID = item.OwnerID; 988 uint baseMask = item.BasePermissions;
990 uint everyoneMask = 0; 989 uint ownerMask = item.CurrentPermissions;
991 uint baseMask = item.BasePermissions; 990 uint groupMask = item.GroupPermissions;
992 uint ownerMask = item.CurrentPermissions; 991
993 uint groupMask = item.GroupPermissions; 992 invString.AddItemStart();
994 993 invString.AddNameValueLine("item_id", item.ItemID.ToString());
995 invString.AddItemStart(); 994 invString.AddNameValueLine("parent_id", m_part.UUID.ToString());
996 invString.AddNameValueLine("item_id", item.ItemID.ToString()); 995
997 invString.AddNameValueLine("parent_id", m_part.UUID.ToString()); 996 invString.AddPermissionsStart();
998 997
999 invString.AddPermissionsStart(); 998 invString.AddNameValueLine("base_mask", Utils.UIntToHexString(baseMask));
1000 999 invString.AddNameValueLine("owner_mask", Utils.UIntToHexString(ownerMask));
1001 invString.AddNameValueLine("base_mask", Utils.UIntToHexString(baseMask)); 1000 invString.AddNameValueLine("group_mask", Utils.UIntToHexString(groupMask));
1002 invString.AddNameValueLine("owner_mask", Utils.UIntToHexString(ownerMask)); 1001 invString.AddNameValueLine("everyone_mask", Utils.UIntToHexString(everyoneMask));
1003 invString.AddNameValueLine("group_mask", Utils.UIntToHexString(groupMask)); 1002 invString.AddNameValueLine("next_owner_mask", Utils.UIntToHexString(item.NextPermissions));
1004 invString.AddNameValueLine("everyone_mask", Utils.UIntToHexString(everyoneMask)); 1003
1005 invString.AddNameValueLine("next_owner_mask", Utils.UIntToHexString(item.NextPermissions)); 1004 invString.AddNameValueLine("creator_id", item.CreatorID.ToString());
1006 1005 invString.AddNameValueLine("owner_id", ownerID.ToString());
1007 invString.AddNameValueLine("creator_id", item.CreatorID.ToString()); 1006
1008 invString.AddNameValueLine("owner_id", ownerID.ToString()); 1007 invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString());
1009 1008
1010 invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString()); 1009 invString.AddNameValueLine("group_id", item.GroupID.ToString());
1011 1010 invString.AddSectionEnd();
1012 invString.AddNameValueLine("group_id", item.GroupID.ToString()); 1011
1013 invString.AddSectionEnd(); 1012 if (includeAssets)
1014 1013 invString.AddNameValueLine("asset_id", item.AssetID.ToString());
1015 if (includeAssets) 1014 else
1016 invString.AddNameValueLine("asset_id", item.AssetID.ToString()); 1015 invString.AddNameValueLine("asset_id", UUID.Zero.ToString());
1017 else 1016 invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]);
1018 invString.AddNameValueLine("asset_id", UUID.Zero.ToString()); 1017 invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]);
1019 invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]); 1018 invString.AddNameValueLine("flags", Utils.UIntToHexString(item.Flags));
1020 invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]); 1019
1021 invString.AddNameValueLine("flags", Utils.UIntToHexString(item.Flags)); 1020 invString.AddSaleStart();
1022 1021 invString.AddNameValueLine("sale_type", "not");
1023 invString.AddSaleStart(); 1022 invString.AddNameValueLine("sale_price", "0");
1024 invString.AddNameValueLine("sale_type", "not"); 1023 invString.AddSectionEnd();
1025 invString.AddNameValueLine("sale_price", "0"); 1024
1026 invString.AddSectionEnd(); 1025 invString.AddNameValueLine("name", item.Name + "|");
1027 1026 invString.AddNameValueLine("desc", item.Description + "|");
1028 invString.AddNameValueLine("name", item.Name + "|"); 1027
1029 invString.AddNameValueLine("desc", item.Description + "|"); 1028 invString.AddNameValueLine("creation_date", item.CreationDate.ToString());
1030 1029 invString.AddSectionEnd();
1031 invString.AddNameValueLine("creation_date", item.CreationDate.ToString());
1032 invString.AddSectionEnd();
1033 }
1034 } 1030 }
1035 int count = m_items.Count;
1036 m_items.LockItemsForRead(false);
1037 1031
1038 fileData = Utils.StringToBytes(invString.BuildString); 1032 Items.LockItemsForRead(false);
1039 1033
1040 //m_log.Debug(Utils.BytesToString(fileData)); 1034 m_inventoryFileData = Utils.StringToBytes(invString.BuildString);
1041 //m_log.Debug("[PRIM INVENTORY]: RequestInventoryFile fileData: " + Utils.BytesToString(fileData));
1042 1035
1043 if (fileData.Length > 2) 1036 if (m_inventoryFileData.Length > 2)
1044 { 1037 {
1045 xferManager.AddNewFile(m_inventoryFileName, fileData); 1038 xferManager.AddNewFile(m_inventoryFileName, m_inventoryFileData);
1046 } 1039 }
1047 } 1040 }
1048 1041
diff --git a/OpenSim/Region/Framework/Scenes/SceneViewer.cs b/OpenSim/Region/Framework/Scenes/SceneViewer.cs
index b44a010..40a73a9 100644
--- a/OpenSim/Region/Framework/Scenes/SceneViewer.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneViewer.cs
@@ -106,7 +106,7 @@ namespace OpenSim.Region.Framework.Scenes
106 g.ScheduleFullUpdateToAvatar(m_presence); 106 g.ScheduleFullUpdateToAvatar(m_presence);
107 } 107 }
108 108
109 while (m_partsUpdateQueue.Count > 0) 109 while (m_partsUpdateQueue.Count != null && m_partsUpdateQueue.Count > 0)
110 { 110 {
111 SceneObjectPart part = m_partsUpdateQueue.Dequeue(); 111 SceneObjectPart part = m_partsUpdateQueue.Dequeue();
112 112
diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
index 276e46d..75f6441 100644
--- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
+++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
@@ -1123,6 +1123,11 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
1123 1123
1124 } 1124 }
1125 1125
1126 public void SendAbortXferPacket(ulong xferID)
1127 {
1128
1129 }
1130
1126 public void SendEconomyData(float EnergyEfficiency, int ObjectCapacity, int ObjectCount, int PriceEnergyUnit, int PriceGroupCreate, int PriceObjectClaim, float PriceObjectRent, float PriceObjectScaleFactor, int PriceParcelClaim, float PriceParcelClaimFactor, int PriceParcelRent, int PricePublicObjectDecay, int PricePublicObjectDelete, int PriceRentLight, int PriceUpload, int TeleportMinPrice, float TeleportPriceExponent) 1131 public void SendEconomyData(float EnergyEfficiency, int ObjectCapacity, int ObjectCount, int PriceEnergyUnit, int PriceGroupCreate, int PriceObjectClaim, float PriceObjectRent, float PriceObjectScaleFactor, int PriceParcelClaim, float PriceParcelClaimFactor, int PriceParcelRent, int PricePublicObjectDecay, int PricePublicObjectDelete, int PriceRentLight, int PriceUpload, int TeleportMinPrice, float TeleportPriceExponent)
1127 { 1132 {
1128 1133
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
index 39c3364..51949b4 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
@@ -687,6 +687,10 @@ namespace OpenSim.Region.OptionalModules.World.NPC
687 public virtual void SendXferPacket(ulong xferID, uint packet, byte[] data) 687 public virtual void SendXferPacket(ulong xferID, uint packet, byte[] data)
688 { 688 {
689 } 689 }
690 public virtual void SendAbortXferPacket(ulong xferID)
691 {
692
693 }
690 694
691 public virtual void SendEconomyData(float EnergyEfficiency, int ObjectCapacity, int ObjectCount, int PriceEnergyUnit, 695 public virtual void SendEconomyData(float EnergyEfficiency, int ObjectCapacity, int ObjectCount, int PriceEnergyUnit,
692 int PriceGroupCreate, int PriceObjectClaim, float PriceObjectRent, float PriceObjectScaleFactor, 696 int PriceGroupCreate, int PriceObjectClaim, float PriceObjectRent, float PriceObjectScaleFactor,
diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs
index fbc339a..69a152f 100644
--- a/OpenSim/Tests/Common/Mock/TestClient.cs
+++ b/OpenSim/Tests/Common/Mock/TestClient.cs
@@ -696,6 +696,11 @@ namespace OpenSim.Tests.Common.Mock
696 { 696 {
697 } 697 }
698 698
699 public virtual void SendAbortXferPacket(ulong xferID)
700 {
701
702 }
703
699 public virtual void SendEconomyData(float EnergyEfficiency, int ObjectCapacity, int ObjectCount, int PriceEnergyUnit, 704 public virtual void SendEconomyData(float EnergyEfficiency, int ObjectCapacity, int ObjectCount, int PriceEnergyUnit,
700 int PriceGroupCreate, int PriceObjectClaim, float PriceObjectRent, float PriceObjectScaleFactor, 705 int PriceGroupCreate, int PriceObjectClaim, float PriceObjectRent, float PriceObjectScaleFactor,
701 int PriceParcelClaim, float PriceParcelClaimFactor, int PriceParcelRent, int PricePublicObjectDecay, 706 int PriceParcelClaim, float PriceParcelClaimFactor, int PriceParcelRent, int PricePublicObjectDecay,