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 do
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 while (timer.elapsed() < timeout && total < size);
62
63 do
64 {
65 m_socket.waitForBytesWritten((timeout - timer.elapsed()).count());
66 }
67 while (timer.elapsed() < timeout && m_socket.bytesToWrite() > 0);
68
69 if (timer.elapsed() >= timeout)
70 {
71 LOG(VB_UPNP, LOG_ERR,
72 QString("Exceeded timeout waiting for write to %1:%2. size: %3 total: %4 bytesToWrite: %5")
73 .arg(m_socket.peerAddress().toString(), QString::number(m_socket.peerPort()),
74 QString::number(size), QString::number(total), QString::number(m_socket.bytesToWrite())
75 )
76 );
77 }
78 return total;
79}
80
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