added new macros for generate command

This commit is contained in:
Andrei Yankovich 2021-10-06 12:29:06 +03:00
parent 016b722da1
commit 99932d792c
42 changed files with 192 additions and 218 deletions

View File

@ -544,7 +544,7 @@ ParserResult AbstractNode::parsePackage(const QSharedPointer<AbstractData> &pkg,
incomingData(pkg.data(), sender); incomingData(pkg.data(), sender);
if (H_16<Ping>() == pkg->cmd()) { if (Ping::command() == pkg->cmd()) {
auto cmd = static_cast<Ping *>(pkg.data()); auto cmd = static_cast<Ping *>(pkg.data());
if (!cmd->ansver()) { if (!cmd->ansver()) {
cmd->setAnsver(true); cmd->setAnsver(true);
@ -552,14 +552,14 @@ ParserResult AbstractNode::parsePackage(const QSharedPointer<AbstractData> &pkg,
} }
return ParserResult::Processed; return ParserResult::Processed;
} else if (H_16<BadRequest>() == pkg->cmd()) { } else if (BadRequest::command() == pkg->cmd()) {
auto cmd = static_cast<BadRequest *>(pkg.data()); auto cmd = static_cast<BadRequest *>(pkg.data());
emit requestError(cmd->errCode(), cmd->err()); emit requestError(cmd->errCode(), cmd->err());
return ParserResult::Processed; return ParserResult::Processed;
} else if (H_16<CloseConnection>() == pkg->cmd()) { } else if (CloseConnection::command() == pkg->cmd()) {
if (sender->isLocal()) { if (sender->isLocal()) {
removeNode(sender->networkAddress()); removeNode(sender->networkAddress());
@ -611,30 +611,12 @@ bool AbstractNode::sendPackage(const Package &pkg, QAbstractSocket *target) cons
return _dataSender->sendData(pkg.toBytes(), target, true); return _dataSender->sendData(pkg.toBytes(), target, true);
} }
unsigned int AbstractNode::sendData(AbstractData *resp,
const HostAddress &addere,
const Header *req) {
return sendData(resp, getInfoPtr(addere), req);
}
unsigned int AbstractNode::sendData(const AbstractData *resp, unsigned int AbstractNode::sendData(const AbstractData *resp,
const HostAddress &addere, const HostAddress &addere,
const Header *req) { const Header *req) {
return sendData(resp, getInfoPtr(addere), req); return sendData(resp, getInfoPtr(addere), req);
} }
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, unsigned int AbstractNode::sendData(const PKG::AbstractData *resp,
const AbstractNodeInfo *node, const AbstractNodeInfo *node,
const Header *req) { const Header *req) {

View File

@ -321,7 +321,7 @@ protected:
} }
// you can use parsing without the commandHandler method // you can use parsing without the commandHandler method
if (H_16<MyCommand>() == pkg->cmd()) { if (MyCommand::command() == pkg->cmd()) {
BaseId requesterId = getSender(sender, &obj); BaseId requesterId = getSender(sender, &obj);
@ -371,17 +371,7 @@ protected:
virtual bool sendPackage(const Package &pkg, QAbstractSocket *target) const; virtual bool sendPackage(const Package &pkg, QAbstractSocket *target) const;
/** /**
* @brief sendData This pakcage send data package to address and prepare object to sending. * @brief sendData This method send data object another to node
* @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 HostAddress& address,
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 resp This is pointer to sendet object.
* @param address This is target addres for sending. * @param address This is target addres for sending.
* @param req This is header of request. * @param req This is header of request.
@ -391,17 +381,7 @@ protected:
const Header *req = nullptr); const Header *req = nullptr);
/** /**
* @brief sendData This pakcage send data package to node object and prepare object to sending. * @brief sendData This method send data object another to node
* @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 resp This is pointer to sendet object.
* @param address This is target addres for sending. * @param address This is target addres for sending.
* @param req This is header of request. * @param req This is header of request.
@ -556,7 +536,7 @@ protected:
* This is need to prepare pacakge for parsing in the parsePackage method. * This is need to prepare pacakge for parsing in the parsePackage method.
*/ */
void registerPackageType() { void registerPackageType() {
_registeredTypes[H_16<T>()] = [](){ _registeredTypes[T::command()] = [](){
return new T(); return new T();
}; };
}; };
@ -628,7 +608,7 @@ protected:
const QH::AbstractNodeInfo *sender, const QH::AbstractNodeInfo *sender,
const QH::Header &pkgHeader) { const QH::Header &pkgHeader) {
if (H_16<PackageClass>() == pkg->cmd()) { if (PackageClass::command() == pkg->cmd()) {
auto data = pkg.staticCast<PackageClass>(); auto data = pkg.staticCast<PackageClass>();
if (!data->isValid()) { if (!data->isValid()) {

View File

@ -15,7 +15,7 @@ Header::Header() {
} }
bool Header::isValid() const { bool Header::isValid() const {
return command && size && hash; return command && hash;
} }
void Header::reset() { void Header::reset() {

View File

@ -25,19 +25,7 @@ bool Package::isValid() const {
return false; return false;
} }
auto rawint = data.mid(0, sizeof (decltype (hdr.command))); return calcHash() == hdr.hash;
decltype (hdr.command) cmd;
memcpy(&cmd, rawint.data(), sizeof (cmd));
if (data.size() && hdr.command != cmd) {
std::reverse(rawint.begin(), rawint.end());
memcpy(&cmd, rawint.data(), sizeof (cmd));
if (hdr.command != cmd)
return false;
}
return static_cast<uint>(qHash(data)) == hdr.hash;
} }
void Package::reset() { void Package::reset() {
@ -51,6 +39,14 @@ QString Package::toString() const {
arg(hdr.toString()).arg(data.size()).arg(QString(data.toHex().toUpper())); arg(hdr.toString()).arg(data.size()).arg(QString(data.toHex().toUpper()));
} }
unsigned int Package::calcHash() const{
QByteArray hashArray(data);
hashArray.push_back(QByteArray::fromRawData(reinterpret_cast<const char*>(&hdr.command),
sizeof (hdr.command)));
return qHash(hashArray);
}
QDataStream &Package::fromStream(QDataStream &stream) { QDataStream &Package::fromStream(QDataStream &stream) {
reset(); reset();
stream.readRawData(reinterpret_cast<char*>(&hdr), sizeof(Header)); stream.readRawData(reinterpret_cast<char*>(&hdr), sizeof(Header));

View File

@ -54,6 +54,12 @@ public:
*/ */
QString toString() const; QString toString() const;
/**
* @brief calcHash This method recalc hash sum for this pacakge.
* @return int32 hash of pacakge.
*/
unsigned int calcHash() const;
// StreamBase interface // StreamBase interface
protected: protected:
QDataStream &fromStream(QDataStream &stream) override; QDataStream &fromStream(QDataStream &stream) override;

View File

@ -16,41 +16,19 @@
namespace QH { namespace QH {
namespace PKG { namespace PKG {
unsigned short AbstractData::cmd() const {
if (_cmd)
return _cmd;
return generateCmd();
}
void AbstractData::setCmd(unsigned short cmd) {
_cmd = cmd;
}
bool AbstractData::init() {
if (typeid (*this).hash_code() == typeid(AbstractData).hash_code())
return false;
initCmd();
return true;
}
unsigned short AbstractData::generateCmd() const {
return H_16(*this);
}
void AbstractData::initCmd() {
setCmd(generateCmd());
}
AbstractData::AbstractData() { AbstractData::AbstractData() {
setCmd(0);
} }
bool AbstractData::toPackage(Package &package, bool AbstractData::toPackage(Package &package,
unsigned int triggerHash) const { unsigned int triggerHash) const {
if (!checkCmd()) {
QuasarAppUtils::Params::log("You try send pacakge without QH_PACKAGE macross. Please add QH_PACKAGE macros to this class.",
QuasarAppUtils::Error);
return false;
}
if (!isValid()) { if (!isValid()) {
return false; return false;
} }
@ -61,44 +39,38 @@ bool AbstractData::toPackage(Package &package,
package.hdr.triggerHash = triggerHash; package.hdr.triggerHash = triggerHash;
int realDataSize = package.data.size(); int realDataSize = package.data.size();
package.hdr.size = static_cast<unsigned short>(realDataSize); package.hdr.size = static_cast<unsigned short>(realDataSize);
package.hdr.hash = qHash(package.data); package.hdr.hash = package.calcHash();
return package.isValid(); return package.isValid();
} }
QDataStream &AbstractData::fromStream(QDataStream &stream) { QDataStream &AbstractData::fromStream(QDataStream &stream) {
stream >> _cmd;
return stream; return stream;
} }
QDataStream &AbstractData::toStream(QDataStream &stream) const { QDataStream &AbstractData::toStream(QDataStream &stream) const {
stream << cmd();
return stream; return stream;
} }
bool AbstractData::checkCmd() const {
unsigned int code = typeid (*this).hash_code();
return code == localCode(); \
}
bool AbstractData::isValid() const { bool AbstractData::isValid() const {
return cmd(); return true;
} }
bool AbstractData::copyFrom(const AbstractData *other) { bool AbstractData::copyFrom(const AbstractData *other) {
return other; return other;
} }
QString AbstractData::toString() const { QString AbstractData::toString() const {
return QString("Object: type:%0, command:%1"). return QString("Object: type:%0, command:%1").
arg(typeid(*this).name()). arg(cmdString()).
arg(cmd()); arg(cmd());
} }
bool AbstractData::prepareToSend() {
if (isValid()) {
return true;
}
return init();
}
void AbstractData::fromPakcage(const Package &pkg) { void AbstractData::fromPakcage(const Package &pkg) {
fromBytes(pkg.data); fromBytes(pkg.data);
} }

View File

@ -11,6 +11,22 @@
#include <streambase.h> #include <streambase.h>
#include <global.h> #include <global.h>
/**
* @brief QH_PACKAGE This macross prepare data to send and create a global id for package. For get global id use the cmd method.
* For get quick access for global command use the ClassName::command() method. This method is static.
*/
#define QH_PACKAGE(X, S) \
public: \
static unsigned short command(){return qHash(QString(S)) % 0xFFFF;} \
static QString commandText(){return S;} \
unsigned short cmd() const override {return X::command();} \
QString cmdString() const override {return X::commandText();} \
protected: \
unsigned int localCode() const override {return typeid(X).hash_code();} \
\
private:
namespace QH { namespace QH {
namespace PKG { namespace PKG {
@ -49,6 +65,7 @@ protected:
* \code {cpp} * \code {cpp}
* class MyPackage: public QH::AbstractData * class MyPackage: public QH::AbstractData
{ {
QH_PACKAGE(MyPackage, "MyPackage")
... ...
bool copyFrom(const AbstractData *other) { bool copyFrom(const AbstractData *other) {
if (!AbstractData::copyFrom(other)) if (!AbstractData::copyFrom(other))
@ -110,10 +127,20 @@ public:
virtual ~AbstractData() override; virtual ~AbstractData() override;
/** /**
* @brief cmd - This is command of this object, (for generate cmd use macross H16<ClassName>) * @brief cmd - This is command of this object, (for generate cmd use macross QH_PACKAGE)
* @return Command of package. * @note Use the QH_PACKAGE macross for implement this method.
* @return global command of package.
* @see QH_PACKAGE
*/ */
unsigned short cmd() const; virtual unsigned short cmd() const = 0;
/**
* @brief cmd - This is command string of this object, (for generate cmd use macross QH_PACKAGE)
* @note Use the QH_PACKAGE macross for implement this method.
* @return global command of package.
* @see QH_PACKAGE
*/
virtual QString cmdString() const = 0;
/** /**
* @brief toPackage This method convert this class object to the package. * @brief toPackage This method convert this class object to the package.
@ -157,12 +184,6 @@ public:
*/ */
virtual QString toString() const; virtual QString toString() const;
/**
* @brief prepareToSend - This method check object to valid and if an object is invalid invoke method init.
* @return Return true if the object prepared for sending.
*/
bool prepareToSend();
/** /**
* @brief create - This is factory method for create a new object. * @brief create - This is factory method for create a new object.
* @param args - List of arguments for create object. * @param args - List of arguments for create object.
@ -171,7 +192,6 @@ public:
template<class C, class... Args> template<class C, class... Args>
C* create(Args&&... args) const { C* create(Args&&... args) const {
C* object = new C(std::forward<Args>(args)...); C* object = new C(std::forward<Args>(args)...);
object->generateCmd();
return object; return object;
} }
@ -181,49 +201,42 @@ public:
*/ */
void fromPakcage(const Package& pkg); void fromPakcage(const Package& pkg);
/**
* @brief command This static method that return glaball code of this object.
* @note This method generated automaticaly in the QH_PACKAGE macross.
* @return global code
* @see QH_PACKAGE
*/
static unsigned int command(){return 0;};
/**
* @brief commandText This method return text of package command
* @return text of pacakge command
*/
static QString commandText(){return "NULL";};
protected: protected:
/** /**
* @brief AbstractData - Base constructor of this object. * @brief AbstractData - Base constructor of this object.
*/ */
explicit AbstractData(); explicit AbstractData();
/** /**
* @brief setCmd - Set the new value command of object. * @brief localCode This method return local code
* @param cmd - New value. * @return local command of this class. used for check QH_PACKAGE macro before send pacakge.
*/ */
void setCmd(unsigned short cmd); virtual unsigned int localCode() const = 0;
/**
* @brief Init This method need to invoke after create object for initialize all component of objects.
* @note Do not invade this method on constructor of object, because object will be initialized not correctly.
* By default implementation of object init command.
* @return True if object initialized correctly.
*/
virtual bool init();
QDataStream& fromStream(QDataStream& stream) override; QDataStream& fromStream(QDataStream& stream) override;
QDataStream& toStream(QDataStream& stream) const override; QDataStream& toStream(QDataStream& stream) const override;
private: private:
/** /**
* @brief generateCmd Generate command from name of this class object. * @brief checkCmd This method check QH_PACKAGE macross.
* @note Call this method only after create objects. Do not call in constructor of class. * @return true if the QH_PACKAGE macross is enabled else fal.
* @return Command of object.
*/ */
unsigned short generateCmd() const; bool checkCmd() const;;
/**
* @brief initCmd Set cmd from class name.
* @note Call this method only after create objects. Do not call in constructor of class.
*/
void initCmd();
/**
* @brief cmd - Unique id of class using in Header of package for identification.
*/
unsigned short _cmd = 0;
}; };

View File

@ -33,6 +33,7 @@ struct ErrorData {
*/ */
class HEARTSHARED_EXPORT BadRequest : public AbstractData class HEARTSHARED_EXPORT BadRequest : public AbstractData
{ {
QH_PACKAGE(BadRequest, "BadRequest")
public: public:
/** /**
@ -62,8 +63,8 @@ public:
void setErr(const QString &err); void setErr(const QString &err);
// StreamBase interface // StreamBase interface
QDataStream &fromStream(QDataStream &stream); QDataStream &fromStream(QDataStream &stream) override;
QDataStream &toStream(QDataStream &stream) const; QDataStream &toStream(QDataStream &stream) const override;
/** /**
* @brief errCode This method return code of error. * @brief errCode This method return code of error.

View File

@ -19,6 +19,8 @@ namespace PKG {
*/ */
class HEARTSHARED_EXPORT BigDataBase: public AbstractData class HEARTSHARED_EXPORT BigDataBase: public AbstractData
{ {
QH_PACKAGE(BigDataBase, "BigDataBase")
public: public:
BigDataBase(); BigDataBase();

View File

@ -15,7 +15,7 @@ BigDataHeader::BigDataHeader() {
} }
bool BigDataHeader::isValid() const { bool BigDataHeader::isValid() const {
return BigDataBase::isValid() && packagesCount >= 2 && command; return BigDataBase::isValid() && packagesCount >= 2 && _command;
} }
QString BigDataHeader::toString() const { QString BigDataHeader::toString() const {
@ -23,7 +23,7 @@ QString BigDataHeader::toString() const {
" Packages count: " + " Packages count: " +
QString::number(packagesCount) + QString::number(packagesCount) +
" Packages command: " + " Packages command: " +
QString::number(command); QString::number(_command);
} }
int BigDataHeader::getPackagesCount() const { int BigDataHeader::getPackagesCount() const {
@ -38,7 +38,7 @@ QDataStream &BigDataHeader::fromStream(QDataStream &stream) {
BigDataBase::fromStream(stream); BigDataBase::fromStream(stream);
stream >> packagesCount; stream >> packagesCount;
stream >> command; stream >> _command;
return stream; return stream;
} }
@ -47,17 +47,17 @@ QDataStream &BigDataHeader::toStream(QDataStream &stream) const {
BigDataBase::toStream(stream); BigDataBase::toStream(stream);
stream << packagesCount; stream << packagesCount;
stream << command; stream << _command;
return stream; return stream;
} }
unsigned short BigDataHeader::getCommand() const { unsigned short BigDataHeader::getCommand() const {
return command; return _command;
} }
void BigDataHeader::setCommand(unsigned short newCommand) { void BigDataHeader::setCommand(unsigned short newCommand) {
command = newCommand; _command = newCommand;
} }
} }

View File

@ -27,6 +27,8 @@ namespace PKG {
*/ */
class HEARTSHARED_EXPORT BigDataHeader : public BigDataBase class HEARTSHARED_EXPORT BigDataHeader : public BigDataBase
{ {
QH_PACKAGE(BigDataHeader, "BigDataHeader")
public: public:
BigDataHeader(); BigDataHeader();
@ -64,7 +66,7 @@ protected:
private: private:
int packagesCount; int packagesCount;
unsigned short command; unsigned short _command;
}; };
} }
} }

View File

@ -20,6 +20,8 @@ namespace PKG {
*/ */
class HEARTSHARED_EXPORT BigDataPart : public BigDataBase class HEARTSHARED_EXPORT BigDataPart : public BigDataBase
{ {
QH_PACKAGE(BigDataPart, "BigDataPart")
public: public:
BigDataPart(); BigDataPart();

View File

@ -19,6 +19,8 @@ namespace PKG {
*/ */
class HEARTSHARED_EXPORT BigDataRequest: public BigDataBase class HEARTSHARED_EXPORT BigDataRequest: public BigDataBase
{ {
QH_PACKAGE(BigDataRequest, "BigDataRequest")
public: public:
BigDataRequest(); BigDataRequest();
@ -43,6 +45,7 @@ protected:
private: private:
int _currentPart = 0; int _currentPart = 0;
}; };
} }

View File

@ -27,6 +27,8 @@ namespace PKG {
*/ */
class HEARTSHARED_EXPORT CloseConnection: public AbstractData class HEARTSHARED_EXPORT CloseConnection: public AbstractData
{ {
QH_PACKAGE(CloseConnection, "CloseConnection")
public: public:
CloseConnection(); CloseConnection();
}; };

View File

@ -20,6 +20,8 @@ namespace PKG {
*/ */
class HEARTSHARED_EXPORT Ping: public AbstractData class HEARTSHARED_EXPORT Ping: public AbstractData
{ {
QH_PACKAGE(Ping, "Ping")
public: public:
Ping(); Ping();
Ping(const Package& from); Ping(const Package& from);
@ -29,7 +31,7 @@ public:
* @brief isValid - Check this package if valid. * @brief isValid - Check this package if valid.
* @return True if package is valid. * @return True if package is valid.
*/ */
bool isValid() const; bool isValid() const override;
/** /**
* @brief answer This is bool value for check this object that it is answer or request. * @brief answer This is bool value for check this object that it is answer or request.

View File

@ -256,18 +256,6 @@ bool DataBaseNode::changeTrust(const QVariant &id, int diff) {
return _db->changeObjects(NetworkMember{id}, action); return _db->changeObjects(NetworkMember{id}, action);
} }
unsigned int DataBaseNode::sendData(AbstractData *resp,
const QVariant &nodeId,
const Header *req) {
if (!resp || !resp->prepareToSend()) {
return 0;
}
return sendData(const_cast<const AbstractData*>(resp), nodeId, req);
}
unsigned int DataBaseNode::sendData(const AbstractData *resp, unsigned int DataBaseNode::sendData(const AbstractData *resp,
const QVariant &nodeId, const QVariant &nodeId,
const Header *req) { const Header *req) {
@ -290,23 +278,12 @@ unsigned int DataBaseNode::sendData(const AbstractData *resp, const HostAddress
} }
unsigned int DataBaseNode::sendData(AbstractData *resp, const HostAddress &nodeId,
const Header *req) {
return AbstractNode::sendData(resp, nodeId, req);
}
unsigned int DataBaseNode::sendData(const PKG::AbstractData *resp, unsigned int DataBaseNode::sendData(const PKG::AbstractData *resp,
const AbstractNodeInfo *node, const AbstractNodeInfo *node,
const Header *req) { const Header *req) {
return AbstractNode::sendData(resp, node, 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, ParserResult DataBaseNode::parsePackage(const QSharedPointer<AbstractData> &pkg,
const Header &pkgHeader, const Header &pkgHeader,
const AbstractNodeInfo *sender) { const AbstractNodeInfo *sender) {
@ -315,7 +292,7 @@ ParserResult DataBaseNode::parsePackage(const QSharedPointer<AbstractData> &pkg,
return parentResult; return parentResult;
} }
if (H_16<WebSocket>() == pkg->cmd()) { if (WebSocket::command() == pkg->cmd()) {
WebSocket *obj = static_cast<WebSocket*>(pkg.data()); WebSocket *obj = static_cast<WebSocket*>(pkg.data());
QVariant requesterId = getSender(sender, obj); QVariant requesterId = getSender(sender, obj);

View File

@ -211,17 +211,6 @@ protected:
*/ */
virtual bool changeTrust(const QVariant &id, int diff); virtual bool changeTrust(const QVariant &id, int diff);
/**
* @brief sendData This method is some as AbstractNode::sendData but it try send data to the id.
* This implementation prepare object to sending.
* @param resp This is sending object to the nodeId.
* @param nodeId This is id of target node.
* @param req This is header of request.
* @return true if a data send successful.
*/
virtual unsigned int sendData(PKG::AbstractData *resp, const QVariant &nodeId,
const Header *req = nullptr);
/** /**
* @brief sendData This method is some as AbstractNode::sendData but it try send data to the id. * @brief sendData This method is some as AbstractNode::sendData but it try send data to the id.
* This implementation do not prepare object to sending. * This implementation do not prepare object to sending.
@ -235,13 +224,9 @@ protected:
unsigned int sendData(const PKG::AbstractData *resp, const HostAddress &nodeId, unsigned int sendData(const PKG::AbstractData *resp, const HostAddress &nodeId,
const Header *req = nullptr) override; const Header *req = nullptr) override;
unsigned int sendData(PKG::AbstractData *resp, const HostAddress &nodeId,
const Header *req = nullptr) override;
unsigned int sendData(const PKG::AbstractData *resp, const AbstractNodeInfo *node, unsigned int sendData(const PKG::AbstractData *resp, const AbstractNodeInfo *node,
const Header *req = nullptr) override; 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. * @brief hashgenerator This method generate a hash from any value.

View File

@ -21,6 +21,8 @@ namespace PKG {
*/ */
class HEARTSHARED_EXPORT AbstractNetworkMember: public DBObject class HEARTSHARED_EXPORT AbstractNetworkMember: public DBObject
{ {
QH_PACKAGE(AbstractNetworkMember, "AbstractNetworkMember")
public: public:
AbstractNetworkMember(); AbstractNetworkMember();
AbstractNetworkMember(const Package& pkg); AbstractNetworkMember(const Package& pkg);

View File

@ -12,7 +12,6 @@
#include <request.h> #include <request.h>
namespace QH { namespace QH {
@ -36,6 +35,8 @@ enum class UserRequestType: unsigned char {
*/ */
class HEARTSHARED_EXPORT AuthRequest: public UserMember, public Request class HEARTSHARED_EXPORT AuthRequest: public UserMember, public Request
{ {
QH_PACKAGE(AuthRequest, "AuthRequest")
public: public:
AuthRequest(); AuthRequest();
AuthRequest(const Package& pkg); AuthRequest(const Package& pkg);

View File

@ -36,6 +36,7 @@ template <class BASE>
*/ */
class CachedDbObjectsRequest : public BASE class CachedDbObjectsRequest : public BASE
{ {
public: public:
CachedDbObjectsRequest(const QString& condition) { CachedDbObjectsRequest(const QString& condition) {
_condition = condition; _condition = condition;

View File

@ -287,8 +287,6 @@ DBObject *DBObject::cloneRaw() const {
return nullptr; return nullptr;
} }
cloneObject->init();
return cloneObject; return cloneObject;
} }

View File

@ -92,6 +92,8 @@ typedef QMap<QString, DBVariant> DBVariantMap;
*/ */
class HEARTSHARED_EXPORT DBObject : public AbstractData, public ISubscribableData class HEARTSHARED_EXPORT DBObject : public AbstractData, public ISubscribableData
{ {
QH_PACKAGE(DBObject, "DBObject")
public: public:
/** /**

View File

@ -22,6 +22,8 @@ namespace PKG {
*/ */
class HEARTSHARED_EXPORT DBObjectSet: public DBObject class HEARTSHARED_EXPORT DBObjectSet: public DBObject
{ {
QH_PACKAGE(DBObjectSet, "DBObjectSet")
public: public:
DBObjectSet(const QString table); DBObjectSet(const QString table);

View File

@ -21,6 +21,8 @@ namespace PKG {
*/ */
class HEARTSHARED_EXPORT DefaultPermision: public MemberPermisionObject class HEARTSHARED_EXPORT DefaultPermision: public MemberPermisionObject
{ {
QH_PACKAGE(DefaultPermision, "DefaultPermision")
public: public:
DefaultPermision(); DefaultPermision();
DefaultPermision(const PermisionData& permision); DefaultPermision(const PermisionData& permision);

View File

@ -19,6 +19,8 @@ namespace PKG {
*/ */
class HEARTSHARED_EXPORT DeleteObject: public DBObject, public IToken class HEARTSHARED_EXPORT DeleteObject: public DBObject, public IToken
{ {
QH_PACKAGE(DeleteObject, "DeleteObject")
public: public:
DeleteObject(); DeleteObject();
DeleteObject(const Package& pkg); DeleteObject(const Package& pkg);

View File

@ -19,6 +19,8 @@ namespace PKG {
*/ */
class HEARTSHARED_EXPORT GetMaxIntegerId: public DBObject class HEARTSHARED_EXPORT GetMaxIntegerId: public DBObject
{ {
QH_PACKAGE(GetMaxIntegerId, "GetMaxIntegerId")
public: public:
/** /**
* @brief GetMaxIntegerId This is default constructor of the GetMaxIntegerId class. * @brief GetMaxIntegerId This is default constructor of the GetMaxIntegerId class.

View File

@ -22,6 +22,8 @@ namespace PKG {
*/ */
class HEARTSHARED_EXPORT GetSingleValue final: public DBObject class HEARTSHARED_EXPORT GetSingleValue final: public DBObject
{ {
QH_PACKAGE(GetSingleValue, "GetSingleValue")
public: public:
/** /**
* @brief GetSingleValue This is default constructor of the GetMaxIntegerId class. * @brief GetSingleValue This is default constructor of the GetMaxIntegerId class.

View File

@ -117,21 +117,13 @@ QString MemberPermisionObject::primaryKey() const {
return ""; return "";
} }
bool MemberPermisionObject::init() {
if (!DBObject::init())
return false;
setId(_key.hash());
return true;
}
PermisionData MemberPermisionObject::key() const { PermisionData MemberPermisionObject::key() const {
return _key; return _key;
} }
void MemberPermisionObject::setKey(const PermisionData &key) { void MemberPermisionObject::setKey(const PermisionData &key) {
_key = key; _key = key;
setId(_key.hash());
} }
Permission MemberPermisionObject::permisions() const { Permission MemberPermisionObject::permisions() const {

View File

@ -22,6 +22,8 @@ namespace PKG {
*/ */
class HEARTSHARED_EXPORT MemberPermisionObject: public DBObject class HEARTSHARED_EXPORT MemberPermisionObject: public DBObject
{ {
QH_PACKAGE(MemberPermisionObject, "MemberPermisionObject")
public: public:
MemberPermisionObject(); MemberPermisionObject();
MemberPermisionObject(const Package& pkg); MemberPermisionObject(const Package& pkg);
@ -75,7 +77,6 @@ protected:
QDataStream &toStream(QDataStream &stream) const override; QDataStream &toStream(QDataStream &stream) const override;
QString condition() const override; QString condition() const override;
QString primaryKey() const override; QString primaryKey() const override;
bool init() override;
private: private:
Permission _permision; Permission _permision;

View File

@ -20,6 +20,8 @@ namespace PKG {
*/ */
class HEARTSHARED_EXPORT NetworkMember: public AbstractNetworkMember class HEARTSHARED_EXPORT NetworkMember: public AbstractNetworkMember
{ {
QH_PACKAGE(NetworkMember, "NetworkMember")
public: public:
NetworkMember(); NetworkMember();
NetworkMember(const QVariant& id); NetworkMember(const QVariant& id);

View File

@ -30,6 +30,8 @@ namespace PKG {
*/ */
class HEARTSHARED_EXPORT SetSingleValue final: public DBObject class HEARTSHARED_EXPORT SetSingleValue final: public DBObject
{ {
QH_PACKAGE(SetSingleValue, "SetSingleValue")
public: public:
/** /**
* @brief SetSingleValue This is default constructor of the update query generator. * @brief SetSingleValue This is default constructor of the update query generator.

View File

@ -21,6 +21,8 @@ namespace PKG {
*/ */
class HEARTSHARED_EXPORT UserMember: public AbstractNetworkMember class HEARTSHARED_EXPORT UserMember: public AbstractNetworkMember
{ {
QH_PACKAGE(UserMember, "UserMember")
public: public:
UserMember(); UserMember();
UserMember(const Package &pkg); UserMember(const Package &pkg);

View File

@ -37,6 +37,8 @@ enum class WebSocketRequest {
class HEARTSHARED_EXPORT WebSocket: class HEARTSHARED_EXPORT WebSocket:
public AbstractData, public Request public AbstractData, public Request
{ {
QH_PACKAGE(WebSocket, "WebSocket")
public: public:
WebSocket(); WebSocket();
WebSocket(const Package& package); WebSocket(const Package& package);

View File

@ -23,6 +23,8 @@ namespace PKG {
*/ */
class HEARTSHARED_EXPORT WebSocketSubscriptions: public AbstractData class HEARTSHARED_EXPORT WebSocketSubscriptions: public AbstractData
{ {
QH_PACKAGE(WebSocketSubscriptions, "WebSocketSubscriptions")
public: public:
WebSocketSubscriptions(); WebSocketSubscriptions();
WebSocketSubscriptions(const Package& package); WebSocketSubscriptions(const Package& package);

View File

@ -37,7 +37,7 @@ ParserResult SingleClient::parsePackage(const QSharedPointer<PKG::AbstractData>
return parentResult; return parentResult;
} }
if (H_16<QH::PKG::UserMember>() == pkg->cmd()) { if (QH::PKG::UserMember::command() == pkg->cmd()) {
QH::PKG::UserMember *obj = static_cast<QH::PKG::UserMember*>(pkg.data()); QH::PKG::UserMember *obj = static_cast<QH::PKG::UserMember*>(pkg.data());
if (!(obj->isValid() && obj->getSignToken().isValid())) { if (!(obj->isValid() && obj->getSignToken().isValid())) {
@ -51,7 +51,7 @@ ParserResult SingleClient::parsePackage(const QSharedPointer<PKG::AbstractData>
return QH::ParserResult::Processed; return QH::ParserResult::Processed;
} else if (H_16<PKG::WebSocketSubscriptions>() == pkg->cmd()) { } else if (PKG::WebSocketSubscriptions::command() == pkg->cmd()) {
PKG::WebSocketSubscriptions *obj = static_cast<PKG::WebSocketSubscriptions*>(pkg.data()); PKG::WebSocketSubscriptions *obj = static_cast<PKG::WebSocketSubscriptions*>(pkg.data());
if (!obj->isValid()) { if (!obj->isValid()) {
return ParserResult::Error; return ParserResult::Error;
@ -338,6 +338,16 @@ unsigned int SingleClient::sendData(PKG::AbstractData *resp,
return DataBaseNode::sendData(resp, address, req); return DataBaseNode::sendData(resp, address, req);
} }
unsigned int SingleClient::sendData(PKG::AbstractData *resp,
const AbstractNode *node,
const Header *req) {
if (!signPackageWithToken(resp)) {
return 0;
}
return DataBaseNode::sendData(resp, node, req);
}
unsigned int SingleClient::sendData(PKG::AbstractData *resp, unsigned int SingleClient::sendData(PKG::AbstractData *resp,
const QVariant &nodeId, const QVariant &nodeId,
const Header *req) { const Header *req) {

View File

@ -275,13 +275,38 @@ protected:
void nodeConnected(AbstractNodeInfo *node) override; void nodeConnected(AbstractNodeInfo *node) override;
void nodeDisconnected(AbstractNodeInfo *node) override; void nodeDisconnected(AbstractNodeInfo *node) override;
/**
* @brief sendData This method is wraper of default sendData method but add sign to sendet pacakge.
* @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.
*/
unsigned int sendData(PKG::AbstractData *resp, unsigned int sendData(PKG::AbstractData *resp,
const HostAddress &address, const HostAddress &address,
const Header *req = nullptr) override; const Header *req = nullptr);
/**
* @brief sendData This method is wraper of default sendData method but add sign to sendet pacakge.
* @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.
*/
unsigned int sendData(PKG::AbstractData *resp,
const AbstractNode *node,
const Header *req = nullptr);
/**
* @brief sendData This method is wraper of default sendData method but add sign to sendet pacakge.
* @param resp This is sending object to the nodeId.
* @param nodeId This is id of target node.
* @param req This is header of request.
* @return true if a data send successful.
*/
unsigned int sendData(PKG::AbstractData *resp, unsigned int sendData(PKG::AbstractData *resp,
const QVariant &nodeId, const QVariant &nodeId,
const Header *req = nullptr) override; const Header *req = nullptr);
/** /**
* @brief realServerAddress This method return the real server address that connected with this node. * @brief realServerAddress This method return the real server address that connected with this node.

View File

@ -160,7 +160,7 @@ ParserResult SingleServer::parsePackage(const QSharedPointer<PKG::AbstractData>
return parentResult; return parentResult;
} }
if (H_16<QH::PKG::AuthRequest>() == pkg->cmd()) { if (QH::PKG::AuthRequest::command() == pkg->cmd()) {
auto obj = pkg.staticCast<QH::PKG::AuthRequest>(); auto obj = pkg.staticCast<QH::PKG::AuthRequest>();
if (!obj->isValid()) { if (!obj->isValid()) {
@ -193,7 +193,7 @@ ParserResult SingleServer::parsePackage(const QSharedPointer<PKG::AbstractData>
}; };
if (H_16<PKG::DeleteObject>() == pkg->cmd()) { if (PKG::DeleteObject::command() == pkg->cmd()) {
auto obj = pkg.staticCast<PKG::DeleteObject>(); auto obj = pkg.staticCast<PKG::DeleteObject>();
auto requesterId = getSender(sender, obj.data()); auto requesterId = getSender(sender, obj.data());

View File

@ -130,7 +130,7 @@ protected:
return parentResult; return parentResult;
} }
if (H_16<MyPackage>() == pkg.hdr.command) { if (MyPackage::command() == pkg.hdr.command) {
MyPackage obj(pkg); MyPackage obj(pkg);
// print responce of server // print responce of server

View File

@ -17,7 +17,6 @@
class TestingClient: public QH::AbstractNode { class TestingClient: public QH::AbstractNode {
// AbstractNode interface // AbstractNode interface
public: public:
const QH::PKG::Ping& getPing() const { const QH::PKG::Ping& getPing() const {

View File

@ -12,7 +12,7 @@
#define LOCAL_TEST_PORT TEST_PORT + 4 #define LOCAL_TEST_PORT TEST_PORT + 4
class BigPackage: public QH::PKG::AbstractData { class BigPackage: public QH::PKG::AbstractData {
QH_PACKAGE(BigPackage, "BigPackage")
public: public:
BigPackage(){ BigPackage(){
data = {}; data = {};
@ -21,7 +21,7 @@ public:
// StreamBase interface // StreamBase interface
protected: protected:
QDataStream &fromStream(QDataStream &stream) { QDataStream &fromStream(QDataStream &stream) override{
AbstractData::fromStream(stream); AbstractData::fromStream(stream);
stream >> data; stream >> data;
@ -29,7 +29,7 @@ protected:
return stream; return stream;
}; };
QDataStream &toStream(QDataStream &stream) const { QDataStream &toStream(QDataStream &stream) const override{
AbstractData::toStream(stream); AbstractData::toStream(stream);
stream << data; stream << data;
@ -64,7 +64,7 @@ protected:
void incomingData(const QH::PKG::AbstractData *pkg, const QH::AbstractNodeInfo *sender) override { void incomingData(const QH::PKG::AbstractData *pkg, const QH::AbstractNodeInfo *sender) override {
Q_UNUSED(sender); Q_UNUSED(sender);
if (pkg->cmd() == H_16<BigPackage>()) { if (pkg->cmd() == BigPackage::command()) {
data->copy<BigPackage>(*pkg); data->copy<BigPackage>(*pkg);
sendData(data, sender); sendData(data, sender);

View File

@ -24,8 +24,6 @@ protected:
res->setTrust(0); res->setTrust(0);
res->setId(QString(this->randomArray(5).toHex())); res->setId(QString(this->randomArray(5).toHex()));
res->prepareToSend();
return res; return res;
}; };

View File

@ -150,7 +150,7 @@ protected:
return parentResult; return parentResult;
} }
if (H_16<MyPackage>() == pkg.hdr.command) { if (MyPackage::command() == pkg.hdr.command) {
MyPackage obj(pkg); MyPackage obj(pkg);
// print responce of server // print responce of server