diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | 592 |
1 files changed, 288 insertions, 304 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 77bf6fe..836622d 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | |||
@@ -81,7 +81,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
81 | /// </value> | 81 | /// </value> |
82 | protected internal TaskInventoryDictionary Items | 82 | protected internal TaskInventoryDictionary Items |
83 | { | 83 | { |
84 | get { return m_items; } | 84 | get { |
85 | return m_items; | ||
86 | } | ||
85 | set | 87 | set |
86 | { | 88 | { |
87 | m_items = value; | 89 | m_items = value; |
@@ -117,22 +119,25 @@ namespace OpenSim.Region.Framework.Scenes | |||
117 | /// <param name="linkNum">Link number for the part</param> | 119 | /// <param name="linkNum">Link number for the part</param> |
118 | public void ResetInventoryIDs() | 120 | public void ResetInventoryIDs() |
119 | { | 121 | { |
120 | lock (Items) | 122 | m_items.LockItemsForWrite(true); |
123 | |||
124 | if (0 == Items.Count) | ||
121 | { | 125 | { |
122 | if (0 == Items.Count) | 126 | m_items.LockItemsForWrite(false); |
123 | return; | 127 | return; |
128 | } | ||
124 | 129 | ||
125 | HasInventoryChanged = true; | 130 | HasInventoryChanged = true; |
126 | m_part.ParentGroup.HasGroupChanged = true; | 131 | m_part.ParentGroup.HasGroupChanged = true; |
127 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); | 132 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); |
128 | Items.Clear(); | 133 | Items.Clear(); |
129 | 134 | ||
130 | foreach (TaskInventoryItem item in items) | 135 | foreach (TaskInventoryItem item in items) |
131 | { | 136 | { |
132 | item.ResetIDs(m_part.UUID); | 137 | item.ResetIDs(m_part.UUID); |
133 | Items.Add(item.ItemID, item); | 138 | Items.Add(item.ItemID, item); |
134 | } | ||
135 | } | 139 | } |
140 | m_items.LockItemsForWrite(false); | ||
136 | } | 141 | } |
137 | 142 | ||
138 | /// <summary> | 143 | /// <summary> |
@@ -141,25 +146,25 @@ namespace OpenSim.Region.Framework.Scenes | |||
141 | /// <param name="ownerId"></param> | 146 | /// <param name="ownerId"></param> |
142 | public void ChangeInventoryOwner(UUID ownerId) | 147 | public void ChangeInventoryOwner(UUID ownerId) |
143 | { | 148 | { |
144 | lock (Items) | 149 | m_items.LockItemsForWrite(true); |
150 | if (0 == Items.Count) | ||
145 | { | 151 | { |
146 | if (0 == Items.Count) | 152 | m_items.LockItemsForWrite(false); |
147 | { | 153 | return; |
148 | return; | 154 | } |
149 | } | ||
150 | 155 | ||
151 | HasInventoryChanged = true; | 156 | HasInventoryChanged = true; |
152 | m_part.ParentGroup.HasGroupChanged = true; | 157 | m_part.ParentGroup.HasGroupChanged = true; |
153 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); | 158 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); |
154 | foreach (TaskInventoryItem item in items) | 159 | foreach (TaskInventoryItem item in items) |
160 | { | ||
161 | if (ownerId != item.OwnerID) | ||
155 | { | 162 | { |
156 | if (ownerId != item.OwnerID) | 163 | item.LastOwnerID = item.OwnerID; |
157 | { | 164 | item.OwnerID = ownerId; |
158 | item.LastOwnerID = item.OwnerID; | ||
159 | item.OwnerID = ownerId; | ||
160 | } | ||
161 | } | 165 | } |
162 | } | 166 | } |
167 | m_items.LockItemsForWrite(false); | ||
163 | } | 168 | } |
164 | 169 | ||
165 | /// <summary> | 170 | /// <summary> |
@@ -168,24 +173,24 @@ namespace OpenSim.Region.Framework.Scenes | |||
168 | /// <param name="groupID"></param> | 173 | /// <param name="groupID"></param> |
169 | public void ChangeInventoryGroup(UUID groupID) | 174 | public void ChangeInventoryGroup(UUID groupID) |
170 | { | 175 | { |
171 | lock (Items) | 176 | m_items.LockItemsForWrite(true); |
177 | if (0 == Items.Count) | ||
172 | { | 178 | { |
173 | if (0 == Items.Count) | 179 | m_items.LockItemsForWrite(false); |
174 | { | 180 | return; |
175 | return; | 181 | } |
176 | } | ||
177 | 182 | ||
178 | HasInventoryChanged = true; | 183 | HasInventoryChanged = true; |
179 | m_part.ParentGroup.HasGroupChanged = true; | 184 | m_part.ParentGroup.HasGroupChanged = true; |
180 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); | 185 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); |
181 | foreach (TaskInventoryItem item in items) | 186 | foreach (TaskInventoryItem item in items) |
187 | { | ||
188 | if (groupID != item.GroupID) | ||
182 | { | 189 | { |
183 | if (groupID != item.GroupID) | 190 | item.GroupID = groupID; |
184 | { | ||
185 | item.GroupID = groupID; | ||
186 | } | ||
187 | } | 191 | } |
188 | } | 192 | } |
193 | m_items.LockItemsForWrite(false); | ||
189 | } | 194 | } |
190 | 195 | ||
191 | /// <summary> | 196 | /// <summary> |
@@ -193,14 +198,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
193 | /// </summary> | 198 | /// </summary> |
194 | public void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource) | 199 | public void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource) |
195 | { | 200 | { |
196 | lock (m_items) | 201 | Items.LockItemsForRead(true); |
202 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); | ||
203 | Items.LockItemsForRead(false); | ||
204 | foreach (TaskInventoryItem item in items) | ||
197 | { | 205 | { |
198 | foreach (TaskInventoryItem item in Items.Values) | 206 | if ((int)InventoryType.LSL == item.InvType) |
199 | { | 207 | { |
200 | if ((int)InventoryType.LSL == item.InvType) | 208 | CreateScriptInstance(item, startParam, postOnRez, engine, stateSource); |
201 | { | ||
202 | CreateScriptInstance(item, startParam, postOnRez, engine, stateSource); | ||
203 | } | ||
204 | } | 209 | } |
205 | } | 210 | } |
206 | } | 211 | } |
@@ -235,16 +240,20 @@ namespace OpenSim.Region.Framework.Scenes | |||
235 | /// </param> | 240 | /// </param> |
236 | public void RemoveScriptInstances(bool sceneObjectBeingDeleted) | 241 | public void RemoveScriptInstances(bool sceneObjectBeingDeleted) |
237 | { | 242 | { |
238 | lock (Items) | 243 | Items.LockItemsForRead(true); |
244 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); | ||
245 | Items.LockItemsForRead(false); | ||
246 | |||
247 | foreach (TaskInventoryItem item in items) | ||
239 | { | 248 | { |
240 | foreach (TaskInventoryItem item in Items.Values) | 249 | if ((int)InventoryType.LSL == item.InvType) |
241 | { | 250 | { |
242 | if ((int)InventoryType.LSL == item.InvType) | 251 | RemoveScriptInstance(item.ItemID, sceneObjectBeingDeleted); |
243 | { | 252 | m_part.RemoveScriptEvents(item.ItemID); |
244 | RemoveScriptInstance(item.ItemID, sceneObjectBeingDeleted); | ||
245 | } | ||
246 | } | 253 | } |
247 | } | 254 | } |
255 | |||
256 | |||
248 | } | 257 | } |
249 | 258 | ||
250 | /// <summary> | 259 | /// <summary> |
@@ -269,12 +278,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
269 | if (stateSource == 1 && // Prim crossing | 278 | if (stateSource == 1 && // Prim crossing |
270 | m_part.ParentGroup.Scene.m_trustBinaries) | 279 | m_part.ParentGroup.Scene.m_trustBinaries) |
271 | { | 280 | { |
272 | lock (m_items) | 281 | m_items.LockItemsForWrite(true); |
273 | { | 282 | m_items[item.ItemID].PermsMask = 0; |
274 | m_items[item.ItemID].PermsMask = 0; | 283 | m_items[item.ItemID].PermsGranter = UUID.Zero; |
275 | m_items[item.ItemID].PermsGranter = UUID.Zero; | 284 | m_items.LockItemsForWrite(false); |
276 | } | ||
277 | |||
278 | m_part.ParentGroup.Scene.EventManager.TriggerRezScript( | 285 | m_part.ParentGroup.Scene.EventManager.TriggerRezScript( |
279 | m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource); | 286 | m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource); |
280 | m_part.ParentGroup.AddActiveScriptCount(1); | 287 | m_part.ParentGroup.AddActiveScriptCount(1); |
@@ -282,36 +289,31 @@ namespace OpenSim.Region.Framework.Scenes | |||
282 | return; | 289 | return; |
283 | } | 290 | } |
284 | 291 | ||
285 | m_part.ParentGroup.Scene.AssetService.Get( | 292 | m_part.ParentGroup.Scene.AssetService.Get(item.AssetID.ToString(), this, delegate(string id, object sender, AssetBase asset) |
286 | item.AssetID.ToString(), this, delegate(string id, object sender, AssetBase asset) | 293 | { |
287 | { | 294 | if (null == asset) |
288 | if (null == asset) | 295 | { |
289 | { | 296 | m_log.ErrorFormat( |
290 | m_log.ErrorFormat( | 297 | "[PRIM INVENTORY]: " + |
291 | "[PRIM INVENTORY]: " + | 298 | "Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found", |
292 | "Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found", | 299 | item.Name, item.ItemID, m_part.AbsolutePosition, |
293 | item.Name, item.ItemID, m_part.AbsolutePosition, | 300 | m_part.ParentGroup.Scene.RegionInfo.RegionName, item.AssetID); |
294 | m_part.ParentGroup.Scene.RegionInfo.RegionName, item.AssetID); | 301 | } |
295 | } | 302 | else |
296 | else | 303 | { |
297 | { | 304 | if (m_part.ParentGroup.m_savedScriptState != null) |
298 | if (m_part.ParentGroup.m_savedScriptState != null) | 305 | RestoreSavedScriptState(item.OldItemID, item.ItemID); |
299 | RestoreSavedScriptState(item.OldItemID, item.ItemID); | 306 | m_items.LockItemsForWrite(true); |
300 | 307 | m_items[item.ItemID].PermsMask = 0; | |
301 | lock (m_items) | 308 | m_items[item.ItemID].PermsGranter = UUID.Zero; |
302 | { | 309 | m_items.LockItemsForWrite(false); |
303 | m_items[item.ItemID].PermsMask = 0; | 310 | string script = Utils.BytesToString(asset.Data); |
304 | m_items[item.ItemID].PermsGranter = UUID.Zero; | 311 | m_part.ParentGroup.Scene.EventManager.TriggerRezScript( |
305 | } | 312 | m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource); |
306 | 313 | m_part.ParentGroup.AddActiveScriptCount(1); | |
307 | string script = Utils.BytesToString(asset.Data); | 314 | m_part.ScheduleFullUpdate(); |
308 | m_part.ParentGroup.Scene.EventManager.TriggerRezScript( | 315 | } |
309 | m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource); | 316 | }); |
310 | m_part.ParentGroup.AddActiveScriptCount(1); | ||
311 | m_part.ScheduleFullUpdate(); | ||
312 | } | ||
313 | } | ||
314 | ); | ||
315 | } | 317 | } |
316 | } | 318 | } |
317 | 319 | ||
@@ -378,14 +380,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
378 | /// </param> | 380 | /// </param> |
379 | public void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource) | 381 | public void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource) |
380 | { | 382 | { |
381 | lock (m_items) | 383 | m_items.LockItemsForRead(true); |
384 | if (m_items.ContainsKey(itemId)) | ||
382 | { | 385 | { |
383 | if (m_items.ContainsKey(itemId)) | 386 | if (m_items.ContainsKey(itemId)) |
384 | { | 387 | { |
388 | m_items.LockItemsForRead(false); | ||
385 | CreateScriptInstance(m_items[itemId], startParam, postOnRez, engine, stateSource); | 389 | CreateScriptInstance(m_items[itemId], startParam, postOnRez, engine, stateSource); |
386 | } | 390 | } |
387 | else | 391 | else |
388 | { | 392 | { |
393 | m_items.LockItemsForRead(false); | ||
389 | m_log.ErrorFormat( | 394 | m_log.ErrorFormat( |
390 | "[PRIM INVENTORY]: " + | 395 | "[PRIM INVENTORY]: " + |
391 | "Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2} at {3} in {4}", | 396 | "Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2} at {3} in {4}", |
@@ -393,6 +398,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
393 | m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); | 398 | m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); |
394 | } | 399 | } |
395 | } | 400 | } |
401 | else | ||
402 | { | ||
403 | m_items.LockItemsForRead(false); | ||
404 | m_log.ErrorFormat( | ||
405 | "[PRIM INVENTORY]: " + | ||
406 | "Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2}", | ||
407 | itemId, m_part.Name, m_part.UUID); | ||
408 | } | ||
409 | |||
396 | } | 410 | } |
397 | 411 | ||
398 | /// <summary> | 412 | /// <summary> |
@@ -405,15 +419,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
405 | /// </param> | 419 | /// </param> |
406 | public void RemoveScriptInstance(UUID itemId, bool sceneObjectBeingDeleted) | 420 | public void RemoveScriptInstance(UUID itemId, bool sceneObjectBeingDeleted) |
407 | { | 421 | { |
408 | bool scriptPresent = false; | 422 | if (m_items.ContainsKey(itemId)) |
409 | |||
410 | lock (m_items) | ||
411 | { | ||
412 | if (m_items.ContainsKey(itemId)) | ||
413 | scriptPresent = true; | ||
414 | } | ||
415 | |||
416 | if (scriptPresent) | ||
417 | { | 423 | { |
418 | if (!sceneObjectBeingDeleted) | 424 | if (!sceneObjectBeingDeleted) |
419 | m_part.RemoveScriptEvents(itemId); | 425 | m_part.RemoveScriptEvents(itemId); |
@@ -439,11 +445,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
439 | /// <returns></returns> | 445 | /// <returns></returns> |
440 | private bool InventoryContainsName(string name) | 446 | private bool InventoryContainsName(string name) |
441 | { | 447 | { |
442 | foreach (TaskInventoryItem item in Items.Values) | 448 | m_items.LockItemsForRead(true); |
449 | foreach (TaskInventoryItem item in m_items.Values) | ||
443 | { | 450 | { |
444 | if (item.Name == name) | 451 | if (item.Name == name) |
452 | { | ||
453 | m_items.LockItemsForRead(false); | ||
445 | return true; | 454 | return true; |
455 | } | ||
446 | } | 456 | } |
457 | m_items.LockItemsForRead(false); | ||
447 | return false; | 458 | return false; |
448 | } | 459 | } |
449 | 460 | ||
@@ -485,13 +496,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
485 | /// <param name="item"></param> | 496 | /// <param name="item"></param> |
486 | public void AddInventoryItemExclusive(TaskInventoryItem item, bool allowedDrop) | 497 | public void AddInventoryItemExclusive(TaskInventoryItem item, bool allowedDrop) |
487 | { | 498 | { |
488 | List<TaskInventoryItem> il; | 499 | m_items.LockItemsForRead(true); |
489 | 500 | List<TaskInventoryItem> il = new List<TaskInventoryItem>(m_items.Values); | |
490 | lock (m_items) | 501 | m_items.LockItemsForRead(false); |
491 | { | ||
492 | il = new List<TaskInventoryItem>(m_items.Values); | ||
493 | } | ||
494 | |||
495 | foreach (TaskInventoryItem i in il) | 502 | foreach (TaskInventoryItem i in il) |
496 | { | 503 | { |
497 | if (i.Name == item.Name) | 504 | if (i.Name == item.Name) |
@@ -528,15 +535,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
528 | item.ParentPartID = m_part.UUID; | 535 | item.ParentPartID = m_part.UUID; |
529 | item.Name = name; | 536 | item.Name = name; |
530 | 537 | ||
531 | lock (m_items) | 538 | m_items.LockItemsForWrite(true); |
532 | { | 539 | m_items.Add(item.ItemID, item); |
533 | m_items.Add(item.ItemID, item); | 540 | m_items.LockItemsForWrite(false); |
534 | |||
535 | if (allowedDrop) | 541 | if (allowedDrop) |
536 | m_part.TriggerScriptChangedEvent(Changed.ALLOWED_DROP); | 542 | m_part.TriggerScriptChangedEvent(Changed.ALLOWED_DROP); |
537 | else | 543 | else |
538 | m_part.TriggerScriptChangedEvent(Changed.INVENTORY); | 544 | m_part.TriggerScriptChangedEvent(Changed.INVENTORY); |
539 | } | 545 | |
540 | 546 | ||
541 | m_inventorySerial++; | 547 | m_inventorySerial++; |
542 | //m_inventorySerial += 2; | 548 | //m_inventorySerial += 2; |
@@ -553,14 +559,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
553 | /// <param name="items"></param> | 559 | /// <param name="items"></param> |
554 | public void RestoreInventoryItems(ICollection<TaskInventoryItem> items) | 560 | public void RestoreInventoryItems(ICollection<TaskInventoryItem> items) |
555 | { | 561 | { |
556 | lock (m_items) | 562 | m_items.LockItemsForWrite(true); |
563 | foreach (TaskInventoryItem item in items) | ||
557 | { | 564 | { |
558 | foreach (TaskInventoryItem item in items) | 565 | m_items.Add(item.ItemID, item); |
559 | { | 566 | m_part.TriggerScriptChangedEvent(Changed.INVENTORY); |
560 | m_items.Add(item.ItemID, item); | ||
561 | m_part.TriggerScriptChangedEvent(Changed.INVENTORY); | ||
562 | } | ||
563 | } | 567 | } |
568 | m_items.LockItemsForWrite(false); | ||
564 | 569 | ||
565 | m_inventorySerial++; | 570 | m_inventorySerial++; |
566 | } | 571 | } |
@@ -573,10 +578,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
573 | public TaskInventoryItem GetInventoryItem(UUID itemId) | 578 | public TaskInventoryItem GetInventoryItem(UUID itemId) |
574 | { | 579 | { |
575 | TaskInventoryItem item; | 580 | TaskInventoryItem item; |
576 | 581 | m_items.LockItemsForRead(true); | |
577 | lock (m_items) | 582 | m_items.TryGetValue(itemId, out item); |
578 | m_items.TryGetValue(itemId, out item); | 583 | m_items.LockItemsForRead(false); |
579 | |||
580 | return item; | 584 | return item; |
581 | } | 585 | } |
582 | 586 | ||
@@ -612,45 +616,45 @@ namespace OpenSim.Region.Framework.Scenes | |||
612 | /// <returns>false if the item did not exist, true if the update occurred successfully</returns> | 616 | /// <returns>false if the item did not exist, true if the update occurred successfully</returns> |
613 | public bool UpdateInventoryItem(TaskInventoryItem item) | 617 | public bool UpdateInventoryItem(TaskInventoryItem item) |
614 | { | 618 | { |
615 | lock (m_items) | 619 | m_items.LockItemsForWrite(true); |
620 | |||
621 | if (m_items.ContainsKey(item.ItemID)) | ||
616 | { | 622 | { |
617 | if (m_items.ContainsKey(item.ItemID)) | 623 | item.ParentID = m_part.UUID; |
624 | item.ParentPartID = m_part.UUID; | ||
625 | item.Flags = m_items[item.ItemID].Flags; | ||
626 | if (item.AssetID == UUID.Zero) | ||
618 | { | 627 | { |
619 | item.ParentID = m_part.UUID; | 628 | item.AssetID = m_items[item.ItemID].AssetID; |
620 | item.ParentPartID = m_part.UUID; | ||
621 | item.Flags = m_items[item.ItemID].Flags; | ||
622 | if (item.AssetID == UUID.Zero) | ||
623 | { | ||
624 | item.AssetID = m_items[item.ItemID].AssetID; | ||
625 | } | ||
626 | else if ((InventoryType)item.Type == InventoryType.Notecard) | ||
627 | { | ||
628 | ScenePresence presence = m_part.ParentGroup.Scene.GetScenePresence(item.OwnerID); | ||
629 | |||
630 | if (presence != null) | ||
631 | { | ||
632 | presence.ControllingClient.SendAgentAlertMessage( | ||
633 | "Notecard saved", false); | ||
634 | } | ||
635 | } | ||
636 | |||
637 | m_items[item.ItemID] = item; | ||
638 | m_inventorySerial++; | ||
639 | m_part.TriggerScriptChangedEvent(Changed.INVENTORY); | ||
640 | HasInventoryChanged = true; | ||
641 | m_part.ParentGroup.HasGroupChanged = true; | ||
642 | |||
643 | return true; | ||
644 | } | 629 | } |
645 | else | 630 | else if ((InventoryType)item.Type == InventoryType.Notecard) |
646 | { | 631 | { |
647 | m_log.ErrorFormat( | 632 | ScenePresence presence = m_part.ParentGroup.Scene.GetScenePresence(item.OwnerID); |
648 | "[PRIM INVENTORY]: " + | 633 | |
649 | "Tried to retrieve item ID {0} from prim {1}, {2} at {3} in {4} but the item does not exist in this inventory", | 634 | if (presence != null) |
650 | item.ItemID, m_part.Name, m_part.UUID, | 635 | { |
651 | m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); | 636 | presence.ControllingClient.SendAgentAlertMessage( |
637 | "Notecard saved", false); | ||
638 | } | ||
652 | } | 639 | } |
640 | |||
641 | m_items[item.ItemID] = item; | ||
642 | m_inventorySerial++; | ||
643 | m_part.TriggerScriptChangedEvent(Changed.INVENTORY); | ||
644 | HasInventoryChanged = true; | ||
645 | m_part.ParentGroup.HasGroupChanged = true; | ||
646 | m_items.LockItemsForWrite(false); | ||
647 | return true; | ||
648 | } | ||
649 | else | ||
650 | { | ||
651 | m_log.ErrorFormat( | ||
652 | "[PRIM INVENTORY]: " + | ||
653 | "Tried to retrieve item ID {0} from prim {1}, {2} at {3} in {4} but the item does not exist in this inventory", | ||
654 | item.ItemID, m_part.Name, m_part.UUID, | ||
655 | m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); | ||
653 | } | 656 | } |
657 | m_items.LockItemsForWrite(false); | ||
654 | 658 | ||
655 | return false; | 659 | return false; |
656 | } | 660 | } |
@@ -663,53 +667,54 @@ namespace OpenSim.Region.Framework.Scenes | |||
663 | /// in this prim's inventory.</returns> | 667 | /// in this prim's inventory.</returns> |
664 | public int RemoveInventoryItem(UUID itemID) | 668 | public int RemoveInventoryItem(UUID itemID) |
665 | { | 669 | { |
666 | lock (m_items) | 670 | m_items.LockItemsForRead(true); |
671 | |||
672 | if (m_items.ContainsKey(itemID)) | ||
667 | { | 673 | { |
668 | if (m_items.ContainsKey(itemID)) | 674 | int type = m_items[itemID].InvType; |
675 | m_items.LockItemsForRead(false); | ||
676 | if (type == 10) // Script | ||
669 | { | 677 | { |
670 | int type = m_items[itemID].InvType; | 678 | m_part.ParentGroup.Scene.EventManager.TriggerRemoveScript(m_part.LocalId, itemID); |
671 | if (type == 10) // Script | 679 | } |
672 | { | 680 | m_items.LockItemsForWrite(true); |
673 | m_part.RemoveScriptEvents(itemID); | 681 | m_items.Remove(itemID); |
674 | m_part.ParentGroup.Scene.EventManager.TriggerRemoveScript(m_part.LocalId, itemID); | 682 | m_items.LockItemsForWrite(false); |
675 | } | 683 | m_inventorySerial++; |
676 | m_items.Remove(itemID); | 684 | m_part.TriggerScriptChangedEvent(Changed.INVENTORY); |
677 | m_inventorySerial++; | ||
678 | m_part.TriggerScriptChangedEvent(Changed.INVENTORY); | ||
679 | |||
680 | HasInventoryChanged = true; | ||
681 | m_part.ParentGroup.HasGroupChanged = true; | ||
682 | 685 | ||
683 | int scriptcount = 0; | 686 | HasInventoryChanged = true; |
684 | lock (m_items) | 687 | m_part.ParentGroup.HasGroupChanged = true; |
685 | { | ||
686 | foreach (TaskInventoryItem item in m_items.Values) | ||
687 | { | ||
688 | if (item.Type == 10) | ||
689 | { | ||
690 | scriptcount++; | ||
691 | } | ||
692 | } | ||
693 | } | ||
694 | 688 | ||
695 | if (scriptcount <= 0) | 689 | int scriptcount = 0; |
690 | m_items.LockItemsForRead(true); | ||
691 | foreach (TaskInventoryItem item in m_items.Values) | ||
692 | { | ||
693 | if (item.Type == 10) | ||
696 | { | 694 | { |
697 | m_part.RemFlag(PrimFlags.Scripted); | 695 | scriptcount++; |
698 | } | 696 | } |
699 | |||
700 | m_part.ScheduleFullUpdate(); | ||
701 | |||
702 | return type; | ||
703 | } | 697 | } |
704 | else | 698 | m_items.LockItemsForRead(false); |
699 | |||
700 | |||
701 | if (scriptcount <= 0) | ||
705 | { | 702 | { |
706 | m_log.ErrorFormat( | 703 | m_part.RemFlag(PrimFlags.Scripted); |
707 | "[PRIM INVENTORY]: " + | ||
708 | "Tried to remove item ID {0} from prim {1}, {2} at {3} in {4} but the item does not exist in this inventory", | ||
709 | itemID, m_part.Name, m_part.UUID, | ||
710 | m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); | ||
711 | } | 704 | } |
705 | |||
706 | m_part.ScheduleFullUpdate(); | ||
707 | |||
708 | return type; | ||
709 | } | ||
710 | else | ||
711 | { | ||
712 | m_log.ErrorFormat( | ||
713 | "[PRIM INVENTORY]: " + | ||
714 | "Tried to remove item ID {0} from prim {1}, {2} but the item does not exist in this inventory", | ||
715 | itemID, m_part.Name, m_part.UUID); | ||
712 | } | 716 | } |
717 | m_items.LockItemsForWrite(false); | ||
713 | 718 | ||
714 | return -1; | 719 | return -1; |
715 | } | 720 | } |
@@ -762,52 +767,53 @@ namespace OpenSim.Region.Framework.Scenes | |||
762 | // isn't available (such as drag from prim inventory to agent inventory) | 767 | // isn't available (such as drag from prim inventory to agent inventory) |
763 | InventoryStringBuilder invString = new InventoryStringBuilder(m_part.UUID, UUID.Zero); | 768 | InventoryStringBuilder invString = new InventoryStringBuilder(m_part.UUID, UUID.Zero); |
764 | 769 | ||
765 | lock (m_items) | 770 | m_items.LockItemsForRead(true); |
771 | |||
772 | foreach (TaskInventoryItem item in m_items.Values) | ||
766 | { | 773 | { |
767 | foreach (TaskInventoryItem item in m_items.Values) | 774 | UUID ownerID = item.OwnerID; |
768 | { | 775 | uint everyoneMask = 0; |
769 | UUID ownerID = item.OwnerID; | 776 | uint baseMask = item.BasePermissions; |
770 | uint everyoneMask = 0; | 777 | uint ownerMask = item.CurrentPermissions; |
771 | uint baseMask = item.BasePermissions; | ||
772 | uint ownerMask = item.CurrentPermissions; | ||
773 | 778 | ||
774 | invString.AddItemStart(); | 779 | invString.AddItemStart(); |
775 | invString.AddNameValueLine("item_id", item.ItemID.ToString()); | 780 | invString.AddNameValueLine("item_id", item.ItemID.ToString()); |
776 | invString.AddNameValueLine("parent_id", m_part.UUID.ToString()); | 781 | invString.AddNameValueLine("parent_id", m_part.UUID.ToString()); |
777 | 782 | ||
778 | invString.AddPermissionsStart(); | 783 | invString.AddPermissionsStart(); |
779 | 784 | ||
780 | invString.AddNameValueLine("base_mask", Utils.UIntToHexString(baseMask)); | 785 | invString.AddNameValueLine("base_mask", Utils.UIntToHexString(baseMask)); |
781 | invString.AddNameValueLine("owner_mask", Utils.UIntToHexString(ownerMask)); | 786 | invString.AddNameValueLine("owner_mask", Utils.UIntToHexString(ownerMask)); |
782 | invString.AddNameValueLine("group_mask", Utils.UIntToHexString(0)); | 787 | invString.AddNameValueLine("group_mask", Utils.UIntToHexString(0)); |
783 | invString.AddNameValueLine("everyone_mask", Utils.UIntToHexString(everyoneMask)); | 788 | invString.AddNameValueLine("everyone_mask", Utils.UIntToHexString(everyoneMask)); |
784 | invString.AddNameValueLine("next_owner_mask", Utils.UIntToHexString(item.NextPermissions)); | 789 | invString.AddNameValueLine("next_owner_mask", Utils.UIntToHexString(item.NextPermissions)); |
785 | 790 | ||
786 | invString.AddNameValueLine("creator_id", item.CreatorID.ToString()); | 791 | invString.AddNameValueLine("creator_id", item.CreatorID.ToString()); |
787 | invString.AddNameValueLine("owner_id", ownerID.ToString()); | 792 | invString.AddNameValueLine("owner_id", ownerID.ToString()); |
788 | 793 | ||
789 | invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString()); | 794 | invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString()); |
790 | 795 | ||
791 | invString.AddNameValueLine("group_id", item.GroupID.ToString()); | 796 | invString.AddNameValueLine("group_id", item.GroupID.ToString()); |
792 | invString.AddSectionEnd(); | 797 | invString.AddSectionEnd(); |
793 | 798 | ||
794 | invString.AddNameValueLine("asset_id", item.AssetID.ToString()); | 799 | invString.AddNameValueLine("asset_id", item.AssetID.ToString()); |
795 | invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]); | 800 | invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]); |
796 | invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]); | 801 | invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]); |
797 | invString.AddNameValueLine("flags", Utils.UIntToHexString(item.Flags)); | 802 | invString.AddNameValueLine("flags", Utils.UIntToHexString(item.Flags)); |
798 | 803 | ||
799 | invString.AddSaleStart(); | 804 | invString.AddSaleStart(); |
800 | invString.AddNameValueLine("sale_type", "not"); | 805 | invString.AddNameValueLine("sale_type", "not"); |
801 | invString.AddNameValueLine("sale_price", "0"); | 806 | invString.AddNameValueLine("sale_price", "0"); |
802 | invString.AddSectionEnd(); | 807 | invString.AddSectionEnd(); |
803 | 808 | ||
804 | invString.AddNameValueLine("name", item.Name + "|"); | 809 | invString.AddNameValueLine("name", item.Name + "|"); |
805 | invString.AddNameValueLine("desc", item.Description + "|"); | 810 | invString.AddNameValueLine("desc", item.Description + "|"); |
806 | 811 | ||
807 | invString.AddNameValueLine("creation_date", item.CreationDate.ToString()); | 812 | invString.AddNameValueLine("creation_date", item.CreationDate.ToString()); |
808 | invString.AddSectionEnd(); | 813 | invString.AddSectionEnd(); |
809 | } | ||
810 | } | 814 | } |
815 | int count = m_items.Count; | ||
816 | m_items.LockItemsForRead(false); | ||
811 | 817 | ||
812 | fileData = Utils.StringToBytes(invString.BuildString); | 818 | fileData = Utils.StringToBytes(invString.BuildString); |
813 | 819 | ||
@@ -828,10 +834,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
828 | { | 834 | { |
829 | if (HasInventoryChanged) | 835 | if (HasInventoryChanged) |
830 | { | 836 | { |
831 | lock (Items) | 837 | Items.LockItemsForRead(true); |
832 | { | 838 | datastore.StorePrimInventory(m_part.UUID, Items.Values); |
833 | datastore.StorePrimInventory(m_part.UUID, Items.Values); | 839 | Items.LockItemsForRead(false); |
834 | } | ||
835 | 840 | ||
836 | HasInventoryChanged = false; | 841 | HasInventoryChanged = false; |
837 | } | 842 | } |
@@ -900,61 +905,54 @@ namespace OpenSim.Region.Framework.Scenes | |||
900 | { | 905 | { |
901 | uint mask=0x7fffffff; | 906 | uint mask=0x7fffffff; |
902 | 907 | ||
903 | lock (m_items) | 908 | foreach (TaskInventoryItem item in m_items.Values) |
904 | { | 909 | { |
905 | foreach (TaskInventoryItem item in m_items.Values) | 910 | if (item.InvType != (int)InventoryType.Object) |
906 | { | 911 | { |
907 | if (item.InvType != (int)InventoryType.Object) | 912 | if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Copy) == 0) |
908 | { | 913 | mask &= ~((uint)PermissionMask.Copy >> 13); |
909 | if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Copy) == 0) | 914 | if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Transfer) == 0) |
910 | mask &= ~((uint)PermissionMask.Copy >> 13); | 915 | mask &= ~((uint)PermissionMask.Transfer >> 13); |
911 | if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Transfer) == 0) | 916 | if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Modify) == 0) |
912 | mask &= ~((uint)PermissionMask.Transfer >> 13); | 917 | mask &= ~((uint)PermissionMask.Modify >> 13); |
913 | if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Modify) == 0) | 918 | } |
914 | mask &= ~((uint)PermissionMask.Modify >> 13); | 919 | else |
915 | } | 920 | { |
916 | else | 921 | if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0) |
917 | { | 922 | mask &= ~((uint)PermissionMask.Copy >> 13); |
918 | if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0) | 923 | if ((item.CurrentPermissions & ((uint)PermissionMask.Transfer >> 13)) == 0) |
919 | mask &= ~((uint)PermissionMask.Copy >> 13); | 924 | mask &= ~((uint)PermissionMask.Transfer >> 13); |
920 | if ((item.CurrentPermissions & ((uint)PermissionMask.Transfer >> 13)) == 0) | 925 | if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0) |
921 | mask &= ~((uint)PermissionMask.Transfer >> 13); | 926 | mask &= ~((uint)PermissionMask.Modify >> 13); |
922 | if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0) | ||
923 | mask &= ~((uint)PermissionMask.Modify >> 13); | ||
924 | } | ||
925 | |||
926 | if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) | ||
927 | mask &= ~(uint)PermissionMask.Copy; | ||
928 | if ((item.CurrentPermissions & (uint)PermissionMask.Transfer) == 0) | ||
929 | mask &= ~(uint)PermissionMask.Transfer; | ||
930 | if ((item.CurrentPermissions & (uint)PermissionMask.Modify) == 0) | ||
931 | mask &= ~(uint)PermissionMask.Modify; | ||
932 | } | 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; | ||
933 | } | 935 | } |
934 | |||
935 | return mask; | 936 | return mask; |
936 | } | 937 | } |
937 | 938 | ||
938 | public void ApplyNextOwnerPermissions() | 939 | public void ApplyNextOwnerPermissions() |
939 | { | 940 | { |
940 | lock (m_items) | 941 | foreach (TaskInventoryItem item in m_items.Values) |
941 | { | 942 | { |
942 | foreach (TaskInventoryItem item in m_items.Values) | 943 | if (item.InvType == (int)InventoryType.Object && (item.CurrentPermissions & 7) != 0) |
943 | { | 944 | { |
944 | if (item.InvType == (int)InventoryType.Object && (item.CurrentPermissions & 7) != 0) | 945 | if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0) |
945 | { | 946 | item.CurrentPermissions &= ~(uint)PermissionMask.Copy; |
946 | if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0) | 947 | if ((item.CurrentPermissions & ((uint)PermissionMask.Transfer >> 13)) == 0) |
947 | item.CurrentPermissions &= ~(uint)PermissionMask.Copy; | 948 | item.CurrentPermissions &= ~(uint)PermissionMask.Transfer; |
948 | if ((item.CurrentPermissions & ((uint)PermissionMask.Transfer >> 13)) == 0) | 949 | if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0) |
949 | item.CurrentPermissions &= ~(uint)PermissionMask.Transfer; | 950 | item.CurrentPermissions &= ~(uint)PermissionMask.Modify; |
950 | if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0) | 951 | item.CurrentPermissions |= 8; |
951 | item.CurrentPermissions &= ~(uint)PermissionMask.Modify; | ||
952 | item.CurrentPermissions |= 8; | ||
953 | } | ||
954 | item.CurrentPermissions &= item.NextPermissions; | ||
955 | item.BasePermissions &= item.NextPermissions; | ||
956 | item.EveryonePermissions &= item.NextPermissions; | ||
957 | } | 952 | } |
953 | item.CurrentPermissions &= item.NextPermissions; | ||
954 | item.BasePermissions &= item.NextPermissions; | ||
955 | item.EveryonePermissions &= item.NextPermissions; | ||
958 | } | 956 | } |
959 | 957 | ||
960 | m_part.TriggerScriptChangedEvent(Changed.OWNER); | 958 | m_part.TriggerScriptChangedEvent(Changed.OWNER); |
@@ -962,29 +960,22 @@ namespace OpenSim.Region.Framework.Scenes | |||
962 | 960 | ||
963 | public void ApplyGodPermissions(uint perms) | 961 | public void ApplyGodPermissions(uint perms) |
964 | { | 962 | { |
965 | lock (m_items) | 963 | foreach (TaskInventoryItem item in m_items.Values) |
966 | { | 964 | { |
967 | foreach (TaskInventoryItem item in m_items.Values) | 965 | item.CurrentPermissions = perms; |
968 | { | 966 | item.BasePermissions = perms; |
969 | item.CurrentPermissions = perms; | ||
970 | item.BasePermissions = perms; | ||
971 | } | ||
972 | } | 967 | } |
973 | } | 968 | } |
974 | 969 | ||
975 | public bool ContainsScripts() | 970 | public bool ContainsScripts() |
976 | { | 971 | { |
977 | lock (m_items) | 972 | foreach (TaskInventoryItem item in m_items.Values) |
978 | { | 973 | { |
979 | foreach (TaskInventoryItem item in m_items.Values) | 974 | if (item.InvType == (int)InventoryType.LSL) |
980 | { | 975 | { |
981 | if (item.InvType == (int)InventoryType.LSL) | 976 | return true; |
982 | { | ||
983 | return true; | ||
984 | } | ||
985 | } | 977 | } |
986 | } | 978 | } |
987 | |||
988 | return false; | 979 | return false; |
989 | } | 980 | } |
990 | 981 | ||
@@ -992,11 +983,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
992 | { | 983 | { |
993 | List<UUID> ret = new List<UUID>(); | 984 | List<UUID> ret = new List<UUID>(); |
994 | 985 | ||
995 | lock (m_items) | 986 | foreach (TaskInventoryItem item in m_items.Values) |
996 | { | 987 | ret.Add(item.ItemID); |
997 | foreach (TaskInventoryItem item in m_items.Values) | ||
998 | ret.Add(item.ItemID); | ||
999 | } | ||
1000 | 988 | ||
1001 | return ret; | 989 | return ret; |
1002 | } | 990 | } |
@@ -1009,30 +997,26 @@ namespace OpenSim.Region.Framework.Scenes | |||
1009 | if (engines == null) // No engine at all | 997 | if (engines == null) // No engine at all |
1010 | return ret; | 998 | return ret; |
1011 | 999 | ||
1012 | lock (m_items) | 1000 | foreach (TaskInventoryItem item in m_items.Values) |
1013 | { | 1001 | { |
1014 | foreach (TaskInventoryItem item in m_items.Values) | 1002 | if (item.InvType == (int)InventoryType.LSL) |
1015 | { | 1003 | { |
1016 | if (item.InvType == (int)InventoryType.LSL) | 1004 | foreach (IScriptModule e in engines) |
1017 | { | 1005 | { |
1018 | foreach (IScriptModule e in engines) | 1006 | if (e != null) |
1019 | { | 1007 | { |
1020 | if (e != null) | 1008 | string n = e.GetXMLState(item.ItemID); |
1009 | if (n != String.Empty) | ||
1021 | { | 1010 | { |
1022 | string n = e.GetXMLState(item.ItemID); | 1011 | if (!ret.ContainsKey(item.ItemID)) |
1023 | if (n != String.Empty) | 1012 | ret[item.ItemID] = n; |
1024 | { | 1013 | break; |
1025 | if (!ret.ContainsKey(item.ItemID)) | ||
1026 | ret[item.ItemID] = n; | ||
1027 | break; | ||
1028 | } | ||
1029 | } | 1014 | } |
1030 | } | 1015 | } |
1031 | } | 1016 | } |
1032 | } | 1017 | } |
1033 | } | 1018 | } |
1034 | |||
1035 | return ret; | 1019 | return ret; |
1036 | } | 1020 | } |
1037 | } | 1021 | } |
1038 | } \ No newline at end of file | 1022 | } |