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 : T_base(
nullptr), m_ctx(
ctx), m_thread(), m_auditLog(), m_auditLogError()
162 void lateInitialization()
165 QObject::connect(&m_thread, &QThread::finished,
this,
166 &mixin_type::slotFinished);
167 m_ctx->setProgressProvider(
this);
168 QGpgME::g_context_map.insert(
this, m_ctx.get());
173 QGpgME::g_context_map.remove(
this);
176 template <
typename T_binder>
179 m_thread.setFunction([
this,
func]() {
return func(this->context()); });
183 template <
typename T_binder>
186 m_thread.setFunction(std::bind(
func, this->context()));
189 template <
typename T_binder>
190 void run(
const T_binder &
func,
const std::shared_ptr<QIODevice> &
io)
193 io->moveToThread(&m_thread);
199 m_thread.setFunction(std::bind(
func, this->context(), this->
thread(), std::weak_ptr<QIODevice>(
io)));
202 template <
typename T_binder>
203 void run(
const T_binder &
func,
const std::shared_ptr<QIODevice> &
io1,
const std::shared_ptr<QIODevice> &
io2)
206 io1->moveToThread(&m_thread);
209 io2->moveToThread(&m_thread);
215 m_thread.setFunction(std::bind(
func, this->context(), this->
thread(), std::weak_ptr<QIODevice>(
io1), std::weak_ptr<QIODevice>(
io2)));
220 GpgME::Context *context()
const
230 m_auditLog = std::get < std::tuple_size<T_result>::value - 2 > (
r);
231 m_auditLogError = std::get < std::tuple_size<T_result>::value - 1 > (
r);
237 void slotCancel()
override {
240 m_ctx->cancelPendingOperation();
243 QString auditLogAsHtml()
const override
247 GpgME::Error auditLogError()
const override
249 return m_auditLogError;
251 void showProgress(
const char *
what,
253 QMetaObject::invokeMethod(
this, [
this,
current,
total]() {
255 }, Qt::QueuedConnection);
259 }, Qt::QueuedConnection);
265 }, Qt::QueuedConnection);
268 template <
typename T1,
typename T2>
269 void doEmitResult(
const std::tuple<T1, T2> &
tuple)
274 template <
typename T1,
typename T2,
typename T3>
275 void doEmitResult(
const std::tuple<T1, T2, T3> &
tuple)
280 template <
typename T1,
typename T2,
typename T3,
typename T4>
281 void doEmitResult(
const std::tuple<T1, T2, T3, T4> &
tuple)
286 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
287 void doEmitResult(
const std::tuple<T1, T2, T3, T4, T5> &
tuple)
293 std::shared_ptr<GpgME::Context> m_ctx;
296 GpgME::Error m_auditLogError;