Skip to content

Commit d114669

Browse files
committed
[wip] refactor login code
1 parent 2c67e26 commit d114669

File tree

6 files changed

+465
-125
lines changed

6 files changed

+465
-125
lines changed

BNetDisk.pro

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ SOURCES += \
2828
src/BDiskEvent.cpp \
2929
src/BDiskShareDelegate.cpp \
3030
src/BDiskFileOperationDelegate.cpp \
31-
src/BDiskSearchDelegate.cpp
31+
src/BDiskSearchDelegate.cpp \
32+
src/BDiskRequest/BDiskLogin_p.cpp \
33+
src/BDiskRequest/BDiskLogin_cookie_p.cpp
3234

3335
RESOURCES += \
3436
qml/qml.qrc
@@ -59,7 +61,9 @@ HEADERS += \
5961
src/BDiskEvent.h \
6062
src/BDiskShareDelegate.h \
6163
src/BDiskFileOperationDelegate.h \
62-
src/BDiskSearchDelegate.h
64+
src/BDiskSearchDelegate.h \
65+
src/BDiskRequest/BDiskLogin_p.h \
66+
src/BDiskRequest/BDiskLogin_cookie_p.h
6367

6468
DISTFILES += \
6569
qml/QuickFlux/Stores/qmldir

src/BDiskRequest/BDiskLogin.cpp

Lines changed: 66 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -22,83 +22,7 @@
2222
#include "BDiskConst.h"
2323
#include "BDiskTokenProvider.h"
2424
#include "BDiskCookieJar.h"
25-
26-
27-
#define INNER_EVENT (QEvent::Type(QEvent::User))
28-
//#define INNER_CAPTCHA_URL (QEvent::Type(QEvent::User + 1))
29-
30-
class InnerEvent : public QEvent
31-
{
32-
public:
33-
enum EventState {
34-
EVENT_LOGIN_ABORT = 0x0,
35-
EVENT_LOGIN_SUCCESS,
36-
EVENT_LOGIN_FAILURE,
37-
EVENT_CAPTCHA_URL,
38-
EVENT_CAPTCHA_TEXT,
39-
EVENT_CAPTCHA_URL_NEED_REFRESH
40-
};
41-
42-
public:
43-
InnerEvent(InnerEvent::EventState ret, const QString &value)
44-
: QEvent(INNER_EVENT)
45-
, m_url(QUrl())
46-
{
47-
m_ret = ret;
48-
m_data = value;
49-
}
50-
InnerEvent(InnerEvent::EventState ret, const QUrl &value)
51-
: QEvent(INNER_EVENT)
52-
, m_data(QString())
53-
{
54-
m_ret = ret;
55-
m_url = value;
56-
}
57-
virtual ~InnerEvent() {}
58-
59-
EventState state() const {
60-
return m_ret;
61-
}
62-
QString data() const {
63-
return m_data;
64-
}
65-
QUrl url() const {
66-
return m_url;
67-
}
68-
private:
69-
EventState m_ret;
70-
QString m_data;
71-
QUrl m_url;
72-
};
73-
74-
75-
class InnerStateHandler : public QObject
76-
{
77-
Q_OBJECT
78-
public:
79-
InnerStateHandler(QObject *parent = 0)
80-
: QObject(parent)
81-
, m_mutex(QMutex::Recursive)
82-
{
83-
84-
}
85-
virtual ~InnerStateHandler() {}
86-
87-
void dispatch(InnerEvent::EventState ret, const QString &data = QString()) {
88-
m_mutex.lock();
89-
qApp->postEvent(parent(), new InnerEvent(ret, data));
90-
m_mutex.unlock();
91-
}
92-
void dispatch(InnerEvent::EventState ret, const QUrl &data) {
93-
m_mutex.lock();
94-
qApp->postEvent(parent(), new InnerEvent(ret, data));
95-
m_mutex.unlock();
96-
}
97-
98-
private:
99-
QMutex m_mutex;
100-
};
101-
25+
#include "BDiskLogin_p.h"
10226

10327
BDiskLogin::BDiskLogin(QObject *parent)
10428
: QThread(parent)
@@ -139,18 +63,11 @@ void BDiskLogin::loginByCookie()
13963
QUrl url = QUrl(BDISK_URL_DISK_HOME);
14064
QNetworkRequest request(url);
14165
fillRequest(&request);
142-
m_reply = m_networkMgr->get(request);
14366

