From 31d313cdd42661068150de89a47fbac4e7ea6699 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Wed, 15 Jul 2009 22:11:48 +0000 Subject: [PATCH] * LIBOMV-632: Implement uploading gestures * Generalize notecard uploaded callback so it can be used with other similiar inventory asset uploaders git-svn-id: http://libopenmetaverse.googlecode.com/svn/libopenmetaverse/trunk@2988 52acb1d6-8a22-11de-b505-999d5b087335 --- OpenMetaverse/InventoryManager.cs | 56 +++++++++++---- OpenMetaverse/Messages/LindenMessages.cs | 71 +++++++++++++++++++ OpenMetaverse/Messages/MessageEventDecoder.cs | 2 +- 3 files changed, 115 insertions(+), 14 deletions(-) diff --git a/OpenMetaverse/InventoryManager.cs b/OpenMetaverse/InventoryManager.cs index 97150fdc..57d85f48 100644 --- a/OpenMetaverse/InventoryManager.cs +++ b/OpenMetaverse/InventoryManager.cs @@ -917,13 +917,13 @@ namespace OpenMetaverse public delegate void TaskInventoryReplyCallback(UUID itemID, short serial, string assetFilename); /// - /// + /// Reply received when uploading an invetnory asset /// - /// - /// - /// - /// - public delegate void NotecardUploadedAssetCallback(bool success, string status, UUID itemID, UUID assetID); + /// Has upload been successful + /// Error message if upload failed + /// Inventory asset UUID + /// New gesture asset UUID + public delegate void InventoryUploadedAssetCallback(bool success, string status, UUID itemID, UUID assetID); /// /// Fired when local inventory store needs to be updated. Generally at logout to update a local cache @@ -2093,7 +2093,7 @@ namespace OpenMetaverse /// /// /// - public void RequestUploadNotecardAsset(byte[] data, UUID notecardID, NotecardUploadedAssetCallback callback) + public void RequestUploadNotecardAsset(byte[] data, UUID notecardID, InventoryUploadedAssetCallback callback) { if (_Client.Network.CurrentSim == null || _Client.Network.CurrentSim.Caps == null) throw new Exception("UpdateNotecardAgentInventory capability is not currently available"); @@ -2107,8 +2107,8 @@ namespace OpenMetaverse // Make the request CapsClient request = new CapsClient(url); - request.OnComplete += UploadNotecardAssetResponse; - request.UserData = new object[] { new KeyValuePair(callback, data), notecardID }; + request.OnComplete += UploadInventoryAssetResponse; + request.UserData = new object[] { new KeyValuePair(callback, data), notecardID }; request.BeginGetResponse(query, OSDFormat.Xml, _Client.Settings.CAPS_TIMEOUT); } else @@ -2117,6 +2117,36 @@ namespace OpenMetaverse } } + /// + /// Upload new gesture asset for an inventory gesture item + /// + /// Encoded gesture asset + /// Gesture inventory UUID + /// Callback whick will be called when upload is complete + public void RequestUploadGestureAsset(byte[] data, UUID gestureID, InventoryUploadedAssetCallback callback) + { + if (_Client.Network.CurrentSim == null || _Client.Network.CurrentSim.Caps == null) + throw new Exception("UpdateGestureAgentInventory capability is not currently available"); + + Uri url = _Client.Network.CurrentSim.Caps.CapabilityURI("UpdateGestureAgentInventory"); + + if (url != null) + { + OSDMap query = new OSDMap(); + query.Add("item_id", OSD.FromUUID(gestureID)); + + // Make the request + CapsClient request = new CapsClient(url); + request.OnComplete += UploadInventoryAssetResponse; + request.UserData = new object[] { new KeyValuePair(callback, data), gestureID }; + request.BeginGetResponse(query, OSDFormat.Xml, _Client.Settings.CAPS_TIMEOUT); + } + else + { + throw new Exception("UpdateGestureAgentInventory capability is not currently available"); + } + } + /// /// Update an existing script in an agents Inventory /// @@ -3766,11 +3796,11 @@ namespace OpenMetaverse } } - private void UploadNotecardAssetResponse(CapsClient client, OSD result, Exception error) + private void UploadInventoryAssetResponse(CapsClient client, OSD result, Exception error) { OSDMap contents = result as OSDMap; - KeyValuePair kvp = (KeyValuePair)(((object[])client.UserData)[0]); - NotecardUploadedAssetCallback callback = kvp.Key; + KeyValuePair kvp = (KeyValuePair)(((object[])client.UserData)[0]); + InventoryUploadedAssetCallback callback = kvp.Key; byte[] itemData = (byte[])kvp.Value; if (error == null && contents != null) @@ -3786,7 +3816,7 @@ namespace OpenMetaverse // This makes the assumption that all uploads go to CurrentSim, to avoid // the problem of HttpRequestState not knowing anything about simulators CapsClient upload = new CapsClient(uploadURL); - upload.OnComplete += UploadNotecardAssetResponse; + upload.OnComplete += UploadInventoryAssetResponse; upload.UserData = new object[2] { kvp, (UUID)(((object[])client.UserData)[1]) }; upload.BeginGetResponse(itemData, "application/octet-stream", _Client.Settings.CAPS_TIMEOUT); } diff --git a/OpenMetaverse/Messages/LindenMessages.cs b/OpenMetaverse/Messages/LindenMessages.cs index dd5d2075..928a498d 100644 --- a/OpenMetaverse/Messages/LindenMessages.cs +++ b/OpenMetaverse/Messages/LindenMessages.cs @@ -1686,6 +1686,77 @@ namespace OpenMetaverse.Messages.Linden } } + /// + /// A message sent from the viewer to the simulator to request a temporary uploader capability + /// used to update a gesture contained in the agents inventory + /// + public class UpdateGestureAgentInventoryUpdateMessage : AssetUploaderBlock + { + /// + /// The Gesture AssetID to replace + /// + public UUID ItemID; + + /// + /// Serialize the object + /// + /// An containing the objects data + public override OSDMap Serialize() + { + OSDMap map = new OSDMap(1); + map["item_id"] = OSD.FromUUID(ItemID); + + return map; + } + + /// + /// Deserialize the message + /// + /// An containing the data + public override void Deserialize(OSDMap map) + { + ItemID = map["item_id"].AsUUID(); + } + } + + /// + /// A message containing the request/response used for updating a gesture + /// contained with an agents inventory + /// + public class UpdateGestureAgentInventoryMessage : IMessage + { + /// Object containing request or response + public AssetUploaderBlock Request; + + /// + /// Serialize the object + /// + /// An containing the objects data + public OSDMap Serialize() + { + return Request.Serialize(); + } + + /// + /// Deserialize the message + /// + /// An containing the data + public void Deserialize(OSDMap map) + { + if (map.ContainsKey("item_id")) + Request = new UpdateGestureAgentInventoryUpdateMessage(); + else if (map.ContainsKey("state") && map["state"].AsString().Equals("upload")) + Request = new UploaderRequestUpload(); + else if (map.ContainsKey("state") && map["state"].AsString().Equals("complete")) + Request = new UploaderRequestComplete(); + else + Logger.Log("Unable to deserialize UpdateGestureAgentInventory: No message handler exists for state " + map["state"].AsString(), Helpers.LogLevel.Warning); + + if (Request != null) + Request.Deserialize(map); + } + } + /// /// A message request/response which is used to update a notecard contained within /// a tasks inventory diff --git a/OpenMetaverse/Messages/MessageEventDecoder.cs b/OpenMetaverse/Messages/MessageEventDecoder.cs index 850c7166..d0324c3a 100644 --- a/OpenMetaverse/Messages/MessageEventDecoder.cs +++ b/OpenMetaverse/Messages/MessageEventDecoder.cs @@ -69,6 +69,7 @@ namespace OpenMetaverse.Messages case "UpdateScriptTask": message = new UpdateScriptTaskMessage(); break; case "UpdateScriptAgent": message = new UpdateScriptAgentMessage(); break; case "SendPostcard": message = new SendPostcardMessage(); break; + case "UpdateGestureAgentInventory": message = new UpdateGestureAgentInventoryMessage(); break; case "UpdateNotecardAgentInventory": message = new UpdateNotecardAgentInventoryMessage(); break; case "LandStatReply": message = new LandStatReplyMessage(); break; case "ParcelVoiceInfoRequest": message = new ParcelVoiceInfoRequestMessage(); break; @@ -101,7 +102,6 @@ namespace OpenMetaverse.Messages // SendUserReportWithScreenshot // ServerReleaseNotes // StartGroupProposal - // UpdateGestureAgentInventory // UpdateGestureTaskInventory // UpdateNotecardTaskInventory // ViewerStartAuction