From acac47830e3d7d9103c30729ad0cff50b0e8fcdc Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 1 Jul 2010 02:06:51 +0100 Subject: [PATCH] start storing incoming MediaEntry on a new Media field on PrimitiveBaseShape This allows the media texture to persist in memory - logging in and out will redisplay it (after a click) though navigation will be lost Next need to implement media uri on prim and delegate more incoming llsd parsing to libomv --- OpenSim/Framework/PrimitiveBaseShape.cs | 7 +++ .../World/Media/Moap/MoapModule.cs | 63 ++++++++++++++++++- 2 files changed, 67 insertions(+), 3 deletions(-) diff --git a/OpenSim/Framework/PrimitiveBaseShape.cs b/OpenSim/Framework/PrimitiveBaseShape.cs index 4d1de22eeb..517dbf6e03 100644 --- a/OpenSim/Framework/PrimitiveBaseShape.cs +++ b/OpenSim/Framework/PrimitiveBaseShape.cs @@ -26,12 +26,14 @@ */ using System; +using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Reflection; using System.Xml.Serialization; using log4net; using OpenMetaverse; +using OpenMetaverse.StructuredData; namespace OpenSim.Framework { @@ -170,6 +172,11 @@ namespace OpenSim.Framework } } } + + /// + /// Entries to store media textures on each face + /// + public List Media { get; set; } public PrimitiveBaseShape() { diff --git a/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs b/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs index 30507a4aa3..90626f4129 100644 --- a/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs +++ b/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs @@ -27,6 +27,7 @@ using System; using System.Collections; +using System.Collections.Generic; using System.Collections.Specialized; using System.Reflection; using System.IO; @@ -115,6 +116,8 @@ namespace OpenSim.Region.CoreModules.Media.Moap if ("GET" == verb) return HandleObjectMediaRequestGet(path, osdParams, httpRequest, httpResponse); + if ("UPDATE" == verb) + return HandleObjectMediaRequestUpdate(path, osdParams, httpRequest, httpResponse); //NameValueCollection query = HttpUtility.ParseQueryString(httpRequest.Url.Query); @@ -140,6 +143,7 @@ namespace OpenSim.Region.CoreModules.Media.Moap return string.Empty; } + /* int faces = part.GetNumberOfSides(); m_log.DebugFormat("[MOAP]: Faces [{0}] for [{1}]", faces, primId); @@ -154,17 +158,20 @@ namespace OpenSim.Region.CoreModules.Media.Moap //me.Width = 240; media[i] = me; } + */ + + if (null == part.Shape.Media) + return string.Empty; ObjectMediaResponse resp = new ObjectMediaResponse(); - resp.PrimID = (UUID)osdParams["object_id"]; - resp.FaceMedia = media; + resp.PrimID = primId; + resp.FaceMedia = part.Shape.Media.ToArray(); // I know this has to end with the last avatar to edit and the version code shouldn't always be 16. Just trying // to minimally satisfy for now to get something working resp.Version = "x-mv:0000000016/" + UUID.Random(); - //string rawResp = resp.Serialize().ToString(); string rawResp = OSDParser.SerializeLLSDXmlString(resp.Serialize()); m_log.DebugFormat("[MOAP]: Got HandleObjectMediaRequestGet raw response is [{0}]", rawResp); @@ -172,6 +179,56 @@ namespace OpenSim.Region.CoreModules.Media.Moap return rawResp; } + protected string HandleObjectMediaRequestUpdate( + string path, Hashtable osdParams, OSHttpRequest httpRequest, OSHttpResponse httpResponse) + { + UUID primId = (UUID)osdParams["object_id"]; + + SceneObjectPart part = m_scene.GetSceneObjectPart(primId); + + if (null == part) + { + m_log.WarnFormat( + "[MOAP]: Received am UPDATE ObjectMediaRequest for prim {0} but this doesn't exist in the scene", + primId); + return string.Empty; + } + + List cookedMediaEntries = new List(); + + ArrayList rawMediaEntries = (ArrayList)osdParams["object_media_data"]; + foreach (Object obj in rawMediaEntries) + { + Hashtable rawMe = (Hashtable)obj; + + // TODO: Yeah, I know this is silly. Very soon use existing better code in libomv to do this. + MediaEntry cookedMe = new MediaEntry(); + cookedMe.EnableAlterntiveImage = (bool)rawMe["alt_image_enable"]; + cookedMe.AutoLoop = (bool)rawMe["auto_loop"]; + cookedMe.AutoPlay = (bool)rawMe["auto_play"]; + cookedMe.AutoScale = (bool)rawMe["auto_scale"]; + cookedMe.AutoZoom = (bool)rawMe["auto_zoom"]; + cookedMe.InteractOnFirstClick = (bool)rawMe["first_click_interact"]; + cookedMe.Controls = (MediaControls)rawMe["controls"]; + cookedMe.HomeURL = (string)rawMe["home_url"]; + cookedMe.CurrentURL = (string)rawMe["current_url"]; + cookedMe.Height = (int)rawMe["height_pixels"]; + cookedMe.Width = (int)rawMe["width_pixels"]; + cookedMe.ControlPermissions = (MediaPermission)Enum.Parse(typeof(MediaPermission), rawMe["perms_control"].ToString()); + cookedMe.InteractPermissions = (MediaPermission)Enum.Parse(typeof(MediaPermission), rawMe["perms_interact"].ToString()); + cookedMe.EnableWhiteList = (bool)rawMe["whitelist_enable"]; + //cookedMe.WhiteList = (string[])rawMe["whitelist"]; + + cookedMediaEntries.Add(cookedMe); + } + + m_log.DebugFormat("[MOAP]: Received {0} media entries for prim {1}", cookedMediaEntries.Count, primId); + + part.Shape.Media = cookedMediaEntries; + + return string.Empty; + } + /// /// Received from the viewer if a user has changed the url of a media texture. ///