diff --git a/OpenMetaverse/AssetManager.cs b/OpenMetaverse/AssetManager.cs index b1b546b2..ed8918d7 100644 --- a/OpenMetaverse/AssetManager.cs +++ b/OpenMetaverse/AssetManager.cs @@ -208,7 +208,6 @@ namespace OpenMetaverse { public ulong XferID; public UUID VFileID; - public AssetType Type; public uint PacketNum; public string Filename = String.Empty; public TransferError Error = TransferError.None; @@ -1278,21 +1277,23 @@ namespace OpenMetaverse private void AbortXferHandler(Packet packet, Simulator simulator) { AbortXferPacket abort = (AbortXferPacket)packet; - Transfer transfer; + XferDownload download = null; // Lame ulong to UUID conversion, please go away Xfer system UUID transferID = new UUID(abort.XferID.ID); lock (Transfers) { + Transfer transfer; if (Transfers.TryGetValue(transferID, out transfer)) + { + download = (XferDownload)transfer; Transfers.Remove(transferID); + } } - if (transfer != null && OnXferReceived != null) + if (download != null && OnXferReceived != null) { - XferDownload download = (XferDownload)transfer; - download.Success = false; download.Error = (TransferError)abort.XferID.Result; diff --git a/OpenMetaverse/InventoryManager.cs b/OpenMetaverse/InventoryManager.cs index 6710699c..6490c0b1 100644 --- a/OpenMetaverse/InventoryManager.cs +++ b/OpenMetaverse/InventoryManager.cs @@ -3730,41 +3730,56 @@ namespace OpenMetaverse private void UploadNotecardAssetResponse(CapsClient client, OSD result, Exception error) { - OSDMap contents = (OSDMap)result; + OSDMap contents = result as OSDMap; KeyValuePair kvp = (KeyValuePair)(((object[])client.UserData)[0]); NotecardUploadedAssetCallback callback = kvp.Key; byte[] itemData = (byte[])kvp.Value; - string status = contents["state"].AsString(); - - if (status == "upload") + if (contents != null) { - string uploadURL = contents["uploader"].AsString(); + string status = contents["state"].AsString(); - // 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(new Uri(uploadURL)); - upload.OnComplete += new CapsClient.CompleteCallback(UploadNotecardAssetResponse); - upload.UserData = new object[2] { kvp, (UUID)(((object[])client.UserData)[1]) }; - upload.BeginGetResponse(itemData, "application/octet-stream", _Client.Settings.CAPS_TIMEOUT); - } - else if (status == "complete") - { - if (contents.ContainsKey("new_asset")) + if (status == "upload") { - try { callback(true, String.Empty, (UUID)(((object[])client.UserData)[1]), contents["new_asset"].AsUUID()); } - catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, _Client, e); } + Uri uploadURL = contents["uploader"].AsUri(); + + if (uploadURL != null) + { + // 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 += new CapsClient.CompleteCallback(UploadNotecardAssetResponse); + upload.UserData = new object[2] { kvp, (UUID)(((object[])client.UserData)[1]) }; + upload.BeginGetResponse(itemData, "application/octet-stream", _Client.Settings.CAPS_TIMEOUT); + } + else + { + try { callback(false, "Missing uploader URL", UUID.Zero, UUID.Zero); } + catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, _Client, e); } + } + } + else if (status == "complete") + { + if (contents.ContainsKey("new_asset")) + { + try { callback(true, String.Empty, (UUID)(((object[])client.UserData)[1]), contents["new_asset"].AsUUID()); } + catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, _Client, e); } + } + else + { + try { callback(false, "Failed to parse asset and item UUIDs", UUID.Zero, UUID.Zero); } + catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, _Client, e); } + } } else { - try { callback(false, "Failed to parse asset and item UUIDs", UUID.Zero, UUID.Zero); } + try { callback(false, status, UUID.Zero, UUID.Zero); } catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, _Client, e); } } } else { - // Failure - try { callback(false, status, UUID.Zero, UUID.Zero); } + try { callback(false, "Unrecognized or empty response", UUID.Zero, UUID.Zero); } catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, _Client, e); } } }