150 lines
5.0 KiB
C++
150 lines
5.0 KiB
C++
#include "datamanager.h"
|
|
DataManager *DataManager::p_this;
|
|
DataManager::DataManager(QObject *parent)
|
|
: QObject{parent}
|
|
{
|
|
p_this = this;
|
|
database = DataBase::getInstance();
|
|
protocol = Protocol::getInstance();
|
|
server = TCPServer::getInstance();
|
|
server->configAndrun();
|
|
server->setCallBack(disconnect_from_cln);
|
|
server->setCallBack(recv_from_cln);
|
|
}
|
|
|
|
void DataManager::disconnect_from_cln(QTcpSocket *sock)
|
|
{
|
|
}
|
|
|
|
void DataManager::recv_from_cln(QByteArray &data, QTcpSocket *sock)
|
|
{
|
|
QByteArray data_decrypt;
|
|
data_decrypt = p_this->protocol->data_decrypt(data);
|
|
QJsonDocument json_data = QJsonDocument::fromJson(data_decrypt);
|
|
if (json_data["type"] == "message")
|
|
{
|
|
if(json_data["to_user"].toString().isEmpty())
|
|
{
|
|
for (auto &one_socket:p_this->online_socket_list)
|
|
{
|
|
p_this->server->sendToclient(one_socket,data);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
QString to_user = json_data["to_user"].toString();
|
|
qDebug() << to_user;
|
|
for (int i = 0; i < p_this->online_name_list.length(); i++)
|
|
{
|
|
if(p_this->online_name_list.at(i) == to_user)
|
|
{
|
|
p_this->server->sendToclient(p_this->online_socket_list[i],data);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if (json_data["type"] == "file")
|
|
{
|
|
if(json_data["to_user"].toString().isEmpty())
|
|
{
|
|
for (auto &one_socket:p_this->online_socket_list)
|
|
{
|
|
p_this->server->sendToclient(one_socket,data);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
QString to_user = json_data["to_user"].toString();
|
|
qDebug() << to_user;
|
|
for (int i = 0; i < p_this->online_name_list.length(); i++)
|
|
{
|
|
if(p_this->online_name_list.at(i) == to_user)
|
|
{
|
|
p_this->server->sendToclient(p_this->online_socket_list[i],data);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if (json_data["type"] == "request")
|
|
{
|
|
if (json_data["action"] == "register")
|
|
{
|
|
QString username,password;
|
|
QJsonObject json = json_data["content"].toObject();
|
|
username = json["user"].toString();
|
|
password = json["password"].toString();
|
|
bool result = p_this->database->insertUsr(username,password);
|
|
QByteArray data_build,data_encrypt;
|
|
data_build = p_this->protocol->data_maker(Protocol::RESPONSE,QString("register"),result);
|
|
data_encrypt = p_this->protocol->data_encrypt(data_build);
|
|
p_this->server->sendToclient(sock,data_encrypt);
|
|
}
|
|
else if (json_data["action"] == "signin")
|
|
{
|
|
QString username,password;
|
|
QJsonObject json = json_data["content"].toObject();
|
|
username = json["user"].toString();
|
|
password = json["password"].toString();
|
|
bool result = p_this->database->match(username,password);
|
|
qDebug() << result;
|
|
if(result == true)
|
|
{
|
|
p_this->online_socket_list.append(sock);
|
|
p_this->online_name_list.append(username);
|
|
|
|
}
|
|
QByteArray data_build,data_encrypt;
|
|
data_build = p_this->protocol->data_maker(Protocol::RESPONSE,QString("signin"),result);
|
|
data_encrypt = p_this->protocol->data_encrypt(data_build);
|
|
p_this->server->sendToclient(sock,data_encrypt);
|
|
p_this->update_namelist(sock);
|
|
}
|
|
else if (json_data["action"] == "cacellation")
|
|
{
|
|
|
|
QString username = json_data["content"].toString();
|
|
if(!p_this->database->Delete(username))
|
|
{
|
|
return;
|
|
}
|
|
for (int i = 0; i < p_this->online_name_list.length(); i++)
|
|
{
|
|
if(p_this->online_name_list.at(i) == username)
|
|
{
|
|
p_this->online_name_list.removeAt(i);
|
|
p_this->online_socket_list.removeAt(i);
|
|
break;
|
|
}
|
|
}
|
|
p_this->update_namelist(sock);
|
|
}
|
|
else if (json_data["action"] == "update_namelist")
|
|
{
|
|
QByteArray data_build,data_encrypt;
|
|
data_build = p_this->protocol->data_maker(Protocol::ONLINEUSERS,4,p_this->online_name_list);
|
|
data_encrypt = p_this->protocol->data_encrypt(data_build);
|
|
p_this->server->sendToclient(sock,data_encrypt);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
qDebug() << "服务端收到未知类型的数据";
|
|
return;
|
|
}
|
|
}
|
|
|
|
void DataManager::update_namelist(QTcpSocket *sock)
|
|
{
|
|
QByteArray data_build,data_encrypt;
|
|
data_build = protocol->data_maker(Protocol::ONLINEUSERS,4,online_name_list);
|
|
qDebug() << online_name_list;
|
|
data_encrypt = protocol->data_encrypt(data_build);
|
|
for (auto &one_socket:online_socket_list)
|
|
{
|
|
server->sendToclient(one_socket,data_encrypt);
|
|
}
|
|
}
|
|
|