From 7cd73c1d28bdc976492ec0e60403af2ec2eee6c3 Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Thu, 9 Jul 2009 22:24:04 +0000 Subject: [PATCH] * More AbortXfer cleanup * Fixed a crash from a failed notecard upload git-svn-id: http://libopenmetaverse.googlecode.com/svn/libopenmetaverse/trunk@2951 52acb1d6-8a22-11de-b505-999d5b087335 --- OpenMetaverse/AssetManager.cs | 11 ++++--- OpenMetaverse/InventoryManager.cs | 55 ++++++++++++++++++++----------- 2 files changed, 41 insertions(+), 25 deletions(-) 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); } } }