aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs767
1 files changed, 465 insertions, 302 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 3f223a3..3be0623 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -49,6 +49,9 @@ namespace OpenSim.Region.Framework.Scenes
49 private string m_inventoryFileName = String.Empty; 49 private string m_inventoryFileName = String.Empty;
50 private byte[] m_inventoryFileData = new byte[0]; 50 private byte[] m_inventoryFileData = new byte[0];
51 private uint m_inventoryFileNameSerial = 0; 51 private uint m_inventoryFileNameSerial = 0;
52 private bool m_inventoryPrivileged = false;
53
54 private Dictionary<UUID, ArrayList> m_scriptErrors = new Dictionary<UUID, ArrayList>();
52 55
53 /// <value> 56 /// <value>
54 /// The part to which the inventory belongs. 57 /// The part to which the inventory belongs.
@@ -85,7 +88,9 @@ namespace OpenSim.Region.Framework.Scenes
85 /// </value> 88 /// </value>
86 protected internal TaskInventoryDictionary Items 89 protected internal TaskInventoryDictionary Items
87 { 90 {
88 get { return m_items; } 91 get {
92 return m_items;
93 }
89 set 94 set
90 { 95 {
91 m_items = value; 96 m_items = value;
@@ -134,38 +139,45 @@ namespace OpenSim.Region.Framework.Scenes
134 public void ResetInventoryIDs() 139 public void ResetInventoryIDs()
135 { 140 {
136 if (null == m_part) 141 if (null == m_part)
137 return; 142 m_items.LockItemsForWrite(true);
138 143
139 lock (m_items) 144 if (Items.Count == 0)
140 { 145 {
141 if (0 == m_items.Count) 146 m_items.LockItemsForWrite(false);
142 return; 147 return;
148 }
143 149
144 IList<TaskInventoryItem> items = GetInventoryItems(); 150 IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values);
145 m_items.Clear(); 151 Items.Clear();
146 152
147 foreach (TaskInventoryItem item in items) 153 foreach (TaskInventoryItem item in items)
148 { 154 {
149 item.ResetIDs(m_part.UUID); 155 item.ResetIDs(m_part.UUID);
150 m_items.Add(item.ItemID, item); 156 Items.Add(item.ItemID, item);
151 }
152 } 157 }
158 m_items.LockItemsForWrite(false);
153 } 159 }
154 160
155 public void ResetObjectID() 161 public void ResetObjectID()
156 { 162 {
157 lock (Items) 163 m_items.LockItemsForWrite(true);
164
165 if (Items.Count == 0)
158 { 166 {
159 IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); 167 m_items.LockItemsForWrite(false);
160 Items.Clear(); 168 return;
161
162 foreach (TaskInventoryItem item in items)
163 {
164 item.ParentPartID = m_part.UUID;
165 item.ParentID = m_part.UUID;
166 Items.Add(item.ItemID, item);
167 }
168 } 169 }
170
171 IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values);
172 Items.Clear();
173
174 foreach (TaskInventoryItem item in items)
175 {
176 item.ParentPartID = m_part.UUID;
177 item.ParentID = m_part.UUID;
178 Items.Add(item.ItemID, item);
179 }
180 m_items.LockItemsForWrite(false);
169 } 181 }
170 182
171 /// <summary> 183 /// <summary>
@@ -174,17 +186,14 @@ namespace OpenSim.Region.Framework.Scenes
174 /// <param name="ownerId"></param> 186 /// <param name="ownerId"></param>
175 public void ChangeInventoryOwner(UUID ownerId) 187 public void ChangeInventoryOwner(UUID ownerId)
176 { 188 {
177 lock (Items) 189 List<TaskInventoryItem> items = GetInventoryItems();
178 { 190
179 if (0 == Items.Count) 191 if (items.Count == 0)
180 { 192 return;
181 return;
182 }
183 }
184 193
194 m_items.LockItemsForWrite(true);
185 HasInventoryChanged = true; 195 HasInventoryChanged = true;
186 m_part.ParentGroup.HasGroupChanged = true; 196 m_part.ParentGroup.HasGroupChanged = true;
187 List<TaskInventoryItem> items = GetInventoryItems();
188 foreach (TaskInventoryItem item in items) 197 foreach (TaskInventoryItem item in items)
189 { 198 {
190 if (ownerId != item.OwnerID) 199 if (ownerId != item.OwnerID)
@@ -195,6 +204,7 @@ namespace OpenSim.Region.Framework.Scenes
195 item.PermsGranter = UUID.Zero; 204 item.PermsGranter = UUID.Zero;
196 item.OwnerChanged = true; 205 item.OwnerChanged = true;
197 } 206 }
207 m_items.LockItemsForWrite(false);
198 } 208 }
199 209
200 /// <summary> 210 /// <summary>
@@ -203,12 +213,11 @@ namespace OpenSim.Region.Framework.Scenes
203 /// <param name="groupID"></param> 213 /// <param name="groupID"></param>
204 public void ChangeInventoryGroup(UUID groupID) 214 public void ChangeInventoryGroup(UUID groupID)
205 { 215 {
206 lock (Items) 216 m_items.LockItemsForWrite(true);
217 if (0 == Items.Count)
207 { 218 {
208 if (0 == Items.Count) 219 m_items.LockItemsForWrite(false);
209 { 220 return;
210 return;
211 }
212 } 221 }
213 222
214 // Don't let this set the HasGroupChanged flag for attachments 223 // Don't let this set the HasGroupChanged flag for attachments
@@ -220,12 +229,15 @@ namespace OpenSim.Region.Framework.Scenes
220 m_part.ParentGroup.HasGroupChanged = true; 229 m_part.ParentGroup.HasGroupChanged = true;
221 } 230 }
222 231
223 List<TaskInventoryItem> items = GetInventoryItems(); 232 IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values);
224 foreach (TaskInventoryItem item in items) 233 foreach (TaskInventoryItem item in items)
225 { 234 {
226 if (groupID != item.GroupID) 235 if (groupID != item.GroupID)
236 {
227 item.GroupID = groupID; 237 item.GroupID = groupID;
238 }
228 } 239 }
240 m_items.LockItemsForWrite(false);
229 } 241 }
230 242
231 private void QueryScriptStates() 243 private void QueryScriptStates()
@@ -233,15 +245,18 @@ namespace OpenSim.Region.Framework.Scenes
233 if (m_part == null || m_part.ParentGroup == null || m_part.ParentGroup.Scene == null) 245 if (m_part == null || m_part.ParentGroup == null || m_part.ParentGroup.Scene == null)
234 return; 246 return;
235 247
236 lock (Items) 248 Items.LockItemsForRead(true);
249 foreach (TaskInventoryItem item in Items.Values)
237 { 250 {
238 foreach (TaskInventoryItem item in Items.Values) 251 if (item.InvType == (int)InventoryType.LSL)
239 { 252 {
240 bool running; 253 bool running;
241 if (TryGetScriptInstanceRunning(m_part.ParentGroup.Scene, item, out running)) 254 if (TryGetScriptInstanceRunning(m_part.ParentGroup.Scene, item, out running))
242 item.ScriptRunning = running; 255 item.ScriptRunning = running;
243 } 256 }
244 } 257 }
258
259 Items.LockItemsForRead(false);
245 } 260 }
246 261
247 public bool TryGetScriptInstanceRunning(UUID itemId, out bool running) 262 public bool TryGetScriptInstanceRunning(UUID itemId, out bool running)
@@ -318,7 +333,10 @@ namespace OpenSim.Region.Framework.Scenes
318 { 333 {
319 List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL); 334 List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL);
320 foreach (TaskInventoryItem item in scripts) 335 foreach (TaskInventoryItem item in scripts)
336 {
321 RemoveScriptInstance(item.ItemID, sceneObjectBeingDeleted); 337 RemoveScriptInstance(item.ItemID, sceneObjectBeingDeleted);
338 m_part.RemoveScriptEvents(item.ItemID);
339 }
322 } 340 }
323 341
324 /// <summary> 342 /// <summary>
@@ -340,7 +358,10 @@ namespace OpenSim.Region.Framework.Scenes
340// item.Name, item.ItemID, m_part.Name, m_part.UUID, m_part.ParentGroup.Scene.RegionInfo.RegionName); 358// item.Name, item.ItemID, m_part.Name, m_part.UUID, m_part.ParentGroup.Scene.RegionInfo.RegionName);
341 359
342 if (!m_part.ParentGroup.Scene.Permissions.CanRunScript(item.ItemID, m_part.UUID, item.OwnerID)) 360 if (!m_part.ParentGroup.Scene.Permissions.CanRunScript(item.ItemID, m_part.UUID, item.OwnerID))
361 {
362 StoreScriptError(item.ItemID, "no permission");
343 return false; 363 return false;
364 }
344 365
345 m_part.AddFlag(PrimFlags.Scripted); 366 m_part.AddFlag(PrimFlags.Scripted);
346 367
@@ -350,14 +371,13 @@ namespace OpenSim.Region.Framework.Scenes
350 if (stateSource == 2 && // Prim crossing 371 if (stateSource == 2 && // Prim crossing
351 m_part.ParentGroup.Scene.m_trustBinaries) 372 m_part.ParentGroup.Scene.m_trustBinaries)
352 { 373 {
353 lock (m_items) 374 m_items.LockItemsForWrite(true);
354 { 375 m_items[item.ItemID].PermsMask = 0;
355 m_items[item.ItemID].PermsMask = 0; 376 m_items[item.ItemID].PermsGranter = UUID.Zero;
356 m_items[item.ItemID].PermsGranter = UUID.Zero; 377 m_items.LockItemsForWrite(false);
357 }
358
359 m_part.ParentGroup.Scene.EventManager.TriggerRezScript( 378 m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
360 m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource); 379 m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource);
380 StoreScriptErrors(item.ItemID, null);
361 m_part.ParentGroup.AddActiveScriptCount(1); 381 m_part.ParentGroup.AddActiveScriptCount(1);
362 m_part.ScheduleFullUpdate(); 382 m_part.ScheduleFullUpdate();
363 return true; 383 return true;
@@ -366,6 +386,8 @@ namespace OpenSim.Region.Framework.Scenes
366 AssetBase asset = m_part.ParentGroup.Scene.AssetService.Get(item.AssetID.ToString()); 386 AssetBase asset = m_part.ParentGroup.Scene.AssetService.Get(item.AssetID.ToString());
367 if (null == asset) 387 if (null == asset)
368 { 388 {
389 string msg = String.Format("asset ID {0} could not be found", item.AssetID);
390 StoreScriptError(item.ItemID, msg);
369 m_log.ErrorFormat( 391 m_log.ErrorFormat(
370 "[PRIM INVENTORY]: Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found", 392 "[PRIM INVENTORY]: Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found",
371 item.Name, item.ItemID, m_part.AbsolutePosition, 393 item.Name, item.ItemID, m_part.AbsolutePosition,
@@ -378,16 +400,18 @@ namespace OpenSim.Region.Framework.Scenes
378 if (m_part.ParentGroup.m_savedScriptState != null) 400 if (m_part.ParentGroup.m_savedScriptState != null)
379 item.OldItemID = RestoreSavedScriptState(item.LoadedItemID, item.OldItemID, item.ItemID); 401 item.OldItemID = RestoreSavedScriptState(item.LoadedItemID, item.OldItemID, item.ItemID);
380 402
381 lock (m_items) 403 m_items.LockItemsForWrite(true);
382 { 404
383 m_items[item.ItemID].OldItemID = item.OldItemID; 405 m_items[item.ItemID].OldItemID = item.OldItemID;
384 m_items[item.ItemID].PermsMask = 0; 406 m_items[item.ItemID].PermsMask = 0;
385 m_items[item.ItemID].PermsGranter = UUID.Zero; 407 m_items[item.ItemID].PermsGranter = UUID.Zero;
386 }
387 408
409 m_items.LockItemsForWrite(false);
410
388 string script = Utils.BytesToString(asset.Data); 411 string script = Utils.BytesToString(asset.Data);
389 m_part.ParentGroup.Scene.EventManager.TriggerRezScript( 412 m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
390 m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource); 413 m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource);
414 StoreScriptErrors(item.ItemID, null);
391 if (!item.ScriptRunning) 415 if (!item.ScriptRunning)
392 m_part.ParentGroup.Scene.EventManager.TriggerStopScript( 416 m_part.ParentGroup.Scene.EventManager.TriggerStopScript(
393 m_part.LocalId, item.ItemID); 417 m_part.LocalId, item.ItemID);
@@ -460,22 +484,149 @@ namespace OpenSim.Region.Framework.Scenes
460 return stateID; 484 return stateID;
461 } 485 }
462 486
487 /// <summary>
488 /// Start a script which is in this prim's inventory.
489 /// Some processing may occur in the background, but this routine returns asap.
490 /// </summary>
491 /// <param name="itemId">
492 /// A <see cref="UUID"/>
493 /// </param>
463 public bool CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource) 494 public bool CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource)
464 { 495 {
465 TaskInventoryItem item = GetInventoryItem(itemId); 496 lock (m_scriptErrors)
466 if (item != null)
467 { 497 {
468 return CreateScriptInstance(item, startParam, postOnRez, engine, stateSource); 498 // Indicate to CreateScriptInstanceInternal() we don't want it to wait for completion
499 m_scriptErrors.Remove(itemId);
500 }
501 CreateScriptInstanceInternal(itemId, startParam, postOnRez, engine, stateSource);
502 return true;
503 }
504
505 private void CreateScriptInstanceInternal(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource)
506 {
507 m_items.LockItemsForRead(true);
508 if (m_items.ContainsKey(itemId))
509 {
510 if (m_items.ContainsKey(itemId))
511 {
512 m_items.LockItemsForRead(false);
513 CreateScriptInstance(m_items[itemId], startParam, postOnRez, engine, stateSource);
514 }
515 else
516 {
517 m_items.LockItemsForRead(false);
518 string msg = String.Format("couldn't be found for prim {0}, {1} at {2} in {3}", m_part.Name, m_part.UUID,
519 m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName);
520 StoreScriptError(itemId, msg);
521 m_log.ErrorFormat(
522 "[PRIM INVENTORY]: " +
523 "Couldn't start script with ID {0} since it {1}", itemId, msg);
524 }
469 } 525 }
470 else 526 else
471 { 527 {
528 m_items.LockItemsForRead(false);
529 string msg = String.Format("couldn't be found for prim {0}, {1}", m_part.Name, m_part.UUID);
530 StoreScriptError(itemId, msg);
472 m_log.ErrorFormat( 531 m_log.ErrorFormat(
473 "[PRIM INVENTORY]: Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2} at {3} in {4}", 532 "[PRIM INVENTORY]: Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2} at {3} in {4}",
474 itemId, m_part.Name, m_part.UUID, 533 itemId, m_part.Name, m_part.UUID,
475 m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); 534 m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName);
535 }
536
537 }
476 538
477 return false; 539 /// <summary>
540 /// Start a script which is in this prim's inventory and return any compilation error messages.
541 /// </summary>
542 /// <param name="itemId">
543 /// A <see cref="UUID"/>
544 /// </param>
545 public ArrayList CreateScriptInstanceEr(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource)
546 {
547 ArrayList errors;
548
549 // Indicate to CreateScriptInstanceInternal() we want it to
550 // post any compilation/loading error messages
551 lock (m_scriptErrors)
552 {
553 m_scriptErrors[itemId] = null;
554 }
555
556 // Perform compilation/loading
557 CreateScriptInstanceInternal(itemId, startParam, postOnRez, engine, stateSource);
558
559 // Wait for and retrieve any errors
560 lock (m_scriptErrors)
561 {
562 while ((errors = m_scriptErrors[itemId]) == null)
563 {
564 if (!System.Threading.Monitor.Wait(m_scriptErrors, 15000))
565 {
566 m_log.ErrorFormat(
567 "[PRIM INVENTORY]: " +
568 "timedout waiting for script {0} errors", itemId);
569 errors = m_scriptErrors[itemId];
570 if (errors == null)
571 {
572 errors = new ArrayList(1);
573 errors.Add("timedout waiting for errors");
574 }
575 break;
576 }
577 }
578 m_scriptErrors.Remove(itemId);
478 } 579 }
580 return errors;
581 }
582
583 // Signal to CreateScriptInstanceEr() that compilation/loading is complete
584 private void StoreScriptErrors(UUID itemId, ArrayList errors)
585 {
586 lock (m_scriptErrors)
587 {
588 // If compilation/loading initiated via CreateScriptInstance(),
589 // it does not want the errors, so just get out
590 if (!m_scriptErrors.ContainsKey(itemId))
591 {
592 return;
593 }
594
595 // Initiated via CreateScriptInstanceEr(), if we know what the
596 // errors are, save them and wake CreateScriptInstanceEr().
597 if (errors != null)
598 {
599 m_scriptErrors[itemId] = errors;
600 System.Threading.Monitor.PulseAll(m_scriptErrors);
601 return;
602 }
603 }
604
605 // Initiated via CreateScriptInstanceEr() but we don't know what
606 // the errors are yet, so retrieve them from the script engine.
607 // This may involve some waiting internal to GetScriptErrors().
608 errors = GetScriptErrors(itemId);
609
610 // Get a default non-null value to indicate success.
611 if (errors == null)
612 {
613 errors = new ArrayList();
614 }
615
616 // Post to CreateScriptInstanceEr() and wake it up
617 lock (m_scriptErrors)
618 {
619 m_scriptErrors[itemId] = errors;
620 System.Threading.Monitor.PulseAll(m_scriptErrors);
621 }
622 }
623
624 // Like StoreScriptErrors(), but just posts a single string message
625 private void StoreScriptError(UUID itemId, string message)
626 {
627 ArrayList errors = new ArrayList(1);
628 errors.Add(message);
629 StoreScriptErrors(itemId, errors);
479 } 630 }
480 631
481 /// <summary> 632 /// <summary>
@@ -488,15 +639,7 @@ namespace OpenSim.Region.Framework.Scenes
488 /// </param> 639 /// </param>
489 public void RemoveScriptInstance(UUID itemId, bool sceneObjectBeingDeleted) 640 public void RemoveScriptInstance(UUID itemId, bool sceneObjectBeingDeleted)
490 { 641 {
491 bool scriptPresent = false; 642 if (m_items.ContainsKey(itemId))
492
493 lock (m_items)
494 {
495 if (m_items.ContainsKey(itemId))
496 scriptPresent = true;
497 }
498
499 if (scriptPresent)
500 { 643 {
501 if (!sceneObjectBeingDeleted) 644 if (!sceneObjectBeingDeleted)
502 m_part.RemoveScriptEvents(itemId); 645 m_part.RemoveScriptEvents(itemId);
@@ -567,14 +710,16 @@ namespace OpenSim.Region.Framework.Scenes
567 /// <returns></returns> 710 /// <returns></returns>
568 private bool InventoryContainsName(string name) 711 private bool InventoryContainsName(string name)
569 { 712 {
570 lock (m_items) 713 m_items.LockItemsForRead(true);
714 foreach (TaskInventoryItem item in m_items.Values)
571 { 715 {
572 foreach (TaskInventoryItem item in m_items.Values) 716 if (item.Name == name)
573 { 717 {
574 if (item.Name == name) 718 m_items.LockItemsForRead(false);
575 return true; 719 return true;
576 } 720 }
577 } 721 }
722 m_items.LockItemsForRead(false);
578 return false; 723 return false;
579 } 724 }
580 725
@@ -616,8 +761,9 @@ namespace OpenSim.Region.Framework.Scenes
616 /// <param name="item"></param> 761 /// <param name="item"></param>
617 public void AddInventoryItemExclusive(TaskInventoryItem item, bool allowedDrop) 762 public void AddInventoryItemExclusive(TaskInventoryItem item, bool allowedDrop)
618 { 763 {
619 List<TaskInventoryItem> il = GetInventoryItems(); 764 m_items.LockItemsForRead(true);
620 765 List<TaskInventoryItem> il = new List<TaskInventoryItem>(m_items.Values);
766 m_items.LockItemsForRead(false);
621 foreach (TaskInventoryItem i in il) 767 foreach (TaskInventoryItem i in il)
622 { 768 {
623 if (i.Name == item.Name) 769 if (i.Name == item.Name)
@@ -655,14 +801,14 @@ namespace OpenSim.Region.Framework.Scenes
655 item.Name = name; 801 item.Name = name;
656 item.GroupID = m_part.GroupID; 802 item.GroupID = m_part.GroupID;
657 803
658 lock (m_items) 804 m_items.LockItemsForWrite(true);
659 m_items.Add(item.ItemID, item); 805 m_items.Add(item.ItemID, item);
660 806 m_items.LockItemsForWrite(false);
661 if (allowedDrop) 807 if (allowedDrop)
662 m_part.TriggerScriptChangedEvent(Changed.ALLOWED_DROP); 808 m_part.TriggerScriptChangedEvent(Changed.ALLOWED_DROP);
663 else 809 else
664 m_part.TriggerScriptChangedEvent(Changed.INVENTORY); 810 m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
665 811
666 m_inventorySerial++; 812 m_inventorySerial++;
667 //m_inventorySerial += 2; 813 //m_inventorySerial += 2;
668 HasInventoryChanged = true; 814 HasInventoryChanged = true;
@@ -678,15 +824,15 @@ namespace OpenSim.Region.Framework.Scenes
678 /// <param name="items"></param> 824 /// <param name="items"></param>
679 public void RestoreInventoryItems(ICollection<TaskInventoryItem> items) 825 public void RestoreInventoryItems(ICollection<TaskInventoryItem> items)
680 { 826 {
681 lock (m_items) 827 m_items.LockItemsForWrite(true);
828 foreach (TaskInventoryItem item in items)
682 { 829 {
683 foreach (TaskInventoryItem item in items) 830 m_items.Add(item.ItemID, item);
684 { 831// m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
685 m_items.Add(item.ItemID, item);
686// m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
687 }
688 m_inventorySerial++;
689 } 832 }
833 m_items.LockItemsForWrite(false);
834
835 m_inventorySerial++;
690 } 836 }
691 837
692 /// <summary> 838 /// <summary>
@@ -697,23 +843,24 @@ namespace OpenSim.Region.Framework.Scenes
697 public TaskInventoryItem GetInventoryItem(UUID itemId) 843 public TaskInventoryItem GetInventoryItem(UUID itemId)
698 { 844 {
699 TaskInventoryItem item; 845 TaskInventoryItem item;
700 846 m_items.LockItemsForRead(true);
701 lock (m_items) 847 m_items.TryGetValue(itemId, out item);
702 m_items.TryGetValue(itemId, out item); 848 m_items.LockItemsForRead(false);
703
704 return item; 849 return item;
705 } 850 }
706 851
707 public TaskInventoryItem GetInventoryItem(string name) 852 public TaskInventoryItem GetInventoryItem(string name)
708 { 853 {
709 lock (m_items) 854 m_items.LockItemsForRead(true);
855 foreach (TaskInventoryItem item in m_items.Values)
710 { 856 {
711 foreach (TaskInventoryItem item in m_items.Values) 857 if (item.Name == name)
712 { 858 {
713 if (item.Name == name) 859 m_items.LockItemsForRead(false);
714 return item; 860 return item;
715 } 861 }
716 } 862 }
863 m_items.LockItemsForRead(false);
717 864
718 return null; 865 return null;
719 } 866 }
@@ -722,15 +869,16 @@ namespace OpenSim.Region.Framework.Scenes
722 { 869 {
723 List<TaskInventoryItem> items = new List<TaskInventoryItem>(); 870 List<TaskInventoryItem> items = new List<TaskInventoryItem>();
724 871
725 lock (m_items) 872 m_items.LockItemsForRead(true);
873
874 foreach (TaskInventoryItem item in m_items.Values)
726 { 875 {
727 foreach (TaskInventoryItem item in m_items.Values) 876 if (item.Name == name)
728 { 877 items.Add(item);
729 if (item.Name == name)
730 items.Add(item);
731 }
732 } 878 }
733 879
880 m_items.LockItemsForRead(false);
881
734 return items; 882 return items;
735 } 883 }
736 884
@@ -749,6 +897,10 @@ namespace OpenSim.Region.Framework.Scenes
749 string xmlData = Utils.BytesToString(rezAsset.Data); 897 string xmlData = Utils.BytesToString(rezAsset.Data);
750 SceneObjectGroup group = SceneObjectSerializer.FromOriginalXmlFormat(xmlData); 898 SceneObjectGroup group = SceneObjectSerializer.FromOriginalXmlFormat(xmlData);
751 899
900 group.RootPart.AttachPoint = group.RootPart.Shape.State;
901 group.RootPart.AttachOffset = group.AbsolutePosition;
902 group.RootPart.AttachRotation = group.GroupRotation;
903
752 group.ResetIDs(); 904 group.ResetIDs();
753 905
754 SceneObjectPart rootPart = group.GetPart(group.UUID); 906 SceneObjectPart rootPart = group.GetPart(group.UUID);
@@ -823,8 +975,9 @@ namespace OpenSim.Region.Framework.Scenes
823 975
824 public bool UpdateInventoryItem(TaskInventoryItem item, bool fireScriptEvents, bool considerChanged) 976 public bool UpdateInventoryItem(TaskInventoryItem item, bool fireScriptEvents, bool considerChanged)
825 { 977 {
826 TaskInventoryItem it = GetInventoryItem(item.ItemID); 978 m_items.LockItemsForWrite(true);
827 if (it != null) 979
980 if (m_items.ContainsKey(item.ItemID))
828 { 981 {
829// m_log.DebugFormat("[PRIM INVENTORY]: Updating item {0} in {1}", item.Name, m_part.Name); 982// m_log.DebugFormat("[PRIM INVENTORY]: Updating item {0} in {1}", item.Name, m_part.Name);
830 983
@@ -837,14 +990,10 @@ namespace OpenSim.Region.Framework.Scenes
837 item.GroupID = m_part.GroupID; 990 item.GroupID = m_part.GroupID;
838 991
839 if (item.AssetID == UUID.Zero) 992 if (item.AssetID == UUID.Zero)
840 item.AssetID = it.AssetID; 993 item.AssetID = m_items[item.ItemID].AssetID;
841 994
842 lock (m_items) 995 m_items[item.ItemID] = item;
843 { 996 m_inventorySerial++;
844 m_items[item.ItemID] = item;
845 m_inventorySerial++;
846 }
847
848 if (fireScriptEvents) 997 if (fireScriptEvents)
849 m_part.TriggerScriptChangedEvent(Changed.INVENTORY); 998 m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
850 999
@@ -853,7 +1002,7 @@ namespace OpenSim.Region.Framework.Scenes
853 HasInventoryChanged = true; 1002 HasInventoryChanged = true;
854 m_part.ParentGroup.HasGroupChanged = true; 1003 m_part.ParentGroup.HasGroupChanged = true;
855 } 1004 }
856 1005 m_items.LockItemsForWrite(false);
857 return true; 1006 return true;
858 } 1007 }
859 else 1008 else
@@ -864,8 +1013,9 @@ namespace OpenSim.Region.Framework.Scenes
864 item.ItemID, m_part.Name, m_part.UUID, 1013 item.ItemID, m_part.Name, m_part.UUID,
865 m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); 1014 m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName);
866 } 1015 }
867 return false; 1016 m_items.LockItemsForWrite(false);
868 1017
1018 return false;
869 } 1019 }
870 1020
871 /// <summary> 1021 /// <summary>
@@ -876,43 +1026,59 @@ namespace OpenSim.Region.Framework.Scenes
876 /// in this prim's inventory.</returns> 1026 /// in this prim's inventory.</returns>
877 public int RemoveInventoryItem(UUID itemID) 1027 public int RemoveInventoryItem(UUID itemID)
878 { 1028 {
879 TaskInventoryItem item = GetInventoryItem(itemID); 1029 m_items.LockItemsForRead(true);
880 if (item != null) 1030
1031 if (m_items.ContainsKey(itemID))
881 { 1032 {
882 int type = m_items[itemID].InvType; 1033 int type = m_items[itemID].InvType;
1034 m_items.LockItemsForRead(false);
883 if (type == 10) // Script 1035 if (type == 10) // Script
884 { 1036 {
885 m_part.RemoveScriptEvents(itemID);
886 m_part.ParentGroup.Scene.EventManager.TriggerRemoveScript(m_part.LocalId, itemID); 1037 m_part.ParentGroup.Scene.EventManager.TriggerRemoveScript(m_part.LocalId, itemID);
887 } 1038 }
1039 m_items.LockItemsForWrite(true);
888 m_items.Remove(itemID); 1040 m_items.Remove(itemID);
1041 m_items.LockItemsForWrite(false);
889 m_inventorySerial++; 1042 m_inventorySerial++;
890 m_part.TriggerScriptChangedEvent(Changed.INVENTORY); 1043 m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
891 1044
892 HasInventoryChanged = true; 1045 HasInventoryChanged = true;
893 m_part.ParentGroup.HasGroupChanged = true; 1046 m_part.ParentGroup.HasGroupChanged = true;
894 1047
895 if (!ContainsScripts()) 1048 int scriptcount = 0;
1049 m_items.LockItemsForRead(true);
1050 foreach (TaskInventoryItem item in m_items.Values)
1051 {
1052 if (item.Type == 10)
1053 {
1054 scriptcount++;
1055 }
1056 }
1057 m_items.LockItemsForRead(false);
1058
1059
1060 if (scriptcount <= 0)
1061 {
896 m_part.RemFlag(PrimFlags.Scripted); 1062 m_part.RemFlag(PrimFlags.Scripted);
1063 }
897 1064
898 m_part.ScheduleFullUpdate(); 1065 m_part.ScheduleFullUpdate();
899 1066
900 return type; 1067 return type;
901
902 } 1068 }
903 else 1069 else
904 { 1070 {
1071 m_items.LockItemsForRead(false);
905 m_log.ErrorFormat( 1072 m_log.ErrorFormat(
906 "[PRIM INVENTORY]: " + 1073 "[PRIM INVENTORY]: " +
907 "Tried to remove item ID {0} from prim {1}, {2} at {3} in {4} but the item does not exist in this inventory", 1074 "Tried to remove item ID {0} from prim {1}, {2} but the item does not exist in this inventory",
908 itemID, m_part.Name, m_part.UUID, 1075 itemID, m_part.Name, m_part.UUID);
909 m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName);
910 } 1076 }
911 1077
912 return -1; 1078 return -1;
913 } 1079 }
914 1080
915 private bool CreateInventoryFile() 1081 private bool CreateInventoryFileName()
916 { 1082 {
917// m_log.DebugFormat( 1083// m_log.DebugFormat(
918// "[PRIM INVENTORY]: Creating inventory file for {0} {1} {2}, serial {3}", 1084// "[PRIM INVENTORY]: Creating inventory file for {0} {1} {2}, serial {3}",
@@ -921,70 +1087,12 @@ namespace OpenSim.Region.Framework.Scenes
921 if (m_inventoryFileName == String.Empty || 1087 if (m_inventoryFileName == String.Empty ||
922 m_inventoryFileNameSerial < m_inventorySerial) 1088 m_inventoryFileNameSerial < m_inventorySerial)
923 { 1089 {
924 // Something changed, we need to create a new file
925 m_inventoryFileName = "inventory_" + UUID.Random().ToString() + ".tmp"; 1090 m_inventoryFileName = "inventory_" + UUID.Random().ToString() + ".tmp";
926 m_inventoryFileNameSerial = m_inventorySerial; 1091 m_inventoryFileNameSerial = m_inventorySerial;
927 1092
928 InventoryStringBuilder invString = new InventoryStringBuilder(m_part.UUID, UUID.Zero);
929
930 lock (m_items)
931 {
932 foreach (TaskInventoryItem item in m_items.Values)
933 {
934// m_log.DebugFormat(
935// "[PRIM INVENTORY]: Adding item {0} {1} for serial {2} on prim {3} {4} {5}",
936// item.Name, item.ItemID, m_inventorySerial, m_part.Name, m_part.UUID, m_part.LocalId);
937
938 UUID ownerID = item.OwnerID;
939 uint everyoneMask = 0;
940 uint baseMask = item.BasePermissions;
941 uint ownerMask = item.CurrentPermissions;
942 uint groupMask = item.GroupPermissions;
943
944 invString.AddItemStart();
945 invString.AddNameValueLine("item_id", item.ItemID.ToString());
946 invString.AddNameValueLine("parent_id", m_part.UUID.ToString());
947
948 invString.AddPermissionsStart();
949
950 invString.AddNameValueLine("base_mask", Utils.UIntToHexString(baseMask));
951 invString.AddNameValueLine("owner_mask", Utils.UIntToHexString(ownerMask));
952 invString.AddNameValueLine("group_mask", Utils.UIntToHexString(groupMask));
953 invString.AddNameValueLine("everyone_mask", Utils.UIntToHexString(everyoneMask));
954 invString.AddNameValueLine("next_owner_mask", Utils.UIntToHexString(item.NextPermissions));
955
956 invString.AddNameValueLine("creator_id", item.CreatorID.ToString());
957 invString.AddNameValueLine("owner_id", ownerID.ToString());
958
959 invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString());
960
961 invString.AddNameValueLine("group_id", item.GroupID.ToString());
962 invString.AddSectionEnd();
963
964 invString.AddNameValueLine("asset_id", item.AssetID.ToString());
965 invString.AddNameValueLine("type", Utils.AssetTypeToString((AssetType)item.Type));
966 invString.AddNameValueLine("inv_type", Utils.InventoryTypeToString((InventoryType)item.InvType));
967 invString.AddNameValueLine("flags", Utils.UIntToHexString(item.Flags));
968
969 invString.AddSaleStart();
970 invString.AddNameValueLine("sale_type", "not");
971 invString.AddNameValueLine("sale_price", "0");
972 invString.AddSectionEnd();
973
974 invString.AddNameValueLine("name", item.Name + "|");
975 invString.AddNameValueLine("desc", item.Description + "|");
976
977 invString.AddNameValueLine("creation_date", item.CreationDate.ToString());
978 invString.AddSectionEnd();
979 }
980 }
981
982 m_inventoryFileData = Utils.StringToBytes(invString.BuildString);
983
984 return true; 1093 return true;
985 } 1094 }
986 1095
987 // No need to recreate, the existing file is fine
988 return false; 1096 return false;
989 } 1097 }
990 1098
@@ -994,43 +1102,110 @@ namespace OpenSim.Region.Framework.Scenes
994 /// <param name="xferManager"></param> 1102 /// <param name="xferManager"></param>
995 public void RequestInventoryFile(IClientAPI client, IXfer xferManager) 1103 public void RequestInventoryFile(IClientAPI client, IXfer xferManager)
996 { 1104 {
997 lock (m_items) 1105 bool changed = CreateInventoryFileName();
998 {
999 // Don't send a inventory xfer name if there are no items. Doing so causes viewer 3 to crash when rezzing
1000 // a new script if any previous deletion has left the prim inventory empty.
1001 if (m_items.Count == 0) // No inventory
1002 {
1003// m_log.DebugFormat(
1004// "[PRIM INVENTORY]: Not sending inventory data for part {0} {1} {2} for {3} since no items",
1005// m_part.Name, m_part.LocalId, m_part.UUID, client.Name);
1006 1106
1007 client.SendTaskInventory(m_part.UUID, 0, new byte[0]); 1107 bool includeAssets = false;
1008 return; 1108 if (m_part.ParentGroup.Scene.Permissions.CanEditObjectInventory(m_part.UUID, client.AgentId))
1009 } 1109 includeAssets = true;
1110
1111 if (m_inventoryPrivileged != includeAssets)
1112 changed = true;
1113
1114 InventoryStringBuilder invString = new InventoryStringBuilder(m_part.UUID, UUID.Zero);
1115
1116 Items.LockItemsForRead(true);
1117
1118 if (m_inventorySerial == 0) // No inventory
1119 {
1120 client.SendTaskInventory(m_part.UUID, 0, new byte[0]);
1121 Items.LockItemsForRead(false);
1122 return;
1123 }
1010 1124
1011 CreateInventoryFile(); 1125 if (m_items.Count == 0) // No inventory
1126 {
1127 client.SendTaskInventory(m_part.UUID, 0, new byte[0]);
1128 Items.LockItemsForRead(false);
1129 return;
1130 }
1012 1131
1013 // In principle, we should only do the rest if the inventory changed; 1132 if (!changed)
1014 // by sending m_inventorySerial to the client, it ought to know 1133 {
1015 // that nothing changed and that it doesn't need to request the file.
1016 // Unfortunately, it doesn't look like the client optimizes this;
1017 // the client seems to always come back and request the Xfer,
1018 // no matter what value m_inventorySerial has.
1019 // FIXME: Could probably be > 0 here rather than > 2
1020 if (m_inventoryFileData.Length > 2) 1134 if (m_inventoryFileData.Length > 2)
1021 { 1135 {
1022 // Add the file for Xfer 1136 xferManager.AddNewFile(m_inventoryFileName,
1023 // m_log.DebugFormat( 1137 m_inventoryFileData);
1024 // "[PRIM INVENTORY]: Adding inventory file {0} (length {1}) for transfer on {2} {3} {4}", 1138 client.SendTaskInventory(m_part.UUID, (short)m_inventorySerial,
1025 // m_inventoryFileName, m_inventoryFileData.Length, m_part.Name, m_part.UUID, m_part.LocalId); 1139 Util.StringToBytes256(m_inventoryFileName));
1026 1140
1027 xferManager.AddNewFile(m_inventoryFileName, m_inventoryFileData); 1141 Items.LockItemsForRead(false);
1142 return;
1028 } 1143 }
1029
1030 // Tell the client we're ready to Xfer the file
1031 client.SendTaskInventory(m_part.UUID, (short)m_inventorySerial,
1032 Util.StringToBytes256(m_inventoryFileName));
1033 } 1144 }
1145
1146 m_inventoryPrivileged = includeAssets;
1147
1148 foreach (TaskInventoryItem item in m_items.Values)
1149 {
1150 UUID ownerID = item.OwnerID;
1151 uint everyoneMask = 0;
1152 uint baseMask = item.BasePermissions;
1153 uint ownerMask = item.CurrentPermissions;
1154 uint groupMask = item.GroupPermissions;
1155
1156 invString.AddItemStart();
1157 invString.AddNameValueLine("item_id", item.ItemID.ToString());
1158 invString.AddNameValueLine("parent_id", m_part.UUID.ToString());
1159
1160 invString.AddPermissionsStart();
1161
1162 invString.AddNameValueLine("base_mask", Utils.UIntToHexString(baseMask));
1163 invString.AddNameValueLine("owner_mask", Utils.UIntToHexString(ownerMask));
1164 invString.AddNameValueLine("group_mask", Utils.UIntToHexString(groupMask));
1165 invString.AddNameValueLine("everyone_mask", Utils.UIntToHexString(everyoneMask));
1166 invString.AddNameValueLine("next_owner_mask", Utils.UIntToHexString(item.NextPermissions));
1167
1168 invString.AddNameValueLine("creator_id", item.CreatorID.ToString());
1169 invString.AddNameValueLine("owner_id", ownerID.ToString());
1170
1171 invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString());
1172
1173 invString.AddNameValueLine("group_id", item.GroupID.ToString());
1174 invString.AddSectionEnd();
1175
1176 if (includeAssets)
1177 invString.AddNameValueLine("asset_id", item.AssetID.ToString());
1178 else
1179 invString.AddNameValueLine("asset_id", UUID.Zero.ToString());
1180 invString.AddNameValueLine("type", Utils.AssetTypeToString((AssetType)item.Type));
1181 invString.AddNameValueLine("inv_type", Utils.InventoryTypeToString((InventoryType)item.InvType));
1182 invString.AddNameValueLine("flags", Utils.UIntToHexString(item.Flags));
1183
1184 invString.AddSaleStart();
1185 invString.AddNameValueLine("sale_type", "not");
1186 invString.AddNameValueLine("sale_price", "0");
1187 invString.AddSectionEnd();
1188
1189 invString.AddNameValueLine("name", item.Name + "|");
1190 invString.AddNameValueLine("desc", item.Description + "|");
1191
1192 invString.AddNameValueLine("creation_date", item.CreationDate.ToString());
1193 invString.AddSectionEnd();
1194 }
1195
1196 Items.LockItemsForRead(false);
1197
1198 m_inventoryFileData = Utils.StringToBytes(invString.BuildString);
1199
1200 if (m_inventoryFileData.Length > 2)
1201 {
1202 xferManager.AddNewFile(m_inventoryFileName, m_inventoryFileData);
1203 client.SendTaskInventory(m_part.UUID, (short)m_inventorySerial,
1204 Util.StringToBytes256(m_inventoryFileName));
1205 return;
1206 }
1207
1208 client.SendTaskInventory(m_part.UUID, 0, new byte[0]);
1034 } 1209 }
1035 1210
1036 /// <summary> 1211 /// <summary>
@@ -1039,13 +1214,19 @@ namespace OpenSim.Region.Framework.Scenes
1039 /// <param name="datastore"></param> 1214 /// <param name="datastore"></param>
1040 public void ProcessInventoryBackup(ISimulationDataService datastore) 1215 public void ProcessInventoryBackup(ISimulationDataService datastore)
1041 { 1216 {
1042 if (HasInventoryChanged) 1217// Removed this because linking will cause an immediate delete of the new
1043 { 1218// child prim from the database and the subsequent storing of the prim sees
1044 HasInventoryChanged = false; 1219// the inventory of it as unchanged and doesn't store it at all. The overhead
1045 List<TaskInventoryItem> items = GetInventoryItems(); 1220// of storing prim inventory needlessly is much less than the aggravation
1046 datastore.StorePrimInventory(m_part.UUID, items); 1221// of prim inventory loss.
1222// if (HasInventoryChanged)
1223// {
1224 Items.LockItemsForRead(true);
1225 datastore.StorePrimInventory(m_part.UUID, Items.Values);
1226 Items.LockItemsForRead(false);
1047 1227
1048 } 1228 HasInventoryChanged = false;
1229// }
1049 } 1230 }
1050 1231
1051 public class InventoryStringBuilder 1232 public class InventoryStringBuilder
@@ -1111,87 +1292,63 @@ namespace OpenSim.Region.Framework.Scenes
1111 { 1292 {
1112 uint mask=0x7fffffff; 1293 uint mask=0x7fffffff;
1113 1294
1114 lock (m_items) 1295 foreach (TaskInventoryItem item in m_items.Values)
1115 { 1296 {
1116 foreach (TaskInventoryItem item in m_items.Values) 1297 if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Copy) == 0)
1298 mask &= ~((uint)PermissionMask.Copy >> 13);
1299 if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Transfer) == 0)
1300 mask &= ~((uint)PermissionMask.Transfer >> 13);
1301 if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Modify) == 0)
1302 mask &= ~((uint)PermissionMask.Modify >> 13);
1303
1304 if (item.InvType == (int)InventoryType.Object)
1117 { 1305 {
1118 if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Copy) == 0) 1306 if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0)
1119 mask &= ~((uint)PermissionMask.Copy >> 13); 1307 mask &= ~((uint)PermissionMask.Copy >> 13);
1120 if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Transfer) == 0) 1308 if ((item.CurrentPermissions & ((uint)PermissionMask.Transfer >> 13)) == 0)
1121 mask &= ~((uint)PermissionMask.Transfer >> 13); 1309 mask &= ~((uint)PermissionMask.Transfer >> 13);
1122 if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Modify) == 0) 1310 if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0)
1123 mask &= ~((uint)PermissionMask.Modify >> 13); 1311 mask &= ~((uint)PermissionMask.Modify >> 13);
1124
1125 if (item.InvType != (int)InventoryType.Object)
1126 {
1127 if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Copy) == 0)
1128 mask &= ~((uint)PermissionMask.Copy >> 13);
1129 if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Transfer) == 0)
1130 mask &= ~((uint)PermissionMask.Transfer >> 13);
1131 if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Modify) == 0)
1132 mask &= ~((uint)PermissionMask.Modify >> 13);
1133 }
1134 else
1135 {
1136 if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0)
1137 mask &= ~((uint)PermissionMask.Copy >> 13);
1138 if ((item.CurrentPermissions & ((uint)PermissionMask.Transfer >> 13)) == 0)
1139 mask &= ~((uint)PermissionMask.Transfer >> 13);
1140 if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0)
1141 mask &= ~((uint)PermissionMask.Modify >> 13);
1142 }
1143
1144 if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0)
1145 mask &= ~(uint)PermissionMask.Copy;
1146 if ((item.CurrentPermissions & (uint)PermissionMask.Transfer) == 0)
1147 mask &= ~(uint)PermissionMask.Transfer;
1148 if ((item.CurrentPermissions & (uint)PermissionMask.Modify) == 0)
1149 mask &= ~(uint)PermissionMask.Modify;
1150 } 1312 }
1313
1314 if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0)
1315 mask &= ~(uint)PermissionMask.Copy;
1316 if ((item.CurrentPermissions & (uint)PermissionMask.Transfer) == 0)
1317 mask &= ~(uint)PermissionMask.Transfer;
1318 if ((item.CurrentPermissions & (uint)PermissionMask.Modify) == 0)
1319 mask &= ~(uint)PermissionMask.Modify;
1151 } 1320 }
1152
1153 return mask; 1321 return mask;
1154 } 1322 }
1155 1323
1156 public void ApplyNextOwnerPermissions() 1324 public void ApplyNextOwnerPermissions()
1157 { 1325 {
1158 lock (m_items) 1326 foreach (TaskInventoryItem item in m_items.Values)
1159 { 1327 {
1160 foreach (TaskInventoryItem item in m_items.Values) 1328 if (item.InvType == (int)InventoryType.Object && (item.CurrentPermissions & 7) != 0)
1161 { 1329 {
1162// m_log.DebugFormat ( 1330 if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0)
1163// "[SCENE OBJECT PART INVENTORY]: Applying next permissions {0} to {1} in {2} with current {3}, base {4}, everyone {5}", 1331 item.CurrentPermissions &= ~(uint)PermissionMask.Copy;
1164// item.NextPermissions, item.Name, m_part.Name, item.CurrentPermissions, item.BasePermissions, item.EveryonePermissions); 1332 if ((item.CurrentPermissions & ((uint)PermissionMask.Transfer >> 13)) == 0)
1165 1333 item.CurrentPermissions &= ~(uint)PermissionMask.Transfer;
1166 if (item.InvType == (int)InventoryType.Object && (item.CurrentPermissions & 7) != 0) 1334 if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0)
1167 { 1335 item.CurrentPermissions &= ~(uint)PermissionMask.Modify;
1168 if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0)
1169 item.CurrentPermissions &= ~(uint)PermissionMask.Copy;
1170 if ((item.CurrentPermissions & ((uint)PermissionMask.Transfer >> 13)) == 0)
1171 item.CurrentPermissions &= ~(uint)PermissionMask.Transfer;
1172 if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0)
1173 item.CurrentPermissions &= ~(uint)PermissionMask.Modify;
1174 }
1175
1176 item.CurrentPermissions &= item.NextPermissions;
1177 item.BasePermissions &= item.NextPermissions;
1178 item.EveryonePermissions &= item.NextPermissions;
1179 item.OwnerChanged = true;
1180 item.PermsMask = 0;
1181 item.PermsGranter = UUID.Zero;
1182 } 1336 }
1337 item.CurrentPermissions &= item.NextPermissions;
1338 item.BasePermissions &= item.NextPermissions;
1339 item.EveryonePermissions &= item.NextPermissions;
1340 item.OwnerChanged = true;
1341 item.PermsMask = 0;
1342 item.PermsGranter = UUID.Zero;
1183 } 1343 }
1184 } 1344 }
1185 1345
1186 public void ApplyGodPermissions(uint perms) 1346 public void ApplyGodPermissions(uint perms)
1187 { 1347 {
1188 lock (m_items) 1348 foreach (TaskInventoryItem item in m_items.Values)
1189 { 1349 {
1190 foreach (TaskInventoryItem item in m_items.Values) 1350 item.CurrentPermissions = perms;
1191 { 1351 item.BasePermissions = perms;
1192 item.CurrentPermissions = perms;
1193 item.BasePermissions = perms;
1194 }
1195 } 1352 }
1196 1353
1197 m_inventorySerial++; 1354 m_inventorySerial++;
@@ -1204,14 +1361,11 @@ namespace OpenSim.Region.Framework.Scenes
1204 /// <returns></returns> 1361 /// <returns></returns>
1205 public bool ContainsScripts() 1362 public bool ContainsScripts()
1206 { 1363 {
1207 lock (m_items) 1364 foreach (TaskInventoryItem item in m_items.Values)
1208 { 1365 {
1209 foreach (TaskInventoryItem item in m_items.Values) 1366 if (item.InvType == (int)InventoryType.LSL)
1210 { 1367 {
1211 if (item.InvType == (int)InventoryType.LSL) 1368 return true;
1212 {
1213 return true;
1214 }
1215 } 1369 }
1216 } 1370 }
1217 1371
@@ -1225,17 +1379,15 @@ namespace OpenSim.Region.Framework.Scenes
1225 public int ScriptCount() 1379 public int ScriptCount()
1226 { 1380 {
1227 int count = 0; 1381 int count = 0;
1228 lock (m_items) 1382 Items.LockItemsForRead(true);
1383 foreach (TaskInventoryItem item in m_items.Values)
1229 { 1384 {
1230 foreach (TaskInventoryItem item in m_items.Values) 1385 if (item.InvType == (int)InventoryType.LSL)
1231 { 1386 {
1232 if (item.InvType == (int)InventoryType.LSL) 1387 count++;
1233 {
1234 count++;
1235 }
1236 } 1388 }
1237 } 1389 }
1238 1390 Items.LockItemsForRead(false);
1239 return count; 1391 return count;
1240 } 1392 }
1241 /// <summary> 1393 /// <summary>
@@ -1271,11 +1423,8 @@ namespace OpenSim.Region.Framework.Scenes
1271 { 1423 {
1272 List<UUID> ret = new List<UUID>(); 1424 List<UUID> ret = new List<UUID>();
1273 1425
1274 lock (m_items) 1426 foreach (TaskInventoryItem item in m_items.Values)
1275 { 1427 ret.Add(item.ItemID);
1276 foreach (TaskInventoryItem item in m_items.Values)
1277 ret.Add(item.ItemID);
1278 }
1279 1428
1280 return ret; 1429 return ret;
1281 } 1430 }
@@ -1284,8 +1433,9 @@ namespace OpenSim.Region.Framework.Scenes
1284 { 1433 {
1285 List<TaskInventoryItem> ret = new List<TaskInventoryItem>(); 1434 List<TaskInventoryItem> ret = new List<TaskInventoryItem>();
1286 1435
1287 lock (m_items) 1436 Items.LockItemsForRead(true);
1288 ret = new List<TaskInventoryItem>(m_items.Values); 1437 ret = new List<TaskInventoryItem>(m_items.Values);
1438 Items.LockItemsForRead(false);
1289 1439
1290 return ret; 1440 return ret;
1291 } 1441 }
@@ -1294,18 +1444,24 @@ namespace OpenSim.Region.Framework.Scenes
1294 { 1444 {
1295 List<TaskInventoryItem> ret = new List<TaskInventoryItem>(); 1445 List<TaskInventoryItem> ret = new List<TaskInventoryItem>();
1296 1446
1297 lock (m_items) 1447 Items.LockItemsForRead(true);
1298 { 1448
1299 foreach (TaskInventoryItem item in m_items.Values) 1449 foreach (TaskInventoryItem item in m_items.Values)
1300 if (item.InvType == (int)type) 1450 if (item.InvType == (int)type)
1301 ret.Add(item); 1451 ret.Add(item);
1302 } 1452
1453 Items.LockItemsForRead(false);
1303 1454
1304 return ret; 1455 return ret;
1305 } 1456 }
1306 1457
1307 public Dictionary<UUID, string> GetScriptStates() 1458 public Dictionary<UUID, string> GetScriptStates()
1308 { 1459 {
1460 return GetScriptStates(false);
1461 }
1462
1463 public Dictionary<UUID, string> GetScriptStates(bool oldIDs)
1464 {
1309 Dictionary<UUID, string> ret = new Dictionary<UUID, string>(); 1465 Dictionary<UUID, string> ret = new Dictionary<UUID, string>();
1310 1466
1311 if (m_part.ParentGroup.Scene == null) // Group not in a scene 1467 if (m_part.ParentGroup.Scene == null) // Group not in a scene
@@ -1331,14 +1487,21 @@ namespace OpenSim.Region.Framework.Scenes
1331 string n = e.GetXMLState(item.ItemID); 1487 string n = e.GetXMLState(item.ItemID);
1332 if (n != String.Empty) 1488 if (n != String.Empty)
1333 { 1489 {
1334 if (!ret.ContainsKey(item.ItemID)) 1490 if (oldIDs)
1335 ret[item.ItemID] = n; 1491 {
1492 if (!ret.ContainsKey(item.OldItemID))
1493 ret[item.OldItemID] = n;
1494 }
1495 else
1496 {
1497 if (!ret.ContainsKey(item.ItemID))
1498 ret[item.ItemID] = n;
1499 }
1336 break; 1500 break;
1337 } 1501 }
1338 } 1502 }
1339 } 1503 }
1340 } 1504 }
1341
1342 return ret; 1505 return ret;
1343 } 1506 }
1344 1507