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
This commit is contained in:
Latif Khalifa
2010-03-07 19:58:06 +00:00
parent 285c35471b
commit eb82abedf4
2 changed files with 107 additions and 1 deletions

View File

@@ -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; } }
}
/// <summary>
/// Callback for getting object media data via CAP
/// </summary>
/// <param name="success">Indicates if the operation was succesfull</param>
/// <param name="version">Object media version string</param>
/// <param name="faceMedia">Array indexed on prim face of media entry data</param>
public delegate void ObjectMediaCallback(bool success, string version, MediaEntry[] faceMedia);
#endregion Delegates
/// <summary>Reference to the GridClient object</summary>
@@ -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
{
/// <summary>
/// Indicates if the operation was successful
/// </summary>
public bool Success { get; set; }
/// <summary>
/// Media version string
/// </summary>
public string Version { get; set; }
/// <summary>
/// Array of media entries indexed by face number
/// </summary>
public MediaEntry[] FaceMedia { get; set; }
public ObjectMediaEventArgs(bool success, string version, MediaEntry[] faceMedia)
{
this.Success = success;
this.Version = version;
this.FaceMedia = faceMedia;
}
}
#endregion
}

View File

@@ -53,6 +53,9 @@ namespace OpenMetaverse
}
#endregion enums
/// <summary>
/// Class representing media data for a single face
/// </summary>
public class MediaEntry
{
/// <summary>Is display of the alternative image enabled</summary>
@@ -102,6 +105,10 @@ namespace OpenMetaverse
/// <summary>Array of URLs that are whitelisted</summary>
public string[] WhiteList;
/// <summary>
/// Serialize to OSD
/// </summary>
/// <returns>OSDMap with the serialized data</returns>
public OSDMap GetOSD()
{
OSDMap map = new OSDMap();
@@ -133,6 +140,11 @@ namespace OpenMetaverse
return map;
}
/// <summary>
/// Deserialize from OSD data
/// </summary>
/// <param name="osd">Serialized OSD data</param>
/// <returns>Deserialized object</returns>
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
{
/// <summary>
/// Current version of the media data for the prim
/// </summary>
public string MediaVersion = string.Empty;
/// <summary>
/// Array of media entries indexed by face number
/// </summary>
public MediaEntry[] FaceMedia;
}
}