TTKMusicPlayer  4.1.3.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, 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::makeUserAgentHeader(QNetworkRequest *request, const QByteArray &data)
75 {
76  request->setRawHeader("User-Agent", data.isEmpty() ? "Mozilla/5.0 (X11; Linux x86_64; rv:98.0) Gecko/20100101 Firefox/98.0" : data);
77 }
78 
79 void TTK::makeContentTypeHeader(QNetworkRequest *request, const QByteArray &data)
80 {
81  request->setRawHeader("Content-Type", data.isEmpty() ? "application/x-www-form-urlencoded" : data);
82 }
83 
84 qint64 TTK::fetchFileSizeByUrl(const QString &url)
85 {
86  qint64 size = -1;
87 
88  QNetworkRequest request;
89  request.setUrl(url);
90  TTK::setSslConfiguration(&request);
92 
93  TTKSemaphoreLoop loop;
94  QNetworkAccessManager manager;
95  QNetworkReply *reply = manager.head(request);
96  QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
97  QtNetworkErrorVoidConnect(reply, &loop, quit, TTK_SLOT);
98  loop.exec();
99 
100  if(reply->error() != QNetworkReply::NoError)
101  {
102  TTK_INFO_STREAM(reply->error() << reply->errorString());
103  return size;
104  }
105 
106  size = reply->header(QNetworkRequest::ContentLengthHeader).toLongLong();
107  const QVariant &redirection = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
108  if(redirection.isValid())
109  {
110  size = fetchFileSizeByUrl(redirection.toString());
111  }
112 
113  reply->deleteLater();
114  return size;
115 }
116 
117 void TTK::setSslConfiguration(QNetworkRequest *request, QSslSocket::PeerVerifyMode mode)
118 {
119 #ifndef QT_NO_SSL
120  QSslConfiguration sslConfig = request->sslConfiguration();
121  sslConfig.setPeerVerifyMode(mode);
122  request->setSslConfiguration(sslConfig);
123 #else
124  Q_UNUSED(request);
125  Q_UNUSED(mode);
126 #endif
127 }
128 
129 QByteArray TTK::syncNetworkQueryForGet(QNetworkRequest *request)
130 {
131  TTKSemaphoreLoop 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());
141  return {};
142  }
143 
144  const QByteArray bytes(reply->readAll());
145  reply->deleteLater();
146  return bytes;
147 }
148 
149 QByteArray TTK::syncNetworkQueryForPost(QNetworkRequest *request, const QByteArray &data)
150 {
151  TTKSemaphoreLoop loop;
152  QNetworkAccessManager manager;
153  QNetworkReply *reply = manager.post(*request, data);
154  QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
155  QtNetworkErrorVoidConnect(reply, &loop, quit, TTK_SLOT);
156  loop.exec();
157 
158  if(reply->error() != QNetworkReply::NoError)
159  {
160  TTK_INFO_STREAM(reply->error() << reply->errorString());
161  return {};
162  }
163 
164  const QByteArray bytes(reply->readAll());
165  reply->deleteLater();
166  return bytes;
167 }
168 
169 QByteArray TTK::syncNetworkQueryForPut(QNetworkRequest *request, const QByteArray &data)
170 {
171  TTKSemaphoreLoop loop;
172  QNetworkAccessManager manager;
173  QNetworkReply *reply = manager.put(*request, data);
174  QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
175  QtNetworkErrorVoidConnect(reply, &loop, quit, TTK_SLOT);
176  loop.exec();
177 
178  if(reply->error() != QNetworkReply::NoError)
179  {
180  TTK_INFO_STREAM(reply->error() << reply->errorString());
181  return {};
182  }
183 
184  const QByteArray bytes(reply->readAll());
185  reply->deleteLater();
186  return bytes;
187 }
188 
189 QByteArray TTK::syncNetworkQueryForPatch(QNetworkRequest *request, const QByteArray &data)
190 {
191  TTKSemaphoreLoop loop;
192  QNetworkAccessManager manager;
193 #if TTK_QT_VERSION_CHECK(5,8,0)
194  QNetworkReply *reply = manager.sendCustomRequest(*request, "PATCH", data);
195 #else
196  QBuffer *buffer = new QBuffer;
197  buffer->setData(data);
198  buffer->open(QIODevice::ReadOnly);
199 
200  QNetworkReply *reply = manager.sendCustomRequest(*request, "PATCH", buffer);
201  buffer->setParent(reply);
202 #endif
203  QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
204  QtNetworkErrorVoidConnect(reply, &loop, quit, TTK_SLOT);
205  loop.exec();
206 
207  if(reply->error() != QNetworkReply::NoError)
208  {
209  TTK_INFO_STREAM(reply->error() << reply->errorString());
210  return {};
211  }
212 
213  const QByteArray bytes(reply->readAll());
214  reply->deleteLater();
215  return bytes;
216 }
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForPost(QNetworkRequest *request, const QByteArray &data)
TTK_MODULE_EXPORT qint64 fetchFileSizeByUrl(const QString &url)
virtual void deleteAll()
void downLoadDataChanged(const QString &bytes)
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForPatch(QNetworkRequest *request, const QByteArray &data)
QNetworkReply * m_reply
TTK_MODULE_EXPORT void makeUserAgentHeader(QNetworkRequest *request, const QByteArray &data={})
volatile TTK::NetworkCode m_stateCode
#define QtNetworkErrorVoidConnect(p, q, f, s)
Network error void connect.
Definition: ttkqtcompat.h:66
voidpf void uLong size
Definition: ioapi.h:136
TTK_MODULE_EXPORT void setSslConfiguration(QNetworkRequest *request, QSslSocket::PeerVerifyMode mode=QSslSocket::VerifyNone)
int exec(ProcessEventsFlags flags=AllEvents)
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForGet(QNetworkRequest *request)
TTKAbstractNetwork(QObject *parent=nullptr)
virtual void downLoadFinished()
#define qAsConst
Definition: ttkqtglobal.h:51
volatile bool m_interrupt
#define TTK_INFO_STREAM(msg)
Definition: ttklogger.h:68
The namespace of the process utils.
Definition: ttkcompat.h:24
QNetworkAccessManager m_manager
#define TTK_SLOT
Definition: ttkqtglobal.h:181
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForPut(QNetworkRequest *request, const QByteArray &data)
virtual void replyError(QNetworkReply::NetworkError error)
TTK_MODULE_EXPORT void makeContentTypeHeader(QNetworkRequest *request, const QByteArray &data={})
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:70
The class of the semaphore event loop.
void sslErrorsString(QNetworkReply *reply, const QList< QSslError > &errors)