CopyQ
clientsocket.h
1 // SPDX-License-Identifier: GPL-3.0-or-later
2 
3 #ifndef CLIENTSOCKET_H
4 #define CLIENTSOCKET_H
5 
6 #include <QLocalSocket>
7 #include <QObject>
8 #include <QPointer>
9 
10 using ClientSocketId = qulonglong;
11 
12 class LocalSocketGuard final
13 {
14 public:
15  explicit LocalSocketGuard(QLocalSocket *socket);
17 
18  QLocalSocket *get() const { return m_socket; }
19  QLocalSocket *operator->() const { return m_socket; }
20  operator QLocalSocket*() { return m_socket; }
21  operator bool() { return !m_socket.isNull(); }
22 
23  LocalSocketGuard(const LocalSocketGuard &) = delete;
24  LocalSocketGuard &operator=(const LocalSocketGuard &) = delete;
25 
26 private:
27  QPointer<QLocalSocket> m_socket;
28 };
29 
30 class ClientSocket final : public QObject
31 {
32  Q_OBJECT
33 public:
34  ClientSocket();
35 
36  explicit ClientSocket(const QString &serverName, QObject *parent = nullptr);
37 
38  explicit ClientSocket(QLocalSocket *socket, QObject *parent = nullptr);
39 
40  ~ClientSocket();
41 
43  ClientSocketId id() const { return m_socketId; }
44 
46  bool start();
47 
49  void sendMessage(
50  const QByteArray &message,
51  int messageCode
52  );
53 
54  void close();
55 
56 signals:
57  void messageReceived(const QByteArray &message, int messageCode, ClientSocketId clientId);
58  void disconnected(ClientSocketId clientId);
59  void connectionFailed(ClientSocketId clientId);
60 
61 private:
62  void onReadyRead();
63  void onError(QLocalSocket::LocalSocketError error);
64  void onStateChanged(QLocalSocket::LocalSocketState state);
65 
66  void error(const QString &errorMessage);
67 
68  LocalSocketGuard m_socket;
69  ClientSocketId m_socketId;
70  bool m_closed;
71 
72  bool m_hasMessageLength = false;
73  quint32 m_messageLength = 0;
74  QByteArray m_message;
75 };
76 
77 #endif // CLIENTSOCKET_H
Definition: clientsocket.h:12
Definition: clientsocket.h:30
ClientSocketId id() const
Return socket ID unique in process (thread-safe).
Definition: clientsocket.h:43