/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtBluetooth module 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 "qbluetoothserver.h"
#include "qbluetoothserver_p.h"
#include "qbluetoothsocket.h"
#include "qbluetoothsocket_winrt_p.h"

#include <QtCore/QLoggingCategory>
#include <QtCore/private/qeventdispatcher_winrt_p.h>
#ifdef CLASSIC_APP_BUILD
#define Q_OS_WINRT
#endif
#include <qfunctions_winrt.h>

#include <windows.networking.h>
#include <windows.networking.connectivity.h>
#include <windows.networking.sockets.h>

using namespace Microsoft::WRL;
using namespace Microsoft::WRL::Wrappers;
using namespace ABI::Windows::Devices;
using namespace ABI::Windows::Devices::Enumeration;
using namespace ABI::Windows::Foundation;
using namespace ABI::Windows::Networking;
using namespace ABI::Windows::Networking::Sockets;
using namespace ABI::Windows::Networking::Connectivity;

typedef ITypedEventHandler<StreamSocketListener *, StreamSocketListenerConnectionReceivedEventArgs *> ClientConnectedHandler;

QT_BEGIN_NAMESPACE

Q_DECLARE_LOGGING_CATEGORY(QT_BT_WINRT)

QHash<QBluetoothServerPrivate *, int> __fakeServerPorts;

QBluetoothServerPrivate::QBluetoothServerPrivate(QBluetoothServiceInfo::Protocol sType,
                                                 QBluetoothServer *parent)
    : maxPendingConnections(1), serverType(sType), m_lastError(QBluetoothServer::NoError),
      socket(0), q_ptr(parent)
{
#ifdef CLASSIC_APP_BUILD
    CoInitialize(NULL);
#endif
    socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol);
}

QBluetoothServerPrivate::~QBluetoothServerPrivate()
{
    deactivateActiveListening();
    __fakeServerPorts.remove(this);
    if (socket)
        delete socket;
#ifdef CLASSIC_APP_BUILD
    // If we do not reset that pointer, socketListener will go out of scope after CoUninitialize was
    // called, which will lead to a crash.
    socketListener = nullptr;
    CoUninitialize();
#endif
}

bool QBluetoothServerPrivate::isListening() const
{
    return __fakeServerPorts.contains(const_cast<QBluetoothServerPrivate *>(this));
}

bool QBluetoothServerPrivate::initiateActiveListening(const QString &serviceName)
{
    HStringReference serviceNameRef(reinterpret_cast<LPCWSTR>(serviceName.utf16()));

    ComPtr<IAsyncAction> bindAction;
    HRESULT hr = socketListener->BindServiceNameAsync(serviceNameRef.Get(), &bindAction);
    Q_ASSERT_SUCCEEDED(hr);
    hr = QWinRTFunctions::await(bindAction);
    Q_ASSERT_SUCCEEDED(hr);
    return true;
}

bool QBluetoothServerPrivate::deactivateActiveListening()
{
    if (!isListening())
        return true;

    HRESULT hr;
    hr = socketListener->remove_ConnectionReceived(connectionToken);
    Q_ASSERT_SUCCEEDED(hr);
    return true;
}

HRESULT QBluetoothServerPrivate::handleClientConnection(IStreamSocketListener *listener,
                                                        IStreamSocketListenerConnectionReceivedEventArgs *args)
{
    Q_Q(QBluetoothServer);
    if (!socketListener || socketListener.Get() != listener) {
        qCDebug(QT_BT_WINRT) << "Accepting connection from wrong listener. We should not be here.";
        Q_UNREACHABLE();
        return S_OK;
    }

    HRESULT hr;
    ComPtr<IStreamSocket> socket;
    hr = args->get_Socket(&socket);
    Q_ASSERT_SUCCEEDED(hr);
    QMutexLocker locker(&pendingConnectionsMutex);
    if (pendingConnections.count() < maxPendingConnections) {
        qCDebug(QT_BT_WINRT) << "Accepting connection";
        pendingConnections.append(socket);
        locker.unlock();
        q->newConnection();
    } else {
        qCDebug(QT_BT_WINRT) << "Refusing connection";
    }

    return S_OK;
}

