MythTV master
mythsocket.h
Go to the documentation of this file.
1
2#ifndef MYTH_SOCKET_H
3#define MYTH_SOCKET_H
4
5#include <QHostAddress>
6#include <QStringList>
7#include <QAtomicInt>
8#include <QMutex>
9#include <QHash>
10
11#include "referencecounter.h"
12#include "mythsocket_cb.h"
13#include "mythbaseexp.h"
14#include "mthread.h"
15
16class QTcpSocket;
17
25class MBASE_PUBLIC MythSocket : public QObject, public ReferenceCounter
26{
27 Q_OBJECT
28
29 friend class MythSocketManager;
30
31 public:
32 explicit MythSocket(qintptr socket = -1, MythSocketCBs *cb = nullptr,
33 bool use_shared_thread = false);
34
35 bool ConnectToHost(const QString &hostname, quint16 port);
36 bool ConnectToHost(const QHostAddress &address, quint16 port);
37 void DisconnectFromHost(void);
38
39 bool Validate(std::chrono::milliseconds timeout = kMythSocketLongTimeout,
40 bool error_dialog_desired = false);
41 bool IsValidated(void) const { return m_isValidated; }
42
43 bool Announce(const QStringList &new_announce);
44 QStringList GetAnnounce(void) const { return m_announce; }
45 void SetAnnounce(const QStringList &new_announce);
46 bool IsAnnounced(void) const { return m_isAnnounced; }
47
48 void SetReadyReadCallbackEnabled(bool enabled)
49 { m_disableReadyReadCallback.fetchAndStoreOrdered((enabled) ? 0 : 1); }
50
51 bool SendReceiveStringList(
52 QStringList &list, uint min_reply_length = 0,
53 std::chrono::milliseconds timeoutMS = kLongTimeout);
54
55 bool ReadStringList(QStringList &list, std::chrono::milliseconds timeoutMS = kShortTimeout);
56 bool WriteStringList(const QStringList &list);
57
58 bool IsConnected(void) const;
59 bool IsDataAvailable(void);
60
61 QHostAddress GetPeerAddress(void) const;
62 int GetPeerPort(void) const;
63 int GetSocketDescriptor(void) const;
64
65 // RemoteFile stuff
66 int Write(const char *data, int size);
67 int Read(char *data, int size, std::chrono::milliseconds max_wait);
68 void Reset(void);
69
70 static constexpr std::chrono::milliseconds kShortTimeout { kMythSocketShortTimeout };
71 static constexpr std::chrono::milliseconds kLongTimeout { kMythSocketLongTimeout };
72
73 private:
74 QString LOC()
75 {
76 return QString("MythSocket(%1:%2): ")
77 .arg((intptr_t)(this), 0, 16).arg(GetSocketDescriptor());
78 }
79
80
81 signals:
82 void CallReadyRead(void);
83
84 protected slots:
85 void ConnectHandler(void);
86 void ErrorHandler(QAbstractSocket::SocketError err);
87 void AboutToCloseHandler(void);
88 void DisconnectHandler(void);
89 void ReadyReadHandler(void);
90 void CallReadyReadHandler(void);
91
92 void ReadStringListReal(QStringList *list, std::chrono::milliseconds timeoutMS, bool *ret);
93 void WriteStringListReal(const QStringList *list, bool *ret);
94 void ConnectToHostReal(const QHostAddress& addr, quint16 port, bool *ret);
95 void DisconnectFromHostReal(void);
96
97 void WriteReal(const char *data, int size, int *ret);
98 void ReadReal(char *data, int size, std::chrono::milliseconds max_wait_ms, int *ret);
99 void ResetReal(void);
100
101 void IsDataAvailableReal(bool *ret) const;
102
103 protected:
104 ~MythSocket() override; // force reference counting
105
106 QTcpSocket *m_tcpSocket {nullptr}; // only set in ctor
107 MThread *m_thread {nullptr}; // only set in ctor
108 mutable QMutex m_lock;
109 qintptr m_socketDescriptor {-1}; // protected by m_lock
110 QHostAddress m_peerAddress; // protected by m_lock
111 int m_peerPort {-1}; // protected by m_lock
112 MythSocketCBs *m_callback {nullptr}; // only set in ctor
113 bool m_useSharedThread; // only set in ctor
114 QAtomicInt m_disableReadyReadCallback {0};
115 bool m_connected {false}; // protected by m_lock
118 mutable QAtomicInt m_dataAvailable {0};
119 bool m_isValidated {false}; // only set in thread using MythSocket
120 bool m_isAnnounced {false}; // only set in thread using MythSocket
121 QStringList m_announce; // only set in thread using MythSocket
122
123 static const int kSocketReceiveBufferSize;
124
125 static QMutex s_loopbackCacheLock;
126 static QHash<QString, QHostAddress::SpecialAddress> s_loopbackCache;
127
128 static QMutex s_thread_lock;
129 static MThread *s_thread; // protected by s_thread_lock
130 static int s_thread_cnt; // protected by s_thread_lock
131
132 private:
133 Q_DISABLE_COPY(MythSocket)
134};
135
136#endif /* MYTH_SOCKET_H */
This is a wrapper around QThread that does several additional things.
Definition: mthread.h:49
Class for communcating between myth backends and frontends.
Definition: mythsocket.h:26
static const int kSocketReceiveBufferSize
Definition: mythsocket.h:123
bool IsValidated(void) const
Definition: mythsocket.h:41
QStringList m_announce
Definition: mythsocket.h:121
static QHash< QString, QHostAddress::SpecialAddress > s_loopbackCache
Definition: mythsocket.h:126
bool IsAnnounced(void) const
Definition: mythsocket.h:46
static MThread * s_thread
Definition: mythsocket.h:129
QStringList GetAnnounce(void) const
Definition: mythsocket.h:44
bool m_useSharedThread
Definition: mythsocket.h:113
static QMutex s_loopbackCacheLock
Definition: mythsocket.h:125
QString LOC()
Definition: mythsocket.h:74
static int s_thread_cnt
Definition: mythsocket.h:130
static QMutex s_thread_lock
Definition: mythsocket.h:128
QHostAddress m_peerAddress
Definition: mythsocket.h:110
void SetReadyReadCallbackEnabled(bool enabled)
Definition: mythsocket.h:48
void CallReadyRead(void)
QMutex m_lock
Definition: mythsocket.h:108
General purpose reference counter.
unsigned int uint
Definition: freesurround.h:24
static void(* m_callback)(void *, QString &)
#define MBASE_PUBLIC
Definition: mythbaseexp.h:15
static constexpr std::chrono::milliseconds kMythSocketShortTimeout
Definition: mythsocket_cb.h:9
static constexpr std::chrono::milliseconds kMythSocketLongTimeout
Definition: mythsocket_cb.h:10
string hostname
Definition: caa.py:17