MCPcopy Create free account
hub / github.com/CesiumGS/cesium-native / tryDecode

Function tryDecode

CesiumGltfReader/src/decodeDataUrls.cpp:51–98  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

49};
50
51std::optional<DecodeResult> tryDecode(const std::string& uri) {
52 constexpr std::string_view dataPrefix = "data:";
53 constexpr size_t dataPrefixLength = dataPrefix.size();
54
55 constexpr std::string_view base64Indicator = ";base64";
56 constexpr size_t base64IndicatorLength = base64Indicator.size();
57
58 if (uri.substr(0, dataPrefixLength) != dataPrefix) {
59 return std::nullopt;
60 }
61
62 const size_t dataDelimeter = uri.find(',', dataPrefixLength);
63 if (dataDelimeter == std::string::npos) {
64 return std::nullopt;
65 }
66
67 bool isBase64Encoded = false;
68
69 DecodeResult result;
70
71 result.mimeType =
72 uri.substr(dataPrefixLength, dataDelimeter - dataPrefixLength);
73 if (result.mimeType.size() >= base64IndicatorLength &&
74 result.mimeType.substr(
75 result.mimeType.size() - base64IndicatorLength,
76 base64IndicatorLength) == base64Indicator) {
77 isBase64Encoded = true;
78 result.mimeType = result.mimeType.substr(
79 0,
80 result.mimeType.size() - base64IndicatorLength);
81 }
82
83 const std::span<const std::byte> data(
84 reinterpret_cast<const std::byte*>(uri.data()) + dataDelimeter + 1,
85 uri.size() - dataDelimeter - 1);
86
87 if (isBase64Encoded) {
88 result.data = decodeBase64(data);
89 if (result.data.empty() && !data.empty()) {
90 // base64 decode failed.
91 return std::nullopt;
92 }
93 } else {
94 result.data = std::vector<std::byte>(data.begin(), data.end());
95 }
96
97 return result;
98}
99} // namespace
100
101void decodeDataUrls(

Callers 1

decodeDataUrlsFunction · 0.85

Calls 5

decodeBase64Function · 0.85
sizeMethod · 0.45
dataMethod · 0.45
beginMethod · 0.45
endMethod · 0.45

Tested by

no test coverage detected