125class ThreadedJobMixin :
public T_base,
public GpgME::ProgressProvider
128 typedef ThreadedJobMixin<T_base, T_private, T_result> mixin_type;
129 typedef T_result result_type;
133 Q_ASSERT(m_thread.hasFunction() &&
"Call setWorkerFunction() before run()");
138 static_assert(std::tuple_size<T_result>::value > 2,
139 "Result tuple too small");
140 static_assert(std::is_same <
141 typename std::tuple_element <
142 std::tuple_size<T_result>::value - 2,
147 "Second to last result type not a QString");
148 static_assert(std::is_same <
149 typename std::tuple_element <
150 std::tuple_size<T_result>::value - 1,
155 "Last result type not a GpgME::Error");
158 template<
typename T_private_ = T_private,
159 std::enable_if_t<!std::is_void_v<T_private_>,
bool> =
true>
160 explicit ThreadedJobMixin(GpgME::Context *ctx)
161 : T_base(std::make_unique<T_private>(),
nullptr), m_ctx(ctx), m_thread(), m_auditLog(), m_auditLogError()
166 template<
typename T_private_ = T_private,
167 std::enable_if_t<std::is_void_v<T_private_>,
bool> =
true>
168 explicit ThreadedJobMixin(GpgME::Context *ctx)
169 : T_base(
nullptr), m_ctx(ctx), m_thread(), m_auditLog(), m_auditLogError()
173 void lateInitialization()
176 QObject::connect(&m_thread, &QThread::finished,
this,
177 &mixin_type::slotFinished);
178 m_ctx->setProgressProvider(
this);
179 QGpgME::g_context_map.insert(
this, m_ctx.get());
184 QGpgME::g_context_map.remove(
this);
187 template <
typename T_binder>
188 void setWorkerFunction(
const T_binder &func)
190 m_thread.setFunction([
this, func]() {
return func(this->context()); });
194 template <
typename T_binder>
195 void run(
const T_binder &func)
197 m_thread.setFunction(std::bind(func, this->context()));
200 template <
typename T_binder>
201 void run(
const T_binder &func,
const std::shared_ptr<QIODevice> &io)
204 io->moveToThread(&m_thread);
210 m_thread.setFunction(std::bind(func, this->context(), this->thread(), std::weak_ptr<QIODevice>(io)));
213 template <
typename T_binder>
214 void run(
const T_binder &func,
const std::shared_ptr<QIODevice> &io1,
const std::shared_ptr<QIODevice> &io2)
217 io1->moveToThread(&m_thread);
220 io2->moveToThread(&m_thread);
226 m_thread.setFunction(std::bind(func, this->context(), this->thread(), std::weak_ptr<QIODevice>(io1), std::weak_ptr<QIODevice>(io2)));
231 GpgME::Context *context()
const
236 virtual void resultHook(
const result_type &) {}
240 const T_result r = m_thread.result();
241 m_auditLog = std::get < std::tuple_size<T_result>::value - 2 > (r);
242 m_auditLogError = std::get < std::tuple_size<T_result>::value - 1 > (r);
248 void slotCancel()
override {
251 m_ctx->cancelPendingOperation();
254 QString auditLogAsHtml()
const override
258 GpgME::Error auditLogError()
const override
260 return m_auditLogError;
262 void showProgress(
const char *what,
263 int type,
int current,
int total)
override {
264 QMetaObject::invokeMethod(
this, [
this, current, total]() {
265 Q_EMIT this->jobProgress(current, total);
266 }, Qt::QueuedConnection);
267 const QString what_ = QString::fromUtf8(what);
268 QMetaObject::invokeMethod(
this, [
this, what_, type, current, total]() {
269 Q_EMIT this->rawProgress(what_, type, current, total);
270 }, Qt::QueuedConnection);
271 QMetaObject::invokeMethod(
this, [
this, what_, current, total]() {
273 QT_WARNING_DISABLE_DEPRECATED
274 Q_EMIT this->progress(what_, current, total);
276 }, Qt::QueuedConnection);
279 template <
typename T1,
typename T2>
280 void doEmitResult(
const std::tuple<T1, T2> &tuple)
282 Q_EMIT this->result(std::get<0>(tuple), std::get<1>(tuple));
285 template <
typename T1,
typename T2,
typename T3>
286 void doEmitResult(
const std::tuple<T1, T2, T3> &tuple)
288 Q_EMIT this->result(std::get<0>(tuple), std::get<1>(tuple), std::get<2>(tuple));
291 template <
typename T1,
typename T2,
typename T3,
typename T4>
292 void doEmitResult(
const std::tuple<T1, T2, T3, T4> &tuple)
294 Q_EMIT this->result(std::get<0>(tuple), std::get<1>(tuple), std::get<2>(tuple), std::get<3>(tuple));
297 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
298 void doEmitResult(
const std::tuple<T1, T2, T3, T4, T5> &tuple)
300 Q_EMIT this->result(std::get<0>(tuple), std::get<1>(tuple), std::get<2>(tuple), std::get<3>(tuple), std::get<4>(tuple));
304 std::shared_ptr<GpgME::Context> m_ctx;
307 GpgME::Error m_auditLogError;