wasStitchNET – Rev 5

Subversion Repositories:
Rev:
///////////////////////////////////////////////////////////////////////////
//  Copyright (C) Wizardry and Steamworks 2017 - License: GNU GPLv3      //
//  Please see: http://www.gnu.org/licenses/gpl.html for legal details,  //
//  rights of fair usage, the disclaimer and warranty conditions.        //
///////////////////////////////////////////////////////////////////////////

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using wasDAVClient;
using wasSharp;
using wasSharp.Linq;
using wasSharp.Web.Utilities;
using wasSharpNET.Cryptography;

namespace wasStitchNET.Repository
{
    public class Tools
    {
        /// <summary>
        ///     Lists the release files for a given release version.
        /// </summary>
        /// <param name="server">the Stitch server to use</param>
        /// <param name="release">the release to list files for</param>
        /// <param name="timeout">the timeout connecting to the Stitch repository</param>
        /// <returns>a list of Corrade files contained in the repository</returns>
        public static async Task<IEnumerable<string>> GetReleaseFiles(string server, Version release, int timeout)
        {
            using (var client = new Client(new NetworkCredential())
            {
                Timeout = timeout,
                UserAgent = STITCH_CONSTANTS.USER_AGENT.Product.Name,
                UserAgentVersion = STITCH_CONSTANTS.USER_AGENT.Product.Version,
                Server = server,
                BasePath = string.Join(@"/", STITCH_CONSTANTS.UPDATE_PATH,
                    STITCH_CONSTANTS.PROGRESSIVE_PATH)
            })
            {
                return (await client
                    .List(
                        string.Join(
                            Constants.DIRECTORY_SEPARATOR,
                            $"{release.Major}.{release.Minor}",
                            STITCH_CONSTANTS.UPDATE_DATA_PATH),
                            Constants.DavDepth.ALL)
                    )
                    .Select(o => string.Join(Constants.DIRECTORY_SEPARATOR,
                            o.Href.PathSplit(Constants.DIRECTORY_SEPARATOR.First())
                                .Select(part =>
                                    part.Trim(Constants.DIRECTORY_SEPARATOR.First()).URLUnescapeDataString()
                                )
                                .Where(part => !string.IsNullOrEmpty(part))
                                .SequenceExceptAny(new[] {
                                    STITCH_CONSTANTS.UPDATE_PATH,
                                    STITCH_CONSTANTS.PROGRESSIVE_PATH,
                                    $"{release.Major}.{release.Minor}",
                                    STITCH_CONSTANTS.UPDATE_DATA_PATH
                                })
                        )
                    );
            }
        }

        /// <summary>
        ///     Lists the release files for a given release version.
        /// </summary>
        /// <param name="server">the Stitch server to use</param>
        /// <param name="release">the release to list files for</param>
        /// <param name="timeout">the timeout connecting to the Stitch repository</param>
        /// <returns>a list of Corrade files contained in the repository</returns>
        public static IEnumerable<KeyValuePair<string, string>> GetReleaseFileHashes(string server, Version release, int timeout)
        {
            using (var client = new Client(new NetworkCredential())
            {
                Timeout = timeout,
                UserAgent = STITCH_CONSTANTS.USER_AGENT.Product.Name,
                UserAgentVersion = STITCH_CONSTANTS.USER_AGENT.Product.Version,
                Server = server,
                BasePath = string.Join(@"/", STITCH_CONSTANTS.UPDATE_PATH,
                    STITCH_CONSTANTS.PROGRESSIVE_PATH)
            })
            {
                return client
                    .List(
                        string.Join(
                            Constants.DIRECTORY_SEPARATOR,
                            $"{release.Major}.{release.Minor}",
                            STITCH_CONSTANTS.UPDATE_DATA_PATH),
                            Constants.DavDepth.ALL)
                            .Result
                            .AsParallel()
                            .Where(item => !item.IsCollection)
                            .ToDictionary(o => string.Join(Constants.DIRECTORY_SEPARATOR,
                                o.Href.PathSplit(Constants.DIRECTORY_SEPARATOR.First())
                                .Select(part => part.Trim(Constants.DIRECTORY_SEPARATOR.First()).URLUnescapeDataString()
                         )
                         .Where(part => !string.IsNullOrEmpty(part))
                         .SequenceExceptAny(new[] {
                                        STITCH_CONSTANTS.UPDATE_PATH,
                                        STITCH_CONSTANTS.PROGRESSIVE_PATH,
                                        $"{release.Major}.{release.Minor}",
                                        STITCH_CONSTANTS.UPDATE_DATA_PATH
                         })), o => System.Security.Cryptography.SHA1.Create().ToHex(client.Download(o.Href).Result));
            }
        }
    }
}