API/Autodoc/Files/PaymentExceptionConverter.cpp.md


Namespaces

Name

Source code

// Copyright Epic Games, Inc. All Rights Reserved.

#include "DataConverter.h"

namespace RuStoreSDK::Pay
{
    FString PaymentExceptionConverter::ExtractExceptionClassName(RuStoreSDK::AndroidJavaObject* obj)
    {
        FString resultType = "";
        if (obj != nullptr)
        {
            auto javaClass = obj->CallAJClass("getClass");
            if (javaClass != nullptr)
            {
                FString className = javaClass->CallFString("getName");
                delete javaClass;

                TArray<FString> parts;
                className.ParseIntoArray(parts, TEXT("$"));
                if (parts.Num() > 0)
                {
                    resultType = parts[parts.Num() - 1];
                }
            }
        }
        
        return resultType;
    }

    TSharedPtr<FURuStoreError> PaymentExceptionConverter::ConvertCause(RuStoreSDK::AndroidJavaObject* obj)
    {
        auto causeObject = obj->CallAJObject("getCause");
        TSharedPtr<FURuStoreError> cause = nullptr;
        if (causeObject != nullptr)
        {
            cause = TSharedPtr<FURuStoreError, ESPMode::ThreadSafe>(RuStoreSDK::ErrorConverter::Convert(causeObject));
            delete causeObject;
        }

        return cause;
    }

    void PaymentExceptionConverter::ExtractNameMessageCause(RuStoreSDK::AndroidJavaObject* obj, FString& outName, FString& outMessage, TSharedPtr<FURuStoreError>& outCause)
    {
        auto errorJavaClass = obj->CallAJClass("getClass");
        if (errorJavaClass != nullptr)
        {
            outName = errorJavaClass->CallJavaClassFString("getSimpleName");
            delete errorJavaClass;
        }
        outMessage = obj->CallFString("getMessage");
        outCause = ConvertCause(obj);
    }

