Skip to content
Snippets Groups Projects
Commit 0d5af640 authored by Alexander's avatar Alexander Committed by dmitriy.gerasimov
Browse files

Features 2581

parent 00f210dc
No related branches found
No related tags found
1 merge request!11Cellframe clone
...@@ -8,24 +8,53 @@ ...@@ -8,24 +8,53 @@
#include "DapRpcMessage.h" #include "DapRpcMessage.h"
class DapRpcSocket; class DapRpcSocket;
/**
* @brief The DapRpcServiceRequest class
* Class provides to operate with request message by socket interface
* @see DapRpcSocket
*/
class DapRpcServiceRequest class DapRpcServiceRequest
{ {
/// Request message
DapRpcMessage m_request; DapRpcMessage m_request;
/// RPC socket
QPointer<DapRpcSocket> m_socket; QPointer<DapRpcSocket> m_socket;
public: public:
/// Standard constructor
DapRpcServiceRequest(); DapRpcServiceRequest();
/// Copy constructor
DapRpcServiceRequest(const DapRpcServiceRequest &aDapRpcServiceRequest); DapRpcServiceRequest(const DapRpcServiceRequest &aDapRpcServiceRequest);
/// Overloaded constructor
/// @param aRequest Request message
/// @param apSocket Pointer to RPC socket
DapRpcServiceRequest(const DapRpcMessage &aRequest, DapRpcSocket *apSocket); DapRpcServiceRequest(const DapRpcMessage &aRequest, DapRpcSocket *apSocket);
/// Overloaded assignment operator
/// @param aDapRpcServiceRequest Other DapRpcServiceRequest object
/// @return Reference to this object
DapRpcServiceRequest &operator=(const DapRpcServiceRequest &aDapRpcServiceRequest); DapRpcServiceRequest &operator=(const DapRpcServiceRequest &aDapRpcServiceRequest);
/// Standard destructor
~DapRpcServiceRequest(); ~DapRpcServiceRequest();
/// Validation of request message
/// @return If request message is valid or socket is not null return true.
/// Otherwise return false
bool isValid() const; bool isValid() const;
/// Get request message
/// @return Request message
DapRpcMessage request() const; DapRpcMessage request() const;
/// Get current socket
/// @return Socket
DapRpcSocket *socket() const; 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); 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 #endif // DapRPCSERVICEREQUEST_H
...@@ -15,54 +15,136 @@ ...@@ -15,54 +15,136 @@
#define DEFAULT_MSECS_REQUEST_TIMEOUT (30000) #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 class DapRpcSocket : public QObject
{ {
Q_OBJECT Q_OBJECT
Q_DISABLE_COPY(DapRpcSocket) Q_DISABLE_COPY(DapRpcSocket)
/// Pointer to IO device
QPointer<QIODevice> m_pDevice; QPointer<QIODevice> m_pDevice;
/// Buffer
QByteArray m_aBuffer; QByteArray m_aBuffer;
/// Storage to replies by id
QHash<int, QPointer<DapRpcServiceReply>> m_replies; QHash<int, QPointer<DapRpcServiceReply>> m_replies;
/// Default request timeout
int m_defaultRequestTimeout; int m_defaultRequestTimeout;
protected: protected:
/// TODO: not implement
/// @param asMessage Request message
virtual void processRequestMessage(const DapRpcMessage &asMessage); virtual void processRequestMessage(const DapRpcMessage &asMessage);
public: public:
/// Standard constructor
explicit DapRpcSocket(QObject *apParent = nullptr); 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); explicit DapRpcSocket(QIODevice *apDevice, QObject *apParent = nullptr);
/// Virtual destructor
virtual ~DapRpcSocket(); virtual ~DapRpcSocket();
/// Validation initialization and open device
/// @return True if device initilized and opened. Otherwise return false
virtual bool isValid() const; virtual bool isValid() const;
/// Set default request timeout
/// @param aiMsecs Miliseconds
void setDefaultRequestTimeout(int aiMsecs); void setDefaultRequestTimeout(int aiMsecs);
/// Get default request timeout
/// @return Default request timeout
int getDefaultRequestTimeout() const; int getDefaultRequestTimeout() const;
/// Set IO Device
/// @param Pointer to IO device
void setIODevice(QIODevice *pDevice); void setIODevice(QIODevice *pDevice);
signals: signals:
/// The signal emitted when message was received
/// @param asMessage Request message
void messageReceived(const DapRpcMessage &asMessage); void messageReceived(const DapRpcMessage &asMessage);
private slots: private slots:
/// Read data from device and prepare reply
virtual void processIncomingData(); 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); int findJsonDocumentEnd(const QByteArray &aJsonData);
/// Write data from message to device
/// @param asMessage Request message
void writeData(const DapRpcMessage &asMessage); void writeData(const DapRpcMessage &asMessage);
public slots: public slots:
/// Notify to new request message and try to send to device
/// @param asMessage Request message
virtual void notify(const DapRpcMessage &asMessage); 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); 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); 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(), DapRpcMessage invokeRemoteMethodBlocking(const QString &asMethod, int aMsecs, const QVariant &arg1 = QVariant(),
const QVariant &arg2 = QVariant(), const QVariant &arg3 = QVariant(), const QVariant &arg2 = QVariant(), const QVariant &arg3 = QVariant(),
const QVariant &arg4 = QVariant(), const QVariant &arg5 = QVariant(), const QVariant &arg4 = QVariant(), const QVariant &arg5 = QVariant(),
const QVariant &arg6 = QVariant(), const QVariant &arg7 = QVariant(), const QVariant &arg6 = QVariant(), const QVariant &arg7 = QVariant(),
const QVariant &arg8 = QVariant(), const QVariant &arg9 = QVariant(), const QVariant &arg8 = QVariant(), const QVariant &arg9 = QVariant(),
const QVariant &arg10 = 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(), DapRpcMessage invokeRemoteMethodBlocking(const QString &asMethod, const QVariant &arg1 = QVariant(),
const QVariant &arg2 = QVariant(), const QVariant &arg3 = QVariant(), const QVariant &arg2 = QVariant(), const QVariant &arg3 = QVariant(),
const QVariant &arg4 = QVariant(), const QVariant &arg5 = QVariant(), const QVariant &arg4 = QVariant(), const QVariant &arg5 = QVariant(),
const QVariant &arg6 = QVariant(), const QVariant &arg7 = QVariant(), const QVariant &arg6 = QVariant(), const QVariant &arg7 = QVariant(),
const QVariant &arg8 = QVariant(), const QVariant &arg9 = QVariant(), const QVariant &arg8 = QVariant(), const QVariant &arg9 = QVariant(),
const QVariant &arg10 = 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(), DapRpcServiceReply *invokeRemoteMethod(const QString &asMethod, const QVariant &arg1 = QVariant(),
const QVariant &arg2 = QVariant(), const QVariant &arg3 = QVariant(), const QVariant &arg2 = QVariant(), const QVariant &arg3 = QVariant(),
const QVariant &arg4 = QVariant(), const QVariant &arg5 = QVariant(), const QVariant &arg4 = QVariant(), const QVariant &arg5 = QVariant(),
......
...@@ -8,36 +8,68 @@ ...@@ -8,36 +8,68 @@
#include "DapRpcSocket.h" #include "DapRpcSocket.h"
#include "DapRpcAbstractServer.h" #include "DapRpcAbstractServer.h"
/**
* @brief The DapRpcTCPServer class
* TCP server class realize interface DapRpcAbstractServer
* @see DapRpcAbstractServer
* @see QTcpServer
*/
class DapRpcTCPServer : public QTcpServer, public DapRpcAbstractServer class DapRpcTCPServer : public QTcpServer, public DapRpcAbstractServer
{ {
Q_OBJECT Q_OBJECT
Q_DISABLE_COPY(DapRpcTCPServer) Q_DISABLE_COPY(DapRpcTCPServer)
/// Lookup's tcp sockets witj Rpc sockets
QHash<QTcpSocket*, DapRpcSocket*> m_socketLookup; QHash<QTcpSocket*, DapRpcSocket*> m_socketLookup;
protected: 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); virtual void incomingConnection(qintptr aSocketDescriptor);
public: public:
/// Standard constructor
explicit DapRpcTCPServer(QObject *apParent = nullptr); explicit DapRpcTCPServer(QObject *apParent = nullptr);
/// Virtual destructor
virtual ~DapRpcTCPServer(); 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); 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); 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); bool removeService(DapRpcService *apService);
signals: signals:
/// The signal is emitted when client was connected
void onClientConnected(); void onClientConnected();
/// The signal is emitted when client was disconnected
void onClientDisconnected(); void onClientDisconnected();
protected slots: protected slots:
/// Calls when client disconnected
void clientDisconnected(); void clientDisconnected();
/// When receive message from client prepare message by type of message
/// @param asMessage Message
void messageProcessing(const DapRpcMessage &asMessage); void messageProcessing(const DapRpcMessage &asMessage);
// DapRpcAbstractServer interface // DapRpcAbstractServer interface
public slots: public slots:
/// Notify connected clients. Send all message
/// @param message Message to client
void notifyConnectedClients(const DapRpcMessage &message); 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 &params); void notifyConnectedClients(const QString &method, const QJsonArray &params);
}; };
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment