12daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch/*
22daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies)
32daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
42daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    This library is free software; you can redistribute it and/or
52daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    modify it under the terms of the GNU Library General Public
62daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    License as published by the Free Software Foundation; either
72daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    version 2 of the License, or (at your option) any later version.
82daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
92daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    This library is distributed in the hope that it will be useful,
102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    but WITHOUT ANY WARRANTY; without even the implied warranty of
112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    Library General Public License for more details.
132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    You should have received a copy of the GNU Library General Public License
152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    along with this library; see the file COPYING.LIB.  If not, write to
162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    Boston, MA 02110-1301, USA.
182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch*/
192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "config.h"
212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "QtMIMETypeSniffer.h"
222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "MIMESniffing.h"
242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <QCoreApplication>
252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <QNetworkReply>
262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochQtMIMETypeSniffer::QtMIMETypeSniffer(QNetworkReply* reply, const QString& advertisedMimeType, bool isSupportedImageType)
282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    : QObject(0)
292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    , m_reply(reply)
302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    , m_mimeType(advertisedMimeType)
312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    , m_sniffer(advertisedMimeType.toLatin1().constData(), isSupportedImageType)
322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    , m_isFinished(false)
332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_isFinished = !m_sniffer.isValid() || sniff();
352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (m_isFinished)
362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    connect(m_reply, SIGNAL(readyRead()), this, SLOT(trySniffing()));
392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    connect(m_reply, SIGNAL(finished()), this, SLOT(trySniffing()));
402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool QtMIMETypeSniffer::sniff()
432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!m_reply->isFinished() && m_reply->bytesAvailable() < m_sniffer.dataSize())
452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    QByteArray data = m_reply->peek(m_sniffer.dataSize());
482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    const char* sniffedMimeType = m_sniffer.sniff(data.constData(), data.size());
492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (sniffedMimeType)
502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_mimeType = QString::fromLatin1(sniffedMimeType);
512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return true;
522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid QtMIMETypeSniffer::trySniffing()
552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!sniff())
572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_reply->disconnect(this);
602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    QCoreApplication::removePostedEvents(this, QEvent::MetaCall);
612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_isFinished = true;
622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    emit finished();
632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
64