From 7b5e42c744ceeee739f1fbdb2c96552dfd4add52 Mon Sep 17 00:00:00 2001 From: PixelTomsen Date: Fri, 24 Feb 2012 20:46:14 +0100 Subject: llGetLinkMedia, llSetLinkMedia, llClearLinkMedia implementation mantis: http://opensimulator.org/mantis/view.php?id=5756 http://opensimulator.org/mantis/view.php?id=5755 http://opensimulator.org/mantis/view.php?id=5754 --- .../Shared/Api/Implementation/LSL_Api.cs | 106 ++++++++++++++++----- 1 file changed, 83 insertions(+), 23 deletions(-) (limited to 'OpenSim/Region/ScriptEngine/Shared/Api/Implementation') diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 2eba2b1..525c3c3 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -8173,23 +8173,40 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); ScriptSleep(1000); + return GetPrimMediaParams(m_host, face, rules); + } + + public LSL_List llGetLinkMedia(LSL_Integer link, LSL_Integer face, LSL_List rules) + { + m_host.AddScriptLPS(1); + ScriptSleep(1000); + if (link == ScriptBaseClass.LINK_ROOT) + return GetPrimMediaParams(m_host.ParentGroup.RootPart, face, rules); + else if (link == ScriptBaseClass.LINK_THIS) + return GetPrimMediaParams(m_host, face, rules); + else + { + SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(link); + if (null != part) + return GetPrimMediaParams(part, face, rules); + } + + return new LSL_List(); + } + private LSL_List GetPrimMediaParams(SceneObjectPart part, int face, LSL_List rules) + { // LSL Spec http://wiki.secondlife.com/wiki/LlGetPrimMediaParams says to fail silently if face is invalid // TODO: Need to correctly handle case where a face has no media (which gives back an empty list). // Assuming silently fail means give back an empty list. Ideally, need to check this. - if (face < 0 || face > m_host.GetNumberOfSides() - 1) + if (face < 0 || face > part.GetNumberOfSides() - 1) return new LSL_List(); - return GetPrimMediaParams(face, rules); - } - - private LSL_List GetPrimMediaParams(int face, LSL_List rules) - { IMoapModule module = m_ScriptEngine.World.RequestModuleInterface(); if (null == module) - throw new Exception("Media on a prim functions not available"); + return new LSL_List(); - MediaEntry me = module.GetMediaEntry(m_host, face); + MediaEntry me = module.GetMediaEntry(part, face); // As per http://wiki.secondlife.com/wiki/LlGetPrimMediaParams if (null == me) @@ -8271,33 +8288,52 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api case ScriptBaseClass.PRIM_MEDIA_PERMS_CONTROL: res.Add(new LSL_Integer((int)me.ControlPermissions)); break; + + default: return ScriptBaseClass.LSL_STATUS_MALFORMED_PARAMS; } } return res; } - public LSL_Integer llSetPrimMediaParams(int face, LSL_List rules) + public LSL_Integer llSetPrimMediaParams(LSL_Integer face, LSL_List rules) { m_host.AddScriptLPS(1); ScriptSleep(1000); + return SetPrimMediaParams(m_host, face, rules); + } - // LSL Spec http://wiki.secondlife.com/wiki/LlSetPrimMediaParams says to fail silently if face is invalid - // Assuming silently fail means sending back LSL_STATUS_OK. Ideally, need to check this. - // Don't perform the media check directly - if (face < 0 || face > m_host.GetNumberOfSides() - 1) - return ScriptBaseClass.LSL_STATUS_OK; + public LSL_Integer llSetLinkMedia(LSL_Integer link, LSL_Integer face, LSL_List rules) + { + m_host.AddScriptLPS(1); + ScriptSleep(1000); + if (link == ScriptBaseClass.LINK_ROOT) + return SetPrimMediaParams(m_host.ParentGroup.RootPart, face, rules); + else if (link == ScriptBaseClass.LINK_THIS) + return SetPrimMediaParams(m_host, face, rules); + else + { + SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(link); + if (null != part) + return SetPrimMediaParams(part, face, rules); + } - return SetPrimMediaParams(face, rules); + return ScriptBaseClass.LSL_STATUS_NOT_FOUND; } - private LSL_Integer SetPrimMediaParams(int face, LSL_List rules) + private LSL_Integer SetPrimMediaParams(SceneObjectPart part, LSL_Integer face, LSL_List rules) { + // LSL Spec http://wiki.secondlife.com/wiki/LlSetPrimMediaParams says to fail silently if face is invalid + // Assuming silently fail means sending back LSL_STATUS_OK. Ideally, need to check this. + // Don't perform the media check directly + if (face < 0 || face > part.GetNumberOfSides() - 1) + return ScriptBaseClass.LSL_STATUS_NOT_FOUND; + IMoapModule module = m_ScriptEngine.World.RequestModuleInterface(); if (null == module) - throw new Exception("Media on a prim functions not available"); + return ScriptBaseClass.LSL_STATUS_NOT_SUPPORTED; - MediaEntry me = module.GetMediaEntry(m_host, face); + MediaEntry me = module.GetMediaEntry(part, face); if (null == me) me = new MediaEntry(); @@ -8376,10 +8412,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api case ScriptBaseClass.PRIM_MEDIA_PERMS_CONTROL: me.ControlPermissions = (MediaPermission)(byte)(int)rules.GetLSLIntegerItem(i++); break; + + default: return ScriptBaseClass.LSL_STATUS_MALFORMED_PARAMS; } } - module.SetMediaEntry(m_host, face, me); + module.SetMediaEntry(part, face, me); return ScriptBaseClass.LSL_STATUS_OK; } @@ -8388,18 +8426,40 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); ScriptSleep(1000); + return ClearPrimMedia(m_host, face); + } + public LSL_Integer llClearLinkMedia(LSL_Integer link, LSL_Integer face) + { + m_host.AddScriptLPS(1); + ScriptSleep(1000); + if (link == ScriptBaseClass.LINK_ROOT) + return ClearPrimMedia(m_host.ParentGroup.RootPart, face); + else if (link == ScriptBaseClass.LINK_THIS) + return ClearPrimMedia(m_host, face); + else + { + SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(link); + if (null != part) + return ClearPrimMedia(part, face); + } + + return ScriptBaseClass.LSL_STATUS_NOT_FOUND; + } + + private LSL_Integer ClearPrimMedia(SceneObjectPart part, LSL_Integer face) + { // LSL Spec http://wiki.secondlife.com/wiki/LlClearPrimMedia says to fail silently if face is invalid // Assuming silently fail means sending back LSL_STATUS_OK. Ideally, need to check this. // FIXME: Don't perform the media check directly - if (face < 0 || face > m_host.GetNumberOfSides() - 1) - return ScriptBaseClass.LSL_STATUS_OK; + if (face < 0 || face > part.GetNumberOfSides() - 1) + return ScriptBaseClass.LSL_STATUS_NOT_FOUND; IMoapModule module = m_ScriptEngine.World.RequestModuleInterface(); if (null == module) - throw new Exception("Media on a prim functions not available"); + return ScriptBaseClass.LSL_STATUS_NOT_SUPPORTED; - module.ClearMediaEntry(m_host, face); + module.ClearMediaEntry(part, face); return ScriptBaseClass.LSL_STATUS_OK; } -- cgit v1.1