/***********************************************************************
*
* 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 QNETWORKREQUEST_H
#define QNETWORKREQUEST_H

#include <QtCore/QSharedDataPointer>
#include <QtCore/QString>
#include <QtCore/QUrl>
#include <QtCore/QVariant>

QT_BEGIN_NAMESPACE

class QSslConfiguration;
class QNetworkRequestPrivate;

class Q_NETWORK_EXPORT QNetworkRequest
{
 public:
   enum KnownHeaders {
      ContentTypeHeader,
      ContentLengthHeader,
      LocationHeader,
      LastModifiedHeader,
      CookieHeader,
      SetCookieHeader,
      ContentDispositionHeader  // added for QMultipartMessage
   };
   enum Attribute {
      HttpStatusCodeAttribute,
      HttpReasonPhraseAttribute,
      RedirectionTargetAttribute,
      ConnectionEncryptedAttribute,
      CacheLoadControlAttribute,
      CacheSaveControlAttribute,
      SourceIsFromCacheAttribute,
      DoNotBufferUploadDataAttribute,
      HttpPipeliningAllowedAttribute,
      HttpPipeliningWasUsedAttribute,
      CustomVerbAttribute,
      CookieLoadControlAttribute,
      AuthenticationReuseAttribute,
      CookieSaveControlAttribute,
      MaximumDownloadBufferSizeAttribute, // internal
      DownloadBufferAttribute, // internal
      SynchronousRequestAttribute, // internal

      User = 1000,
      UserMax = 32767
   };
   enum CacheLoadControl {
      AlwaysNetwork,
      PreferNetwork,
      PreferCache,
      AlwaysCache
   };
   enum LoadControl {
      Automatic = 0,
      Manual
   };

   enum Priority {
      HighPriority = 1,
      NormalPriority = 3,
      LowPriority = 5
   };

   explicit QNetworkRequest(const QUrl &url = QUrl());
   QNetworkRequest(const QNetworkRequest &other);
   ~QNetworkRequest();
   QNetworkRequest &operator=(const QNetworkRequest &other);

   bool operator==(const QNetworkRequest &other) const;
   inline bool operator!=(const QNetworkRequest &other) const {
      return !operator==(other);
   }

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

   // "cooked" headers
   QVariant header(KnownHeaders header) const;
   void setHeader(KnownHeaders header, const QVariant &value);

   // raw headers:
   bool hasRawHeader(const QByteArray &headerName) const;
   QList<QByteArray> rawHeaderList() const;
   QByteArray rawHeader(const QByteArray &headerName) const;
   void setRawHeader(const QByteArray &headerName, const QByteArray &value);

   // attributes
   QVariant attribute(Attribute code, const QVariant &defaultValue = QVariant()) const;
   void setAttribute(Attribute code, const QVariant &value);

#ifndef QT_NO_OPENSSL
   QSslConfiguration sslConfiguration() const;
   void setSslConfiguration(const QSslConfiguration &configuration);
#endif

   void setOriginatingObject(QObject *object);
   QObject *originatingObject() const;

   Priority priority() const;
   void setPriority(Priority priority);

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

QT_END_NAMESPACE

Q_DECLARE_METATYPE(QNetworkRequest)

#endif
