HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress) { if (!m_InStream.Create(kBufferSize)) return E_OUTOFMEMORY; if (!m_OutStream.Create(kBufferSize)) return E_OUTOFMEMORY; m_InStream.SetStream(inStream); m_InStream.Init(); m_OutStream.SetStream(outStream); m_OutStream.Init(); CDecoderFlusher flusher(this); bool isBZ; RINOK(DecodeFile(isBZ, progress)); return isBZ ? S_OK: S_FALSE; }
HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, ICompressProgressInfo *progress) { IsBz = false; BzWasFinished = false; CrcError = false; try { if (!Base.BitDecoder.Create(kBufferSize)) return E_OUTOFMEMORY; if (!m_OutStream.Create(kBufferSize)) return E_OUTOFMEMORY; if (inStream) Base.BitDecoder.SetStream(inStream); CDecoderFlusher flusher(this); if (_needInStreamInit) { Base.BitDecoder.Init(); _needInStreamInit = false; } _inStart = Base.BitDecoder.GetProcessedSize(); Base.BitDecoder.AlignToByte(); m_OutStream.SetStream(outStream); m_OutStream.Init(); RINOK(DecodeFile(progress)); flusher.NeedFlush = false; return Flush(); } catch(const CInBufferException &e) { return e.ErrorCode; } catch(const COutBufferException &e) { return e.ErrorCode; } catch(...) { return E_FAIL; } }
HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, bool &isBZ, ICompressProgressInfo *progress) { isBZ = false; try { if (!m_InStream.Create(kBufferSize)) return E_OUTOFMEMORY; if (!m_OutStream.Create(kBufferSize)) return E_OUTOFMEMORY; if (inStream) m_InStream.SetStream(inStream); CDecoderFlusher flusher(this, inStream != NULL); if (_needInStreamInit) { m_InStream.Init(); _needInStreamInit = false; } _inStart = m_InStream.GetProcessedSize(); m_InStream.AlignToByte(); m_OutStream.SetStream(outStream); m_OutStream.Init(); RINOK(DecodeFile(isBZ, progress)); flusher.NeedFlush = false; return Flush(); } catch(const CInBufferException &e) { return e.ErrorCode; } catch(const COutBufferException &e) { return e.ErrorCode; } catch(...) { return E_FAIL; } }
int pfs_close(int filedes) {//flush if(filedes>=fdnum) return -1; int ofI = 0; while((ofI < ofnum)&&(openfiles[ofI]->fd != filedes)) ofI++; if(ofI == ofnum) return -1; OpenFile* of = openfiles[ofI]; int cI; for(cI=0;cI<CLIENT_CACHE_LINES;cI++) if(metacache[cI][0]!=0) flusher(); int i; for(i=ofI;i<ofnum-1;i++) openfiles[i] = openfiles[i+1]; ofnum--; free(of); return 0; }
HRESULT CEncoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress) { #ifdef COMPRESS_BZIP2_MT Progress = progress; RINOK(Create()); for (UInt32 t = 0; t < NumThreads; t++) #endif { #ifdef COMPRESS_BZIP2_MT CThreadInfo &ti = ThreadsInfo[t]; ti.StreamWasFinishedEvent.Reset(); ti.WaitingWasStartedEvent.Reset(); ti.CanWriteEvent.Reset(); #else CThreadInfo &ti = ThreadsInfo; ti.Encoder = this; #endif ti.m_OptimizeNumTables = m_OptimizeNumTables; if (!ti.Alloc()) return E_OUTOFMEMORY; } if (!m_InStream.Create(kBufferSize)) return E_OUTOFMEMORY; if (!m_OutStream.Create(kBufferSize)) return E_OUTOFMEMORY; m_InStream.SetStream(inStream); m_InStream.Init(); m_OutStream.SetStream(outStream); m_OutStream.Init(); CFlusher flusher(this); CombinedCRC.Init(); #ifdef COMPRESS_BZIP2_MT NextBlockIndex = 0; StreamWasFinished = false; CloseThreads = false; CanStartWaitingEvent.Reset(); #endif WriteByte(kArSig0); WriteByte(kArSig1); WriteByte(kArSig2); WriteByte((Byte)(kArSig3 + m_BlockSizeMult)); #ifdef COMPRESS_BZIP2_MT if (MtMode) { ThreadsInfo[0].CanWriteEvent.Set(); Result = S_OK; CanProcessEvent.Set(); UInt32 t; for (t = 0; t < NumThreads; t++) ThreadsInfo[t].StreamWasFinishedEvent.Lock(); CanProcessEvent.Reset(); CanStartWaitingEvent.Set(); for (t = 0; t < NumThreads; t++) ThreadsInfo[t].WaitingWasStartedEvent.Lock(); CanStartWaitingEvent.Reset(); RINOK(Result); } else #endif { for (;;) { CThreadInfo &ti = #ifdef COMPRESS_BZIP2_MT ThreadsInfo[0]; #else ThreadsInfo; #endif UInt32 blockSize = ReadRleBlock(ti.m_Block); if (blockSize == 0) break; RINOK(ti.EncodeBlock3(blockSize)); if (progress) { UInt64 packSize = m_InStream.GetProcessedSize(); UInt64 unpackSize = m_OutStream.GetProcessedSize(); RINOK(progress->SetRatioInfo(&packSize, &unpackSize)); } } } WriteByte(kFinSig0); WriteByte(kFinSig1); WriteByte(kFinSig2); WriteByte(kFinSig3); WriteByte(kFinSig4); WriteByte(kFinSig5); WriteCRC(CombinedCRC.GetDigest()); return S_OK; }