void QBluetoothServer::close()
{
    Q_D(QBluetoothServer);

    d->deactivateActiveListening();
    __fakeServerPorts.remove(d);
}

bool QBluetoothServer::listen(const QBluetoothAddress &address, quint16 port)
{
    Q_UNUSED(address);
    Q_D(QBluetoothServer);
    if (serverType() != QBluetoothServiceInfo::RfcommProtocol) {
        d->m_lastError = UnsupportedProtocolError;
        emit error(d->m_lastError);
        return false;
    }

    if (isListening())
        return false;

    HRESULT hr;
    hr = QEventDispatcherWinRT::runOnXamlThread([d, this] ()
    {
        HRESULT hr = RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_Networking_Sockets_StreamSocketListener).Get(),
                                &d->socketListener);
        Q_ASSERT_SUCCEEDED(hr);
        hr = d->socketListener->add_ConnectionReceived(Callback<ClientConnectedHandler>(d, &QBluetoothServerPrivate::handleClientConnection).Get(),
                                                       &d->connectionToken);
        Q_ASSERT_SUCCEEDED(hr);
        return S_OK;
    });
    Q_ASSERT_SUCCEEDED(hr);

    //We can not register an actual Rfcomm port, because the platform does not allow it
    //but we need a way to associate a server with a service
    if (port == 0) { //Try to assign a non taken port id
        for (int i = 1; ; i++){
            if (__fakeServerPorts.key(i) == 0) {
                port = i;
                break;
            }
        }
    }

    if (__fakeServerPorts.key(port) == 0) {
        __fakeServerPorts[d] = port;

        qCDebug(QT_BT_WINRT) << "Port" << port << "registered";
    } else {
        qCWarning(QT_BT_WINRT) << "server with port" << port << "already registered or port invalid";
        d->m_lastError = ServiceAlreadyRegisteredError;
        emit error(d->m_lastError);
        return false;
    }

    return true;
}

void QBluetoothServer::setMaxPendingConnections(int numConnections)
{
    Q_D(QBluetoothServer);
    QMutexLocker locker(&d->pendingConnectionsMutex);
    if (d->pendingConnections.count() > numConnections) {
        qCWarning(QT_BT_WINRT) << "There are currently more than" << numConnections << "connections"
                               << "pending. Number of maximum pending connections was not changed.";
        return;
    }

    d->maxPendingConnections = numConnections;
}

bool QBluetoothServer::hasPendingConnections() const
{
    Q_D(const QBluetoothServer);
    QMutexLocker locker(&d->pendingConnectionsMutex);
    return !d->pendingConnections.isEmpty();
}

QBluetoothSocket *QBluetoothServer::nextPendingConnection()
{
    Q_D(QBluetoothServer);
    if (d->pendingConnections.count() == 0)
        return nullptr;

    ComPtr<IStreamSocket> socket = d->pendingConnections.takeFirst();

    QBluetoothSocket *newSocket = new QBluetoothSocket();
    bool success = newSocket->d_ptr->setSocketDescriptor(socket, d->serverType);
    if (!success) {
        delete newSocket;
        newSocket = nullptr;
    }

    return newSocket;
}

QBluetoothAddress QBluetoothServer::serverAddress() const
{
    return QBluetoothAddress();
}

quint16 QBluetoothServer::serverPort() const
{
    //We return the fake port
    Q_D(const QBluetoothServer);
    return __fakeServerPorts.value((QBluetoothServerPrivate*)d, 0);
}

void QBluetoothServer::setSecurityFlags(QBluetooth::SecurityFlags security)
{
    Q_UNUSED(security);
}

QBluetooth::SecurityFlags QBluetoothServer::securityFlags() const
{
    return QBluetooth::NoSecurity;
}

QT_END_NAMESPACE
