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); }
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], } }) }); }