Page Menu
Home
Phabricator (Chris)
Search
Configure Global Search
Log In
Files
F630018
imguruploader.cpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Authored By
Unknown
Size
3 KB
Referenced Files
None
Subscribers
None
imguruploader.cpp
View Options
#include
"imguruploader.h"
#include
<QNetworkAccessManager>
#include
<QtNetwork>
ImgurUploader
::
ImgurUploader
(
const
QVariantHash
&
options
)
:
ImageUploader
(
options
)
{}
void
ImgurUploader
::
upload
(
const
QString
&
fileName
)
{
QFile
*
file
=
new
QFile
(
fileName
);
if
(
!
file
->
open
(
QIODevice
::
ReadOnly
))
{
emit
error
(
ImageUploader
::
FileError
,
tr
(
"Unable to read screenshot file"
),
fileName
);
file
->
deleteLater
();
return
;
}
QNetworkRequest
request
(
QUrl
(
"https://api.imgur.com/3/image"
));
request
.
setRawHeader
(
"Authorization"
,
"Client-ID 3ebe94c791445c1"
);
QHttpMultiPart
*
multiPart
=
new
QHttpMultiPart
(
QHttpMultiPart
::
FormDataType
);
if
(
!
mOptions
.
value
(
"anonymous"
,
true
).
toBool
())
{
request
.
setRawHeader
(
"Authorization"
,
QByteArray
(
"Bearer "
)
+
mOptions
.
value
(
"access_token"
).
toByteArray
());
if
(
!
mOptions
.
value
(
"album"
).
toString
().
isEmpty
())
{
QHttpPart
albumPart
;
albumPart
.
setHeader
(
QNetworkRequest
::
ContentDispositionHeader
,
QVariant
(
"form-data; name=
\"
album
\"
"
));
albumPart
.
setBody
(
mOptions
.
value
(
"album"
).
toByteArray
());
multiPart
->
append
(
albumPart
);
}
}
QHttpPart
imagePart
;
imagePart
.
setHeader
(
QNetworkRequest
::
ContentTypeHeader
,
QMimeDatabase
().
mimeTypeForFile
(
fileName
,
QMimeDatabase
::
MatchExtension
).
name
());
imagePart
.
setHeader
(
QNetworkRequest
::
ContentDispositionHeader
,
QVariant
(
"form-data; name=
\"
image
\"
"
));
imagePart
.
setBodyDevice
(
file
);
file
->
setParent
(
multiPart
);
multiPart
->
append
(
imagePart
);
QNetworkReply
*
reply
=
mOptions
.
value
(
"networkManager"
).
value
<
QNetworkAccessManager
*>
()
->
post
(
request
,
multiPart
);
reply
->
setProperty
(
"fileName"
,
fileName
);
this
->
setProperty
(
"fileName"
,
fileName
);
connect
(
reply
,
SIGNAL
(
uploadProgress
(
qint64
,
qint64
)),
this
,
SLOT
(
uploadProgress
(
qint64
,
qint64
)));
connect
(
this
,
SIGNAL
(
cancelRequest
()),
reply
,
SLOT
(
abort
()));
connect
(
this
,
SIGNAL
(
cancelRequest
()),
reply
,
SLOT
(
deleteLater
()));
connect
(
reply
,
SIGNAL
(
finished
()),
this
,
SLOT
(
finished
()));
}
void
ImgurUploader
::
retry
()
{
upload
(
property
(
"fileName"
).
toString
());
}
void
ImgurUploader
::
cancel
()
{
emit
cancelRequest
();
}
void
ImgurUploader
::
finished
()
{
QNetworkReply
*
reply
=
qobject_cast
<
QNetworkReply
*>
(
sender
());
reply
->
deleteLater
();
QString
fileName
=
reply
->
property
(
"fileName"
).
toString
();
if
(
reply
->
error
()
!=
QNetworkReply
::
NoError
)
{
if
(
reply
->
error
()
==
QNetworkReply
::
OperationCanceledError
)
{
emit
error
(
ImageUploader
::
CancelError
,
""
,
fileName
);
}
else
if
(
reply
->
error
()
==
QNetworkReply
::
ContentOperationNotPermittedError
||
reply
->
error
()
==
QNetworkReply
::
AuthenticationRequiredError
)
{
emit
needAuthRefresh
();
}
else
{
emit
error
(
ImageUploader
::
NetworkError
,
reply
->
errorString
(),
fileName
);
}
return
;
}
if
(
reply
->
rawHeader
(
"X-RateLimit-Remaining"
)
==
"0"
)
{
emit
error
(
ImageUploader
::
HostError
,
tr
(
"Imgur upload limit reached"
),
fileName
);
return
;
}
QJsonObject
imgurResponse
=
QJsonDocument
::
fromJson
(
reply
->
readAll
()).
object
();
if
(
imgurResponse
.
value
(
"success"
).
toBool
()
==
true
&&
imgurResponse
.
value
(
"status"
).
toInt
()
==
200
)
{
QJsonObject
imageData
=
imgurResponse
.
value
(
"data"
).
toObject
();
emit
uploaded
(
fileName
,
imageData
[
"link"
].
toString
(),
imageData
[
"deletehash"
].
toString
());
}
else
{
emit
error
(
ImageUploader
::
HostError
,
tr
(
"Imgur error"
),
fileName
);
}
}
void
ImgurUploader
::
uploadProgress
(
qint64
bytesReceived
,
qint64
bytesTotal
)
{
float
b
=
(
float
)
bytesReceived
/
bytesTotal
;
int
p
=
qRound
(
b
*
100
);
setProgress
(
p
);
emit
progressChange
(
p
);
}
File Metadata
Details
Attached
Mime Type
text/x-c
Expires
Sun, Nov 15, 8:27 AM (3 h, 20 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
120778
Default Alt Text
imguruploader.cpp (3 KB)
Attached To
Mode
R63 darkscreen
Attached
Detach File
Event Timeline