Add plumbing for the SceneObjectDeleter to wait for the script engine to

allow final deletion of objects. Meant to support the attach(NULL_KEY) event,
arthursv
Melanie 2009-08-04 03:17:13 +01:00
parent 679cce6178
commit 17bdc45c5c
10 changed files with 72 additions and 3 deletions

View File

@ -197,5 +197,7 @@ namespace OpenSim.Region.Framework.Interfaces
/// A <see cref="Dictionary`2"/> /// A <see cref="Dictionary`2"/>
/// </returns> /// </returns>
Dictionary<UUID, string> GetScriptStates(); Dictionary<UUID, string> GetScriptStates();
bool CanBeDeleted();
} }
} }

View File

@ -36,6 +36,7 @@ namespace OpenSim.Region.Framework.Interfaces
string GetAssemblyName(UUID itemID); string GetAssemblyName(UUID itemID);
string GetXMLState(UUID itemID); string GetXMLState(UUID itemID);
bool CanBeDeleted(UUID itemID);
bool PostScriptEvent(UUID itemID, string name, Object[] args); bool PostScriptEvent(UUID itemID, string name, Object[] args);
bool PostObjectEvent(UUID itemID, string name, Object[] args); bool PostObjectEvent(UUID itemID, string name, Object[] args);

View File

@ -109,7 +109,7 @@ namespace OpenSim.Region.Framework.Scenes
while (InventoryDeQueueAndDelete()) while (InventoryDeQueueAndDelete())
{ {
m_log.Debug("[SCENE]: Sent item successfully to inventory, continuing..."); //m_log.Debug("[SCENE]: Sent item successfully to inventory, continuing...");
} }
} }
@ -128,11 +128,16 @@ namespace OpenSim.Region.Framework.Scenes
int left = m_inventoryDeletes.Count; int left = m_inventoryDeletes.Count;
if (left > 0) if (left > 0)
{ {
x = m_inventoryDeletes.Dequeue();
if (!x.objectGroup.CanBeDeleted())
{
m_inventoryDeletes.Enqueue(x);
return true;
}
m_log.DebugFormat( m_log.DebugFormat(
"[SCENE]: Sending object to user's inventory, {0} item(s) remaining.", left); "[SCENE]: Sending object to user's inventory, {0} item(s) remaining.", left);
x = m_inventoryDeletes.Dequeue();
try try
{ {
m_scene.DeleteToInventory(x.action, x.folderID, x.objectGroup, x.remoteClient); m_scene.DeleteToInventory(x.action, x.folderID, x.objectGroup, x.remoteClient);

View File

@ -3383,5 +3383,16 @@ namespace OpenSim.Region.Framework.Scenes
SetFromAssetID(uuid); SetFromAssetID(uuid);
} }
#endregion #endregion
public bool CanBeDeleted()
{
foreach (SceneObjectPart part in Children.Values)
{
if (!part.CanBeDeleted())
return false;
}
return true;
}
} }
} }

View File

@ -3787,5 +3787,10 @@ if (m_shape != null) {
Inventory.ApplyNextOwnerPermissions(); Inventory.ApplyNextOwnerPermissions();
} }
public bool CanBeDeleted()
{
return Inventory.CanBeDeleted();
}
} }
} }

View File

@ -910,5 +910,30 @@ namespace OpenSim.Region.Framework.Scenes
} }
return ret; return ret;
} }
public bool CanBeDeleted()
{
if (!ContainsScripts())
return true;
IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces<IScriptModule>();
if (engines == null) // No engine at all
return true;
foreach (TaskInventoryItem item in m_items.Values)
{
if (item.InvType == (int)InventoryType.LSL)
{
foreach (IScriptModule e in engines)
{
if(!e.CanBeDeleted(item.ItemID))
return false;
}
}
}
return true;
}
} }
} }

View File

@ -476,5 +476,10 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
{ {
return ""; return "";
} }
public bool CanBeDeleted(UUID itemID)
{
return true;
}
} }
} }

View File

@ -95,6 +95,7 @@ namespace OpenSim.Region.ScriptEngine.Interfaces
UUID GetDetectID(int idx); UUID GetDetectID(int idx);
void SaveState(string assembly); void SaveState(string assembly);
void DestroyScriptInstance(); void DestroyScriptInstance();
bool CanBeDeleted();
IScriptApi GetApi(string name); IScriptApi GetApi(string name);

View File

@ -991,5 +991,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
{ {
get { return m_RegionID; } get { return m_RegionID; }
} }
public bool CanBeDeleted()
{
return true;
}
} }
} }

View File

@ -1241,5 +1241,14 @@ namespace OpenSim.Region.ScriptEngine.XEngine
return ""; return "";
return instance.GetXMLState(); return instance.GetXMLState();
} }
public bool CanBeDeleted(UUID itemID)
{
IScriptInstance instance = GetInstance(itemID);
if (instance == null)
return true;
return instance.CanBeDeleted();
}
} }
} }