Exemplo n.º 1
0
        internal virtual int CabOpenStreamEx(string path, int openFlags, int shareMode, out int err, IntPtr pv)
        {
            path = path.Trim();
            var stream = CabStream;

            CabStream = new DuplicateStream(stream);
            var streamHandle = StreamHandles.AllocHandle(stream);

            err = 0;
            return(streamHandle);
        }
Exemplo n.º 2
0
        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));
        }
Exemplo n.º 3
0
        internal override int CabCloseStreamEx(int streamHandle, out int err, IntPtr pv)
        {
            Stream stream = DuplicateStream.OriginalStream(this.StreamHandles[streamHandle]);

            if (stream == DuplicateStream.OriginalStream(this.FileStream))
            {
                this.context.CloseFileReadStream(this.currentFileName, stream);
                this.FileStream = null;
                long remainder = this.currentFileTotalBytes - this.currentFileBytesProcessed;
                this.currentFileBytesProcessed += remainder;
                this.fileBytesProcessed        += remainder;
                this.OnProgress(ArchiveProgressType.FinishFile);

                this.currentFileTotalBytes     = 0;
                this.currentFileBytesProcessed = 0;
                this.currentFileName           = null;
            }
            else if (stream == DuplicateStream.OriginalStream(this.CabStream))
            {
                if (stream.CanWrite)
                {
                    stream.Flush();
                }

                this.currentArchiveBytesProcessed = this.currentArchiveTotalBytes;
                this.OnProgress(ArchiveProgressType.FinishArchive);
                this.currentArchiveNumber++;
                this.totalArchives++;

                this.context.CloseArchiveWriteStream(
                    this.currentArchiveNumber,
                    this.currentArchiveName,
                    stream);

                this.currentArchiveName                    = this.NextCabinetName;
                this.currentArchiveBytesProcessed          = this.currentArchiveTotalBytes = 0;
                this.totalFolderBytesProcessedInCurrentCab = 0;

                this.CabStream = null;
            }
            else  // Must be a temp stream
            {
#if CORECLR
                stream.Dispose();
#else
                stream.Close();
#endif
                this.tempStreams.Remove(stream);
            }
            return(base.CabCloseStreamEx(streamHandle, out err, pv));
        }
Exemplo n.º 4
0
        internal override int CabCloseStreamEx(int streamHandle, out int err, IntPtr pv)
        {
            Stream stream = DuplicateStream.OriginalStream(StreamHandles[streamHandle]);

            if (stream == DuplicateStream.OriginalStream(FileStream))
            {
                context.CloseFileReadStream(currentFileName, stream);
                FileStream = null;
                long remainder = currentFileTotalBytes - currentFileBytesProcessed;
                currentFileBytesProcessed += remainder;
                fileBytesProcessed        += remainder;
                OnProgress(ArchiveProgressType.FinishFile);

                currentFileTotalBytes     = 0;
                currentFileBytesProcessed = 0;
                currentFileName           = null;
            }
            else if (stream == DuplicateStream.OriginalStream(CabStream))
            {
                if (stream.CanWrite)
                {
                    stream.Flush();
                }

                currentArchiveBytesProcessed = currentArchiveTotalBytes;
                OnProgress(ArchiveProgressType.FinishArchive);
                currentArchiveNumber++;
                totalArchives++;

                context.CloseArchiveWriteStream(
                    currentArchiveNumber,
                    currentArchiveName,
                    stream);

                currentArchiveName                    = NextCabinetName;
                currentArchiveBytesProcessed          = currentArchiveTotalBytes = 0;
                totalFolderBytesProcessedInCurrentCab = 0;

                CabStream = null;
            }
            else   // Must be a temp stream
            {
                stream.Close();
                tempStreams.Remove(stream);
            }

            return(base.CabCloseStreamEx(streamHandle, out err, pv));
        }
Exemplo n.º 5
0
        public async Task HappyFlow()
        {
            Stream inputStream = FixedTestData.CreateStream();
            IPipe <Packet <byte> > duplicateBuffer = new BatchingPipe <Packet <byte> >();

            DuplicateStream sut = new DuplicateStream(inputStream, duplicateBuffer.ToWriteOnlyStream());

            // As sut is read for assertion, in the process it should start to write data to duplication destination
            Task assertSutStream = Task.Run(() => FixedTestData.AssertStream(sut));

            // Thus with next task we should be able to assert both streams at the same time.
            Task assertDuplicatedStream = Task.Run(() => FixedTestData.AssertStream(duplicateBuffer.ToReadOnlyStream()));

            await assertSutStream;
            await assertDuplicatedStream;
        }
