From a57905d6a7389cec6abd9c5c34f896ff04871551 Mon Sep 17 00:00:00 2001
From: EndrII <EndrIIMail@gmail.com>
Date: Wed, 16 Sep 2020 23:40:42 +0300
Subject: [PATCH] update docs (AbstractNode, all public members is descripted)

---
 Heart/AbstractSpace/abstractnode.cpp |  39 +++-----
 Heart/AbstractSpace/abstractnode.h   | 134 +++++++++++++++++----------
 Heart/DataBaseSpace/databasenode.cpp |   4 +-
 Heart/DataBaseSpace/databasenode.h   |   3 +-
 Heart/NetworkSpace/networknode.cpp   |   4 +-
 Heart/NetworkSpace/networknode.h     |  16 ++--
 README.md                            |  10 +-
 doxygen.conf                         |   5 +-
 8 files changed, 115 insertions(+), 100 deletions(-)

diff --git a/Heart/AbstractSpace/abstractnode.cpp b/Heart/AbstractSpace/abstractnode.cpp
index 9f7fd43..ec9a82d 100644
--- a/Heart/AbstractSpace/abstractnode.cpp
+++ b/Heart/AbstractSpace/abstractnode.cpp
@@ -28,14 +28,10 @@ namespace QH {
 
 using namespace PKG;
 
-AbstractNode::AbstractNode(SslMode mode, QObject *ptr):
+AbstractNode::AbstractNode( QObject *ptr):
     QTcpServer(ptr) {
 
-    _mode = mode;
-
     _dataSender = new DataSender();
-
-    setMode(_mode);
 }
 
 bool AbstractNode::run(const QString &addres, unsigned short port) {
@@ -307,12 +303,11 @@ bool AbstractNode::generateSslDataPrivate(const SslSrtData &data, QSslCertificat
     return true;
 }
 
-QSslConfiguration AbstractNode::selfSignedSslConfiguration() {
+QSslConfiguration AbstractNode::selfSignedSslConfiguration(const SslSrtData & sslData) {
     QSslConfiguration res = QSslConfiguration::defaultConfiguration();
 
     QSslKey pkey;
     QSslCertificate crt;
-    SslSrtData sslData;
 
     if (!generateSslDataPrivate(sslData, crt, pkey)) {
 
@@ -914,38 +909,26 @@ SslMode AbstractNode::getMode() const {
     return _mode;
 }
 
-bool AbstractNode::setMode(const SslMode &mode) {
-
-    if (_mode == mode) {
-        return true;
-    }
+bool AbstractNode::useSelfSignedSslConfiguration(const SslSrtData &crtData) {
 
     if (isListening()) {
         return false;
     }
 
-    _mode = mode;
+    _ssl = selfSignedSslConfiguration(crtData);
+    _mode = SslMode::InitSelfSigned;
 
-    switch (_mode) {
-    case SslMode::InitFromSystem: {
-        _ssl = QSslConfiguration::defaultConfiguration();
-        break;
+    return !_ssl.isNull();
+}
 
-    }
-    case SslMode::InitSelfSigned: {
-        _ssl = selfSignedSslConfiguration();
-        break;
-
-    }
-    default: {
-        _ssl = QSslConfiguration();
-        break;
+bool AbstractNode::disableSSL() {
+    if (isListening()) {
+        return false;
     }
 
-    }
+    _mode = SslMode::NoSSL;
 
     return true;
-
 }
 
 void AbstractNode::incomingData(AbstractData *pkg, const HostAddress &sender) {
diff --git a/Heart/AbstractSpace/abstractnode.h b/Heart/AbstractSpace/abstractnode.h
index 7511adb..2f7ea7e 100644
--- a/Heart/AbstractSpace/abstractnode.h
+++ b/Heart/AbstractSpace/abstractnode.h
@@ -49,14 +49,22 @@ enum class ParserResult {
     Processed = 2
 };
 
+/**
+ * @brief The SslMode enum  This enum contatins options for set ssl mode of node (server)
+ * For more information see AbstractNode::useSelfSignedSslConfiguration AbstractNode::useSystemSslConfiguration and AbstractNode::disableSSL methods.
+ */
 enum class SslMode {
+    //// This is not secure connection without ssl encription. It is default value of new any node see AbstractNode(SslMode mode = SslMode::NoSSL, QObject * ptr = nullptr)
     NoSSL,
+    //// This option try enable ssl connection from system configuration form fore information see Qt Documentation https://doc.qt.io/qt-5/qsslconfiguration.html
     InitFromSystem,
+    //// This option force a current node geneerate self signed sertificat and work with it. For more information see a SslSrtData struct
     InitSelfSigned
 };
 
 /**
- * @brief The SslSrtData struct
+ * @brief The SslSrtData struct This structure contains base information for generate self signed ssl certefication.
+ *  If yo want change selfSigned certificate then use method AbstractNode::useSelfSignedSslConfiguration
  */
 struct SslSrtData {
     QString country = "BY";
@@ -85,129 +93,135 @@ class HEARTSHARED_EXPORT AbstractNode : public QTcpServer
 public:
 
     /**
-     * @brief AbstractNode
-     * @param ssl
-     * @param ptr
+     * @brief AbstractNode - base constructor of node.
+     * @param ptr - pointrt to parent Qt object, the AbstractNode class is Q_OBJECT
      */
-    AbstractNode(SslMode mode = SslMode::NoSSL, QObject * ptr = nullptr);    
+    AbstractNode(QObject * ptr = nullptr);
     ~AbstractNode() override;
 
     /**
-     * @brief run
-     * @param addres - If address is empty then serve weel be listen all addreses of all interfaces
-     * @param port
-     * @return true if all good
+     * @brief run - this method implement deployment a network node (server) on selected address.
+     * @param addres - If address is empty then server weel be listen all addreses of all interfaces else listen only selected address.
+     * @param port - This is port of deployment node (server)
+     * @return Result of deployment node (sever). (True if deploy finished successful else false).
      */
     virtual bool run(const QString& addres, unsigned short port);
 
     /**
-     * @brief stop stop this node and close all connections.
+     * @brief stop - stopped this node and close all network connections.
      */
     virtual void stop();
 
     /**
-     * @brief getInfo
-     * @param id of selected node
-     * @return pointer to information about node. if address not found return nullpt
+     * @brief getInfoPtr - This method return information class pointer about netwok connection.
+     *  If Connection with id not found then return nullptr.
+     * @param id - it is network address of requested node
+     * @return The pointer of information about node. if address not found return nullptr
      */
     virtual AbstractNodeInfo* getInfoPtr(const HostAddress &id);
 
     /**
-     * @brief getInfoPtr
-     * @param id peer adders
-     * @return pointer to information about node. if address not found return nullpt
+     * @brief getInfoPtr - this is some that getInfoPtr(const HostAddress &id) bod it is constant implementation.
+     * @param id - it is network address of requested node
+     * @return The pointer of information about node. if address not found return nullptr
      */
     virtual const AbstractNodeInfo* getInfoPtr(const HostAddress &id) const;
 
     /**
-     * @brief ban
-     * @param target id of ban node
+     * @brief ban - this method set for target connection a trust property to 0 and target connection will been aborted.
+     * @param target - it is network address of target connection.
      */
     virtual void ban(const HostAddress& target);
 
     /**
-     * @brief unBan
-     * @param target id of unban node
+     * @brief unBan - this method set for target connection a trust property to 100.
+     * @param target - it is network address of target connection.
      */
     virtual void unBan(const HostAddress& target);
 
     /**
-     * @brief connectToHost - connect to host node
-     * @param address -  address of node
-     * @param mode - mode see SslMode
+     * @brief connectToHost - connect to node (server) with address.
+     * @param address - This is Network address of node (server)
+     * @param mode - This is mode of connection see SslMode.  By default using SslMode::NoSSL connection mode, it is not secure.
      */
     virtual bool connectToHost(const HostAddress &address, SslMode mode = SslMode::NoSSL);
 
     /**
-     * @brief connectToHost - connect to host node. this method find ip address of domain befor connecting
-     * @param domain: address of node
-     * @param port - port of node
-     * @param mode - mode see SslMode
+     * @brief connectToHost - connect to node (server) with domain, bud this method find ip address of domain befor connecting
+     * @param domain - This is domain address of node (server)
+     * @param port - This is target port of node (server)
+     * @param mode - This is mode of connection see SslMode. By default using SslMode::NoSSL connection mode, it is not secure.
      */
     virtual bool connectToHost(const QString &domain, unsigned short port, SslMode mode = SslMode::NoSSL);
 
     /**
-     * @brief addNode - add new node for connect
-     * @param nodeAdderess - the network addres of a new node.
+     * @brief addNode - add new node (server) for this mode
+     * @param nodeAdderess - This is network addres of a new node (server).
+     * @note By Default This immplementation move called function into main Thread and invoke connectToHost method.
      */
     void addNode(const HostAddress& nodeAdderess);
 
     /**
-     * @brief removeNode - remove node
-     * @param nodeAdderess - the adddress of removed node.
+     * @brief removeNode - remove node and disconnected forom node (server)
+     * @param nodeAdderess - This is network adddress of removed node (server).
      */
     void removeNode(const HostAddress& nodeAdderess);
 
     /**
-     * @brief address - address of this node
-     * @return return current adders
+     * @brief address - Thim method return own network address of current node (server)
+     * @return The current network adderss
      */
     HostAddress address() const;
 
     /**
-     * @brief getSslConfig - configuration of this node.
-     * @return current ssl configuration on this nod
+     * @brief getSslConfig - This method return ssl configuration of current node (server).
+     * @return current ssl configuration on this node (server)
      */
     QSslConfiguration getSslConfig() const;
 
     /**
-     * @brief getMode
-     * @return
+     * @brief getMode - This method return SSL mode of corrent node (server).
+     * @return current mode for more information see SslMode
      */
     SslMode getMode() const;
 
     /**
-     * @brief getWorkState
-     * @return
+     * @brief getWorkState - This method collect general information about this server.
+     *  For more information about returned data see getWorkState
+     * @return state value for more information see WorkState class
      */
     virtual WorkState getWorkState() const;
 
     /**
-     * @brief pareseResultToString
-     * @return string of pareseresult
+     * @brief pareseResultToString This method convert ParserResult value to string.
+     * @return The String value of pareseresult
      */
     QString pareseResultToString(const ParserResult& parseResult) const;
 
     /**
-     * @brief connectionsCount - return count fo connections (nodes with status connected)
-     * @return
+     * @brief connectionsCount - return count fo connections (connections with status connected)
+     * @return count valid connections.
      */
     int connectionsCount() const;
 
     /**
      * @brief connectionsCount - return count of nodes with status confirmend
-     * @return
+     * @return return confirmend connections of this node (server)
      */
     int confirmendCount() const;
 
     /**
-     * @brief ping - ping address for testing
-     * @param address - address of other node
-     * @return true if ping sendet
+     * @brief ping This method send ping package to address for testing connection
+     * @param address This is address of target node (server)
+     * @return true if ping sendet successful.
      */
     bool ping( const HostAddress& address);
 
 signals:
+    /**
+     * @brief requestError - this signal emited when client or node received from remoute server or node the BadRequest package.
+     * @param msg - received text of remoute node (server).
+     */
     void requestError(QString msg);
 
 protected:
@@ -232,7 +246,7 @@ protected:
      * @brief selfSignedSslConfiguration
      * @return generate new keys and use it
      */
-    virtual QSslConfiguration selfSignedSslConfiguration();
+    virtual QSslConfiguration selfSignedSslConfiguration( const SslSrtData& = {});
 
     /**
      * @brief createNodeInfo
@@ -347,12 +361,30 @@ protected:
     */
     virtual void incomingTcp(qintptr handle);
 
+    /**
+     * @brief useSelfSignedSslConfiguration - This method reconfigure current node to use selfSigned certificate.
+     * @note Befor invoke this method stop this node (server) see AbstractNode::stop. if mode will be working then this method return false.
+     *  The self signed certificate is temp value, this is will be changed after reboot node (server)
+     * @param crtData - This is data for generation a new self signed certification.
+     * @return result of change node ssl configuration.
+     */
+    bool useSelfSignedSslConfiguration(const SslSrtData& crtData);
 
     /**
-     * @brief setMode - invoke this method befor run method
-     * @param mode
+     * @brief useSystemSslConfiguration - This method reconfigure current node to use sslConfig.
+     * @note Befor invoke this method stop this node (server) see AbstractNode::stop. if mode will be working then this method return false.
+     * @param sslConfig - This is ssl configuration ot a current node (server)
+     * @return result of change node ssl configuration.
      */
-    bool setMode(const SslMode &mode);
+    bool useSystemSslConfiguration(const QSslConfiguration& sslConfig);
+
+    /**
+     * @brief disableSSL - this method disable ssl mode for this node
+     * @note Befor invoke this method stop this node (server) see AbstractNode::stop. if mode will be working then this method return false.
+     * @return true if changes is completed.
+     */
+    bool disableSSL();
+
 
     /**
      * @brief incomingData - this signal invoked when node get command or ansver
diff --git a/Heart/DataBaseSpace/databasenode.cpp b/Heart/DataBaseSpace/databasenode.cpp
index 8589889..05c1358 100644
--- a/Heart/DataBaseSpace/databasenode.cpp
+++ b/Heart/DataBaseSpace/databasenode.cpp
@@ -30,8 +30,8 @@
 namespace QH {
 using namespace PKG;
 
-DataBaseNode::DataBaseNode(QH::SslMode mode, QObject *ptr):
-    AbstractNode(mode, ptr) {
+DataBaseNode::DataBaseNode(QObject *ptr):
+    AbstractNode(ptr) {
 
     _webSocketWorker = new WebSocketController(this);
 
diff --git a/Heart/DataBaseSpace/databasenode.h b/Heart/DataBaseSpace/databasenode.h
index cdb202d..9761171 100644
--- a/Heart/DataBaseSpace/databasenode.h
+++ b/Heart/DataBaseSpace/databasenode.h
@@ -39,10 +39,9 @@ public:
 
     /**
      * @brief BaseNode
-     * @param mode
      * @param ptr
      */
-    DataBaseNode(SslMode mode = SslMode::NoSSL, QObject * ptr = nullptr);
+    DataBaseNode(QObject * ptr = nullptr);
     ~DataBaseNode() override;
 
     /**
diff --git a/Heart/NetworkSpace/networknode.cpp b/Heart/NetworkSpace/networknode.cpp
index 281389a..3137af5 100644
--- a/Heart/NetworkSpace/networknode.cpp
+++ b/Heart/NetworkSpace/networknode.cpp
@@ -39,8 +39,8 @@ namespace QH {
 
 using namespace PKG;
 
-NetworkNode::NetworkNode(QH::SslMode mode, QObject *ptr):
-    DataBaseNode(mode, ptr) {
+NetworkNode::NetworkNode(QObject *ptr):
+    DataBaseNode(ptr) {
 
     _nodeKeys = new KeyStorage(new QSecretRSA2048());
     _router = new Router();
diff --git a/Heart/NetworkSpace/networknode.h b/Heart/NetworkSpace/networknode.h
index d1c82cb..bb12a35 100644
--- a/Heart/NetworkSpace/networknode.h
+++ b/Heart/NetworkSpace/networknode.h
@@ -37,10 +37,9 @@ public:
 
     /**
      * @brief BaseNode
-     * @param mode
      * @param ptr
      */
-    NetworkNode(SslMode mode = SslMode::NoSSL, QObject * ptr = nullptr);
+    NetworkNode(QObject * ptr = nullptr);
     ~NetworkNode() override;
 
     /**
@@ -56,10 +55,11 @@ public:
      * @brief run server on address an port with local name of storage of keys
      * @param addres - network address of node
      * @param port - port of node
+     * @param localNodeName - this is locale node name. Sets name of folder with the data for current node.
      * @return true if node is deployed successful
      */
     bool run(const QString &addres, unsigned short port,
-                     const QString &localNodeName) override;
+             const QString &localNodeName) override;
 
     /**
      * @brief stop - this implementation stop work database and push to database all cache data.
@@ -68,7 +68,7 @@ public:
 
     /**
      * @brief ping - ping node by node id
-     * @param address
+     * @param id
      * @return
      */
     bool ping( const BaseId& id);
@@ -89,14 +89,14 @@ protected:
      * @return true if data sendet seccussful
      */
     bool sendData(const PKG::AbstractData *resp, const BaseId &nodeId,
-                          const Header *req = nullptr) override;
+                  const Header *req = nullptr) override;
 
     bool sendData(PKG::AbstractData *resp, const BaseId &nodeId,
-                          const Header *req = nullptr) override;
+                  const Header *req = nullptr) override;
     bool sendData(const PKG::AbstractData *resp, const HostAddress &nodeId,
-                          const Header *req = nullptr) override;
+                  const Header *req = nullptr) override;
     bool sendData(PKG::AbstractData *resp, const HostAddress &nodeId,
-                          const Header *req = nullptr) override;
+                  const Header *req = nullptr) override;
 
     /**
      * @brief initDefaultDbObjects create default cache and db writer if pointer is null
diff --git a/README.md b/README.md
index 70ec733..f7b91e8 100644
--- a/README.md
+++ b/README.md
@@ -7,19 +7,19 @@ This library consists of two levels (AbstractNode level and DataBaseNode level).
 - [X] Support ssl sockets
 - [X] Support initialize database
 - [X] Support work in database
-- [ ] Sopport decentralized network mode
+- [ ] Support decentralized network mode
 
-### AbstractNode level (1)
+### AbstractNode level (0)
 #### Description
 The AbstractNode level implement only base functons of create new work threads and parsing packages.
 
-For more information see QuasarApp Heart documentation.
+For more information see QuasarApp Heart documentation or QH namespace.
 
-### DataBaseNode level (2)
+### DataBaseNode level (1)
 #### Description
 The DataBaseNode level implement methods and packages for work with databases. This level using Qt classes for wrking with database, so for more information about suport databases see [Qt Documentation](https://doc.qt.io/qt-5/sql-driver.html).
 
-### NetworkNode level (3)
+### NetworkNode level (2)
 #### Description
 This level is still in develop. 
 
diff --git a/doxygen.conf b/doxygen.conf
index 7f4044f..b9b416a 100644
--- a/doxygen.conf
+++ b/doxygen.conf
@@ -791,7 +791,8 @@ WARN_LOGFILE           =
 # Note: If this tag is empty the current directory is searched.
 
 INPUT                  = Heart \
-                         Doc 
+                         Doc  \
+                         README.md
                          
 
 # This tag can be used to specify the character encoding of the source files
@@ -985,7 +986,7 @@ FILTER_SOURCE_PATTERNS =
 # (index.html). This can be useful if you have a project on for instance GitHub
 # and want to reuse the introduction page also for the doxygen output.
 
-USE_MDFILE_AS_MAINPAGE = ./README.md
+USE_MDFILE_AS_MAINPAGE = README.md
 
 #---------------------------------------------------------------------------
 # Configuration options related to source browsing