Esempio n. 1
0
        /// <summary>
        /// Asynchronously downloads a resource. Resource version must be specified.
        /// </summary>
        /// <param name="resourceId">Hash of the resource to download</param>
        /// <param name="resourceType">Resource type</param>
        /// <param name="payloadType">Payload type</param>
        /// <param name="variantType">Variant type</param>
        /// <param name="version">Version string</param>
        /// <param name="client">Client used for downloading</param>
        /// <param name="progress">Optional progress report callback</param>
        /// <returns>Task for downloading the specified resource</returns>
        public static async Task <DownloadResults> DownloadResourceAsync(string resourceId, ResourceType resourceType, PayloadType payloadType, VariantType variantType, string version, IHttpClientProvider client, IProgress <ProgressEventArgs> progress = null)
        {
            var resourceTypeName = GetResourceTypeName(resourceType);
            var payloadTypeName  = GetPayloadTypeName(payloadType);
            var variantTypeName  = GetVariantTypeName(variantType);

            var itemName = $"{ resourceId }.{ resourceTypeName}.v{version}.{payloadTypeName}.v0.{variantTypeName}";
            var address  = $"http://sansar-asset-production.s3-us-west-2.amazonaws.com/{itemName}";

            progress?.Report(new ProgressEventArgs
            {
                BytesDownloaded      = 0,
                CurrentResourceIndex = 0,
                Resource             = address,
                Status         = ProgressStatus.Idling,
                TotalBytes     = 1,
                TotalResources = 1
            });

            var progressMiddleman = new Progress <ProgressEventArgs>(args =>
            {
                progress?.Report(new ProgressEventArgs
                {
                    BytesDownloaded      = args.BytesDownloaded,
                    TotalBytes           = args.TotalResources,
                    Resource             = args.Resource,
                    Status               = args.Status,
                    CurrentResourceIndex = 0,
                    TotalResources       = 1
                });
            });

            return(new DownloadResults
            {
                Name = itemName,
                Version = version,
                Bytes = await client.GetByteArrayAsync(address, progressMiddleman).ConfigureAwait(false)
            });
        }
Esempio n. 2
0
        /// <summary>
        /// Asynchronously downloads a resource. Attempts to find the latest resource version.
        /// </summary>
        /// <param name="resourceId">Hash of the resource to download</param>
        /// <param name="resourceType">Resource type</param>
        /// <param name="payloadType">Payload type</param>
        /// <param name="variantType">Variant type</param>
        /// <param name="client">Client used for downloading</param>
        /// <param name="progress">Optional progress report callback</param>
        /// <returns>Task for downloading the specified resource</returns>
        public static async Task <DownloadResults> DownloadResourceAsync(string resourceId, ResourceType resourceType, PayloadType payloadType, VariantType variantType, IHttpClientProvider client, IProgress <ProgressEventArgs> progress = null)
        {
            Exception lastException = null;

            var resourceTypeName = GetResourceTypeName(resourceType);
            var versions         = AssetVersions.GetResourceVersions(resourceType);
            var payloadTypeName  = GetPayloadTypeName(payloadType);
            var variantTypeName  = GetVariantTypeName(variantType);

            var currentResourceIndex = 0;
            var totalResources       = versions.Count;

            foreach (string version in versions)
            {
                progress?.Report(new ProgressEventArgs
                {
                    BytesDownloaded      = 0,
                    CurrentResourceIndex = currentResourceIndex,
                    Resource             = version,
                    Status         = ProgressStatus.Idling,
                    TotalBytes     = 1,
                    TotalResources = totalResources
                });

                var progressMiddleman = new Progress <ProgressEventArgs>(args => {
                    progress?.Report(new ProgressEventArgs
                    {
                        BytesDownloaded = args.BytesDownloaded,
                        TotalBytes      = args.TotalBytes,
                        Resource        = args.Resource,
                        Status          = args.Status,
                        // ReSharper disable once AccessToModifiedClosure
                        CurrentResourceIndex = currentResourceIndex,
                        TotalResources       = totalResources
                    });
                });

                try
                {
                    var itemName = $"{ resourceId }.{ resourceTypeName}.v{version.ToLower()}.{payloadTypeName}.v0.{variantTypeName}";
                    var address  = $"http://sansar-asset-production.s3-us-west-2.amazonaws.com/{itemName}";
                    var bytes    = await client.GetByteArrayAsync(address, progressMiddleman).ConfigureAwait(false);

                    return(new DownloadResults
                    {
                        Name = itemName,
                        Version = version,
                        Bytes = bytes
                    });
                }
                catch (Exception ex)
                {
                    lastException = ex;
                    progress?.Report(new ProgressEventArgs
                    {
                        BytesDownloaded      = 0,
                        CurrentResourceIndex = currentResourceIndex,
                        Resource             = version,
                        Status         = ProgressStatus.Error,
                        TotalBytes     = 1,
                        TotalResources = totalResources
                    });
                }

                ++currentResourceIndex;
            }

            if (lastException != null)
            {
                throw lastException;
            }

            return(null);
        }