[Development] QIODevice::peek is not virtual. Workaround proposed

Stephen Kelly stephen.kelly at kdab.com
Fri Sep 20 13:31:30 CEST 2013


Hello,

In grantlee there is a example called htmlapps, which creates a QNetworkReply 
subclass to render a template.

 https://gitorious.org/grantlee/grantlee/source/master:examples/htmlapps/templatereply.cpp
24d711fc3ac88565a59c45fb6fb2dd1e75a7a9f2
This works with Qt 4.7, but the QWebView displays no content with Qt 4.8 (or 
with the Qt 5 port).

The problem seems to be that in Qt 4.8, the file

 src/3rdparty/webkit/Source/WebCore/platform/network/qt/QtMIMETypeSniffer.cpp

gained a new line:

 QByteArray data = m_reply->peek(m_sniffer.dataSize());

So, it calls peek() on the QNetworkReply object.

Unfortunately, peek() is non-virtual and it is implemented with a call to 
read(). For a QIODevice subclass implementation of read(), it does not know 
whether the call to read should advance its read-pointer (it should not if it 
is actually a peek). 

The solution is to make peek() virtual. This should have happened for Qt 5.0, 
but it did not. All Qt subclasses of QIODevice seem to re-implement a private 
virtual for this purpose, so the issue seems to be long-known. I have pushed a 
patch to add pseudo-virtual slots as a workaround:

 https://codereview.qt-project.org/66023

Any better ideas? Should such a workaround be applied to the Qt 4.8 branch?

Thanks,

-- 
Join us in October at Qt Developer Days 2013 - https://devdays.kdab.com

Stephen Kelly <stephen.kelly at kdab.com> | Software Engineer
KDAB (Deutschland) GmbH & Co.KG, a KDAB Group Company
www.kdab.com || Germany +49-30-521325470 || Sweden (HQ) +46-563-540090
KDAB - Qt Experts - Platform-Independent Software Solutions
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 4842 bytes
Desc: not available
URL: <http://lists.qt-project.org/pipermail/development/attachments/20130920/bcd61386/attachment.bin>


More information about the Development mailing list