• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
QtMIMETypeSniffer(QNetworkReply * reply,const QString & advertisedMimeType,bool isSupportedImageType)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 
sniff()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 
trySniffing()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