TTKMusicPlayer  4.3.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
ttkabstractnetwork.cpp
Go to the documentation of this file.
1 #include "ttkabstractnetwork.h"
2 #if !TTK_QT_VERSION_CHECK(5,8,0)
3 #include <QBuffer>
4 #endif
5 
7  : QObject(parent),
8  m_interrupt(false),
9  m_stateCode(TTK::NetworkCode::Query),
10  m_reply(nullptr)
11 {
12 #ifndef QT_NO_SSL
13  connect(&m_manager, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)), SLOT(sslErrors(QNetworkReply*,QList<QSslError>)));
14 #endif
15 }
16 
18 {
19  m_interrupt = true;
21 
22  deleteAll();
23 }
24 
26 {
27  if(m_reply)
28  {
29  m_reply->deleteLater();
30  m_reply = nullptr;
31  }
32  m_interrupt = true;
33 }
34 
36 {
37  m_interrupt = false;
38 }
39 
40 void TTKAbstractNetwork::replyError(QNetworkReply::NetworkError error)
41 {
42  TTK_ERROR_STREAM("Abnormal network connection, module" << this << "code" << error);
43  Q_EMIT downloadDataChanged({});
44  deleteAll();
45 }
46 
47 #ifndef QT_NO_SSL
48 void TTKAbstractNetwork::sslErrors(QNetworkReply* reply, const QList<QSslError> &errors)
49 {
50  sslErrorsString(reply, errors);
51  Q_EMIT downloadDataChanged({});
52  deleteAll();
53 }
54 
55 void TTKAbstractNetwork::sslErrorsString(QNetworkReply *reply, const QList<QSslError> &errors)
56 {
57  QString errorString;
58  for(const QSslError &error : qAsConst(errors))
59  {
60  if(!errorString.isEmpty())
61  {
62  errorString += ", ";
63  }
64  errorString += error.errorString();
65  }
66 
67  TTK_ERROR_STREAM("SslErrors:" << errorString);
68  reply->ignoreSslErrors();
69 }
70 #endif
71 
72 
73 
74 void TTK::setUserAgentHeader(QNetworkRequest *request, const QByteArray &data) noexcept
75 {
76  request->setRawHeader("User-Agent", data.isEmpty() ? QByteArray("Mozilla/5.0 (X11; Linux x86_64; rv:141.0) Gecko/20100101 Firefox/141.0") : data);
77 }
78 
79 void TTK::setContentTypeHeader(QNetworkRequest *request, const QByteArray &data) noexcept
80 {
81  request->setRawHeader("Content-Type", data.isEmpty() ? QByteArray("application/x-www-form-urlencoded") : data);
82 }
83 
84 void TTK::setSslConfiguration(QNetworkRequest *request, QSslSocket::PeerVerifyMode mode) noexcept
85 {
86 #ifndef QT_NO_SSL
87  QSslConfiguration sslConfig = request->sslConfiguration();
88  sslConfig.setPeerVerifyMode(mode);
89  request->setSslConfiguration(sslConfig);
90 #else
91  Q_UNUSED(request);
92  Q_UNUSED(mode);
93 #endif
94 }
95 
96 qint64 TTK::fetchFileSizeByUrl(const QString &url)
97 {
98  qint64 size = -1;
99 
100  QNetworkRequest request;
101  request.setUrl(url);
102  TTK::setSslConfiguration(&request);
103  TTK::setContentTypeHeader(&request);
104 
105  TTKEventLoop loop;
106  QNetworkAccessManager manager;
107  QNetworkReply *reply = manager.head(request);
108  QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
109  QtNetworkErrorVoidConnect(reply, &loop, quit, TTK_SLOT);
110  loop.exec();
111 
112  if(reply->error() != QNetworkReply::NoError)
113  {
114  TTK_INFO_STREAM(reply->error() << reply->errorString() << reply->readAll());
115  return size;
116  }
117 
118  size = reply->header(QNetworkRequest::ContentLengthHeader).toLongLong();
119  const QVariant &redirection = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
120  if(redirection.isValid())
121  {
122  size = fetchFileSizeByUrl(redirection.toString());
123  }
124 
125  reply->deleteLater();
126  return size;
127 }
128 
129 QByteArray TTK::syncNetworkQueryForGet(QNetworkRequest *request)
130 {
131  TTKEventLoop loop;
132  QNetworkAccessManager manager;
133  QNetworkReply *reply = manager.get(*request);
134  QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
135  QtNetworkErrorVoidConnect(reply, &loop, quit, TTK_SLOT);
136  loop.exec();
137 
138  if(reply->error() != QNetworkReply::NoError)
139  {
140  TTK_INFO_STREAM(reply->error() << reply->errorString() << reply->readAll());
141  return {};
142  }
143 
144  const QVariant &redirection = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
145  if(redirection.isValid())
146  {
147  reply->deleteLater();
148  return redirection.toString().toUtf8();
149  }
150 
151  const QByteArray bytes(reply->readAll());
152  reply->deleteLater();
153  return bytes;
154 }
155 
156 QByteArray TTK::syncNetworkQueryForPost(QNetworkRequest *request, const QByteArray &data)
157 {
158  TTKEventLoop loop;
159  QNetworkAccessManager manager;
160  QNetworkReply *reply = manager.post(*request, data);
161  QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
162  QtNetworkErrorVoidConnect(reply, &loop, quit, TTK_SLOT);
163  loop.exec();
164 
165  if(reply->error() != QNetworkReply::NoError)
166  {
167  TTK_INFO_STREAM(reply->error() << reply->errorString() << reply->readAll());
168  return {};
169  }
170 
171  const QByteArray bytes(reply->readAll());
172  reply->deleteLater();
173  return bytes;
174 }
175 
176 QByteArray TTK::syncNetworkQueryForPut(QNetworkRequest *request, const QByteArray &data)
177 {
178  TTKEventLoop loop;
179  QNetworkAccessManager manager;
180  QNetworkReply *reply = manager.put(*request, data);
181  QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
182  QtNetworkErrorVoidConnect(reply, &loop, quit, TTK_SLOT);
183  loop.exec();
184 
185  if(reply->error() != QNetworkReply::NoError)
186  {
187  TTK_INFO_STREAM(reply->error() << reply->errorString() << reply->readAll());
188  return {};
189  }
190 
191  const QByteArray bytes(reply->readAll());
192  reply->deleteLater();
193  return bytes;
194 }
195 
196 QByteArray TTK::syncNetworkQueryForPatch(QNetworkRequest *request, const QByteArray &data)
197 {
198  TTKEventLoop loop;
199  QNetworkAccessManager manager;
200 #if TTK_QT_VERSION_CHECK(5,8,0)
201  QNetworkReply *reply = manager.sendCustomRequest(*request, "PATCH", data);
202 #else
203  QBuffer *buffer = new QBuffer;
204  buffer->setData(data);
205  if(!buffer->open(QIODevice::ReadOnly))
206  {
207  delete buffer;
208  return {};
209  }
210 
211  QNetworkReply *reply = manager.sendCustomRequest(*request, "PATCH", buffer);
212  buffer->setParent(reply);
213 #endif
214  QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
215  QtNetworkErrorVoidConnect(reply, &loop, quit, TTK_SLOT);
216  loop.exec();
217 
218  if(reply->error() != QNetworkReply::NoError)
219  {
220  TTK_INFO_STREAM(reply->error() << reply->errorString() << reply->readAll());
221  return {};
222  }
223 
224  const QByteArray bytes(reply->readAll());
225  reply->deleteLater();
226  return bytes;
227 }
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForPost(QNetworkRequest *request, const QByteArray &data)
TTK_MODULE_EXPORT qint64 fetchFileSizeByUrl(const QString &url)
TTK_MODULE_EXPORT void setUserAgentHeader(QNetworkRequest *request, const QByteArray &data={}) noexcept
virtual void deleteAll()
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForPatch(QNetworkRequest *request, const QByteArray &data)
TTK_MODULE_EXPORT void setSslConfiguration(QNetworkRequest *request, QSslSocket::PeerVerifyMode mode=QSslSocket::VerifyNone) noexcept
QNetworkReply * m_reply
volatile TTK::NetworkCode m_stateCode
void downloadDataChanged(const QString &bytes)
#define QtNetworkErrorVoidConnect(p, q, f, s)
Network error void connect.
Definition: ttkqtcompat.h:66
voidpf void uLong size
Definition: ioapi.h:136
int exec(ProcessEventsFlags flags=AllEvents)
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForGet(QNetworkRequest *request)
TTKAbstractNetwork(QObject *parent=nullptr)
The class of the ttk event loop.
Definition: ttkeventloop.h:29
#define qAsConst
Definition: ttkqtglobal.h:57
volatile bool m_interrupt
#define TTK_INFO_STREAM(msg)
Definition: ttklogger.h:74
The namespace of the application object.
Definition: ttkcompat.h:24
QNetworkAccessManager m_manager
TTK_MODULE_EXPORT void setContentTypeHeader(QNetworkRequest *request, const QByteArray &data={}) noexcept
#define TTK_SLOT
Definition: ttkqtglobal.h:177
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForPut(QNetworkRequest *request, const QByteArray &data)
virtual void replyError(QNetworkReply::NetworkError error)
virtual void downloadFinished()
virtual void sslErrors(QNetworkReply *reply, const QList< QSslError > &errors)
const char int mode
Definition: ioapi.h:135
#define TTK_ERROR_STREAM(msg)
Definition: ttklogger.h:76
void sslErrorsString(QNetworkReply *reply, const QList< QSslError > &errors)