25 #include <QtCore/QFile>
27 #define BUFFER_SIZE 8*1024
29 class KFilterDev::Private
32 Private() : bNeedHeader(
true), bSkipHeaders(
false),
33 autoDeleteFilterBase(
false), bOpenedUnderlyingDevice(
false),
37 bool autoDeleteFilterBase;
38 bool bOpenedUnderlyingDevice;
41 QByteArray origFileName;
46 KFilterDev::KFilterDev(
KFilterBase * _filter,
bool autoDeleteFilterBase )
51 d->autoDeleteFilterBase = autoDeleteFilterBase;
58 if ( d->autoDeleteFilterBase )
67 QFile * f =
new QFile( fileName );
91 base->
setDevice(inDevice, autoDeleteInDevice);
100 qWarning() <<
"KFilterDev::open: device is already open";
104 if ( mode == QIODevice::ReadOnly )
111 d->filter->setOutBuffer( d->buffer.data(), d->buffer.size() );
113 d->bNeedHeader = !d->bSkipHeaders;
115 d->filter->init( mode );
116 d->bOpenedUnderlyingDevice = !d->filter->device()->isOpen();
117 bool ret = d->bOpenedUnderlyingDevice ? d->filter->device()->open( mode ) :
true;
121 qWarning() <<
"KFilterDev::open: Couldn't open underlying device";
132 if ( d->filter->mode() == QIODevice::WriteOnly )
136 d->filter->terminate();
137 if ( d->bOpenedUnderlyingDevice )
138 d->filter->device()->close();
139 setOpenMode( QIODevice::NotOpen );
144 qint64 ioIndex = this->pos();
145 if ( ioIndex == pos )
150 Q_ASSERT ( d->filter->mode() == QIODevice::ReadOnly );
155 d->bNeedHeader = !d->bSkipHeaders;
157 d->filter->setInBuffer(0L,0);
160 return d->filter->device()->reset();
175 d->bIgnoreData =
true;
176 bool result = ( read( dummy.data(), pos ) == pos );
177 d->bIgnoreData =
false;
186 && d->filter->device()->atEnd();
191 Q_ASSERT ( d->filter->mode() == QIODevice::ReadOnly );
195 uint dataReceived = 0;
207 if ( d->bIgnoreData )
213 outBufferSize = maxlen;
215 outBufferSize -= dataReceived;
216 qint64 availOut = outBufferSize;
217 filter->setOutBuffer( data, outBufferSize );
219 while ( dataReceived < maxlen )
221 if (filter->inBufferEmpty())
227 int size = filter->device()->read( d->buffer.data(),
231 filter->setInBuffer( d->buffer.data(), size );
239 (void) filter->readHeader();
240 d->bNeedHeader =
false;
243 d->result = filter->uncompress();
247 qWarning() <<
"KFilterDev: Error when uncompressing data";
252 uint outReceived = availOut - filter->outBufferAvailable();
254 if( availOut < (uint)filter->outBufferAvailable() )
255 qWarning() <<
" last availOut " << availOut <<
" smaller than new avail_out=" << filter->outBufferAvailable() <<
" !";
257 dataReceived += outReceived;
258 if ( !d->bIgnoreData )
261 availOut = maxlen - dataReceived;
263 else if ( maxlen - dataReceived < outBufferSize )
265 availOut = maxlen - dataReceived;
272 filter->setOutBuffer( data, availOut );
281 Q_ASSERT ( filter->
mode() == QIODevice::WriteOnly );
286 bool finish = (data == 0L);
293 d->bNeedHeader =
false;
297 uint dataWritten = 0;
299 while ( dataWritten < len || finish )
302 d->result = filter->
compress( finish );
306 qWarning() <<
"KFilterDev: Error when compressing data";
321 dataWritten += wrote;
323 availIn = len - dataWritten;
336 int size = filter->
device()->write( d->buffer.data(), towrite );
337 if ( size != towrite ) {
338 qWarning() <<
"KFilterDev::write. Could only write " << size <<
" out of " << towrite <<
" bytes";
351 filter->
setOutBuffer( d->buffer.data(), d->buffer.size() );
360 d->origFileName = fileName;
365 d->bSkipHeaders =
true;