| #include <sstream> | |
| #include <iomanip> | |
| #include <array> | |
| #include "rive/assets/file_asset.hpp" | |
| #include "rive/backboard.hpp" | |
| #include "rive/importers/backboard_importer.hpp" | |
| using namespace rive; | |
| StatusCode FileAsset::import(ImportStack& importStack) | |
| { | |
| auto backboardImporter = importStack.latest<BackboardImporter>(Backboard::typeKey); | |
| if (backboardImporter == nullptr) | |
| { | |
| return StatusCode::MissingObject; | |
| } | |
| backboardImporter->addFileAsset(this); | |
| return Super::import(importStack); | |
| } | |
| std::string FileAsset::uniqueFilename() const | |
| { | |
| // remove final extension | |
| std::string uniqueFilename = name(); | |
| std::size_t finalDot = uniqueFilename.rfind('.'); | |
| if (finalDot != std::string::npos) | |
| { | |
| uniqueFilename = uniqueFilename.substr(0, finalDot); | |
| } | |
| return uniqueFilename + "-" + std::to_string(assetId()) + "." + fileExtension(); | |
| } | |
| void FileAsset::copyCdnUuid(const FileAssetBase& object) | |
| { | |
| // Should never be called. | |
| assert(false); | |
| } | |
| void FileAsset::decodeCdnUuid(Span<const uint8_t> value) | |
| { | |
| m_cdnUuid = std::vector<uint8_t>(value.begin(), value.end()); | |
| } | |
| Span<const uint8_t> FileAsset::cdnUuid() const { return m_cdnUuid; } | |
| std::string FileAsset::cdnUuidStr() const | |
| { | |
| constexpr uint8_t uuidSize = 16; | |
| if (m_cdnUuid.size() != uuidSize) | |
| { | |
| return ""; | |
| } | |
| const std::array<const int, uuidSize> | |
| indices{3, 2, 1, 0, 5, 4, 7, 6, 9, 8, 15, 14, 13, 12, 11, 10}; | |
| std::stringstream ss; | |
| ss << std::hex << std::setfill('0'); | |
| for (int idx : indices) | |
| { | |
| ss << std::setw(2) // always 2 chars | |
| << static_cast<unsigned int>(m_cdnUuid[idx]); | |
| if (idx == 0 || idx == 4 || idx == 6 || idx == 8) | |
| ss << '-'; | |
| } | |
| return ss.str(); | |
| } |