public static PssgFile Open(Stream stream) { PssgFileType fileType = PssgFile.GetPssgType(stream); if (fileType == PssgFileType.Pssg) { return(PssgFile.ReadPssg(stream, fileType)); } else if (fileType == PssgFileType.Xml) { return(PssgFile.ReadXml(stream, fileType)); } else // CompressedPssg { string tempPath = "temp.pssg"; try { using (var fs = File.Open(tempPath, FileMode.Create, FileAccess.ReadWrite, FileShare.Read)) { // Decompress stream into temp file using (GZipStream gZipStream = new GZipStream(stream, CompressionMode.Decompress, true)) { gZipStream.CopyTo(fs); } // Determine the file type after inflate, add CompressedPssg to make compressed fs.Seek(0, SeekOrigin.Begin); fileType = GetPssgType(fs) + (int)PssgFileType.CompressedPssg; PssgFile pFile = fileType switch { PssgFileType.CompressedPssg => PssgFile.ReadPssg(fs, fileType), PssgFileType.CompressedXml => PssgFile.ReadXml(fs, fileType), _ => throw new FileFormatException("This is not a pssg file.") }; return(pFile); } } finally { // Attempt to delete the temporary file try { File.Delete(tempPath); } catch { } } } }
public static PssgFile Open(Stream stream) { PssgFileType fileType = PssgFile.GetPssgType(stream); if (fileType == PssgFileType.Pssg) { return(PssgFile.ReadPssg(stream, fileType)); } else if (fileType == PssgFileType.Xml) { return(PssgFile.ReadXml(stream)); } else // CompressedPssg { string tempPath = "temp.pssg"; try { FileStream fs = File.Open(tempPath, FileMode.Create, FileAccess.ReadWrite, FileShare.Read); // Decompress stream into temp file using (stream) { using (GZipStream gZipStream = new GZipStream(stream, CompressionMode.Decompress)) { gZipStream.CopyTo(fs); } } // Read temp file, and close it fs.Seek(0, SeekOrigin.Begin); PssgFile pFile = PssgFile.ReadPssg(fs, fileType); return(pFile); } finally { // Attempt to delete the temporary file try { File.Delete(tempPath); } catch { } } } }