4
1
mirror of https://github.com/QuasarApp/Heart.git synced 2025-05-14 10:29:43 +00:00

fix send package method

This commit is contained in:
Andrei Yankovich 2021-09-30 12:30:16 +03:00
parent 48aa02bd7d
commit 88fd46e0c9
7 changed files with 95 additions and 16 deletions

@ -14,6 +14,10 @@ TcpSocket::TcpSocket(QObject *parent):
}
TcpSocket::~TcpSocket() {
int i = 3;
}
void TcpSocket::handleDisckonnetFromHost() {
disconnectFromHost();
}

@ -20,6 +20,7 @@ class TcpSocket: public QTcpSocket
Q_OBJECT
public:
TcpSocket(QObject *parent);
~TcpSocket();
public slots:
/**

@ -208,7 +208,8 @@ bool AbstractNode::removeNode(const HostAddress &nodeAdderess) {
return true;
} else {
QTimer::singleShot(WAIT_CONFIRM_TIME, this,
std::bind(&AbstractNode::handleForceRemoveNode, this, nodeAdderess));
std::bind(&AbstractNode::handleForceRemoveNode,
this, nodeAdderess));
CloseConnection close;
return sendData(&close, nodeAdderess);
@ -218,6 +219,24 @@ bool AbstractNode::removeNode(const HostAddress &nodeAdderess) {
return false;
}
bool AbstractNode::removeNode(AbstractNodeInfo *node) {
if (!(node && node->isValid())) {
return false;
}
if (node->isLocal()) {
node->removeSocket();
return true;
}
QTimer::singleShot(WAIT_CONFIRM_TIME, this,
std::bind(&AbstractNode::handleForceRemoveNode,
this, node->networkAddress()));
CloseConnection close;
return sendData(&close, node);
}
HostAddress AbstractNode::address() const {
return HostAddress{serverAddress(), serverPort()};
}
@ -522,7 +541,7 @@ ParserResult AbstractNode::parsePackage(const QSharedPointer<AbstractData> &pkg,
auto cmd = static_cast<Ping *>(pkg.data());
if (!cmd->ansver()) {
cmd->setAnsver(true);
sendData(cmd, sender->networkAddress(), &pkgHeader);
sendData(cmd, sender, &pkgHeader);
}
return ParserResult::Processed;
@ -568,19 +587,31 @@ unsigned int AbstractNode::sendData(AbstractData *resp,
const HostAddress &addere,
const Header *req) {
if (!resp || !resp->prepareToSend()) {
return false;
}
return sendData(const_cast<const AbstractData*>(resp), addere, req);
return sendData(resp, getInfoPtr(addere), req);
}
unsigned int AbstractNode::sendData(const AbstractData *resp,
const HostAddress &addere,
const Header *req) {
auto client = getInfoPtr(addere);
return sendData(resp, getInfoPtr(addere), req);
}
if (!client) {
unsigned int AbstractNode::sendData(PKG::AbstractData *resp,
const AbstractNodeInfo *node,
const Header *req) {
if (!resp || !resp->prepareToSend()) {
return false;
}
return sendData(const_cast<const AbstractData*>(resp), node, req);
}
unsigned int AbstractNode::sendData(const PKG::AbstractData *resp,
const AbstractNodeInfo *node,
const Header *req) {
if (!node) {
QuasarAppUtils::Params::log("Response not sent because client == null");
return 0;
}
@ -603,7 +634,7 @@ unsigned int AbstractNode::sendData(const AbstractData *resp,
return 0;
}
if (!sendPackage(pkg, client->sct())) {
if (!sendPackage(pkg, node->sct())) {
QuasarAppUtils::Params::log("Response not sent!",
QuasarAppUtils::Error);
return 0;

@ -182,6 +182,13 @@ public:
*/
bool removeNode(const HostAddress& nodeAdderess);
/**
* @brief removeNode - Remove node and disconnected forom node (server).
* @param node - This is removed node (server).
* @return true if the node removed successful. If the nde with @a nodeAdderess is not exits return false.
*/
bool removeNode(AbstractNodeInfo* node);
/**
* @brief address - Thim method return own network address of current node (server).
* @return The current network adderss.
@ -380,6 +387,26 @@ protected:
virtual unsigned int sendData(const PKG::AbstractData *resp, const HostAddress& address,
const Header *req = nullptr);
/**
* @brief sendData This pakcage send data package to node object and prepare object to sending.
* @param resp This is pointer to sendet object.
* @param address This is target addres for sending.
* @param req This is header of request.
* @return hash of the sendet package. If function is failed then return 0.
*/
virtual unsigned int sendData(PKG::AbstractData *resp, const AbstractNodeInfo *node,
const Header *req = nullptr);
/**
* @brief sendData this is some as a sendData(AbstractData *resp ...) exept this method not prepare object for sending.
* @param resp This is pointer to sendet object.
* @param address This is target addres for sending.
* @param req This is header of request.
* @return hash of the sendet package. If function is failed then return 0.
*/
virtual unsigned int sendData(const PKG::AbstractData *resp, const AbstractNodeInfo *node,
const Header *req = nullptr);
/**
* @brief badRequest This method is send data about error of request.
* @param address This is addrees of receiver.

@ -46,7 +46,6 @@ void AbstractNodeInfo::removeSocket() {
"deleteLater",
Qt::QueuedConnection);
setStatus(NodeCoonectionStatus::NotConnected);
emit sigDisconnected(this);

@ -277,7 +277,7 @@ unsigned int DataBaseNode::sendData(const AbstractData *resp,
for (auto it = nodes.begin(); it != nodes.end(); ++it) {
auto info = dynamic_cast<BaseNodeInfo*>(it.value());
if (info && info->id() == nodeId) {
return sendData(resp, it.key(), req);
return sendData(resp, info, req);
}
}
@ -295,6 +295,18 @@ unsigned int DataBaseNode::sendData(AbstractData *resp, const HostAddress &nodeI
return AbstractNode::sendData(resp, nodeId, req);
}
unsigned int DataBaseNode::sendData(const PKG::AbstractData *resp,
const AbstractNodeInfo *node,
const Header *req) {
return AbstractNode::sendData(resp, node, req);
}
unsigned int DataBaseNode::sendData(PKG::AbstractData *resp,
const AbstractNodeInfo *node,
const Header *req) {
return AbstractNode::sendData(resp, node, req);
}
ParserResult DataBaseNode::parsePackage(const QSharedPointer<AbstractData> &pkg,
const Header &pkgHeader,
const AbstractNodeInfo *sender) {
@ -316,7 +328,7 @@ ParserResult DataBaseNode::parsePackage(const QSharedPointer<AbstractData> &pkg,
return ParserResult::Error;
}
if (!workWithSubscribe(*obj, requesterId, *sender)) {
if (!workWithSubscribe(*obj, requesterId, sender)) {
badRequest(sender->networkAddress(), pkgHeader, {
ErrorCodes::InvalidRequest,
"WebSocket request is invalid"
@ -346,7 +358,7 @@ ISqlDBCache *DataBaseNode::db() const {
bool DataBaseNode::workWithSubscribe(const WebSocket &rec,
const QVariant &clientOrNodeid,
const AbstractNodeInfo & sender) {
const AbstractNodeInfo * sender) {
auto _db = db();
if (!_db)
@ -371,7 +383,7 @@ bool DataBaseNode::workWithSubscribe(const WebSocket &rec,
WebSocketSubscriptions resp;
resp.setAddresses(_webSocketWorker->list(clientOrNodeid));
return sendData(&resp, sender.networkAddress());
return sendData(&resp, sender);
}
default: break;

@ -238,6 +238,11 @@ protected:
unsigned int sendData(PKG::AbstractData *resp, const HostAddress &nodeId,
const Header *req = nullptr) override;
unsigned int sendData(const PKG::AbstractData *resp, const AbstractNodeInfo *node,
const Header *req = nullptr) override;
unsigned int sendData(PKG::AbstractData *resp, const AbstractNodeInfo *node,
const Header *req = nullptr) override;
/**
* @brief hashgenerator This method generate a hash from any value.
* Override this method for set your custom salt.
@ -420,7 +425,7 @@ private:
*/
bool workWithSubscribe(const PKG::WebSocket &rec,
const QVariant &clientOrNodeid,
const AbstractNodeInfo &sender);
const AbstractNodeInfo *sender);
bool isForbidenTable(const QString& table);