* 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
This commit is contained in:
John Hurliman
2009-07-09 22:24:04 +00:00
parent 368632dcd2
commit 7cd73c1d28
2 changed files with 41 additions and 25 deletions

View File

@@ -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;

View File

@@ -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<NotecardUploadedAssetCallback, byte[]> kvp = (KeyValuePair<NotecardUploadedAssetCallback, byte[]>)(((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); }
}
}