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;
+ }
}