geopro/src/data/api/NavRequest.cpp

48 lines
1.4 KiB
C++

#include "api/NavRequest.hpp"
#include <stdexcept>
namespace geopro::data {
namespace {
QString reasonOf(const geopro::net::ApiResponse& r) {
return r.msg.isEmpty() ? r.rawError : r.msg;
}
} // namespace
ApiNavRequest::ApiNavRequest(geopro::net::IApiCall* call, Parser parse, Predicate isFailure,
QObject* parent)
: NavRequest(parent), call_(call), parse_(std::move(parse)), isFailure_(std::move(isFailure)) {
QObject::connect(call, &geopro::net::IApiCall::finished, this,
[this](const geopro::net::ApiResponse& resp) {
if (aborted_) return; // §5.0 入口守卫
if (isFailure_(resp)) {
emit failed(reasonOf(resp));
deleteLater();
return;
}
QVariant out;
try {
out = parse_(resp); // 仅解析在 try 内(下游 done 处理器抛出不误报)
} catch (const std::exception& e) {
emit failed(QString::fromUtf8(e.what()));
deleteLater();
return;
} catch (...) {
emit failed(QStringLiteral("解析失败:未知异常"));
deleteLater();
return;
}
emit done(out);
deleteLater();
});
}
void ApiNavRequest::abort() {
if (aborted_) return;
aborted_ = true;
if (call_) call_->abort();
deleteLater();
}
} // namespace geopro::data