private void Dispose(bool disposing) { if (!Disposed) { if (disposing) { foreach (var partkv in Parts) { partkv.Value.PartStream?.Dispose(); } Parts.Clear(); InternalDirectories.Clear(); } // TODO: free unmanaged resources (unmanaged objects) and override a finalizer below. // TODO: set large fields to null. Disposed = true; } }
/// <summary> /// The main Load function, the related parts need to be numbered correctly as "archivename_01.vpk" and so forth /// </summary> /// <param name="mainPartStream"></param> /// <param name="filename"></param> /// <param name="version"></param> /// <param name="parts"></param> public void Load(Stream mainPartStream, string filename = "", VpkVersions.Versions version = VpkVersions.Versions.V1, Dictionary <Stream, string> parts = null) { if (Loaded) { throw new NotSupportedException("Tried to call Load on a VpkArchive that is already loaded, dispose and create a new one instead"); } if (string.IsNullOrEmpty(filename)) { filename = "stream_dir.vpk"; } if (version == VpkVersions.Versions.V1) { Reader = new VpkReaderV1(mainPartStream); } else if (version == VpkVersions.Versions.V2) { Reader = new VpkReaderV2(mainPartStream); } var hdr = Reader.ReadArchiveHeader(); if (!hdr.Verify()) { throw new ArchiveParsingException("Invalid archive header"); } //Jvs: moved these down here as we want the header error as soon as possible AddMainPart(filename, mainPartStream); if (parts?.Count > 0) { LoadParts(parts); } InternalDirectories.AddRange(Reader.ReadDirectories(this)); Loaded = true; }