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 27 QtMIMETypeSniffer::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 42 bool QtMIMETypeSniffer::sniff() 43 { 44 if (!m_reply->isFinished() && m_reply->bytesAvailable() < m_sniffer.dataSize()) 45 return false; 46 47 QByteArray data = m_reply->peek(m_sniffer.dataSize()); 48 const char* sniffedMimeType = m_sniffer.sniff(data.constData(), data.size()); 49 if (sniffedMimeType) 50 m_mimeType = QString::fromLatin1(sniffedMimeType); 51 return true; 52 } 53 54 void QtMIMETypeSniffer::trySniffing() 55 { 56 if (!sniff()) 57 return; 58 59 m_reply->disconnect(this); 60 QCoreApplication::removePostedEvents(this, QEvent::MetaCall); 61 m_isFinished = true; 62 emit finished(); 63 } 64