internal override int CabOpenStreamEx(string path, int openFlags, int shareMode, out int err, IntPtr pv) { if (CabNumbers.ContainsKey(path)) { Stream stream = CabStream; if (stream == null) { short cabNumber = CabNumbers[path]; stream = context.OpenArchiveReadStream(cabNumber, path, CabEngine); if (stream == null) { throw new FileNotFoundException(String.Format(CultureInfo.InvariantCulture, "Cabinet {0} not provided.", cabNumber)); } currentArchiveName = path; currentArchiveNumber = cabNumber; if (this.totalArchives <= currentArchiveNumber) { int totalArchives = currentArchiveNumber + 1; this.totalArchives = (short)totalArchives; } currentArchiveTotalBytes = stream.Length; currentArchiveBytesProcessed = 0; if (folderId != -3) // -3 is a special folderId that requires re-opening the same cab { OnProgress(ArchiveProgressType.StartArchive); } CabStream = stream; } path = CabStreamName; } return(base.CabOpenStreamEx(path, openFlags, shareMode, out err, pv)); }
internal override int CabOpenStreamEx(string path, int openFlags, int shareMode, out int err, IntPtr pv) { if (CabNumbers.ContainsKey(path)) { Stream stream = CabStream; if (stream == null) { short cabNumber = CabNumbers[path]; currentFolderTotalBytes = 0; stream = context.OpenArchiveWriteStream(cabNumber, path, true, CabEngine); if (stream == null) { throw new FileNotFoundException( String.Format(CultureInfo.InvariantCulture, "Cabinet {0} not provided.", cabNumber)); } currentArchiveName = path; currentArchiveTotalBytes = Math.Min( totalFolderBytesProcessedInCurrentCab, maxCabBytes); currentArchiveBytesProcessed = 0; OnProgress(ArchiveProgressType.StartArchive); CabStream = stream; } path = CabStreamName; } else if (path == TempStreamName) { // Opening memory stream for a temp file. Stream stream = new MemoryStream(); tempStreams.Add(stream); int streamHandle = StreamHandles.AllocHandle(stream); err = 0; return(streamHandle); } else if (path != CabStreamName) { // Opening a file on disk for a temp file. path = Path.Combine(Path.GetTempPath(), path); Stream stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite); tempStreams.Add(stream); stream = new DuplicateStream(stream); int streamHandle = StreamHandles.AllocHandle(stream); err = 0; return(streamHandle); } return(base.CabOpenStreamEx(path, openFlags, shareMode, out err, pv)); }