static boolean istream_fill_input_buffer(j_decompress_ptr cinfo)
{
    SourceManager *sourceManager = reinterpret_cast<SourceManager*>(cinfo->src);

    sourceManager->is->read(sourceManager->buffer, BUFFERSIZE);

    cinfo->src->next_input_byte = 
        reinterpret_cast<const JOCTET*>(sourceManager->buffer);

    if (sourceManager->is->gcount() == 0)
    {
        /* Insert a fake EOI marker */
        sourceManager->buffer[0] = JOCTET(0xFF);
        sourceManager->buffer[1] = JOCTET(JPEG_EOI);
        cinfo->src->bytes_in_buffer = 2;
    }
    else
        cinfo->src->bytes_in_buffer = sourceManager->is->gcount();

    return TRUE;
}
boolean fill_input_buffer(j_decompress_ptr cinfo)
{
    my_source_mgr* src = (my_source_mgr*)cinfo->src;
    Q_ASSERT(src->inDevice);
    int readSize       = src->inDevice->read((char*)src->buffer, BUFFER_SIZE);
    if (readSize > 0)
    {
        src->pub.next_input_byte = src->buffer;
        src->pub.bytes_in_buffer = readSize;
    }
    else
    {
        /**
        * JPEG file is broken. We feed the decoder with fake EOI, as specified
        * in the libjpeg documentation.
        */
        static JOCTET fakeEOI[2] = { JOCTET(0xFF), JOCTET(JPEG_EOI)};
        kWarning() << "Image is incomplete";
        src->pub.next_input_byte = fakeEOI;
        src->pub.bytes_in_buffer = 2;
    }
    return true;
}