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.cs302
1 files changed, 178 insertions, 124 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 959046a..14ef0fb 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -176,16 +176,14 @@ namespace OpenSim.Region.Framework.Scenes
176 /// <param name="ownerId"></param> 176 /// <param name="ownerId"></param>
177 public void ChangeInventoryOwner(UUID ownerId) 177 public void ChangeInventoryOwner(UUID ownerId)
178 { 178 {
179 m_items.LockItemsForWrite(true); 179 List<TaskInventoryItem> items = GetInventoryItems();
180 if (0 == Items.Count) 180
181 { 181 if (items.Count == 0)
182 m_items.LockItemsForWrite(false);
183 return; 182 return;
184 }
185 183
184 m_items.LockItemsForWrite(true);
186 HasInventoryChanged = true; 185 HasInventoryChanged = true;
187 m_part.ParentGroup.HasGroupChanged = true; 186 m_part.ParentGroup.HasGroupChanged = true;
188 List<TaskInventoryItem> items = GetInventoryItems();
189 foreach (TaskInventoryItem item in items) 187 foreach (TaskInventoryItem item in items)
190 { 188 {
191 if (ownerId != item.OwnerID) 189 if (ownerId != item.OwnerID)
@@ -262,19 +260,16 @@ namespace OpenSim.Region.Framework.Scenes
262 Items.LockItemsForRead(false); 260 Items.LockItemsForRead(false);
263 } 261 }
264 262
265 /// <summary> 263 public int CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource)
266 /// Start all the scripts contained in this prim's inventory
267 /// </summary>
268 public void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource)
269 { 264 {
270 Items.LockItemsForRead(true); 265 int scriptsValidForStarting = 0;
271 IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); 266
272 Items.LockItemsForRead(false); 267 List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL);
273 foreach (TaskInventoryItem item in items) 268 foreach (TaskInventoryItem item in scripts)
274 { 269 if (CreateScriptInstance(item, startParam, postOnRez, engine, stateSource))
275 if ((int)InventoryType.LSL == item.InvType) 270 scriptsValidForStarting++;
276 CreateScriptInstance(item, startParam, postOnRez, engine, stateSource); 271
277 } 272 return scriptsValidForStarting;
278 } 273 }
279 274
280 public ArrayList GetScriptErrors(UUID itemID) 275 public ArrayList GetScriptErrors(UUID itemID)
@@ -305,17 +300,11 @@ namespace OpenSim.Region.Framework.Scenes
305 /// </param> 300 /// </param>
306 public void RemoveScriptInstances(bool sceneObjectBeingDeleted) 301 public void RemoveScriptInstances(bool sceneObjectBeingDeleted)
307 { 302 {
308 Items.LockItemsForRead(true); 303 List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL);
309 IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); 304 foreach (TaskInventoryItem item in scripts)
310 Items.LockItemsForRead(false);
311
312 foreach (TaskInventoryItem item in items)
313 { 305 {
314 if ((int)InventoryType.LSL == item.InvType) 306 RemoveScriptInstance(item.ItemID, sceneObjectBeingDeleted);
315 { 307 m_part.RemoveScriptEvents(item.ItemID);
316 RemoveScriptInstance(item.ItemID, sceneObjectBeingDeleted);
317 m_part.RemoveScriptEvents(item.ItemID);
318 }
319 } 308 }
320 } 309 }
321 310
@@ -323,8 +312,8 @@ namespace OpenSim.Region.Framework.Scenes
323 /// Start a script which is in this prim's inventory. 312 /// Start a script which is in this prim's inventory.
324 /// </summary> 313 /// </summary>
325 /// <param name="item"></param> 314 /// <param name="item"></param>
326 /// <returns></returns> 315 /// <returns>true if the script instance was created, false otherwise</returns>
327 public void CreateScriptInstance(TaskInventoryItem item, int startParam, bool postOnRez, string engine, int stateSource) 316 public bool CreateScriptInstance(TaskInventoryItem item, int startParam, bool postOnRez, string engine, int stateSource)
328 { 317 {
329// m_log.DebugFormat("[PRIM INVENTORY]: Starting script {0} {1} in prim {2} {3} in {4}", 318// m_log.DebugFormat("[PRIM INVENTORY]: Starting script {0} {1} in prim {2} {3} in {4}",
330// item.Name, item.ItemID, m_part.Name, m_part.UUID, m_part.ParentGroup.Scene.RegionInfo.RegionName); 319// item.Name, item.ItemID, m_part.Name, m_part.UUID, m_part.ParentGroup.Scene.RegionInfo.RegionName);
@@ -332,61 +321,70 @@ namespace OpenSim.Region.Framework.Scenes
332 if (!m_part.ParentGroup.Scene.Permissions.CanRunScript(item.ItemID, m_part.UUID, item.OwnerID)) 321 if (!m_part.ParentGroup.Scene.Permissions.CanRunScript(item.ItemID, m_part.UUID, item.OwnerID))
333 { 322 {
334 StoreScriptError(item.ItemID, "no permission"); 323 StoreScriptError(item.ItemID, "no permission");
335 return; 324 return false;
336 } 325 }
337 326
338 m_part.AddFlag(PrimFlags.Scripted); 327 m_part.AddFlag(PrimFlags.Scripted);
339 328
340 if (!m_part.ParentGroup.Scene.RegionInfo.RegionSettings.DisableScripts) 329 if (m_part.ParentGroup.Scene.RegionInfo.RegionSettings.DisableScripts)
330 return false;
331
332 if (stateSource == 2 && // Prim crossing
333 m_part.ParentGroup.Scene.m_trustBinaries)
341 { 334 {
342 if (stateSource == 2 && // Prim crossing 335 m_items.LockItemsForWrite(true);
343 m_part.ParentGroup.Scene.m_trustBinaries) 336 m_items[item.ItemID].PermsMask = 0;
344 { 337 m_items[item.ItemID].PermsGranter = UUID.Zero;
345 m_items.LockItemsForWrite(true); 338 m_items.LockItemsForWrite(false);
346 m_items[item.ItemID].PermsMask = 0; 339 m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
347 m_items[item.ItemID].PermsGranter = UUID.Zero; 340 m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource);
348 m_items.LockItemsForWrite(false); 341 StoreScriptErrors(item.ItemID, null);
349 m_part.ParentGroup.Scene.EventManager.TriggerRezScript( 342 m_part.ParentGroup.AddActiveScriptCount(1);
350 m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource); 343 m_part.ScheduleFullUpdate();
351 StoreScriptErrors(item.ItemID, null); 344 return true;
352 m_part.ParentGroup.AddActiveScriptCount(1); 345 }
353 m_part.ScheduleFullUpdate();
354 return;
355 }
356 346
357 AssetBase asset = m_part.ParentGroup.Scene.AssetService.Get(item.AssetID.ToString()); 347 AssetBase asset = m_part.ParentGroup.Scene.AssetService.Get(item.AssetID.ToString());
358 if (null == asset) 348 if (null == asset)
359 { 349 {
360 string msg = String.Format("asset ID {0} could not be found", item.AssetID); 350 m_log.ErrorFormat(
361 StoreScriptError(item.ItemID, msg); 351 "[PRIM INVENTORY]: Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found",
362 m_log.ErrorFormat( 352 item.Name, item.ItemID, m_part.AbsolutePosition,
353 m_part.ParentGroup.Scene.RegionInfo.RegionName, item.AssetID);
354
355 return false;
356 }
357 else
358 {
359 if (m_part.ParentGroup.m_savedScriptState != null)
360 item.OldItemID = RestoreSavedScriptState(item.LoadedItemID, item.OldItemID, item.ItemID);
361
362 string msg = String.Format("asset ID {0} could not be found", item.AssetID);
363 StoreScriptError(item.ItemID, msg);
364 m_log.ErrorFormat(
363 "[PRIM INVENTORY]: Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found", 365 "[PRIM INVENTORY]: Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found",
364 item.Name, item.ItemID, m_part.AbsolutePosition, 366 item.Name, item.ItemID, m_part.AbsolutePosition,
365 m_part.ParentGroup.Scene.RegionInfo.RegionName, item.AssetID); 367 m_part.ParentGroup.Scene.RegionInfo.RegionName, item.AssetID);
366 }
367 else
368 {
369 if (m_part.ParentGroup.m_savedScriptState != null)
370 item.OldItemID = RestoreSavedScriptState(item.LoadedItemID, item.OldItemID, item.ItemID);
371 368
372 m_items.LockItemsForWrite(true); 369 m_items.LockItemsForWrite(true);
373 370
374 m_items[item.ItemID].OldItemID = item.OldItemID; 371 m_items[item.ItemID].OldItemID = item.OldItemID;
375 m_items[item.ItemID].PermsMask = 0; 372 m_items[item.ItemID].PermsMask = 0;
376 m_items[item.ItemID].PermsGranter = UUID.Zero; 373 m_items[item.ItemID].PermsGranter = UUID.Zero;
377 374
378 m_items.LockItemsForWrite(false); 375 m_items.LockItemsForWrite(false);
379 376
380 string script = Utils.BytesToString(asset.Data); 377 string script = Utils.BytesToString(asset.Data);
381 m_part.ParentGroup.Scene.EventManager.TriggerRezScript( 378 m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
382 m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource); 379 m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource);
383 StoreScriptErrors(item.ItemID, null); 380 StoreScriptErrors(item.ItemID, null);
384 if (!item.ScriptRunning) 381 if (!item.ScriptRunning)
385 m_part.ParentGroup.Scene.EventManager.TriggerStopScript( 382 m_part.ParentGroup.Scene.EventManager.TriggerStopScript(
386 m_part.LocalId, item.ItemID); 383 m_part.LocalId, item.ItemID);
387 m_part.ParentGroup.AddActiveScriptCount(1); 384 m_part.ParentGroup.AddActiveScriptCount(1);
388 m_part.ScheduleFullUpdate(); 385 m_part.ScheduleFullUpdate();
389 } 386
387 return true;
390 } 388 }
391 } 389 }
392 390
@@ -459,7 +457,7 @@ namespace OpenSim.Region.Framework.Scenes
459 /// <param name="itemId"> 457 /// <param name="itemId">
460 /// A <see cref="UUID"/> 458 /// A <see cref="UUID"/>
461 /// </param> 459 /// </param>
462 public void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource) 460 public bool CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource)
463 { 461 {
464 lock (m_scriptErrors) 462 lock (m_scriptErrors)
465 { 463 {
@@ -467,6 +465,7 @@ namespace OpenSim.Region.Framework.Scenes
467 m_scriptErrors.Remove(itemId); 465 m_scriptErrors.Remove(itemId);
468 } 466 }
469 CreateScriptInstanceInternal(itemId, startParam, postOnRez, engine, stateSource); 467 CreateScriptInstanceInternal(itemId, startParam, postOnRez, engine, stateSource);
468 return true;
470 } 469 }
471 470
472 private void CreateScriptInstanceInternal(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource) 471 private void CreateScriptInstanceInternal(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource)
@@ -770,14 +769,22 @@ namespace OpenSim.Region.Framework.Scenes
770 return item; 769 return item;
771 } 770 }
772 771
773 /// <summary> 772 public TaskInventoryItem GetInventoryItem(string name)
774 /// Get inventory items by name. 773 {
775 /// </summary> 774 m_items.LockItemsForRead(true);
776 /// <param name="name"></param> 775 foreach (TaskInventoryItem item in m_items.Values)
777 /// <returns> 776 {
778 /// A list of inventory items with that name. 777 if (item.Name == name)
779 /// If no inventory item has that name then an empty list is returned. 778 {
780 /// </returns> 779 m_items.LockItemsForRead(false);
780 return item;
781 }
782 }
783 m_items.LockItemsForRead(false);
784
785 return null;
786 }
787
781 public List<TaskInventoryItem> GetInventoryItems(string name) 788 public List<TaskInventoryItem> GetInventoryItems(string name)
782 { 789 {
783 List<TaskInventoryItem> items = new List<TaskInventoryItem>(); 790 List<TaskInventoryItem> items = new List<TaskInventoryItem>();
@@ -1247,10 +1254,10 @@ namespace OpenSim.Region.Framework.Scenes
1247 if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0) 1254 if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0)
1248 item.CurrentPermissions &= ~(uint)PermissionMask.Modify; 1255 item.CurrentPermissions &= ~(uint)PermissionMask.Modify;
1249 } 1256 }
1250 item.OwnerChanged = true;
1251 item.CurrentPermissions &= item.NextPermissions; 1257 item.CurrentPermissions &= item.NextPermissions;
1252 item.BasePermissions &= item.NextPermissions; 1258 item.BasePermissions &= item.NextPermissions;
1253 item.EveryonePermissions &= item.NextPermissions; 1259 item.EveryonePermissions &= item.NextPermissions;
1260 item.OwnerChanged = true;
1254 item.PermsMask = 0; 1261 item.PermsMask = 0;
1255 item.PermsGranter = UUID.Zero; 1262 item.PermsGranter = UUID.Zero;
1256 } 1263 }
@@ -1281,9 +1288,57 @@ namespace OpenSim.Region.Framework.Scenes
1281 return true; 1288 return true;
1282 } 1289 }
1283 } 1290 }
1291
1284 return false; 1292 return false;
1285 } 1293 }
1286 1294
1295 /// <summary>
1296 /// Returns the count of scripts in this parts inventory.
1297 /// </summary>
1298 /// <returns></returns>
1299 public int ScriptCount()
1300 {
1301 int count = 0;
1302 Items.LockItemsForRead(true);
1303 foreach (TaskInventoryItem item in m_items.Values)
1304 {
1305 if (item.InvType == (int)InventoryType.LSL)
1306 {
1307 count++;
1308 }
1309 }
1310 Items.LockItemsForRead(false);
1311 return count;
1312 }
1313 /// <summary>
1314 /// Returns the count of running scripts in this parts inventory.
1315 /// </summary>
1316 /// <returns></returns>
1317 public int RunningScriptCount()
1318 {
1319 IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces<IScriptModule>();
1320 if (engines.Length == 0)
1321 return 0;
1322
1323 int count = 0;
1324 List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL);
1325
1326 foreach (TaskInventoryItem item in scripts)
1327 {
1328 foreach (IScriptModule engine in engines)
1329 {
1330 if (engine != null)
1331 {
1332 if (engine.GetScriptState(item.ItemID))
1333 {
1334 count++;
1335 }
1336 }
1337 }
1338 }
1339 return count;
1340 }
1341
1287 public List<UUID> GetInventoryList() 1342 public List<UUID> GetInventoryList()
1288 { 1343 {
1289 List<UUID> ret = new List<UUID>(); 1344 List<UUID> ret = new List<UUID>();
@@ -1298,22 +1353,24 @@ namespace OpenSim.Region.Framework.Scenes
1298 { 1353 {
1299 List<TaskInventoryItem> ret = new List<TaskInventoryItem>(); 1354 List<TaskInventoryItem> ret = new List<TaskInventoryItem>();
1300 1355
1301 lock (m_items) 1356 Items.LockItemsForRead(true);
1302 ret = new List<TaskInventoryItem>(m_items.Values); 1357 ret = new List<TaskInventoryItem>(m_items.Values);
1358 Items.LockItemsForRead(false);
1303 1359
1304 return ret; 1360 return ret;
1305 } 1361 }
1306 1362
1307 public List<TaskInventoryItem> GetInventoryScripts() 1363 public List<TaskInventoryItem> GetInventoryItems(InventoryType type)
1308 { 1364 {
1309 List<TaskInventoryItem> ret = new List<TaskInventoryItem>(); 1365 List<TaskInventoryItem> ret = new List<TaskInventoryItem>();
1310 1366
1311 lock (m_items) 1367 Items.LockItemsForRead(true);
1312 { 1368
1313 foreach (TaskInventoryItem item in m_items.Values) 1369 foreach (TaskInventoryItem item in m_items.Values)
1314 if (item.InvType == (int)InventoryType.LSL) 1370 if (item.InvType == (int)type)
1315 ret.Add(item); 1371 ret.Add(item);
1316 } 1372
1373 Items.LockItemsForRead(false);
1317 1374
1318 return ret; 1375 return ret;
1319 } 1376 }
@@ -1335,35 +1392,32 @@ namespace OpenSim.Region.Framework.Scenes
1335 if (engines.Length == 0) // No engine at all 1392 if (engines.Length == 0) // No engine at all
1336 return ret; 1393 return ret;
1337 1394
1338 Items.LockItemsForRead(true); 1395 List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL);
1339 foreach (TaskInventoryItem item in m_items.Values) 1396
1397 foreach (TaskInventoryItem item in scripts)
1340 { 1398 {
1341 if (item.InvType == (int)InventoryType.LSL) 1399 foreach (IScriptModule e in engines)
1342 { 1400 {
1343 foreach (IScriptModule e in engines) 1401 if (e != null)
1344 { 1402 {
1345 if (e != null) 1403 string n = e.GetXMLState(item.ItemID);
1404 if (n != String.Empty)
1346 { 1405 {
1347 string n = e.GetXMLState(item.ItemID); 1406 if (oldIDs)
1348 if (n != String.Empty)
1349 { 1407 {
1350 if (oldIDs) 1408 if (!ret.ContainsKey(item.OldItemID))
1351 { 1409 ret[item.OldItemID] = n;
1352 if (!ret.ContainsKey(item.OldItemID))
1353 ret[item.OldItemID] = n;
1354 }
1355 else
1356 {
1357 if (!ret.ContainsKey(item.ItemID))
1358 ret[item.ItemID] = n;
1359 }
1360 break;
1361 } 1410 }
1411 else
1412 {
1413 if (!ret.ContainsKey(item.ItemID))
1414 ret[item.ItemID] = n;
1415 }
1416 break;
1362 } 1417 }
1363 } 1418 }
1364 } 1419 }
1365 } 1420 }
1366 Items.LockItemsForRead(false);
1367 return ret; 1421 return ret;
1368 } 1422 }
1369 1423
@@ -1373,27 +1427,27 @@ namespace OpenSim.Region.Framework.Scenes
1373 if (engines.Length == 0) 1427 if (engines.Length == 0)
1374 return; 1428 return;
1375 1429
1430 List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL);
1376 1431
1377 Items.LockItemsForRead(true); 1432 foreach (TaskInventoryItem item in scripts)
1378
1379 foreach (TaskInventoryItem item in m_items.Values)
1380 { 1433 {
1381 if (item.InvType == (int)InventoryType.LSL) 1434 foreach (IScriptModule engine in engines)
1382 { 1435 {
1383 foreach (IScriptModule engine in engines) 1436 if (engine != null)
1384 { 1437 {
1385 if (engine != null) 1438// m_log.DebugFormat(
1386 { 1439// "[PRIM INVENTORY]: Resuming script {0} {1} for {2}, OwnerChanged {3}",
1387 if (item.OwnerChanged) 1440// item.Name, item.ItemID, item.OwnerID, item.OwnerChanged);
1388 engine.PostScriptEvent(item.ItemID, "changed", new Object[] { (int)Changed.OWNER }); 1441
1389 item.OwnerChanged = false; 1442 engine.ResumeScript(item.ItemID);
1390 engine.ResumeScript(item.ItemID); 1443
1391 } 1444 if (item.OwnerChanged)
1445 engine.PostScriptEvent(item.ItemID, "changed", new Object[] { (int)Changed.OWNER });
1446
1447 item.OwnerChanged = false;
1392 } 1448 }
1393 } 1449 }
1394 } 1450 }
1395
1396 Items.LockItemsForRead(false);
1397 } 1451 }
1398 } 1452 }
1399} 1453}