Home | History | Annotate | Download | only in qt
      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