diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | 738 |
1 files changed, 434 insertions, 304 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 3a8f168..2cde8f3 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | |||
@@ -46,6 +46,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
46 | 46 | ||
47 | private string m_inventoryFileName = String.Empty; | 47 | private string m_inventoryFileName = String.Empty; |
48 | private int m_inventoryFileNameSerial = 0; | 48 | private int m_inventoryFileNameSerial = 0; |
49 | |||
50 | private Dictionary<UUID, ArrayList> m_scriptErrors = new Dictionary<UUID, ArrayList>(); | ||
49 | 51 | ||
50 | /// <value> | 52 | /// <value> |
51 | /// The part to which the inventory belongs. | 53 | /// The part to which the inventory belongs. |
@@ -82,7 +84,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
82 | /// </value> | 84 | /// </value> |
83 | protected internal TaskInventoryDictionary Items | 85 | protected internal TaskInventoryDictionary Items |
84 | { | 86 | { |
85 | get { return m_items; } | 87 | get { |
88 | return m_items; | ||
89 | } | ||
86 | set | 90 | set |
87 | { | 91 | { |
88 | m_items = value; | 92 | m_items = value; |
@@ -118,22 +122,25 @@ namespace OpenSim.Region.Framework.Scenes | |||
118 | /// <param name="linkNum">Link number for the part</param> | 122 | /// <param name="linkNum">Link number for the part</param> |
119 | public void ResetInventoryIDs() | 123 | public void ResetInventoryIDs() |
120 | { | 124 | { |
121 | lock (Items) | 125 | m_items.LockItemsForWrite(true); |
126 | |||
127 | if (0 == Items.Count) | ||
122 | { | 128 | { |
123 | if (0 == Items.Count) | 129 | m_items.LockItemsForWrite(false); |
124 | return; | 130 | return; |
131 | } | ||
125 | 132 | ||
126 | HasInventoryChanged = true; | 133 | HasInventoryChanged = true; |
127 | m_part.ParentGroup.HasGroupChanged = true; | 134 | m_part.ParentGroup.HasGroupChanged = true; |
128 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); | 135 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); |
129 | Items.Clear(); | 136 | Items.Clear(); |
130 | 137 | ||
131 | foreach (TaskInventoryItem item in items) | 138 | foreach (TaskInventoryItem item in items) |
132 | { | 139 | { |
133 | item.ResetIDs(m_part.UUID); | 140 | item.ResetIDs(m_part.UUID); |
134 | Items.Add(item.ItemID, item); | 141 | Items.Add(item.ItemID, item); |
135 | } | ||
136 | } | 142 | } |
143 | m_items.LockItemsForWrite(false); | ||
137 | } | 144 | } |
138 | 145 | ||
139 | /// <summary> | 146 | /// <summary> |
@@ -142,25 +149,25 @@ namespace OpenSim.Region.Framework.Scenes | |||
142 | /// <param name="ownerId"></param> | 149 | /// <param name="ownerId"></param> |
143 | public void ChangeInventoryOwner(UUID ownerId) | 150 | public void ChangeInventoryOwner(UUID ownerId) |
144 | { | 151 | { |
145 | lock (Items) | 152 | m_items.LockItemsForWrite(true); |
153 | if (0 == Items.Count) | ||
146 | { | 154 | { |
147 | if (0 == Items.Count) | 155 | m_items.LockItemsForWrite(false); |
148 | { | 156 | return; |
149 | return; | 157 | } |
150 | } | ||
151 | 158 | ||
152 | HasInventoryChanged = true; | 159 | HasInventoryChanged = true; |
153 | m_part.ParentGroup.HasGroupChanged = true; | 160 | m_part.ParentGroup.HasGroupChanged = true; |
154 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); | 161 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); |
155 | foreach (TaskInventoryItem item in items) | 162 | foreach (TaskInventoryItem item in items) |
163 | { | ||
164 | if (ownerId != item.OwnerID) | ||
156 | { | 165 | { |
157 | if (ownerId != item.OwnerID) | 166 | item.LastOwnerID = item.OwnerID; |
158 | { | 167 | item.OwnerID = ownerId; |
159 | item.LastOwnerID = item.OwnerID; | ||
160 | item.OwnerID = ownerId; | ||
161 | } | ||
162 | } | 168 | } |
163 | } | 169 | } |
170 | m_items.LockItemsForWrite(false); | ||
164 | } | 171 | } |
165 | 172 | ||
166 | /// <summary> | 173 | /// <summary> |
@@ -169,24 +176,24 @@ namespace OpenSim.Region.Framework.Scenes | |||
169 | /// <param name="groupID"></param> | 176 | /// <param name="groupID"></param> |
170 | public void ChangeInventoryGroup(UUID groupID) | 177 | public void ChangeInventoryGroup(UUID groupID) |
171 | { | 178 | { |
172 | lock (Items) | 179 | m_items.LockItemsForWrite(true); |
180 | if (0 == Items.Count) | ||
173 | { | 181 | { |
174 | if (0 == Items.Count) | 182 | m_items.LockItemsForWrite(false); |
175 | { | 183 | return; |
176 | return; | 184 | } |
177 | } | ||
178 | 185 | ||
179 | HasInventoryChanged = true; | 186 | HasInventoryChanged = true; |
180 | m_part.ParentGroup.HasGroupChanged = true; | 187 | m_part.ParentGroup.HasGroupChanged = true; |
181 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); | 188 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); |
182 | foreach (TaskInventoryItem item in items) | 189 | foreach (TaskInventoryItem item in items) |
190 | { | ||
191 | if (groupID != item.GroupID) | ||
183 | { | 192 | { |
184 | if (groupID != item.GroupID) | 193 | item.GroupID = groupID; |
185 | { | ||
186 | item.GroupID = groupID; | ||
187 | } | ||
188 | } | 194 | } |
189 | } | 195 | } |
196 | m_items.LockItemsForWrite(false); | ||
190 | } | 197 | } |
191 | 198 | ||
192 | /// <summary> | 199 | /// <summary> |
@@ -194,15 +201,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
194 | /// </summary> | 201 | /// </summary> |
195 | public void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource) | 202 | public void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource) |
196 | { | 203 | { |
197 | lock (m_items) | 204 | Items.LockItemsForRead(true); |
205 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); | ||
206 | Items.LockItemsForRead(false); | ||
207 | foreach (TaskInventoryItem item in items) | ||
198 | { | 208 | { |
199 | foreach (TaskInventoryItem item in Items.Values) | 209 | if ((int)InventoryType.LSL == item.InvType) |
200 | { | 210 | { |
201 | if ((int)InventoryType.LSL == item.InvType) | 211 | CreateScriptInstance(item, startParam, postOnRez, engine, stateSource); |
202 | { | 212 | Thread.Sleep(10); // workaround for Mono cpu utilization > 100% bug |
203 | CreateScriptInstance(item, startParam, postOnRez, engine, stateSource); | ||
204 | Thread.Sleep(10); // workaround for Mono cpu utilization > 100% bug | ||
205 | } | ||
206 | } | 213 | } |
207 | } | 214 | } |
208 | } | 215 | } |
@@ -237,16 +244,20 @@ namespace OpenSim.Region.Framework.Scenes | |||
237 | /// </param> | 244 | /// </param> |
238 | public void RemoveScriptInstances(bool sceneObjectBeingDeleted) | 245 | public void RemoveScriptInstances(bool sceneObjectBeingDeleted) |
239 | { | 246 | { |
240 | lock (Items) | 247 | Items.LockItemsForRead(true); |
248 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); | ||
249 | Items.LockItemsForRead(false); | ||
250 | |||
251 | foreach (TaskInventoryItem item in items) | ||
241 | { | 252 | { |
242 | foreach (TaskInventoryItem item in Items.Values) | 253 | if ((int)InventoryType.LSL == item.InvType) |
243 | { | 254 | { |
244 | if ((int)InventoryType.LSL == item.InvType) | 255 | RemoveScriptInstance(item.ItemID, sceneObjectBeingDeleted); |
245 | { | 256 | m_part.RemoveScriptEvents(item.ItemID); |
246 | RemoveScriptInstance(item.ItemID, sceneObjectBeingDeleted); | ||
247 | } | ||
248 | } | 257 | } |
249 | } | 258 | } |
259 | |||
260 | |||
250 | } | 261 | } |
251 | 262 | ||
252 | /// <summary> | 263 | /// <summary> |
@@ -262,7 +273,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
262 | // item.Name, item.ItemID, m_part.Name, m_part.UUID); | 273 | // item.Name, item.ItemID, m_part.Name, m_part.UUID); |
263 | 274 | ||
264 | if (!m_part.ParentGroup.Scene.Permissions.CanRunScript(item.ItemID, m_part.UUID, item.OwnerID)) | 275 | if (!m_part.ParentGroup.Scene.Permissions.CanRunScript(item.ItemID, m_part.UUID, item.OwnerID)) |
276 | { | ||
277 | StoreScriptError(item.ItemID, "no permission"); | ||
265 | return; | 278 | return; |
279 | } | ||
266 | 280 | ||
267 | m_part.AddFlag(PrimFlags.Scripted); | 281 | m_part.AddFlag(PrimFlags.Scripted); |
268 | 282 | ||
@@ -271,14 +285,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
271 | if (stateSource == 1 && // Prim crossing | 285 | if (stateSource == 1 && // Prim crossing |
272 | m_part.ParentGroup.Scene.m_trustBinaries) | 286 | m_part.ParentGroup.Scene.m_trustBinaries) |
273 | { | 287 | { |
274 | lock (m_items) | 288 | m_items.LockItemsForWrite(true); |
275 | { | 289 | m_items[item.ItemID].PermsMask = 0; |
276 | m_items[item.ItemID].PermsMask = 0; | 290 | m_items[item.ItemID].PermsGranter = UUID.Zero; |
277 | m_items[item.ItemID].PermsGranter = UUID.Zero; | 291 | m_items.LockItemsForWrite(false); |
278 | } | ||
279 | |||
280 | m_part.ParentGroup.Scene.EventManager.TriggerRezScript( | 292 | m_part.ParentGroup.Scene.EventManager.TriggerRezScript( |
281 | m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource); | 293 | m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource); |
294 | StoreScriptErrors(item.ItemID, null); | ||
282 | m_part.ParentGroup.AddActiveScriptCount(1); | 295 | m_part.ParentGroup.AddActiveScriptCount(1); |
283 | m_part.ScheduleFullUpdate(); | 296 | m_part.ScheduleFullUpdate(); |
284 | return; | 297 | return; |
@@ -287,6 +300,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
287 | AssetBase asset = m_part.ParentGroup.Scene.AssetService.Get(item.AssetID.ToString()); | 300 | AssetBase asset = m_part.ParentGroup.Scene.AssetService.Get(item.AssetID.ToString()); |
288 | if (null == asset) | 301 | if (null == asset) |
289 | { | 302 | { |
303 | string msg = String.Format("asset ID {0} could not be found", item.AssetID); | ||
304 | StoreScriptError(item.ItemID, msg); | ||
290 | m_log.ErrorFormat( | 305 | m_log.ErrorFormat( |
291 | "[PRIM INVENTORY]: " + | 306 | "[PRIM INVENTORY]: " + |
292 | "Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found", | 307 | "Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found", |
@@ -295,20 +310,22 @@ namespace OpenSim.Region.Framework.Scenes | |||
295 | } | 310 | } |
296 | else | 311 | else |
297 | { | 312 | { |
298 | lock (m_items) | 313 | if (m_part.ParentGroup.m_savedScriptState != null) |
299 | { | 314 | RestoreSavedScriptState(item.OldItemID, item.ItemID); |
300 | if (m_part.ParentGroup.m_savedScriptState != null) | ||
301 | RestoreSavedScriptState(item.OldItemID, item.ItemID); | ||
302 | 315 | ||
303 | m_items[item.ItemID].PermsMask = 0; | 316 | m_items.LockItemsForWrite(true); |
304 | m_items[item.ItemID].PermsGranter = UUID.Zero; | ||
305 | 317 | ||
306 | string script = Utils.BytesToString(asset.Data); | 318 | m_items[item.ItemID].PermsMask = 0; |
307 | m_part.ParentGroup.Scene.EventManager.TriggerRezScript( | 319 | m_items[item.ItemID].PermsGranter = UUID.Zero; |
308 | m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource); | 320 | |
309 | m_part.ParentGroup.AddActiveScriptCount(1); | 321 | m_items.LockItemsForWrite(false); |
310 | m_part.ScheduleFullUpdate(); | 322 | |
311 | } | 323 | string script = Utils.BytesToString(asset.Data); |
324 | m_part.ParentGroup.Scene.EventManager.TriggerRezScript( | ||
325 | m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource); | ||
326 | StoreScriptErrors(item.ItemID, null); | ||
327 | m_part.ParentGroup.AddActiveScriptCount(1); | ||
328 | m_part.ScheduleFullUpdate(); | ||
312 | } | 329 | } |
313 | } | 330 | } |
314 | } | 331 | } |
@@ -370,27 +387,145 @@ namespace OpenSim.Region.Framework.Scenes | |||
370 | 387 | ||
371 | /// <summary> | 388 | /// <summary> |
372 | /// Start a script which is in this prim's inventory. | 389 | /// Start a script which is in this prim's inventory. |
390 | /// Some processing may occur in the background, but this routine returns asap. | ||
373 | /// </summary> | 391 | /// </summary> |
374 | /// <param name="itemId"> | 392 | /// <param name="itemId"> |
375 | /// A <see cref="UUID"/> | 393 | /// A <see cref="UUID"/> |
376 | /// </param> | 394 | /// </param> |
377 | public void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource) | 395 | public void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource) |
378 | { | 396 | { |
379 | lock (m_items) | 397 | lock (m_scriptErrors) |
398 | { | ||
399 | // Indicate to CreateScriptInstanceInternal() we don't want it to wait for completion | ||
400 | m_scriptErrors.Remove(itemId); | ||
401 | } | ||
402 | CreateScriptInstanceInternal(itemId, startParam, postOnRez, engine, stateSource); | ||
403 | } | ||
404 | |||
405 | private void CreateScriptInstanceInternal(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource) | ||
406 | { | ||
407 | m_items.LockItemsForRead(true); | ||
408 | if (m_items.ContainsKey(itemId)) | ||
380 | { | 409 | { |
381 | if (m_items.ContainsKey(itemId)) | 410 | if (m_items.ContainsKey(itemId)) |
382 | { | 411 | { |
412 | m_items.LockItemsForRead(false); | ||
383 | CreateScriptInstance(m_items[itemId], startParam, postOnRez, engine, stateSource); | 413 | CreateScriptInstance(m_items[itemId], startParam, postOnRez, engine, stateSource); |
384 | } | 414 | } |
385 | else | 415 | else |
386 | { | 416 | { |
417 | m_items.LockItemsForRead(false); | ||
418 | string msg = String.Format("couldn't be found for prim {0}, {1} at {2} in {3}", m_part.Name, m_part.UUID, | ||
419 | m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); | ||
420 | StoreScriptError(itemId, msg); | ||
387 | m_log.ErrorFormat( | 421 | m_log.ErrorFormat( |
388 | "[PRIM INVENTORY]: " + | 422 | "[PRIM INVENTORY]: " + |
389 | "Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2} at {3} in {4}", | 423 | "Couldn't start script with ID {0} since it {1}", itemId, msg); |
390 | itemId, m_part.Name, m_part.UUID, | ||
391 | m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); | ||
392 | } | 424 | } |
393 | } | 425 | } |
426 | else | ||
427 | { | ||
428 | m_items.LockItemsForRead(false); | ||
429 | string msg = String.Format("couldn't be found for prim {0}, {1}", m_part.Name, m_part.UUID); | ||
430 | StoreScriptError(itemId, msg); | ||
431 | m_log.ErrorFormat( | ||
432 | "[PRIM INVENTORY]: " + | ||
433 | "Couldn't start script with ID {0} since it {1}", itemId, msg); | ||
434 | } | ||
435 | |||
436 | } | ||
437 | |||
438 | /// <summary> | ||
439 | /// Start a script which is in this prim's inventory and return any compilation error messages. | ||
440 | /// </summary> | ||
441 | /// <param name="itemId"> | ||
442 | /// A <see cref="UUID"/> | ||
443 | /// </param> | ||
444 | public ArrayList CreateScriptInstanceEr(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource) | ||
445 | { | ||
446 | ArrayList errors; | ||
447 | |||
448 | // Indicate to CreateScriptInstanceInternal() we want it to | ||
449 | // post any compilation/loading error messages | ||
450 | lock (m_scriptErrors) | ||
451 | { | ||
452 | m_scriptErrors[itemId] = null; | ||
453 | } | ||
454 | |||
455 | // Perform compilation/loading | ||
456 | CreateScriptInstanceInternal(itemId, startParam, postOnRez, engine, stateSource); | ||
457 | |||
458 | // Wait for and retrieve any errors | ||
459 | lock (m_scriptErrors) | ||
460 | { | ||
461 | while ((errors = m_scriptErrors[itemId]) == null) | ||
462 | { | ||
463 | if (!System.Threading.Monitor.Wait(m_scriptErrors, 15000)) | ||
464 | { | ||
465 | m_log.ErrorFormat( | ||
466 | "[PRIM INVENTORY]: " + | ||
467 | "timedout waiting for script {0} errors", itemId); | ||
468 | errors = m_scriptErrors[itemId]; | ||
469 | if (errors == null) | ||
470 | { | ||
471 | errors = new ArrayList(1); | ||
472 | errors.Add("timedout waiting for errors"); | ||
473 | } | ||
474 | break; | ||
475 | } | ||
476 | } | ||
477 | m_scriptErrors.Remove(itemId); | ||
478 | } | ||
479 | return errors; | ||
480 | } | ||
481 | |||
482 | // Signal to CreateScriptInstanceEr() that compilation/loading is complete | ||
483 | private void StoreScriptErrors(UUID itemId, ArrayList errors) | ||
484 | { | ||
485 | lock (m_scriptErrors) | ||
486 | { | ||
487 | // If compilation/loading initiated via CreateScriptInstance(), | ||
488 | // it does not want the errors, so just get out | ||
489 | if (!m_scriptErrors.ContainsKey(itemId)) | ||
490 | { | ||
491 | return; | ||
492 | } | ||
493 | |||
494 | // Initiated via CreateScriptInstanceEr(), if we know what the | ||
495 | // errors are, save them and wake CreateScriptInstanceEr(). | ||
496 | if (errors != null) | ||
497 | { | ||
498 | m_scriptErrors[itemId] = errors; | ||
499 | System.Threading.Monitor.PulseAll(m_scriptErrors); | ||
500 | return; | ||
501 | } | ||
502 | } | ||
503 | |||
504 | // Initiated via CreateScriptInstanceEr() but we don't know what | ||
505 | // the errors are yet, so retrieve them from the script engine. | ||
506 | // This may involve some waiting internal to GetScriptErrors(). | ||
507 | errors = GetScriptErrors(itemId); | ||
508 | |||
509 | // Get a default non-null value to indicate success. | ||
510 | if (errors == null) | ||
511 | { | ||
512 | errors = new ArrayList(); | ||
513 | } | ||
514 | |||
515 | // Post to CreateScriptInstanceEr() and wake it up | ||
516 | lock (m_scriptErrors) | ||
517 | { | ||
518 | m_scriptErrors[itemId] = errors; | ||
519 | System.Threading.Monitor.PulseAll(m_scriptErrors); | ||
520 | } | ||
521 | } | ||
522 | |||
523 | // Like StoreScriptErrors(), but just posts a single string message | ||
524 | private void StoreScriptError(UUID itemId, string message) | ||
525 | { | ||
526 | ArrayList errors = new ArrayList(1); | ||
527 | errors.Add(message); | ||
528 | StoreScriptErrors(itemId, errors); | ||
394 | } | 529 | } |
395 | 530 | ||
396 | /// <summary> | 531 | /// <summary> |
@@ -403,15 +538,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
403 | /// </param> | 538 | /// </param> |
404 | public void RemoveScriptInstance(UUID itemId, bool sceneObjectBeingDeleted) | 539 | public void RemoveScriptInstance(UUID itemId, bool sceneObjectBeingDeleted) |
405 | { | 540 | { |
406 | bool scriptPresent = false; | 541 | if (m_items.ContainsKey(itemId)) |
407 | |||
408 | lock (m_items) | ||
409 | { | ||
410 | if (m_items.ContainsKey(itemId)) | ||
411 | scriptPresent = true; | ||
412 | } | ||
413 | |||
414 | if (scriptPresent) | ||
415 | { | 542 | { |
416 | if (!sceneObjectBeingDeleted) | 543 | if (!sceneObjectBeingDeleted) |
417 | m_part.RemoveScriptEvents(itemId); | 544 | m_part.RemoveScriptEvents(itemId); |
@@ -437,11 +564,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
437 | /// <returns></returns> | 564 | /// <returns></returns> |
438 | private bool InventoryContainsName(string name) | 565 | private bool InventoryContainsName(string name) |
439 | { | 566 | { |
440 | foreach (TaskInventoryItem item in Items.Values) | 567 | m_items.LockItemsForRead(true); |
568 | foreach (TaskInventoryItem item in m_items.Values) | ||
441 | { | 569 | { |
442 | if (item.Name == name) | 570 | if (item.Name == name) |
571 | { | ||
572 | m_items.LockItemsForRead(false); | ||
443 | return true; | 573 | return true; |
574 | } | ||
444 | } | 575 | } |
576 | m_items.LockItemsForRead(false); | ||
445 | return false; | 577 | return false; |
446 | } | 578 | } |
447 | 579 | ||
@@ -483,13 +615,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
483 | /// <param name="item"></param> | 615 | /// <param name="item"></param> |
484 | public void AddInventoryItemExclusive(TaskInventoryItem item, bool allowedDrop) | 616 | public void AddInventoryItemExclusive(TaskInventoryItem item, bool allowedDrop) |
485 | { | 617 | { |
486 | List<TaskInventoryItem> il; | 618 | m_items.LockItemsForRead(true); |
487 | 619 | List<TaskInventoryItem> il = new List<TaskInventoryItem>(m_items.Values); | |
488 | lock (m_items) | 620 | m_items.LockItemsForRead(false); |
489 | { | ||
490 | il = new List<TaskInventoryItem>(m_items.Values); | ||
491 | } | ||
492 | |||
493 | foreach (TaskInventoryItem i in il) | 621 | foreach (TaskInventoryItem i in il) |
494 | { | 622 | { |
495 | if (i.Name == item.Name) | 623 | if (i.Name == item.Name) |
@@ -527,15 +655,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
527 | item.Name = name; | 655 | item.Name = name; |
528 | item.GroupID = m_part.GroupID; | 656 | item.GroupID = m_part.GroupID; |
529 | 657 | ||
530 | lock (m_items) | 658 | m_items.LockItemsForWrite(true); |
531 | { | 659 | m_items.Add(item.ItemID, item); |
532 | m_items.Add(item.ItemID, item); | 660 | m_items.LockItemsForWrite(false); |
533 | |||
534 | if (allowedDrop) | 661 | if (allowedDrop) |
535 | m_part.TriggerScriptChangedEvent(Changed.ALLOWED_DROP); | 662 | m_part.TriggerScriptChangedEvent(Changed.ALLOWED_DROP); |
536 | else | 663 | else |
537 | m_part.TriggerScriptChangedEvent(Changed.INVENTORY); | 664 | m_part.TriggerScriptChangedEvent(Changed.INVENTORY); |
538 | } | 665 | |
539 | 666 | ||
540 | m_inventorySerial++; | 667 | m_inventorySerial++; |
541 | //m_inventorySerial += 2; | 668 | //m_inventorySerial += 2; |
@@ -552,14 +679,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
552 | /// <param name="items"></param> | 679 | /// <param name="items"></param> |
553 | public void RestoreInventoryItems(ICollection<TaskInventoryItem> items) | 680 | public void RestoreInventoryItems(ICollection<TaskInventoryItem> items) |
554 | { | 681 | { |
555 | lock (m_items) | 682 | m_items.LockItemsForWrite(true); |
683 | foreach (TaskInventoryItem item in items) | ||
556 | { | 684 | { |
557 | foreach (TaskInventoryItem item in items) | 685 | m_items.Add(item.ItemID, item); |
558 | { | 686 | // m_part.TriggerScriptChangedEvent(Changed.INVENTORY); |
559 | m_items.Add(item.ItemID, item); | ||
560 | // m_part.TriggerScriptChangedEvent(Changed.INVENTORY); | ||
561 | } | ||
562 | } | 687 | } |
688 | m_items.LockItemsForWrite(false); | ||
563 | 689 | ||
564 | m_inventorySerial++; | 690 | m_inventorySerial++; |
565 | } | 691 | } |
@@ -572,10 +698,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
572 | public TaskInventoryItem GetInventoryItem(UUID itemId) | 698 | public TaskInventoryItem GetInventoryItem(UUID itemId) |
573 | { | 699 | { |
574 | TaskInventoryItem item; | 700 | TaskInventoryItem item; |
575 | 701 | m_items.LockItemsForRead(true); | |
576 | lock (m_items) | 702 | m_items.TryGetValue(itemId, out item); |
577 | m_items.TryGetValue(itemId, out item); | 703 | m_items.LockItemsForRead(false); |
578 | |||
579 | return item; | 704 | return item; |
580 | } | 705 | } |
581 | 706 | ||
@@ -591,15 +716,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
591 | { | 716 | { |
592 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(); | 717 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(); |
593 | 718 | ||
594 | lock (m_items) | 719 | m_items.LockItemsForRead(true); |
720 | |||
721 | foreach (TaskInventoryItem item in m_items.Values) | ||
595 | { | 722 | { |
596 | foreach (TaskInventoryItem item in m_items.Values) | 723 | if (item.Name == name) |
597 | { | 724 | items.Add(item); |
598 | if (item.Name == name) | ||
599 | items.Add(item); | ||
600 | } | ||
601 | } | 725 | } |
602 | 726 | ||
727 | m_items.LockItemsForRead(false); | ||
728 | |||
603 | return items; | 729 | return items; |
604 | } | 730 | } |
605 | 731 | ||
@@ -616,45 +742,54 @@ namespace OpenSim.Region.Framework.Scenes | |||
616 | 742 | ||
617 | public bool UpdateInventoryItem(TaskInventoryItem item, bool fireScriptEvents) | 743 | public bool UpdateInventoryItem(TaskInventoryItem item, bool fireScriptEvents) |
618 | { | 744 | { |
619 | lock(m_items) | 745 | m_items.LockItemsForWrite(true); |
746 | |||
747 | if (m_items.ContainsKey(item.ItemID)) | ||
620 | { | 748 | { |
621 | if (m_items.ContainsKey(item.ItemID)) | 749 | item.ParentID = m_part.UUID; |
750 | item.ParentPartID = m_part.UUID; | ||
751 | item.Flags = m_items[item.ItemID].Flags; | ||
752 | |||
753 | // If group permissions have been set on, check that the groupID is up to date in case it has | ||
754 | // changed since permissions were last set. | ||
755 | if (item.GroupPermissions != (uint)PermissionMask.None) | ||
756 | item.GroupID = m_part.GroupID; | ||
757 | |||
758 | if (item.AssetID == UUID.Zero) | ||
622 | { | 759 | { |
623 | if (m_items.ContainsKey(item.ItemID)) | 760 | item.AssetID = m_items[item.ItemID].AssetID; |
624 | { | 761 | } |
625 | item.ParentID = m_part.UUID; | 762 | else if ((InventoryType)item.Type == InventoryType.Notecard) |
626 | item.ParentPartID = m_part.UUID; | 763 | { |
627 | item.Flags = m_items[item.ItemID].Flags; | 764 | ScenePresence presence = m_part.ParentGroup.Scene.GetScenePresence(item.OwnerID); |
628 | 765 | ||
629 | // If group permissions have been set on, check that the groupID is up to date in case it has | 766 | if (presence != null) |
630 | // changed since permissions were last set. | ||
631 | if (item.GroupPermissions != (uint)PermissionMask.None) | ||
632 | item.GroupID = m_part.GroupID; | ||
633 | |||
634 | if (item.AssetID == UUID.Zero) | ||
635 | { | ||
636 | item.AssetID = m_items[item.ItemID].AssetID; | ||
637 | } | ||
638 | m_items[item.ItemID] = item; | ||
639 | m_inventorySerial++; | ||
640 | if (fireScriptEvents) | ||
641 | m_part.TriggerScriptChangedEvent(Changed.INVENTORY); | ||
642 | HasInventoryChanged = true; | ||
643 | m_part.ParentGroup.HasGroupChanged = true; | ||
644 | return true; | ||
645 | } | ||
646 | else | ||
647 | { | 767 | { |
648 | m_log.ErrorFormat( | 768 | presence.ControllingClient.SendAgentAlertMessage( |
649 | "[PRIM INVENTORY]: " + | 769 | "Notecard saved", false); |
650 | "Tried to retrieve item ID {0} from prim {1}, {2} at {3} in {4} but the item does not exist in this inventory", | ||
651 | item.ItemID, m_part.Name, m_part.UUID, | ||
652 | m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); | ||
653 | } | 770 | } |
654 | |||
655 | } | 771 | } |
656 | return false; | 772 | |
773 | m_items[item.ItemID] = item; | ||
774 | m_inventorySerial++; | ||
775 | if (fireScriptEvents) | ||
776 | m_part.TriggerScriptChangedEvent(Changed.INVENTORY); | ||
777 | HasInventoryChanged = true; | ||
778 | m_part.ParentGroup.HasGroupChanged = true; | ||
779 | m_items.LockItemsForWrite(false); | ||
780 | return true; | ||
657 | } | 781 | } |
782 | else | ||
783 | { | ||
784 | m_log.ErrorFormat( | ||
785 | "[PRIM INVENTORY]: " + | ||
786 | "Tried to retrieve item ID {0} from prim {1}, {2} at {3} in {4} but the item does not exist in this inventory", | ||
787 | item.ItemID, m_part.Name, m_part.UUID, | ||
788 | m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); | ||
789 | } | ||
790 | m_items.LockItemsForWrite(false); | ||
791 | |||
792 | return false; | ||
658 | } | 793 | } |
659 | 794 | ||
660 | /// <summary> | 795 | /// <summary> |
@@ -665,52 +800,53 @@ namespace OpenSim.Region.Framework.Scenes | |||
665 | /// in this prim's inventory.</returns> | 800 | /// in this prim's inventory.</returns> |
666 | public int RemoveInventoryItem(UUID itemID) | 801 | public int RemoveInventoryItem(UUID itemID) |
667 | { | 802 | { |
668 | lock (m_items) | 803 | m_items.LockItemsForRead(true); |
804 | |||
805 | if (m_items.ContainsKey(itemID)) | ||
669 | { | 806 | { |
670 | if (m_items.ContainsKey(itemID)) | 807 | int type = m_items[itemID].InvType; |
808 | m_items.LockItemsForRead(false); | ||
809 | if (type == 10) // Script | ||
671 | { | 810 | { |
672 | int type = m_items[itemID].InvType; | 811 | m_part.ParentGroup.Scene.EventManager.TriggerRemoveScript(m_part.LocalId, itemID); |
673 | if (type == 10) // Script | 812 | } |
674 | { | 813 | m_items.LockItemsForWrite(true); |
675 | m_part.RemoveScriptEvents(itemID); | 814 | m_items.Remove(itemID); |
676 | m_part.ParentGroup.Scene.EventManager.TriggerRemoveScript(m_part.LocalId, itemID); | 815 | m_items.LockItemsForWrite(false); |
677 | } | 816 | m_inventorySerial++; |
678 | m_items.Remove(itemID); | 817 | m_part.TriggerScriptChangedEvent(Changed.INVENTORY); |
679 | m_inventorySerial++; | ||
680 | m_part.TriggerScriptChangedEvent(Changed.INVENTORY); | ||
681 | |||
682 | HasInventoryChanged = true; | ||
683 | m_part.ParentGroup.HasGroupChanged = true; | ||
684 | 818 | ||
685 | int scriptcount = 0; | 819 | HasInventoryChanged = true; |
686 | lock (m_items) | 820 | m_part.ParentGroup.HasGroupChanged = true; |
687 | { | ||
688 | foreach (TaskInventoryItem item in m_items.Values) | ||
689 | { | ||
690 | if (item.Type == 10) | ||
691 | { | ||
692 | scriptcount++; | ||
693 | } | ||
694 | } | ||
695 | } | ||
696 | 821 | ||
697 | if (scriptcount <= 0) | 822 | int scriptcount = 0; |
823 | m_items.LockItemsForRead(true); | ||
824 | foreach (TaskInventoryItem item in m_items.Values) | ||
825 | { | ||
826 | if (item.Type == 10) | ||
698 | { | 827 | { |
699 | m_part.RemFlag(PrimFlags.Scripted); | 828 | scriptcount++; |
700 | } | 829 | } |
701 | |||
702 | m_part.ScheduleFullUpdate(); | ||
703 | |||
704 | return type; | ||
705 | } | 830 | } |
706 | else | 831 | m_items.LockItemsForRead(false); |
832 | |||
833 | |||
834 | if (scriptcount <= 0) | ||
707 | { | 835 | { |
708 | m_log.ErrorFormat( | 836 | m_part.RemFlag(PrimFlags.Scripted); |
709 | "[PRIM INVENTORY]: " + | ||
710 | "Tried to remove item ID {0} from prim {1}, {2} at {3} in {4} but the item does not exist in this inventory", | ||
711 | itemID, m_part.Name, m_part.UUID, | ||
712 | m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); | ||
713 | } | 837 | } |
838 | |||
839 | m_part.ScheduleFullUpdate(); | ||
840 | |||
841 | return type; | ||
842 | } | ||
843 | else | ||
844 | { | ||
845 | m_items.LockItemsForRead(false); | ||
846 | m_log.ErrorFormat( | ||
847 | "[PRIM INVENTORY]: " + | ||
848 | "Tried to remove item ID {0} from prim {1}, {2} but the item does not exist in this inventory", | ||
849 | itemID, m_part.Name, m_part.UUID); | ||
714 | } | 850 | } |
715 | 851 | ||
716 | return -1; | 852 | return -1; |
@@ -764,53 +900,54 @@ namespace OpenSim.Region.Framework.Scenes | |||
764 | // isn't available (such as drag from prim inventory to agent inventory) | 900 | // isn't available (such as drag from prim inventory to agent inventory) |
765 | InventoryStringBuilder invString = new InventoryStringBuilder(m_part.UUID, UUID.Zero); | 901 | InventoryStringBuilder invString = new InventoryStringBuilder(m_part.UUID, UUID.Zero); |
766 | 902 | ||
767 | lock (m_items) | 903 | m_items.LockItemsForRead(true); |
904 | |||
905 | foreach (TaskInventoryItem item in m_items.Values) | ||
768 | { | 906 | { |
769 | foreach (TaskInventoryItem item in m_items.Values) | 907 | UUID ownerID = item.OwnerID; |
770 | { | 908 | uint everyoneMask = 0; |
771 | UUID ownerID = item.OwnerID; | 909 | uint baseMask = item.BasePermissions; |
772 | uint everyoneMask = 0; | 910 | uint ownerMask = item.CurrentPermissions; |
773 | uint baseMask = item.BasePermissions; | 911 | uint groupMask = item.GroupPermissions; |
774 | uint ownerMask = item.CurrentPermissions; | ||
775 | uint groupMask = item.GroupPermissions; | ||
776 | 912 | ||
777 | invString.AddItemStart(); | 913 | invString.AddItemStart(); |
778 | invString.AddNameValueLine("item_id", item.ItemID.ToString()); | 914 | invString.AddNameValueLine("item_id", item.ItemID.ToString()); |
779 | invString.AddNameValueLine("parent_id", m_part.UUID.ToString()); | 915 | invString.AddNameValueLine("parent_id", m_part.UUID.ToString()); |
780 | 916 | ||
781 | invString.AddPermissionsStart(); | 917 | invString.AddPermissionsStart(); |
782 | 918 | ||
783 | invString.AddNameValueLine("base_mask", Utils.UIntToHexString(baseMask)); | 919 | invString.AddNameValueLine("base_mask", Utils.UIntToHexString(baseMask)); |
784 | invString.AddNameValueLine("owner_mask", Utils.UIntToHexString(ownerMask)); | 920 | invString.AddNameValueLine("owner_mask", Utils.UIntToHexString(ownerMask)); |
785 | invString.AddNameValueLine("group_mask", Utils.UIntToHexString(groupMask)); | 921 | invString.AddNameValueLine("group_mask", Utils.UIntToHexString(groupMask)); |
786 | invString.AddNameValueLine("everyone_mask", Utils.UIntToHexString(everyoneMask)); | 922 | invString.AddNameValueLine("everyone_mask", Utils.UIntToHexString(everyoneMask)); |
787 | invString.AddNameValueLine("next_owner_mask", Utils.UIntToHexString(item.NextPermissions)); | 923 | invString.AddNameValueLine("next_owner_mask", Utils.UIntToHexString(item.NextPermissions)); |
788 | 924 | ||
789 | invString.AddNameValueLine("creator_id", item.CreatorID.ToString()); | 925 | invString.AddNameValueLine("creator_id", item.CreatorID.ToString()); |
790 | invString.AddNameValueLine("owner_id", ownerID.ToString()); | 926 | invString.AddNameValueLine("owner_id", ownerID.ToString()); |
791 | 927 | ||
792 | invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString()); | 928 | invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString()); |
793 | 929 | ||
794 | invString.AddNameValueLine("group_id", item.GroupID.ToString()); | 930 | invString.AddNameValueLine("group_id", item.GroupID.ToString()); |
795 | invString.AddSectionEnd(); | 931 | invString.AddSectionEnd(); |
796 | 932 | ||
797 | invString.AddNameValueLine("asset_id", item.AssetID.ToString()); | 933 | invString.AddNameValueLine("asset_id", item.AssetID.ToString()); |
798 | invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]); | 934 | invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]); |
799 | invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]); | 935 | invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]); |
800 | invString.AddNameValueLine("flags", Utils.UIntToHexString(item.Flags)); | 936 | invString.AddNameValueLine("flags", Utils.UIntToHexString(item.Flags)); |
801 | 937 | ||
802 | invString.AddSaleStart(); | 938 | invString.AddSaleStart(); |
803 | invString.AddNameValueLine("sale_type", "not"); | 939 | invString.AddNameValueLine("sale_type", "not"); |
804 | invString.AddNameValueLine("sale_price", "0"); | 940 | invString.AddNameValueLine("sale_price", "0"); |
805 | invString.AddSectionEnd(); | 941 | invString.AddSectionEnd(); |
806 | 942 | ||
807 | invString.AddNameValueLine("name", item.Name + "|"); | 943 | invString.AddNameValueLine("name", item.Name + "|"); |
808 | invString.AddNameValueLine("desc", item.Description + "|"); | 944 | invString.AddNameValueLine("desc", item.Description + "|"); |
809 | 945 | ||
810 | invString.AddNameValueLine("creation_date", item.CreationDate.ToString()); | 946 | invString.AddNameValueLine("creation_date", item.CreationDate.ToString()); |
811 | invString.AddSectionEnd(); | 947 | invString.AddSectionEnd(); |
812 | } | ||
813 | } | 948 | } |
949 | int count = m_items.Count; | ||
950 | m_items.LockItemsForRead(false); | ||
814 | 951 | ||
815 | fileData = Utils.StringToBytes(invString.BuildString); | 952 | fileData = Utils.StringToBytes(invString.BuildString); |
816 | 953 | ||
@@ -831,10 +968,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
831 | { | 968 | { |
832 | if (HasInventoryChanged) | 969 | if (HasInventoryChanged) |
833 | { | 970 | { |
834 | lock (Items) | 971 | Items.LockItemsForRead(true); |
835 | { | 972 | datastore.StorePrimInventory(m_part.UUID, Items.Values); |
836 | datastore.StorePrimInventory(m_part.UUID, Items.Values); | 973 | Items.LockItemsForRead(false); |
837 | } | ||
838 | 974 | ||
839 | HasInventoryChanged = false; | 975 | HasInventoryChanged = false; |
840 | } | 976 | } |
@@ -903,90 +1039,76 @@ namespace OpenSim.Region.Framework.Scenes | |||
903 | { | 1039 | { |
904 | uint mask=0x7fffffff; | 1040 | uint mask=0x7fffffff; |
905 | 1041 | ||
906 | lock (m_items) | 1042 | foreach (TaskInventoryItem item in m_items.Values) |
907 | { | 1043 | { |
908 | foreach (TaskInventoryItem item in m_items.Values) | 1044 | if (item.InvType != (int)InventoryType.Object) |
909 | { | 1045 | { |
910 | if (item.InvType != (int)InventoryType.Object) | 1046 | if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Copy) == 0) |
911 | { | 1047 | mask &= ~((uint)PermissionMask.Copy >> 13); |
912 | if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Copy) == 0) | 1048 | if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Transfer) == 0) |
913 | mask &= ~((uint)PermissionMask.Copy >> 13); | 1049 | mask &= ~((uint)PermissionMask.Transfer >> 13); |
914 | if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Transfer) == 0) | 1050 | if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Modify) == 0) |
915 | mask &= ~((uint)PermissionMask.Transfer >> 13); | 1051 | mask &= ~((uint)PermissionMask.Modify >> 13); |
916 | if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Modify) == 0) | ||
917 | mask &= ~((uint)PermissionMask.Modify >> 13); | ||
918 | } | ||
919 | else | ||
920 | { | ||
921 | if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0) | ||
922 | mask &= ~((uint)PermissionMask.Copy >> 13); | ||
923 | if ((item.CurrentPermissions & ((uint)PermissionMask.Transfer >> 13)) == 0) | ||
924 | mask &= ~((uint)PermissionMask.Transfer >> 13); | ||
925 | if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0) | ||
926 | mask &= ~((uint)PermissionMask.Modify >> 13); | ||
927 | } | ||
928 | |||
929 | if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) | ||
930 | mask &= ~(uint)PermissionMask.Copy; | ||
931 | if ((item.CurrentPermissions & (uint)PermissionMask.Transfer) == 0) | ||
932 | mask &= ~(uint)PermissionMask.Transfer; | ||
933 | if ((item.CurrentPermissions & (uint)PermissionMask.Modify) == 0) | ||
934 | mask &= ~(uint)PermissionMask.Modify; | ||
935 | } | 1052 | } |
1053 | else | ||
1054 | { | ||
1055 | if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0) | ||
1056 | mask &= ~((uint)PermissionMask.Copy >> 13); | ||
1057 | if ((item.CurrentPermissions & ((uint)PermissionMask.Transfer >> 13)) == 0) | ||
1058 | mask &= ~((uint)PermissionMask.Transfer >> 13); | ||
1059 | if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0) | ||
1060 | mask &= ~((uint)PermissionMask.Modify >> 13); | ||
1061 | } | ||
1062 | |||
1063 | if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) | ||
1064 | mask &= ~(uint)PermissionMask.Copy; | ||
1065 | if ((item.CurrentPermissions & (uint)PermissionMask.Transfer) == 0) | ||
1066 | mask &= ~(uint)PermissionMask.Transfer; | ||
1067 | if ((item.CurrentPermissions & (uint)PermissionMask.Modify) == 0) | ||
1068 | mask &= ~(uint)PermissionMask.Modify; | ||
936 | } | 1069 | } |
937 | |||
938 | return mask; | 1070 | return mask; |
939 | } | 1071 | } |
940 | 1072 | ||
941 | public void ApplyNextOwnerPermissions() | 1073 | public void ApplyNextOwnerPermissions() |
942 | { | 1074 | { |
943 | lock (m_items) | 1075 | foreach (TaskInventoryItem item in m_items.Values) |
944 | { | 1076 | { |
945 | foreach (TaskInventoryItem item in m_items.Values) | 1077 | if (item.InvType == (int)InventoryType.Object && (item.CurrentPermissions & 7) != 0) |
946 | { | 1078 | { |
947 | if (item.InvType == (int)InventoryType.Object && (item.CurrentPermissions & 7) != 0) | 1079 | if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0) |
948 | { | 1080 | item.CurrentPermissions &= ~(uint)PermissionMask.Copy; |
949 | if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0) | 1081 | if ((item.CurrentPermissions & ((uint)PermissionMask.Transfer >> 13)) == 0) |
950 | item.CurrentPermissions &= ~(uint)PermissionMask.Copy; | 1082 | item.CurrentPermissions &= ~(uint)PermissionMask.Transfer; |
951 | if ((item.CurrentPermissions & ((uint)PermissionMask.Transfer >> 13)) == 0) | 1083 | if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0) |
952 | item.CurrentPermissions &= ~(uint)PermissionMask.Transfer; | 1084 | item.CurrentPermissions &= ~(uint)PermissionMask.Modify; |
953 | if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0) | 1085 | item.CurrentPermissions |= 8; |
954 | item.CurrentPermissions &= ~(uint)PermissionMask.Modify; | ||
955 | item.CurrentPermissions |= 8; | ||
956 | } | ||
957 | item.CurrentPermissions &= item.NextPermissions; | ||
958 | item.BasePermissions &= item.NextPermissions; | ||
959 | item.EveryonePermissions &= item.NextPermissions; | ||
960 | item.OwnerChanged = true; | ||
961 | } | 1086 | } |
1087 | item.OwnerChanged = true; | ||
1088 | item.CurrentPermissions &= item.NextPermissions; | ||
1089 | item.BasePermissions &= item.NextPermissions; | ||
1090 | item.EveryonePermissions &= item.NextPermissions; | ||
962 | } | 1091 | } |
963 | } | 1092 | } |
964 | 1093 | ||
965 | public void ApplyGodPermissions(uint perms) | 1094 | public void ApplyGodPermissions(uint perms) |
966 | { | 1095 | { |
967 | lock (m_items) | 1096 | foreach (TaskInventoryItem item in m_items.Values) |
968 | { | 1097 | { |
969 | foreach (TaskInventoryItem item in m_items.Values) | 1098 | item.CurrentPermissions = perms; |
970 | { | 1099 | item.BasePermissions = perms; |
971 | item.CurrentPermissions = perms; | ||
972 | item.BasePermissions = perms; | ||
973 | } | ||
974 | } | 1100 | } |
975 | } | 1101 | } |
976 | 1102 | ||
977 | public bool ContainsScripts() | 1103 | public bool ContainsScripts() |
978 | { | 1104 | { |
979 | lock (m_items) | 1105 | foreach (TaskInventoryItem item in m_items.Values) |
980 | { | 1106 | { |
981 | foreach (TaskInventoryItem item in m_items.Values) | 1107 | if (item.InvType == (int)InventoryType.LSL) |
982 | { | 1108 | { |
983 | if (item.InvType == (int)InventoryType.LSL) | 1109 | return true; |
984 | { | ||
985 | return true; | ||
986 | } | ||
987 | } | 1110 | } |
988 | } | 1111 | } |
989 | |||
990 | return false; | 1112 | return false; |
991 | } | 1113 | } |
992 | 1114 | ||
@@ -994,46 +1116,52 @@ namespace OpenSim.Region.Framework.Scenes | |||
994 | { | 1116 | { |
995 | List<UUID> ret = new List<UUID>(); | 1117 | List<UUID> ret = new List<UUID>(); |
996 | 1118 | ||
997 | lock (m_items) | 1119 | foreach (TaskInventoryItem item in m_items.Values) |
998 | { | 1120 | ret.Add(item.ItemID); |
999 | foreach (TaskInventoryItem item in m_items.Values) | ||
1000 | ret.Add(item.ItemID); | ||
1001 | } | ||
1002 | 1121 | ||
1003 | return ret; | 1122 | return ret; |
1004 | } | 1123 | } |
1005 | 1124 | ||
1006 | public Dictionary<UUID, string> GetScriptStates() | 1125 | public Dictionary<UUID, string> GetScriptStates() |
1007 | { | 1126 | { |
1127 | return GetScriptStates(false); | ||
1128 | } | ||
1129 | |||
1130 | public Dictionary<UUID, string> GetScriptStates(bool oldIDs) | ||
1131 | { | ||
1008 | IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces<IScriptModule>(); | 1132 | IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces<IScriptModule>(); |
1009 | 1133 | ||
1010 | Dictionary<UUID, string> ret = new Dictionary<UUID, string>(); | 1134 | Dictionary<UUID, string> ret = new Dictionary<UUID, string>(); |
1011 | if (engines == null) // No engine at all | 1135 | if (engines == null) // No engine at all |
1012 | return ret; | 1136 | return ret; |
1013 | 1137 | ||
1014 | lock (m_items) | 1138 | foreach (TaskInventoryItem item in m_items.Values) |
1015 | { | 1139 | { |
1016 | foreach (TaskInventoryItem item in m_items.Values) | 1140 | if (item.InvType == (int)InventoryType.LSL) |
1017 | { | 1141 | { |
1018 | if (item.InvType == (int)InventoryType.LSL) | 1142 | foreach (IScriptModule e in engines) |
1019 | { | 1143 | { |
1020 | foreach (IScriptModule e in engines) | 1144 | if (e != null) |
1021 | { | 1145 | { |
1022 | if (e != null) | 1146 | string n = e.GetXMLState(item.ItemID); |
1147 | if (n != String.Empty) | ||
1023 | { | 1148 | { |
1024 | string n = e.GetXMLState(item.ItemID); | 1149 | if (oldIDs) |
1025 | if (n != String.Empty) | 1150 | { |
1151 | if (!ret.ContainsKey(item.OldItemID)) | ||
1152 | ret[item.OldItemID] = n; | ||
1153 | } | ||
1154 | else | ||
1026 | { | 1155 | { |
1027 | if (!ret.ContainsKey(item.ItemID)) | 1156 | if (!ret.ContainsKey(item.ItemID)) |
1028 | ret[item.ItemID] = n; | 1157 | ret[item.ItemID] = n; |
1029 | break; | ||
1030 | } | 1158 | } |
1159 | break; | ||
1031 | } | 1160 | } |
1032 | } | 1161 | } |
1033 | } | 1162 | } |
1034 | } | 1163 | } |
1035 | } | 1164 | } |
1036 | |||
1037 | return ret; | 1165 | return ret; |
1038 | } | 1166 | } |
1039 | 1167 | ||
@@ -1043,25 +1171,27 @@ namespace OpenSim.Region.Framework.Scenes | |||
1043 | if (engines == null) | 1171 | if (engines == null) |
1044 | return; | 1172 | return; |
1045 | 1173 | ||
1046 | lock (m_items) | 1174 | |
1175 | Items.LockItemsForRead(true); | ||
1176 | |||
1177 | foreach (TaskInventoryItem item in m_items.Values) | ||
1047 | { | 1178 | { |
1048 | foreach (TaskInventoryItem item in m_items.Values) | 1179 | if (item.InvType == (int)InventoryType.LSL) |
1049 | { | 1180 | { |
1050 | if (item.InvType == (int)InventoryType.LSL) | 1181 | foreach (IScriptModule engine in engines) |
1051 | { | 1182 | { |
1052 | foreach (IScriptModule engine in engines) | 1183 | if (engine != null) |
1053 | { | 1184 | { |
1054 | if (engine != null) | 1185 | if (item.OwnerChanged) |
1055 | { | 1186 | engine.PostScriptEvent(item.ItemID, "changed", new Object[] { (int)Changed.OWNER }); |
1056 | if (item.OwnerChanged) | 1187 | item.OwnerChanged = false; |
1057 | engine.PostScriptEvent(item.ItemID, "changed", new Object[] { (int)Changed.OWNER }); | 1188 | engine.ResumeScript(item.ItemID); |
1058 | item.OwnerChanged = false; | ||
1059 | engine.ResumeScript(item.ItemID); | ||
1060 | } | ||
1061 | } | 1189 | } |
1062 | } | 1190 | } |
1063 | } | 1191 | } |
1064 | } | 1192 | } |
1193 | |||
1194 | Items.LockItemsForRead(false); | ||
1065 | } | 1195 | } |
1066 | } | 1196 | } |
1067 | } | 1197 | } |