/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#include <QtCore/qurl.h>
#include <QtCore/qvariant.h>
#include <QtCore/QPointer>

#include <qmediaplaylist.h>
#include "qmediacontent.h"

QT_BEGIN_NAMESPACE

static void qRegisterMediaContentMetaTypes()
{
    qRegisterMetaType<QMediaContent>();
}

Q_CONSTRUCTOR_FUNCTION(qRegisterMediaContentMetaTypes)


class QMediaContentPrivate : public QSharedData
{
public:
    QMediaContentPrivate():
        isPlaylistOwned(false)
    {}

#if QT_DEPRECATED_SINCE(6, 0)
    QMediaContentPrivate(const QMediaResourceList &r):
        isPlaylistOwned(false)
    {
        for (auto &item : r)
            requests << item.request();
    }
#endif

    QMediaContentPrivate(const QNetworkRequest &r):
        isPlaylistOwned(false)
    {
        requests << r;
    }

    QMediaContentPrivate(const QMediaContentPrivate &other):
        QSharedData(other),
        requests(other.requests),
        playlist(other.playlist),
        isPlaylistOwned(false)
    {}

    QMediaContentPrivate(QMediaPlaylist *pls, const QUrl &url, bool isOwn):
        playlist(pls),
        isPlaylistOwned(isOwn)
    {
        requests << QNetworkRequest(url);
    }

    ~QMediaContentPrivate()
    {
        if (isPlaylistOwned && !playlist.isNull())
            playlist.data()->deleteLater();
    }

    bool operator ==(const QMediaContentPrivate &other) const
    {
        return requests == other.requests && playlist == other.playlist;
    }

    QList<QNetworkRequest> requests;
    QPointer<QMediaPlaylist> playlist;
    bool isPlaylistOwned;
private:
    QMediaContentPrivate& operator=(const QMediaContentPrivate &other);
};


/*!
    \class QMediaContent

    \brief The QMediaContent class provides access to the resource relating to a media content.

    \inmodule QtMultimedia
    \ingroup multimedia
    \ingroup multimedia_playback

    QMediaContent is used within the multimedia framework as the logical handle
    to media content. A QMediaContent object contains a \l {QNetworkRequest}
    which provides the URL of the content.

    A non-null QMediaContent will always have a reference to
    the content available through the request() method.

    Alternatively QMediaContent can represent a playlist and contain a pointer to a
    valid QMediaPlaylist object. In this case URL is optional and can either be empty
    or point to the playlist URL.
*/


/*!
    Constructs a null QMediaContent.
*/

QMediaContent::QMediaContent()
{
}

/*!
    Constructs a media content with \a url providing a reference to the content.
*/

QMediaContent::QMediaContent(const QUrl &url):
    d(new QMediaContentPrivate)
{
    d->requests << QNetworkRequest(url);
}

/*!
    Constructs a media content with \a request providing a reference to the content.

    This constructor can be used to reference media content via network protocols such as HTTP.
    This may include additional information required to obtain the resource, such as Cookies or HTTP headers.
*/

QMediaContent::QMediaContent(const QNetworkRequest &request):
    d(new QMediaContentPrivate)
{
    d->requests << request;
}

#if QT_DEPRECATED_SINCE(6, 0)
/*!
    \obsolete

    Constructs a media content with \a resource providing a reference to the content.
*/

QMediaContent::QMediaContent(const QMediaResource &resource):
    d(new QMediaContentPrivate)
{
    d->requests << resource.request();
}

/*!
    \obsolete

    Constructs a media content with \a resources providing a reference to the content.
*/

QMediaContent::QMediaContent(const QMediaResourceList &resources):
    d(new QMediaContentPrivate(resources))
{
}
#endif

/*!
    Constructs a copy of the media content \a other.
*/

QMediaContent::QMediaContent(const QMediaContent &other):
    d(other.d)
{
}

/*!
    Constructs a media content with \a playlist.

    \a contentUrl of a playlist is an optional parameter and can be empty.

    Set \a takeOwnership to true if you want QMediaContent to take ownership of the playlist.
    \a takeOwnership is set to false by default.
*/

QMediaContent::QMediaContent(QMediaPlaylist *playlist, const QUrl &contentUrl, bool takeOwnership):
    d(new QMediaContentPrivate(playlist, contentUrl, takeOwnership))
{
}

/*!
    Destroys the media content object.
*/

QMediaContent::~QMediaContent()
{
}

/*!
    Assigns the value of \a other to this media content.
*/

QMediaContent& QMediaContent::operator=(const QMediaContent &other)
{
    d = other.d;
    return *this;
}

/*!
    Returns true if \a other is equivalent to this media content; false otherwise.
*/

bool QMediaContent::operator==(const QMediaContent &other) const
{
    return (d.constData() == 0 && other.d.constData() == nullptr) ||
            (d.constData() != 0 && other.d.constData() != nullptr &&
             *d.constData() == *other.d.constData());
}

/*!
    Returns true if \a other is not equivalent to this media content; false otherwise.
*/

bool QMediaContent::operator!=(const QMediaContent &other) const
{
    return !(*this == other);
}

/*!
    Returns true if this media content is null (uninitialized); false otherwise.
*/

bool QMediaContent::isNull() const
{
    return d.constData() == nullptr;
}

/*!
    \since 5.14

    Returns a QNetworkRequest that represents the resource for this media content.
*/

QNetworkRequest QMediaContent::request() const
{
    return (d && !d->requests.isEmpty()) ? d->requests.first() : QNetworkRequest();
}

#if QT_DEPRECATED_SINCE(6, 0)
/*!
    \obsolete

    Returns a QUrl that represents that canonical resource for this media content.
*/

QUrl QMediaContent::canonicalUrl() const
{
    return request().url();
}

/*!
    \obsolete

    Returns a QNetworkRequest that represents that canonical resource for this media content.
*/

QNetworkRequest QMediaContent::canonicalRequest() const
{
    return request();
}

/*!
    \obsolete

    Returns a QMediaResource that represents that canonical resource for this media content.
*/

QMediaResource QMediaContent::canonicalResource() const
{
    return (d && !d->requests.isEmpty()) ? d->requests.first() : QMediaResource();
}

/*!
    \obsolete

    Returns a list of alternative resources for this media content.  The first item in this list
    is always the canonical resource.
*/

QMediaResourceList QMediaContent::resources() const
{
    QMediaResourceList list;
    if (d) {
        for (auto &item : d->requests)
            list << item;
    }
    return list;
}
#endif // #if QT_DEPRECATED_SINCE(6, 0)

/*!
    Returns a playlist for this media content or 0 if this QMediaContent is not a playlist.
*/

QMediaPlaylist *QMediaContent::playlist() const
{
    return d.constData() != nullptr
            ? d->playlist.data()
            : nullptr;
}

QT_END_NAMESPACE

