corrade-vassal – Rev 1

Subversion Repositories:
Rev:
using System;
using System.IO;
using System.Threading;
using OpenMetaverse;
using OpenMetaverse.Assets;

namespace OpenMetaverse.TestClient
{
    public class DownloadCommand : Command
    {
        UUID AssetID;
        AssetType assetType;
        AutoResetEvent DownloadHandle = new AutoResetEvent(false);
        bool Success;
        string usage = "Usage: download [uuid] [assetType]";

        public DownloadCommand(TestClient testClient)
        {
            Name = "download";
            Description = "Downloads the specified asset. Usage: download [uuid] [assetType]";
            Category = CommandCategory.Inventory;
        }

        public override string Execute(string[] args, UUID fromAgentID)
        {
            if (args.Length != 2)
                return usage;

            Success = false;
            AssetID = UUID.Zero;
            assetType = AssetType.Unknown;
            DownloadHandle.Reset();

            if (!UUID.TryParse(args[0], out AssetID))
                return usage;

            try {
                assetType = (AssetType)Enum.Parse(typeof(AssetType), args[1], true);
            } catch (ArgumentException) {
                return usage;
            }
            if (!Enum.IsDefined(typeof(AssetType), assetType))
                return usage;

            // Start the asset download
            Client.Assets.RequestAsset(AssetID, assetType, true, Assets_OnAssetReceived);

            if (DownloadHandle.WaitOne(120 * 1000, false))
            {
                if (Success)
                    return String.Format("Saved {0}.{1}", AssetID, assetType.ToString().ToLower());
                else
                    return String.Format("Failed to download asset {0}, perhaps {1} is the incorrect asset type?",
                        AssetID, assetType);
            }
            else
            {
                return "Timed out waiting for texture download";
            }
        }

        private void Assets_OnAssetReceived(AssetDownload transfer, Asset asset)
        {
            if (transfer.AssetID == AssetID)
            {
                if (transfer.Success)
                {
                    try
                    {
                        File.WriteAllBytes(String.Format("{0}.{1}", AssetID,
                            assetType.ToString().ToLower()), asset.AssetData);
                        Success = true;
                    }
                    catch (Exception ex)
                    {
                        Logger.Log(ex.Message, Helpers.LogLevel.Error, ex);
                    }
                }

                DownloadHandle.Set();
            }
        }
    }
}