MythTV master
blockingtcpsocket.cpp
Go to the documentation of this file.
1#include "blockingtcpsocket.h"
2
5
6bool BlockingTcpSocket::connect(const QHostAddress &address, const quint16 port, const std::chrono::milliseconds timeout)
7{
8 m_socket.connectToHost(address, port);
9 if (m_socket.waitForConnected(timeout.count()))
10 {
11 return true;
12 }
13 LOG(VB_UPNP, LOG_ERR, QString("Failed to connect a socket to %1:%2. %3")
14 .arg(address.toString(), QString::number(port), m_socket.errorString())
15 );
16 return false;
17}
18
19QString BlockingTcpSocket::readLine(const std::chrono::milliseconds timeout)
20{
21 MythTimer timer;
22 timer.start();
23 while (timer.elapsed() < timeout && !m_socket.canReadLine())
24 {
25 m_socket.waitForReadyRead((timeout - timer.elapsed()).count());
26 }
27 if (timer.elapsed() >= timeout)
28 {
29 LOG(VB_UPNP, LOG_ERR, QString("Exceeded timeout waiting to read line from %1:%2.")
30 .arg(m_socket.peerAddress().toString(), QString::number(m_socket.peerPort()))
31 );
32 }
33
34 if (m_socket.canReadLine())
35 {
36 return QString::fromUtf8(m_socket.readLine());
37 }
38 return {};
39}
40
41qint64 BlockingTcpSocket::write(const char* data, const qint64 size, const std::chrono::milliseconds timeout)
42{
43 MythTimer timer;
44 timer.start();
45 qint64 total = 0;
46 while ((timer.elapsed() < timeout) && (total < size))
47 {
48 auto written = m_socket.write(data + total, size - total);
49 if (written == -1)
50 {
51 LOG(VB_UPNP, LOG_ERR, QString("Failed to write to %1:%2. %3")
52 .arg(m_socket.peerAddress().toString(),
53 QString::number(m_socket.peerPort()),
54 m_socket.errorString()
55 )
56 );
57 return -1;
58 }
59 total += written;
60 }
61
62 while ((timer.elapsed() < timeout) && (m_socket.bytesToWrite() > 0))
63 {
64 m_socket.waitForBytesWritten((timeout - timer.elapsed()).count());
65 }
66
67 if (timer.elapsed() >= timeout)
68 {
69 LOG(VB_UPNP, LOG_ERR,
70 QString("Exceeded timeout waiting for write to %1:%2. size: %3 total: %4 bytesToWrite: %5")
71 .arg(m_socket.peerAddress().toString(), QString::number(m_socket.peerPort()),
72 QString::number(size), QString::number(total), QString::number(m_socket.bytesToWrite())
73 )
74 );
75 }
76 return total;
77}
78
bool connect(const QHostAddress &address, quint16 port, std::chrono::milliseconds timeout)
Connect the socket to a host.
qint64 write(const char *data, qint64 size, std::chrono::milliseconds timeout)
QString readLine(std::chrono::milliseconds timeout)
Read a whole line from the socket.
A QElapsedTimer based timer to replace use of QTime as a timer.
Definition: mythtimer.h:14
std::chrono::milliseconds elapsed(void)
Returns milliseconds elapsed since last start() or restart()
Definition: mythtimer.cpp:91
void start(void)
starts measuring elapsed time.
Definition: mythtimer.cpp:47
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39