58 ris::Frame::BufferIterator rBuff;
59 ris::Frame::BufferIterator wBuff;
66 ris::FramePtr newFrame = this->reqFrame(frame->getPayload(),
true);
74 if ((ret = BZ2_bzDecompressInit(&strm, 0, 0)) != BZ_OK)
76 "Error initializing decompressor. ret=%" PRIi32,
80 rBuff = frame->beginBuffer();
81 strm.next_in =
reinterpret_cast<char*
>((*rBuff)->begin());
82 strm.avail_in = (*rBuff)->getPayload();
84 wBuff = newFrame->beginBuffer();
85 strm.next_out =
reinterpret_cast<char*
>((*wBuff)->begin());
86 strm.avail_out = (*wBuff)->getAvailable();
90 ret = BZ2_bzDecompress(&strm);
92 if ((ret != BZ_STREAM_END) && (ret != BZ_OK))
94 "Decompression runtime error %" PRIi32,
97 if (ret == BZ_STREAM_END)
break;
100 if (strm.avail_in == 0) {
101 if ((rBuff + 1) == frame->endBuffer())
103 "StreamUnZip::acceptFrame",
104 "Truncated or corrupt bzip2 stream: decompressor needs more input than available"));
106 strm.next_in =
reinterpret_cast<char*
>((*rBuff)->begin());
107 strm.avail_in = (*rBuff)->getPayload();
111 if (strm.avail_out == 0) {
113 if ((wBuff + 1) == newFrame->endBuffer()) {
114 ris::FramePtr tmpFrame = this->reqFrame(frame->getPayload(),
true);
115 wBuff = newFrame->appendFrame(tmpFrame);
119 strm.next_out =
reinterpret_cast<char*
>((*wBuff)->begin());
120 strm.avail_out = (*wBuff)->getAvailable();
124 BZ2_bzDecompressEnd(&strm);
128 const uint32_t totalOut = strm.total_out_lo32;
129 BZ2_bzDecompressEnd(&strm);
131 newFrame->setPayload(totalOut);
132 newFrame->setError(frame->getError());
133 newFrame->setChannel(frame->getChannel());
134 newFrame->setFlags(frame->getFlags());
136 this->sendFrame(newFrame);
144void ru::StreamUnZip::setup_python() {
147 bp::class_<ru::StreamUnZip, ru::StreamUnZipPtr, bp::bases<ris::Master, ris::Slave>, boost::noncopyable>(
151 bp::implicitly_convertible<ru::StreamUnZipPtr, ris::SlavePtr>();
152 bp::implicitly_convertible<ru::StreamUnZipPtr, ris::MasterPtr>();