예제 #1
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));
        }
예제 #2
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));
        }
        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);
            }
        }
예제 #5
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);
            }
        }
예제 #6
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);
        }
예제 #7
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));
        }
예제 #8
0
파일: CabUnpacker.cs 프로젝트: massreuy/3P
        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);
        }