48 lines
1.6 KiB
C++
48 lines
1.6 KiB
C++
#include "api/DatasetLoadHandles.hpp"
|
||
#include <stdexcept>
|
||
|
||
namespace geopro::data {
|
||
|
||
namespace {
|
||
QString reasonOf(const geopro::net::ApiResponse& r) {
|
||
return r.msg.isEmpty() ? r.rawError : r.msg;
|
||
}
|
||
} // namespace
|
||
|
||
ApiDetailLoad::ApiDetailLoad(geopro::net::ApiBatch* batch, Parser parse, QObject* parent)
|
||
: DetailLoad(parent), batch_(batch), parse_(std::move(parse)) {
|
||
QObject::connect(batch, &geopro::net::ApiBatch::succeeded, this,
|
||
[this](const QList<geopro::net::ApiResponse>& resps) {
|
||
if (aborted_) return; // §5.0
|
||
QVariant payload;
|
||
try {
|
||
payload = parse_(resps); // 仅解析在 try 内:下游 done 处理器抛出不应误报为解析失败
|
||
} catch (const std::exception& e) {
|
||
emit failed(QString::fromUtf8(e.what()));
|
||
deleteLater();
|
||
return;
|
||
} catch (...) { // 非 std 异常跨信号槽会 terminate,兜底转 failed
|
||
emit failed(QStringLiteral("解析失败:未知异常"));
|
||
deleteLater();
|
||
return;
|
||
}
|
||
emit done(payload);
|
||
deleteLater();
|
||
});
|
||
QObject::connect(batch, &geopro::net::ApiBatch::failed, this,
|
||
[this](int, const geopro::net::ApiResponse& r) {
|
||
if (aborted_) return;
|
||
emit failed(reasonOf(r));
|
||
deleteLater();
|
||
});
|
||
}
|
||
|
||
void ApiDetailLoad::abort() {
|
||
if (aborted_) return;
|
||
aborted_ = true;
|
||
if (batch_) batch_->abort();
|
||
deleteLater();
|
||
}
|
||
|
||
} // namespace geopro::data
|