From 0d5af640ed78aa907af9498d17b96d6dbe9ed2f2 Mon Sep 17 00:00:00 2001 From: Alexander <aleksandr.martynov@demlabs.net> Date: Thu, 17 Oct 2019 12:48:30 -0400 Subject: [PATCH] Features 2581 --- DapRPCProtocol/DapRpcServiceRequest.h | 31 +++++++++- DapRPCProtocol/DapRpcSocket.h | 84 ++++++++++++++++++++++++++- DapRPCProtocol/DapRpcTCPServer.h | 36 +++++++++++- 3 files changed, 147 insertions(+), 4 deletions(-) diff --git a/DapRPCProtocol/DapRpcServiceRequest.h b/DapRPCProtocol/DapRpcServiceRequest.h index aa689f8..0949ff6 100644 --- a/DapRPCProtocol/DapRpcServiceRequest.h +++ b/DapRPCProtocol/DapRpcServiceRequest.h @@ -8,24 +8,53 @@ #include "DapRpcMessage.h" class DapRpcSocket; +/** + * @brief The DapRpcServiceRequest class + * Class provides to operate with request message by socket interface + * @see DapRpcSocket + */ class DapRpcServiceRequest { + /// Request message DapRpcMessage m_request; + /// RPC socket QPointer<DapRpcSocket> m_socket; public: + /// Standard constructor DapRpcServiceRequest(); + /// Copy constructor DapRpcServiceRequest(const DapRpcServiceRequest &aDapRpcServiceRequest); + /// Overloaded constructor + /// @param aRequest Request message + /// @param apSocket Pointer to RPC socket DapRpcServiceRequest(const DapRpcMessage &aRequest, DapRpcSocket *apSocket); + /// Overloaded assignment operator + /// @param aDapRpcServiceRequest Other DapRpcServiceRequest object + /// @return Reference to this object DapRpcServiceRequest &operator=(const DapRpcServiceRequest &aDapRpcServiceRequest); + /// Standard destructor ~DapRpcServiceRequest(); + /// Validation of request message + /// @return If request message is valid or socket is not null return true. + /// Otherwise return false bool isValid() const; + /// Get request message + /// @return Request message DapRpcMessage request() const; + /// Get current socket + /// @return Socket DapRpcSocket *socket() const; - bool respond(const DapRpcMessage &aResponse); + /// Create response to following respont by socket + /// @param aReturnValue Return value from service + /// @return False if socket is closed bool respond(QVariant aReturnValue); + /// Send response to socket + /// @param aResponse Response message + /// @return False if socket is closed + bool respond(const DapRpcMessage &aResponse); }; #endif // DapRPCSERVICEREQUEST_H diff --git a/DapRPCProtocol/DapRpcSocket.h b/DapRPCProtocol/DapRpcSocket.h index 9a2836d..b781035 100644 --- a/DapRPCProtocol/DapRpcSocket.h +++ b/DapRPCProtocol/DapRpcSocket.h @@ -15,54 +15,136 @@ #define DEFAULT_MSECS_REQUEST_TIMEOUT (30000) +/** + * @brief The DapRpcSocket class + * Realization socket interface: + * - Store information about device and data + * - Sending/receiving messages + * - Control sending request by timeout + */ class DapRpcSocket : public QObject { Q_OBJECT Q_DISABLE_COPY(DapRpcSocket) + /// Pointer to IO device QPointer<QIODevice> m_pDevice; + /// Buffer QByteArray m_aBuffer; + /// Storage to replies by id QHash<int, QPointer<DapRpcServiceReply>> m_replies; + /// Default request timeout int m_defaultRequestTimeout; protected: + /// TODO: not implement + /// @param asMessage Request message virtual void processRequestMessage(const DapRpcMessage &asMessage); public: + /// Standard constructor explicit DapRpcSocket(QObject *apParent = nullptr); + /// Overloaded constructor + /// @param apDevice Device whick provides both a common implementation and + /// an abstract interface for devices that support reading and writing of blocks of data explicit DapRpcSocket(QIODevice *apDevice, QObject *apParent = nullptr); + /// Virtual destructor virtual ~DapRpcSocket(); + /// Validation initialization and open device + /// @return True if device initilized and opened. Otherwise return false virtual bool isValid() const; + /// Set default request timeout + /// @param aiMsecs Miliseconds void setDefaultRequestTimeout(int aiMsecs); + /// Get default request timeout + /// @return Default request timeout int getDefaultRequestTimeout() const; - + /// Set IO Device + /// @param Pointer to IO device void setIODevice(QIODevice *pDevice); signals: + /// The signal emitted when message was received + /// @param asMessage Request message void messageReceived(const DapRpcMessage &asMessage); private slots: + /// Read data from device and prepare reply virtual void processIncomingData(); + /// Find end of Json document + /// @param aJsonData Json data where need to find end + /// @return Index of end json document. If file empty return -1 int findJsonDocumentEnd(const QByteArray &aJsonData); + /// Write data from message to device + /// @param asMessage Request message void writeData(const DapRpcMessage &asMessage); public slots: + /// Notify to new request message and try to send to device + /// @param asMessage Request message virtual void notify(const DapRpcMessage &asMessage); + /// Send message with delay for sending message + /// @param asMessage Request message + /// @param aMsecs Delay request timeout. If not pass parameter uses default value + /// @return Response from reply virtual DapRpcMessage sendMessageBlocking(const DapRpcMessage &asMessage, int aMsecs = DEFAULT_MSECS_REQUEST_TIMEOUT); + /// Send request message to device + /// @param asMessage Request message + /// @return Pointer of service reply virtual DapRpcServiceReply *sendMessage(const DapRpcMessage &asMessage); + /// Invoke remote method and create response to send to IO device with delay + /// @param asMethod Method's name + /// @param aMsecs Delay time for send + /// @param arg1 First argument + /// @param arg2 Second argument + /// @param arg3 Third argument + /// @param arg4 Fourth argument + /// @param arg5 Fifth argument + /// @param arg6 Six argument + /// @param arg7 Seven argument + /// @param arg8 Eight argument + /// @param arg9 Nine argument + /// @param arg10 Ten argument + /// @return Response from reply DapRpcMessage invokeRemoteMethodBlocking(const QString &asMethod, int aMsecs, const QVariant &arg1 = QVariant(), const QVariant &arg2 = QVariant(), const QVariant &arg3 = QVariant(), const QVariant &arg4 = QVariant(), const QVariant &arg5 = QVariant(), const QVariant &arg6 = QVariant(), const QVariant &arg7 = QVariant(), const QVariant &arg8 = QVariant(), const QVariant &arg9 = QVariant(), const QVariant &arg10 = QVariant()); + /// Invoke remote method and create response to send to IO device with default delay time + /// @param asMethod Method's name + /// @param arg1 First argument + /// @param arg2 Second argument + /// @param arg3 Third argument + /// @param arg4 Fourth argument + /// @param arg5 Fifth argument + /// @param arg6 Six argument + /// @param arg7 Seven argument + /// @param arg8 Eight argument + /// @param arg9 Nine argument + /// @param arg10 Ten argument + /// @return Response from reply DapRpcMessage invokeRemoteMethodBlocking(const QString &asMethod, const QVariant &arg1 = QVariant(), const QVariant &arg2 = QVariant(), const QVariant &arg3 = QVariant(), const QVariant &arg4 = QVariant(), const QVariant &arg5 = QVariant(), const QVariant &arg6 = QVariant(), const QVariant &arg7 = QVariant(), const QVariant &arg8 = QVariant(), const QVariant &arg9 = QVariant(), const QVariant &arg10 = QVariant()); + /// Invoke remote method and create response to send to IO device + /// @param asMethod Method's name + /// @param arg1 First argument + /// @param arg2 Second argument + /// @param arg3 Third argument + /// @param arg4 Fourth argument + /// @param arg5 Fifth argument + /// @param arg6 Six argument + /// @param arg7 Seven argument + /// @param arg8 Eight argument + /// @param arg9 Nine argument + /// @param arg10 Ten argument + /// @return Pointer to service reply DapRpcServiceReply *invokeRemoteMethod(const QString &asMethod, const QVariant &arg1 = QVariant(), const QVariant &arg2 = QVariant(), const QVariant &arg3 = QVariant(), const QVariant &arg4 = QVariant(), const QVariant &arg5 = QVariant(), diff --git a/DapRPCProtocol/DapRpcTCPServer.h b/DapRPCProtocol/DapRpcTCPServer.h index 00b2e47..d48b304 100644 --- a/DapRPCProtocol/DapRpcTCPServer.h +++ b/DapRPCProtocol/DapRpcTCPServer.h @@ -8,36 +8,68 @@ #include "DapRpcSocket.h" #include "DapRpcAbstractServer.h" +/** + * @brief The DapRpcTCPServer class + * TCP server class realize interface DapRpcAbstractServer + * @see DapRpcAbstractServer + * @see QTcpServer + */ class DapRpcTCPServer : public QTcpServer, public DapRpcAbstractServer { Q_OBJECT Q_DISABLE_COPY(DapRpcTCPServer) - + /// Lookup's tcp sockets witj Rpc sockets QHash<QTcpSocket*, DapRpcSocket*> m_socketLookup; protected: + /// This virtual function is called by QTcpServer when a new connection is available + /// @param aSocketDescriptor The socketDescriptor argument is the native socket + /// descriptor for the accepted connection virtual void incomingConnection(qintptr aSocketDescriptor); public: + /// Standard constructor explicit DapRpcTCPServer(QObject *apParent = nullptr); + /// Virtual destructor virtual ~DapRpcTCPServer(); + /// Tells the server to listen for incoming connections on address + /// @param asAddress Address + /// @param aPort Port. If port is 0, a port is chosen automatically + /// @param If address is QHostAddress::Any, the server will listen on all network interfaces + /// @return Returns true on success; otherwise returns false. + /// @see isListening() virtual bool listen(const QString &asAddress = QString(), quint16 aPort = 0); - + /// Add new service + /// @param apService New service + /// @return If service add successfully return true. Otherwise return false bool addService(DapRpcService *apService); + /// Remove service + /// @param apService Service for removing + /// @return If service add successfully return true. Otherwise return false bool removeService(DapRpcService *apService); signals: + /// The signal is emitted when client was connected void onClientConnected(); + /// The signal is emitted when client was disconnected void onClientDisconnected(); protected slots: + /// Calls when client disconnected void clientDisconnected(); + /// When receive message from client prepare message by type of message + /// @param asMessage Message void messageProcessing(const DapRpcMessage &asMessage); // DapRpcAbstractServer interface public slots: + /// Notify connected clients. Send all message + /// @param message Message to client void notifyConnectedClients(const DapRpcMessage &message); + /// Notify connected clients. Send all message + /// @param method Method which clients were notified + /// @param params Parameters of message in JSON format void notifyConnectedClients(const QString &method, const QJsonArray ¶ms); }; -- GitLab