From eb82abedf4de805e76d2c1b5fdfcbb334f6e19ae Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sun, 7 Mar 2010 19:58:06 +0000 Subject: [PATCH] Added RequestObjectMedia() for getting object media details. Unable to test since the required cap is never granted to libomv. git-svn-id: http://libopenmetaverse.googlecode.com/svn/libopenmetaverse/trunk@3267 52acb1d6-8a22-11de-b505-999d5b087335 --- OpenMetaverse/ObjectManager.cs | 82 +++++++++++++++++++++++++ OpenMetaverse/Primitives/ObjectMedia.cs | 26 +++++++- 2 files changed, 107 insertions(+), 1 deletion(-) diff --git a/OpenMetaverse/ObjectManager.cs b/OpenMetaverse/ObjectManager.cs index c4aa8ba4..fd2ce7dc 100644 --- a/OpenMetaverse/ObjectManager.cs +++ b/OpenMetaverse/ObjectManager.cs @@ -28,6 +28,9 @@ using System; using System.Collections.Generic; using System.Threading; using OpenMetaverse.Packets; +using OpenMetaverse.Http; +using OpenMetaverse.StructuredData; +using OpenMetaverse.Messages.Linden; namespace OpenMetaverse { @@ -407,6 +410,14 @@ namespace OpenMetaverse remove { lock (m_PayPriceReplyLock) { m_PayPriceReply -= value; } } } + /// + /// Callback for getting object media data via CAP + /// + /// Indicates if the operation was succesfull + /// Object media version string + /// Array indexed on prim face of media entry data + public delegate void ObjectMediaCallback(bool success, string version, MediaEntry[] faceMedia); + #endregion Delegates /// Reference to the GridClient object @@ -1531,6 +1542,51 @@ namespace OpenMetaverse Client.Network.SendPacket(packet, simulator); } + + public void RequestObjectMedia(UUID primID, Simulator sim, ObjectMediaCallback callback) + { + Uri url; + if (sim.Caps != null && null != (url = sim.Caps.CapabilityURI("ObjectMedia"))) + { + ObjectMediaRequest req = new ObjectMediaRequest(); + req.PrimID = primID; + req.Verb = "GET"; + + CapsClient request = new CapsClient(url); + request.OnComplete += (CapsClient client, OSD result, Exception error) => + { + if (result == null) + { + try { callback(false, string.Empty, null); } + catch (Exception ex) { Logger.Log(ex.Message, Helpers.LogLevel.Error, Client); } + return; + } + + ObjectMediaMessage msg = new ObjectMediaMessage(); + msg.Deserialize((OSDMap)result); + + if (msg.Request is ObjectMediaResponse) + { + ObjectMediaResponse response = (ObjectMediaResponse)msg.Request; + try { callback(true, response.Version, response.FaceMedia); } + catch (Exception ex) { Logger.Log(ex.Message, Helpers.LogLevel.Error, Client); } + } + else + { + try { callback(false, string.Empty, null); } + catch (Exception ex) { Logger.Log(ex.Message, Helpers.LogLevel.Error, Client); } + } + }; + + request.BeginGetResponse(req.Serialize(), OSDFormat.Xml, Client.Settings.CAPS_TIMEOUT); + } + else + { + try { callback(false, string.Empty, null); } + catch (Exception ex) { Logger.Log(ex.Message, Helpers.LogLevel.Error, Client); } + } + } + #endregion #region Packet Handlers @@ -3361,5 +3417,31 @@ namespace OpenMetaverse this.m_ButtonPrices = buttonPrices; } } + + public class ObjectMediaEventArgs : EventArgs + { + /// + /// Indicates if the operation was successful + /// + public bool Success { get; set; } + + /// + /// Media version string + /// + public string Version { get; set; } + + /// + /// Array of media entries indexed by face number + /// + public MediaEntry[] FaceMedia { get; set; } + + public ObjectMediaEventArgs(bool success, string version, MediaEntry[] faceMedia) + { + this.Success = success; + this.Version = version; + this.FaceMedia = faceMedia; + } + } + #endregion } diff --git a/OpenMetaverse/Primitives/ObjectMedia.cs b/OpenMetaverse/Primitives/ObjectMedia.cs index 3c520a10..210db00e 100644 --- a/OpenMetaverse/Primitives/ObjectMedia.cs +++ b/OpenMetaverse/Primitives/ObjectMedia.cs @@ -53,6 +53,9 @@ namespace OpenMetaverse } #endregion enums + /// + /// Class representing media data for a single face + /// public class MediaEntry { /// Is display of the alternative image enabled @@ -102,6 +105,10 @@ namespace OpenMetaverse /// Array of URLs that are whitelisted public string[] WhiteList; + /// + /// Serialize to OSD + /// + /// OSDMap with the serialized data public OSDMap GetOSD() { OSDMap map = new OSDMap(); @@ -133,6 +140,11 @@ namespace OpenMetaverse return map; } + /// + /// Deserialize from OSD data + /// + /// Serialized OSD data + /// Deserialized object public static MediaEntry FromOSD(OSD osd) { MediaEntry m = new MediaEntry(); @@ -167,8 +179,20 @@ namespace OpenMetaverse m.EnableWhiteList = map["whitelist_enable"].AsBoolean(); m.Width = map["width_pixels"].AsInteger(); - return m; } } + + public partial class Primitive + { + /// + /// Current version of the media data for the prim + /// + public string MediaVersion = string.Empty; + + /// + /// Array of media entries indexed by face number + /// + public MediaEntry[] FaceMedia; + } }