-
Notifications
You must be signed in to change notification settings - Fork 0
/
ScratchWebApi.cpp
115 lines (91 loc) · 3.05 KB
/
ScratchWebApi.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include "ScratchWebApi.h"
#include <QUrl>
#include <QNetworkRequest>
#include <QNetworkReply>
ScratchWebApi::ScratchWebApi(QObject *parent) :
QObject(parent)
{
accessManager_ = new QNetworkAccessManager(this);
}
void ScratchWebApi::loadProject(const QString &projectId)
{
QUrl requestUrl("http://projects.scratch.mit.edu/");
requestUrl.setPath(QString("/internalapi/project/%1/get/").arg(projectId));
QNetworkRequest request;
request.setUrl(requestUrl);
QNetworkReply *reply = accessManager_->get(request);
connect(reply, SIGNAL(finished()), SLOT(handleLoadProjectReply()));
}
void ScratchWebApi::handleLoadProjectReply()
{
QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
if (!hasError(reply)) {
QString projectSource = reply->readAll();
emit complete(projectSource);
} else {
handleError(reply);
}
reply->deleteLater();
}
bool ScratchWebApi::hasError(QNetworkReply *reply)
{
if (reply->error() != QNetworkReply::NoError) {
return true;
}
return false;
}
void ScratchWebApi::handleError(QNetworkReply *reply)
{
QNetworkReply::NetworkError err = reply->error();
QString requestPath = reply->request().url().path();
QString replyBody = QString::fromUtf8(reply->readAll());
int httpError = reply->attribute( QNetworkRequest::HttpStatusCodeAttribute).toInt();
qWarning("Network error: requestPath = %s, httpcode=%d, errorMessage=%s, replyBody=%s",
qPrintable(requestPath),
httpError,
qPrintable(reply->errorString()),
qPrintable(replyBody));
switch (err) {
case QNetworkReply::NoError:
break;
case QNetworkReply::AuthenticationRequiredError:
emit error("Authentication failed");
break;
case QNetworkReply::ContentOperationNotPermittedError:
emit error("Content operation not permitted");
break;
case QNetworkReply::ConnectionRefusedError:
emit error("Connection refused");
break;
case QNetworkReply::RemoteHostClosedError:
emit error("Remote host closed");
break;
case QNetworkReply::HostNotFoundError:
emit error("Host not found");
break;
case QNetworkReply::TimeoutError:
emit error("Timeout");
break;
case QNetworkReply::OperationCanceledError:
emit error("Operation canceled");
break;
case QNetworkReply::SslHandshakeFailedError:
emit error("SSL handshake failed");
break;
case QNetworkReply::TemporaryNetworkFailureError:
emit error("Temporary network failure");
break;
case QNetworkReply::UnknownNetworkError:
emit error("Unknown network error");
break;
default:
{
if (replyBody.isEmpty())
emit error(reply->errorString());
else {
emit error(replyBody);
}
break;
}
}
}