/*
    Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public License
    along with this library; see the file COPYING.LIB.  If not, write to
    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301, USA.
*/
#ifndef DNSPREFETCHHELPER_H
#define DNSPREFETCHHELPER_H

#include <QObject>
#include <QCache>
#include <QHostInfo>
#include <QSet>
#include <QString>
#include <QTime>
#include "qwebsettings.h"

namespace WebCore {

    class DnsPrefetchHelper : public QObject {
        Q_OBJECT
    public:
        DnsPrefetchHelper() : QObject(), currentLookups(0) {};

    public slots:
        void lookup(QString hostname)
        {
            if (hostname.isEmpty())
                return; // this actually happens
            if (currentLookups >= 10)
                return; // do not launch more than 10 lookups at the same time

#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 3)
            currentLookups++;
            QHostInfo::lookupHost(hostname, this, SLOT(lookedUp(QHostInfo)));
#else
            // This code is only needed for Qt versions that do not have
            // the small Qt DNS cache yet.

            QTime* entryTime = lookupCache.object(hostname);
            if (entryTime && entryTime->elapsed() > 300*1000) {
                // delete knowledge about lookup if it is already 300 seconds old
                lookupCache.remove(hostname);
            } else if (!entryTime) {
                // not in cache yet, can look it up
                QTime *tmpTime = new QTime();
                *tmpTime = QTime::currentTime();
                lookupCache.insert(hostname, tmpTime);
                currentLookups++;
                QHostInfo::lookupHost(hostname, this, SLOT(lookedUp(QHostInfo)));
            }
#endif
        }

        void lookedUp(const QHostInfo&)
        {
            // we do not cache the result, we throw it away.
            // we currently rely on the OS to cache the results. If it does not do that
            // then at least the ISP nameserver did it.
            // Since Qt 4.6.3, Qt also has a small DNS cache.
            currentLookups--;
        }

    protected:
#if QT_VERSION < QT_VERSION_CHECK(4, 6, 3)
        QCache<QString, QTime> lookupCache; // 100 entries
#endif
        int currentLookups;
    };


}

#endif // DNSPREFETCHHELPER_H