Exemplo n.º 6
0
 protected virtual Handle CabOpenStreamEx(string path, int openFlags, int shareMode, out int err, Pointer pv)
 {
     try
     {
         Stream stream = null;
         path = path.Trim();
         if (path == CabBase.STREAM_CAB)
         {
             stream         = this.cabStream;
             this.cabStream = new DuplicateStream(stream);
         }
         else if (path == CabBase.STREAM_FILE)
         {
             stream          = this.fileStream;
             this.fileStream = new DuplicateStream(stream);
         }
                 #if !CABEXTRACTONLY
         else if (path == CabBase.STREAM_TEMP)
         {
             // Opening memory stream for a temp file.
             stream = new MemoryStream();
             this.tempStreams.Add(stream);
         }
         else
         {
             // Opening a file on disk for a temp file.
             path   = Path.Combine(Path.GetTempPath(), path);
             stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
             this.tempStreams.Add(stream);
             //
             stream = new DuplicateStream(stream);
         }
                 #endif
         Handle hStream = streamHandles.AllocHandle(stream);
         err = 0;
         return(hStream);
     }
     catch (Exception ex)
     {
         if (this.abortException == null)
         {
             this.abortException = ex;
         }
         err = Marshal.GetHRForException(ex);
         return((Handle)0);
     }
 }
        internal override int CabCloseStreamEx(int streamHandle, out int err, IntPtr pv)
        {
            Stream stream = DuplicateStream.OriginalStream(base.StreamHandles[streamHandle]);

            if (stream == DuplicateStream.OriginalStream(base.CabStream))
            {
                if (folderId != -3)
                {
                    OnProgress(ArchiveProgressType.FinishArchive);
                }
                context.CloseArchiveReadStream(currentArchiveNumber, currentArchiveName, stream);
                currentArchiveName           = base.NextCabinetName;
                currentArchiveBytesProcessed = (currentArchiveTotalBytes = 0L);
                base.CabStream = null;
            }
            return(base.CabCloseStreamEx(streamHandle, out err, pv));
        }
        internal override int CabReadStreamEx(int streamHandle, IntPtr memory, int cb, out int err, IntPtr pv)
        {
            int result = base.CabReadStreamEx(streamHandle, memory, cb, out err, pv);

            checked
            {
                if (err == 0 && base.CabStream != null && fileList == null && DuplicateStream.OriginalStream(base.StreamHandles[streamHandle]) == DuplicateStream.OriginalStream(base.CabStream))
                {
                    currentArchiveBytesProcessed += cb;
                    if (currentArchiveBytesProcessed > currentArchiveTotalBytes)
                    {
                        currentArchiveBytesProcessed = currentArchiveTotalBytes;
                    }
                }
                return(result);
            }
        }
Exemplo n.º 9
0
        internal override int CabWriteStreamEx(int streamHandle, IntPtr memory, int cb, out int err, IntPtr pv)
        {
            int num = base.CabWriteStreamEx(streamHandle, memory, cb, out err, pv);

            checked
            {
                if (num > 0 && err == 0 && DuplicateStream.OriginalStream(base.StreamHandles[streamHandle]) == DuplicateStream.OriginalStream(base.CabStream))
                {
                    currentArchiveBytesProcessed += cb;
                    if (currentArchiveBytesProcessed > currentArchiveTotalBytes)
                    {
                        currentArchiveBytesProcessed = currentArchiveTotalBytes;
                    }
                }
                return(num);
            }
        }
Exemplo n.º 10
0
 internal override int CabOpenStreamEx(string path, int openFlags, int shareMode, out int err, IntPtr pv)
 {
     if (base.CabNumbers.ContainsKey(path))
     {
         Stream cabStream = base.CabStream;
         if (cabStream == null)
         {
             short num = base.CabNumbers[path];
             currentFolderTotalBytes = 0L;
             cabStream = context.OpenArchiveWriteStream(num, path, truncate: true, base.CabEngine);
             if (cabStream == null)
             {
                 throw new FileNotFoundException(string.Format(CultureInfo.InvariantCulture, "Cabinet {0} not provided.", num));
             }
             currentArchiveName           = path;
             currentArchiveTotalBytes     = Math.Min(totalFolderBytesProcessedInCurrentCab, maxCabBytes);
             currentArchiveBytesProcessed = 0L;
             OnProgress(ArchiveProgressType.StartArchive);
             base.CabStream = cabStream;
         }
         path = "%%CAB%%";
     }
     else
     {
         if (path == "%%TEMP%%")
         {
             Stream stream = new MemoryStream();
             tempStreams.Add(stream);
             int result = base.StreamHandles.AllocHandle(stream);
             err = 0;
             return(result);
         }
         if (path != "%%CAB%%")
         {
             path = Path.Combine(Path.GetTempPath(), path);
             Stream stream2 = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
             tempStreams.Add(stream2);
             stream2 = new DuplicateStream(stream2);
             int result2 = base.StreamHandles.AllocHandle(stream2);
             err = 0;
             return(result2);
         }
     }
     return(base.CabOpenStreamEx(path, openFlags, shareMode, out err, pv));
 }
