#include "webserver.h"
#include "qthelper.h"

WebServer::WebServer(const QString &serverName, SslMode secureMode, QObject *parent) : QWebSocketServer(serverName, secureMode, parent)
{
    connect(this, SIGNAL(newConnection()), this, SLOT(slot_newConnection()));
}

void WebServer::slot_newConnection()
{
    QWebSocket *socket = this->nextPendingConnection();
    WebClient *client = new WebClient(socket, this);
    connect(client, SIGNAL(disconnected(QString, int)), this, SLOT(slot_disconnected(QString, int)));
    connect(client, SIGNAL(error(QString, int, QString)), this, SIGNAL(error(QString, int, QString)));
    connect(client, SIGNAL(sendData(QString, int, QString)), this, SIGNAL(sendData(QString, int, QString)));
    connect(client, SIGNAL(receiveData(QString, int, QString)), this, SIGNAL(receiveData(QString, int, QString)));

    emit connected(client->getIP(), client->getPort());
    //连接后加入链表
    clients.append(client);
}

void WebServer::slot_disconnected(const QString &ip, int port)
{
    WebClient *client = (WebClient *)sender();
    emit disconnected(ip, port);
    //断开连接后从链表中移除
    clients.removeOne(client);
}

bool WebServer::start()
{
    bool ok = listen(QHostAddress(AppConfig::WebListenIP), AppConfig::WebListenPort);
    return ok;
}

void WebServer::stop()
{
    remove();
    this->close();
}

void WebServer::writeData(const QString &ip, int port, const QString &data)
{
    foreach (WebClient *client, clients) {
        if (client->getIP() == ip && client->getPort() == port) {
            client->sendData(data);
            break;
        }
    }
}

void WebServer::writeData(const QString &data)
{
    foreach (WebClient *client, clients) {
        client->sendData(data);
    }
}

void WebServer::remove(const QString &ip, int port)
{
    foreach (WebClient *client, clients) {
        if (client->getIP() == ip && client->getPort() == port) {
            client->abort();
            break;
        }
    }
}

void WebServer::remove()
{
    foreach (WebClient *client, clients) {
        client->abort();
    }
}
