TTKMusicPlayer  3.7.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 
4  : QObject(parent),
5  m_interrupt(false),
6  m_stateCode(TTK::NetworkCode::Query),
7  m_reply(nullptr)
8 {
9 #ifndef QT_NO_SSL
10  connect(&m_manager, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)), SLOT(sslErrors(QNetworkReply*,QList<QSslError>)));
11 #endif
12 }
13 
15 {
16  m_interrupt = true;
18 
19  deleteAll();
20 }
21 
23 {
24  if(m_reply)
25  {
26  m_reply->deleteLater();
27  m_reply = nullptr;
28  }
29  m_interrupt = true;
30 }
31 
33 {
34  m_interrupt = false;
35 }
36 
37 void TTKAbstractNetwork::replyError(QNetworkReply::NetworkError)
38 {
39  TTK_ERROR_STREAM("Abnormal network connection");
40  Q_EMIT downLoadDataChanged({});
41  deleteAll();
42 }
43 
44 #ifndef QT_NO_SSL
45 void TTKAbstractNetwork::sslErrors(QNetworkReply* reply, const QList<QSslError> &errors)
46 {
47  sslErrorsString(reply, errors);
48  Q_EMIT downLoadDataChanged({});
49  deleteAll();
50 }
51 
52 void TTKAbstractNetwork::sslErrorsString(QNetworkReply *reply, const QList<QSslError> &errors)
53 {
54  QString errorString;
55  for(const QSslError &error : qAsConst(errors))
56  {
57  if(!errorString.isEmpty())
58  {
59  errorString += ", ";
60  }
61  errorString += error.errorString();
62  }
63 
64  TTK_ERROR_STREAM("SslErrors:" << errorString);
65  reply->ignoreSslErrors();
66 }
67 #endif
68 
69 void TTK::makeContentTypeHeader(QNetworkRequest *request, const QByteArray &data)
70 {
71  request->setRawHeader("Content-Type", data.isEmpty() ? "application/x-www-form-urlencoded" : data);
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 qint64 TTK::queryFileSizeByUrl(const QString &url)
80 {
81  qint64 size = -1;
82 
83  QNetworkRequest request;
84  request.setUrl(url);
85  TTK::setSslConfiguration(&request);
87 
88  TTKSemaphoreLoop loop;
89  QNetworkAccessManager manager;
90  QNetworkReply *reply = manager.head(request);
91  QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
92  QtNetworkErrorVoidConnect(reply, &loop, quit, TTK_SLOT);
93  loop.exec();
94 
95  if(!reply || reply->error() != QNetworkReply::NoError)
96  {
97  return size;
98  }
99 
100  size = reply->header(QNetworkRequest::ContentLengthHeader).toLongLong();
101  const QVariant &redirection = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
102  if(redirection.isValid())
103  {
104  size = queryFileSizeByUrl(redirection.toString());
105  }
106 
107  reply->deleteLater();
108  return size;
109 }
110 
111 void TTK::setSslConfiguration(QNetworkRequest *request, QSslSocket::PeerVerifyMode mode)
112 {
113 #ifndef QT_NO_SSL
114  QSslConfiguration sslConfig = request->sslConfiguration();
115  sslConfig.setPeerVerifyMode(mode);
116  request->setSslConfiguration(sslConfig);
117 #else
118  Q_UNUSED(request);
119  Q_UNUSED(mode);
120 #endif
121 }
122 
123 QByteArray TTK::syncNetworkQueryForGet(QNetworkRequest *request)
124 {
125  TTKSemaphoreLoop loop;
126  QNetworkAccessManager manager;
127  QNetworkReply *reply = manager.get(*request);
128  QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
129  QtNetworkErrorVoidConnect(reply, &loop, quit, TTK_SLOT);
130  loop.exec();
131 
132  if(!reply || reply->error() != QNetworkReply::NoError)
133  {
134  return {};
135  }
136 
137  const QByteArray bytes(reply->readAll());
138  reply->deleteLater();
139  return bytes;
140 }
141 
142 QByteArray TTK::syncNetworkQueryForPost(QNetworkRequest *request, const QByteArray &data)
143 {
144  TTKSemaphoreLoop loop;
145  QNetworkAccessManager manager;
146  QNetworkReply *reply = manager.post(*request, data);
147  QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
148  QtNetworkErrorVoidConnect(reply, &loop, quit, TTK_SLOT);
149  loop.exec();
150 
151  if(!reply || reply->error() != QNetworkReply::NoError)
152  {
153  return {};
154  }
155 
156  const QByteArray bytes(reply->readAll());
157  reply->deleteLater();
158  return bytes;
159 }
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForPost(QNetworkRequest *request, const QByteArray &data)
virtual void deleteAll()
void downLoadDataChanged(const QString &bytes)
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
TTK_MODULE_EXPORT qint64 queryFileSizeByUrl(const QString &url)
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:53
volatile bool m_interrupt
The namespace of the process utils.
Definition: ttkcompat.h:24
QNetworkAccessManager m_manager
#define TTK_SLOT
Definition: ttkqtglobal.h:165
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:69
The class of the semaphore event loop.
void sslErrorsString(QNetworkReply *reply, const QList< QSslError > &errors)