From 2de3a1b9dad25855cb18a29f2c43ad67cfb0730c Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Wed, 25 Jan 2012 23:22:07 +0000
Subject: refactor: decompose most of RezScript() into
RezScriptFromAgentInventory(), RezNewScript() and rename one RezScript() to
RezScriptFromPrim()
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 174 +++++++++++----------
.../Shared/Api/Implementation/LSL_Api.cs | 3 +-
2 files changed, 97 insertions(+), 80 deletions(-)
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 2444367..f4f37ac 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1560,104 +1560,120 @@ namespace OpenSim.Region.Framework.Scenes
/// Rez a script into a prim's inventory, either ex nihilo or from an existing avatar inventory
///
///
- ///
+ ///
+ ///
///
public void RezScript(IClientAPI remoteClient, InventoryItemBase itemBase, UUID transactionID, uint localID)
{
- UUID itemID = itemBase.ID;
+ if (itemBase.ID != UUID.Zero)
+ RezScriptFromAgentInventory(remoteClient, itemBase.ID, localID);
+ else
+ RezNewScript(remoteClient, itemBase);
+ }
+
+ ///
+ /// Rez a script into a prim from an agent inventory.
+ ///
+ ///
+ ///
+ ///
+ public void RezScriptFromAgentInventory(IClientAPI remoteClient, UUID fromItemID, uint localID)
+ {
UUID copyID = UUID.Random();
+ InventoryItemBase item = new InventoryItemBase(fromItemID, remoteClient.AgentId);
+ item = InventoryService.GetItem(item);
- if (itemID != UUID.Zero) // transferred from an avatar inventory to the prim's inventory
+ // Try library
+ // XXX clumsy, possibly should be one call
+ if (null == item && LibraryService != null && LibraryService.LibraryRootFolder != null)
{
- InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
- item = InventoryService.GetItem(item);
-
- // Try library
- // XXX clumsy, possibly should be one call
- if (null == item && LibraryService != null && LibraryService.LibraryRootFolder != null)
- {
- item = LibraryService.LibraryRootFolder.FindItem(itemID);
- }
+ item = LibraryService.LibraryRootFolder.FindItem(fromItemID);
+ }
- if (item != null)
+ if (item != null)
+ {
+ SceneObjectPart part = GetSceneObjectPart(localID);
+ if (part != null)
{
- SceneObjectPart part = GetSceneObjectPart(localID);
- if (part != null)
- {
- if (!Permissions.CanEditObjectInventory(part.UUID, remoteClient.AgentId))
- return;
+ if (!Permissions.CanEditObjectInventory(part.UUID, remoteClient.AgentId))
+ return;
- part.ParentGroup.AddInventoryItem(remoteClient, localID, item, copyID);
- // TODO: switch to posting on_rez here when scripts
- // have state in inventory
- part.Inventory.CreateScriptInstance(copyID, 0, false, DefaultScriptEngine, 0);
+ part.ParentGroup.AddInventoryItem(remoteClient, localID, item, copyID);
+ // TODO: switch to posting on_rez here when scripts
+ // have state in inventory
+ part.Inventory.CreateScriptInstance(copyID, 0, false, DefaultScriptEngine, 0);
- // m_log.InfoFormat("[PRIMINVENTORY]: " +
- // "Rezzed script {0} into prim local ID {1} for user {2}",
- // item.inventoryName, localID, remoteClient.Name);
- part.SendPropertiesToClient(remoteClient);
- part.ParentGroup.ResumeScripts();
- }
- else
- {
- m_log.ErrorFormat(
- "[PRIM INVENTORY]: " +
- "Could not rez script {0} into prim local ID {1} for user {2}"
- + " because the prim could not be found in the region!",
- item.Name, localID, remoteClient.Name);
- }
+ // m_log.InfoFormat("[PRIMINVENTORY]: " +
+ // "Rezzed script {0} into prim local ID {1} for user {2}",
+ // item.inventoryName, localID, remoteClient.Name);
+ part.SendPropertiesToClient(remoteClient);
+ part.ParentGroup.ResumeScripts();
}
else
{
m_log.ErrorFormat(
- "[PRIM INVENTORY]: Could not find script inventory item {0} to rez for {1}!",
- itemID, remoteClient.Name);
+ "[PRIM INVENTORY]: " +
+ "Could not rez script {0} into prim local ID {1} for user {2}"
+ + " because the prim could not be found in the region!",
+ item.Name, localID, remoteClient.Name);
}
}
- else // script has been rezzed directly into a prim's inventory
+ else
{
- SceneObjectPart part = GetSceneObjectPart(itemBase.Folder);
- if (part == null)
- return;
+ m_log.ErrorFormat(
+ "[PRIM INVENTORY]: Could not find script inventory item {0} to rez for {1}!",
+ fromItemID, remoteClient.Name);
+ }
+ }
- if (!Permissions.CanCreateObjectInventory(
- itemBase.InvType, part.UUID, remoteClient.AgentId))
- return;
+ ///
+ /// Rez a new script from nothing.
+ ///
+ ///
+ ///
+ public void RezNewScript(IClientAPI remoteClient, InventoryItemBase itemBase)
+ {
+ SceneObjectPart part = GetSceneObjectPart(itemBase.Folder);
+ if (part == null)
+ return;
- AssetBase asset = CreateAsset(itemBase.Name, itemBase.Description, (sbyte)itemBase.AssetType,
- Encoding.ASCII.GetBytes("default\n{\n state_entry()\n {\n llSay(0, \"Script running\");\n }\n}"),
- remoteClient.AgentId);
- AssetService.Store(asset);
-
- TaskInventoryItem taskItem = new TaskInventoryItem();
-
- taskItem.ResetIDs(itemBase.Folder);
- taskItem.ParentID = itemBase.Folder;
- taskItem.CreationDate = (uint)itemBase.CreationDate;
- taskItem.Name = itemBase.Name;
- taskItem.Description = itemBase.Description;
- taskItem.Type = itemBase.AssetType;
- taskItem.InvType = itemBase.InvType;
- taskItem.OwnerID = itemBase.Owner;
- taskItem.CreatorID = itemBase.CreatorIdAsUuid;
- taskItem.BasePermissions = itemBase.BasePermissions;
- taskItem.CurrentPermissions = itemBase.CurrentPermissions;
- taskItem.EveryonePermissions = itemBase.EveryOnePermissions;
- taskItem.GroupPermissions = itemBase.GroupPermissions;
- taskItem.NextPermissions = itemBase.NextPermissions;
- taskItem.GroupID = itemBase.GroupID;
- taskItem.GroupPermissions = 0;
- taskItem.Flags = itemBase.Flags;
- taskItem.PermsGranter = UUID.Zero;
- taskItem.PermsMask = 0;
- taskItem.AssetID = asset.FullID;
-
- part.Inventory.AddInventoryItem(taskItem, false);
- part.SendPropertiesToClient(remoteClient);
+ if (!Permissions.CanCreateObjectInventory(
+ itemBase.InvType, part.UUID, remoteClient.AgentId))
+ return;
- part.Inventory.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0);
- part.ParentGroup.ResumeScripts();
- }
+ AssetBase asset = CreateAsset(itemBase.Name, itemBase.Description, (sbyte)itemBase.AssetType,
+ Encoding.ASCII.GetBytes("default\n{\n state_entry()\n {\n llSay(0, \"Script running\");\n }\n}"),
+ remoteClient.AgentId);
+ AssetService.Store(asset);
+
+ TaskInventoryItem taskItem = new TaskInventoryItem();
+
+ taskItem.ResetIDs(itemBase.Folder);
+ taskItem.ParentID = itemBase.Folder;
+ taskItem.CreationDate = (uint)itemBase.CreationDate;
+ taskItem.Name = itemBase.Name;
+ taskItem.Description = itemBase.Description;
+ taskItem.Type = itemBase.AssetType;
+ taskItem.InvType = itemBase.InvType;
+ taskItem.OwnerID = itemBase.Owner;
+ taskItem.CreatorID = itemBase.CreatorIdAsUuid;
+ taskItem.BasePermissions = itemBase.BasePermissions;
+ taskItem.CurrentPermissions = itemBase.CurrentPermissions;
+ taskItem.EveryonePermissions = itemBase.EveryOnePermissions;
+ taskItem.GroupPermissions = itemBase.GroupPermissions;
+ taskItem.NextPermissions = itemBase.NextPermissions;
+ taskItem.GroupID = itemBase.GroupID;
+ taskItem.GroupPermissions = 0;
+ taskItem.Flags = itemBase.Flags;
+ taskItem.PermsGranter = UUID.Zero;
+ taskItem.PermsMask = 0;
+ taskItem.AssetID = asset.FullID;
+
+ part.Inventory.AddInventoryItem(taskItem, false);
+ part.SendPropertiesToClient(remoteClient);
+
+ part.Inventory.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0);
+ part.ParentGroup.ResumeScripts();
}
///
@@ -1666,7 +1682,7 @@ namespace OpenSim.Region.Framework.Scenes
///
///
///
- public void RezScript(UUID srcId, SceneObjectPart srcPart, UUID destId, int pin, int running, int start_param)
+ public void RezScriptFromPrim(UUID srcId, SceneObjectPart srcPart, UUID destId, int pin, int running, int start_param)
{
TaskInventoryItem srcTaskItem = srcPart.Inventory.GetInventoryItem(srcId);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 330c65d..6fa812d 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -6603,7 +6603,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
// the rest of the permission checks are done in RezScript, so check the pin there as well
- World.RezScript(srcId, m_host, destId, pin, running, start_param);
+ World.RezScriptFromPrim(srcId, m_host, destId, pin, running, start_param);
+
// this will cause the delay even if the script pin or permissions were wrong - seems ok
ScriptSleep(3000);
}
--
cgit v1.1