2009-07-09 20:52:11 +00:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.IO;
|
|
|
|
|
|
using System.Threading;
|
|
|
|
|
|
|
|
|
|
|
|
namespace OpenMetaverse.TestClient
|
|
|
|
|
|
{
|
|
|
|
|
|
public class XferCommand : Command
|
|
|
|
|
|
{
|
|
|
|
|
|
const int FETCH_ASSET_TIMEOUT = 1000 * 10;
|
|
|
|
|
|
|
|
|
|
|
|
public XferCommand(TestClient testClient)
|
|
|
|
|
|
{
|
|
|
|
|
|
Name = "xfer";
|
|
|
|
|
|
Description = "Downloads the specified asset using the Xfer system. Usage: xfer [uuid]";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override string Execute(string[] args, UUID fromAgentID)
|
|
|
|
|
|
{
|
|
|
|
|
|
UUID assetID;
|
|
|
|
|
|
|
|
|
|
|
|
if (args.Length != 1 || !UUID.TryParse(args[0], out assetID))
|
|
|
|
|
|
return "Usage: xfer [uuid]";
|
|
|
|
|
|
|
|
|
|
|
|
string filename;
|
2009-08-03 18:28:52 +00:00
|
|
|
|
byte[] assetData = RequestXfer(assetID, AssetType.Object, out filename);
|
2009-07-09 20:52:11 +00:00
|
|
|
|
|
|
|
|
|
|
if (assetData != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
File.WriteAllBytes(filename, assetData);
|
|
|
|
|
|
return "Saved asset " + filename;
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
return "Failed to save asset " + filename + ": " + ex.Message;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
return "Failed to xfer asset " + assetID;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2009-08-03 18:28:52 +00:00
|
|
|
|
byte[] RequestXfer(UUID assetID, AssetType type, out string filename)
|
2009-07-09 20:52:11 +00:00
|
|
|
|
{
|
|
|
|
|
|
AutoResetEvent xferEvent = new AutoResetEvent(false);
|
|
|
|
|
|
ulong xferID = 0;
|
|
|
|
|
|
byte[] data = null;
|
|
|
|
|
|
|
2010-03-17 14:00:36 +00:00
|
|
|
|
EventHandler<XferReceivedEventArgs> xferCallback =
|
|
|
|
|
|
delegate(object sender, XferReceivedEventArgs e)
|
2009-07-09 20:52:11 +00:00
|
|
|
|
{
|
2010-03-17 14:00:36 +00:00
|
|
|
|
if (e.Xfer.XferID == xferID)
|
2009-07-09 20:52:11 +00:00
|
|
|
|
{
|
2010-03-17 14:00:36 +00:00
|
|
|
|
if (e.Xfer.Success)
|
|
|
|
|
|
data = e.Xfer.AssetData;
|
2009-07-09 20:52:11 +00:00
|
|
|
|
xferEvent.Set();
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2010-03-17 14:00:36 +00:00
|
|
|
|
Client.Assets.XferReceived += xferCallback;
|
2009-07-09 20:52:11 +00:00
|
|
|
|
|
|
|
|
|
|
filename = assetID + ".asset";
|
2009-08-03 18:28:52 +00:00
|
|
|
|
xferID = Client.Assets.RequestAssetXfer(filename, false, true, assetID, type, false);
|
2009-07-09 20:52:11 +00:00
|
|
|
|
|
|
|
|
|
|
xferEvent.WaitOne(FETCH_ASSET_TIMEOUT, false);
|
|
|
|
|
|
|
2010-03-17 14:00:36 +00:00
|
|
|
|
Client.Assets.XferReceived -= xferCallback;
|
2009-07-09 20:52:11 +00:00
|
|
|
|
|
|
|
|
|
|
return data;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|