67+
m_reply = m_networkMgr->head(request);
14468
if (m_reply) {
14569
connect(m_reply, &QNetworkReply::finished,
14670
[&](){
147-
// if (m_requestAborted) {
148-
// m_requestAborted = false;
149-
// m_handler->dispatch(InnerEvent::EVENT_LOGIN_ABORT);
150-
// m_breakThread = true;
151-
// freeReply();
152-
// return;
153-
// }
15471
QNetworkReply::NetworkError e = m_reply->error ();
15572
bool success = (e == QNetworkReply::NoError);
15673
if (!success) {
@@ -159,46 +76,74 @@ void BDiskLogin::loginByCookie()
15976
emit loginByCookieFailure(str);
16077
return;
16178
}
162-
QByteArray qba = m_reply->readAll();
163-
qDebug()<<Q_FUNC_INFO<<" reply data "<<qba;
164-
if (qba.trimmed().isEmpty()) {
165-
freeReply();
166-
emit loginByCookieSuccess();
167-
// emit loginFailure(" reply data "+qba);
79+
QVariant code = m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
80+
freeReply();
81+
if (code.isNull() || !code.isValid()) {
82+
emit loginByCookieFailure(QString("Invalid http code."));
83+
return;
84+
}
85+
bool ok = false;
86+
int ret = code.toInt(&ok);
87+
if (!ok) {
88+
emit loginByCookieFailure(QString("Invalid http code to int."));
89+
return;
90+
}
91+
//TODO 302, url redirect
92+
if (ret != 200) {
93+
emit loginByCookieFailure(QString("Http code [%1] error.").arg(QString::number(ret)));
16894
return;
16995
}
17096

171-
//TODO get bdstoken from response by key yunData.MYBDSTOKEN or FileUtils.bdstoken
172-
// if (m_tokenProvider->bdstoken().isEmpty()) {
173-
QString value = truncateYunData(QString(qba));
174-
if (value.isEmpty()) {
175-
qDebug()<<Q_FUNC_INFO<<"Can't get yunData values";
176-
freeReply();
177-
emit loginByCookieFailure("Can't get yunData values");
178-
return;
179-
}
180-
QJsonParseError error;
181-
QJsonDocument doc = QJsonDocument::fromJson (value.toLocal8Bit(), &error);
182-
if (error.error != QJsonParseError::NoError) {
183-
qDebug()<<Q_FUNC_INFO<<"Parse json error => "<<error.errorString ();
97+
m_reply = m_networkMgr->get(request);
98+
99+
if (m_reply) {
100+
connect(m_reply, &QNetworkReply::finished,
101+
[&](){
102+
QNetworkReply::NetworkError e = m_reply->error ();
103+
bool success = (e == QNetworkReply::NoError);
104+
if (!success) {
105+
QString str = m_reply->errorString();
106+
freeReply();
107+
emit loginByCookieFailure(str);
108+
return;
109+
}
110+
QByteArray qba = m_reply->readAll();
111+
qDebug()<<Q_FUNC_INFO<<" reply data "<<qba;
184112
freeReply();
185-
emit loginByCookieFailure(QString("Parse json error [%1]").arg(error.errorString()));
186-
return;
187-
}
188-
QJsonObject obj = doc.object();
189-
QString bdstoken = obj.value("bdstoken").toString();
190-
if (bdstoken.isEmpty()) {
191-
emit loginByCookieFailure("Can't get bdstoken");
192-
return;
193-
}
194-
m_tokenProvider->setBdstoken(bdstoken);
195-
QString uname = obj.value("username").toString();
196-
//FIXME emit failure if uname is empty;
197-
m_tokenProvider->setUidStr(uname);
198-
// }
199-
freeReply();
200-
m_tokenProvider->flush();
201-
emit loginByCookieSuccess();
113+
if (qba.trimmed().isEmpty()) {
114+
emit loginByCookieSuccess();
115+
return;
116+
}
117+
//TODO get bdstoken from response by key yunData.MYBDSTOKEN or FileUtils.bdstoken
118+
// if (m_tokenProvider->bdstoken().isEmpty()) {
119+
QString value = truncateYunData(QString(qba));
120+
if (value.isEmpty()) {
121+
qDebug()<<Q_FUNC_INFO<<"Can't get yunData values";
122+
emit loginByCookieFailure("Can't get yunData values");
123+
return;
124+
}
125+
QJsonParseError error;
126+
QJsonDocument doc = QJsonDocument::fromJson (value.toLocal8Bit(), &error);
127+
if (error.error != QJsonParseError::NoError) {
128+
qDebug()<<Q_FUNC_INFO<<"Parse json error => "<<error.errorString ();
129+
emit loginByCookieFailure(QString("Parse json error [%1]").arg(error.errorString()));
130+
return;
131+
}
132+
QJsonObject obj = doc.object();
133+
QString bdstoken = obj.value("bdstoken").toString();
134+
if (bdstoken.isEmpty()) {
135+
emit loginByCookieFailure("Can't get bdstoken");
136+
return;
137+
}
138+
m_tokenProvider->setBdstoken(bdstoken);
139+
QString uname = obj.value("username").toString();
140+
//FIXME emit failure if uname is empty;
141+
m_tokenProvider->setUidStr(uname);
142+
// }
143+
m_tokenProvider->flush();
144+
emit loginByCookieSuccess();
145+
});
146+
}
202147
});
203148
}
204149
}
@@ -975,5 +920,3 @@ void BDiskLogin::fillRequest(QNetworkRequest *req)
975920
req->setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
976921
}
977922

978-
979-
#include "BDiskLogin.moc"

0 commit comments

Comments
 (0)