예제 #1
0
        private static MemoryStream GetDecompressHeader(Ird ird)
        {
            var decompressedStream = new MemoryStream();

            using (var compressedStream = new MemoryStream(ird.Header, false))
                using (var gzip = new GZipStream(compressedStream, CompressionMode.Decompress))
                    gzip.CopyTo(decompressedStream);
            decompressedStream.Seek(0, SeekOrigin.Begin);
            return(decompressedStream);
        }
예제 #2
0
        public async Task <Ird> DownloadAsync(SearchResultItem irdInfo, string localCachePath, CancellationToken cancellationToken)
        {
            Ird result = null;

            try
            {
                var localCacheFilename = Path.Combine(localCachePath, irdInfo.Filename);
                // first we search local cache and try to load whatever data we can
                try
                {
                    if (File.Exists(localCacheFilename))
                    {
                        return(IrdParser.Parse(File.ReadAllBytes(localCacheFilename)));
                    }
                }
                catch (Exception e)
                {
                    Log.Warn(e, "Error accessing local IRD cache: " + e.Message);
                }
                try
                {
                    var resultBytes = await client.GetByteArrayAsync(GetDownloadLink(irdInfo.Filename)).ConfigureAwait(false);

                    result = IrdParser.Parse(resultBytes);
                    try
                    {
                        if (!Directory.Exists(localCachePath))
                        {
                            Directory.CreateDirectory(localCachePath);
                        }
                        File.WriteAllBytes(localCacheFilename, resultBytes);
                    }
                    catch (Exception ex)
                    {
                        Log.Warn(ex, $"Failed to write {irdInfo.Filename} to local cache: {ex.Message}");
                    }
                }
                catch (Exception e)
                {
                    Log.Warn(e, $"Failed to download {irdInfo.Filename}: {e.Message}");
                }
                return(result);
            }
            catch (Exception e)
            {
                Log.Error(e);
                return(result);
            }
        }
        public static DiscInfo ToDiscInfo(this Ird ird)
        {
            List <FileRecord> fsInfo;
            var sectorSize = 2048L;

            using (var stream = new MemoryStream())
            {
                using (var headerStream = new MemoryStream(ird.Header))
                    using (var gzipStream = new GZipStream(headerStream, CompressionMode.Decompress))
                    {
                        gzipStream.CopyTo(stream);
                    }
                stream.Seek(0, SeekOrigin.Begin);
                var reader = new CDReader(stream, true, true);
                fsInfo     = reader.GetFilesystemStructure();
                sectorSize = reader.ClusterSize;
            }
            var checksums = ird.Files.ToDictionary(f => f.Offset, f => f.Md5Checksum.ToHexString());

            return(new DiscInfo
            {
                ProductCode = ird.ProductCode,
                DiscVersion = ird.GameVersion,
                DiscKeyRawData = ird.Data1.ToHexString(),
                DiscKey = Decrypter.DecryptDiscKey(ird.Data1).ToHexString(),
                Files = fsInfo.ToDictionary(
                    f => f.Filename,
                    f => new FileInfo
                {
                    Offset = f.StartSector * sectorSize,
                    Size = f.Length,
                    Hashes = new Dictionary <string, string>
                    {
                        ["MD5"] = checksums[f.StartSector],
                    }
                })
            });
        }