    FURuStoreError* PaymentExceptionConverter::ConvertExceptionClasses(RuStoreSDK::AndroidJavaObject* obj)
    {
#if !USE_EXTENDED_ERROR_TYPES
        return RuStoreSDK::ErrorConverter::Convert(obj);
#endif

        FString resultType = ExtractExceptionClassName(obj);

        FString name;
        FString message;
        TSharedPtr<FURuStoreError> cause;

        if (resultType == "ApplicationSchemeWasNotProvided")
        {
            ExtractNameMessageCause(obj, name, message, cause);
            return new FURuStorePayApplicationSchemeWasNotProvided(name, message, cause);
        }
        else if (resultType == "EmptyPaymentTokenException")
        {
            ExtractNameMessageCause(obj, name, message, cause);
            return new FURuStorePayEmptyPaymentTokenException(name, message, cause);
        }
        else if (resultType == "ProductPurchaseCancelled")
        {
            ExtractNameMessageCause(obj, name, message, cause);

            auto productTypeObj = obj->CallAJObject("getProductType");
            EURuStorePayProductType productType = EURuStorePayProductType::NON_CONSUMABLE_PRODUCT;
            if (productTypeObj != nullptr)
            {
                productType = DataConverter::GetEnumByNameString<EURuStorePayProductType>(productTypeObj->CallJavaClassFString("getSimpleName"));
                delete productTypeObj;
            }

            FString purchaseId;
            auto purchaseIdObj = obj->CallAJObject("getPurchaseId");
            if (purchaseIdObj != nullptr)
            {
                purchaseId = purchaseIdObj->CallFString("getValue");
                delete purchaseIdObj;
            }

            auto purchaseTypeObj = obj->CallAJObject("getPurchaseType");
            EURuStorePayPurchaseType purchaseType = EURuStorePayPurchaseType::UNKNOWN;
            if (purchaseTypeObj != nullptr)
            {
                purchaseType = DataConverter::GetEnumByNameString<EURuStorePayPurchaseType>(purchaseTypeObj->CallJavaClassFString("getSimpleName"));
                delete purchaseTypeObj;
            }

            return new FURuStorePayProductPurchaseCancelled(name, message, cause, productType, purchaseId, purchaseType);
        }
        else if (resultType == "ProductPurchaseException")
        {
            ExtractNameMessageCause(obj, name, message, cause);

            FString invoiceId;
            auto invoiceIdObj = obj->CallAJObject("getInvoiceId");
            if (invoiceIdObj != nullptr)
            {
                invoiceId = invoiceIdObj->CallFString("getValue");
                delete invoiceIdObj;
            }

            FString orderId;
            auto orderIdObj = obj->CallAJObject("getOrderId");
            if (orderIdObj != nullptr)
            {
                orderId = orderIdObj->CallFString("getValue");
                delete orderIdObj;
            }

            FString productId;
            auto productIdObj = obj->CallAJObject("getProductId");
            if (productIdObj != nullptr)
            {
                productId = productIdObj->CallFString("getValue");
                delete productIdObj;
            }

            auto productTypeObj = obj->CallAJObject("getProductType");
            EURuStorePayProductType productType = EURuStorePayProductType::NON_CONSUMABLE_PRODUCT;
            if (productTypeObj != nullptr)
            {
                productType = DataConverter::GetEnumByNameString<EURuStorePayProductType>(productTypeObj->CallJavaClassFString("getSimpleName"));
                delete productTypeObj;
            }

            FString purchaseId;
            auto purchaseIdObj = obj->CallAJObject("getPurchaseId");
            if (purchaseIdObj != nullptr)
            {
                purchaseId = purchaseIdObj->CallFString("getValue");
                delete purchaseIdObj;
            }

            auto purchaseTypeObj = obj->CallAJObject("getPurchaseType");
            EURuStorePayPurchaseType purchaseType = EURuStorePayPurchaseType::UNKNOWN;
            if (purchaseTypeObj != nullptr)
            {
                purchaseType = DataConverter::GetEnumByNameString<EURuStorePayPurchaseType>(purchaseTypeObj->CallJavaClassFString("getSimpleName"));
                delete purchaseTypeObj;
            }

            int32 quantity = 1;
            auto quantityObj = obj->CallAJObject("getQuantity");
            if (quantityObj != nullptr)
            {
                quantity = quantityObj->CallInt("getValue");
                delete quantityObj;
            }

            bool sandbox = false;
            auto sandboxObj = obj->CallAJObject("getSandbox");
            if (sandboxObj != nullptr)
            {
                sandbox = sandboxObj->CallBool("booleanValue");
                delete sandboxObj;
            }

            return new FURuStorePayProductPurchaseException(
                name, message, cause,
                invoiceId, orderId, productId, productType,
                purchaseId, purchaseType, quantity, sandbox
            );
        }
        else if (resultType == "RuStorePayClientAlreadyExist")
        {
            ExtractNameMessageCause(obj, name, message, cause);
            return new FURuStorePayClientAlreadyExist(name, message, cause);
        }
        else if (resultType == "RuStorePayClientNotCreated")
        {
            ExtractNameMessageCause(obj, name, message, cause);
            return new FURuStorePayClientNotCreated(name, message, cause);
        }
        else if (resultType == "RuStorePayInvalidActivePurchase")
        {
            ExtractNameMessageCause(obj, name, message, cause);
            return new FURuStorePayInvalidActivePurchase(name, message, cause);
        }
        else if (resultType == "RuStorePayInvalidConsoleAppId")
        {
            ExtractNameMessageCause(obj, name, message, cause);
            return new FURuStorePayInvalidConsoleAppId(name, message, cause);
        }
        else if (resultType == "RuStorePaySignatureException")
        {
            ExtractNameMessageCause(obj, name, message, cause);
            return new FURuStorePaySignatureException(name, message, cause);
        }
        else if (resultType == "RuStorePaymentCommonException")
        {
            ExtractNameMessageCause(obj, name, message, cause);
            return new FURuStorePaymentCommonException(name, message, cause);
        }
        else if (resultType == "RuStorePaymentNetworkException")
        {
            FString code = obj->CallFString("getCode");
            FString id = obj->CallFString("getId");
            ExtractNameMessageCause(obj, name, message, cause);
            return new FURuStorePaymentNetworkException(code, id, name, message, cause);
        }

        // Default fallback — generic payment exception
        ExtractNameMessageCause(obj, name, message, cause);
        return new FURuStorePayPaymentException(name, message, cause);
    }
}

Назад