Exemplo n.º 11
0
        internal override int CabWriteStreamEx(int streamHandle, IntPtr memory, int cb, out int err, IntPtr pv)
        {
            int count = base.CabWriteStreamEx(streamHandle, memory, cb, out err, pv);

            if (count > 0 && err == 0)
            {
                Stream stream = this.StreamHandles[streamHandle];
                if (DuplicateStream.OriginalStream(stream) ==
                    DuplicateStream.OriginalStream(this.CabStream))
                {
                    this.currentArchiveBytesProcessed += cb;
                    if (this.currentArchiveBytesProcessed > this.currentArchiveTotalBytes)
                    {
                        this.currentArchiveBytesProcessed = this.currentArchiveTotalBytes;
                    }
                }
            }
            return(count);
        }
Exemplo n.º 12
0
        private int CabGetOpenInfo(
            string path,
            out short date,
            out short time,
            out short attribs,
            out int err,
            IntPtr pv)
        {
            CompressionEngine.DateTimeToDOSDateAndTime(_fileLastWriteTime, out date, out time);
            attribs = (short)_fileAttributes;

            var stream = FileStream;

            FileStream = new DuplicateStream(stream);
            var streamHandle = StreamHandles.AllocHandle(stream);

            err = 0;
            return(streamHandle);
        }
Exemplo n.º 13
0
        internal override int CabCloseStreamEx(int streamHandle, out int err, IntPtr pv)
        {
            Stream stream = DuplicateStream.OriginalStream(this.StreamHandles[streamHandle]);

            if (stream == DuplicateStream.OriginalStream(this.CabStream))
            {
                if (this.folderId != -3)  // -3 is a special folderId that requires re-opening the same cab
                {
                    this.OnProgress(ArchiveProgressType.FinishArchive);
                }

                this.context.CloseArchiveReadStream(this.currentArchiveNumber, this.currentArchiveName, stream);

                this.currentArchiveName           = this.NextCabinetName;
                this.currentArchiveBytesProcessed = this.currentArchiveTotalBytes = 0;

                this.CabStream = null;
            }
            return(base.CabCloseStreamEx(streamHandle, out err, pv));
        }
Exemplo n.º 14
0
        internal override int CabReadStreamEx(int streamHandle, IntPtr memory, int cb, out int err, IntPtr pv)
        {
            int count = base.CabReadStreamEx(streamHandle, memory, cb, out err, pv);

            if (err == 0 && CabStream != null)
            {
                if (fileList == null)
                {
                    Stream stream = StreamHandles[streamHandle];
                    if (DuplicateStream.OriginalStream(stream) ==
                        DuplicateStream.OriginalStream(CabStream))
                    {
                        currentArchiveBytesProcessed += cb;
                        if (currentArchiveBytesProcessed > currentArchiveTotalBytes)
                        {
                            currentArchiveBytesProcessed = currentArchiveTotalBytes;
                        }
                    }
                }
            }
            return(count);
        }
Exemplo n.º 15
0
        internal override int CabOpenStreamEx(string path, int openFlags, int shareMode, out int err, IntPtr pv)
        {
            if (this.CabNumbers.ContainsKey(path))
            {
                Stream stream = this.CabStream;
                if (stream == null)
                {
                    short cabNumber = this.CabNumbers[path];

                    this.currentFolderTotalBytes = 0;

                    stream = this.context.OpenArchiveWriteStream(cabNumber, path, true, this.CabEngine);
                    if (stream == null)
                    {
                        throw new FileNotFoundException(
                            String.Format(CultureInfo.InvariantCulture, "Cabinet {0} not provided.", cabNumber));
                    }
                    this.currentArchiveName = path;

                    this.currentArchiveTotalBytes = Math.Min(
                        this.totalFolderBytesProcessedInCurrentCab, this.maxCabBytes);
                    this.currentArchiveBytesProcessed = 0;

                    this.OnProgress(ArchiveProgressType.StartArchive);
                    this.CabStream = stream;
                }
                path = CabWorker.CabStreamName;
            }
            else if (path == CabPacker.TempStreamName)
            {
                // Opening memory stream for a temp file.
                Stream stream = new MemoryStream();
                this.tempStreams.Add(stream);
                int streamHandle = this.StreamHandles.AllocHandle(stream);
                err = 0;
                return streamHandle;
            }
            else if (path != CabWorker.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);
                this.tempStreams.Add(stream);
                stream = new DuplicateStream(stream);
                int streamHandle = this.StreamHandles.AllocHandle(stream);
                err = 0;
                return streamHandle;
            }
            return base.CabOpenStreamEx(path, openFlags, shareMode, out err, pv);
        }