| 216 | } |
| 217 | |
| 218 | qint64 QuaZIODevice::readData(char *data, qint64 maxSize) |
| 219 | { |
| 220 | int read = 0; |
| 221 | while (read < maxSize) { |
| 222 | if (d->inBufPos == d->inBufSize) { |
| 223 | d->inBufPos = 0; |
| 224 | d->inBufSize = d->io->read(d->inBuf, QUAZIO_INBUFSIZE); |
| 225 | if (d->inBufSize == -1) { |
| 226 | d->inBufSize = 0; |
| 227 | setErrorString(d->io->errorString()); |
| 228 | return -1; |
| 229 | } |
| 230 | if (d->inBufSize == 0) |
| 231 | break; |
| 232 | } |
| 233 | while (read < maxSize && d->inBufPos < d->inBufSize) { |
| 234 | d->zins.next_in = reinterpret_cast<Bytef *>(d->inBuf + d->inBufPos); |
| 235 | d->zins.avail_in = d->inBufSize - d->inBufPos; |
| 236 | d->zins.next_out = reinterpret_cast<Bytef *>(data + read); |
| 237 | d->zins.avail_out = static_cast<uInt>(maxSize - read); // hope it's less than 2GB |
| 238 | int more = 0; |
| 239 | switch (inflate(&d->zins, Z_SYNC_FLUSH)) { |
| 240 | case Z_OK: |
| 241 | read = reinterpret_cast<char *>(d->zins.next_out) - data; |
| 242 | d->inBufPos = reinterpret_cast<z_const char *>(d->zins.next_in) - d->inBuf; |
| 243 | break; |
| 244 | case Z_STREAM_END: |
| 245 | read = reinterpret_cast<char *>(d->zins.next_out) - data; |
| 246 | d->inBufPos = reinterpret_cast<z_const char *>(d->zins.next_in) - d->inBuf; |
| 247 | d->atEnd = true; |
| 248 | return read; |
| 249 | case Z_BUF_ERROR: // this should never happen, but just in case |
| 250 | if (!d->zBufError) { |
| 251 | qWarning("Z_BUF_ERROR detected with %d/%d in/out, weird", |
| 252 | d->zins.avail_in, d->zins.avail_out); |
| 253 | d->zBufError = true; |
| 254 | } |
| 255 | memmove(d->inBuf, d->inBuf + d->inBufPos, d->inBufSize - d->inBufPos); |
| 256 | d->inBufSize -= d->inBufPos; |
| 257 | d->inBufPos = 0; |
| 258 | more = d->io->read(d->inBuf + d->inBufSize, QUAZIO_INBUFSIZE - d->inBufSize); |
| 259 | if (more == -1) { |
| 260 | setErrorString(d->io->errorString()); |
| 261 | return -1; |
| 262 | } |
| 263 | if (more == 0) |
| 264 | return read; |
| 265 | d->inBufSize += more; |
| 266 | break; |
| 267 | default: |
| 268 | setErrorString(QString::fromLocal8Bit(d->zins.msg)); |
| 269 | return -1; |
| 270 | } |
| 271 | } |
| 272 | } |
| 273 | #ifdef QUAZIP_ZIODEVICE_DEBUG_INPUT |
| 274 | indebug.write(data, read); |
| 275 | #endif |
nothing calls this directly
no test coverage detected