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