From 7f3e9547cc8e4a3d6130a93f6764ee1ef20e6888 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Mon, 2 Apr 2018 11:55:10 -0700 Subject: [PATCH 1/3] Handle the case when metaverse returns error for certificateInfo --- interface/src/commerce/Ledger.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/interface/src/commerce/Ledger.cpp b/interface/src/commerce/Ledger.cpp index 0a9e867323..b8a7903b42 100644 --- a/interface/src/commerce/Ledger.cpp +++ b/interface/src/commerce/Ledger.cpp @@ -334,7 +334,13 @@ void Ledger::certificateInfoSuccess(QNetworkReply& reply) { qInfo(commerce) << "certificateInfo" << "response" << QJsonDocument(replyObject).toJson(QJsonDocument::Compact); emit certificateInfoResult(replyObject); } -void Ledger::certificateInfoFailure(QNetworkReply& reply) { failResponse("certificateInfo", reply); } +void Ledger::certificateInfoFailure(QNetworkReply& reply) { + QByteArray response = reply.readAll(); + QJsonObject replyObject = QJsonDocument::fromJson(response).object(); + + failResponse("certificateInfo", reply); + emit certificateInfoResult(replyObject); +} void Ledger::certificateInfo(const QString& certificateId) { QString endpoint = "proof_of_purchase_status/transfer"; QJsonObject request; From 5441767442fa3d8c2d6629d21325b2e0c05abf62 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Mon, 2 Apr 2018 12:14:48 -0700 Subject: [PATCH 2/3] Better cert display --- .../InspectionCertificate.qml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/interface/resources/qml/hifi/commerce/inspectionCertificate/InspectionCertificate.qml b/interface/resources/qml/hifi/commerce/inspectionCertificate/InspectionCertificate.qml index a622349d00..6218a46853 100644 --- a/interface/resources/qml/hifi/commerce/inspectionCertificate/InspectionCertificate.qml +++ b/interface/resources/qml/hifi/commerce/inspectionCertificate/InspectionCertificate.qml @@ -52,6 +52,23 @@ Rectangle { onCertificateInfoResult: { if (result.status !== 'success') { console.log("Failed to get certificate info", result.message); + // We should still tell the user that static cert verification failed + if (root.certificateStatus !== 3) { // CERTIFICATE_STATUS_STATIC_VERIFICATION_FAILED + root.useGoldCert = false; + root.certTitleTextColor = hifi.colors.redHighlight; + root.certTextColor = hifi.colors.redHighlight; + root.infoTextColor = hifi.colors.redHighlight; + titleBarText.text = "Certificate Unavailable"; + popText.text = ""; + showInMarketplaceButton.visible = false; + root.certInfoReplaceMode = 0; + root.itemName = ""; + root.itemEdition = ""; + root.itemOwner = ""; + root.dateOfPurchase = ""; + root.itemCost = ""; + errorText.text = "Information about this certificate is currently unavailable. Please try again later."; + } } else { root.marketplaceUrl = result.data.marketplace_item_url; root.isMyCert = result.isMyCert ? result.isMyCert : false; From 0c48ccefa4f1536b49c58ab2dc052ac0dd33ea70 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Fri, 6 Apr 2018 11:41:17 -0700 Subject: [PATCH 3/3] Clean up failResponse to make it better --- .../InspectionCertificate.qml | 2 +- interface/src/commerce/Ledger.cpp | 25 +++++++++++-------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/interface/resources/qml/hifi/commerce/inspectionCertificate/InspectionCertificate.qml b/interface/resources/qml/hifi/commerce/inspectionCertificate/InspectionCertificate.qml index 6218a46853..009aa8f852 100644 --- a/interface/resources/qml/hifi/commerce/inspectionCertificate/InspectionCertificate.qml +++ b/interface/resources/qml/hifi/commerce/inspectionCertificate/InspectionCertificate.qml @@ -51,7 +51,7 @@ Rectangle { onCertificateInfoResult: { if (result.status !== 'success') { - console.log("Failed to get certificate info", result.message); + console.log("Failed to get certificate info", result.data.message); // We should still tell the user that static cert verification failed if (root.certificateStatus !== 3) { // CERTIFICATE_STATUS_STATIC_VERIFICATION_FAILED root.useGoldCert = false; diff --git a/interface/src/commerce/Ledger.cpp b/interface/src/commerce/Ledger.cpp index e84fb84017..573d4db33c 100644 --- a/interface/src/commerce/Ledger.cpp +++ b/interface/src/commerce/Ledger.cpp @@ -35,12 +35,19 @@ QJsonObject Ledger::apiResponse(const QString& label, QNetworkReply& reply) { QJsonObject Ledger::failResponse(const QString& label, QNetworkReply& reply) { QString response = reply.readAll(); qWarning(commerce) << "FAILED" << label << response; - QJsonObject result - { - { "status", "fail" }, - { "message", response } - }; - return result; + + // tempResult will be NULL if the response isn't valid JSON. + QJsonDocument tempResult = QJsonDocument::fromJson(response.toLocal8Bit()); + if (tempResult.isNull()) { + QJsonObject result + { + { "status", "fail" }, + { "message", response } + }; + return result; + } else { + return tempResult.object(); + } } #define ApiHandler(NAME) void Ledger::NAME##Success(QNetworkReply& reply) { emit NAME##Result(apiResponse(#NAME, reply)); } #define FailHandler(NAME) void Ledger::NAME##Failure(QNetworkReply& reply) { emit NAME##Result(failResponse(#NAME, reply)); } @@ -338,11 +345,7 @@ void Ledger::certificateInfoSuccess(QNetworkReply& reply) { emit certificateInfoResult(replyObject); } void Ledger::certificateInfoFailure(QNetworkReply& reply) { - QByteArray response = reply.readAll(); - QJsonObject replyObject = QJsonDocument::fromJson(response).object(); - - failResponse("certificateInfo", reply); - emit certificateInfoResult(replyObject); + emit certificateInfoResult(failResponse("certificateInfo", reply)); } void Ledger::certificateInfo(const QString& certificateId) { QString endpoint = "proof_of_purchase_status/transfer";