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.cs146
1 files changed, 99 insertions, 47 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index a2fceb7..62b44bd 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -34,7 +34,6 @@ using System.Reflection;
34using OpenMetaverse; 34using OpenMetaverse;
35using log4net; 35using log4net;
36using OpenSim.Framework; 36using OpenSim.Framework;
37using OpenSim.Framework.Communications.Cache;
38using OpenSim.Region.Framework.Interfaces; 37using OpenSim.Region.Framework.Interfaces;
39using OpenSim.Region.Framework.Scenes.Scripting; 38using OpenSim.Region.Framework.Scenes.Scripting;
40 39
@@ -213,7 +212,7 @@ namespace OpenSim.Region.Framework.Scenes
213 } 212 }
214 } 213 }
215 214
216 private ArrayList GetScriptErrors(UUID itemID) 215 public ArrayList GetScriptErrors(UUID itemID)
217 { 216 {
218 ArrayList ret = new ArrayList(); 217 ArrayList ret = new ArrayList();
219 218
@@ -296,38 +295,36 @@ namespace OpenSim.Region.Framework.Scenes
296 return; 295 return;
297 } 296 }
298 297
299 m_part.ParentGroup.Scene.AssetService.Get(item.AssetID.ToString(), this, delegate(string id, object sender, AssetBase asset) 298 AssetBase asset = m_part.ParentGroup.Scene.AssetService.Get(item.AssetID.ToString());
300 { 299 if (null == asset)
301 if (null == asset) 300 {
302 { 301 string msg = String.Format("asset ID {0} could not be found", item.AssetID);
303 string msg = String.Format("asset ID {0} could not be found", item.AssetID); 302 StoreScriptError(item.ItemID, msg);
304 StoreScriptError(item.ItemID, msg); 303 m_log.ErrorFormat(
305 m_log.ErrorFormat( 304 "[PRIM INVENTORY]: " +
306 "[PRIM INVENTORY]: " + 305 "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 {4}", 306 item.Name, item.ItemID, m_part.AbsolutePosition,
308 item.Name, item.ItemID, m_part.AbsolutePosition, 307 m_part.ParentGroup.Scene.RegionInfo.RegionName, item.AssetID);
309 m_part.ParentGroup.Scene.RegionInfo.RegionName, msg); 308 }
310 } 309 else
311 else 310 {
312 { 311 if (m_part.ParentGroup.m_savedScriptState != null)
313 if (m_part.ParentGroup.m_savedScriptState != null) 312 RestoreSavedScriptState(item.OldItemID, item.ItemID);
314 RestoreSavedScriptState(item.OldItemID, item.ItemID); 313
315 m_items.LockItemsForWrite(true); 314 m_items.LockItemsForWrite(true);
316 m_items[item.ItemID].PermsMask = 0; 315
317 m_items[item.ItemID].PermsGranter = UUID.Zero; 316 m_items[item.ItemID].PermsMask = 0;
318 m_items.LockItemsForWrite(false); 317 m_items[item.ItemID].PermsGranter = UUID.Zero;
319 string script = Utils.BytesToString(asset.Data); 318
320 m_part.ParentGroup.Scene.EventManager.TriggerRezScript( 319 m_items.LockItemsForWrite(false);
321 m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource); 320
322 StoreScriptErrors(item.ItemID, null); 321 string script = Utils.BytesToString(asset.Data);
323 m_part.ParentGroup.AddActiveScriptCount(1); 322 m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
324 m_part.ScheduleFullUpdate(); 323 m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource);
325 } 324 StoreScriptErrors(item.ItemID, null);
326 }); 325 m_part.ParentGroup.AddActiveScriptCount(1);
327 } 326 m_part.ScheduleFullUpdate();
328 else 327 }
329 {
330 StoreScriptError(item.ItemID, "scripts disabled");
331 } 328 }
332 } 329 }
333 330
@@ -654,6 +651,7 @@ namespace OpenSim.Region.Framework.Scenes
654 item.ParentID = m_part.UUID; 651 item.ParentID = m_part.UUID;
655 item.ParentPartID = m_part.UUID; 652 item.ParentPartID = m_part.UUID;
656 item.Name = name; 653 item.Name = name;
654 item.GroupID = m_part.GroupID;
657 655
658 m_items.LockItemsForWrite(true); 656 m_items.LockItemsForWrite(true);
659 m_items.Add(item.ItemID, item); 657 m_items.Add(item.ItemID, item);
@@ -716,15 +714,16 @@ namespace OpenSim.Region.Framework.Scenes
716 { 714 {
717 IList<TaskInventoryItem> items = new List<TaskInventoryItem>(); 715 IList<TaskInventoryItem> items = new List<TaskInventoryItem>();
718 716
719 lock (m_items) 717 m_items.LockItemsForRead(true);
718
719 foreach (TaskInventoryItem item in m_items.Values)
720 { 720 {
721 foreach (TaskInventoryItem item in m_items.Values) 721 if (item.Name == name)
722 { 722 items.Add(item);
723 if (item.Name == name)
724 items.Add(item);
725 }
726 } 723 }
727 724
725 m_items.LockItemsForRead(false);
726
728 return items; 727 return items;
729 } 728 }
730 729
@@ -736,6 +735,11 @@ namespace OpenSim.Region.Framework.Scenes
736 /// <returns>false if the item did not exist, true if the update occurred successfully</returns> 735 /// <returns>false if the item did not exist, true if the update occurred successfully</returns>
737 public bool UpdateInventoryItem(TaskInventoryItem item) 736 public bool UpdateInventoryItem(TaskInventoryItem item)
738 { 737 {
738 return UpdateInventoryItem(item, true);
739 }
740
741 public bool UpdateInventoryItem(TaskInventoryItem item, bool fireScriptEvents)
742 {
739 m_items.LockItemsForWrite(true); 743 m_items.LockItemsForWrite(true);
740 744
741 if (m_items.ContainsKey(item.ItemID)) 745 if (m_items.ContainsKey(item.ItemID))
@@ -743,6 +747,12 @@ namespace OpenSim.Region.Framework.Scenes
743 item.ParentID = m_part.UUID; 747 item.ParentID = m_part.UUID;
744 item.ParentPartID = m_part.UUID; 748 item.ParentPartID = m_part.UUID;
745 item.Flags = m_items[item.ItemID].Flags; 749 item.Flags = m_items[item.ItemID].Flags;
750
751 // If group permissions have been set on, check that the groupID is up to date in case it has
752 // changed since permissions were last set.
753 if (item.GroupPermissions != (uint)PermissionMask.None)
754 item.GroupID = m_part.GroupID;
755
746 if (item.AssetID == UUID.Zero) 756 if (item.AssetID == UUID.Zero)
747 { 757 {
748 item.AssetID = m_items[item.ItemID].AssetID; 758 item.AssetID = m_items[item.ItemID].AssetID;
@@ -760,8 +770,8 @@ namespace OpenSim.Region.Framework.Scenes
760 770
761 m_items[item.ItemID] = item; 771 m_items[item.ItemID] = item;
762 m_inventorySerial++; 772 m_inventorySerial++;
763 m_part.TriggerScriptChangedEvent(Changed.INVENTORY); 773 if (fireScriptEvents)
764 774 m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
765 HasInventoryChanged = true; 775 HasInventoryChanged = true;
766 m_part.ParentGroup.HasGroupChanged = true; 776 m_part.ParentGroup.HasGroupChanged = true;
767 m_items.LockItemsForWrite(false); 777 m_items.LockItemsForWrite(false);
@@ -896,6 +906,7 @@ namespace OpenSim.Region.Framework.Scenes
896 uint everyoneMask = 0; 906 uint everyoneMask = 0;
897 uint baseMask = item.BasePermissions; 907 uint baseMask = item.BasePermissions;
898 uint ownerMask = item.CurrentPermissions; 908 uint ownerMask = item.CurrentPermissions;
909 uint groupMask = item.GroupPermissions;
899 910
900 invString.AddItemStart(); 911 invString.AddItemStart();
901 invString.AddNameValueLine("item_id", item.ItemID.ToString()); 912 invString.AddNameValueLine("item_id", item.ItemID.ToString());
@@ -905,7 +916,7 @@ namespace OpenSim.Region.Framework.Scenes
905 916
906 invString.AddNameValueLine("base_mask", Utils.UIntToHexString(baseMask)); 917 invString.AddNameValueLine("base_mask", Utils.UIntToHexString(baseMask));
907 invString.AddNameValueLine("owner_mask", Utils.UIntToHexString(ownerMask)); 918 invString.AddNameValueLine("owner_mask", Utils.UIntToHexString(ownerMask));
908 invString.AddNameValueLine("group_mask", Utils.UIntToHexString(0)); 919 invString.AddNameValueLine("group_mask", Utils.UIntToHexString(groupMask));
909 invString.AddNameValueLine("everyone_mask", Utils.UIntToHexString(everyoneMask)); 920 invString.AddNameValueLine("everyone_mask", Utils.UIntToHexString(everyoneMask));
910 invString.AddNameValueLine("next_owner_mask", Utils.UIntToHexString(item.NextPermissions)); 921 invString.AddNameValueLine("next_owner_mask", Utils.UIntToHexString(item.NextPermissions));
911 922
@@ -1071,12 +1082,11 @@ namespace OpenSim.Region.Framework.Scenes
1071 item.CurrentPermissions &= ~(uint)PermissionMask.Modify; 1082 item.CurrentPermissions &= ~(uint)PermissionMask.Modify;
1072 item.CurrentPermissions |= 8; 1083 item.CurrentPermissions |= 8;
1073 } 1084 }
1085 item.OwnerChanged = true;
1074 item.CurrentPermissions &= item.NextPermissions; 1086 item.CurrentPermissions &= item.NextPermissions;
1075 item.BasePermissions &= item.NextPermissions; 1087 item.BasePermissions &= item.NextPermissions;
1076 item.EveryonePermissions &= item.NextPermissions; 1088 item.EveryonePermissions &= item.NextPermissions;
1077 } 1089 }
1078
1079 m_part.TriggerScriptChangedEvent(Changed.OWNER);
1080 } 1090 }
1081 1091
1082 public void ApplyGodPermissions(uint perms) 1092 public void ApplyGodPermissions(uint perms)
@@ -1112,6 +1122,11 @@ namespace OpenSim.Region.Framework.Scenes
1112 1122
1113 public Dictionary<UUID, string> GetScriptStates() 1123 public Dictionary<UUID, string> GetScriptStates()
1114 { 1124 {
1125 return GetScriptStates(false);
1126 }
1127
1128 public Dictionary<UUID, string> GetScriptStates(bool oldIDs)
1129 {
1115 IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces<IScriptModule>(); 1130 IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces<IScriptModule>();
1116 1131
1117 Dictionary<UUID, string> ret = new Dictionary<UUID, string>(); 1132 Dictionary<UUID, string> ret = new Dictionary<UUID, string>();
@@ -1129,8 +1144,16 @@ namespace OpenSim.Region.Framework.Scenes
1129 string n = e.GetXMLState(item.ItemID); 1144 string n = e.GetXMLState(item.ItemID);
1130 if (n != String.Empty) 1145 if (n != String.Empty)
1131 { 1146 {
1132 if (!ret.ContainsKey(item.ItemID)) 1147 if (oldIDs)
1133 ret[item.ItemID] = n; 1148 {
1149 if (!ret.ContainsKey(item.OldItemID))
1150 ret[item.OldItemID] = n;
1151 }
1152 else
1153 {
1154 if (!ret.ContainsKey(item.ItemID))
1155 ret[item.ItemID] = n;
1156 }
1134 break; 1157 break;
1135 } 1158 }
1136 } 1159 }
@@ -1139,5 +1162,34 @@ namespace OpenSim.Region.Framework.Scenes
1139 } 1162 }
1140 return ret; 1163 return ret;
1141 } 1164 }
1165
1166 public void ResumeScripts()
1167 {
1168 IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces<IScriptModule>();
1169 if (engines == null)
1170 return;
1171
1172
1173 Items.LockItemsForRead(true);
1174
1175 foreach (TaskInventoryItem item in m_items.Values)
1176 {
1177 if (item.InvType == (int)InventoryType.LSL)
1178 {
1179 foreach (IScriptModule engine in engines)
1180 {
1181 if (engine != null)
1182 {
1183 if (item.OwnerChanged)
1184 engine.PostScriptEvent(item.ItemID, "changed", new Object[] { (int)Changed.OWNER });
1185 item.OwnerChanged = false;
1186 engine.ResumeScript(item.ItemID);
1187 }
1188 }
1189 }
1190 }
1191
1192 Items.LockItemsForRead(false);
1193 }
1142 } 1194 }
1143} 1195}