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
prebuild-update
Justin Clark-Casey (justincc) 2010-07-01 02:06:51 +01:00
parent 9301e36fbc
commit acac47830e
2 changed files with 67 additions and 3 deletions

View File

@ -26,12 +26,14 @@
*/ */
using System; using System;
using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Drawing.Imaging; using System.Drawing.Imaging;
using System.Reflection; using System.Reflection;
using System.Xml.Serialization; using System.Xml.Serialization;
using log4net; using log4net;
using OpenMetaverse; using OpenMetaverse;
using OpenMetaverse.StructuredData;
namespace OpenSim.Framework namespace OpenSim.Framework
{ {
@ -171,6 +173,11 @@ namespace OpenSim.Framework
} }
} }
/// <summary>
/// Entries to store media textures on each face
/// </summary>
public List<MediaEntry> Media { get; set; }
public PrimitiveBaseShape() public PrimitiveBaseShape()
{ {
PCode = (byte) PCodeEnum.Primitive; PCode = (byte) PCodeEnum.Primitive;

View File

@ -27,6 +27,7 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized; using System.Collections.Specialized;
using System.Reflection; using System.Reflection;
using System.IO; using System.IO;
@ -115,6 +116,8 @@ namespace OpenSim.Region.CoreModules.Media.Moap
if ("GET" == verb) if ("GET" == verb)
return HandleObjectMediaRequestGet(path, osdParams, httpRequest, httpResponse); return HandleObjectMediaRequestGet(path, osdParams, httpRequest, httpResponse);
if ("UPDATE" == verb)
return HandleObjectMediaRequestUpdate(path, osdParams, httpRequest, httpResponse);
//NameValueCollection query = HttpUtility.ParseQueryString(httpRequest.Url.Query); //NameValueCollection query = HttpUtility.ParseQueryString(httpRequest.Url.Query);
@ -140,6 +143,7 @@ namespace OpenSim.Region.CoreModules.Media.Moap
return string.Empty; return string.Empty;
} }
/*
int faces = part.GetNumberOfSides(); int faces = part.GetNumberOfSides();
m_log.DebugFormat("[MOAP]: Faces [{0}] for [{1}]", faces, primId); m_log.DebugFormat("[MOAP]: Faces [{0}] for [{1}]", faces, primId);
@ -154,17 +158,20 @@ namespace OpenSim.Region.CoreModules.Media.Moap
//me.Width = 240; //me.Width = 240;
media[i] = me; media[i] = me;
} }
*/
if (null == part.Shape.Media)
return string.Empty;
ObjectMediaResponse resp = new ObjectMediaResponse(); ObjectMediaResponse resp = new ObjectMediaResponse();
resp.PrimID = (UUID)osdParams["object_id"]; resp.PrimID = primId;
resp.FaceMedia = media; 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 // 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 // to minimally satisfy for now to get something working
resp.Version = "x-mv:0000000016/" + UUID.Random(); resp.Version = "x-mv:0000000016/" + UUID.Random();
//string rawResp = resp.Serialize().ToString();
string rawResp = OSDParser.SerializeLLSDXmlString(resp.Serialize()); string rawResp = OSDParser.SerializeLLSDXmlString(resp.Serialize());
m_log.DebugFormat("[MOAP]: Got HandleObjectMediaRequestGet raw response is [{0}]", rawResp); m_log.DebugFormat("[MOAP]: Got HandleObjectMediaRequestGet raw response is [{0}]", rawResp);
@ -172,6 +179,56 @@ namespace OpenSim.Region.CoreModules.Media.Moap
return rawResp; 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<MediaEntry> cookedMediaEntries = new List<MediaEntry>();
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;
}
/// <summary> /// <summary>
/// Received from the viewer if a user has changed the url of a media texture. /// Received from the viewer if a user has changed the url of a media texture.
/// </summary> /// </summary>