/***********************************************************************
*
* Copyright (c) 2012-2016 Barbara Geller
* Copyright (c) 2012-2016 Ansel Sermersheim
* Copyright (c) 2012-2014 Digia Plc and/or its subsidiary(-ies).
* Copyright (c) 2008-2012 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
*
* This file is part of CopperSpice.
*
* CopperSpice is free software: you can redistribute it and/or 
* modify it under the terms of the GNU Lesser General Public License
* version 2.1 as published by the Free Software Foundation.
*
* CopperSpice 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with CopperSpice.  If not, see 
* <http://www.gnu.org/licenses/>.
*
***********************************************************************/

#ifndef QABSTRACTNETWORKCACHE_H
#define QABSTRACTNETWORKCACHE_H

#include <QtCore/qobject.h>
#include <QtCore/qshareddata.h>
#include <QtCore/qpair.h>
#include <QtNetwork/qnetworkrequest.h>

QT_BEGIN_NAMESPACE

class QIODevice;
class QDateTime;
class QNetworkCacheMetaDataPrivate;
class QAbstractNetworkCachePrivate;
class QUrl;

template<class T> class QList;

class Q_NETWORK_EXPORT QNetworkCacheMetaData
{

 public:
   typedef QPair<QByteArray, QByteArray> RawHeader;
   typedef QList<RawHeader> RawHeaderList;
   typedef QHash<QNetworkRequest::Attribute, QVariant> AttributesMap;

   QNetworkCacheMetaData();
   QNetworkCacheMetaData(const QNetworkCacheMetaData &other);
   ~QNetworkCacheMetaData();

   QNetworkCacheMetaData &operator=(const QNetworkCacheMetaData &other);
   bool operator==(const QNetworkCacheMetaData &other) const;
   inline bool operator!=(const QNetworkCacheMetaData &other) const {
      return !(*this == other);
   }

   bool isValid() const;

   QUrl url() const;
   void setUrl(const QUrl &url);

   RawHeaderList rawHeaders() const;
   void setRawHeaders(const RawHeaderList &headers);

   QDateTime lastModified() const;
   void setLastModified(const QDateTime &dateTime);

   QDateTime expirationDate() const;
   void setExpirationDate(const QDateTime &dateTime);

   bool saveToDisk() const;
   void setSaveToDisk(bool allow);

   AttributesMap attributes() const;
   void setAttributes(const AttributesMap &attributes);

 private:
   friend class QNetworkCacheMetaDataPrivate;
   QSharedDataPointer<QNetworkCacheMetaDataPrivate> d;
};

Q_NETWORK_EXPORT QDataStream &operator<<(QDataStream &, const QNetworkCacheMetaData &);
Q_NETWORK_EXPORT QDataStream &operator>>(QDataStream &, QNetworkCacheMetaData &);


class Q_NETWORK_EXPORT QAbstractNetworkCache : public QObject
{
   NET_CS_OBJECT(QAbstractNetworkCache)

 public:
   virtual ~QAbstractNetworkCache();

   virtual QNetworkCacheMetaData metaData(const QUrl &url) = 0;
   virtual void updateMetaData(const QNetworkCacheMetaData &metaData) = 0;
   virtual QIODevice *data(const QUrl &url) = 0;
   virtual bool remove(const QUrl &url) = 0;
   virtual qint64 cacheSize() const = 0;

   virtual QIODevice *prepare(const QNetworkCacheMetaData &metaData) = 0;
   virtual void insert(QIODevice *device) = 0;

   NET_CS_SLOT_1(Public, virtual void clear() = 0)
   NET_CS_SLOT_2(clear)

 protected:
   explicit QAbstractNetworkCache(QObject *parent = 0);
   QAbstractNetworkCache(QAbstractNetworkCachePrivate &dd, QObject *parent);

   QScopedPointer<QAbstractNetworkCachePrivate> d_ptr;

 private:
   Q_DECLARE_PRIVATE(QAbstractNetworkCache)
   Q_DISABLE_COPY(QAbstractNetworkCache)

};

QT_END_NAMESPACE

#endif
