forked from qt-creator/qt-creator
iOS: Extract basic devicectl output processing
Put creating the JSON document and error parsing into a separate function. Change-Id: I257f82249a07220467c33220c6b8e4650266b8d9 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
47
src/plugins/ios/devicectlutils.cpp
Normal file
47
src/plugins/ios/devicectlutils.cpp
Normal file
@@ -0,0 +1,47 @@
|
||||
// Copyright (C) 2024 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||
|
||||
#include "devicectlutils.h"
|
||||
|
||||
#include "iostr.h"
|
||||
|
||||
#include <QJsonDocument>
|
||||
|
||||
Utils::expected_str<QJsonValue> Ios::Internal::parseDevicectlResult(const QByteArray &rawOutput)
|
||||
{
|
||||
// there can be crap (progress info) at front and/or end
|
||||
const int firstCurly = rawOutput.indexOf('{');
|
||||
const int start = std::max(firstCurly, 0);
|
||||
const int lastCurly = rawOutput.lastIndexOf('}');
|
||||
const int end = lastCurly >= 0 ? lastCurly : rawOutput.size() - 1;
|
||||
QJsonParseError parseError;
|
||||
auto jsonOutput = QJsonDocument::fromJson(rawOutput.sliced(start, end - start + 1), &parseError);
|
||||
if (jsonOutput.isNull()) {
|
||||
// parse error
|
||||
return Utils::make_unexpected(
|
||||
Tr::tr("Failed to parse devicectl output: %1.").arg(parseError.errorString()));
|
||||
}
|
||||
const QJsonValue errorValue = jsonOutput["error"];
|
||||
if (!errorValue.isUndefined()) {
|
||||
// error
|
||||
QString error
|
||||
= Tr::tr("Operation failed: %1.")
|
||||
.arg(errorValue["userInfo"]["NSLocalizedDescription"]["string"].toString());
|
||||
const QJsonValue userInfo
|
||||
= errorValue["userInfo"]["NSUnderlyingError"]["error"]["userInfo"];
|
||||
const QList<QJsonValue> moreInfo{userInfo["NSLocalizedDescription"]["string"],
|
||||
userInfo["NSLocalizedFailureReason"]["string"],
|
||||
userInfo["NSLocalizedRecoverySuggestion"]["string"]};
|
||||
for (const QJsonValue &v : moreInfo) {
|
||||
if (!v.isUndefined())
|
||||
error += "\n" + v.toString();
|
||||
}
|
||||
return Utils::make_unexpected(error);
|
||||
}
|
||||
const QJsonValue resultValue = jsonOutput["result"];
|
||||
if (resultValue.isUndefined()) {
|
||||
return Utils::make_unexpected(
|
||||
Tr::tr("Failed to parse devicectl output: 'result' is missing"));
|
||||
}
|
||||
return resultValue;
|
||||
}
|
||||
Reference in New Issue
Block a user