summaryrefslogtreecommitdiffstats
path: root/src/Protocol/ProtocolPalettes.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Protocol/ProtocolPalettes.h')
-rw-r--r--src/Protocol/ProtocolPalettes.h63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/Protocol/ProtocolPalettes.h b/src/Protocol/ProtocolPalettes.h
new file mode 100644
index 000000000..fad093a04
--- /dev/null
+++ b/src/Protocol/ProtocolPalettes.h
@@ -0,0 +1,63 @@
+#pragma once
+
+#include "../OSSupport/CriticalSection.h"
+
+
+
+
+
+// fwd:
+class BlockTypePalette;
+
+
+
+
+
+/** Loads the protocol-specific palettes on startup and provides them to the individual protocol
+instances when they are created.
+Uses the data in the $/Server/Protocol folder. Each protocol version has a subfolder there,
+containing possibly multiple palette files. All the files are loaded in sequence (alpha-sorted),
+into the palette corresponding to the file's extension (*.btp.txt -> BlockTypePalette).
+Provides thread safety for the data properly. */
+class ProtocolPalettes
+{
+public:
+
+ /** Loads all the per-protocol palettes.
+ aProtocolFolder is the folder that contains a subfolder for each protocol version;
+ each subfolder contains the protocol-specific palettes (as in $/Server/Protocol)
+ If a protocol version is already loaded, yet present in the folder, the newly loaded data is merged
+ into the current data.
+ Always succeeds (even when there are no palettes). */
+ void load(const AString & aProtocolFolder);
+
+ /** Returns the BlockTypePalette for the specified protocol.
+ Returns nullptr if no such palette has been loaded. */
+ std::shared_ptr<const BlockTypePalette> blockTypePalette(const AString & aProtocolVersion) const;
+
+ /** Returns the version names of all protocols that have been loaded. */
+ std::vector<AString> protocolVersions() const;
+
+
+protected:
+
+ /** Container for all palettes for a single protocol. */
+ struct Palettes
+ {
+ std::shared_ptr<BlockTypePalette> mBlockTypePalette;
+ // TODO: ItemTypePalette
+
+ Palettes();
+ };
+
+
+ /** The CS protecting all members against multithreaded access. */
+ mutable cCriticalSection mCS;
+
+ /** The map of protocol version -> all its palettes. */
+ std::map<AString, Palettes> mPalettes;
+
+
+ /** Loads all the palettes from the specified folder into mPalettes under the aProtocolVersion key. */
+ void loadSingleVersion(const AString & aProtocolVersion, const AString & aFolder);
+};