1/* 2 Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies) 3 4 This library is free software; you can redistribute it and/or 5 modify it under the terms of the GNU Library General Public 6 License as published by the Free Software Foundation; either 7 version 2 of the License, or (at your option) any later version. 8 9 This library is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 Library General Public License for more details. 13 14 You should have received a copy of the GNU Library General Public License 15 along with this library; see the file COPYING.LIB. If not, write to 16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 17 Boston, MA 02110-1301, USA. 18*/ 19 20#include "config.h" 21#include "QtMIMETypeSniffer.h" 22 23#include "MIMESniffing.h" 24#include <QCoreApplication> 25#include <QNetworkReply> 26 27QtMIMETypeSniffer::QtMIMETypeSniffer(QNetworkReply* reply, const QString& advertisedMimeType, bool isSupportedImageType) 28 : QObject(0) 29 , m_reply(reply) 30 , m_mimeType(advertisedMimeType) 31 , m_sniffer(advertisedMimeType.toLatin1().constData(), isSupportedImageType) 32 , m_isFinished(false) 33{ 34 m_isFinished = !m_sniffer.isValid() || sniff(); 35 if (m_isFinished) 36 return; 37 38 connect(m_reply, SIGNAL(readyRead()), this, SLOT(trySniffing())); 39 connect(m_reply, SIGNAL(finished()), this, SLOT(trySniffing())); 40} 41 42bool QtMIMETypeSniffer::sniff() 43{ 44 // See QNetworkReplyWrapper::setFinished(). 45 const bool isReplyFinished = m_reply->property("_q_isFinished").toBool(); 46 47 if (!isReplyFinished && m_reply->bytesAvailable() < m_sniffer.dataSize()) 48 return false; 49 50 QByteArray data = m_reply->peek(m_sniffer.dataSize()); 51 const char* sniffedMimeType = m_sniffer.sniff(data.constData(), data.size()); 52 if (sniffedMimeType) 53 m_mimeType = QString::fromLatin1(sniffedMimeType); 54 return true; 55} 56 57void QtMIMETypeSniffer::trySniffing() 58{ 59 if (!sniff()) 60 return; 61 62 m_reply->disconnect(this); 63 QCoreApplication::removePostedEvents(this, QEvent::MetaCall); 64 m_isFinished = true; 65 emit finished(); 66} 67