48 lines
1.4 KiB
C++
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
|