LeechCraft
0.6.70-18450-gabe19ee3b0
Modular cross-platform feature rich live environment.
Toggle main menu visibility
Loading...
Searching...
No Matches
handlenetworkreply.h
Go to the documentation of this file.
1
/**********************************************************************
2
* LeechCraft - modular cross-platform feature rich internet client.
3
* Copyright (C) 2006-2014 Georg Rudoy
4
*
5
* Distributed under the Boost Software License, Version 1.0.
6
* (See accompanying file LICENSE or copy at https://www.boost.org/LICENSE_1_0.txt)
7
**********************************************************************/
8
9
#pragma once
10
11
#include <QNetworkReply>
12
#include <
util/sll/either.h
>
13
#include <
util/sll/void.h
>
14
#include <
util/sll/typelist.h
>
15
#include <
util/threads/futures.h
>
16
#include "
networkconfig.h
"
17
18
namespace
LC::Util
19
{
20
template
<
typename
F>
21
void
HandleNetworkReply
(QObject *context, QNetworkReply *reply, F f)
22
{
23
QObject::connect (reply,
24
&QNetworkReply::finished,
25
context,
26
[reply, f]
27
{
28
reply->deleteLater ();
29
f (reply->readAll ());
30
});
31
}
32
33
template
<
typename
>
34
struct
ErrorInfo
;
35
36
template
<
typename
>
37
struct
ResultInfo
;
38
39
struct
UTIL_NETWORK_API
ReplyWithHeaders
40
{
41
int
Code_
;
42
QByteArray
Data_
;
43
QHash<QByteArray, QList<QByteArray>>
Headers_
;
44
45
explicit
ReplyWithHeaders
(QNetworkReply*);
46
};
47
48
struct
UTIL_NETWORK_API
ReplyError
49
{
50
QNetworkReply::NetworkError
Error_
;
51
QString
ErrorString_
;
52
53
QVariant
HttpStatusCode_
;
54
55
explicit
ReplyError
(QNetworkReply*);
56
};
57
58
template
<
typename
... Args>
59
auto
HandleReply
(QNetworkReply *reply, QObject *context)
60
{
61
using
Err =
Find
<
ErrorInfo
,
Void
, Args...>;
62
using
Res =
Find
<
ResultInfo
, QByteArray, Args...>;
63
64
using
Result_t =
Either<Err, Res>
;
65
QFutureInterface<Result_t> promise;
66
promise.reportStarted ();
67
68
QObject::connect (reply,
69
&QNetworkReply::finished,
70
context,
71
[promise, reply] ()
mutable
72
{
73
reply->deleteLater ();
74
75
if
constexpr
(std::is_same_v<Res, QByteArray>)
76
Util::ReportFutureResult (promise, reply->readAll ());
77
else
if
constexpr
(std::is_same_v<Res, ReplyWithHeaders>)
78
Util::ReportFutureResult (promise, Res { reply });
79
else
80
static_assert
(std::is_same_v<Res, struct Dummy>,
"Unsupported reply type"
);
81
});
82
QObject::connect (reply,
83
&QNetworkReply::errorOccurred,
84
context,
85
[promise, reply] ()
mutable
86
{
87
reply->deleteLater ();
88
89
auto
report = [&] (
const
Err& val) { Util::ReportFutureResult (promise,
Left
{ val }); };
90
91
if
constexpr
(std::is_same_v<Err, QString>)
92
report (reply->errorString ());
93
else
if
constexpr
(std::is_same_v<Err, Void>)
94
report ({});
95
else
if
constexpr
(std::is_same_v<Err, ReplyError>)
96
report (Err { reply });
97
else
98
static_assert
(std::is_same_v<Err, struct Dummy>,
"Unsupported error type"
);
99
});
100
101
return
promise.future ();
102
}
103
104
template
<
typename
... Args>
105
auto
HandleReplySeq
(QNetworkReply *reply, QObject *context)
106
{
107
return
Sequence (context,
HandleReply<Args...>
(reply, context));
108
}
109
}
LC::Util::Either
Definition
either.h:33
futures.h
LC::Util
Definition
icoreproxy.h:34
LC::Util::HandleReply
auto HandleReply(QNetworkReply *reply, QObject *context)
Definition
handlenetworkreply.h:59
LC::Util::Find
typename detail::Find< Name, Def, Args... >::type Find
Definition
typelist.h:176
LC::Util::HandleNetworkReply
void HandleNetworkReply(QObject *context, QNetworkReply *reply, F f)
Definition
handlenetworkreply.h:21
LC::Util::HandleReplySeq
auto HandleReplySeq(QNetworkReply *reply, QObject *context)
Definition
handlenetworkreply.h:105
networkconfig.h
UTIL_NETWORK_API
#define UTIL_NETWORK_API
Definition
networkconfig.h:16
either.h
LC::Util::ErrorInfo
Definition
handlenetworkreply.h:34
LC::Util::Left
Definition
either.h:20
LC::Util::ReplyError::ReplyError
ReplyError(QNetworkReply *)
Definition
handlenetworkreply.cpp:24
LC::Util::ReplyError::HttpStatusCode_
QVariant HttpStatusCode_
Definition
handlenetworkreply.h:53
LC::Util::ReplyError::Error_
QNetworkReply::NetworkError Error_
Definition
handlenetworkreply.h:50
LC::Util::ReplyError::ErrorString_
QString ErrorString_
Definition
handlenetworkreply.h:51
LC::Util::ReplyWithHeaders::Headers_
QHash< QByteArray, QList< QByteArray > > Headers_
Definition
handlenetworkreply.h:43
LC::Util::ReplyWithHeaders::Code_
int Code_
Definition
handlenetworkreply.h:41
LC::Util::ReplyWithHeaders::ReplyWithHeaders
ReplyWithHeaders(QNetworkReply *)
Definition
handlenetworkreply.cpp:13
LC::Util::ReplyWithHeaders::Data_
QByteArray Data_
Definition
handlenetworkreply.h:42
LC::Util::ResultInfo
Definition
handlenetworkreply.h:37
LC::Util::Void
A proper void type, akin to unit (or ()) type in functional languages.
Definition
void.h:21
typelist.h
void.h
src
util
network
handlenetworkreply.h
Generated by
1.17.0