tcpinterface.h
4.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/* ****************************************************************************
* Copyright 2019 Open Systems Development BV *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the "Software"), *
* to deal in the Software without restriction, including without limitation *
* the rights to use, copy, modify, merge, publish, distribute, sublicense, *
* and/or sell copies of the Software, and to permit persons to whom the *
* Software is furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included in *
* all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *
* DEALINGS IN THE SOFTWARE. *
* ***************************************************************************/
#ifndef OSDEV_COMPONENTS_CTCPINTERFACE_H
#define OSDEV_COMPONENTS_CTCPINTERFACE_H
#include <QObject>
#include <QList>
class QTcpServer;
class QTcpSocket;
namespace osdev {
namespace components {
/**
* @brief Handles a generic client or server point-to-point connection
*
* This class can be instantiated as a client or a server.
*
* @note The server can currently only handle one client at a time.
*/
class TcpInterface : public QObject
{
Q_OBJECT
public:
/**
* @brief Constructor
* @param hostName Host to connect with (client-mode), or interface to
* connect at (server-mode)
* @param port Selected port-number
* @param i_bServer False for client-mode, true for server-mode
*/
TcpInterface(const QString& hostName, int port = 2776, bool i_bServer = false);
/// @brief Destructor
~TcpInterface();
/// Deleted copy-constructor
TcpInterface(const TcpInterface&) = delete;
/// Deleted assignment operator
TcpInterface& operator=(const TcpInterface&) = delete;
/// Deleted move-constructor
TcpInterface(TcpInterface&&) = delete;
/// Deleted move operator
TcpInterface& operator=(TcpInterface&&) = delete;
/**
* @return if the interface is active.
* In server mode the interface is listening or connected to and in
* client mode the interface is connected.
*/
bool active() const
{
return m_active;
}
/**
* @brief Reads the first block of data from the received data
* @return First block of data, as a QString
*/
QString getData();
public slots:
/**
* @brief Called when data is ready to be read into the buffer
*/
void readData();
/**
* @brief Send a block of data to the other party
* @param i_qsData Data to be sent
*/
void sendData(const QString& i_qsData);
signals:
/// @brief Emitted when data is present on the connection
void dataPresent();
private slots:
/// @brief Slot called when a new connection is made
void newConnection();
private:
bool m_bServer; ///< True for server-mode, false for client-mode
bool m_active; ///< True if in server mode the server is listening or connected to and in client mode when the client is connected.
QTcpServer* m_tcpServer; ///< Server object instance
QTcpSocket* m_tcpSocket; ///< Client object instance
QTcpSocket* m_clientConnection; ///< Current client connection
quint32 m_blockSize; ///< Maximum size of a data-block
QList<QByteArray> m_dataList; ///< Blocks of data read from the counterpart
};
} // End namespace components
} // End namespace osdev
#endif /* OSDEV_COMPONENTS_CTCPINTERFACE_H */