Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
LanguageResources.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "DataBanks.hpp"
5
6#include <cstdint>
7#include <expected>
8#include <filesystem>
9#include <memory>
10#include <mutex>
11#include <optional>
12#include <span>
13#include <string>
14#include <unordered_map>
15
16namespace monopoly::data
17{
18 using SharedLanguageText = std::shared_ptr<const std::u16string>;
19
20
21 [[nodiscard]] std::expected<std::u16string, DataError>
22 decodeLegacyUtf16Le(std::span<const std::byte> bytes);
23
24
26 {
27 public:
28 [[nodiscard]] static std::expected<
29 std::shared_ptr<LanguageCatalog>,
31 open(
33 std::shared_ptr<LegacyDataArchive> textArchive);
34
35 // Format-agnostic catalog path. The source must expose DAT_LANG
36 // logical IDs (group 9); it may be a layered modern/legacy provider.
37 [[nodiscard]] static std::expected<
38 std::shared_ptr<LanguageCatalog>,
40 open(
42 std::shared_ptr<const DataSource> source);
43
44 [[nodiscard]] LanguageId language() const noexcept;
45 [[nodiscard]] std::uint32_t maximumMessageId() const noexcept;
46
47 // Equivalent possede et nullable de GetLanguageString /
48 // LANG_GetTextMessage2. Une absence normale vaut optional vide.
49 [[nodiscard]] std::expected<
50 std::optional<SharedLanguageText>,
52 lookup(std::uint32_t messageId) const;
53
54 // Fallback exact de LANG_GetTextMessage : ID direct, puis ID 0 dans
55 // la meme banque, puis literal source; prefixe #<id> seulement lors
56 // du fallback.
57 [[nodiscard]] std::expected<SharedLanguageText, DataError>
58 message(std::uint32_t messageId) const;
59
60 // Conforme au code reel : seuls espaces U+0020 et controles finaux
61 // sont retires; les retours a la ligne internes sont conserves. Une
62 // chaine entierement blanche conserve son premier code unit.
63 [[nodiscard]] std::expected<SharedLanguageText, DataError>
64 cleanMessage(std::uint32_t messageId) const;
65
66 private:
67 LanguageCatalog() = default;
68
70 // Legacy owner is retained for the compatibility open() path and for
71 // preserving DAT path diagnostics. Generic catalogs own source_ only.
72 std::shared_ptr<LegacyDataArchive> legacyArchive_;
73 std::shared_ptr<const DataSource> source_;
74 DataIndexTable index_;
75 std::uint32_t maximumMessageId_{};
76 mutable std::mutex mutex_;
77 mutable std::unordered_map<std::uint32_t, SharedLanguageText> cache_;
78 };
79
80
82 {
84 std::shared_ptr<LegacyDataArchive> textArchive;
85 std::shared_ptr<LegacyDataArchive> mediaArchive;
86 std::shared_ptr<LegacyDataArchive> dialogArchive;
87 std::shared_ptr<LanguageCatalog> catalog;
88 };
89
90
92 {
93 public:
94 // Publication transactionnelle : les trois banques et l'index texte
95 // sont valides avant le remplacement du snapshot actif.
96 [[nodiscard]] std::expected<void, DataError> select(
97 const std::filesystem::path& legacyRoot,
98 LanguageId language,
99 ArchiveOpenOptions options = {});
100
101 // Utilise les memes instances que le registre du lifecycle. Les
102 // groupes 9/5/10 doivent deja etre montes pour la langue choisie.
103 // Le caller doit conserver le registre sans unmount/clear tant que
104 // ce snapshot est consomme; ResourceRuntime publie cet ensemble.
105 [[nodiscard]] std::expected<void, DataError> select(
107 LanguageId language);
108
109 // Uses legacy archives for compatibility/lifecycle fields, but reads
110 // the text catalog through the supplied logical DATA source.
111 [[nodiscard]] std::expected<void, DataError> select(
113 std::shared_ptr<const DataSource> source,
114 LanguageId language);
115
116 [[nodiscard]] std::shared_ptr<const LanguageSnapshot>
117 snapshot() const noexcept;
118
119 void clear() noexcept;
120
121 private:
122 mutable std::mutex mutex_;
123 std::shared_ptr<const LanguageSnapshot> active_;
124 };
125}
std::vector< std::byte > bytes
std::shared_ptr< const data::HmdTextureImage > source
unsigned index
LanguageId language() const noexcept
std::uint32_t maximumMessageId() const noexcept
static std::expected< std::shared_ptr< LanguageCatalog >, DataError > open(LanguageId language, std::shared_ptr< LegacyDataArchive > textArchive)
std::expected< SharedLanguageText, DataError > cleanMessage(std::uint32_t messageId) const
std::expected< SharedLanguageText, DataError > message(std::uint32_t messageId) const
std::expected< std::optional< SharedLanguageText >, DataError > lookup(std::uint32_t messageId) const
std::shared_ptr< const LanguageSnapshot > snapshot() const noexcept
std::expected< void, DataError > select(const std::filesystem::path &legacyRoot, LanguageId language, ArchiveOpenOptions options={})
std::expected< std::u16string, DataError > decodeLegacyUtf16Le(std::span< const std::byte > bytes)
std::shared_ptr< const std::u16string > SharedLanguageText
std::shared_ptr< LegacyDataArchive > textArchive
std::shared_ptr< LanguageCatalog > catalog
std::shared_ptr< LegacyDataArchive > mediaArchive
std::shared_ptr< LegacyDataArchive > dialogArchive