plugins/ctf/common/src/metadata/json/validate-scope-fc-roles.hpp \
plugins/ctf/common/src/metadata/metadata-stream-parser.cpp \
plugins/ctf/common/src/metadata/metadata-stream-parser.hpp \
+ plugins/ctf/common/src/metadata/metadata-stream-parser-utils.cpp \
+ plugins/ctf/common/src/metadata/metadata-stream-parser-utils.hpp \
plugins/ctf/common/src/metadata/normalize-clk-offset.cpp \
plugins/ctf/common/src/metadata/normalize-clk-offset.hpp \
plugins/ctf/common/src/metadata/tsdl/ctf-1-metadata-stream-parser.cpp \
--- /dev/null
+/*
+ * Copyright (c) 2022 Philippe Proulx <pproulx@efficios.com>
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "common/assert.h"
+#include "cpp-common/bt2s/make-unique.hpp"
+
+#include "json/ctf-2-metadata-stream-parser.hpp"
+#include "metadata-stream-parser-utils.hpp"
+#include "tsdl/ctf-1-metadata-stream-parser.hpp"
+
+namespace ctf {
+namespace src {
+
+MetadataStreamMajorVersion getMetadataStreamMajorVersion(const bt2c::ConstBytes buffer) noexcept
+{
+ BT_ASSERT(buffer.data());
+
+ /* CTF 2 if it starts with an RS byte, otherwise CTF 1 */
+ return (buffer[0] == 30) ? MetadataStreamMajorVersion::V2 : MetadataStreamMajorVersion::V1;
+}
+
+std::unique_ptr<MetadataStreamParser>
+createMetadataStreamParser(const MetadataStreamMajorVersion majorVersion,
+ const bt2::OptionalBorrowedObject<bt2::SelfComponent> selfComp,
+ const ClkClsCfg& clkClsCfg, const bt2c::Logger& parentLogger)
+{
+ if (majorVersion == MetadataStreamMajorVersion::V1) {
+ return bt2s::make_unique<Ctf1MetadataStreamParser>(selfComp, clkClsCfg, parentLogger);
+ } else {
+ BT_ASSERT(majorVersion == MetadataStreamMajorVersion::V2);
+ return bt2s::make_unique<Ctf2MetadataStreamParser>(selfComp, clkClsCfg, parentLogger);
+ }
+}
+
+std::unique_ptr<MetadataStreamParser>
+createMetadataStreamParser(const bt2c::ConstBytes buffer,
+ const bt2::OptionalBorrowedObject<bt2::SelfComponent> selfComp,
+ const ClkClsCfg& clkClsCfg, const bt2c::Logger& parentLogger)
+{
+ return createMetadataStreamParser(getMetadataStreamMajorVersion(buffer), selfComp, clkClsCfg,
+ parentLogger);
+}
+
+MetadataStreamParser::ParseRet
+parseMetadataStream(const bt2::OptionalBorrowedObject<bt2::SelfComponent> selfComp,
+ const ClkClsCfg& clkClsCfg, const bt2c::ConstBytes buffer,
+ const bt2c::Logger& parentLogger)
+{
+ const auto majorVersion = getMetadataStreamMajorVersion(buffer);
+
+ if (majorVersion == MetadataStreamMajorVersion::V1) {
+ return Ctf1MetadataStreamParser::parse(selfComp, clkClsCfg, buffer, parentLogger);
+ } else {
+ BT_ASSERT(majorVersion == MetadataStreamMajorVersion::V2);
+ return Ctf2MetadataStreamParser::parse(selfComp, clkClsCfg, buffer, parentLogger);
+ }
+}
+
+} /* namespace src */
+} /* namespace ctf */
--- /dev/null
+/*
+ * SPDX-License-Identifier: MIT
+ *
+ * Copyright 2022-2024 Philippe Proulx <pproulx@efficios.com>
+ */
+
+#ifndef BABELTRACE_PLUGINS_CTF_COMMON_SRC_METADATA_METADATA_STREAM_PARSER_UTILS_HPP
+#define BABELTRACE_PLUGINS_CTF_COMMON_SRC_METADATA_METADATA_STREAM_PARSER_UTILS_HPP
+
+#include <memory>
+
+#include "cpp-common/bt2c/aliases.hpp"
+#include "cpp-common/bt2c/logging.hpp"
+
+#include "../clk-cls-cfg.hpp"
+#include "metadata-stream-parser.hpp"
+
+namespace ctf {
+namespace src {
+
+enum class MetadataStreamMajorVersion
+{
+ V1 = 1,
+ V2,
+};
+
+/*
+ * Returns the major CTF version (1 or 2) of the metadata stream
+ * in `buffer`.
+ */
+MetadataStreamMajorVersion getMetadataStreamMajorVersion(bt2c::ConstBytes buffer) noexcept;
+
+/*
+ * Creates and returns a CTF metadata stream parser of which the
+ * concrete class depends on `majorVersion`.
+ *
+ * Forwards other parameters to the CTF metadata stream
+ * parser constructor.
+ */
+std::unique_ptr<MetadataStreamParser>
+createMetadataStreamParser(MetadataStreamMajorVersion majorVersion,
+ bt2::OptionalBorrowedObject<bt2::SelfComponent> selfComp,
+ const ClkClsCfg& clkClsCfg, const bt2c::Logger& parentLogger);
+
+/*
+ * Creates and returns a CTF metadata stream parser of which the
+ * concrete class depends on the first byte of `buffer`, the beginning
+ * of the metadata stream.
+ *
+ * Forwards other parameters to the CTF metadata stream
+ * parser constructor.
+ */
+std::unique_ptr<MetadataStreamParser>
+createMetadataStreamParser(bt2c::ConstBytes buffer,
+ bt2::OptionalBorrowedObject<bt2::SelfComponent> selfComp,
+ const ClkClsCfg& clkClsCfg, const bt2c::Logger& parentLogger);
+
+/*
+ * Parses the metadata stream in `buffer` using a parser of which the
+ * concrete class depends on the first byte of `buffer`, the beginning
+ * of the metadata stream.
+ *
+ * Forwards other parameters to the CTF metadata stream
+ * parser constructor.
+ */
+MetadataStreamParser::ParseRet
+parseMetadataStream(bt2::OptionalBorrowedObject<bt2::SelfComponent> selfComp,
+ const ClkClsCfg& clkClsCfg, bt2c::ConstBytes buffer,
+ const bt2c::Logger& parentLogger);
+
+} /* namespace src */
+} /* namespace ctf */
+
+#endif /* BABELTRACE_PLUGINS_CTF_COMMON_SRC_METADATA_METADATA_STREAM_PARSER_UTILS_HPP */