DDS Consolidated XML Syntax 1.0 — Spec Coverage

Source: internal/standards/cache/omg/dds-xml-1.0.pdf (33 pages, OMG formal/18-10-01, December 2018) — OMG DDS-XML 1.0

Item-by-item audit against the PDF following internal/spec-coverage/PROCESS.md. Page numbers are PDF pages (PDF page = printed page + 9). Every normative sentence of §1 to §8, every row of Table 7.1 and Table 7.2, every constant of §7.2.2 and every attribute of the building blocks is an item of its own. §7.2 and §7.2.3 require a 1-to-1 mapping of the types of the DDS IDL; the QoS policies, their enumerations and the QoS structures of the DDS 1.4 IDL (internal/standards/cache/omg/dds-dcps-1.4.pdf, p. 157–161) are therefore one item each under §7.2.1 and §7.2.3; their defaults are in DDS 1.4 §2.2.3 (p. 104–113 of the same PDF). done is used only where code and a test cover the requirement; a cited test names the test function as file::module::name. A repository reference names the file and the symbol, no line. The evidence is read from the code and compiled; which tests were run is stated under “Audit-Status”. Where code implements a requirement but no test checks it, the item is open and the note names the code location.

Context: DDS-XML 1.0 is spread over these parts of ZeroDDS:

  • crates/xml/ · docs.rs (zerodds-xml) — the reader for all building blocks: the document tree (parser), the values of §7.1.4 and §7.2.2 (types), QoS libraries and profiles (qos, qos_parser, qos_inheritance, registry), domains (domain), DomainParticipants (participant), applications (application), the reader for <dds> with the resolution of references (zerodds_xml), types (xtypes_def, xtypes_parser), data samples (sample) and the XSD files under crates/xml/schemas/ (schemas).
  • crates/xml-compose/ · docs.rs (zerodds-xml-compose) — a second reader for <types> that brings the types into the common model of the code generators.
  • Callers: tools/xmlc (zerodds-xmlc validate|types|render), tools/admin (qos validate, qos check), crates/rpc (RpcQos::from_xml_profile) and crates/webdds-bridge (QoS profiles and entities for DDS-WEB).

zerodds-dcps, the C API and the language bindings read no DDS-XML. crates/dcps/src/qos.rs takes a zerodds_qos::WriterQos or ReaderQos as QosProfileRegistry returns it into DataWriterQos and DataReaderQos (From implementations). The specification defines no programming interface (§2 leaves conformance to the referencing specifications); items therefore exist only for the syntax and its meaning.

The PDF names XSD files under https://www.omg.org/spec/DDS-XML/20180501/ on p. 1 as normative machine-readable files. The twelve files for QoS, Types, Domains, DomainParticipants, Applications and DDS System are in crates/xml/schemas/ unchanged (byte for byte the OMG’s); Data Samples have no normative pair (§7.3.7.3.1), ZeroDDS ships its own. The example documents dds-xml_*_example.xml are not in the repository: the tests in crates/xml/tests/omg_example_documents.rs and part of crates/xml/tests/schema_validation.rs read them from the directory in ZERODDS_OMG_DDSXML_DIR and return without checking when the variable is unset; schema_validation.rs also needs xmllint. Where the text and the XSD of the spec contradict each other, the item states the decision: user_data, topic_data and group_data (XSD: one value as Base64; text: a list in value or valueB64; all forms are read), base_name at <domain> (text only; read) and type_ref at register_type (text: required; XSD: optional; required).

The grammar of the types in <types> is that of [DDS-XTYPES]; it is listed item by item in dds-xtypes-1.3.en.md under §7.3.2. Here only the requirements DDS-XML places on the building block Types are listed.

Open items: none; every item is done or n/a (informative).


§1 Scope

§1 Consolidation of the XML syntax

Spec: §1, p. 10 — “Historically various specifications have defined XML syntax to represent particular subsets of DDS-related resources […] This specification consolidates all this XML syntax into a single document. There are no significant syntactic changes in this document relative to referenced specifications.”

Repo: —

Tests: —

Status: n/a (informative) — overview; the syntax is in the items from §7 on.


§2 Conformance Criteria

§2 No independent conformance points

Spec: §2, p. 10 — “This document contains no independent conformance points. Rather, it defines XML Schemas to be used to describe DDS resources such that they can be referenced by other specifications leaving the definition of conformance criteria to the referencing specifications.”

Repo: —

Tests: —

Status: n/a (informative) — note on the conformance model.

§2 Rule 1: future specifications reference DDS-XML

Spec: §2, p. 10 — “Future specifications that describe DDS resources in XML shall reference this specification or a future revision thereof.”

Repo: —

Tests: —

Status: n/a (informative) — addressed to OMG specifications, not to an implementation.

§2 Rule 2: revisions of current specifications

Spec: §2, p. 10 — “Future revisions of current specifications that describe DDS resources in XML should reference this specification or a future revision thereof.”

Repo: —

Tests: —

Status: n/a (informative) — addressed to OMG specifications.

§2 Selected building blocks supported entirely

Spec: §2, p. 10 — “Reference to this standard shall result in a selection of building blocks where all selected building blocks shall be supported entirely.”

Repo: crates/xml/src/conformance.rs::SUPPORTED_BUILDING_BLOCKS

Tests: crates/xml/src/conformance.rs::tests::supported_blocks_match_spec_count, crates/xml/tests/schema_validation.rs::xsd_valid_documents_are_read, crates/xml/tests/omg_example_documents.rs::dds_system_example

Status: done — all six building blocks are read, with the exceptions the items under §7.3 name one by one: the documents of the XSD_VALID table and the five OMG examples are read; what the XSDs reject, the reader rejects (schema_invalid_documents). One form the XSD allows and the reader does not read exists: register_type without type_ref (the text of §7.3.4.4.1 requires it, the XSD has use="optional"). Commits b04504693c4, 97a817ee16c.


§3 Normative References

§3 [XML] Extensible Markup Language 1.0 (Fifth Edition)

Spec: §3, p. 10 — “[XML] Extensible Markup Language (XML) 1.0 (Fifth Edition) Specification.”

Repo: —

Tests: —

Status: n/a (informative) — reference; the requirement is in the item on §7.1.1.

§3 [XSD-1] XML Schema Definition Language 1.1 Part 1

Spec: §3, p. 10 — “[XSD-1] XML Schema Definition Language (XSD) 1.1 Part 1: Structures.”

Repo: —

Tests: —

Status: n/a (informative) — reference; the schema files are in the items on §7.1.2 and §7.3.1.

§3 [XSD-2] XML Schema Definition Language 1.1 Part 2

Spec: §3, p. 10 — “[XSD-2] XML Schema Definition Language (XSD) 1.1 Part 2: Datatypes.”

Repo: —

Tests: —

Status: n/a (informative) — reference; the values are in the items on §7.1.4, §7.1.5 and §7.2.2.

§3 [DDS4CCM] DDS for Lightweight CCM 1.1

Spec: §3, p. 10 — “The following referenced documents were used as input to this specification: [DDS4CCM] DDS for Lightweight CCM (DDS4CCM), Version 1.1.”

Repo: —

Tests: —

Status: n/a (informative) — source of the QoS syntax.

§3 [DDS-XTYPES] Extensible and Dynamic Topic Types 1.2

Spec: §3, p. 10 — “[DDS-XTYPES] Extensible and Dynamic Topic Types for DDS, Version 1.2.”

Repo: —

Tests: —

Status: n/a (informative) — source of the syntax for types and samples; types in the items on §7.3.3, samples in §7.3.7.

§3 [DDS-WEB] Web-Enabled DDS 1.0

Spec: §3, p. 10 — “[DDS-WEB] Web-Enabled DDS, Version 1.0.”

Repo: —

Tests: —

Status: n/a (informative) — source of the syntax for applications, domains and entities.

§3 [DDS] Data Distribution Service 1.4

Spec: §3, p. 11 — “[DDS] Data Distribution Service, Version 1.4. OMG Document: formal/15-04-10.”

Repo: —

Tests: —

Status: n/a (informative) — reference; the QoS IDL is in the items on §7.2.1 and §7.2.3.

§3 [IDL] Interface Definition Language 4.2

Spec: §3, p. 11 — “[IDL] Interface Definition Language (IDL), Version 4.2.”

Repo: —

Tests: —

Status: n/a (informative) — reference.


§4 Terms and Definitions

§4 Building block

Spec: §4, p. 11 — “A building block is a consistent set of XML schemas that together can be used to describe the syntax of XML documents that represent a set of DDS resources. Building blocks are atomic, which means that if selected they must be totally supported.”

Repo: —

Tests: —

Status: n/a (informative) — term; the consequence for support is in the item on §2.

§4 Building block set

Spec: §4, p. 11 — “A building block set is a selection of building blocks that determines a specific XSD schema usage.”

Repo: —

Tests: —

Status: n/a (informative) — term; the only block set is in the items on §8.1.


§5 Symbols

§5 Table 5.1 Acronyms

Spec: §5, p. 11 — DDS, ISO, LwCCM, OMG, QoS, UTF, XML, XSD, XTypes.

Repo: —

Tests: —

Status: n/a (informative) — acronyms.


§6 Additional Information

§6.1 Changes to Adopted OMG Specifications

Spec: §6.1, p. 12 — “This specification does not change any adopted OMG specification.”

Repo: —

Tests: —

Status: n/a (informative) — note.

§6.2 Acknowledgments

Spec: §6.2, p. 12 — submitting companies (Real-Time Innovations, Twin Oaks Computing, Jackrabbit Consulting).

Repo: —

Tests: —

Status: n/a (informative) — acknowledgments.


§7.1.1 General Rules

§7.1.1 Well-formed document according to [XML] clause 2.1

Spec: §7.1.1, p. 14 — “The XML representation of DDS-related resources must follow these syntax rules: It shall be a well-formed XML document according to the criteria defined in clause 2.1 of [XML].”

Repo: crates/xml/src/parser.rs::parse_xml_tree (via roxmltree), precheck_depth, check_tree_depth, check_entity_declarations; crates/xml/src/sample.rs::serialize_sample (the only writer)

Tests: crates/xml/src/parser.rs::tests::invalid_xml_rejected, crates/xml/src/parser.rs::tests::parse_with_xml_declaration, crates/xml/src/parser.rs::tests::dtd_and_internal_entity_accepted, crates/xml/src/parser.rs::tests::entity_expansion_is_bounded, crates/xml/src/parser.rs::tests::external_entity_reference_rejected, crates/xml/src/parser.rs::tests::deep_nesting_in_cdata_does_not_fool_the_depth_check, crates/xml/tests/fuzz_smoke.rs::deep_nesting_is_refused_by_every_entry_point, crates/xml/tests/schema_validation.rs::serialize_sample_output_validates

Status: done — a document that is not well-formed ends with XmlError::InvalidXml. A DTD is allowed ([XML] 2.1); internal entities are bounded (value at most MAX_ENTITY_VALUE_BYTES, at most MAX_ENTITY_DECLARATIONS declarations, no entity referring to another), external ones are not loaded. The reader also rejects well-formed documents that exceed its limits: more than 64 levels (MAX_TREE_DEPTH; precheck_depth counts the open elements iteratively before roxmltree runs, check_tree_depth checks the tree afterwards), more than 1024 children of an element (MAX_LIST_ELEMENTS) or more than 65,536 elements (MAX_TOTAL_ELEMENTS). Commits 3c9fe0f4d1a, 167d1009ef8, b732c05bc1a. The test serialize_sample_output_validates needs xmllint.

§7.1.1 UTF-8

Spec: §7.1.1, p. 14 — “It shall use UTF-8 character encoding for XML elements and values.”

Repo: crates/xml/src/parser.rs::parse_xml_tree (takes &str); crates/xml/src/registry.rs::QosProfileRegistry::from_file (read_to_string); crates/xml/src/xsd_loader.rs::load_type_libraries_from_uri (from_utf8); crates/xml/src/sample.rs::xml_escape

Tests: crates/xml/tests/types_and_samples.rs::t24_sample_string_escaping_roundtrip, crates/xml/src/xsd_loader.rs::tests::data_uri_non_utf8_body_rejected

Status: done — the input is a Rust string and thus UTF-8; from_file and load_type_libraries_from_uri reject bytes that are not UTF-8; the writer emits every character above U+007F as a character reference. The encoding declaration is in the item below. Commit 167d1009ef8.

§7.1.1 Declaration of another encoding

Spec: §7.1.1, p. 14 — UTF-8 for elements and values.

Repo: crates/xml/src/parser.rs::check_declared_encoding; crates/xml/src/xsd_loader.rs (percent_decode)

Tests: crates/xml/src/parser.rs::tests::non_utf8_declared_encoding_rejected, crates/xml/src/xsd_loader.rs::tests::data_uri_non_utf8_body_rejected

Status: done — an XML declaration with an encoding other than UTF-8 (utf-8 and utf8, in any case) ends with XmlError::InvalidXml, because roxmltree reads the value and discards it. A data: URI with bytes outside UTF-8 is rejected, not replaced by U+FFFD. Commit 167d1009ef8.


§7.1.2 XML Schema Definition Files

§7.1.2 Two normative XSD files per building block

Spec: §7.1.2, p. 14 — “This specification makes use of XML Schema Definition (XSD) language specified in [XSD-1] and [XSD-2] to represent the syntax of the different building blocks that define DDS resources. In particular, each building block contains two normative XSD files that define their syntax (see sub clause 7.3.1).”

Repo: crates/xml/src/schemas.rs::ALL_SCHEMAS; crates/xml/schemas/

Tests: crates/xml/src/schemas.rs::tests::all_schemas_includes_six_building_blocks_plus_system, crates/xml/tests/schema_validation.rs::every_in_tree_schema_compiles, crates/xml/tests/schema_validation.rs::omg_examples_validate_against_in_tree_schemas

Status: done — each of the six building blocks and the block set of §8.1 has two files under crates/xml/schemas/; the twelve files for QoS, Types, Domains, DomainParticipants, Applications and DDS System are the OMG’s files, byte for byte (dds-xml_<block>_definitions.xsd and …_nonamespace.xsd). Data Samples have no normative pair (§7.3.7.3.1: no generic XSD); ZeroDDS ships its own pair and dds-xml_common.xsd, which only that pair includes. The OMG files include each other by the absolute URL http://www.omg.org/spec/DDS-XML/20180501/; schemas::building_block_includes maps it to file names. Commits b04504693c4, 97a817ee16c. every_in_tree_schema_compiles and omg_examples_validate_against_in_tree_schemas need xmllint.

§7.1.2 Names of the normative XSD files

Spec: §7.3.3.3, p. 25; §7.3.4.3, p. 25; §7.3.5.3, p. 26; §7.3.6.3, p. 28 — dds-xml_type_definitions[_nonamespace].xsd, dds-xml_domain_definitions[_nonamespace].xsd, dds-xml_domainparticipant_definitions[_nonamespace].xsd, dds-xml_application_definitions[_nonamespace].xsd.

Repo: crates/xml/src/schemas.rs::ALL_SCHEMAS; crates/xml/schemas/

Tests: crates/xml/src/schemas.rs::tests::building_block_xsd_dependencies_match_spec, crates/xml/tests/schema_validation.rs::every_in_tree_schema_compiles

Status: done — the files carry the OMG’s names: dds-xml_type_definitions*.xsd, dds-xml_domain_definitions*.xsd, dds-xml_domainparticipant_definitions*.xsd, dds-xml_application_definitions*.xsd, dds-xml_qos_definitions*.xsd, dds-xml_dds_system_definitions*.xsd. The spec is itself inconsistent (p. 1 lists dds-xml_dds_qos_definitions_nonamespace.xsd beside dds-xml_qos_definitions.xsd; §7.3.5.3 writes …domainparticipant_defintions…, §7.3.6.3 …definititons…); the names under which the OMG files include each other are the reference. Commit 97a817ee16c.


§7.1.3 XML Chameleon Schema Definition Pattern (non-normative)

§7.1.3.1 Motivation

Spec: §7.1.3.1, p. 14 — namespaces in XSD and the pattern of chameleon schemas without targetNamespace.

Repo: —

Tests: —

Status: n/a (informative) — “(non-normative)” in the title of §7.1.3. How the normative files use the pattern is in the items on §7.3.1.

§7.1.3.2.1 Example with several namespaces

Spec: §7.1.3.2.1, p. 14–15 — schema and document with three namespaces.

Repo: —

Tests: —

Status: n/a (informative) — Example. It writes <kind>RELIABLE_RELIABILITY</kind> (p. 15); the DDS 1.4 IDL names the literal RELIABLE_RELIABILITY_QOS, and §7.3.2.4.1.1 (p. 23) writes it so. parse_reliability rejects RELIABLE_RELIABILITY with XmlError::BadEnum.

§7.1.3.2.2 Example with chameleon files

Spec: §7.1.3.2.2, p. 15–16 — included files without targetNamespace, document with a single namespace.

Repo: —

Tests: —

Status: n/a (informative) — example. ZeroDDS’s readers do not check the namespace (item on §7.3.1); a document without a namespace is read like one in the specification’s namespace.


§7.1.4 XML Element Values

§7.1.4 Table 7.1 boolean: yes as 1 or true

Spec: §7.1.4, Table 7.1, p. 16 — “boolean | Yes: 1 or true. | Values are case sensitive.”

Repo: crates/xml/src/qos_parser.rs::parse_bool_strict, called in parse_presentation, parse_entity_factory, parse_writer_data_lifecycle and for Data Samples in crates/xml/src/sample.rs::parse_primitive_value; crates/xml/src/types.rs::parse_bool

Tests: crates/xml/src/qos_parser.rs::tests::parse_bool_strict_accepts_only_lowercase, crates/xml/src/types.rs::tests::bool_invalid, crates/xml/tests/qos_profile.rs::t14_boolean_case_sensitive_strict

Status: done — True and TRUE are rejected. crates/xml/src/types.rs::parse_bool, exported by lib.rs, takes only 1, true, 0 and false. Commit 167d1009ef8.

§7.1.4 Table 7.1 boolean: no as 0 or false

Spec: §7.1.4, Table 7.1, p. 16 — “No: 0 or false. | Values are case sensitive.”

Repo: crates/xml/src/qos_parser.rs::parse_bool_strict

Tests: crates/xml/src/qos_parser.rs::tests::parse_bool_strict_accepts_only_lowercase, crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done — False and FALSE are rejected.

§7.1.4 Table 7.1 enum: DCPS IDL literal as a string

Spec: §7.1.4, Table 7.1, p. 16 — “enum | A string. Legal values are the ones defined for QoS Policies in the DCPS IDL of DDS specification [DDS]. | Must be specified as a string. (Do not use numeric values.)”

Repo: crates/xml/src/qos_parser.rs: parse_durability, parse_history, parse_reliability, parse_liveliness, parse_destination_order, parse_ownership, parse_presentation, parse_durability_service

Tests: crates/xml/tests/spec_items.rs::every_literal_of_the_dcps_enumerations_is_read, crates/xml/src/registry.rs::tests::resolves_base_writer_qos

Status: done — every reader takes the DCPS IDL literal as a string; every_literal_of_the_dcps_enumerations_is_read reads all literals of the seven enumerations (items under §7.2.1). Commit 6ea1489d5f3.

§7.1.4 Table 7.1 enum: only DCPS IDL literals

Spec: §7.1.4, Table 7.1, p. 16 — “Legal values are the ones defined for QoS Policies in the DCPS IDL”.

Repo: crates/xml/src/qos_parser.rs: the readers per policy

Tests: crates/xml/src/qos_parser.rs::tests::short_enum_spellings_rejected, crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done — the short forms (VOLATILE, KEEP_LAST, RELIABLE, …) are no values; they end with XmlError::BadEnum. A <history> without <kind> and an empty <kind/> count as the DDS default (KEEP_LAST_HISTORY_QOS), not as a short form. They are not a vendor form either: the short forms are not read even with VendorForms::Accept. Commit 6ea1489d5f3.

§7.1.4 Table 7.1 enum: no numeric values

Spec: §7.1.4, Table 7.1, p. 16 — “(Do not use numeric values.)”

Repo: crates/xml/src/qos_parser.rs: the readers per policy

Tests: crates/xml/tests/spec_items.rs::a_number_is_no_enumeration_value

Status: done — a number as the value of a kind element ends with XmlError::BadEnum. Commit 6ea1489d5f3.

§7.1.4 Table 7.1 long: decimal -2147483648 to 2147483647

Spec: §7.1.4, Table 7.1, p. 16 — “long | -2147483648 to 2147483647 […] | A 32-bit signed integer.”

Repo: crates/xml/src/types.rs::parse_long, called for the long fields of the policies (crates/xml/src/qos_parser.rs)

Tests: crates/xml/src/types.rs::tests::long_decimal, crates/xml/src/types.rs::tests::long_invalid, crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done — data samples read long with code of their own (items on §7.3.7.3.1).

§7.1.4 Table 7.1 long: hexadecimal 0x80000000 to 0x7fffffff

Spec: §7.1.4, Table 7.1, p. 16 — “or 0x80000000 to 0x7fffffff”.

Repo: crates/xml/src/types.rs::parse_long

Tests: crates/xml/src/types.rs::tests::long_hex

Status: done — 0x80000000 to 0xFFFFFFFF are read as two’s complement (0x80000000 = -2147483648); 0x0 to 0x7FFFFFFF as positive values.

§7.1.4 Table 7.1 long: LENGTH_UNLIMITED

Spec: §7.1.4, Table 7.1, p. 16 — “or LENGTH_UNLIMITED.”

Repo: crates/xml/src/types.rs::parse_long

Tests: crates/xml/src/types.rs::tests::long_length_unlimited_symbol, crates/xml/tests/qos_profile.rs::t11_length_unlimited_in_resource_limits

Status: done — the name yields -1.

§7.1.4 Table 7.1 unsigned long: decimal

Spec: §7.1.4, Table 7.1, p. 16 — “unsigned long | 0 to 4294967296 […] | A 32-bit unsigned integer.”

Repo: crates/xml/src/types.rs::parse_ulong

Tests: crates/xml/src/types.rs::tests::ulong_decimal_and_hex, crates/xml/src/types.rs::tests::ulong_invalid

Status: done — range 0 to 4294967295. The table gives 4294967296 as the upper bound; that is 2^32 and does not fit into 32 unsigned bits (computed). ulong_invalid rejects 4294967296. In the QoS IDL only Duration_t.nanosec has the type unsigned long; the item on §7.2.6 applies to it.

§7.1.4 Table 7.1 unsigned long: hexadecimal

Spec: §7.1.4, Table 7.1, p. 16 — “or 0 to 0xffffffff.”

Repo: crates/xml/src/types.rs::parse_ulong

Tests: crates/xml/src/types.rs::tests::ulong_decimal_and_hex

Status: done

§7.1.4 Table 7.1 string: escaping according to [XML]

Spec: §7.1.4, Table 7.1, p. 16 — “string | The string with the reserved XML characters escaped according to the standard rules for element content [XML]. | Per the XML rules only < and & are required to be escaped within an element content. The characters >, ’, and” may be escaped.”

Repo: crates/xml/src/parser.rs::build_element; crates/xml/src/sample.rs::xml_escape

Tests: crates/xml/tests/types_and_samples.rs::t24_sample_string_escaping_roundtrip, crates/xml/tests/schema_validation.rs::serialize_sample_output_validates

Status: done — escaped characters and character references are resolved by roxmltree; the writer escapes <, >, &, ", ' and every character above U+007F. The reader does not change the whitespace of a string (item below).

§7.1.4 Table 7.1 string: white space and comments in the value

Spec: §7.1.4, Table 7.1, p. 16 — “The string with the reserved XML characters escaped”.

Repo: crates/xml/src/parser.rs::build_element; crates/xml/src/sample.rs::parse_primitive_value

Tests: crates/xml/src/parser.rs::tests::element_text_preserves_whitespace, crates/xml/src/parser.rs::tests::element_text_joins_runs_across_comments

Status: done — build_element stores the text of an element unchanged, with its whitespace at the edges; runs of text around a comment are joined (<a>x<!-- c -->y</a> is xy). A string in Data Samples keeps its whitespace (PrimitiveValue::Str). Numbers and names in QoS are trimmed when read. Commit 78f3cbe292d.


§7.1.5 XML Attribute Values

§7.1.5 Table 7.2 boolean: yes as 1 or true

Spec: §7.1.5, Table 7.2, p. 17 — “boolean | Yes: 1 or true. | Values are case sensitive.”

Repo: crates/xml/src/xtypes_parser.rs::opt_bool (via qos_parser::parse_bool_strict) for key, optional, mustUnderstand, nested, external, nonSerialized

Tests: crates/xml/src/xtypes_parser.rs::tests::spec_7_1_5_1_boolean_attribute_is_case_sensitive

Status: done — the building blocks QoS to Applications have no attribute of type boolean in the PDF; the attributes in <types> follow [DDS-XTYPES] and are read with parse_bool_strict (True is rejected).

§7.1.5 Table 7.2 boolean: no as 0 or false

Spec: §7.1.5, Table 7.2, p. 17 — “No: 0 or false. | Values are case sensitive.”

Repo: crates/xml/src/xtypes_parser.rs::opt_bool

Tests: crates/xml/src/xtypes_parser.rs::tests::spec_7_1_5_1_boolean_attribute_is_case_sensitive

Status: done — as the item for 1 or true.

§7.1.5 Table 7.2 enum: string

Spec: §7.1.5, Table 7.2, p. 17 — “enum | A string. Legal values are the ones defined for QoS Policies in the DCPS IDL of DDS specification [DDS]. | Must be specified as a string. (Do not use numeric values.)”

Repo: crates/xml/src/xtypes_parser.rs::extensibility_attr, parse_try_construct, parse_auto_id, parse_forward_dcl

Tests: crates/xml/tests/types_and_samples.rs::t03_extensibility_final_appendable_mutable, crates/xml/tests/normative_forms.rs::vendor_forms_are_refused_unless_accepted

Status: done — the PDF names no attribute whose value is a literal of the QoS IDL. The attributes with enumeration values in <types> (extensibility, tryConstruct, autoid, kind of forward_dcl) are read as strings and checked against the XSD’s values; spellings outside the XSD are vendor forms (extensibility="appendable", kind="STRUCT"). Commits 58e5bb48580, 147ffda178f, a9cb28ca85c.

§7.1.5 Table 7.2 enum: spelling and numbers

Spec: §7.1.5, Table 7.2, p. 17 — “(Do not use numeric values.)”

Repo: crates/xml/src/xtypes_parser.rs::extensibility_attr, parse_forward_dcl

Tests: crates/xml/tests/types_and_samples.rs::t03_extensibility_uppercase_rejected, crates/xml/tests/spec_items.rs::a_number_is_no_extensibility, crates/xml/tests/normative_forms.rs::vendor_forms_are_refused_unless_accepted

Status: done — FINAL, APPENDABLE, MUTABLE and a number end with XmlError::BadEnum; appendable is a vendor form of append; kind of forward_dcl is checked against enum, struct, union, bitmask. Commits 6ea1489d5f3, 147ffda178f, a9cb28ca85c.

§7.1.5 Table 7.2 long

Spec: §7.1.5, Table 7.2, p. 17 — “long | -2147483648 to 2147483647 or 0x80000000 to 0x7fffffff or LENGTH_UNLIMITED. | A 32-bit signed integer.”

Repo: crates/xml/src/types.rs::parse_long, for the value attribute of <enumerator> (crates/xml/src/xtypes_parser.rs)

Tests: crates/xml/src/xtypes_parser.rs::tests::spec_7_1_5_3_long_attribute_takes_decimal_hex_and_length_unlimited

Status: done

§7.1.5 Table 7.2 unsigned long

Spec: §7.1.5, Table 7.2, p. 17 — “unsigned long | 0 to 4294967296 or 0 to 0xffffffff. | A 32-bit unsigned integer.”

Repo: crates/xml/src/types.rs::parse_ulong, for domain_id (crates/xml/src/domain.rs::parse_domain_element, crates/xml/src/participant.rs::parse_dp_element) and for id and bitBound in <types>

Tests: crates/xml/src/domain.rs::tests::domain_id_accepts_the_unsigned_long_range, crates/xml/src/types.rs::tests::ulong_decimal_and_hex

Status: done — domain_id and id and bitBound in <types> are read with parse_ulong (decimal or hexadecimal, up to 4294967295). The limit 232 for domain_id is gone: it comes from RTPS, not DDS-XML. Commit 167d1009ef8.

§7.1.5 Table 7.2 string

Spec: §7.1.5, Table 7.2, p. 17 — “string | The string with the reserved XML characters escaped according to the standard rules for element content [XML].”

Repo: crates/xml/src/parser.rs::build_element

Tests: crates/xml/tests/spec_items.rs::attribute_values_keep_their_characters_and_spaces, crates/xml/src/parser.rs::tests::attributes_preserved

Status: done — build_element takes attribute values as roxmltree returns them after resolving entities and character references, without trimming. The attributes of the xsi and xml namespaces are no content and are left out. Commit b04504693c4.


§7.2 XML Representation of Resources Defined in the DDS IDL PSM

§7.2 1-to-1 mapping of the DDS IDL types

Spec: §7.2, p. 17 — “The XML representation of resources that correspond to data-types defined in the DDS IDL PSM [DDS] is obtained by performing a 1-to-1 mapping of the corresponding IDL data type.”

Repo: crates/xml/src/qos_parser.rs::parse_entity_qos; crates/xml/src/qos.rs::EntityQos; crates/xml/src/conformance.rs::IDL_TO_XML_MAPPING

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse, crates/xml/tests/qos_profile.rs::t09b_policy_outside_the_container_is_refused, crates/xml/src/conformance.rs::tests::idl_mapping_names_the_sections_of_7_2

Status: done — the 22 policies of DDS 1.4 are read under the IDL’s names, per container only the policies that are a field of the IDL structure; the enumerations, constants, sequences and Duration_t are in the items below. IDL_TO_XML_MAPPING names the function per category. Commits 6ea1489d5f3, 78f3cbe292d.


§7.2.1 XML Representation of Enumeration types

§7.2.1 Enumeration as a simpleType in the XSD

Spec: §7.2.1, p. 17 — “IDL Enumerations are represented in XML according to a schema defined as an XSD simpleType defined as a restriction of a string that can take values of the enumeration literals.”

Repo: crates/xml/schemas/dds-xml_qos_definitions_nonamespace.xsd

Tests: crates/xml/tests/schema_validation.rs::xsd_valid_documents_are_read

Status: done — the OMG’s XSD defines the simpleTypes of the enumerations (durabilityKind, historyKind, …) and is in the tree unchanged; the reader checks the literals itself. Commit b04504693c4.

§7.2.1 DurabilityQosPolicyKind

Spec: §7.2.1, p. 17; DDS 1.4 IDL, p. 157 — VOLATILE_DURABILITY_QOS, TRANSIENT_LOCAL_DURABILITY_QOS, TRANSIENT_DURABILITY_QOS, PERSISTENT_DURABILITY_QOS.

Repo: crates/xml/src/qos_parser.rs::parse_durability

Tests: crates/xml/tests/spec_items.rs::every_literal_of_the_dcps_enumerations_is_read

Status: done — parse_durability reads VOLATILE_DURABILITY_QOS, TRANSIENT_LOCAL_DURABILITY_QOS, TRANSIENT_DURABILITY_QOS, PERSISTENT_DURABILITY_QOS; every_literal_of_the_dcps_enumerations_is_read reads each. Commit 6ea1489d5f3.

§7.2.1 PresentationQosPolicyAccessScopeKind

Spec: §7.2.1, p. 17; DDS 1.4 IDL, p. 158 — INSTANCE_PRESENTATION_QOS, TOPIC_PRESENTATION_QOS, GROUP_PRESENTATION_QOS.

Repo: crates/xml/src/qos_parser.rs::parse_presentation

Tests: crates/xml/tests/spec_items.rs::every_literal_of_the_dcps_enumerations_is_read

Status: done — parse_presentation reads INSTANCE_PRESENTATION_QOS, TOPIC_PRESENTATION_QOS, GROUP_PRESENTATION_QOS; every_literal_of_the_dcps_enumerations_is_read reads each. Commit 6ea1489d5f3.

§7.2.1 OwnershipQosPolicyKind

Spec: §7.2.1, p. 17; DDS 1.4 IDL, p. 158 — SHARED_OWNERSHIP_QOS, EXCLUSIVE_OWNERSHIP_QOS.

Repo: crates/xml/src/qos_parser.rs::parse_ownership

Tests: crates/xml/tests/spec_items.rs::every_literal_of_the_dcps_enumerations_is_read

Status: done — parse_ownership reads SHARED_OWNERSHIP_QOS, EXCLUSIVE_OWNERSHIP_QOS; every_literal_of_the_dcps_enumerations_is_read reads each. Commit 6ea1489d5f3.

§7.2.1 LivelinessQosPolicyKind

Spec: §7.2.1, p. 17; DDS 1.4 IDL, p. 158 — AUTOMATIC_LIVELINESS_QOS, MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, MANUAL_BY_TOPIC_LIVELINESS_QOS.

Repo: crates/xml/src/qos_parser.rs::parse_liveliness

Tests: crates/xml/tests/spec_items.rs::every_literal_of_the_dcps_enumerations_is_read

Status: done — parse_liveliness reads AUTOMATIC_LIVELINESS_QOS, MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, MANUAL_BY_TOPIC_LIVELINESS_QOS; every_literal_of_the_dcps_enumerations_is_read reads each. Commit 6ea1489d5f3.

§7.2.1 ReliabilityQosPolicyKind

Spec: §7.2.1, p. 17; DDS 1.4 IDL, p. 158–159 — BEST_EFFORT_RELIABILITY_QOS, RELIABLE_RELIABILITY_QOS.

Repo: crates/xml/src/qos_parser.rs::parse_reliability

Tests: crates/xml/tests/spec_items.rs::every_literal_of_the_dcps_enumerations_is_read, crates/xml/tests/qos_profile.rs::t19_empty_policies_use_spec_defaults, crates/xml/src/registry.rs::tests::resolves_base_writer_qos

Status: done — parse_reliability reads both literals; a test reads each. Without <kind> the DDS default applies: RELIABLE at a DataWriter, otherwise BEST_EFFORT (DDS 1.4 §2.2.3.14). Commits 6ea1489d5f3, f43f92d9e00.

§7.2.1 ReliabilityQosPolicyKind: BEST_EFFORT_RELIABILITY_QOS

Spec: §7.2.1, p. 17; DDS 1.4 IDL, p. 158 — BEST_EFFORT_RELIABILITY_QOS.

Repo: crates/xml/src/qos_parser.rs::parse_reliability

Tests: crates/xml/tests/spec_items.rs::every_literal_of_the_dcps_enumerations_is_read, crates/xml/tests/qos_profile.rs::t18_into_writer_and_reader_qos_use_spec_defaults

Status: done — parse_reliability reads the literal; every_literal_of_the_dcps_enumerations_is_read and t18_into_writer_and_reader_qos_use_spec_defaults read it.

§7.2.1 DestinationOrderQosPolicyKind

Spec: §7.2.1, p. 17; DDS 1.4 IDL, p. 159 — BY_RECEPTION_TIMESTAMP_DESTINATIONORDER_QOS, BY_SOURCE_TIMESTAMP_DESTINATIONORDER_QOS.

Repo: crates/xml/src/qos_parser.rs::parse_destination_order

Tests: crates/xml/tests/spec_items.rs::every_literal_of_the_dcps_enumerations_is_read

Status: done — parse_destination_order reads BY_RECEPTION_TIMESTAMP_DESTINATIONORDER_QOS, BY_SOURCE_TIMESTAMP_DESTINATIONORDER_QOS; every_literal_of_the_dcps_enumerations_is_read reads each. Commit 6ea1489d5f3.

§7.2.1 HistoryQosPolicyKind

Spec: §7.2.1, p. 17; DDS 1.4 IDL, p. 159 — KEEP_LAST_HISTORY_QOS, KEEP_ALL_HISTORY_QOS.

Repo: crates/xml/src/qos_parser.rs::parse_history; crates/xml/src/qos_parser.rs::parse_durability_service

Tests: crates/xml/tests/spec_items.rs::every_literal_of_the_dcps_enumerations_is_read, crates/xml/src/registry.rs::tests::resolves_base_writer_qos

Status: done — parse_history and history_kind of parse_durability_service read both literals; every_literal_of_the_dcps_enumerations_is_read reads each at both places. Commit 6ea1489d5f3.

§7.2.1 HistoryQosPolicyKind: KEEP_ALL_HISTORY_QOS

Spec: §7.2.1, p. 17; DDS 1.4 IDL, p. 159 — KEEP_ALL_HISTORY_QOS.

Repo: crates/xml/src/qos_parser.rs::parse_history

Tests: crates/xml/tests/spec_items.rs::every_literal_of_the_dcps_enumerations_is_read, crates/xml/tests/spec_items.rs::qos_library_example

Status: done — parse_history reads the literal; every_literal_of_the_dcps_enumerations_is_read, t21_repeated_containers_select_by_topic_filter and qos_library_example read it.

§7.2.1.1 Example (Non-normative)

Spec: §7.2.1.1, p. 17 — HistoryQosPolicyKind as simpleType historyKind.

Repo: —

Tests: —

Status: n/a (informative) — example. The text names the simpleType historyQosPolicyKind, the XSD below it historyKind.


§7.2.2 XML Representation of Primitive Constants

§7.2.2 Constants as simpleType: number or name

Spec: §7.2.2, p. 17–18 — “These constant definitions appear in the XSD as simpleType schemas defined as restrictions of xs:string to provide custom syntax allowing an element to have a value that is either given as a number or as the name of the constant.”

Repo: crates/xml/schemas/dds-xml_qos_definitions_nonamespace.xsd; crates/xml/src/types.rs

Tests: crates/xml/tests/schema_validation.rs::every_in_tree_schema_compiles, crates/xml/src/types.rs::tests::duration_accepts_the_named_constants

Status: done — the four simpleTypes are in the OMG’s XSD (nonNegativeInteger_UNLIMITED, positiveInteger_UNLIMITED, nonNegativeInteger_Duration_SEC, nonNegativeInteger_Duration_NSEC) and used by the policies’ elements. The reader takes a number or a name; max_samples, max_instances and max_samples_per_instance are read as positiveInteger_UNLIMITED (1 or more, or the name; commit 7fbca3f5f05); the names the pattern does not list (DURATION_ZERO_*, TIME_INVALID_*) it accepts because the sentence of §7.2.2 allows “the name of the constant”. Commits b04504693c4, 5563ccdbefe.

§7.2.2 LENGTH_UNLIMITED = -1

Spec: §7.2.2.1, p. 18 — “const long LENGTH_UNLIMITED = -1; […] The constant LENGTH_UNLIMITED is intended to initialize structure members that represent lengths.”

Repo: crates/xml/src/types.rs::LENGTH_UNLIMITED; crates/xml/src/types.rs::parse_long

Tests: crates/xml/src/types.rs::tests::long_length_unlimited_symbol, crates/xml/src/types.rs::tests::spec_constants, crates/xml/tests/qos_profile.rs::t11_length_unlimited_in_resource_limits

Status: done — parse_long accepts the name at every field of type long, also at fields that are no length (e.g. ownership_strength); the OMG’s XSD has the name only at lengths. The field is a long in the IDL, and §7.2.2 allows the name at any.

§7.2.2 DURATION_INFINITE_SEC = 0x7fffffff

Spec: §7.2.2.1, p. 18 — “const long DURATION_INFINITE_SEC = 0x7fffffff;”

Repo: crates/xml/src/types.rs::DURATION_INFINITE_SEC; crates/xml/src/types.rs::parse_duration_sec

Tests: crates/xml/src/types.rs::tests::duration_sec_infinite_symbols, crates/xml/src/types.rs::tests::spec_constants

Status: done

§7.2.2 DURATION_INFINITE_NSEC = 0x7fffffff

Spec: §7.2.2.1, p. 18 — “const unsigned long DURATION_INFINITE_NSEC = 0x7fffffff;”

Repo: crates/xml/src/types.rs::DURATION_INFINITE_NSEC; crates/xml/src/types.rs::parse_duration_nsec

Tests: crates/xml/src/types.rs::tests::duration_nsec_infinite, crates/xml/src/types.rs::tests::spec_constants

Status: done

§7.2.2 DURATION_ZERO_SEC = 0

Spec: §7.2.2.1, p. 18 — “const long DURATION_ZERO_SEC = 0;”

Repo: crates/xml/src/types.rs::DURATION_ZERO_SEC; crates/xml/src/types.rs::parse_duration_sec

Tests: crates/xml/src/types.rs::tests::duration_accepts_the_named_constants, crates/xml/src/types.rs::tests::duration_constants

Status: done — parse_duration_sec accepts the name. Commit 5563ccdbefe.

§7.2.2 DURATION_ZERO_NSEC = 0

Spec: §7.2.2.1, p. 18 — “const unsigned long DURATION_ZERO_NSEC = 0;”

Repo: crates/xml/src/types.rs::DURATION_ZERO_NSEC; crates/xml/src/types.rs::parse_duration_nsec

Tests: crates/xml/src/types.rs::tests::duration_accepts_the_named_constants, crates/xml/src/types.rs::tests::duration_constants

Status: done — parse_duration_nsec accepts the name. Commit 5563ccdbefe.

§7.2.2 TIME_INVALID_SEC = -1

Spec: §7.2.2.1, p. 18 — “const long TIME_INVALID_SEC = -1; […] the constants with the prefix TIME_ are intended to initialize the members (second and nanosecond) of the structure Time_t.”

Repo: crates/xml/src/types.rs::TIME_INVALID_SEC; crates/xml/src/sample.rs::parse_long_sample

Tests: crates/xml/src/types.rs::tests::time_invalid_constants, crates/xml/tests/spec_items.rs::sample_values_follow_table_7_1

Status: done — parse_duration_sec and, for a field of type long in Data Samples, parse_long_sample accept the name. The PDF names no element of type Time_t in the building blocks QoS to Applications. Commits 5563ccdbefe, 78f3cbe292d.

§7.2.2 TIME_INVALID_NSEC = 0xffffffff

Spec: §7.2.2.1, p. 18 — “const unsigned long TIME_INVALID_NSEC = 0xffffffff;”

Repo: crates/xml/src/types.rs::TIME_INVALID_NSEC; crates/xml/src/sample.rs::parse_ulong_sample

Tests: crates/xml/src/types.rs::tests::time_invalid_constants, crates/xml/src/sample.rs::tests::parse_sample_ulong_constant_names, crates/xml/tests/spec_items.rs::sample_values_follow_table_7_1

Status: done — parse_ulong_sample accepts the name (unsigned long in Data Samples). Commit 78f3cbe292d.

§7.2.2.1 Example (Non-Normative)

Spec: §7.2.2.1, p. 18 — the IDL constants and the simpleTypes nonNegativeInteger_UNLIMITED, positiveInteger_UNLIMITED, nonNegativeInteger_Duration_SEC, nonNegativeInteger_Duration_NSEC.

Repo: —

Tests: —

Status: n/a (informative) — Example. The patterns contain DURATION_INFINITY, which is no constant of the IDL; the reader accepts it (parse_duration_sec, parse_duration_nsec). The patterns allow an empty string; an empty element counts as the default of its field (empty_numeric_elements_are_the_default). max_samples and its siblings are read as positiveInteger_UNLIMITED (parse_positive_long_unlimited), parse_long reads the other fields of type long.


§7.2.3 XML Representation of Structure Types

§7.2.3 Structure as a complexType in the XSD

Spec: §7.2.3, p. 18 — “In general, IDL structures are represented in XML according to a schema defined as an XSD complexType.”

Repo: crates/xml/schemas/dds-xml_qos_definitions_nonamespace.xsd

Tests: crates/xml/tests/schema_validation.rs::xsd_valid_documents_are_read

Status: done — the OMG’s XSD has a complexType per policy (e.g. partitionQosPolicy, durabilityServiceQosPolicy) and one per container (datawriterQos, …); it is in the tree unchanged. Commit b04504693c4.

§7.2.3 Element name equals field name

Spec: §7.2.3, p. 18 — “The fields in an IDL structure become unordered elements of the complexType with the field name appearing as the corresponding element name.”

Repo: crates/xml/src/qos_parser.rs::parse_entity_qos and the readers per policy; crates/xml/src/qos_parser.rs::only_children

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse, crates/xml/src/qos_parser.rs::tests::unread_elements_are_refused_at_every_level, crates/xml/tests/normative_forms.rs::report_and_skip_lists_everything_it_leaves_out

Status: done — an unknown child element of a policy or a container ends with XmlError::UnknownElement and the element’s path; with ReadOptions::report_and_skip() it is left out and reported as a Diagnostic. Commits 78f3cbe292d, b04504693c4.

§7.2.3 Fields unordered

Spec: §7.2.3, p. 18 — “become unordered elements of the complexType”.

Repo: crates/xml/src/qos_parser.rs::check_children; crates/xml/src/parser.rs::XmlElement::child

Tests: crates/xml/tests/spec_items.rs::fields_of_a_structure_come_in_any_order, crates/xml/tests/spec_items.rs::a_field_given_twice_is_refused, crates/xml/tests/qos_profile.rs::t20_duplicate_structure_field_rejected

Status: done — the readers look up the children by name, the order does not matter (fields_of_a_structure_come_in_any_order); a field that occurs twice ends with XmlError::InvalidXml. Commit 78f3cbe292d.

§7.2.3 Nested structures

Spec: §7.2.3, p. 18 — “This mapping is applied recursively for nested structures.”

Repo: crates/xml/src/qos_parser.rs::parse_duration_element, called for every field of type Duration_t

Tests: crates/xml/tests/qos_profile.rs::t01_happy_path_reliability_and_history_roundtrip, crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 DDS defaults in the XSD

Spec: §7.2.3, p. 18 — “If the DDS specification defines default values for the structure fields, the corresponding XSD element definition shall provide the same default value.”

Repo: crates/xml/schemas/dds-xml_qos_definitions_nonamespace.xsd

Tests: crates/xml/tests/schema_validation.rs::every_in_tree_schema_compiles

Status: done — the OMG’s XSD carries the DDS defaults as default= of the elements (e.g. INSTANCE_PRESENTATION_QOS for access_scope) and is in the tree unchanged. Commit b04504693c4.

§7.2.3 Missing policy: DDS default

Spec: §7.2.3, p. 18 — “If the DDS specification defines default values for the structure fields, the corresponding XSD element definition shall provide the same default value.”

Repo: crates/xml/src/qos.rs::EntityQos::into_writer_qos, into_reader_qos; crates/webdds-bridge/src/qos_update.rs::topic_qos_from

Tests: crates/xml/src/qos.rs::tests::entity_qos_into_writer_uses_defaults_for_unset, crates/xml/src/qos.rs::tests::entity_qos_into_reader_uses_defaults_for_unset, crates/xml/tests/qos_profile.rs::t18_into_writer_and_reader_qos_use_spec_defaults

Status: done — a policy missing from the document stays None in EntityQos and counts as the DDS default. into_writer_qos and into_reader_qos apply it (reliability RELIABLE at a writer, BEST_EFFORT at a reader, history KEEP_LAST with depth 1); for Topic, Publisher, Subscriber and DomainParticipant the caller merges EntityQos over the entity’s default (webdds-bridge: topic_qos_from, publisher_qos_from, subscriber_qos_from, participant_qos_from). Commit f43f92d9e00.

§7.2.3 Missing field of a policy

Spec: §7.2.3, p. 18 — defaults of the fields; §7.2.3.1, p. 19 (fields with minOccurs="0" and default).

Repo: crates/xml/src/qos_parser.rs: the readers per policy; numeric_text

Tests: crates/xml/tests/qos_profile.rs::t19_empty_policies_use_spec_defaults, crates/xml/tests/qos_profile.rs::t19b_duration_without_sec_is_zero, crates/xml/tests/normative_forms.rs::empty_numeric_elements_are_the_default

Status: done — a field that is missing has the DDS default; minOccurs="0" is at every field of the XSD. A policy without children (<deadline/>, <history/>) reads as a policy with all defaults, an element with empty text (<depth/>) as the default of its field, a Duration_t without sec as 0. An enumeration without a literal has the DDS default. Commits 5563ccdbefe, f43f92d9e00.

§7.2.3.1 Example (Non-normative)

Spec: §7.2.3.1, p. 19 — complexType historyQosPolicy with kind and depth, both minOccurs="0" with default.

Repo: —

Tests: —

Status: n/a (informative) — Example. It types depth as xs:positiveInteger; the IDL has long. parse_history requires 1 or more (numbers_outside_the_schemas_types_are_refused).

§7.2.3 UserDataQosPolicy: user_data

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 157 — struct UserDataQosPolicy { sequence<octet> value; };

Repo: crates/xml/src/qos_parser.rs::parse_user_data, parse_octet_value

Tests: crates/xml/tests/qos_profile.rs::t13_user_data_base64_to_bytes, crates/xml/tests/qos_profile.rs::t13b_user_data_comma_list_to_bytes, crates/xml/tests/normative_forms.rs::user_data_value_is_base64_and_may_be_empty

Status: done — element user_data with value (Base64 or list) or valueB64 per §7.2.4.2 (items there). Commit 86f47818638.

§7.2.3 TopicDataQosPolicy: topic_data

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 157 — struct TopicDataQosPolicy { sequence<octet> value; };

Repo: crates/xml/src/qos_parser.rs::parse_topic_data, parse_octet_value

Tests: crates/xml/tests/spec_items.rs::topic_data_and_group_data_hold_octets_in_both_forms, crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done — element topic_data with value (Base64 or list) or valueB64 per §7.2.4.2 (items there). Commit 86f47818638.

§7.2.3 GroupDataQosPolicy: group_data

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 157 — struct GroupDataQosPolicy { sequence<octet> value; };

Repo: crates/xml/src/qos_parser.rs::parse_group_data, parse_octet_value

Tests: crates/xml/tests/spec_items.rs::topic_data_and_group_data_hold_octets_in_both_forms, crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done — element group_data with value (Base64 or list) or valueB64 per §7.2.4.2 (items there). Commit 86f47818638.

§7.2.3 TransportPriorityQosPolicy: transport_priority

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 157 — struct TransportPriorityQosPolicy { long value; };

Repo: crates/xml/src/qos_parser.rs::parse_transport_priority

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 LifespanQosPolicy: lifespan

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 157 — struct LifespanQosPolicy { Duration_t duration; };

Repo: crates/xml/src/qos_parser.rs::parse_lifespan

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 DurabilityQosPolicy: durability

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 157–158 — struct DurabilityQosPolicy { DurabilityQosPolicyKind kind; };

Repo: crates/xml/src/qos_parser.rs::parse_durability

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse, crates/xml/tests/qos_profile.rs::t04_three_level_inheritance_propagates

Status: done — the literals are in the item on §7.2.1.

§7.2.3 PresentationQosPolicy: presentation

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 158 — access_scope, coherent_access, ordered_access.

Repo: crates/xml/src/qos_parser.rs::parse_presentation

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 DeadlineQosPolicy: deadline

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 158 — struct DeadlineQosPolicy { Duration_t period; };

Repo: crates/xml/src/qos_parser.rs::parse_deadline

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse, crates/xml/tests/qos_profile.rs::t10_duration_infinity_string_parses_to_infinite

Status: done

§7.2.3 LatencyBudgetQosPolicy: latency_budget

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 158 — struct LatencyBudgetQosPolicy { Duration_t duration; };

Repo: crates/xml/src/qos_parser.rs::parse_latency_budget

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 OwnershipQosPolicy: ownership

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 158 — struct OwnershipQosPolicy { OwnershipQosPolicyKind kind; };

Repo: crates/xml/src/qos_parser.rs::parse_ownership

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 OwnershipStrengthQosPolicy: ownership_strength

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 158 — struct OwnershipStrengthQosPolicy { long value; };

Repo: crates/xml/src/qos_parser.rs::parse_ownership_strength

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 LivelinessQosPolicy: liveliness

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 158 — kind, lease_duration.

Repo: crates/xml/src/qos_parser.rs::parse_liveliness

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 TimeBasedFilterQosPolicy: time_based_filter

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 158 — struct TimeBasedFilterQosPolicy { Duration_t minimum_separation; };

Repo: crates/xml/src/qos_parser.rs::parse_time_based_filter

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 PartitionQosPolicy: partition

Spec: §7.2.3, p. 18; §7.2.4.1, p. 19; DDS 1.4 IDL, p. 158 — struct PartitionQosPolicy { StringSeq name; };

Repo: crates/xml/src/qos_parser.rs::parse_partition

Tests: crates/xml/tests/qos_profile.rs::t12_partition_multiple_names_become_vec, crates/xml/tests/normative_forms.rs::empty_partition_name_is_an_empty_sequence

Status: done — parse_partition reads the sequence per §7.2.4.1: one <name> with zero or more <element>. A second <name> ends with XmlError::InvalidXml; the form with a repeated <name> and the one with <name_list> are no forms of the spec. Commits 86f47818638, e74ae3530ac.

§7.2.3 ReliabilityQosPolicy: reliability

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 159 — kind, max_blocking_time.

Repo: crates/xml/src/qos_parser.rs::parse_reliability

Tests: crates/xml/tests/qos_profile.rs::t01_happy_path_reliability_and_history_roundtrip, crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 DestinationOrderQosPolicy: destination_order

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 159 — struct DestinationOrderQosPolicy { DestinationOrderQosPolicyKind kind; };

Repo: crates/xml/src/qos_parser.rs::parse_destination_order

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 HistoryQosPolicy: history

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 159 — kind, depth.

Repo: crates/xml/src/qos_parser.rs::parse_history

Tests: crates/xml/tests/qos_profile.rs::t01_happy_path_reliability_and_history_roundtrip, crates/xml/tests/qos_profile.rs::t03_inheritance_child_overrides_history_keeps_reliability

Status: done

§7.2.3 ResourceLimitsQosPolicy: resource_limits

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 159 — max_samples, max_instances, max_samples_per_instance.

Repo: crates/xml/src/qos_parser.rs::parse_resource_limits; crates/xml/src/qos.rs::InitialResourceLimits

Tests: crates/xml/tests/normative_forms.rs::resource_limits_initial_fields_are_carried, crates/xml/tests/qos_profile.rs::t11_length_unlimited_in_resource_limits

Status: done — initial_samples and initial_instances of the example in §7.3.2.4.3.1 are in the OMG’s XSD (resourceLimitsQosPolicy) and are read and carried in EntityQos::initial_resource_limits; the DDS 1.4 IDL does not have them, so they reach neither WriterQos nor ReaderQos. Commit b04504693c4.

§7.2.3 EntityFactoryQosPolicy: entity_factory

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 159 — struct EntityFactoryQosPolicy { boolean autoenable_created_entities; };

Repo: crates/xml/src/qos_parser.rs::parse_entity_factory

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse, crates/xml/tests/qos_profile.rs::t14_boolean_case_sensitive_strict

Status: done

§7.2.3 WriterDataLifecycleQosPolicy: writer_data_lifecycle

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 159 — struct WriterDataLifecycleQosPolicy { boolean autodispose_unregistered_instances; };

Repo: crates/xml/src/qos_parser.rs::parse_writer_data_lifecycle

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 ReaderDataLifecycleQosPolicy: reader_data_lifecycle

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 159 — autopurge_nowriter_samples_delay, autopurge_disposed_samples_delay.

Repo: crates/xml/src/qos_parser.rs::parse_reader_data_lifecycle

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 DurabilityServiceQosPolicy: durability_service

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 159 — service_cleanup_delay, history_kind, history_depth, max_samples, max_instances, max_samples_per_instance.

Repo: crates/xml/src/qos_parser.rs::parse_durability_service

Tests: crates/xml/tests/spec_items.rs::durability_service_reads_all_its_fields, crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done — parse_durability_service reads all six fields; durability_service_reads_all_its_fields reads them and checks four, t09_all_22_policies_parse reads the policy with the duration.

§7.2.3 DurabilityServiceQosPolicy: max_instances, max_samples_per_instance

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 159 — long max_instances; long max_samples_per_instance;

Repo: crates/xml/src/qos_parser.rs::parse_durability_service

Tests: crates/xml/tests/spec_items.rs::durability_service_reads_all_its_fields

Status: done — parse_durability_service reads both fields; durability_service_reads_all_its_fields checks the values.

§7.2.3 DomainParticipantQos: domain_participant_qos

Spec: §7.2.3, p. 18; §7.3.5.4.4.1, p. 27; DDS 1.4 IDL, p. 160 — user_data, entity_factory.

Repo: crates/xml/src/qos_parser.rs::parse_qos_profile_element, parse_single_qos_shortcut; crates/xml/src/participant.rs::parse_dp_element

Tests: crates/xml/tests/dds_xml_full.rs::participant_inheritance_one_level, crates/xml/tests/qos_profile.rs::t02_all_six_containers_in_a_profile, crates/xml/tests/normative_forms.rs::vendor_forms_are_refused_unless_accepted

Status: done — domain_participant_qos is read, as the OMG’s XSD writes it; domainparticipant_qos and participant_qos are vendor forms (VendorForms). Commits a9cb28ca85c, da5ac86cf10.

§7.2.3 TopicQos: topic_qos

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 160 — the 13 policies of TopicQos.

Repo: crates/xml/src/qos_parser.rs::parse_qos_profile_element; crates/xml/src/domain.rs::parse_topic_entry

Tests: crates/xml/tests/qos_profile.rs::t02_all_six_containers_in_a_profile, crates/xml/tests/dds_xml_full.rs::topic_qos_inline_and_profile_ref_both_resolve

Status: done

§7.2.3 DataWriterQos: datawriter_qos

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 160 — the 15 policies of DataWriterQos.

Repo: crates/xml/src/qos_parser.rs::parse_qos_profile_element; crates/xml/src/qos.rs::into_writer_qos

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse, crates/xml/tests/qos_profile.rs::t18_into_writer_and_reader_qos_use_spec_defaults

Status: done

§7.2.3 PublisherQos: publisher_qos

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 160 — presentation, partition, group_data, entity_factory.

Repo: crates/xml/src/qos_parser.rs::parse_qos_profile_element; crates/xml/src/participant.rs::parse_publisher_element

Tests: crates/xml/tests/qos_profile.rs::t02_all_six_containers_in_a_profile, crates/xml/tests/qos_profile.rs::t12_partition_multiple_names_become_vec

Status: done

§7.2.3 DataReaderQos: datareader_qos

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 160–161 — the 12 policies of DataReaderQos.

Repo: crates/xml/src/qos_parser.rs::parse_qos_profile_element; crates/xml/src/qos.rs::into_reader_qos

Tests: crates/xml/tests/qos_profile.rs::t04_three_level_inheritance_propagates, crates/xml/src/registry.rs::tests::reader_qos_resolves

Status: done

§7.2.3 SubscriberQos: subscriber_qos

Spec: §7.2.3, p. 18; DDS 1.4 IDL, p. 161 — presentation, partition, group_data, entity_factory.

Repo: crates/xml/src/qos_parser.rs::parse_qos_profile_element; crates/xml/src/participant.rs::parse_subscriber_element

Tests: crates/xml/tests/qos_profile.rs::t02_all_six_containers_in_a_profile

Status: done

§7.2.3 Policies outside the IDL of a QoS structure

Spec: §7.2, p. 17 (1-to-1 mapping); DDS 1.4 IDL, p. 160–161.

Repo: crates/xml/src/qos_parser.rs::parse_entity_qos, allowed_policies

Tests: crates/xml/tests/qos_profile.rs::t09b_policy_outside_the_container_is_refused, crates/xml/tests/normative_forms.rs::report_and_skip_lists_everything_it_leaves_out

Status: done — parse_entity_qos reads per container only the policies that are a field of the structure in DDS 1.4 §2.2.3 (allowed_policies); any other (e.g. ownership_strength in datareader_qos) ends with XmlError::UnknownElement, under report_and_skip as DiagnosticKind::MisplacedElement. Nothing is read and then dropped when the QoS is taken over. Commits 78f3cbe292d, b04504693c4.


§7.2.4 XML Representation of Sequences

§7.2.4.1 Sequence: zero or more element elements

Spec: §7.2.4.1, p. 19 — “The general XML representation of IDL sequences is done following a schema defined as an XSD complexType. The complexType contains zero or more elements named element. Nested inside each element is the XSD schema obtained from mapping the IDL type of the element itself.”

Repo: crates/xml/src/qos_parser.rs::parse_partition; crates/xml/src/parser.rs::XmlElement::sequence_elements

Tests: crates/xml/tests/qos_profile.rs::t12_partition_multiple_names_become_vec, crates/xml/tests/normative_forms.rs::empty_partition_name_is_an_empty_sequence, crates/xml/src/parser.rs::tests::sequence_elements_iterates_element_tag_children

Status: done — the only sequence in the QoS policies is PartitionQosPolicy.name (StringSeq); parse_partition reads it as <name> with <element> children. XmlElement::sequence_elements returns the element children for webdds-bridge. Commit 86f47818638.

§7.2.4.1.1 Example (Non-normative)

Spec: §7.2.4.1.1, p. 19–20 — QosPolicyCountSeq with element elements.

Repo: —

Tests: —

Status: n/a (informative) — example. It types the fields as xs:Integer; XSD has xs:integer.

§7.2.4.2 Octet sequence as a comma-separated list in value

Spec: §7.2.4.2, p. 20 — “As a special case, sequences of octets are represented either as a comma-separated list of the value of each octet represented in decimal or hexadecimal, or alternatively using Base64 binary. The two options are differentiated by the element name. The latter having the suffix B64.”

Repo: crates/xml/src/qos_parser.rs::parse_octet_value, parse_octet_value_text

Tests: crates/xml/src/qos_parser.rs::tests::octet_value_is_base64_or_a_list, crates/xml/tests/qos_profile.rs::t13b_user_data_comma_list_to_bytes

Status: done — parse_octet_value_text reads <value> as a list when the text is a list of octets (decimal or 0x…, each 0 to 255); otherwise as Base64, as the OMG’s XSD types value (xs:base64Binary). A digit string that is no list stays Base64. Commits 86f47818638, e74ae3530ac.

§7.2.4.2 Octet sequence as Base64 in valueB64

Spec: §7.2.4.2, p. 20 — “alternatively using Base64 binary […] The latter having the suffix B64.”

Repo: crates/xml/src/qos_parser.rs::parse_octet_value, decode_b64_text

Tests: crates/xml/tests/qos_profile.rs::t13_user_data_base64_to_bytes, crates/xml/tests/qos_profile.rs::t13c_user_data_both_forms_rejected, crates/xml/tests/spec_items.rs::topic_data_and_group_data_hold_octets_in_both_forms

Status: done — valueB64 is read; value and valueB64 together end with XmlError::InvalidXml. Commit 86f47818638.

§7.2.4.2 Choice by element name

Spec: §7.2.4.2, p. 20 — “The two options are differentiated by the element name.”

Repo: crates/xml/src/qos_parser.rs::parse_octet_value

Tests: crates/xml/tests/qos_profile.rs::t13_user_data_base64_to_bytes, crates/xml/tests/qos_profile.rs::t13b_user_data_comma_list_to_bytes

Status: done — parse_octet_value tells value and valueB64 apart by the element’s name.

§7.2.4.2.1 Example (Non-normative)

Spec: §7.2.4.2.1, p. 20 — simpleType ddsBinary, complexType userDataQosPolicy with an xs:choice of value and valueB64.

Repo: —

Tests: —

Status: n/a (informative) — example. The name is "ddsBinary " with a space; the pattern [0-2]?[0-9]?[0-9] admits 256 to 299 (checked with Python re as an approximation of the XSD regex, measured); the example documents close with <user_data_qos> instead of </user_data_qos> and are not well-formed; the element is named user_data_qos, the IDL field user_data. The two alternatives do not represent the same value: the list yields “The quic”, VGhlJTIwcXVpY2sl yields “The%20quick%” (decoded with Python, measured).


§7.2.5 XML Representation of Arrays

§7.2.5 Arrays like sequences

Spec: §7.2.5, p. 20 — “The XML representation of IDL arrays is the same as it would be for IDL sequences of the same element type.”

Repo: —

Tests: —

Status: n/a (informative) — no type of the DDS IDL that DDS-XML maps (QoS policies, QoS structures, Duration_t) contains an array; the rule has no application in the building blocks QoS to Applications. For data samples §7.3.7.3.2 applies.


§7.2.6 XML Representation of Duration

§7.2.6 Duration_t with sec and nanosec

Spec: §7.2.6, p. 20–21 — “The IDL structure Duration_t is represented in XML following the general rules for structures defined in sub clause 7.2.3, except that the schema provides the option to use the symbolic defined in the IDL to set the values of the intended elements.” complexType duration with sec (nonNegativeInteger_Duration_SEC) and nanosec (nonNegativeInteger_Duration_NSEC), both minOccurs="0".

Repo: crates/xml/src/qos_parser.rs::parse_duration_element; crates/xml/schemas/dds-xml_qos_definitions_nonamespace.xsd (complexType duration)

Tests: crates/xml/tests/qos_profile.rs::t01_happy_path_reliability_and_history_roundtrip, crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done — the OMG’s XSD reproduces the complexType of p. 21 (xs:all, both minOccurs="0") and is in the tree unchanged. The names of the constants are in the items under §7.2.2. <period>DURATION_INFINITY</period> without children is a vendor form. Commits b04504693c4, a9cb28ca85c.

§7.2.6 nanosec optional

Spec: §7.2.6, p. 21 — <xs:element name="nanosec" [...] minOccurs="0" />

Repo: crates/xml/src/qos_parser.rs::parse_duration_element

Tests: crates/xml/tests/qos_profile.rs::t10_duration_infinity_string_parses_to_infinite, crates/xml/src/qos_parser.rs::tests::duration_inline_infinity_sentinel

Status: done — without nanosec the value is 0.

§7.2.6 sec optional

Spec: §7.2.6, p. 21 — <xs:element name="sec" [...] minOccurs="0" />

Repo: crates/xml/src/qos_parser.rs::parse_duration_element

Tests: crates/xml/tests/qos_profile.rs::t19b_duration_without_sec_is_zero

Status: done — without sec the value is 0 (the DDS default of Duration_t.sec). Commit 5563ccdbefe.

§7.2.6 Infinite duration

Spec: §7.2.6, p. 20; §7.2.2.1, p. 18 — DURATION_INFINITE_SEC and DURATION_INFINITE_NSEC for the fields of Duration_t.

Repo: crates/xml/src/qos_parser.rs::parse_duration_element

Tests: crates/xml/tests/qos_profile.rs::t10_duration_infinity_string_parses_to_infinite, crates/xml/tests/qos_profile.rs::t10b_duration_infinity_numeric_parses_to_infinite

Status: done — sec = 2147483647 with nanosec = DURATION_INFINITE_NSEC or without nanosec gives the infinite duration of zerodds-qos. <sec>DURATION_INFINITE_SEC</sec><nanosec>0</nanosec> gives 2147483647 s.

§7.2.6 nanosec = 2147483647 as a number

Spec: §7.2.2.1, p. 18 — pattern (DURATION_INFINITY|DURATION_INFINITE_NSEC|([0-9])*)? for nanosec.

Repo: crates/xml/src/types.rs::parse_duration_nsec; crates/xml/src/qos_parser.rs::parse_duration_element

Tests: crates/xml/src/types.rs::tests::duration_nsec_accepts_the_full_unsigned_long_range, crates/xml/tests/qos_profile.rs::t10b_duration_infinity_numeric_parses_to_infinite

Status: done — parse_duration_nsec takes every number of the unsigned long range, also 2147483647; <sec>2147483647</sec><nanosec>2147483647</nanosec> is the infinite duration. Commit 5563ccdbefe.

§7.2.6.1 Example (Non-normative)

Spec: §7.2.6.1, p. 21 — <sec>DURATION_INFINITY</sec>, <nanosec>DURATION_INFINITY_NSEC</nanosec>.

Repo: —

Tests: —

Status: n/a (informative) — example. DURATION_INFINITY_NSEC matches neither the pattern of p. 18 nor an IDL constant; parse_duration_nsec rejects it.


§7.3.1 Overview

§7.3.1 Six building blocks

Spec: §7.3.1, p. 21 — “This specification breaks the syntax used to represent DDS resources in XML into the six different building blocks as shown in Figure 7.1: Building Block QoS, Building Block Types, Building Block Domains, Building Block DomainParticipants, Building Block Applications, Building Block Data Samples”.

Repo: —

Tests: —

Status: n/a (informative) — structure; the building blocks are in the items on §7.3.2 to §7.3.7.

§7.3.1 Figure 7.1 Relationship between building blocks

Spec: §7.3.1, Figure 7.1, p. 22 — package diagram with BBQos, BBTypes, BBDomains, BBDataSamples, BBDomainParticipants, BBApplications.

Repo: —

Tests: —

Status: n/a (informative) — figure; the dependencies are in the items on §7.3.2.2 to §7.3.7.2.

§7.3.1 Two schema files following the chameleon pattern

Spec: §7.3.1, p. 22 — “Each of these building blocks is associated with two normative schema files in XSD format that are designed according to the XML Chameleon Schema Definition pattern (see sub clause 7.1.3).”

Repo: crates/xml/src/schemas.rs::ALL_SCHEMAS

Tests: crates/xml/src/schemas.rs::tests::all_schemas_includes_six_building_blocks_plus_system, crates/xml/src/schemas.rs::tests::nonamespace_xsds_omit_target_namespace

Status: done — for Data Samples §7.3.7.3.1 says no generic XSD can exist, and §7.3.7.3 names no file; ZeroDDS ships its own pair for this building block, in the same pattern.

§7.3.1 _nonamespace.xsd: types without targetNamespace and without root element

Spec: §7.3.1, p. 22 — “dds-xml__definitions_nonamespace.xsd contains the type declarations for all the constructs the building block defines. This XSD file specifies neither a targetNamespace nor a root element.”

Repo: crates/xml/schemas/ (seven files *_nonamespace.xsd)

Tests: crates/xml/src/schemas.rs::tests::nonamespace_xsds_omit_target_namespace, crates/xml/src/schemas.rs::tests::namespaced_xsds_define_top_level_element

Status: done — none of the seven chameleon files has a targetNamespace or a global element; the Data Samples pair now carries its root elements in the namespaced file. Commits b04504693c4, 5e03ee5e374.

§7.3.1 Root elements in the chameleon file for Data Samples

Spec: §7.3.1, p. 22 — “This XSD file specifies neither a targetNamespace nor a root element.”

Repo: crates/xml/schemas/dds-xml_data_samples_definitions.xsd

Tests: crates/xml/src/schemas.rs::tests::namespaced_xsds_define_top_level_element, crates/xml/tests/schema_validation.rs::serialize_sample_output_validates

Status: done — dds-xml_data_samples_definitions_nonamespace.xsd declares no root element; <data> and <sample> are in dds-xml_data_samples_definitions.xsd, and serialize_sample_output_validates checks the output of serialize_sample in the namespace against that file. Commit 5e03ee5e374.

§7.3.1 _definitions.xsd: includes, root element, targetNamespace

Spec: §7.3.1, p. 22 — “dds-xml__definitions.xsd includes the XSD with no targetNamespace, defines the top level element for the building block, and sets targetNamespace to http://www.omg.org/spec/DDS-XML.”

Repo: crates/xml/schemas/ (seven files *_definitions.xsd)

Tests: crates/xml/src/schemas.rs::tests::namespaced_xsds_include_target_namespace, crates/xml/src/schemas.rs::tests::namespaced_xsds_define_top_level_element

Status: done — each file includes its chameleon file with xs:include, declares the root element and sets the targetNamespace; so does the Data Samples file.

§7.3.1 Documents in the namespace http://www.omg.org/spec/DDS-XML

Spec: §7.3.1, p. 22 — “sets targetNamespace to http://www.omg.org/spec/DDS-XML.”

Repo: crates/xml/src/parser.rs::DDS_XML_NS, library_elements; crates/xml/src/xsd_loader.rs::load_type_libraries_from_string

Tests: crates/xml/src/parser.rs::tests::parse_namespace_aware, crates/xml/src/xsd_loader.rs::tests::strict_mode_ignores_the_namespace_string_outside_a_declaration, crates/xml/tests/dds_xml_full.rs::all_four_libraries_roundtrip

Status: done — the readers compare local names: a document in the spec’s namespace, one without a namespace (chameleon pattern, §7.1.3) and one in the user’s own namespace are read alike. ValidationMode::Strict in load_type_libraries_from_string requires the namespace declaration at the root element; it is not found anywhere in the text. Commit 167d1009ef8.


§7.3.2 Building Block QoS

§7.3.2.1 Purpose

Spec: §7.3.2.1, p. 22 — “This building block defines the syntax to represent DDS QoS in XML.”

Repo: —

Tests: —

Status: n/a (informative) — purpose; the syntax is in the items on §7.2 and §7.3.2.3 to §7.3.2.4.4.

§7.3.2.2 No dependencies on other building blocks

Spec: §7.3.2.2, p. 22 — “This building block has no dependencies on other building blocks.”

Repo: crates/xml/schemas/dds-xml_qos_definitions_nonamespace.xsd (includes no other file); crates/xml/src/qos_parser.rs::parse_qos_libraries

Tests: crates/xml/src/schemas.rs::tests::building_block_xsd_dependencies_match_spec, crates/xml/tests/dds_xml_full.rs::independent_building_blocks_parse_without_the_other_blocks

Status: done

§7.3.2.3 Types of all QoS in dds-xml_qos_definitions_nonamespace.xsd

Spec: §7.3.2.3, p. 23 — “dds-xml_qos_definitions_nonamespace.xsd contains the XSD type definition for all the DDS QoS. It defines no targetNamespace so that it can be reused by other schemas following the XML Chameleon Schema Definition pattern.”

Repo: crates/xml/schemas/dds-xml_qos_definitions_nonamespace.xsd

Tests: crates/xml/tests/schema_validation.rs::every_in_tree_schema_compiles, crates/xml/tests/schema_validation.rs::xsd_valid_documents_are_read

Status: done — the OMG’s file is in the tree unchanged and defines all policies, fields, enumerations and containers. Commit b04504693c4.

§7.3.2.3 <qos_library> as top-level element in the namespace

Spec: §7.3.2.3, p. 23 — “dds-xml_qos_definitions.xsd defines the top-level element, and sets targetNamespace to http://www.omg.org/spec/DDS-XML.”

Repo: crates/xml/schemas/dds-xml_qos_definitions.xsd; crates/xml/src/parser.rs::library_elements

Tests: crates/xml/src/schemas.rs::tests::namespaced_xsds_define_top_level_element, crates/xml/tests/schema_validation.rs::topic_filter_attribute_is_read, crates/xml/tests/omg_example_documents.rs::qos_example

Status: done — the readers take <qos_library> as root and as a child of <dds>. topic_filter_attribute_is_read does not need xmllint; qos_example needs the OMG’s files.

§7.3.2.4.1 QoS libraries with QoS profiles

Spec: §7.3.2.4.1, p. 23 — “QoS Libraries are the top level element of the Building Block QoS. They are collections of QoS profiles, which group a set of related QoS—usually one per entity.”

Repo: crates/xml/src/qos_parser.rs::parse_qos_libraries, parse_qos_library_element, parse_qos_profile_element

Tests: crates/xml/src/qos_parser.rs::tests::parse_minimal_library, crates/xml/src/qos_parser.rs::tests::missing_library_name_rejected, crates/xml/src/qos_parser.rs::tests::missing_profile_name_rejected, crates/xml/tests/qos_profile.rs::t17_multiple_libraries_per_document

Status: done — name is required at <qos_library> and <qos_profile>; an unknown child of <qos_library> or <qos_profile> ends with XmlError::UnknownElement.

§7.3.2.4.1.1 Example (Non-normative)

Spec: §7.3.2.4.1.1, p. 23 — library ReliableProfilesLibrary with one profile for DataWriter and DataReader.

Repo: crates/xml/src/qos_parser.rs::parse_qos_libraries

Tests: crates/xml/tests/spec_items.rs::qos_library_example, crates/xml/tests/omg_example_documents.rs::qos_example

Status: done — qos_library_example reads the example; omg_example_documents::qos_example reads the OMG’s example document when ZERODDS_OMG_DDSXML_DIR is set.

§7.3.2.4.2 QoS profile inheritance through base_name

Spec: §7.3.2.4.2, p. 23 — “A QoS Profile can inherit from other QoS Profiles using the base_name XML attribute.”

Repo: crates/xml/src/qos_inheritance.rs::resolve_profile; crates/xml/src/registry.rs::QosProfileRegistry; crates/xml/src/qos.rs::EntityQos::merge; crates/xml/src/inheritance.rs::resolve_chain; crates/rpc/src/qos_profile.rs::RpcQos::from_xml_profile

Tests: crates/xml/tests/qos_profile.rs::t03_inheritance_child_overrides_history_keeps_reliability, crates/xml/tests/qos_profile.rs::t04_three_level_inheritance_propagates, crates/xml/tests/qos_profile.rs::t05_inheritance_cycle_rejected, crates/xml/src/registry.rs::tests::inheritance_derived_overrides_base, crates/xml/src/qos_inheritance.rs::tests::cross_library_base_name_two_segment

Status: done — the policy of the derived profile replaces that of the base profile entirely, not field by field: a child with <history><kind>KEEP_ALL_HISTORY_QOS</kind></history> has depth 1, not the base’s; the spec says nothing about it. Cycles and chains over 32 links (MAX_INHERITANCE_DEPTH) are rejected. RpcQos::from_xml_profile follows the base_name chain. Commits 9b74a81b0a9, 54091c791d9.

§7.3.2.4.2 Only from profiles defined before

Spec: §7.3.2.4.2, p. 23 — “A QoS profile can only inherit from QoS profiles that have been defined its definition”.

Repo: crates/xml/src/qos_inheritance.rs::check_definition_order; crates/xml/src/registry.rs::QosProfileRegistry::resolve

Tests: crates/xml/src/qos_inheritance.rs::tests::forward_base_name_rejected, crates/xml/src/registry.rs::tests::forward_base_name_rejected

Status: done — a profile whose base_name points to a later-defined profile ends with XmlError::InvalidXml; the order is the document’s, across libraries. The sentence of the spec is incomplete (“defined its definition”); read as “defined before its definition”. Commit 388c784b2d9.

§7.3.2.4.2.1 Example (Non-normative)

Spec: §7.3.2.4.2.1, p. 23 — <qos_profile name="MyProfile" base_name="BaseProfile">.

Repo: —

Tests: —

Status: n/a (informative) — example.

§7.3.2.4.3 Several QoS of one kind, selected by topic name

Spec: §7.3.2.4.3, p. 23 — “A QoS Profile may contain several DataWriter, DataReader, and Topic QoS settings that are selected based on the evaluation of a filter expression on the topic name.”

Repo: crates/xml/src/qos_parser.rs::take_qos_container; crates/xml/src/qos.rs::select_qos_for_topic; crates/xml/src/qos_inheritance.rs::ResolvedQos; crates/xml/src/registry.rs::QosProfileRegistry::writer_qos_for_topic

Tests: crates/xml/tests/qos_profile.rs::t21_repeated_containers_select_by_topic_filter, crates/xml/src/qos_inheritance.rs::tests::topic_filter_selects_between_repeated_containers, crates/xml/src/registry.rs::tests::writer_qos_for_topic_selects_by_filter, crates/xml/tests/normative_forms.rs::repeated_containers_of_every_kind

Status: done — a profile holds several containers per kind (Vec<FilteredEntityQos>), each with its topic_filter; select_qos_for_topic, ResolvedQos::datawriter_qos_for_topic and QosProfileRegistry::writer_qos_for_topic select by the topic’s name. Several containers with the same filter (or several without) are merged policy by policy (merge_filtered_slots). Commit 02e08d8aea2.

§7.3.2.4.3 Filter in the topic_filter attribute of the QoS

Spec: §7.3.2.4.3, p. 23 — “The filter expression is specified via the topic_filter XML attribute in the QoS definition of the entity QoS.”

Repo: crates/xml/src/qos_parser.rs::take_qos_container, parse_single_qos_shortcut; crates/xml/src/qos.rs::FilteredEntityQos, topic_filter_matches

Tests: crates/xml/tests/schema_validation.rs::topic_filter_attribute_is_read, crates/xml/tests/qos_profile.rs::t08_topic_filter_glob_semantics, crates/xml/src/qos_inheritance.rs::tests::topic_filter_inherited_and_overridden

Status: done — the attribute is read at the container and stored there (FilteredEntityQos::topic_filter); topic_filter_matches evaluates * and ? (the PDF does not fix the syntax). The filter as a child element of <qos_profile> and the attribute on <topic> are vendor forms (VendorForms). Commits 02e08d8aea2, a9cb28ca85c.

§7.3.2.4.3 Without a filter * applies

Spec: §7.3.2.4.3, p. 23 — “If the topic filter is unspecified, the filter”*” will be assumed.”

Repo: crates/xml/src/qos.rs::default_qos, select_qos_for_topic

Tests: crates/xml/tests/qos_profile.rs::t22_filterless_container_is_the_fallback

Status: done — a container without a filter is the fallback for every topic that no filter matches (default_qos).

§7.3.2.4.3 Order and precedence of filters

Spec: §7.3.2.4.3, p. 23 — “The QoS with an explicit topic_filter attribute definition will be evaluated in order; they take precedence over a QoS without a topic filter expression.”

Repo: crates/xml/src/qos.rs::select_qos_for_topic

Tests: crates/xml/tests/qos_profile.rs::t21_repeated_containers_select_by_topic_filter, crates/xml/src/qos_inheritance.rs::tests::no_matching_filter_has_no_qos, crates/xml/src/registry.rs::tests::writer_qos_for_topic_without_match_errors

Status: done — a container with a matching filter takes precedence over the one without a filter; among several matching filters the document order selects; with no match the entity has no QoS from the profile. Commit 02e08d8aea2.

§7.3.2.4.3.1 Example (Non-normative)

Spec: §7.3.2.4.3.1, p. 24 — two <datawriter_qos> with topic_filter="A*" and "B*", the second with resource_limits.

Repo: —

Tests: —

Status: n/a (informative) — Example. The reader reads it: two <datawriter_qos> with different topic_filter in one profile, initial_samples and initial_instances in resource_limits (resource_limits_initial_fields_are_carried, t21_repeated_containers_select_by_topic_filter).

§7.3.2.4.4 Single QoS as a profile

Spec: §7.3.2.4.4, p. 24 — “The definition of an individual QoS is a shortcut for defining a QoS profile with a single QoS.”

Repo: crates/xml/src/qos_parser.rs::parse_single_qos_shortcut, parse_qos_library_element

Tests: crates/xml/src/qos_parser.rs::tests::single_qos_shortcut_datawriter_creates_implicit_profile, crates/xml/src/qos_parser.rs::tests::single_qos_shortcut_topic_creates_implicit_profile, crates/xml/src/qos_parser.rs::tests::single_qos_shortcut_multiple_kinds_in_same_library, crates/xml/src/qos_parser.rs::tests::single_qos_shortcut_without_name_is_kept

Status: done — a container directly under <qos_library> is a profile with one QoS; without a name it is a profile nothing can refer to and is kept under the empty name. Commit 386b6850ca1.

§7.3.2.4.4.1 Example (Non-normative)

Spec: §7.3.2.4.4.1, p. 24 — <datawriter_qos name="KeepAllWriter"> equals <qos_profile name="KeepAllWriter"><datawriter_qos>.

Repo: —

Tests: —

Status: n/a (informative) — example.


§7.3.3 Building Block Types

§7.3.3.1 Types in XML

Spec: §7.3.3.1, p. 24 — “This building block gathers the syntax used to represent DDS Types in XML.”

Repo: crates/xml/src/xtypes_parser.rs::parse_types_element_ctx, parse_type_libraries_with; crates/xml/src/xtypes_expr.rs; crates/xml-compose/src/lib.rs::compose

Tests: crates/xml/tests/types_and_samples.rs::t01_struct_with_long_member, crates/xml/tests/types_and_samples.rs::t16_module_three_levels_deep, crates/xml/tests/normative_forms.rs::bounds_and_dimensions_are_evaluated, crates/xml-compose/tests/idl_parity.rs::every_primitive_reaches_the_same_type_from_both_front_ends

Status: done — two readers: zerodds-xml, which parse_dds_xml uses, and zerodds-xml-compose for the code generators. The reader of zerodds-xml follows the grammar of XTypes 1.3 Annex A (type/nonBasicTypeName, maps, annotations, <const>, constant expressions as bounds); the grammar is covered item by item in dds-xtypes-1.3.md under §7.3.2. Commits 58e5bb48580, 9a3f3974224, 147ffda178f.

§7.3.3.1 nonBasicTypeName and maps in the reader of zerodds-xml

Spec: §7.3.3.1, p. 24 — syntax of types in XML.

Repo: crates/xml/src/xtypes_parser.rs::parse_type_attribute, parse_map_attributes

Tests: crates/xml/src/xtypes_parser.rs::tests::spec_nonbasic_type_is_named_by_nonbasic_type_name, crates/xml/src/xtypes_parser.rs::tests::spec_map_members_are_read, crates/xml/src/xtypes_parser.rs::tests::spec_map_typedef_is_read

Status: done — type="nonBasic" names the type through nonBasicTypeName; maps read mapMaxLength, mapKeyType, mapKeyNonBasicTypeName and mapKeyStringMaxLength. A type name in type without nonBasic is a vendor form. Commits 5563ccdbefe, 147ffda178f, a9cb28ca85c.

§7.3.3.1 Organization and management of types

Spec: §7.3.3.1, p. 24 — “Additionally, it provides capabilities that are necessary or convenient for the organization and management of types and other XML resource representations.”

Repo: —

Tests: —

Status: n/a (informative) — announcement without content in the PDF; the constructs (module, include, forward_dcl, const) belong to the grammar of [DDS-XTYPES] (dds-xtypes-1.3.en.md under §7.3.2.1).

§7.3.3.2 No dependencies on other building blocks

Spec: §7.3.3.2, p. 24 — “This building block has no dependencies on other building blocks.”

Repo: crates/xml/schemas/dds-xml_type_definitions_nonamespace.xsd (includes no other file); crates/xml/src/xtypes_parser.rs::parse_type_libraries

Tests: crates/xml/src/schemas.rs::tests::building_block_xsd_dependencies_match_spec, crates/xml/tests/dds_xml_full.rs::independent_building_blocks_parse_without_the_other_blocks

Status: done

§7.3.3.3 Types of all DDS types in the chameleon file

Spec: §7.3.3.3, p. 25 — “dds-xml_type_definitions_nonamespace.xsd contains the XSD type definitions for all the DDS types. It defines no targetNamespace so that it can be reused by other schemas following the XML Chameleon Schema Definition pattern.”

Repo: crates/xml/schemas/dds-xml_type_definitions_nonamespace.xsd

Tests: crates/xml/tests/schema_validation.rs::every_in_tree_schema_compiles, crates/xml/tests/schema_validation.rs::xsd_valid_documents_are_read

Status: done — the OMG’s file is in the tree unchanged and defines the types of all constructs (structDecl, unionDecl, enumDecl, …). Commits 58e5bb48580, b04504693c4.

§7.3.3.3 <types> as top-level element in the namespace

Spec: §7.3.3.3, p. 25 — “dds-xml_type_definitions.xsd defines the top-level element, and sets targetNamespace to http://www.omg.org/spec/DDS-XML.”

Repo: crates/xml/schemas/dds-xml_type_definitions.xsd; crates/xml/src/xtypes_parser.rs::parse_type_libraries

Tests: crates/xml/src/schemas.rs::tests::namespaced_xsds_define_top_level_element, crates/xml/tests/types_and_samples.rs::t26_sample_must_understand_attribute_parses, crates/xml/src/xtypes_parser.rs::tests::dds_root_with_multiple_types_blocks

Status: done — <types> as the root and as a child of <dds>.


§7.3.4 Building Block Domains

§7.3.4.1 Purpose

Spec: §7.3.4.1, p. 25 — “This building block defines the syntax used to represent DDS Domains in XML. Domains provide a data space where information can be shared by reading and writing a set of Topics, which are associated to registered data types.”

Repo: —

Tests: —

Status: n/a (informative) — purpose; the syntax is in the items on §7.3.4.3 to §7.3.4.4.2.

§7.3.4.2 Depends on QoS and Types

Spec: §7.3.4.2, p. 25 — “This building block depends on the Building Block QoS and the Building Block Types.”

Repo: crates/xml/schemas/dds-xml_domain_definitions_nonamespace.xsd (includes the chameleon files of Types and QoS)

Tests: crates/xml/src/schemas.rs::tests::building_block_xsd_dependencies_match_spec

Status: done — in the reader <topic_qos> uses the QoS reader; type_ref is checked against the <types> of the document when resolving (item under §7.3.4.4.1). The OMG’s chameleon file includes Types and QoS.

§7.3.4.3 Types for domains in the chameleon file

Spec: §7.3.4.3, p. 25 — “dds-xml_domain_definitions_nonamespace.xsd contains the XSD type definition for domains and their contained entities.”

Repo: crates/xml/schemas/dds-xml_domain_definitions_nonamespace.xsd (complexTypes registerType, topicEntry, domainEntry, domainLibrary)

Tests: crates/xml/tests/schema_validation.rs::every_in_tree_schema_compiles, crates/xml/tests/schema_validation.rs::schema_invalid_documents, crates/xml/tests/normative_forms.rs::registered_name_and_format_are_carried

Status: done — the OMG’s file is in the tree unchanged. The reader reads the element registered_name and the attribute format at <register_type> and the element registered_name at <topic>. qos_profile_ref and topic_filter at <topic> are not in the file; they are vendor forms. Commits b04504693c4, a9cb28ca85c. Both tests need xmllint.

§7.3.4.3 <domain_library> as root element in the namespace

Spec: §7.3.4.3, p. 25 — “dds-xml_domain_definitions.xsd defines the root element and sets targetNamespace to http://www.omg.org/spec/DDS-XML.”

Repo: crates/xml/schemas/dds-xml_domain_definitions.xsd; crates/xml/src/domain.rs::parse_domain_libraries

Tests: crates/xml/src/schemas.rs::tests::namespaced_xsds_define_top_level_element, crates/xml/tests/spec_items.rs::domain_example, crates/xml/tests/omg_example_documents.rs::domains_example

Status: done — domain_example and domain_with_two_topics_and_register_types read <domain_library> as the root; domains_example reads the OMG’s document when ZERODDS_OMG_DDSXML_DIR is set.

§7.3.4.4.1 Domain with topics and registered types

Spec: §7.3.4.4.1, p. 25 — “A Domain includes a set of Topics and Registered Types that can be read and written in the Domain.”

Repo: crates/xml/src/domain.rs::parse_domain_element

Tests: crates/xml/tests/dds_xml_full.rs::domain_with_two_topics_and_register_types, crates/xml/src/domain.rs::tests::parse_domain_with_topic, crates/xml/tests/dds_xml_full.rs::misplaced_or_unknown_children_are_rejected

Status: done — another child of <domain> or <topic> ends with XmlError::UnknownElement; with report_and_skip it is left out and reported. Commit 78f3cbe292d.

§7.3.4.4.1 register_type with type_ref

Spec: §7.3.4.4.1, p. 25 — “Register types shall provide a reference to data types that have been previously defined using the type_ref XML attribute.”

Repo: crates/xml/src/domain.rs::parse_register_type; crates/xml/src/zerodds_xml.rs::DdsXml::resolve_participant

Tests: crates/xml/src/domain.rs::tests::parse_domain_with_topic, crates/xml/tests/dds_xml_full.rs::deployment_file_with_inheritance_and_cross_references

Status: done — type_ref is read, resolved against the <types> of the document and passed on as the topic’s type name. Commits abbf9915368, a83476cb034.

§7.3.4.4.1 type_ref is mandatory

Spec: §7.3.4.4.1, p. 25 — “Register types shall provide a reference […] using the type_ref XML attribute.”

Repo: crates/xml/src/domain.rs::parse_register_type

Tests: crates/xml/src/domain.rs::tests::register_type_missing_type_ref_rejected, crates/xml/src/participant.rs::tests::participant_register_type_without_type_ref_rejected

Status: done — parse_register_type rejects a register_type without type_ref with XmlError::MissingRequiredElement: the text requires the reference (“shall provide”), the OMG’s XSD has use="optional". Decision for the text; the XSD-valid document without type_ref is not read. Commit abbf9915368.

§7.3.4.4.1 The type is defined before

Spec: §7.3.4.4.1, p. 25 — “data types that have been previously defined”.

Repo: crates/xml/src/zerodds_xml.rs::DdsXml::resolve_participant, resolve_topic_entry, resolve_type; crates/xml/src/domain.rs::DomainLibrary

Tests: crates/xml/tests/dds_xml_full.rs::register_type_with_dangling_type_ref_errors, crates/xml/tests/spec_items.rs::register_type_refers_to_a_type_defined_before_the_domain

Status: done — resolve_participant resolves type_ref through resolve_type; a type that no <types> defines ends with XmlError::UnresolvedReference, so does a type defined only by a <types> after the domain library (DomainLibrary::type_libraries_before). Commits abbf9915368, a83476cb034.

§7.3.4.4.1 The registration name may differ from the type name

Spec: §7.3.4.4.1, p. 25 — “The name under which types are registered may be different than original type name.”

Repo: crates/xml/src/domain.rs::RegisterType (fields name, type_ref)

Tests: crates/xml/src/domain.rs::tests::parse_domain_with_topic, crates/xml/tests/dds_xml_full.rs::deployment_file_with_inheritance_and_cross_references

Status: done

§7.3.4.4.1 A topic refers through register_type_ref

Spec: §7.3.4.4.1, p. 25 — “Topics shall refer to a registered type using the register_type_ref XML attribute.”

Repo: crates/xml/src/domain.rs::parse_topic_entry; crates/xml/src/zerodds_xml.rs::resolve_topic_entry

Tests: crates/xml/src/domain.rs::tests::topic_missing_register_type_ref_rejected, crates/xml/tests/dds_xml_full.rs::topic_with_unknown_register_type_ref_errors

Status: done

§7.3.4.4.1 Inline QoS of a topic

Spec: §7.3.4.4.1, p. 25 — “Topics may also specify QoS settings inline following the syntax defined in the Building Block QoS.”

Repo: crates/xml/src/domain.rs::parse_topic_entry

Tests: crates/xml/src/domain.rs::tests::parse_topic_with_inline_qos, crates/xml/tests/dds_xml_full.rs::topic_qos_inline_and_profile_ref_both_resolve

Status: done

§7.3.4.4.1 base_name on topic_qos

Spec: §7.3.4.4.1, p. 25 — “QoS profile inheritance through the base_name attribute may be used as defined in clause 7.3.2.4.2.”

Repo: crates/xml/src/qos_parser.rs::parse_entity_qos; crates/xml/src/zerodds_xml.rs::DdsXml::resolve_inline_qos; crates/xml/src/registry.rs::inline_over_base

Tests: crates/xml/tests/dds_xml_full.rs::inline_topic_qos_base_name_inherits_from_profile, crates/xml/src/registry.rs::tests::inline_container_inherits_base_name_profile, crates/xml/tests/spec_items.rs::domain_example

Status: done — parse_entity_qos reads base_name at the QoS (EntityQos::base_name); when resolving, the profile is the base and the policies given inline override it. Commits 86f47818638, f43f92d9e00.

§7.3.4.4.1.1 Example (Non-normative)

Spec: §7.3.4.4.1.1, p. 25 — domain MyDomain with domain_id="10", two register_type and two topic.

Repo: crates/xml/src/domain.rs::parse_domain_libraries

Tests: crates/xml/tests/spec_items.rs::domain_example

Status: done — domain_example reads the example; the base_name of topic_qos is kept.

§7.3.4.4.2 Domain inheritance through base_name

Spec: §7.3.4.4.2, p. 26 — “A Domain can inherit from other Domains using the base_name XML attribute.”

Repo: crates/xml/src/domain.rs::DomainLibrary::effective_domain, effective_domain_id

Tests: crates/xml/src/domain.rs::tests::domain_id_inherited_through_base_name, crates/xml/src/domain.rs::tests::domain_inheritance_chain_resolves_via_resolve_chain, crates/xml/tests/dds_xml_full.rs::domain_inheritance_carries_topics_and_types

Status: done — domain_id, the registered types and the topics are inherited through the chain; an entry of the same name in the derived domain replaces the base’s. Commits 78f3cbe292d, 388c784b2d9.

§7.3.4.4.2 Topics and types of the base

Spec: §7.3.4.4.2, p. 26 — domain inheritance.

Repo: crates/xml/src/domain.rs::DomainLibrary::effective_domain; crates/xml/src/zerodds_xml.rs::resolve_participant_chain

Tests: crates/xml/tests/dds_xml_full.rs::domain_inheritance_carries_topics_and_types

Status: done — effective_domain merges register_types and topics of the chain; resolve_participant uses the effective domain, a writer at a topic of the base resolves. Commit 78f3cbe292d.

§7.3.4.4.2 Only from domains defined before

Spec: §7.3.4.4.2, p. 26 — “A Domain can only inherit from domains that have been defined before.”

Repo: crates/xml/src/domain.rs::DomainLibrary::effective_domain_id

Tests: crates/xml/src/domain.rs::tests::domain_forward_base_name_rejected

Status: done — effective_domain_id and effective_domain reject a base that stands later in the library, with XmlError::InvalidXml. Commit 388c784b2d9.

§7.3.4.4.2.1 Example (Non-normative)

Spec: §7.3.4.4.2.1, p. 26 — <domain name="MyDomain" base_name="BaseDomain">.

Repo: —

Tests: —

Status: n/a (informative) — example.


§7.3.5 Building Block DomainParticipants

§7.3.5.1 Purpose

Spec: §7.3.5.1, p. 26 — “This block defines the syntax to represent DDS DomainParticipants and their contained entities (i.e., Publishers, Subscribers, DataWriters, and DataReaders) in XML.”

Repo: —

Tests: —

Status: n/a (informative) — purpose; the syntax is in the items on §7.3.5.3 to §7.3.5.4.4.

§7.3.5.2 Depends on QoS, Types and Domains

Spec: §7.3.5.2, p. 26 — “This building block depends on the Building Block QoS, the Building Block Types, and the Building Block Domains.”

Repo: crates/xml/schemas/dds-xml_domainparticipant_definitions_nonamespace.xsd (includes the chameleon file of Domains, which includes QoS and Types)

Tests: crates/xml/src/schemas.rs::tests::building_block_xsd_dependencies_match_spec

Status: done

§7.3.5.3 Types of the entities in the chameleon file

Spec: §7.3.5.3, p. 26 — “dds-xml_domainparticipant_defintions_nonamespace.xsd contains the XSD type definition for all the DDS entities.”

Repo: crates/xml/schemas/dds-xml_domainparticipant_definitions_nonamespace.xsd (complexTypes dataWriterEntry, dataReaderEntry, publisherEntry, subscriberEntry, domainParticipantEntry, domainParticipantLibrary)

Tests: crates/xml/tests/schema_validation.rs::every_in_tree_schema_compiles, crates/xml/tests/schema_validation.rs::schema_invalid_documents, crates/xml/tests/normative_forms.rs::data_reader_filters_and_conditions_are_read

Status: done — the OMG’s file is in the tree unchanged. The elements content_filter, status_condition, read_condition and query_condition at <data_reader> are read (DataReaderEntry). Commits b04504693c4, 97a817ee16c. Both tests need xmllint.

§7.3.5.3 <domain_participant_library> as root element in the namespace

Spec: §7.3.5.3, p. 26 — “dds-xml_domainparticipant_definitions.xsd defines the root element and sets targetNamespace to http://www.omg.org/spec/DDS-XML.”

Repo: crates/xml/schemas/dds-xml_domainparticipant_definitions.xsd; crates/xml/src/participant.rs::parse_domain_participant_libraries

Tests: crates/xml/src/schemas.rs::tests::namespaced_xsds_define_top_level_element, crates/xml/tests/normative_forms.rs::the_participant_example_of_the_specification, crates/xml/tests/omg_example_documents.rs::domain_participants_example

Status: done — participant.rs reads <domain_participant_library> as the root; domain_participants_example reads the OMG’s document when ZERODDS_OMG_DDSXML_DIR is set, the_participant_example_of_the_specification the spec’s.

§7.3.5.4.1 Libraries of DomainParticipants

Spec: §7.3.5.4.1, p. 26 — “Domain Participant Libraries are collections of DomainParticipants and contained entities. They are the top level elements of the Building Block DomainParticipants.”

Repo: crates/xml/src/participant.rs::parse_dp_library_element

Tests: crates/xml/src/participant.rs::tests::parse_minimal_participant, crates/xml/src/participant.rs::tests::missing_participant_name_rejected

Status: done

§7.3.5.4.1 Entities under their parent element

Spec: §7.3.5.4.1, p. 26 — “To represent this hierarchical relationship between DDS entities, each entity is declared as a nested XML tag under the declaration of its parent entity.”

Repo: crates/xml/src/participant.rs::parse_dp_element, parse_publisher_element, parse_subscriber_element, parse_dw_element, parse_dr_element

Tests: crates/xml/src/participant.rs::tests::parse_pub_with_writer, crates/xml/tests/dds_xml_full.rs::resolve_participant_returns_flat_snapshot

Status: done — DataWriter under Publisher, DataReader under Subscriber, both under the DomainParticipant are read; an entity under another element ends with XmlError::UnknownElement (item below). Commit 78f3cbe292d.

§7.3.5.4.1 Entity under a wrong element

Spec: §7.3.5.4.1, p. 26 — “each entity is declared as a nested XML tag under the declaration of its parent entity.”

Repo: crates/xml/src/participant.rs::parse_publisher_element, parse_subscriber_element, parse_dp_element

Tests: crates/xml/tests/dds_xml_full.rs::misplaced_or_unknown_children_are_rejected, crates/xml/tests/schema_validation.rs::schema_invalid_documents

Status: done — a <data_reader> under <publisher>, a <data_writer> under <subscriber> and any other child of <domain_participant>, <data_writer> or <data_reader> ends with XmlError::UnknownElement and the path; with report_and_skip it is left out and reported. The OMG’s XSD rejects the same documents (schema_invalid_documents, row data_reader_under_publisher). Commit 78f3cbe292d.

§7.3.5.4.1.1 Example (Non-normative)

Spec: §7.3.5.4.1.1, p. 26 — <domain_participant_library="MyDomainParticipantLibrary"> with publisher, subscriber, DataWriter and DataReader.

Repo: —

Tests: —

Status: n/a (informative) — Example. The start tag has no attribute name (<domain_participant_library="…">) and is not well-formed; <data_reader name="MyDataReader"/> has no topic_ref, which the OMG’s XSD requires (schema_invalid_documents, row data_reader_without_topic_ref) and the reader rejects with XmlError::MissingRequiredElement; domain_ref="MyDomain" without a library the reader resolves (item under §7.3.5.4.2). the_participant_example_of_the_specification reads the example with these corrections.

§7.3.5.4.2 domain_ref makes the domain’s topics and types available

Spec: §7.3.5.4.2, p. 27 — “DomainParticipants may refer to a Domain declared in the context of a Domain Library (see Building Block Domains) using the domain_ref XML attribute. This makes the Topics and Register Types defined in the Domain available for all the DataWriters and DataReaders defined in the context of the DomainParticipant.”

Repo: crates/xml/src/zerodds_xml.rs::resolve_participant_chain, resolve_writer, resolve_reader; crates/xml/src/participant.rs::parse_dp_element

Tests: crates/xml/tests/dds_xml_full.rs::cross_library_domain_ref_resolves, crates/xml/tests/dds_xml_full.rs::deployment_file_with_inheritance_and_cross_references, crates/xml/tests/dds_xml_full.rs::participant_local_definitions_resolve_writers, crates/xml/tests/dds_xml_full.rs::participant_definition_overrides_the_domains

Status: done — writers and readers find the domain’s topics; <topic> and <register_type> in a participant are definitions of their own that join the domain’s and replace those of the same name, as the OMG’s XSD types them. Commits 388c784b2d9, 97e6562c58c.

§7.3.5.4.2 domain_ref without a library name

Spec: §7.3.5.4.2, p. 27 — “using the domain_ref XML attribute”.

Repo: crates/xml/src/zerodds_xml.rs::DdsXml::find_domain_in_library

Tests: crates/xml/tests/dds_xml_full.rs::unqualified_domain_ref_resolves

Status: done — find_domain_in_library resolves domain_ref="MyDomain" (without library::) through the first library that has a domain of that name, in document order; library::name stays possible. The PDF does not fix the form of the reference. Commit 388c784b2d9.

§7.3.5.4.2 DomainParticipant without domain_ref

Spec: §7.3.5.4.2, p. 27 — “DomainParticipants may refer to a Domain”.

Repo: crates/xml/src/zerodds_xml.rs::resolve_participant_chain

Tests: crates/xml/tests/dds_xml_full.rs::participant_without_domain_ref_but_with_domain_id_resolves, crates/xml/tests/dds_xml_full.rs::participant_without_domain_resolves_its_own_topics, crates/xml/tests/dds_xml_full.rs::participant_domain_id_overrides_the_referenced_domain, crates/xml/src/participant.rs::tests::missing_domain_ref_parses_and_is_left_to_the_resolver

Status: done — a participant without domain_ref but with domain_id resolves, without a domain and with its own definitions; without both attributes resolving ends with XmlError::UnresolvedReference. Commit 388c784b2d9.

§7.3.5.4.2 domain_id overrides the domain’s

Spec: §7.3.5.4.2, p. 27 — “The Domain Id specified in the parent Domain can be overridden via the domain_id XML attribute.”

Repo: crates/xml/src/zerodds_xml.rs::resolve_participant_chain

Tests: crates/xml/tests/dds_xml_full.rs::participant_domain_id_overrides_the_referenced_domain

Status: done

§7.3.5.4.2.1 Example (Non-normative)

Spec: §7.3.5.4.2.1, p. 27 — <domain_participant name="MyDomain" domain_ref="MyDomain" domain_id="32">.

Repo: —

Tests: —

Status: n/a (informative) — Example. The reader reads and resolves it: domain_ref without a library and domain_id as an override (unqualified_domain_ref_resolves, participant_domain_id_overrides_the_referenced_domain).

§7.3.5.4.3 DomainParticipant inheritance through base_name

Spec: §7.3.5.4.3, p. 27 — “DomainParticipants may inherit from DomainParticipants defined in the context of a DomainParticipant Library using the base_name XML attribute.”

Repo: crates/xml/src/zerodds_xml.rs::participant_chain, resolve_participant_chain

Tests: crates/xml/tests/dds_xml_full.rs::participant_inheritance_one_level, crates/xml/tests/dds_xml_full.rs::participant_inheritance_three_levels, crates/xml/tests/dds_xml_full.rs::participant_inheritance_cycle_detected

Status: done — domain_ref and domain_id of the derived participant override the base’s, the QoS is merged policy by policy, a publisher or subscriber of the same name is replaced entirely.

§7.3.5.4.3 Only from libraries defined before

Spec: §7.3.5.4.3, p. 27 — “A DomainParticipant can only inherit from DomainParticipants in DomainParticipant Libraries that have been defined before its own definition.”

Repo: crates/xml/src/zerodds_xml.rs::participant_chain, participant_position

Tests: crates/xml/tests/dds_xml_full.rs::participant_forward_base_name_rejected

Status: done — participant_chain rejects a base that does not stand before the derived participant in document order (library, then entry), with XmlError::InvalidXml. Commit 388c784b2d9.

§7.3.5.4.3.1 Example (Non-normative)

Spec: §7.3.5.4.3.1, p. 27 — base_name="AnotherParticipantLibrary::TheirParticipant".

Repo: —

Tests: —

Status: n/a (informative) — example.

§7.3.5.4.4 Inline QoS in the context of the entity

Spec: §7.3.5.4.4, p. 27 — “Inline QoS setting definition is allowed in the context an entity’s definition.”

Repo: crates/xml/src/participant.rs::parse_dp_element, parse_publisher_element, parse_subscriber_element, parse_dw_element, parse_dr_element

Tests: crates/xml/src/participant.rs::tests::parse_pub_with_writer, crates/xml/tests/dds_xml_full.rs::participant_inheritance_one_level

Status: done

§7.3.5.4.4 Inline QoS applies only to its own entity

Spec: §7.3.5.4.4, p. 27 — “Inline QoS settings apply only to the entity in whose context they are being defined.”

Repo: crates/xml/src/zerodds_xml.rs::resolve_writer, resolve_reader

Tests: crates/xml/tests/dds_xml_full.rs::datawriter_does_not_inherit_publisher_qos, crates/xml/tests/dds_xml_full.rs::publisher_without_qos_yields_none

Status: done — a <data_writer> without QoS of its own and without base_name has no QoS from its <publisher>; a <data_reader> likewise. Commit 78f3cbe292d.

§7.3.5.4.4 base_name on inline QoS

Spec: §7.3.5.4.4, p. 27 — “Inline entities may inherit from an existing QoS Profile using the base_name XML attribute.”

Repo: crates/xml/src/qos_parser.rs::parse_entity_qos, set_inline_qos; crates/xml/src/registry.rs::QosProfileRegistry::writer_qos_for_inline, reader_qos_for_inline; crates/webdds-bridge/src/qos_update.rs

Tests: crates/xml/tests/dds_xml_full.rs::inline_topic_qos_base_name_inherits_from_profile, crates/xml/tests/dds_xml_full.rs::repeated_inline_qos_container_is_rejected, crates/xml/src/registry.rs::tests::inline_container_inherits_base_name_profile, crates/xml/tests/normative_forms.rs::the_participant_example_of_the_specification

Status: done — parse_entity_qos reads base_name at every inline QoS; the named profile is the base. A second QoS container of the same kind at an entity ends with XmlError::InvalidXml. qos_profile_ref at <data_writer>, <data_reader> and <topic> is a vendor form. Commits 86f47818638, f43f92d9e00, 4ffbcec7593, a9cb28ca85c.

§7.3.5.4.4.1 Example (Non-normative)

Spec: §7.3.5.4.4.1, p. 27 — <domain_participant_qos base_name="BaseProfile"> with entity_factory.

Repo: —

Tests: —

Status: n/a (informative) — Example; the base_name of the inline QoS is kept and names the base (the_participant_example_of_the_specification, inline_topic_qos_base_name_inherits_from_profile).


§7.3.6 Building Block Applications

§7.3.6.1 Purpose

Spec: §7.3.6.1, p. 27 — “This block defines the XML syntax to represent DDS applications that participate (or may be participating) in the DDS Global Data Space.”

Repo: —

Tests: —

Status: n/a (informative) — purpose.

§7.3.6.2 Depends on QoS, Types, Domains and DomainParticipants

Spec: §7.3.6.2, p. 27 — “This building block depends on the Building Block QoS, the Building Block Types, the Building Block Domains, and the Building Block DomainParticipants.”

Repo: crates/xml/schemas/dds-xml_application_definitions_nonamespace.xsd (includes the chameleon file of DomainParticipants)

Tests: crates/xml/src/schemas.rs::tests::building_block_xsd_dependencies_match_spec

Status: done

§7.3.6.3 Types for applications in the chameleon file

Spec: §7.3.6.3, p. 28 — “dds-xml_application_definitions_nonamespace.xsd contains the XSD type definition for applications and their contained entities.”

Repo: crates/xml/schemas/dds-xml_application_definitions_nonamespace.xsd (complexTypes applicationEntry, applicationLibrary)

Tests: crates/xml/tests/schema_validation.rs::every_in_tree_schema_compiles

Status: done — the OMG’s file is in the tree unchanged; the test needs xmllint.

§7.3.6.3 <application_library> as root element in the namespace

Spec: §7.3.6.3, p. 28 — “dds-xml_application_definititons.xsd defines the root element and sets targetNamespace to http://www.omg.org/spec/DDS-XML.”

Repo: crates/xml/schemas/dds-xml_application_definitions.xsd; crates/xml/src/application.rs::parse_application_libraries

Tests: crates/xml/src/application.rs::tests::bare_application_library_root_is_a_document, crates/xml/src/schemas.rs::tests::namespaced_xsds_define_top_level_element

Status: done

§7.3.6.4.1 Libraries of applications with DomainParticipants

Spec: §7.3.6.4.1, p. 28 — “Application Libraries are collections of Applications, which are composed of a set of DomainParticipants and contained entities. They are the top level elements of the Building Block Applications.”

Repo: crates/xml/src/application.rs::parse_app_library_element, parse_app_element; crates/xml/src/zerodds_xml.rs::DdsXml::resolve_application

Tests: crates/xml/src/application.rs::tests::parse_minimal_application, crates/xml/src/application.rs::tests::application_participant_carries_its_whole_definition, crates/xml/tests/dds_xml_full.rs::mixed_top_level_with_cross_refs

Status: done — parse_app_element reads the <domain_participant> children; any other child ends with XmlError::UnknownElement.

§7.3.6.4.1.1 Example (Non-normative)

Spec: §7.3.6.4.1.1, p. 28 — application SimpleShapesDemoApplication with <data_writer> and <data_reader> under <publisher>.

Repo: —

Tests: —

Status: n/a (informative) — Example. It puts <data_reader> under <publisher>, against the order of §7.3.5.4.1 (p. 26) and against the OMG’s XSD; the reader rejects it with XmlError::UnknownElement (item under §7.3.5.4.1). The test application_participant_carries_its_whole_definition reproduces the example without that line.

§7.3.6.4.2 DomainParticipants of an application inherit from libraries

Spec: §7.3.6.4.2, p. 28 — “DomainParticipants defined in the context of an Application may inherit from DomainParticipants defined in the context of a DomainParticipant Library using the base_name XML attribute as described in the Building Block DomainParticipants.”

Repo: crates/xml/src/zerodds_xml.rs::resolve_application_participant

Tests: crates/xml/src/application.rs::tests::application_participant_may_inherit_instead_of_naming_a_domain, crates/xml/tests/dds_xml_full.rs::mixed_top_level_with_cross_refs, crates/xml/tests/dds_xml_full.rs::deployment_file_with_inheritance_and_cross_references

Status: done — base_name must name the library (library::name).

§7.3.6.4.2 Only from libraries defined before

Spec: §7.3.6.4.2, p. 28 — “A DomainParticipant can only inherit from DomainParticipants in DomainParticipant Libraries that have been defined before its own definition.”

Repo: crates/xml/src/zerodds_xml.rs::resolve_application_participant, participant_chain

Tests: crates/xml/tests/spec_items.rs::application_inherits_only_from_libraries_defined_before_it, crates/xml/tests/dds_xml_full.rs::participant_forward_base_name_rejected

Status: done — the chain of the base is checked for document order as for DomainParticipants (participant_chain), and the base’s library must stand before the application library (ApplicationLibrary::participant_libraries_before); otherwise XmlError::InvalidXml. Commits 388c784b2d9, 5e03ee5e374.

§7.3.6.4.2.1 Example (Non-normative)

Spec: §7.3.6.4.2.1, p. 28 — base_name="ShapesParticipantLibrary::MyParticipant".

Repo: —

Tests: —

Status: n/a (informative) — example.


§7.3.7 Building Block Data Samples

§7.3.7.1 Purpose

Spec: §7.3.7.1, p. 28 — “This block defines XML syntax to represent Data Samples that may be exchanged between different DDS applications.”

Repo: —

Tests: —

Status: n/a (informative) — purpose.

§7.3.7.2 No dependencies on other building blocks

Spec: §7.3.7.2, p. 28 — “This building block has no dependencies on other building blocks.”

Repo: crates/xml/src/sample.rs::parse_sample (takes the type as a parameter); crates/xml/schemas/dds-xml_data_samples_definitions_nonamespace.xsd

Tests: crates/xml/src/schemas.rs::tests::building_block_xsd_dependencies_match_spec, crates/xml/tests/dds_xml_full.rs::independent_building_blocks_parse_without_the_other_blocks

Status: done

§7.3.7.3.1 No generic XSD for samples

Spec: §7.3.7.3.1, p. 29 — “Because it is impossible to define a generic XSD file to represent Data Samples of all the possible Data Type combinations in DDS, the syntax to represent Data Samples is based on the XML representation rules specified in sub clauses 7.1, 7.1.2, 7.2.2, 7.2.3, and 7.2.6.”

Repo: —

Tests: —

Status: n/a (informative) — rationale; the rules are in the items below. ZeroDDS ships an XSD of its own for the envelope of a sample (item on §7.3.1).

§7.3.7.3.1 Structure according to §7.2.3: element named after the field

Spec: §7.3.7.3.1, p. 29 — rules of §7.2.3 for data samples.

Repo: crates/xml/src/sample.rs::parse_struct_value

Tests: crates/xml/tests/types_and_samples.rs::t19_sample_parse_struct, crates/xml/tests/types_and_samples.rs::t23_sample_with_nested_struct, crates/xml/tests/types_and_samples.rs::t25_sample_optional_member_missing_ok, crates/xml/src/sample.rs::tests::missing_member_rejected, crates/xml/src/sample.rs::tests::parse_sample_unknown_member_rejected, crates/xml/src/sample.rs::tests::parse_sample_duplicate_member_rejected, crates/xml/src/sample.rs::tests::parse_sample_reads_inherited_members

Status: done — a field without an element is an error unless it is optional; a child without a field (looked up along the baseType chain too) and a second element of the same field end with XmlError. Commits 78f3cbe292d, 0fc2106581d.

§7.3.7.3.1 Fields unordered

Spec: §7.3.7.3.1, p. 29; §7.2.3, p. 18 — “unordered elements”.

Repo: crates/xml/src/sample.rs::parse_struct_value

Tests: crates/xml/tests/spec_items.rs::sample_fields_come_in_any_order, crates/xml/src/sample.rs::tests::parse_sample_members_in_any_order, crates/xml/src/sample.rs::tests::parse_sample_duplicate_member_rejected

Status: done — the fields are looked up by name, the order does not matter; a duplicate element ends with XmlError. Commit 0fc2106581d.

§7.3.7.3.1 Values according to Table 7.1: boolean

Spec: §7.3.7.3.1, p. 29; Table 7.1, p. 16 — boolean, case sensitive.

Repo: crates/xml/src/sample.rs::parse_primitive_value

Tests: crates/xml/tests/spec_items.rs::sample_values_follow_table_7_1, crates/xml/tests/spec_items.rs::primitive_types_example

Status: done — parse_primitive_value reads boolean with parse_bool_strict (True is rejected).

§7.3.7.3.1 Values according to Table 7.1: enum

Spec: §7.3.7.3.1, p. 29; Table 7.1, p. 16 — enum as the literal’s name.

Repo: crates/xml/src/sample.rs::parse_value_for_typedef

Tests: crates/xml/src/sample.rs::tests::parse_sample_enum_rejects_unknown_literal, crates/xml/tests/spec_items.rs::sample_values_follow_table_7_1, crates/xml/tests/spec_items.rs::primitive_types_example

Status: done — the text of a field of an enumeration type is compared with the type’s literals; a literal the type does not declare ends with XmlError. Commit 78f3cbe292d.

§7.3.7.3.1 Values according to Table 7.1: long decimal

Spec: §7.3.7.3.1, p. 29; Table 7.1, p. 16 — long -2147483648 to 2147483647.

Repo: crates/xml/src/sample.rs::parse_primitive_value, parse_long_sample

Tests: crates/xml/tests/types_and_samples.rs::t19_sample_parse_struct, crates/xml/src/sample.rs::tests::parse_simple_struct_sample

Status: done — decimal values are read; the hexadecimal form and LENGTH_UNLIMITED are in the item below.

§7.3.7.3.1 Values according to Table 7.1: long hexadecimal and LENGTH_UNLIMITED

Spec: §7.3.7.3.1, p. 29; Table 7.1, p. 16 — “or 0x80000000 to 0x7fffffff or LENGTH_UNLIMITED.”

Repo: crates/xml/src/sample.rs::parse_long_sample, parse_i16, parse_i64

Tests: crates/xml/src/sample.rs::tests::parse_sample_long_hex_and_constant_names, crates/xml/tests/spec_items.rs::sample_values_follow_table_7_1

Status: done — parse_long_sample reads 0x10 and LENGTH_UNLIMITED (and the names of the constants of §7.2.2); short and long long read the hexadecimal form alike. Commit 78f3cbe292d.

§7.3.7.3.1 Values according to Table 7.1: unsigned long

Spec: §7.3.7.3.1, p. 29; Table 7.1, p. 16 — unsigned long decimal and hexadecimal.

Repo: crates/xml/src/sample.rs::parse_ulong_sample, parse_uint

Tests: crates/xml/src/sample.rs::tests::parse_sample_ulong_constant_names, crates/xml/tests/spec_items.rs::sample_values_follow_table_7_1

Status: done — parse_ulong_sample reads the decimal and hexadecimal form (up to 4294967295) and the names DURATION_INFINITE_NSEC, DURATION_ZERO_NSEC, TIME_INVALID_NSEC; 4294967296 ends with XmlError.

§7.3.7.3.1 Values according to Table 7.1: string

Spec: §7.3.7.3.1, p. 29; Table 7.1, p. 16 — string escaped according to [XML].

Repo: crates/xml/src/sample.rs::parse_primitive_value; crates/xml/src/sample.rs::xml_escape

Tests: crates/xml/tests/types_and_samples.rs::t24_sample_string_escaping_roundtrip, crates/xml/tests/types_and_samples.rs::t20_sample_roundtrip

Status: done — the string keeps its whitespace; escaped characters are resolved, the writer escapes them.

§7.3.7.3.1 Constants according to §7.2.2 and durations according to §7.2.6

Spec: §7.3.7.3.1, p. 29 — rules of §7.2.2 and §7.2.6 for data samples.

Repo: crates/xml/src/sample.rs::parse_long_sample, parse_ulong_sample

Tests: crates/xml/tests/spec_items.rs::sample_values_follow_table_7_1, crates/xml/src/sample.rs::tests::parse_sample_long_hex_and_constant_names

Status: done — parse_long_sample and parse_ulong_sample accept the names of the constants; a field of type Duration_t is a structure with sec and nanosec, <sec>DURATION_INFINITE_SEC</sec> gives 2147483647. Commit 78f3cbe292d.

§7.3.7.3.1 Own XSD following the chameleon pattern

Spec: §7.3.7.3.1, p. 29 — “Users of this specification who may want to define schema files to specify the syntax of specific Data Samples can follow the XML Chameleon Schema Definition pattern.”

Repo: —

Tests: —

Status: n/a (informative) — option for users.

§7.3.7.3.2 Sequences and arrays with item elements

Spec: §7.3.7.3.2, p. 29 — “The general XML representation of IDL sequences and arrays is done following a schema defined as an XSD complexType. The complexType contains zero or more elements named item. Nested inside each element is the XSD schema obtained from mapping the IDL type of the element itself.”

Repo: crates/xml/src/sample.rs::parse_member_value, parse_array_items; crates/xml/src/sample.rs::serialize_value_body

Tests: crates/xml/src/sample.rs::tests::parse_sample_with_sequence_using_item_tag, crates/xml/src/sample.rs::tests::parse_sample_with_array_using_item_tag, crates/xml/src/sample.rs::tests::parse_sample_array_length_is_checked, crates/xml/src/sample.rs::tests::parse_sample_sequence_over_bound_rejected, crates/xml/src/sample.rs::tests::parse_sample_multidimensional_array_is_nested, crates/xml/src/sample.rs::tests::parse_sample_with_empty_sequence, crates/xml/tests/types_and_samples.rs::t21_sample_with_sequence_items, crates/xml/src/sample.rs::tests::serialize_sample_uses_item_tag_for_sequence

Status: done — the length of a fixed-length field and the bound of a sequence are checked (XmlError::ValueOutOfRange); a multi-dimensional field is read as nested levels of item. Commit 38e5855e99f.

§7.3.7.3.2.1 Example (Non-normative)

Spec: §7.3.7.3.2.1, p. 29 — CoordinatesSeq with item elements.

Repo: —

Tests: —

Status: n/a (informative) — example; it types x and y as xs:Integer (XSD has xs:integer).

§7.3.7.4.1 Structure Types (non-normative)

Spec: §7.3.7.4.1, p. 30 — <aStruct> with <aLong> twice and <aNestedStruct>.

Repo: —

Tests: —

Status: n/a (informative) — Example. An IDL structure has no two fields of the same name; the reader rejects the second <aLong> (parse_sample_duplicate_member_rejected).

§7.3.7.4.2 Unions (non-normative)

Spec: §7.3.7.4.2, p. 30 — <data><aUnion><aLong>0</aLong></aUnion></data>.

Repo: —

Tests: —

Status: n/a (informative) — Example; §7.3.7.3 has no normative rule for unions. The example names the active field without a discriminator; parse_union_value reads it (parse_sample_union_without_discriminator), and the form with <discriminator> is read as well (parse_sample_with_union). Commit 0fc2106581d.

§7.3.7.4.3 Sequences (non-normative)

Spec: §7.3.7.4.3, p. 30 — sequences of double and of structures with item.

Repo: —

Tests: crates/xml/tests/spec_items.rs::sequence_and_array_examples

Status: done — sequence_and_array_examples reads the example.

§7.3.7.4.4 Arrays (non-normative)

Spec: §7.3.7.4.4, p. 30 — arrays of long and of structures with item.

Repo: —

Tests: crates/xml/tests/spec_items.rs::sequence_and_array_examples

Status: done — sequence_and_array_examples reads the example.

§7.3.7.4.5 Primitive Types (non-normative)

Spec: §7.3.7.4.5, p. 30–31 — aShort, aUShort, anEnum, aLong, aULong, aLongLong, aULongLong, aFloat, aDouble, aBoolean, aString, anotherString with character references, anOctet as 0x00, aChar.

Repo: —

Tests: crates/xml/tests/spec_items.rs::primitive_types_example

Status: done — primitive_types_example reads all fields of the example and checks the values. Table 7.1 has no rows for short, unsigned short, long long, unsigned long long, float, double, octet and char; their form is described only by this example. Commit 5e03ee5e374.


§8 Building Block Sets

§8 Block sets as combinations of building blocks

Spec: §8, p. 32 — “This Chapter defines some relevant combinations of building blocks called building block sets. A block set is a collection of building blocks. Block sets provide a convenient mechanism to group related building blocks so that other specifications can reference the complete set as opposed to the individual building blocks.”

Repo: —

Tests: —

Status: n/a (informative) — term; the only block set is in the items on §8.1.

§8.1 DDS System Block Set with five building blocks

Spec: §8.1, p. 32 — “This block set offers the ability to describe a complete DDS system. It contains: Building Block QoS, Building Block Types, Building Block Domains, Building Block DomainParticipants, Building Block Applications”.

Repo: crates/xml/src/zerodds_xml.rs::parse_dds_xml, parse_dds_xml_with; crates/xml/schemas/dds-xml_dds_system_definitions_nonamespace.xsd (complexType ddsSystem)

Tests: crates/xml/src/zerodds_xml.rs::tests::parse_mixed_top_level, crates/xml/tests/dds_xml_full.rs::all_four_libraries_roundtrip, crates/xml/tests/types_and_samples.rs::t17_dds_xml_resolve_type, crates/xml/tests/dds_xml_full.rs::empty_dds_root_is_valid

Status: done — <dds> takes the five libraries in any order and number; any other child ends with XmlError::UnknownElement. Data Samples are not part of it. The order of the libraries counts for the “previously defined” rules (items under §7.3.4.4.1 and §7.3.6.4.2).

§8.1 Chameleon file of the block set

Spec: §8.1, p. 32 — “dds-xml_dds_system_definitions_nonamespace.xsd contains all the XSD type definitions for the DDS System Block Set. It defines no targetNamespace so that it can be reused by other schemas following the XML Chameleon Schema Definition pattern.”

Repo: crates/xml/schemas/dds-xml_dds_system_definitions_nonamespace.xsd

Tests: crates/xml/src/schemas.rs::tests::nonamespace_xsds_omit_target_namespace, crates/xml/tests/schema_validation.rs::every_in_tree_schema_compiles

Status: done — the OMG’s file is in the tree unchanged; it includes the chameleon file of Applications, which includes the others, and has neither a targetNamespace nor a root element. every_in_tree_schema_compiles needs xmllint.

§8.1 <dds> as top-level element in the namespace

Spec: §8.1, p. 32 — “dds-xml_dds_system_definitions.xsd defines the top-level element, and sets targetNamespace to http://www.omg.org/spec/DDS-XML.”

Repo: crates/xml/schemas/dds-xml_dds_system_definitions.xsd

Tests: crates/xml/src/schemas.rs::tests::namespaced_xsds_define_top_level_element, crates/xml/src/schemas.rs::tests::namespaced_xsds_include_target_namespace

Status: done


Audit-Status

165 done / 0 partial / 0 open / 0 blocked / 51 n/a (informative).

Open items: none.

DDS Consolidated XML Syntax 1.0 — Spec-Coverage

Quelle: internal/standards/cache/omg/dds-xml-1.0.pdf (33 Seiten, OMG formal/18-10-01, Dezember 2018) — OMG DDS-XML 1.0

Audit Item für Item gegen die PDF nach internal/spec-coverage/PROCESS.md. Seitenangaben sind PDF-Seiten (PDF-Seite = gedruckte Seite + 9). Jeder normative Satz von §1 bis §8, jede Zeile von Table 7.1 und Table 7.2, jede Konstante von §7.2.2 und jedes Attribut der Building Blocks ist ein eigenes Item. §7.2 und §7.2.3 verlangen eine 1:1-Abbildung der Typen der DDS-IDL; die QoS-Policies, ihre Aufzählungen und die QoS-Strukturen der IDL von DDS 1.4 (internal/standards/cache/omg/dds-dcps-1.4.pdf, S. 157–161) sind deshalb je ein Item unter §7.2.1 und §7.2.3; ihre Vorgaben stehen in DDS 1.4 §2.2.3 (S. 104–113 derselben PDF). done steht nur, wo Code und Test die Anforderung abdecken; ein zitierter Test nennt die Testfunktion als datei::modul::name. Eine Fundstelle im Repo nennt Datei und Symbol, keine Zeile. Die Belege sind aus dem Code gelesen und übersetzt; welche Tests gelaufen sind, steht unter „Audit-Status“. Wo Code eine Anforderung abbildet, aber kein Test sie prüft, ist das Item open und die Notiz nennt die Codestelle.

Kontext: DDS-XML 1.0 ist in ZeroDDS über diese Teile verteilt:

  • crates/xml/ · docs.rs (zerodds-xml) — der Leser für alle Building Blocks: der Baum des Dokuments (parser), die Werte von §7.1.4 und §7.2.2 (types), QoS-Bibliotheken und -Profile (qos, qos_parser, qos_inheritance, registry), Domains (domain), DomainParticipants (participant), Applications (application), der Leser für <dds> mit dem Auflösen der Verweise (zerodds_xml), Typen (xtypes_def, xtypes_parser), Data Samples (sample) und die XSD-Dateien unter crates/xml/schemas/ (schemas).
  • crates/xml-compose/ · docs.rs (zerodds-xml-compose) — ein zweiter Leser für <types>, der die Typen in das gemeinsame Modell der Codegeneratoren bringt.
  • Aufrufer: tools/xmlc (zerodds-xmlc validate|types|render), tools/admin (qos validate, qos check), crates/rpc (RpcQos::from_xml_profile) und crates/webdds-bridge (QoS-Profile und Entitäten nach DDS-WEB).

zerodds-dcps, die C-API und die Sprachbindungen lesen kein DDS-XML. crates/dcps/src/qos.rs übernimmt ein zerodds_qos::WriterQos oder ReaderQos, wie es QosProfileRegistry liefert, in DataWriterQos und DataReaderQos (From-Implementierungen). Die Spec definiert keine Programmierschnittstelle (§2 überlässt die Konformität den verweisenden Specs); Items gibt es deshalb nur für die Syntax und ihre Bedeutung.

Die PDF nennt auf S. 1 XSD-Dateien unter https://www.omg.org/spec/DDS-XML/20180501/ als normative maschinenlesbare Dateien. Die zwölf Dateien für QoS, Types, Domains, DomainParticipants, Applications und DDS System liegen unverändert unter crates/xml/schemas/ (Byte für Byte die der OMG); für Data Samples gibt es kein normatives Paar (§7.3.7.3.1), ZeroDDS liefert ein eigenes. Die Beispieldokumente dds-xml_*_example.xml liegen nicht im Repository: die Tests in crates/xml/tests/omg_example_documents.rs und ein Teil von crates/xml/tests/schema_validation.rs lesen sie aus dem Verzeichnis in ZERODDS_OMG_DDSXML_DIR und kehren ohne die Variable ohne Prüfung zurück; schema_validation.rs braucht dazu xmllint. Wo Text und XSD der Spec sich widersprechen, steht die Entscheidung im Item: user_data, topic_data und group_data (XSD: ein value als Base64; Text: Liste in value oder valueB64; alle Formen werden gelesen), base_name an <domain> (nur im Text; gelesen) und type_ref an register_type (Text: Pflicht; XSD: optional; Pflicht).

Die Grammatik der Typen in <types> ist die von [DDS-XTYPES]; sie ist Item für Item in dds-xtypes-1.3.md unter §7.3.2 geführt. Hier stehen nur die Anforderungen, die DDS-XML an den Building Block Types stellt.

Offene Punkte: keine; jedes Item ist done oder n/a (informative).


§1 Scope

§1 Zusammenführung der XML-Syntax

Spec: §1, S. 10 — “Historically various specifications have defined XML syntax to represent particular subsets of DDS-related resources […] This specification consolidates all this XML syntax into a single document. There are no significant syntactic changes in this document relative to referenced specifications.”

Repo: —

Tests: —

Status: n/a (informative) — Übersicht; die Syntax steht in den Items ab §7.


§2 Conformance Criteria

§2 Keine eigenen Konformitätspunkte

Spec: §2, S. 10 — “This document contains no independent conformance points. Rather, it defines XML Schemas to be used to describe DDS resources such that they can be referenced by other specifications leaving the definition of conformance criteria to the referencing specifications.”

Repo: —

Tests: —

Status: n/a (informative) — Hinweis auf das Modell der Konformität.

§2 Regel 1: künftige Specs verweisen auf DDS-XML

Spec: §2, S. 10 — “Future specifications that describe DDS resources in XML shall reference this specification or a future revision thereof.”

Repo: —

Tests: —

Status: n/a (informative) — richtet sich an Specs der OMG, nicht an eine Implementierung.

§2 Regel 2: Revisionen bestehender Specs

Spec: §2, S. 10 — “Future revisions of current specifications that describe DDS resources in XML should reference this specification or a future revision thereof.”

Repo: —

Tests: —

Status: n/a (informative) — richtet sich an Specs der OMG.

§2 Ausgewählte Building Blocks vollständig unterstützt

Spec: §2, S. 10 — “Reference to this standard shall result in a selection of building blocks where all selected building blocks shall be supported entirely.”

Repo: crates/xml/src/conformance.rs::SUPPORTED_BUILDING_BLOCKS

Tests: crates/xml/src/conformance.rs::tests::supported_blocks_match_spec_count, crates/xml/tests/schema_validation.rs::xsd_valid_documents_are_read, crates/xml/tests/omg_example_documents.rs::dds_system_example

Status: done — alle sechs Building Blocks werden gelesen, mit den Ausnahmen, die die Items zu §7.3 einzeln nennen: das Dokument der Tabelle XSD_VALID und die fünf Beispiele der OMG werden gelesen; was die XSD ablehnt, lehnt der Leser ab (schema_invalid_documents). Eine Form, die das XSD zulässt und der Leser nicht liest, gibt es einmal: register_type ohne type_ref (der Text von §7.3.4.4.1 verlangt es, das XSD hat use="optional"). Commits b04504693c4, 97a817ee16c.


§3 Normative References

§3 [XML] Extensible Markup Language 1.0 (Fifth Edition)

Spec: §3, S. 10 — “[XML] Extensible Markup Language (XML) 1.0 (Fifth Edition) Specification.”

Repo: —

Tests: —

Status: n/a (informative) — Literatur; die Anforderung steht im Item zu §7.1.1.

§3 [XSD-1] XML Schema Definition Language 1.1 Part 1

Spec: §3, S. 10 — “[XSD-1] XML Schema Definition Language (XSD) 1.1 Part 1: Structures.”

Repo: —

Tests: —

Status: n/a (informative) — Literatur; die Schema-Dateien stehen in den Items zu §7.1.2 und §7.3.1.

§3 [XSD-2] XML Schema Definition Language 1.1 Part 2

Spec: §3, S. 10 — “[XSD-2] XML Schema Definition Language (XSD) 1.1 Part 2: Datatypes.”

Repo: —

Tests: —

Status: n/a (informative) — Literatur; die Werte stehen in den Items zu §7.1.4, §7.1.5 und §7.2.2.

§3 [DDS4CCM] DDS for Lightweight CCM 1.1

Spec: §3, S. 10 — “The following referenced documents were used as input to this specification: [DDS4CCM] DDS for Lightweight CCM (DDS4CCM), Version 1.1.”

Repo: —

Tests: —

Status: n/a (informative) — Vorlage der Syntax für QoS.

§3 [DDS-XTYPES] Extensible and Dynamic Topic Types 1.2

Spec: §3, S. 10 — “[DDS-XTYPES] Extensible and Dynamic Topic Types for DDS, Version 1.2.”

Repo: —

Tests: —

Status: n/a (informative) — Vorlage der Syntax für Typen und Samples; die Typen in den Items zu §7.3.3, die Samples in §7.3.7.

§3 [DDS-WEB] Web-Enabled DDS 1.0

Spec: §3, S. 10 — “[DDS-WEB] Web-Enabled DDS, Version 1.0.”

Repo: —

Tests: —

Status: n/a (informative) — Vorlage der Syntax für Applications, Domains und Entitäten.

§3 [DDS] Data Distribution Service 1.4

Spec: §3, S. 11 — “[DDS] Data Distribution Service, Version 1.4. OMG Document: formal/15-04-10.”

Repo: —

Tests: —

Status: n/a (informative) — Literatur; die IDL der QoS steht in den Items zu §7.2.1 und §7.2.3.

§3 [IDL] Interface Definition Language 4.2

Spec: §3, S. 11 — “[IDL] Interface Definition Language (IDL), Version 4.2.”

Repo: —

Tests: —

Status: n/a (informative) — Literatur.


§4 Terms and Definitions

§4 Building block

Spec: §4, S. 11 — “A building block is a consistent set of XML schemas that together can be used to describe the syntax of XML documents that represent a set of DDS resources. Building blocks are atomic, which means that if selected they must be totally supported.”

Repo: —

Tests: —

Status: n/a (informative) — Begriff; die Folge für die Unterstützung steht im Item zu §2.

§4 Building block set

Spec: §4, S. 11 — “A building block set is a selection of building blocks that determines a specific XSD schema usage.”

Repo: —

Tests: —

Status: n/a (informative) — Begriff; der einzige Block Set steht in den Items zu §8.1.


§5 Symbols

§5 Table 5.1 Acronyms

Spec: §5, S. 11 — DDS, ISO, LwCCM, OMG, QoS, UTF, XML, XSD, XTypes.

Repo: —

Tests: —

Status: n/a (informative) — Abkürzungen.


§6 Additional Information

§6.1 Changes to Adopted OMG Specifications

Spec: §6.1, S. 12 — “This specification does not change any adopted OMG specification.”

Repo: —

Tests: —

Status: n/a (informative) — Hinweis.

§6.2 Acknowledgments

Spec: §6.2, S. 12 — einreichende Firmen (Real-Time Innovations, Twin Oaks Computing, Jackrabbit Consulting).

Repo: —

Tests: —

Status: n/a (informative) — Danksagung.


§7.1.1 General Rules

§7.1.1 Wohlgeformtes Dokument nach [XML] Abschnitt 2.1

Spec: §7.1.1, S. 14 — “The XML representation of DDS-related resources must follow these syntax rules: It shall be a well-formed XML document according to the criteria defined in clause 2.1 of [XML].”

Repo: crates/xml/src/parser.rs::parse_xml_tree (über roxmltree), precheck_depth, check_tree_depth, check_entity_declarations; crates/xml/src/sample.rs::serialize_sample (der einzige Schreiber)

Tests: crates/xml/src/parser.rs::tests::invalid_xml_rejected, crates/xml/src/parser.rs::tests::parse_with_xml_declaration, crates/xml/src/parser.rs::tests::dtd_and_internal_entity_accepted, crates/xml/src/parser.rs::tests::entity_expansion_is_bounded, crates/xml/src/parser.rs::tests::external_entity_reference_rejected, crates/xml/src/parser.rs::tests::deep_nesting_in_cdata_does_not_fool_the_depth_check, crates/xml/tests/fuzz_smoke.rs::deep_nesting_is_refused_by_every_entry_point, crates/xml/tests/schema_validation.rs::serialize_sample_output_validates

Status: done — ein nicht wohlgeformtes Dokument endet mit XmlError::InvalidXml. Eine DTD ist erlaubt ([XML] 2.1); interne Entitäten sind begrenzt (Wert höchstens MAX_ENTITY_VALUE_BYTES, höchstens MAX_ENTITY_DECLARATIONS Deklarationen, kein Verweis einer Entität auf eine andere), externe werden nicht geladen. Der Leser weist daneben wohlgeformte Dokumente ab, die seine Grenzen überschreiten: mehr als 64 Ebenen (MAX_TREE_DEPTH; precheck_depth zählt die offenen Elemente iterativ, bevor roxmltree läuft, check_tree_depth prüft den Baum danach), mehr als 1024 Kinder eines Elements (MAX_LIST_ELEMENTS) oder mehr als 65 536 Elemente (MAX_TOTAL_ELEMENTS). Commits 3c9fe0f4d1a, 167d1009ef8, b732c05bc1a. Der Test serialize_sample_output_validates braucht xmllint.

§7.1.1 UTF-8

Spec: §7.1.1, S. 14 — “It shall use UTF-8 character encoding for XML elements and values.”

Repo: crates/xml/src/parser.rs::parse_xml_tree (nimmt &str); crates/xml/src/registry.rs::QosProfileRegistry::from_file (read_to_string); crates/xml/src/xsd_loader.rs::load_type_libraries_from_uri (from_utf8); crates/xml/src/sample.rs::xml_escape

Tests: crates/xml/tests/types_and_samples.rs::t24_sample_string_escaping_roundtrip, crates/xml/src/xsd_loader.rs::tests::data_uri_non_utf8_body_rejected

Status: done — die Eingabe ist eine Zeichenkette von Rust und damit UTF-8; from_file und load_type_libraries_from_uri weisen Bytes ab, die kein UTF-8 sind; der Schreiber gibt jedes Zeichen über U+007F als Zeichenreferenz aus. Die Angabe encoding der XML-Deklaration steht im Item unten. Commit 167d1009ef8.

§7.1.1 Angabe einer anderen Kodierung

Spec: §7.1.1, S. 14 — UTF-8 für Elemente und Werte.

Repo: crates/xml/src/parser.rs::check_declared_encoding; crates/xml/src/xsd_loader.rs (percent_decode)

Tests: crates/xml/src/parser.rs::tests::non_utf8_declared_encoding_rejected, crates/xml/src/xsd_loader.rs::tests::data_uri_non_utf8_body_rejected

Status: done — eine XML-Deklaration mit einem anderen encoding als UTF-8 (utf-8 und utf8 in beliebiger Schreibweise) endet mit XmlError::InvalidXml, denn roxmltree liest die Angabe und verwirft sie. Eine data:-URI mit Bytes außerhalb von UTF-8 wird abgewiesen, nicht durch U+FFFD ersetzt. Commit 167d1009ef8.


§7.1.2 XML Schema Definition Files

§7.1.2 Zwei normative XSD-Dateien je Building Block

Spec: §7.1.2, S. 14 — “This specification makes use of XML Schema Definition (XSD) language specified in [XSD-1] and [XSD-2] to represent the syntax of the different building blocks that define DDS resources. In particular, each building block contains two normative XSD files that define their syntax (see sub clause 7.3.1).”

Repo: crates/xml/src/schemas.rs::ALL_SCHEMAS; crates/xml/schemas/

Tests: crates/xml/src/schemas.rs::tests::all_schemas_includes_six_building_blocks_plus_system, crates/xml/tests/schema_validation.rs::every_in_tree_schema_compiles, crates/xml/tests/schema_validation.rs::omg_examples_validate_against_in_tree_schemas

Status: done — für jeden der sechs Building Blocks und für den Block Set von §8.1 liegen zwei Dateien unter crates/xml/schemas/; die zwölf Dateien für QoS, Types, Domains, DomainParticipants, Applications und DDS System sind die Dateien der OMG, Byte für Byte (dds-xml_<block>_definitions.xsd und …_nonamespace.xsd). Für Data Samples gibt es kein normatives Paar (§7.3.7.3.1: kein allgemeines XSD); ZeroDDS liefert ein eigenes Paar und dds-xml_common.xsd, das nur dieses Paar einbindet. Die XSD-Dateien der OMG binden sich über die absolute URL http://www.omg.org/spec/DDS-XML/20180501/ ein; schemas::building_block_includes bildet sie auf Dateinamen ab. Commits b04504693c4, 97a817ee16c. every_in_tree_schema_compiles und omg_examples_validate_against_in_tree_schemas brauchen xmllint.

§7.1.2 Namen der normativen XSD-Dateien

Spec: §7.3.3.3, S. 25; §7.3.4.3, S. 25; §7.3.5.3, S. 26; §7.3.6.3, S. 28 — dds-xml_type_definitions[_nonamespace].xsd, dds-xml_domain_definitions[_nonamespace].xsd, dds-xml_domainparticipant_definitions[_nonamespace].xsd, dds-xml_application_definitions[_nonamespace].xsd.

Repo: crates/xml/src/schemas.rs::ALL_SCHEMAS; crates/xml/schemas/

Tests: crates/xml/src/schemas.rs::tests::building_block_xsd_dependencies_match_spec, crates/xml/tests/schema_validation.rs::every_in_tree_schema_compiles

Status: done — die Dateien tragen die Namen der OMG: dds-xml_type_definitions*.xsd, dds-xml_domain_definitions*.xsd, dds-xml_domainparticipant_definitions*.xsd, dds-xml_application_definitions*.xsd, dds-xml_qos_definitions*.xsd, dds-xml_dds_system_definitions*.xsd. Die Spec ist selbst uneinheitlich (S. 1 führt dds-xml_dds_qos_definitions_nonamespace.xsd neben dds-xml_qos_definitions.xsd; §7.3.5.3 schreibt …domainparticipant_defintions…, §7.3.6.3 …definititons…); maßgeblich sind die Namen, mit denen die Dateien der OMG sich gegenseitig einbinden. Commit 97a817ee16c.


§7.1.3 XML Chameleon Schema Definition Pattern (non-normative)

§7.1.3.1 Motivation

Spec: §7.1.3.1, S. 14 — Namensräume in XSD und das Muster der Chameleon-Schemas ohne targetNamespace.

Repo: —

Tests: —

Status: n/a (informative) — „(non-normative)“ im Titel von §7.1.3. Wie die normativen Dateien das Muster verwenden, steht in den Items zu §7.3.1.

§7.1.3.2.1 Beispiel mit mehreren Namensräumen

Spec: §7.1.3.2.1, S. 14–15 — Schema und Dokument mit drei Namensräumen.

Repo: —

Tests: —

Status: n/a (informative) — Beispiel. Es schreibt <kind>RELIABLE_RELIABILITY</kind> (S. 15); die IDL von DDS 1.4 nennt das Literal RELIABLE_RELIABILITY_QOS, und so schreibt es §7.3.2.4.1.1 (S. 23). parse_reliability weist RELIABLE_RELIABILITY mit XmlError::BadEnum ab.

§7.1.3.2.2 Beispiel mit Chameleon-Dateien

Spec: §7.1.3.2.2, S. 15–16 — eingebundene Dateien ohne targetNamespace, Dokument mit nur einem Namensraum.

Repo: —

Tests: —

Status: n/a (informative) — Beispiel. Die Leser von ZeroDDS prüfen den Namensraum nicht (Item zu §7.3.1); ein Dokument ohne Namensraum wird gelesen wie eines im Namensraum der Spec.


§7.1.4 XML Element Values

§7.1.4 Table 7.1 boolean: ja als 1 oder true

Spec: §7.1.4, Table 7.1, S. 16 — “boolean | Yes: 1 or true. | Values are case sensitive.”

Repo: crates/xml/src/qos_parser.rs::parse_bool_strict, aufgerufen in parse_presentation, parse_entity_factory, parse_writer_data_lifecycle und für Data Samples in crates/xml/src/sample.rs::parse_primitive_value; crates/xml/src/types.rs::parse_bool

Tests: crates/xml/src/qos_parser.rs::tests::parse_bool_strict_accepts_only_lowercase, crates/xml/src/types.rs::tests::bool_invalid, crates/xml/tests/qos_profile.rs::t14_boolean_case_sensitive_strict

Status: done — True und TRUE werden abgewiesen. crates/xml/src/types.rs::parse_bool, von lib.rs exportiert, nimmt nur 1, true, 0 und false an. Commit 167d1009ef8.

§7.1.4 Table 7.1 boolean: nein als 0 oder false

Spec: §7.1.4, Table 7.1, S. 16 — “No: 0 or false. | Values are case sensitive.”

Repo: crates/xml/src/qos_parser.rs::parse_bool_strict

Tests: crates/xml/src/qos_parser.rs::tests::parse_bool_strict_accepts_only_lowercase, crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done — False und FALSE werden abgewiesen.

§7.1.4 Table 7.1 enum: Literal der DCPS-IDL als Zeichenkette

Spec: §7.1.4, Table 7.1, S. 16 — “enum | A string. Legal values are the ones defined for QoS Policies in the DCPS IDL of DDS specification [DDS]. | Must be specified as a string. (Do not use numeric values.)”

Repo: crates/xml/src/qos_parser.rs: parse_durability, parse_history, parse_reliability, parse_liveliness, parse_destination_order, parse_ownership, parse_presentation, parse_durability_service

Tests: crates/xml/tests/spec_items.rs::every_literal_of_the_dcps_enumerations_is_read, crates/xml/src/registry.rs::tests::resolves_base_writer_qos

Status: done — jeder Leser nimmt das Literal der DCPS-IDL als Zeichenkette; alle Literale der sieben Aufzählungen liest every_literal_of_the_dcps_enumerations_is_read (Items zu §7.2.1). Commit 6ea1489d5f3.

§7.1.4 Table 7.1 enum: nur Literale der DCPS-IDL

Spec: §7.1.4, Table 7.1, S. 16 — “Legal values are the ones defined for QoS Policies in the DCPS IDL”.

Repo: crates/xml/src/qos_parser.rs: die Leser je Policy

Tests: crates/xml/src/qos_parser.rs::tests::short_enum_spellings_rejected, crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done — die Kurzformen (VOLATILE, KEEP_LAST, RELIABLE, …) sind keine Werte; sie enden mit XmlError::BadEnum. Ein <history> ohne <kind> und ein leeres <kind/> gelten als Vorgabe der DDS (KEEP_LAST_HISTORY_QOS), nicht als Kurzform. Eine Herstellerform ist das nicht: die Kurzformen sind auch mit VendorForms::Accept nicht zu lesen. Commit 6ea1489d5f3.

§7.1.4 Table 7.1 enum: keine Zahlen

Spec: §7.1.4, Table 7.1, S. 16 — “(Do not use numeric values.)”

Repo: crates/xml/src/qos_parser.rs: die Leser je Policy

Tests: crates/xml/tests/spec_items.rs::a_number_is_no_enumeration_value

Status: done — eine Zahl als Wert eines Elements kind endet mit XmlError::BadEnum. Commit 6ea1489d5f3.

§7.1.4 Table 7.1 long: dezimal -2147483648 bis 2147483647

Spec: §7.1.4, Table 7.1, S. 16 — “long | -2147483648 to 2147483647 […] | A 32-bit signed integer.”

Repo: crates/xml/src/types.rs::parse_long, aufgerufen für die Felder vom Typ long der Policies (crates/xml/src/qos_parser.rs)

Tests: crates/xml/src/types.rs::tests::long_decimal, crates/xml/src/types.rs::tests::long_invalid, crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done — Data Samples lesen long mit eigenem Code (Items zu §7.3.7.3.1).

§7.1.4 Table 7.1 long: hexadezimal 0x80000000 bis 0x7fffffff

Spec: §7.1.4, Table 7.1, S. 16 — “or 0x80000000 to 0x7fffffff”.

Repo: crates/xml/src/types.rs::parse_long

Tests: crates/xml/src/types.rs::tests::long_hex

Status: done — 0x80000000 bis 0xFFFFFFFF werden als Zweierkomplement gelesen (0x80000000 = -2147483648); 0x0 bis 0x7FFFFFFF als positiver Wert.

§7.1.4 Table 7.1 long: LENGTH_UNLIMITED

Spec: §7.1.4, Table 7.1, S. 16 — “or LENGTH_UNLIMITED.”

Repo: crates/xml/src/types.rs::parse_long

Tests: crates/xml/src/types.rs::tests::long_length_unlimited_symbol, crates/xml/tests/qos_profile.rs::t11_length_unlimited_in_resource_limits

Status: done — der Name ergibt -1.

§7.1.4 Table 7.1 unsigned long: dezimal

Spec: §7.1.4, Table 7.1, S. 16 — “unsigned long | 0 to 4294967296 […] | A 32-bit unsigned integer.”

Repo: crates/xml/src/types.rs::parse_ulong

Tests: crates/xml/src/types.rs::tests::ulong_decimal_and_hex, crates/xml/src/types.rs::tests::ulong_invalid

Status: done — Bereich 0 bis 4294967295. Die Tabelle nennt 4294967296 als obere Grenze; das ist 2^32 und passt nicht in 32 Bit ohne Vorzeichen (nachgerechnet). ulong_invalid weist 4294967296 ab. In der QoS-IDL hat nur Duration_t.nanosec den Typ unsigned long; dafür gilt das Item zu §7.2.6.

§7.1.4 Table 7.1 unsigned long: hexadezimal

Spec: §7.1.4, Table 7.1, S. 16 — “or 0 to 0xffffffff.”

Repo: crates/xml/src/types.rs::parse_ulong

Tests: crates/xml/src/types.rs::tests::ulong_decimal_and_hex

Status: done

§7.1.4 Table 7.1 string: Maskierung nach [XML]

Spec: §7.1.4, Table 7.1, S. 16 — “string | The string with the reserved XML characters escaped according to the standard rules for element content [XML]. | Per the XML rules only < and & are required to be escaped within an element content. The characters >, ’, and” may be escaped.”

Repo: crates/xml/src/parser.rs::build_element; crates/xml/src/sample.rs::xml_escape

Tests: crates/xml/tests/types_and_samples.rs::t24_sample_string_escaping_roundtrip, crates/xml/tests/schema_validation.rs::serialize_sample_output_validates

Status: done — maskierte Zeichen und Zeichenreferenzen löst roxmltree auf; der Schreiber maskiert <, >, &, ", ' und jedes Zeichen über U+007F. Der Leser verändert den Leerraum einer Zeichenkette nicht (Item unten).

§7.1.4 Table 7.1 string: Leerraum und Kommentar im Wert

Spec: §7.1.4, Table 7.1, S. 16 — “The string with the reserved XML characters escaped”.

Repo: crates/xml/src/parser.rs::build_element; crates/xml/src/sample.rs::parse_primitive_value

Tests: crates/xml/src/parser.rs::tests::element_text_preserves_whitespace, crates/xml/src/parser.rs::tests::element_text_joins_runs_across_comments

Status: done — build_element speichert den Text eines Elements unverändert, mit seinem Leerraum am Rand; die Läufe von Text um einen Kommentar herum werden zusammengefügt (<a>x<!-- c -->y</a> ist xy). Eine Zeichenkette in Data Samples behält ihren Leerraum (PrimitiveValue::Str). Die Zahlen und Namen in QoS werden beim Lesen gekürzt. Commit 78f3cbe292d.


§7.1.5 XML Attribute Values

§7.1.5 Table 7.2 boolean: ja als 1 oder true

Spec: §7.1.5, Table 7.2, S. 17 — “boolean | Yes: 1 or true. | Values are case sensitive.”

Repo: crates/xml/src/xtypes_parser.rs::opt_bool (über qos_parser::parse_bool_strict) für key, optional, mustUnderstand, nested, external, nonSerialized

Tests: crates/xml/src/xtypes_parser.rs::tests::spec_7_1_5_1_boolean_attribute_is_case_sensitive

Status: done — die Building Blocks QoS bis Applications haben in der PDF kein Attribut vom Typ boolean; die Attribute in <types> folgen [DDS-XTYPES] und werden mit parse_bool_strict gelesen (True wird abgewiesen).

§7.1.5 Table 7.2 boolean: nein als 0 oder false

Spec: §7.1.5, Table 7.2, S. 17 — “No: 0 or false. | Values are case sensitive.”

Repo: crates/xml/src/xtypes_parser.rs::opt_bool

Tests: crates/xml/src/xtypes_parser.rs::tests::spec_7_1_5_1_boolean_attribute_is_case_sensitive

Status: done — wie das Item zu 1 oder true.

§7.1.5 Table 7.2 enum: Zeichenkette

Spec: §7.1.5, Table 7.2, S. 17 — “enum | A string. Legal values are the ones defined for QoS Policies in the DCPS IDL of DDS specification [DDS]. | Must be specified as a string. (Do not use numeric values.)”

Repo: crates/xml/src/xtypes_parser.rs::extensibility_attr, parse_try_construct, parse_auto_id, parse_forward_dcl

Tests: crates/xml/tests/types_and_samples.rs::t03_extensibility_final_appendable_mutable, crates/xml/tests/normative_forms.rs::vendor_forms_are_refused_unless_accepted

Status: done — die PDF nennt kein Attribut, dessen Wert ein Literal der QoS-IDL ist. Die Attribute mit Aufzählungswerten in <types> (extensibility, tryConstruct, autoid, kind von forward_dcl) werden als Zeichenketten gelesen und gegen die Werte der XSD geprüft; die Schreibweisen außerhalb der XSD sind Herstellerformen (extensibility="appendable", kind="STRUCT"). Commits 58e5bb48580, 147ffda178f, a9cb28ca85c.

§7.1.5 Table 7.2 enum: Schreibweise und Zahlen

Spec: §7.1.5, Table 7.2, S. 17 — “(Do not use numeric values.)”

Repo: crates/xml/src/xtypes_parser.rs::extensibility_attr, parse_forward_dcl

Tests: crates/xml/tests/types_and_samples.rs::t03_extensibility_uppercase_rejected, crates/xml/tests/spec_items.rs::a_number_is_no_extensibility, crates/xml/tests/normative_forms.rs::vendor_forms_are_refused_unless_accepted

Status: done — FINAL, APPENDABLE, MUTABLE und eine Zahl enden mit XmlError::BadEnum; appendable ist eine Herstellerform von append; kind von forward_dcl wird gegen enum, struct, union, bitmask geprüft. Commits 6ea1489d5f3, 147ffda178f, a9cb28ca85c.

§7.1.5 Table 7.2 long

Spec: §7.1.5, Table 7.2, S. 17 — “long | -2147483648 to 2147483647 or 0x80000000 to 0x7fffffff or LENGTH_UNLIMITED. | A 32-bit signed integer.”

Repo: crates/xml/src/types.rs::parse_long, für das Attribut value von <enumerator> (crates/xml/src/xtypes_parser.rs)

Tests: crates/xml/src/xtypes_parser.rs::tests::spec_7_1_5_3_long_attribute_takes_decimal_hex_and_length_unlimited

Status: done

§7.1.5 Table 7.2 unsigned long

Spec: §7.1.5, Table 7.2, S. 17 — “unsigned long | 0 to 4294967296 or 0 to 0xffffffff. | A 32-bit unsigned integer.”

Repo: crates/xml/src/types.rs::parse_ulong, für domain_id (crates/xml/src/domain.rs::parse_domain_element, crates/xml/src/participant.rs::parse_dp_element) und für id und bitBound in <types>

Tests: crates/xml/src/domain.rs::tests::domain_id_accepts_the_unsigned_long_range, crates/xml/src/types.rs::tests::ulong_decimal_and_hex

Status: done — domain_id und id und bitBound in <types> werden mit parse_ulong gelesen (dezimal oder hexadezimal, bis 4294967295). Die Grenze 232 für domain_id ist entfallen: sie stammt aus RTPS, nicht aus DDS-XML. Commit 167d1009ef8.

§7.1.5 Table 7.2 string

Spec: §7.1.5, Table 7.2, S. 17 — “string | The string with the reserved XML characters escaped according to the standard rules for element content [XML].”

Repo: crates/xml/src/parser.rs::build_element

Tests: crates/xml/tests/spec_items.rs::attribute_values_keep_their_characters_and_spaces, crates/xml/src/parser.rs::tests::attributes_preserved

Status: done — build_element übernimmt Attributwerte so, wie roxmltree sie nach dem Auflösen der Entitäten und der Zeichenreferenzen liefert, ohne Kürzen. Die Attribute der Namensräume xsi und xml sind kein Inhalt und fallen weg. Commit b04504693c4.


§7.2 XML Representation of Resources Defined in the DDS IDL PSM

§7.2 1:1-Abbildung der Typen der DDS-IDL

Spec: §7.2, S. 17 — “The XML representation of resources that correspond to data-types defined in the DDS IDL PSM [DDS] is obtained by performing a 1-to-1 mapping of the corresponding IDL data type.”

Repo: crates/xml/src/qos_parser.rs::parse_entity_qos; crates/xml/src/qos.rs::EntityQos; crates/xml/src/conformance.rs::IDL_TO_XML_MAPPING

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse, crates/xml/tests/qos_profile.rs::t09b_policy_outside_the_container_is_refused, crates/xml/src/conformance.rs::tests::idl_mapping_names_the_sections_of_7_2

Status: done — die 22 Policies von DDS 1.4 werden unter den Namen der IDL gelesen, je Container nur die Policies, die ein Feld der IDL-Struktur sind; die Aufzählungen, Konstanten, Folgen und Duration_t stehen in den Items darunter. IDL_TO_XML_MAPPING nennt je Kategorie die Funktion. Commits 6ea1489d5f3, 78f3cbe292d.


§7.2.1 XML Representation of Enumeration types

§7.2.1 Aufzählung als simpleType in der XSD

Spec: §7.2.1, S. 17 — “IDL Enumerations are represented in XML according to a schema defined as an XSD simpleType defined as a restriction of a string that can take values of the enumeration literals.”

Repo: crates/xml/schemas/dds-xml_qos_definitions_nonamespace.xsd

Tests: crates/xml/tests/schema_validation.rs::xsd_valid_documents_are_read

Status: done — die XSD der OMG definiert die simpleTypes der Aufzählungen (durabilityKind, historyKind, …) und liegt unverändert im Baum; der Leser prüft die Literale selbst. Commit b04504693c4.

§7.2.1 DurabilityQosPolicyKind

Spec: §7.2.1, S. 17; DDS 1.4 IDL, S. 157 — VOLATILE_DURABILITY_QOS, TRANSIENT_LOCAL_DURABILITY_QOS, TRANSIENT_DURABILITY_QOS, PERSISTENT_DURABILITY_QOS.

Repo: crates/xml/src/qos_parser.rs::parse_durability

Tests: crates/xml/tests/spec_items.rs::every_literal_of_the_dcps_enumerations_is_read

Status: done — parse_durability liest VOLATILE_DURABILITY_QOS, TRANSIENT_LOCAL_DURABILITY_QOS, TRANSIENT_DURABILITY_QOS, PERSISTENT_DURABILITY_QOS; every_literal_of_the_dcps_enumerations_is_read liest jedes. Commit 6ea1489d5f3.

§7.2.1 PresentationQosPolicyAccessScopeKind

Spec: §7.2.1, S. 17; DDS 1.4 IDL, S. 158 — INSTANCE_PRESENTATION_QOS, TOPIC_PRESENTATION_QOS, GROUP_PRESENTATION_QOS.

Repo: crates/xml/src/qos_parser.rs::parse_presentation

Tests: crates/xml/tests/spec_items.rs::every_literal_of_the_dcps_enumerations_is_read

Status: done — parse_presentation liest INSTANCE_PRESENTATION_QOS, TOPIC_PRESENTATION_QOS, GROUP_PRESENTATION_QOS; every_literal_of_the_dcps_enumerations_is_read liest jedes. Commit 6ea1489d5f3.

§7.2.1 OwnershipQosPolicyKind

Spec: §7.2.1, S. 17; DDS 1.4 IDL, S. 158 — SHARED_OWNERSHIP_QOS, EXCLUSIVE_OWNERSHIP_QOS.

Repo: crates/xml/src/qos_parser.rs::parse_ownership

Tests: crates/xml/tests/spec_items.rs::every_literal_of_the_dcps_enumerations_is_read

Status: done — parse_ownership liest SHARED_OWNERSHIP_QOS, EXCLUSIVE_OWNERSHIP_QOS; every_literal_of_the_dcps_enumerations_is_read liest jedes. Commit 6ea1489d5f3.

§7.2.1 LivelinessQosPolicyKind

Spec: §7.2.1, S. 17; DDS 1.4 IDL, S. 158 — AUTOMATIC_LIVELINESS_QOS, MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, MANUAL_BY_TOPIC_LIVELINESS_QOS.

Repo: crates/xml/src/qos_parser.rs::parse_liveliness

Tests: crates/xml/tests/spec_items.rs::every_literal_of_the_dcps_enumerations_is_read

Status: done — parse_liveliness liest AUTOMATIC_LIVELINESS_QOS, MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, MANUAL_BY_TOPIC_LIVELINESS_QOS; every_literal_of_the_dcps_enumerations_is_read liest jedes. Commit 6ea1489d5f3.

§7.2.1 ReliabilityQosPolicyKind

Spec: §7.2.1, S. 17; DDS 1.4 IDL, S. 158–159 — BEST_EFFORT_RELIABILITY_QOS, RELIABLE_RELIABILITY_QOS.

Repo: crates/xml/src/qos_parser.rs::parse_reliability

Tests: crates/xml/tests/spec_items.rs::every_literal_of_the_dcps_enumerations_is_read, crates/xml/tests/qos_profile.rs::t19_empty_policies_use_spec_defaults, crates/xml/src/registry.rs::tests::resolves_base_writer_qos

Status: done — parse_reliability liest beide Literale; ein Test liest jedes. Ohne <kind> gilt die Vorgabe der DDS: am DataWriter RELIABLE, sonst BEST_EFFORT (DDS 1.4 §2.2.3.14). Commits 6ea1489d5f3, f43f92d9e00.

§7.2.1 ReliabilityQosPolicyKind: BEST_EFFORT_RELIABILITY_QOS

Spec: §7.2.1, S. 17; DDS 1.4 IDL, S. 158 — BEST_EFFORT_RELIABILITY_QOS.

Repo: crates/xml/src/qos_parser.rs::parse_reliability

Tests: crates/xml/tests/spec_items.rs::every_literal_of_the_dcps_enumerations_is_read, crates/xml/tests/qos_profile.rs::t18_into_writer_and_reader_qos_use_spec_defaults

Status: done — parse_reliability liest das Literal; every_literal_of_the_dcps_enumerations_is_read und t18_into_writer_and_reader_qos_use_spec_defaults lesen es.

§7.2.1 DestinationOrderQosPolicyKind

Spec: §7.2.1, S. 17; DDS 1.4 IDL, S. 159 — BY_RECEPTION_TIMESTAMP_DESTINATIONORDER_QOS, BY_SOURCE_TIMESTAMP_DESTINATIONORDER_QOS.

Repo: crates/xml/src/qos_parser.rs::parse_destination_order

Tests: crates/xml/tests/spec_items.rs::every_literal_of_the_dcps_enumerations_is_read

Status: done — parse_destination_order liest BY_RECEPTION_TIMESTAMP_DESTINATIONORDER_QOS, BY_SOURCE_TIMESTAMP_DESTINATIONORDER_QOS; every_literal_of_the_dcps_enumerations_is_read liest jedes. Commit 6ea1489d5f3.

§7.2.1 HistoryQosPolicyKind

Spec: §7.2.1, S. 17; DDS 1.4 IDL, S. 159 — KEEP_LAST_HISTORY_QOS, KEEP_ALL_HISTORY_QOS.

Repo: crates/xml/src/qos_parser.rs::parse_history; crates/xml/src/qos_parser.rs::parse_durability_service

Tests: crates/xml/tests/spec_items.rs::every_literal_of_the_dcps_enumerations_is_read, crates/xml/src/registry.rs::tests::resolves_base_writer_qos

Status: done — parse_history und history_kind von parse_durability_service lesen beide Literale; every_literal_of_the_dcps_enumerations_is_read liest jedes an beiden Stellen. Commit 6ea1489d5f3.

§7.2.1 HistoryQosPolicyKind: KEEP_ALL_HISTORY_QOS

Spec: §7.2.1, S. 17; DDS 1.4 IDL, S. 159 — KEEP_ALL_HISTORY_QOS.

Repo: crates/xml/src/qos_parser.rs::parse_history

Tests: crates/xml/tests/spec_items.rs::every_literal_of_the_dcps_enumerations_is_read, crates/xml/tests/spec_items.rs::qos_library_example

Status: done — parse_history liest das Literal; every_literal_of_the_dcps_enumerations_is_read, t21_repeated_containers_select_by_topic_filter und qos_library_example lesen es.

§7.2.1.1 Beispiel (Non-normative)

Spec: §7.2.1.1, S. 17 — HistoryQosPolicyKind als simpleType historyKind.

Repo: —

Tests: —

Status: n/a (informative) — Beispiel. Der Text nennt den simpleType historyQosPolicyKind, das XSD darunter historyKind.


§7.2.2 XML Representation of Primitive Constants

§7.2.2 Konstanten als simpleType: Zahl oder Name

Spec: §7.2.2, S. 17–18 — “These constant definitions appear in the XSD as simpleType schemas defined as restrictions of xs:string to provide custom syntax allowing an element to have a value that is either given as a number or as the name of the constant.”

Repo: crates/xml/schemas/dds-xml_qos_definitions_nonamespace.xsd; crates/xml/src/types.rs

Tests: crates/xml/tests/schema_validation.rs::every_in_tree_schema_compiles, crates/xml/src/types.rs::tests::duration_accepts_the_named_constants

Status: done — die vier simpleTypes stehen in der XSD der OMG (nonNegativeInteger_UNLIMITED, positiveInteger_UNLIMITED, nonNegativeInteger_Duration_SEC, nonNegativeInteger_Duration_NSEC) und werden von den Elementen der Policies benutzt. Der Leser nimmt Zahl oder Name; max_samples, max_instances und max_samples_per_instance lesen nach positiveInteger_UNLIMITED (1 oder mehr, oder der Name; Commit 7fbca3f5f05); die Namen, die das Muster nicht nennt (DURATION_ZERO_*, TIME_INVALID_*), nimmt er an, weil der Satz von §7.2.2 „the name of the constant“ zulässt. Commits b04504693c4, 5563ccdbefe.

§7.2.2 LENGTH_UNLIMITED = -1

Spec: §7.2.2.1, S. 18 — “const long LENGTH_UNLIMITED = -1; […] The constant LENGTH_UNLIMITED is intended to initialize structure members that represent lengths.”

Repo: crates/xml/src/types.rs::LENGTH_UNLIMITED; crates/xml/src/types.rs::parse_long

Tests: crates/xml/src/types.rs::tests::long_length_unlimited_symbol, crates/xml/src/types.rs::tests::spec_constants, crates/xml/tests/qos_profile.rs::t11_length_unlimited_in_resource_limits

Status: done — parse_long nimmt den Namen an jedem Feld vom Typ long an, auch an Feldern, die keine Länge sind (z. B. ownership_strength); die XSD der OMG hat den Namen nur an den Längen. Das Feld ist in der IDL ein long, §7.2.2 lässt den Namen an jedem zu.

§7.2.2 DURATION_INFINITE_SEC = 0x7fffffff

Spec: §7.2.2.1, S. 18 — “const long DURATION_INFINITE_SEC = 0x7fffffff;”

Repo: crates/xml/src/types.rs::DURATION_INFINITE_SEC; crates/xml/src/types.rs::parse_duration_sec

Tests: crates/xml/src/types.rs::tests::duration_sec_infinite_symbols, crates/xml/src/types.rs::tests::spec_constants

Status: done

§7.2.2 DURATION_INFINITE_NSEC = 0x7fffffff

Spec: §7.2.2.1, S. 18 — “const unsigned long DURATION_INFINITE_NSEC = 0x7fffffff;”

Repo: crates/xml/src/types.rs::DURATION_INFINITE_NSEC; crates/xml/src/types.rs::parse_duration_nsec

Tests: crates/xml/src/types.rs::tests::duration_nsec_infinite, crates/xml/src/types.rs::tests::spec_constants

Status: done

§7.2.2 DURATION_ZERO_SEC = 0

Spec: §7.2.2.1, S. 18 — “const long DURATION_ZERO_SEC = 0;”

Repo: crates/xml/src/types.rs::DURATION_ZERO_SEC; crates/xml/src/types.rs::parse_duration_sec

Tests: crates/xml/src/types.rs::tests::duration_accepts_the_named_constants, crates/xml/src/types.rs::tests::duration_constants

Status: done — parse_duration_sec nimmt den Namen an. Commit 5563ccdbefe.

§7.2.2 DURATION_ZERO_NSEC = 0

Spec: §7.2.2.1, S. 18 — “const unsigned long DURATION_ZERO_NSEC = 0;”

Repo: crates/xml/src/types.rs::DURATION_ZERO_NSEC; crates/xml/src/types.rs::parse_duration_nsec

Tests: crates/xml/src/types.rs::tests::duration_accepts_the_named_constants, crates/xml/src/types.rs::tests::duration_constants

Status: done — parse_duration_nsec nimmt den Namen an. Commit 5563ccdbefe.

§7.2.2 TIME_INVALID_SEC = -1

Spec: §7.2.2.1, S. 18 — “const long TIME_INVALID_SEC = -1; […] the constants with the prefix TIME_ are intended to initialize the members (second and nanosecond) of the structure Time_t.”

Repo: crates/xml/src/types.rs::TIME_INVALID_SEC; crates/xml/src/sample.rs::parse_long_sample

Tests: crates/xml/src/types.rs::tests::time_invalid_constants, crates/xml/tests/spec_items.rs::sample_values_follow_table_7_1

Status: done — parse_duration_sec und, für ein Feld vom Typ long in Data Samples, parse_long_sample nehmen den Namen an. Die PDF nennt kein Element vom Typ Time_t in den Building Blocks QoS bis Applications. Commits 5563ccdbefe, 78f3cbe292d.

§7.2.2 TIME_INVALID_NSEC = 0xffffffff

Spec: §7.2.2.1, S. 18 — “const unsigned long TIME_INVALID_NSEC = 0xffffffff;”

Repo: crates/xml/src/types.rs::TIME_INVALID_NSEC; crates/xml/src/sample.rs::parse_ulong_sample

Tests: crates/xml/src/types.rs::tests::time_invalid_constants, crates/xml/src/sample.rs::tests::parse_sample_ulong_constant_names, crates/xml/tests/spec_items.rs::sample_values_follow_table_7_1

Status: done — parse_ulong_sample nimmt den Namen an (unsigned long in Data Samples). Commit 78f3cbe292d.

§7.2.2.1 Beispiel (Non-Normative)

Spec: §7.2.2.1, S. 18 — die Konstanten der IDL und die simpleTypes nonNegativeInteger_UNLIMITED, positiveInteger_UNLIMITED, nonNegativeInteger_Duration_SEC, nonNegativeInteger_Duration_NSEC.

Repo: —

Tests: —

Status: n/a (informative) — Beispiel. Die Muster enthalten DURATION_INFINITY, das keine Konstante der IDL ist; der Leser nimmt es an (parse_duration_sec, parse_duration_nsec). Die Muster lassen eine leere Zeichenkette zu; ein leeres Element gilt als Vorgabe seines Feldes (empty_numeric_elements_are_the_default). max_samples und seine Geschwister lesen nach positiveInteger_UNLIMITED (parse_positive_long_unlimited), parse_long nimmt die übrigen Felder vom Typ long.


§7.2.3 XML Representation of Structure Types

§7.2.3 Struktur als complexType in der XSD

Spec: §7.2.3, S. 18 — “In general, IDL structures are represented in XML according to a schema defined as an XSD complexType.”

Repo: crates/xml/schemas/dds-xml_qos_definitions_nonamespace.xsd

Tests: crates/xml/tests/schema_validation.rs::xsd_valid_documents_are_read

Status: done — die XSD der OMG hat je Policy einen complexType (z. B. partitionQosPolicy, durabilityServiceQosPolicy) und je Container einen (datawriterQos, …); sie liegt unverändert im Baum. Commit b04504693c4.

§7.2.3 Elementname gleich Feldname

Spec: §7.2.3, S. 18 — “The fields in an IDL structure become unordered elements of the complexType with the field name appearing as the corresponding element name.”

Repo: crates/xml/src/qos_parser.rs::parse_entity_qos und die Leser je Policy; crates/xml/src/qos_parser.rs::only_children

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse, crates/xml/src/qos_parser.rs::tests::unread_elements_are_refused_at_every_level, crates/xml/tests/normative_forms.rs::report_and_skip_lists_everything_it_leaves_out

Status: done — ein unbekanntes Kindelement einer Policy oder eines Containers endet mit XmlError::UnknownElement und dem Pfad des Elements; mit ReadOptions::report_and_skip() wird es ausgelassen und als Diagnostic gemeldet. Commits 78f3cbe292d, b04504693c4.

§7.2.3 Felder ungeordnet

Spec: §7.2.3, S. 18 — “become unordered elements of the complexType”.

Repo: crates/xml/src/qos_parser.rs::check_children; crates/xml/src/parser.rs::XmlElement::child

Tests: crates/xml/tests/spec_items.rs::fields_of_a_structure_come_in_any_order, crates/xml/tests/spec_items.rs::a_field_given_twice_is_refused, crates/xml/tests/qos_profile.rs::t20_duplicate_structure_field_rejected

Status: done — die Leser suchen die Kinder nach Namen, die Reihenfolge spielt keine Rolle (fields_of_a_structure_come_in_any_order); ein Feld, das zweimal vorkommt, endet mit XmlError::InvalidXml. Commit 78f3cbe292d.

§7.2.3 Geschachtelte Strukturen

Spec: §7.2.3, S. 18 — “This mapping is applied recursively for nested structures.”

Repo: crates/xml/src/qos_parser.rs::parse_duration_element, aufgerufen für jedes Feld vom Typ Duration_t

Tests: crates/xml/tests/qos_profile.rs::t01_happy_path_reliability_and_history_roundtrip, crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 Vorgaben der DDS in der XSD

Spec: §7.2.3, S. 18 — “If the DDS specification defines default values for the structure fields, the corresponding XSD element definition shall provide the same default value.”

Repo: crates/xml/schemas/dds-xml_qos_definitions_nonamespace.xsd

Tests: crates/xml/tests/schema_validation.rs::every_in_tree_schema_compiles

Status: done — die XSD der OMG trägt die Vorgaben der DDS als default= der Elemente (z. B. INSTANCE_PRESENTATION_QOS für access_scope) und liegt unverändert im Baum. Commit b04504693c4.

§7.2.3 Fehlende Policy: Vorgabe der DDS

Spec: §7.2.3, S. 18 — “If the DDS specification defines default values for the structure fields, the corresponding XSD element definition shall provide the same default value.”

Repo: crates/xml/src/qos.rs::EntityQos::into_writer_qos, into_reader_qos; crates/webdds-bridge/src/qos_update.rs::topic_qos_from

Tests: crates/xml/src/qos.rs::tests::entity_qos_into_writer_uses_defaults_for_unset, crates/xml/src/qos.rs::tests::entity_qos_into_reader_uses_defaults_for_unset, crates/xml/tests/qos_profile.rs::t18_into_writer_and_reader_qos_use_spec_defaults

Status: done — eine Policy, die im Dokument fehlt, bleibt None in EntityQos und gilt als Vorgabe der DDS. into_writer_qos und into_reader_qos setzen sie ein (Reliability RELIABLE am Writer, BEST_EFFORT am Reader, History KEEP_LAST mit Tiefe 1); für Topic, Publisher, Subscriber und DomainParticipant mischt der Aufrufer EntityQos über die Vorgabe der Entität (webdds-bridge: topic_qos_from, publisher_qos_from, subscriber_qos_from, participant_qos_from). Commit f43f92d9e00.

§7.2.3 Fehlendes Feld einer Policy

Spec: §7.2.3, S. 18 — Vorgaben der Felder; §7.2.3.1, S. 19 (Felder mit minOccurs="0" und default).

Repo: crates/xml/src/qos_parser.rs: die Leser je Policy; numeric_text

Tests: crates/xml/tests/qos_profile.rs::t19_empty_policies_use_spec_defaults, crates/xml/tests/qos_profile.rs::t19b_duration_without_sec_is_zero, crates/xml/tests/normative_forms.rs::empty_numeric_elements_are_the_default

Status: done — ein Feld, das fehlt, hat die Vorgabe der DDS; minOccurs="0" steht an jedem Feld der XSD. Eine Policy ohne Kinder (<deadline/>, <history/>) liest als Policy mit allen Vorgaben, ein Element mit leerem Text (<depth/>) als Vorgabe seines Feldes, ein Duration_t ohne sec als 0. Eine Aufzählung ohne Literal hat die Vorgabe der DDS. Commits 5563ccdbefe, f43f92d9e00.

§7.2.3.1 Beispiel (Non-normative)

Spec: §7.2.3.1, S. 19 — complexType historyQosPolicy mit kind und depth, beide minOccurs="0" mit default.

Repo: —

Tests: —

Status: n/a (informative) — Beispiel. Es typisiert depth als xs:positiveInteger; die IDL hat long. parse_history verlangt 1 oder mehr (numbers_outside_the_schemas_types_are_refused).

§7.2.3 UserDataQosPolicy: user_data

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 157 — struct UserDataQosPolicy { sequence<octet> value; };

Repo: crates/xml/src/qos_parser.rs::parse_user_data, parse_octet_value

Tests: crates/xml/tests/qos_profile.rs::t13_user_data_base64_to_bytes, crates/xml/tests/qos_profile.rs::t13b_user_data_comma_list_to_bytes, crates/xml/tests/normative_forms.rs::user_data_value_is_base64_and_may_be_empty

Status: done — Element user_data mit value (Base64 oder Liste) oder valueB64 nach §7.2.4.2 (Items dort). Commit 86f47818638.

§7.2.3 TopicDataQosPolicy: topic_data

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 157 — struct TopicDataQosPolicy { sequence<octet> value; };

Repo: crates/xml/src/qos_parser.rs::parse_topic_data, parse_octet_value

Tests: crates/xml/tests/spec_items.rs::topic_data_and_group_data_hold_octets_in_both_forms, crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done — Element topic_data mit value (Base64 oder Liste) oder valueB64 nach §7.2.4.2 (Items dort). Commit 86f47818638.

§7.2.3 GroupDataQosPolicy: group_data

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 157 — struct GroupDataQosPolicy { sequence<octet> value; };

Repo: crates/xml/src/qos_parser.rs::parse_group_data, parse_octet_value

Tests: crates/xml/tests/spec_items.rs::topic_data_and_group_data_hold_octets_in_both_forms, crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done — Element group_data mit value (Base64 oder Liste) oder valueB64 nach §7.2.4.2 (Items dort). Commit 86f47818638.

§7.2.3 TransportPriorityQosPolicy: transport_priority

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 157 — struct TransportPriorityQosPolicy { long value; };

Repo: crates/xml/src/qos_parser.rs::parse_transport_priority

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 LifespanQosPolicy: lifespan

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 157 — struct LifespanQosPolicy { Duration_t duration; };

Repo: crates/xml/src/qos_parser.rs::parse_lifespan

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 DurabilityQosPolicy: durability

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 157–158 — struct DurabilityQosPolicy { DurabilityQosPolicyKind kind; };

Repo: crates/xml/src/qos_parser.rs::parse_durability

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse, crates/xml/tests/qos_profile.rs::t04_three_level_inheritance_propagates

Status: done — die Literale im Item zu §7.2.1.

§7.2.3 PresentationQosPolicy: presentation

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 158 — access_scope, coherent_access, ordered_access.

Repo: crates/xml/src/qos_parser.rs::parse_presentation

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 DeadlineQosPolicy: deadline

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 158 — struct DeadlineQosPolicy { Duration_t period; };

Repo: crates/xml/src/qos_parser.rs::parse_deadline

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse, crates/xml/tests/qos_profile.rs::t10_duration_infinity_string_parses_to_infinite

Status: done

§7.2.3 LatencyBudgetQosPolicy: latency_budget

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 158 — struct LatencyBudgetQosPolicy { Duration_t duration; };

Repo: crates/xml/src/qos_parser.rs::parse_latency_budget

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 OwnershipQosPolicy: ownership

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 158 — struct OwnershipQosPolicy { OwnershipQosPolicyKind kind; };

Repo: crates/xml/src/qos_parser.rs::parse_ownership

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 OwnershipStrengthQosPolicy: ownership_strength

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 158 — struct OwnershipStrengthQosPolicy { long value; };

Repo: crates/xml/src/qos_parser.rs::parse_ownership_strength

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 LivelinessQosPolicy: liveliness

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 158 — kind, lease_duration.

Repo: crates/xml/src/qos_parser.rs::parse_liveliness

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 TimeBasedFilterQosPolicy: time_based_filter

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 158 — struct TimeBasedFilterQosPolicy { Duration_t minimum_separation; };

Repo: crates/xml/src/qos_parser.rs::parse_time_based_filter

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 PartitionQosPolicy: partition

Spec: §7.2.3, S. 18; §7.2.4.1, S. 19; DDS 1.4 IDL, S. 158 — struct PartitionQosPolicy { StringSeq name; };

Repo: crates/xml/src/qos_parser.rs::parse_partition

Tests: crates/xml/tests/qos_profile.rs::t12_partition_multiple_names_become_vec, crates/xml/tests/normative_forms.rs::empty_partition_name_is_an_empty_sequence

Status: done — parse_partition liest die Folge nach §7.2.4.1: ein <name> mit null oder mehr <element>. Ein zweites <name> endet mit XmlError::InvalidXml; die Form mit wiederholtem <name> und die mit <name_list> sind keine Formen der Spec. Commits 86f47818638, e74ae3530ac.

§7.2.3 ReliabilityQosPolicy: reliability

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 159 — kind, max_blocking_time.

Repo: crates/xml/src/qos_parser.rs::parse_reliability

Tests: crates/xml/tests/qos_profile.rs::t01_happy_path_reliability_and_history_roundtrip, crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 DestinationOrderQosPolicy: destination_order

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 159 — struct DestinationOrderQosPolicy { DestinationOrderQosPolicyKind kind; };

Repo: crates/xml/src/qos_parser.rs::parse_destination_order

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 HistoryQosPolicy: history

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 159 — kind, depth.

Repo: crates/xml/src/qos_parser.rs::parse_history

Tests: crates/xml/tests/qos_profile.rs::t01_happy_path_reliability_and_history_roundtrip, crates/xml/tests/qos_profile.rs::t03_inheritance_child_overrides_history_keeps_reliability

Status: done

§7.2.3 ResourceLimitsQosPolicy: resource_limits

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 159 — max_samples, max_instances, max_samples_per_instance.

Repo: crates/xml/src/qos_parser.rs::parse_resource_limits; crates/xml/src/qos.rs::InitialResourceLimits

Tests: crates/xml/tests/normative_forms.rs::resource_limits_initial_fields_are_carried, crates/xml/tests/qos_profile.rs::t11_length_unlimited_in_resource_limits

Status: done — initial_samples und initial_instances aus dem Beispiel von §7.3.2.4.3.1 stehen in der XSD der OMG (resourceLimitsQosPolicy) und werden gelesen und in EntityQos::initial_resource_limits mitgeführt; die IDL von DDS 1.4 hat sie nicht, deshalb erreichen sie WriterQos und ReaderQos nicht. Commit b04504693c4.

§7.2.3 EntityFactoryQosPolicy: entity_factory

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 159 — struct EntityFactoryQosPolicy { boolean autoenable_created_entities; };

Repo: crates/xml/src/qos_parser.rs::parse_entity_factory

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse, crates/xml/tests/qos_profile.rs::t14_boolean_case_sensitive_strict

Status: done

§7.2.3 WriterDataLifecycleQosPolicy: writer_data_lifecycle

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 159 — struct WriterDataLifecycleQosPolicy { boolean autodispose_unregistered_instances; };

Repo: crates/xml/src/qos_parser.rs::parse_writer_data_lifecycle

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 ReaderDataLifecycleQosPolicy: reader_data_lifecycle

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 159 — autopurge_nowriter_samples_delay, autopurge_disposed_samples_delay.

Repo: crates/xml/src/qos_parser.rs::parse_reader_data_lifecycle

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done

§7.2.3 DurabilityServiceQosPolicy: durability_service

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 159 — service_cleanup_delay, history_kind, history_depth, max_samples, max_instances, max_samples_per_instance.

Repo: crates/xml/src/qos_parser.rs::parse_durability_service

Tests: crates/xml/tests/spec_items.rs::durability_service_reads_all_its_fields, crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done — parse_durability_service liest alle sechs Felder; durability_service_reads_all_its_fields liest sie und prüft vier davon, t09_all_22_policies_parse liest die Policy mit der Dauer.

§7.2.3 DurabilityServiceQosPolicy: max_instances, max_samples_per_instance

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 159 — long max_instances; long max_samples_per_instance;

Repo: crates/xml/src/qos_parser.rs::parse_durability_service

Tests: crates/xml/tests/spec_items.rs::durability_service_reads_all_its_fields

Status: done — parse_durability_service liest beide Felder; durability_service_reads_all_its_fields prüft die Werte.

§7.2.3 DomainParticipantQos: domain_participant_qos

Spec: §7.2.3, S. 18; §7.3.5.4.4.1, S. 27; DDS 1.4 IDL, S. 160 — user_data, entity_factory.

Repo: crates/xml/src/qos_parser.rs::parse_qos_profile_element, parse_single_qos_shortcut; crates/xml/src/participant.rs::parse_dp_element

Tests: crates/xml/tests/dds_xml_full.rs::participant_inheritance_one_level, crates/xml/tests/qos_profile.rs::t02_all_six_containers_in_a_profile, crates/xml/tests/normative_forms.rs::vendor_forms_are_refused_unless_accepted

Status: done — gelesen wird domain_participant_qos, wie die XSD der OMG ihn schreibt; domainparticipant_qos und participant_qos sind Herstellerformen (VendorForms). Commits a9cb28ca85c, da5ac86cf10.

§7.2.3 TopicQos: topic_qos

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 160 — die 13 Policies von TopicQos.

Repo: crates/xml/src/qos_parser.rs::parse_qos_profile_element; crates/xml/src/domain.rs::parse_topic_entry

Tests: crates/xml/tests/qos_profile.rs::t02_all_six_containers_in_a_profile, crates/xml/tests/dds_xml_full.rs::topic_qos_inline_and_profile_ref_both_resolve

Status: done

§7.2.3 DataWriterQos: datawriter_qos

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 160 — die 15 Policies von DataWriterQos.

Repo: crates/xml/src/qos_parser.rs::parse_qos_profile_element; crates/xml/src/qos.rs::into_writer_qos

Tests: crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse, crates/xml/tests/qos_profile.rs::t18_into_writer_and_reader_qos_use_spec_defaults

Status: done

§7.2.3 PublisherQos: publisher_qos

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 160 — presentation, partition, group_data, entity_factory.

Repo: crates/xml/src/qos_parser.rs::parse_qos_profile_element; crates/xml/src/participant.rs::parse_publisher_element

Tests: crates/xml/tests/qos_profile.rs::t02_all_six_containers_in_a_profile, crates/xml/tests/qos_profile.rs::t12_partition_multiple_names_become_vec

Status: done

§7.2.3 DataReaderQos: datareader_qos

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 160–161 — die 12 Policies von DataReaderQos.

Repo: crates/xml/src/qos_parser.rs::parse_qos_profile_element; crates/xml/src/qos.rs::into_reader_qos

Tests: crates/xml/tests/qos_profile.rs::t04_three_level_inheritance_propagates, crates/xml/src/registry.rs::tests::reader_qos_resolves

Status: done

§7.2.3 SubscriberQos: subscriber_qos

Spec: §7.2.3, S. 18; DDS 1.4 IDL, S. 161 — presentation, partition, group_data, entity_factory.

Repo: crates/xml/src/qos_parser.rs::parse_qos_profile_element; crates/xml/src/participant.rs::parse_subscriber_element

Tests: crates/xml/tests/qos_profile.rs::t02_all_six_containers_in_a_profile

Status: done

§7.2.3 Policies außerhalb der IDL einer QoS-Struktur

Spec: §7.2, S. 17 (1:1-Abbildung); DDS 1.4 IDL, S. 160–161.

Repo: crates/xml/src/qos_parser.rs::parse_entity_qos, allowed_policies

Tests: crates/xml/tests/qos_profile.rs::t09b_policy_outside_the_container_is_refused, crates/xml/tests/normative_forms.rs::report_and_skip_lists_everything_it_leaves_out

Status: done — parse_entity_qos liest je Container nur die Policies, die in DDS 1.4 §2.2.3 ein Feld der Struktur sind (allowed_policies); eine andere (z. B. ownership_strength in datareader_qos) endet mit XmlError::UnknownElement, unter report_and_skip als DiagnosticKind::MisplacedElement. Nichts wird gelesen und beim Übernehmen verworfen. Commits 78f3cbe292d, b04504693c4.


§7.2.4 XML Representation of Sequences

§7.2.4.1 Folge: null oder mehr Elemente element

Spec: §7.2.4.1, S. 19 — “The general XML representation of IDL sequences is done following a schema defined as an XSD complexType. The complexType contains zero or more elements named element. Nested inside each element is the XSD schema obtained from mapping the IDL type of the element itself.”

Repo: crates/xml/src/qos_parser.rs::parse_partition; crates/xml/src/parser.rs::XmlElement::sequence_elements

Tests: crates/xml/tests/qos_profile.rs::t12_partition_multiple_names_become_vec, crates/xml/tests/normative_forms.rs::empty_partition_name_is_an_empty_sequence, crates/xml/src/parser.rs::tests::sequence_elements_iterates_element_tag_children

Status: done — die einzige Folge in den QoS-Policies ist PartitionQosPolicy.name (StringSeq); parse_partition liest sie als <name> mit <element>-Kindern. XmlElement::sequence_elements liefert die Kinder element für webdds-bridge. Commit 86f47818638.

§7.2.4.1.1 Beispiel (Non-normative)

Spec: §7.2.4.1.1, S. 19–20 — QosPolicyCountSeq mit Elementen element.

Repo: —

Tests: —

Status: n/a (informative) — Beispiel. Es typisiert die Felder als xs:Integer; XSD kennt xs:integer.

§7.2.4.2 Octet-Folge als Liste mit Kommas in value

Spec: §7.2.4.2, S. 20 — “As a special case, sequences of octets are represented either as a comma-separated list of the value of each octet represented in decimal or hexadecimal, or alternatively using Base64 binary. The two options are differentiated by the element name. The latter having the suffix B64.”

Repo: crates/xml/src/qos_parser.rs::parse_octet_value, parse_octet_value_text

Tests: crates/xml/src/qos_parser.rs::tests::octet_value_is_base64_or_a_list, crates/xml/tests/qos_profile.rs::t13b_user_data_comma_list_to_bytes

Status: done — parse_octet_value_text liest <value> als Liste, wenn der Text eine Liste von Oktetten (dezimal oder 0x…, je 0 bis 255) ist; sonst als Base64, wie die XSD der OMG es für value typisiert (xs:base64Binary). Eine Ziffernfolge, die keine Liste ist, bleibt Base64. Commits 86f47818638, e74ae3530ac.

§7.2.4.2 Octet-Folge als Base64 in valueB64

Spec: §7.2.4.2, S. 20 — “alternatively using Base64 binary […] The latter having the suffix B64.”

Repo: crates/xml/src/qos_parser.rs::parse_octet_value, decode_b64_text

Tests: crates/xml/tests/qos_profile.rs::t13_user_data_base64_to_bytes, crates/xml/tests/qos_profile.rs::t13c_user_data_both_forms_rejected, crates/xml/tests/spec_items.rs::topic_data_and_group_data_hold_octets_in_both_forms

Status: done — valueB64 wird gelesen; value und valueB64 zugleich enden mit XmlError::InvalidXml. Commit 86f47818638.

§7.2.4.2 Wahl über den Namen des Elements

Spec: §7.2.4.2, S. 20 — “The two options are differentiated by the element name.”

Repo: crates/xml/src/qos_parser.rs::parse_octet_value

Tests: crates/xml/tests/qos_profile.rs::t13_user_data_base64_to_bytes, crates/xml/tests/qos_profile.rs::t13b_user_data_comma_list_to_bytes

Status: done — parse_octet_value unterscheidet value und valueB64 am Namen des Elements.

§7.2.4.2.1 Beispiel (Non-normative)

Spec: §7.2.4.2.1, S. 20 — simpleType ddsBinary, complexType userDataQosPolicy mit xs:choice aus value und valueB64.

Repo: —

Tests: —

Status: n/a (informative) — Beispiel. Der Name ist "ddsBinary " mit Leerzeichen; das Muster [0-2]?[0-9]?[0-9] lässt 256 bis 299 zu (mit Python re als Näherung der XSD-Regex geprüft, gemessen); die Beispieldokumente schließen mit <user_data_qos> statt </user_data_qos> und sind nicht wohlgeformt; das Element heißt user_data_qos, das Feld der IDL user_data. Die beiden Alternativen stellen nicht denselben Wert dar: die Liste ergibt „The quic“, VGhlJTIwcXVpY2sl ergibt „The%20quick%“ (mit Python dekodiert, gemessen).


§7.2.5 XML Representation of Arrays

§7.2.5 Felder wie Folgen

Spec: §7.2.5, S. 20 — “The XML representation of IDL arrays is the same as it would be for IDL sequences of the same element type.”

Repo: —

Tests: —

Status: n/a (informative) — kein Typ der DDS-IDL, den DDS-XML abbildet (QoS-Policies, QoS-Strukturen, Duration_t), enthält ein Feld fester Länge; die Regel hat in den Building Blocks QoS bis Applications keinen Anwendungsfall. Für Data Samples gilt §7.3.7.3.2.


§7.2.6 XML Representation of Duration

§7.2.6 Duration_t mit sec und nanosec

Spec: §7.2.6, S. 20–21 — “The IDL structure Duration_t is represented in XML following the general rules for structures defined in sub clause 7.2.3, except that the schema provides the option to use the symbolic defined in the IDL to set the values of the intended elements.” complexType duration mit sec (nonNegativeInteger_Duration_SEC) und nanosec (nonNegativeInteger_Duration_NSEC), beide minOccurs="0".

Repo: crates/xml/src/qos_parser.rs::parse_duration_element; crates/xml/schemas/dds-xml_qos_definitions_nonamespace.xsd (complexType duration)

Tests: crates/xml/tests/qos_profile.rs::t01_happy_path_reliability_and_history_roundtrip, crates/xml/tests/qos_profile.rs::t09_all_22_policies_parse

Status: done — die XSD der OMG gibt das complexType von S. 21 wieder (xs:all, beide minOccurs="0") und liegt unverändert im Baum. Die Namen der Konstanten stehen in den Items zu §7.2.2. <period>DURATION_INFINITY</period> ohne Kinder ist eine Herstellerform. Commits b04504693c4, a9cb28ca85c.

§7.2.6 nanosec optional

Spec: §7.2.6, S. 21 — <xs:element name="nanosec" [...] minOccurs="0" />

Repo: crates/xml/src/qos_parser.rs::parse_duration_element

Tests: crates/xml/tests/qos_profile.rs::t10_duration_infinity_string_parses_to_infinite, crates/xml/src/qos_parser.rs::tests::duration_inline_infinity_sentinel

Status: done — ohne nanosec gilt 0.

§7.2.6 sec optional

Spec: §7.2.6, S. 21 — <xs:element name="sec" [...] minOccurs="0" />

Repo: crates/xml/src/qos_parser.rs::parse_duration_element

Tests: crates/xml/tests/qos_profile.rs::t19b_duration_without_sec_is_zero

Status: done — ohne sec gilt 0 (die Vorgabe der DDS für Duration_t.sec). Commit 5563ccdbefe.

§7.2.6 Unendliche Dauer

Spec: §7.2.6, S. 20; §7.2.2.1, S. 18 — DURATION_INFINITE_SEC und DURATION_INFINITE_NSEC für die Felder von Duration_t.

Repo: crates/xml/src/qos_parser.rs::parse_duration_element

Tests: crates/xml/tests/qos_profile.rs::t10_duration_infinity_string_parses_to_infinite, crates/xml/tests/qos_profile.rs::t10b_duration_infinity_numeric_parses_to_infinite

Status: done — sec = 2147483647 mit nanosec = DURATION_INFINITE_NSEC oder ohne nanosec ergibt die unendliche Dauer von zerodds-qos. <sec>DURATION_INFINITE_SEC</sec><nanosec>0</nanosec> ergibt 2147483647 s.

§7.2.6 nanosec = 2147483647 als Zahl

Spec: §7.2.2.1, S. 18 — Muster (DURATION_INFINITY|DURATION_INFINITE_NSEC|([0-9])*)? für nanosec.

Repo: crates/xml/src/types.rs::parse_duration_nsec; crates/xml/src/qos_parser.rs::parse_duration_element

Tests: crates/xml/src/types.rs::tests::duration_nsec_accepts_the_full_unsigned_long_range, crates/xml/tests/qos_profile.rs::t10b_duration_infinity_numeric_parses_to_infinite

Status: done — parse_duration_nsec nimmt jede Zahl des Bereichs von unsigned long, auch 2147483647; <sec>2147483647</sec><nanosec>2147483647</nanosec> ist die unendliche Dauer. Commit 5563ccdbefe.

§7.2.6.1 Beispiel (Non-normative)

Spec: §7.2.6.1, S. 21 — <sec>DURATION_INFINITY</sec>, <nanosec>DURATION_INFINITY_NSEC</nanosec>.

Repo: —

Tests: —

Status: n/a (informative) — Beispiel. DURATION_INFINITY_NSEC passt weder zum Muster von S. 18 noch zu einer Konstante der IDL; parse_duration_nsec weist es ab.


§7.3.1 Overview

§7.3.1 Sechs Building Blocks

Spec: §7.3.1, S. 21 — “This specification breaks the syntax used to represent DDS resources in XML into the six different building blocks as shown in Figure 7.1: Building Block QoS, Building Block Types, Building Block Domains, Building Block DomainParticipants, Building Block Applications, Building Block Data Samples”.

Repo: —

Tests: —

Status: n/a (informative) — Gliederung; die Building Blocks stehen in den Items zu §7.3.2 bis §7.3.7.

§7.3.1 Figure 7.1 Beziehungen der Building Blocks

Spec: §7.3.1, Figure 7.1, S. 22 — Paketdiagramm mit BBQos, BBTypes, BBDomains, BBDataSamples, BBDomainParticipants, BBApplications.

Repo: —

Tests: —

Status: n/a (informative) — Abbildung; die Abhängigkeiten stehen in den Items zu §7.3.2.2 bis §7.3.7.2.

§7.3.1 Zwei Schema-Dateien nach dem Chameleon-Muster

Spec: §7.3.1, S. 22 — “Each of these building blocks is associated with two normative schema files in XSD format that are designed according to the XML Chameleon Schema Definition pattern (see sub clause 7.1.3).”

Repo: crates/xml/src/schemas.rs::ALL_SCHEMAS

Tests: crates/xml/src/schemas.rs::tests::all_schemas_includes_six_building_blocks_plus_system, crates/xml/src/schemas.rs::tests::nonamespace_xsds_omit_target_namespace

Status: done — für Data Samples sagt §7.3.7.3.1, dass es kein allgemeines XSD geben kann, und §7.3.7.3 nennt keine Datei; ZeroDDS liefert für diesen Building Block ein eigenes Paar nach demselben Muster.

§7.3.1 _nonamespace.xsd: Typen ohne targetNamespace und ohne Wurzelelement

Spec: §7.3.1, S. 22 — “dds-xml__definitions_nonamespace.xsd contains the type declarations for all the constructs the building block defines. This XSD file specifies neither a targetNamespace nor a root element.”

Repo: crates/xml/schemas/ (sieben Dateien *_nonamespace.xsd)

Tests: crates/xml/src/schemas.rs::tests::nonamespace_xsds_omit_target_namespace, crates/xml/src/schemas.rs::tests::namespaced_xsds_define_top_level_element

Status: done — keine der sieben Chameleon-Dateien hat einen targetNamespace oder ein globales Element; das Paar für Data Samples trägt die Wurzelelemente jetzt in der Datei mit Namensraum. Commits b04504693c4, 5e03ee5e374.

§7.3.1 Wurzelelemente in der Chameleon-Datei für Data Samples

Spec: §7.3.1, S. 22 — “This XSD file specifies neither a targetNamespace nor a root element.”

Repo: crates/xml/schemas/dds-xml_data_samples_definitions.xsd

Tests: crates/xml/src/schemas.rs::tests::namespaced_xsds_define_top_level_element, crates/xml/tests/schema_validation.rs::serialize_sample_output_validates

Status: done — dds-xml_data_samples_definitions_nonamespace.xsd deklariert kein Wurzelelement; <data> und <sample> stehen in dds-xml_data_samples_definitions.xsd, und serialize_sample_output_validates prüft die Ausgabe von serialize_sample im Namensraum gegen diese Datei. Commit 5e03ee5e374.

§7.3.1 _definitions.xsd: bindet ein, Wurzelelement, targetNamespace

Spec: §7.3.1, S. 22 — “dds-xml__definitions.xsd includes the XSD with no targetNamespace, defines the top level element for the building block, and sets targetNamespace to http://www.omg.org/spec/DDS-XML.”

Repo: crates/xml/schemas/ (sieben Dateien *_definitions.xsd)

Tests: crates/xml/src/schemas.rs::tests::namespaced_xsds_include_target_namespace, crates/xml/src/schemas.rs::tests::namespaced_xsds_define_top_level_element

Status: done — jede Datei bindet ihre Chameleon-Datei mit xs:include ein, deklariert das Wurzelelement und setzt den targetNamespace; auch die für Data Samples.

§7.3.1 Dokumente im Namensraum http://www.omg.org/spec/DDS-XML

Spec: §7.3.1, S. 22 — “sets targetNamespace to http://www.omg.org/spec/DDS-XML.”

Repo: crates/xml/src/parser.rs::DDS_XML_NS, library_elements; crates/xml/src/xsd_loader.rs::load_type_libraries_from_string

Tests: crates/xml/src/parser.rs::tests::parse_namespace_aware, crates/xml/src/xsd_loader.rs::tests::strict_mode_ignores_the_namespace_string_outside_a_declaration, crates/xml/tests/dds_xml_full.rs::all_four_libraries_roundtrip

Status: done — die Leser vergleichen lokale Namen: ein Dokument im Namensraum der Spec, eines ohne Namensraum (Chameleon-Muster, §7.1.3) und eines im eigenen Namensraum des Anwenders werden gleich gelesen. ValidationMode::Strict in load_type_libraries_from_string verlangt die Deklaration des Namensraums am Wurzelelement; sie steht nicht irgendwo im Text. Commit 167d1009ef8.


§7.3.2 Building Block QoS

§7.3.2.1 Zweck

Spec: §7.3.2.1, S. 22 — “This building block defines the syntax to represent DDS QoS in XML.”

Repo: —

Tests: —

Status: n/a (informative) — Zweck; die Syntax steht in den Items zu §7.2 und §7.3.2.3 bis §7.3.2.4.4.

§7.3.2.2 Keine Abhängigkeit von anderen Building Blocks

Spec: §7.3.2.2, S. 22 — “This building block has no dependencies on other building blocks.”

Repo: crates/xml/schemas/dds-xml_qos_definitions_nonamespace.xsd (bindet keine andere Datei ein); crates/xml/src/qos_parser.rs::parse_qos_libraries

Tests: crates/xml/src/schemas.rs::tests::building_block_xsd_dependencies_match_spec, crates/xml/tests/dds_xml_full.rs::independent_building_blocks_parse_without_the_other_blocks

Status: done

§7.3.2.3 Typen aller QoS in dds-xml_qos_definitions_nonamespace.xsd

Spec: §7.3.2.3, S. 23 — “dds-xml_qos_definitions_nonamespace.xsd contains the XSD type definition for all the DDS QoS. It defines no targetNamespace so that it can be reused by other schemas following the XML Chameleon Schema Definition pattern.”

Repo: crates/xml/schemas/dds-xml_qos_definitions_nonamespace.xsd

Tests: crates/xml/tests/schema_validation.rs::every_in_tree_schema_compiles, crates/xml/tests/schema_validation.rs::xsd_valid_documents_are_read

Status: done — die Datei der OMG liegt unverändert im Baum und definiert alle Policies, Felder, Aufzählungen und Container. Commit b04504693c4.

§7.3.2.3 <qos_library> als oberstes Element im Namensraum

Spec: §7.3.2.3, S. 23 — “dds-xml_qos_definitions.xsd defines the top-level element, and sets targetNamespace to http://www.omg.org/spec/DDS-XML.”

Repo: crates/xml/schemas/dds-xml_qos_definitions.xsd; crates/xml/src/parser.rs::library_elements

Tests: crates/xml/src/schemas.rs::tests::namespaced_xsds_define_top_level_element, crates/xml/tests/schema_validation.rs::topic_filter_attribute_is_read, crates/xml/tests/omg_example_documents.rs::qos_example

Status: done — die Leser nehmen <qos_library> als Wurzel und als Kind von <dds>. topic_filter_attribute_is_read braucht kein xmllint; qos_example braucht die Dateien der OMG.

§7.3.2.4.1 QoS-Bibliotheken mit QoS-Profilen

Spec: §7.3.2.4.1, S. 23 — “QoS Libraries are the top level element of the Building Block QoS. They are collections of QoS profiles, which group a set of related QoS—usually one per entity.”

Repo: crates/xml/src/qos_parser.rs::parse_qos_libraries, parse_qos_library_element, parse_qos_profile_element

Tests: crates/xml/src/qos_parser.rs::tests::parse_minimal_library, crates/xml/src/qos_parser.rs::tests::missing_library_name_rejected, crates/xml/src/qos_parser.rs::tests::missing_profile_name_rejected, crates/xml/tests/qos_profile.rs::t17_multiple_libraries_per_document

Status: done — name ist an <qos_library> und <qos_profile> Pflicht; ein unbekanntes Kind von <qos_library> oder <qos_profile> endet mit XmlError::UnknownElement.

§7.3.2.4.1.1 Beispiel (Non-normative)

Spec: §7.3.2.4.1.1, S. 23 — Bibliothek ReliableProfilesLibrary mit einem Profil für DataWriter und DataReader.

Repo: crates/xml/src/qos_parser.rs::parse_qos_libraries

Tests: crates/xml/tests/spec_items.rs::qos_library_example, crates/xml/tests/omg_example_documents.rs::qos_example

Status: done — qos_library_example liest das Beispiel; omg_example_documents::qos_example liest das Beispieldokument der OMG, wenn ZERODDS_OMG_DDSXML_DIR gesetzt ist.

§7.3.2.4.2 Vererbung von QoS-Profilen über base_name

Spec: §7.3.2.4.2, S. 23 — “A QoS Profile can inherit from other QoS Profiles using the base_name XML attribute.”

Repo: crates/xml/src/qos_inheritance.rs::resolve_profile; crates/xml/src/registry.rs::QosProfileRegistry; crates/xml/src/qos.rs::EntityQos::merge; crates/xml/src/inheritance.rs::resolve_chain; crates/rpc/src/qos_profile.rs::RpcQos::from_xml_profile

Tests: crates/xml/tests/qos_profile.rs::t03_inheritance_child_overrides_history_keeps_reliability, crates/xml/tests/qos_profile.rs::t04_three_level_inheritance_propagates, crates/xml/tests/qos_profile.rs::t05_inheritance_cycle_rejected, crates/xml/src/registry.rs::tests::inheritance_derived_overrides_base, crates/xml/src/qos_inheritance.rs::tests::cross_library_base_name_two_segment

Status: done — die Policy des abgeleiteten Profils ersetzt die des Basisprofils ganz, nicht Feld für Feld: ein Kind mit <history><kind>KEEP_ALL_HISTORY_QOS</kind></history> hat die Tiefe 1, nicht die der Basis; die Spec sagt dazu nichts. Zyklen und Ketten über 32 Glieder (MAX_INHERITANCE_DEPTH) werden abgewiesen. RpcQos::from_xml_profile folgt der Kette base_name. Commits 9b74a81b0a9, 54091c791d9.

§7.3.2.4.2 Nur von vorher definierten Profilen

Spec: §7.3.2.4.2, S. 23 — “A QoS profile can only inherit from QoS profiles that have been defined its definition”.

Repo: crates/xml/src/qos_inheritance.rs::check_definition_order; crates/xml/src/registry.rs::QosProfileRegistry::resolve

Tests: crates/xml/src/qos_inheritance.rs::tests::forward_base_name_rejected, crates/xml/src/registry.rs::tests::forward_base_name_rejected

Status: done — ein Profil, dessen base_name auf ein später definiertes Profil zeigt, endet mit XmlError::InvalidXml; die Ordnung ist die des Dokuments, über Bibliotheken hinweg. Der Satz der Spec ist unvollständig („defined its definition“); gelesen wird „defined before its definition“. Commit 388c784b2d9.

§7.3.2.4.2.1 Beispiel (Non-normative)

Spec: §7.3.2.4.2.1, S. 23 — <qos_profile name="MyProfile" base_name="BaseProfile">.

Repo: —

Tests: —

Status: n/a (informative) — Beispiel.

§7.3.2.4.3 Mehrere QoS einer Art, Auswahl nach dem Namen des Topic

Spec: §7.3.2.4.3, S. 23 — “A QoS Profile may contain several DataWriter, DataReader, and Topic QoS settings that are selected based on the evaluation of a filter expression on the topic name.”

Repo: crates/xml/src/qos_parser.rs::take_qos_container; crates/xml/src/qos.rs::select_qos_for_topic; crates/xml/src/qos_inheritance.rs::ResolvedQos; crates/xml/src/registry.rs::QosProfileRegistry::writer_qos_for_topic

Tests: crates/xml/tests/qos_profile.rs::t21_repeated_containers_select_by_topic_filter, crates/xml/src/qos_inheritance.rs::tests::topic_filter_selects_between_repeated_containers, crates/xml/src/registry.rs::tests::writer_qos_for_topic_selects_by_filter, crates/xml/tests/normative_forms.rs::repeated_containers_of_every_kind

Status: done — ein Profil hält je Art mehrere Container (Vec<FilteredEntityQos>), jeder mit seinem topic_filter; select_qos_for_topic, ResolvedQos::datawriter_qos_for_topic und QosProfileRegistry::writer_qos_for_topic wählen nach dem Namen des Topic. Mehrere Container mit demselben Filter (oder mehrere ohne) werden Policy für Policy zusammengeführt (merge_filtered_slots). Commit 02e08d8aea2.

§7.3.2.4.3 Filter im Attribut topic_filter der QoS

Spec: §7.3.2.4.3, S. 23 — “The filter expression is specified via the topic_filter XML attribute in the QoS definition of the entity QoS.”

Repo: crates/xml/src/qos_parser.rs::take_qos_container, parse_single_qos_shortcut; crates/xml/src/qos.rs::FilteredEntityQos, topic_filter_matches

Tests: crates/xml/tests/schema_validation.rs::topic_filter_attribute_is_read, crates/xml/tests/qos_profile.rs::t08_topic_filter_glob_semantics, crates/xml/src/qos_inheritance.rs::tests::topic_filter_inherited_and_overridden

Status: done — das Attribut wird am Container gelesen und dort gespeichert (FilteredEntityQos::topic_filter); topic_filter_matches wertet * und ? aus (die PDF legt die Syntax nicht fest). Der Filter als Kindelement von <qos_profile> und das Attribut an <topic> sind Herstellerformen (VendorForms). Commits 02e08d8aea2, a9cb28ca85c.

§7.3.2.4.3 Ohne Filter gilt *

Spec: §7.3.2.4.3, S. 23 — “If the topic filter is unspecified, the filter”*” will be assumed.”

Repo: crates/xml/src/qos.rs::default_qos, select_qos_for_topic

Tests: crates/xml/tests/qos_profile.rs::t22_filterless_container_is_the_fallback

Status: done — ein Container ohne Filter ist der Ersatz für jedes Topic, auf das kein Filter passt (default_qos).

§7.3.2.4.3 Reihenfolge und Vorrang der Filter

Spec: §7.3.2.4.3, S. 23 — “The QoS with an explicit topic_filter attribute definition will be evaluated in order; they take precedence over a QoS without a topic filter expression.”

Repo: crates/xml/src/qos.rs::select_qos_for_topic

Tests: crates/xml/tests/qos_profile.rs::t21_repeated_containers_select_by_topic_filter, crates/xml/src/qos_inheritance.rs::tests::no_matching_filter_has_no_qos, crates/xml/src/registry.rs::tests::writer_qos_for_topic_without_match_errors

Status: done — ein Container mit passendem Filter hat Vorrang vor dem ohne Filter; mehrere passende Filter wählt die Reihenfolge im Dokument; ohne Treffer hat die Entität keine QoS aus dem Profil. Commit 02e08d8aea2.

§7.3.2.4.3.1 Beispiel (Non-normative)

Spec: §7.3.2.4.3.1, S. 24 — zwei <datawriter_qos> mit topic_filter="A*" und "B*", der zweite mit resource_limits.

Repo: —

Tests: —

Status: n/a (informative) — Beispiel. Der Leser liest es: zwei <datawriter_qos> mit verschiedenen topic_filter in einem Profil, initial_samples und initial_instances in resource_limits (resource_limits_initial_fields_are_carried, t21_repeated_containers_select_by_topic_filter).

§7.3.2.4.4 Einzelne QoS als Profil

Spec: §7.3.2.4.4, S. 24 — “The definition of an individual QoS is a shortcut for defining a QoS profile with a single QoS.”

Repo: crates/xml/src/qos_parser.rs::parse_single_qos_shortcut, parse_qos_library_element

Tests: crates/xml/src/qos_parser.rs::tests::single_qos_shortcut_datawriter_creates_implicit_profile, crates/xml/src/qos_parser.rs::tests::single_qos_shortcut_topic_creates_implicit_profile, crates/xml/src/qos_parser.rs::tests::single_qos_shortcut_multiple_kinds_in_same_library, crates/xml/src/qos_parser.rs::tests::single_qos_shortcut_without_name_is_kept

Status: done — ein Container direkt unter <qos_library> ist ein Profil mit einer QoS; ohne name ist es ein Profil, auf das nichts verweisen kann, und bleibt unter dem leeren Namen erhalten. Commit 386b6850ca1.

§7.3.2.4.4.1 Beispiel (Non-normative)

Spec: §7.3.2.4.4.1, S. 24 — <datawriter_qos name="KeepAllWriter"> gleich <qos_profile name="KeepAllWriter"><datawriter_qos>.

Repo: —

Tests: —

Status: n/a (informative) — Beispiel.


§7.3.3 Building Block Types

§7.3.3.1 Typen in XML

Spec: §7.3.3.1, S. 24 — “This building block gathers the syntax used to represent DDS Types in XML.”

Repo: crates/xml/src/xtypes_parser.rs::parse_types_element_ctx, parse_type_libraries_with; crates/xml/src/xtypes_expr.rs; crates/xml-compose/src/lib.rs::compose

Tests: crates/xml/tests/types_and_samples.rs::t01_struct_with_long_member, crates/xml/tests/types_and_samples.rs::t16_module_three_levels_deep, crates/xml/tests/normative_forms.rs::bounds_and_dimensions_are_evaluated, crates/xml-compose/tests/idl_parity.rs::every_primitive_reaches_the_same_type_from_both_front_ends

Status: done — zwei Leser: zerodds-xml, den parse_dds_xml benutzt, und zerodds-xml-compose für die Codegeneratoren. Der Leser von zerodds-xml folgt der Grammatik von XTypes 1.3 Annex A (type/nonBasicTypeName, Maps, Annotationen, <const>, Konstantenausdrücke als Grenzen); die Grammatik steht Item für Item in dds-xtypes-1.3.md unter §7.3.2. Commits 58e5bb48580, 9a3f3974224, 147ffda178f.

§7.3.3.1 nonBasicTypeName und Maps im Leser von zerodds-xml

Spec: §7.3.3.1, S. 24 — Syntax der Typen in XML.

Repo: crates/xml/src/xtypes_parser.rs::parse_type_attribute, parse_map_attributes

Tests: crates/xml/src/xtypes_parser.rs::tests::spec_nonbasic_type_is_named_by_nonbasic_type_name, crates/xml/src/xtypes_parser.rs::tests::spec_map_members_are_read, crates/xml/src/xtypes_parser.rs::tests::spec_map_typedef_is_read

Status: done — type="nonBasic" benennt den Typ über nonBasicTypeName; Maps lesen mapMaxLength, mapKeyType, mapKeyNonBasicTypeName und mapKeyStringMaxLength. Ein Typname in type ohne nonBasic ist eine Herstellerform. Commits 5563ccdbefe, 147ffda178f, a9cb28ca85c.

§7.3.3.1 Organisation und Verwaltung von Typen

Spec: §7.3.3.1, S. 24 — “Additionally, it provides capabilities that are necessary or convenient for the organization and management of types and other XML resource representations.”

Repo: —

Tests: —

Status: n/a (informative) — Ankündigung ohne Inhalt in der PDF; die Konstrukte (module, include, forward_dcl, const) gehören zur Grammatik von [DDS-XTYPES] (dds-xtypes-1.3.md unter §7.3.2.1).

§7.3.3.2 Keine Abhängigkeit von anderen Building Blocks

Spec: §7.3.3.2, S. 24 — “This building block has no dependencies on other building blocks.”

Repo: crates/xml/schemas/dds-xml_type_definitions_nonamespace.xsd (bindet keine andere Datei ein); crates/xml/src/xtypes_parser.rs::parse_type_libraries

Tests: crates/xml/src/schemas.rs::tests::building_block_xsd_dependencies_match_spec, crates/xml/tests/dds_xml_full.rs::independent_building_blocks_parse_without_the_other_blocks

Status: done

§7.3.3.3 Typen aller DDS-Typen in der Chameleon-Datei

Spec: §7.3.3.3, S. 25 — “dds-xml_type_definitions_nonamespace.xsd contains the XSD type definitions for all the DDS types. It defines no targetNamespace so that it can be reused by other schemas following the XML Chameleon Schema Definition pattern.”

Repo: crates/xml/schemas/dds-xml_type_definitions_nonamespace.xsd

Tests: crates/xml/tests/schema_validation.rs::every_in_tree_schema_compiles, crates/xml/tests/schema_validation.rs::xsd_valid_documents_are_read

Status: done — die Datei der OMG liegt unverändert im Baum und definiert die Typen aller Konstrukte (structDecl, unionDecl, enumDecl, …). Commit 58e5bb48580, b04504693c4.

§7.3.3.3 <types> als oberstes Element im Namensraum

Spec: §7.3.3.3, S. 25 — “dds-xml_type_definitions.xsd defines the top-level element, and sets targetNamespace to http://www.omg.org/spec/DDS-XML.”

Repo: crates/xml/schemas/dds-xml_type_definitions.xsd; crates/xml/src/xtypes_parser.rs::parse_type_libraries

Tests: crates/xml/src/schemas.rs::tests::namespaced_xsds_define_top_level_element, crates/xml/tests/types_and_samples.rs::t26_sample_must_understand_attribute_parses, crates/xml/src/xtypes_parser.rs::tests::dds_root_with_multiple_types_blocks

Status: done — <types> als Wurzel und als Kind von <dds>.


§7.3.4 Building Block Domains

§7.3.4.1 Zweck

Spec: §7.3.4.1, S. 25 — “This building block defines the syntax used to represent DDS Domains in XML. Domains provide a data space where information can be shared by reading and writing a set of Topics, which are associated to registered data types.”

Repo: —

Tests: —

Status: n/a (informative) — Zweck; die Syntax in den Items zu §7.3.4.3 bis §7.3.4.4.2.

§7.3.4.2 Abhängig von QoS und Types

Spec: §7.3.4.2, S. 25 — “This building block depends on the Building Block QoS and the Building Block Types.”

Repo: crates/xml/schemas/dds-xml_domain_definitions_nonamespace.xsd (bindet die Chameleon-Dateien von Types und QoS ein)

Tests: crates/xml/src/schemas.rs::tests::building_block_xsd_dependencies_match_spec

Status: done — im Leser nutzt <topic_qos> den Leser der QoS; type_ref wird beim Auflösen gegen die <types> des Dokuments geprüft (Item zu §7.3.4.4.1). Die Chameleon-Datei der OMG bindet Types und QoS ein.

§7.3.4.3 Typen für Domains in der Chameleon-Datei

Spec: §7.3.4.3, S. 25 — “dds-xml_domain_definitions_nonamespace.xsd contains the XSD type definition for domains and their contained entities.”

Repo: crates/xml/schemas/dds-xml_domain_definitions_nonamespace.xsd (complexTypes registerType, topicEntry, domainEntry, domainLibrary)

Tests: crates/xml/tests/schema_validation.rs::every_in_tree_schema_compiles, crates/xml/tests/schema_validation.rs::schema_invalid_documents, crates/xml/tests/normative_forms.rs::registered_name_and_format_are_carried

Status: done — die Datei der OMG liegt unverändert im Baum. Der Leser liest an <register_type> das Element registered_name und das Attribut format und an <topic> das Element registered_name. qos_profile_ref und topic_filter an <topic> stehen nicht in der Datei; sie sind Herstellerformen. Commits b04504693c4, a9cb28ca85c. Beide Tests brauchen xmllint.

§7.3.4.3 <domain_library> als Wurzelelement im Namensraum

Spec: §7.3.4.3, S. 25 — “dds-xml_domain_definitions.xsd defines the root element and sets targetNamespace to http://www.omg.org/spec/DDS-XML.”

Repo: crates/xml/schemas/dds-xml_domain_definitions.xsd; crates/xml/src/domain.rs::parse_domain_libraries

Tests: crates/xml/src/schemas.rs::tests::namespaced_xsds_define_top_level_element, crates/xml/tests/spec_items.rs::domain_example, crates/xml/tests/omg_example_documents.rs::domains_example

Status: done — domain_example und domain_with_two_topics_and_register_types lesen <domain_library> als Wurzel; domains_example liest das Dokument der OMG, wenn ZERODDS_OMG_DDSXML_DIR gesetzt ist.

§7.3.4.4.1 Domain mit Topics und registrierten Typen

Spec: §7.3.4.4.1, S. 25 — “A Domain includes a set of Topics and Registered Types that can be read and written in the Domain.”

Repo: crates/xml/src/domain.rs::parse_domain_element

Tests: crates/xml/tests/dds_xml_full.rs::domain_with_two_topics_and_register_types, crates/xml/src/domain.rs::tests::parse_domain_with_topic, crates/xml/tests/dds_xml_full.rs::misplaced_or_unknown_children_are_rejected

Status: done — ein anderes Kind von <domain> oder <topic> endet mit XmlError::UnknownElement; mit report_and_skip wird es ausgelassen und gemeldet. Commit 78f3cbe292d.

§7.3.4.4.1 register_type mit type_ref

Spec: §7.3.4.4.1, S. 25 — “Register types shall provide a reference to data types that have been previously defined using the type_ref XML attribute.”

Repo: crates/xml/src/domain.rs::parse_register_type; crates/xml/src/zerodds_xml.rs::DdsXml::resolve_participant

Tests: crates/xml/src/domain.rs::tests::parse_domain_with_topic, crates/xml/tests/dds_xml_full.rs::deployment_file_with_inheritance_and_cross_references

Status: done — type_ref wird gelesen, gegen die <types> des Dokuments aufgelöst und als Typname des Topic weitergegeben. Commits abbf9915368, a83476cb034.

§7.3.4.4.1 type_ref ist Pflicht

Spec: §7.3.4.4.1, S. 25 — “Register types shall provide a reference […] using the type_ref XML attribute.”

Repo: crates/xml/src/domain.rs::parse_register_type

Tests: crates/xml/src/domain.rs::tests::register_type_missing_type_ref_rejected, crates/xml/src/participant.rs::tests::participant_register_type_without_type_ref_rejected

Status: done — parse_register_type weist ein register_type ohne type_ref mit XmlError::MissingRequiredElement ab: der Text verlangt die Referenz („shall provide“), das XSD der OMG hat use="optional". Entscheidung für den Text; das XSD-gültige Dokument ohne type_ref wird nicht gelesen. Commit abbf9915368.

§7.3.4.4.1 Der Typ ist vorher definiert

Spec: §7.3.4.4.1, S. 25 — “data types that have been previously defined”.

Repo: crates/xml/src/zerodds_xml.rs::DdsXml::resolve_participant, resolve_topic_entry, resolve_type; crates/xml/src/domain.rs::DomainLibrary

Tests: crates/xml/tests/dds_xml_full.rs::register_type_with_dangling_type_ref_errors, crates/xml/tests/spec_items.rs::register_type_refers_to_a_type_defined_before_the_domain

Status: done — resolve_participant löst type_ref über resolve_type auf; ein Typ, den kein <types> definiert, endet mit XmlError::UnresolvedReference, ebenso ein Typ, den erst ein <types> nach der Domain-Bibliothek definiert (DomainLibrary::type_libraries_before). Commits abbf9915368, a83476cb034.

§7.3.4.4.1 Name der Registrierung kann vom Typnamen abweichen

Spec: §7.3.4.4.1, S. 25 — “The name under which types are registered may be different than original type name.”

Repo: crates/xml/src/domain.rs::RegisterType (Felder name, type_ref)

Tests: crates/xml/src/domain.rs::tests::parse_domain_with_topic, crates/xml/tests/dds_xml_full.rs::deployment_file_with_inheritance_and_cross_references

Status: done

§7.3.4.4.1 Topic verweist mit register_type_ref

Spec: §7.3.4.4.1, S. 25 — “Topics shall refer to a registered type using the register_type_ref XML attribute.”

Repo: crates/xml/src/domain.rs::parse_topic_entry; crates/xml/src/zerodds_xml.rs::resolve_topic_entry

Tests: crates/xml/src/domain.rs::tests::topic_missing_register_type_ref_rejected, crates/xml/tests/dds_xml_full.rs::topic_with_unknown_register_type_ref_errors

Status: done

§7.3.4.4.1 QoS eines Topic inline

Spec: §7.3.4.4.1, S. 25 — “Topics may also specify QoS settings inline following the syntax defined in the Building Block QoS.”

Repo: crates/xml/src/domain.rs::parse_topic_entry

Tests: crates/xml/src/domain.rs::tests::parse_topic_with_inline_qos, crates/xml/tests/dds_xml_full.rs::topic_qos_inline_and_profile_ref_both_resolve

Status: done

§7.3.4.4.1 base_name an topic_qos

Spec: §7.3.4.4.1, S. 25 — “QoS profile inheritance through the base_name attribute may be used as defined in clause 7.3.2.4.2.”

Repo: crates/xml/src/qos_parser.rs::parse_entity_qos; crates/xml/src/zerodds_xml.rs::DdsXml::resolve_inline_qos; crates/xml/src/registry.rs::inline_over_base

Tests: crates/xml/tests/dds_xml_full.rs::inline_topic_qos_base_name_inherits_from_profile, crates/xml/src/registry.rs::tests::inline_container_inherits_base_name_profile, crates/xml/tests/spec_items.rs::domain_example

Status: done — parse_entity_qos liest base_name an der QoS (EntityQos::base_name); beim Auflösen ist das Profil die Basis und die inline angegebenen Policies überschreiben sie. Commits 86f47818638, f43f92d9e00.

§7.3.4.4.1.1 Beispiel (Non-normative)

Spec: §7.3.4.4.1.1, S. 25 — Domain MyDomain mit domain_id="10", zwei register_type und zwei topic.

Repo: crates/xml/src/domain.rs::parse_domain_libraries

Tests: crates/xml/tests/spec_items.rs::domain_example

Status: done — domain_example liest das Beispiel; das base_name von topic_qos bleibt erhalten.

§7.3.4.4.2 Vererbung von Domains über base_name

Spec: §7.3.4.4.2, S. 26 — “A Domain can inherit from other Domains using the base_name XML attribute.”

Repo: crates/xml/src/domain.rs::DomainLibrary::effective_domain, effective_domain_id

Tests: crates/xml/src/domain.rs::tests::domain_id_inherited_through_base_name, crates/xml/src/domain.rs::tests::domain_inheritance_chain_resolves_via_resolve_chain, crates/xml/tests/dds_xml_full.rs::domain_inheritance_carries_topics_and_types

Status: done — domain_id, die registrierten Typen und die Topics werden über die Kette geerbt; ein gleichnamiger Eintrag der abgeleiteten Domain ersetzt den der Basis. Commits 78f3cbe292d, 388c784b2d9.

§7.3.4.4.2 Topics und Typen der Basis

Spec: §7.3.4.4.2, S. 26 — Vererbung von Domains.

Repo: crates/xml/src/domain.rs::DomainLibrary::effective_domain; crates/xml/src/zerodds_xml.rs::resolve_participant_chain

Tests: crates/xml/tests/dds_xml_full.rs::domain_inheritance_carries_topics_and_types

Status: done — effective_domain führt register_types und topics der Kette zusammen; resolve_participant benutzt die wirksame Domain, ein Writer an einem Topic der Basis wird aufgelöst. Commit 78f3cbe292d.

§7.3.4.4.2 Nur von vorher definierten Domains

Spec: §7.3.4.4.2, S. 26 — “A Domain can only inherit from domains that have been defined before.”

Repo: crates/xml/src/domain.rs::DomainLibrary::effective_domain_id

Tests: crates/xml/src/domain.rs::tests::domain_forward_base_name_rejected

Status: done — effective_domain_id und effective_domain weisen eine Basis ab, die später in der Bibliothek steht, mit XmlError::InvalidXml. Commit 388c784b2d9.

§7.3.4.4.2.1 Beispiel (Non-normative)

Spec: §7.3.4.4.2.1, S. 26 — <domain name="MyDomain" base_name="BaseDomain">.

Repo: —

Tests: —

Status: n/a (informative) — Beispiel.


§7.3.5 Building Block DomainParticipants

§7.3.5.1 Zweck

Spec: §7.3.5.1, S. 26 — “This block defines the syntax to represent DDS DomainParticipants and their contained entities (i.e., Publishers, Subscribers, DataWriters, and DataReaders) in XML.”

Repo: —

Tests: —

Status: n/a (informative) — Zweck; die Syntax in den Items zu §7.3.5.3 bis §7.3.5.4.4.

§7.3.5.2 Abhängig von QoS, Types und Domains

Spec: §7.3.5.2, S. 26 — “This building block depends on the Building Block QoS, the Building Block Types, and the Building Block Domains.”

Repo: crates/xml/schemas/dds-xml_domainparticipant_definitions_nonamespace.xsd (bindet die Chameleon-Datei von Domains ein, die QoS und Types einbindet)

Tests: crates/xml/src/schemas.rs::tests::building_block_xsd_dependencies_match_spec

Status: done

§7.3.5.3 Typen der Entitäten in der Chameleon-Datei

Spec: §7.3.5.3, S. 26 — “dds-xml_domainparticipant_defintions_nonamespace.xsd contains the XSD type definition for all the DDS entities.”

Repo: crates/xml/schemas/dds-xml_domainparticipant_definitions_nonamespace.xsd (complexTypes dataWriterEntry, dataReaderEntry, publisherEntry, subscriberEntry, domainParticipantEntry, domainParticipantLibrary)

Tests: crates/xml/tests/schema_validation.rs::every_in_tree_schema_compiles, crates/xml/tests/schema_validation.rs::schema_invalid_documents, crates/xml/tests/normative_forms.rs::data_reader_filters_and_conditions_are_read

Status: done — die Datei der OMG liegt unverändert im Baum. Die Elemente content_filter, status_condition, read_condition und query_condition an <data_reader> werden gelesen (DataReaderEntry). Commits b04504693c4, 97a817ee16c. Beide Tests brauchen xmllint.

§7.3.5.3 <domain_participant_library> als Wurzelelement im Namensraum

Spec: §7.3.5.3, S. 26 — “dds-xml_domainparticipant_definitions.xsd defines the root element and sets targetNamespace to http://www.omg.org/spec/DDS-XML.”

Repo: crates/xml/schemas/dds-xml_domainparticipant_definitions.xsd; crates/xml/src/participant.rs::parse_domain_participant_libraries

Tests: crates/xml/src/schemas.rs::tests::namespaced_xsds_define_top_level_element, crates/xml/tests/normative_forms.rs::the_participant_example_of_the_specification, crates/xml/tests/omg_example_documents.rs::domain_participants_example

Status: done — participant.rs liest <domain_participant_library> als Wurzel; domain_participants_example liest das Dokument der OMG, wenn ZERODDS_OMG_DDSXML_DIR gesetzt ist, the_participant_example_of_the_specification das der Spec.

§7.3.5.4.1 Bibliotheken von DomainParticipants

Spec: §7.3.5.4.1, S. 26 — “Domain Participant Libraries are collections of DomainParticipants and contained entities. They are the top level elements of the Building Block DomainParticipants.”

Repo: crates/xml/src/participant.rs::parse_dp_library_element

Tests: crates/xml/src/participant.rs::tests::parse_minimal_participant, crates/xml/src/participant.rs::tests::missing_participant_name_rejected

Status: done

§7.3.5.4.1 Entitäten unter ihrem Elternelement

Spec: §7.3.5.4.1, S. 26 — “To represent this hierarchical relationship between DDS entities, each entity is declared as a nested XML tag under the declaration of its parent entity.”

Repo: crates/xml/src/participant.rs::parse_dp_element, parse_publisher_element, parse_subscriber_element, parse_dw_element, parse_dr_element

Tests: crates/xml/src/participant.rs::tests::parse_pub_with_writer, crates/xml/tests/dds_xml_full.rs::resolve_participant_returns_flat_snapshot

Status: done — DataWriter unter Publisher, DataReader unter Subscriber, beide unter dem DomainParticipant werden gelesen; eine Entität unter einem anderen Element endet mit XmlError::UnknownElement (Item unten). Commit 78f3cbe292d.

§7.3.5.4.1 Entität unter einem falschen Element

Spec: §7.3.5.4.1, S. 26 — “each entity is declared as a nested XML tag under the declaration of its parent entity.”

Repo: crates/xml/src/participant.rs::parse_publisher_element, parse_subscriber_element, parse_dp_element

Tests: crates/xml/tests/dds_xml_full.rs::misplaced_or_unknown_children_are_rejected, crates/xml/tests/schema_validation.rs::schema_invalid_documents

Status: done — ein <data_reader> unter <publisher>, ein <data_writer> unter <subscriber> und jedes andere Kind von <domain_participant>, <data_writer> oder <data_reader> endet mit XmlError::UnknownElement und dem Pfad; mit report_and_skip wird es ausgelassen und gemeldet. Das XSD der OMG lehnt dieselben Dokumente ab (schema_invalid_documents, Zeile data_reader_under_publisher). Commit 78f3cbe292d.

§7.3.5.4.1.1 Beispiel (Non-normative)

Spec: §7.3.5.4.1.1, S. 26 — <domain_participant_library="MyDomainParticipantLibrary"> mit Publisher, Subscriber, DataWriter und DataReader.

Repo: —

Tests: —

Status: n/a (informative) — Beispiel. Das Starttag hat keinen Attributnamen (<domain_participant_library="…">) und ist nicht wohlgeformt; <data_reader name="MyDataReader"/> hat kein topic_ref, das die XSD der OMG verlangt (schema_invalid_documents, Zeile data_reader_without_topic_ref) und der Leser mit XmlError::MissingRequiredElement abweist; domain_ref="MyDomain" ohne Bibliothek löst der Leser auf (Item zu §7.3.5.4.2). the_participant_example_of_the_specification liest das Beispiel mit diesen Berichtigungen.

§7.3.5.4.2 domain_ref macht Topics und Typen der Domain verfügbar

Spec: §7.3.5.4.2, S. 27 — “DomainParticipants may refer to a Domain declared in the context of a Domain Library (see Building Block Domains) using the domain_ref XML attribute. This makes the Topics and Register Types defined in the Domain available for all the DataWriters and DataReaders defined in the context of the DomainParticipant.”

Repo: crates/xml/src/zerodds_xml.rs::resolve_participant_chain, resolve_writer, resolve_reader; crates/xml/src/participant.rs::parse_dp_element

Tests: crates/xml/tests/dds_xml_full.rs::cross_library_domain_ref_resolves, crates/xml/tests/dds_xml_full.rs::deployment_file_with_inheritance_and_cross_references, crates/xml/tests/dds_xml_full.rs::participant_local_definitions_resolve_writers, crates/xml/tests/dds_xml_full.rs::participant_definition_overrides_the_domains

Status: done — Writer und Reader finden die Topics der Domain; <topic> und <register_type> in einem Participant sind eigene Definitionen, die zu denen der Domain hinzukommen und gleichnamige ersetzen, wie das XSD der OMG sie typisiert. Commits 388c784b2d9, 97e6562c58c.

§7.3.5.4.2 domain_ref ohne Namen der Bibliothek

Spec: §7.3.5.4.2, S. 27 — “using the domain_ref XML attribute”.

Repo: crates/xml/src/zerodds_xml.rs::DdsXml::find_domain_in_library

Tests: crates/xml/tests/dds_xml_full.rs::unqualified_domain_ref_resolves

Status: done — find_domain_in_library löst domain_ref="MyDomain" (ohne library::) über die erste Bibliothek, die eine Domain dieses Namens hat, in Dokumentreihenfolge; library::name bleibt möglich. Die PDF legt die Form des Verweises nicht fest. Commit 388c784b2d9.

§7.3.5.4.2 DomainParticipant ohne domain_ref

Spec: §7.3.5.4.2, S. 27 — “DomainParticipants may refer to a Domain”.

Repo: crates/xml/src/zerodds_xml.rs::resolve_participant_chain

Tests: crates/xml/tests/dds_xml_full.rs::participant_without_domain_ref_but_with_domain_id_resolves, crates/xml/tests/dds_xml_full.rs::participant_without_domain_resolves_its_own_topics, crates/xml/tests/dds_xml_full.rs::participant_domain_id_overrides_the_referenced_domain, crates/xml/src/participant.rs::tests::missing_domain_ref_parses_and_is_left_to_the_resolver

Status: done — ein Participant ohne domain_ref mit domain_id wird aufgelöst, ohne Domain und mit eigenen Definitionen; ohne beide Attribute endet das Auflösen mit XmlError::UnresolvedReference. Commit 388c784b2d9.

§7.3.5.4.2 domain_id überschreibt die Domain

Spec: §7.3.5.4.2, S. 27 — “The Domain Id specified in the parent Domain can be overridden via the domain_id XML attribute.”

Repo: crates/xml/src/zerodds_xml.rs::resolve_participant_chain

Tests: crates/xml/tests/dds_xml_full.rs::participant_domain_id_overrides_the_referenced_domain

Status: done

§7.3.5.4.2.1 Beispiel (Non-normative)

Spec: §7.3.5.4.2.1, S. 27 — <domain_participant name="MyDomain" domain_ref="MyDomain" domain_id="32">.

Repo: —

Tests: —

Status: n/a (informative) — Beispiel. Der Leser liest es und löst es auf: domain_ref ohne Bibliothek und domain_id als Überschreibung (unqualified_domain_ref_resolves, participant_domain_id_overrides_the_referenced_domain).

§7.3.5.4.3 Vererbung von DomainParticipants über base_name

Spec: §7.3.5.4.3, S. 27 — “DomainParticipants may inherit from DomainParticipants defined in the context of a DomainParticipant Library using the base_name XML attribute.”

Repo: crates/xml/src/zerodds_xml.rs::participant_chain, resolve_participant_chain

Tests: crates/xml/tests/dds_xml_full.rs::participant_inheritance_one_level, crates/xml/tests/dds_xml_full.rs::participant_inheritance_three_levels, crates/xml/tests/dds_xml_full.rs::participant_inheritance_cycle_detected

Status: done — domain_ref und domain_id des abgeleiteten Participant überschreiben die der Basis, die QoS wird Policy für Policy gemischt, ein Publisher oder Subscriber gleichen Namens wird ganz ersetzt.

§7.3.5.4.3 Nur aus vorher definierten Bibliotheken

Spec: §7.3.5.4.3, S. 27 — “A DomainParticipant can only inherit from DomainParticipants in DomainParticipant Libraries that have been defined before its own definition.”

Repo: crates/xml/src/zerodds_xml.rs::participant_chain, participant_position

Tests: crates/xml/tests/dds_xml_full.rs::participant_forward_base_name_rejected

Status: done — participant_chain weist eine Basis ab, die in der Dokumentreihenfolge nicht vor dem abgeleiteten Participant steht (Bibliothek, dann Eintrag), mit XmlError::InvalidXml. Commit 388c784b2d9.

§7.3.5.4.3.1 Beispiel (Non-normative)

Spec: §7.3.5.4.3.1, S. 27 — base_name="AnotherParticipantLibrary::TheirParticipant".

Repo: —

Tests: —

Status: n/a (informative) — Beispiel.

§7.3.5.4.4 QoS inline im Kontext der Entität

Spec: §7.3.5.4.4, S. 27 — “Inline QoS setting definition is allowed in the context an entity’s definition.”

Repo: crates/xml/src/participant.rs::parse_dp_element, parse_publisher_element, parse_subscriber_element, parse_dw_element, parse_dr_element

Tests: crates/xml/src/participant.rs::tests::parse_pub_with_writer, crates/xml/tests/dds_xml_full.rs::participant_inheritance_one_level

Status: done

§7.3.5.4.4 QoS inline gilt nur für die eigene Entität

Spec: §7.3.5.4.4, S. 27 — “Inline QoS settings apply only to the entity in whose context they are being defined.”

Repo: crates/xml/src/zerodds_xml.rs::resolve_writer, resolve_reader

Tests: crates/xml/tests/dds_xml_full.rs::datawriter_does_not_inherit_publisher_qos, crates/xml/tests/dds_xml_full.rs::publisher_without_qos_yields_none

Status: done — ein <data_writer> ohne eigene QoS und ohne base_name hat keine QoS aus seinem <publisher>; ein <data_reader> ebenso. Commit 78f3cbe292d.

§7.3.5.4.4 base_name an der QoS inline

Spec: §7.3.5.4.4, S. 27 — “Inline entities may inherit from an existing QoS Profile using the base_name XML attribute.”

Repo: crates/xml/src/qos_parser.rs::parse_entity_qos, set_inline_qos; crates/xml/src/registry.rs::QosProfileRegistry::writer_qos_for_inline, reader_qos_for_inline; crates/webdds-bridge/src/qos_update.rs

Tests: crates/xml/tests/dds_xml_full.rs::inline_topic_qos_base_name_inherits_from_profile, crates/xml/tests/dds_xml_full.rs::repeated_inline_qos_container_is_rejected, crates/xml/src/registry.rs::tests::inline_container_inherits_base_name_profile, crates/xml/tests/normative_forms.rs::the_participant_example_of_the_specification

Status: done — parse_entity_qos liest base_name an jeder QoS inline; das benannte Profil ist die Basis. Ein zweiter QoS-Container derselben Art an einer Entität endet mit XmlError::InvalidXml. qos_profile_ref an <data_writer>, <data_reader> und <topic> ist eine Herstellerform. Commits 86f47818638, f43f92d9e00, 4ffbcec7593, a9cb28ca85c.

§7.3.5.4.4.1 Beispiel (Non-normative)

Spec: §7.3.5.4.4.1, S. 27 — <domain_participant_qos base_name="BaseProfile"> mit entity_factory.

Repo: —

Tests: —

Status: n/a (informative) — Beispiel; das base_name der QoS inline bleibt erhalten und benennt die Basis (the_participant_example_of_the_specification, inline_topic_qos_base_name_inherits_from_profile).


§7.3.6 Building Block Applications

§7.3.6.1 Zweck

Spec: §7.3.6.1, S. 27 — “This block defines the XML syntax to represent DDS applications that participate (or may be participating) in the DDS Global Data Space.”

Repo: —

Tests: —

Status: n/a (informative) — Zweck.

§7.3.6.2 Abhängig von QoS, Types, Domains und DomainParticipants

Spec: §7.3.6.2, S. 27 — “This building block depends on the Building Block QoS, the Building Block Types, the Building Block Domains, and the Building Block DomainParticipants.”

Repo: crates/xml/schemas/dds-xml_application_definitions_nonamespace.xsd (bindet die Chameleon-Datei von DomainParticipants ein)

Tests: crates/xml/src/schemas.rs::tests::building_block_xsd_dependencies_match_spec

Status: done

§7.3.6.3 Typen für Applications in der Chameleon-Datei

Spec: §7.3.6.3, S. 28 — “dds-xml_application_definitions_nonamespace.xsd contains the XSD type definition for applications and their contained entities.”

Repo: crates/xml/schemas/dds-xml_application_definitions_nonamespace.xsd (complexTypes applicationEntry, applicationLibrary)

Tests: crates/xml/tests/schema_validation.rs::every_in_tree_schema_compiles

Status: done — die Datei der OMG liegt unverändert im Baum; der Test braucht xmllint.

§7.3.6.3 <application_library> als Wurzelelement im Namensraum

Spec: §7.3.6.3, S. 28 — “dds-xml_application_definititons.xsd defines the root element and sets targetNamespace to http://www.omg.org/spec/DDS-XML.”

Repo: crates/xml/schemas/dds-xml_application_definitions.xsd; crates/xml/src/application.rs::parse_application_libraries

Tests: crates/xml/src/application.rs::tests::bare_application_library_root_is_a_document, crates/xml/src/schemas.rs::tests::namespaced_xsds_define_top_level_element

Status: done

§7.3.6.4.1 Bibliotheken von Applications mit DomainParticipants

Spec: §7.3.6.4.1, S. 28 — “Application Libraries are collections of Applications, which are composed of a set of DomainParticipants and contained entities. They are the top level elements of the Building Block Applications.”

Repo: crates/xml/src/application.rs::parse_app_library_element, parse_app_element; crates/xml/src/zerodds_xml.rs::DdsXml::resolve_application

Tests: crates/xml/src/application.rs::tests::parse_minimal_application, crates/xml/src/application.rs::tests::application_participant_carries_its_whole_definition, crates/xml/tests/dds_xml_full.rs::mixed_top_level_with_cross_refs

Status: done — parse_app_element liest die Kinder <domain_participant>; ein anderes Kind endet mit XmlError::UnknownElement.

§7.3.6.4.1.1 Beispiel (Non-normative)

Spec: §7.3.6.4.1.1, S. 28 — Application SimpleShapesDemoApplication mit <data_writer> und <data_reader> unter <publisher>.

Repo: —

Tests: —

Status: n/a (informative) — Beispiel. Es setzt <data_reader> unter <publisher>, gegen die Ordnung von §7.3.5.4.1 (S. 26) und gegen die XSD der OMG; der Leser weist es mit XmlError::UnknownElement ab (Item zu §7.3.5.4.1). Der Test application_participant_carries_its_whole_definition gibt das Beispiel ohne diese Zeile wieder.

§7.3.6.4.2 DomainParticipants einer Application erben aus Bibliotheken

Spec: §7.3.6.4.2, S. 28 — “DomainParticipants defined in the context of an Application may inherit from DomainParticipants defined in the context of a DomainParticipant Library using the base_name XML attribute as described in the Building Block DomainParticipants.”

Repo: crates/xml/src/zerodds_xml.rs::resolve_application_participant

Tests: crates/xml/src/application.rs::tests::application_participant_may_inherit_instead_of_naming_a_domain, crates/xml/tests/dds_xml_full.rs::mixed_top_level_with_cross_refs, crates/xml/tests/dds_xml_full.rs::deployment_file_with_inheritance_and_cross_references

Status: done — base_name muss die Bibliothek nennen (library::name).

§7.3.6.4.2 Nur aus vorher definierten Bibliotheken

Spec: §7.3.6.4.2, S. 28 — “A DomainParticipant can only inherit from DomainParticipants in DomainParticipant Libraries that have been defined before its own definition.”

Repo: crates/xml/src/zerodds_xml.rs::resolve_application_participant, participant_chain

Tests: crates/xml/tests/spec_items.rs::application_inherits_only_from_libraries_defined_before_it, crates/xml/tests/dds_xml_full.rs::participant_forward_base_name_rejected

Status: done — die Kette der Basis wird wie bei DomainParticipants auf Dokumentreihenfolge geprüft (participant_chain), und die Bibliothek der Basis muss vor der Application-Bibliothek stehen (ApplicationLibrary::participant_libraries_before); sonst XmlError::InvalidXml. Commits 388c784b2d9, 5e03ee5e374.

§7.3.6.4.2.1 Beispiel (Non-normative)

Spec: §7.3.6.4.2.1, S. 28 — base_name="ShapesParticipantLibrary::MyParticipant".

Repo: —

Tests: —

Status: n/a (informative) — Beispiel.


§7.3.7 Building Block Data Samples

§7.3.7.1 Zweck

Spec: §7.3.7.1, S. 28 — “This block defines XML syntax to represent Data Samples that may be exchanged between different DDS applications.”

Repo: —

Tests: —

Status: n/a (informative) — Zweck.

§7.3.7.2 Keine Abhängigkeit von anderen Building Blocks

Spec: §7.3.7.2, S. 28 — “This building block has no dependencies on other building blocks.”

Repo: crates/xml/src/sample.rs::parse_sample (nimmt den Typ als Parameter); crates/xml/schemas/dds-xml_data_samples_definitions_nonamespace.xsd

Tests: crates/xml/src/schemas.rs::tests::building_block_xsd_dependencies_match_spec, crates/xml/tests/dds_xml_full.rs::independent_building_blocks_parse_without_the_other_blocks

Status: done

§7.3.7.3.1 Kein allgemeines XSD für Samples

Spec: §7.3.7.3.1, S. 29 — “Because it is impossible to define a generic XSD file to represent Data Samples of all the possible Data Type combinations in DDS, the syntax to represent Data Samples is based on the XML representation rules specified in sub clauses 7.1, 7.1.2, 7.2.2, 7.2.3, and 7.2.6.”

Repo: —

Tests: —

Status: n/a (informative) — Begründung; die Regeln stehen in den Items unten. ZeroDDS liefert ein eigenes XSD für die Hülle eines Samples (Item zu §7.3.1).

§7.3.7.3.1 Struktur nach §7.2.3: Element mit dem Namen des Feldes

Spec: §7.3.7.3.1, S. 29 — Regeln von §7.2.3 für Data Samples.

Repo: crates/xml/src/sample.rs::parse_struct_value

Tests: crates/xml/tests/types_and_samples.rs::t19_sample_parse_struct, crates/xml/tests/types_and_samples.rs::t23_sample_with_nested_struct, crates/xml/tests/types_and_samples.rs::t25_sample_optional_member_missing_ok, crates/xml/src/sample.rs::tests::missing_member_rejected, crates/xml/src/sample.rs::tests::parse_sample_unknown_member_rejected, crates/xml/src/sample.rs::tests::parse_sample_duplicate_member_rejected, crates/xml/src/sample.rs::tests::parse_sample_reads_inherited_members

Status: done — ein Feld ohne Element ist ein Fehler, außer es ist optional; ein Kind ohne Feld (auch in der Kette von baseType gesucht) und ein zweites Element desselben Feldes enden mit XmlError. Commits 78f3cbe292d, 0fc2106581d.

§7.3.7.3.1 Felder ungeordnet

Spec: §7.3.7.3.1, S. 29; §7.2.3, S. 18 — “unordered elements”.

Repo: crates/xml/src/sample.rs::parse_struct_value

Tests: crates/xml/tests/spec_items.rs::sample_fields_come_in_any_order, crates/xml/src/sample.rs::tests::parse_sample_members_in_any_order, crates/xml/src/sample.rs::tests::parse_sample_duplicate_member_rejected

Status: done — die Felder werden nach Namen gesucht, die Reihenfolge spielt keine Rolle; ein doppeltes Element endet mit XmlError. Commit 0fc2106581d.

§7.3.7.3.1 Werte nach Table 7.1: boolean

Spec: §7.3.7.3.1, S. 29; Table 7.1, S. 16 — boolean, Groß- und Kleinschreibung beachtet.

Repo: crates/xml/src/sample.rs::parse_primitive_value

Tests: crates/xml/tests/spec_items.rs::sample_values_follow_table_7_1, crates/xml/tests/spec_items.rs::primitive_types_example

Status: done — parse_primitive_value liest boolean mit parse_bool_strict (True wird abgewiesen).

§7.3.7.3.1 Werte nach Table 7.1: enum

Spec: §7.3.7.3.1, S. 29; Table 7.1, S. 16 — enum als Name des Literals.

Repo: crates/xml/src/sample.rs::parse_value_for_typedef

Tests: crates/xml/src/sample.rs::tests::parse_sample_enum_rejects_unknown_literal, crates/xml/tests/spec_items.rs::sample_values_follow_table_7_1, crates/xml/tests/spec_items.rs::primitive_types_example

Status: done — der Text eines Feldes vom Typ einer Aufzählung wird mit den Literalen des Typs verglichen; ein Literal, das der Typ nicht deklariert, endet mit XmlError. Commit 78f3cbe292d.

§7.3.7.3.1 Werte nach Table 7.1: long dezimal

Spec: §7.3.7.3.1, S. 29; Table 7.1, S. 16 — long -2147483648 bis 2147483647.

Repo: crates/xml/src/sample.rs::parse_primitive_value, parse_long_sample

Tests: crates/xml/tests/types_and_samples.rs::t19_sample_parse_struct, crates/xml/src/sample.rs::tests::parse_simple_struct_sample

Status: done — dezimale Werte werden gelesen; die hexadezimale Form und LENGTH_UNLIMITED im Item unten.

§7.3.7.3.1 Werte nach Table 7.1: long hexadezimal und LENGTH_UNLIMITED

Spec: §7.3.7.3.1, S. 29; Table 7.1, S. 16 — “or 0x80000000 to 0x7fffffff or LENGTH_UNLIMITED.”

Repo: crates/xml/src/sample.rs::parse_long_sample, parse_i16, parse_i64

Tests: crates/xml/src/sample.rs::tests::parse_sample_long_hex_and_constant_names, crates/xml/tests/spec_items.rs::sample_values_follow_table_7_1

Status: done — parse_long_sample liest 0x10 und LENGTH_UNLIMITED (und die Namen der Konstanten von §7.2.2); short und long long lesen die hexadezimale Form ebenso. Commit 78f3cbe292d.

§7.3.7.3.1 Werte nach Table 7.1: unsigned long

Spec: §7.3.7.3.1, S. 29; Table 7.1, S. 16 — unsigned long dezimal und hexadezimal.

Repo: crates/xml/src/sample.rs::parse_ulong_sample, parse_uint

Tests: crates/xml/src/sample.rs::tests::parse_sample_ulong_constant_names, crates/xml/tests/spec_items.rs::sample_values_follow_table_7_1

Status: done — parse_ulong_sample liest die dezimale und die hexadezimale Form (bis 4294967295) und die Namen DURATION_INFINITE_NSEC, DURATION_ZERO_NSEC, TIME_INVALID_NSEC; 4294967296 endet mit XmlError.

§7.3.7.3.1 Werte nach Table 7.1: string

Spec: §7.3.7.3.1, S. 29; Table 7.1, S. 16 — string mit Maskierung nach [XML].

Repo: crates/xml/src/sample.rs::parse_primitive_value; crates/xml/src/sample.rs::xml_escape

Tests: crates/xml/tests/types_and_samples.rs::t24_sample_string_escaping_roundtrip, crates/xml/tests/types_and_samples.rs::t20_sample_roundtrip

Status: done — die Zeichenkette behält ihren Leerraum; maskierte Zeichen werden aufgelöst, der Schreiber maskiert sie.

§7.3.7.3.1 Konstanten nach §7.2.2 und Duration nach §7.2.6

Spec: §7.3.7.3.1, S. 29 — Regeln von §7.2.2 und §7.2.6 für Data Samples.

Repo: crates/xml/src/sample.rs::parse_long_sample, parse_ulong_sample

Tests: crates/xml/tests/spec_items.rs::sample_values_follow_table_7_1, crates/xml/src/sample.rs::tests::parse_sample_long_hex_and_constant_names

Status: done — parse_long_sample und parse_ulong_sample nehmen die Namen der Konstanten an; ein Feld vom Typ Duration_t ist eine Struktur mit sec und nanosec, <sec>DURATION_INFINITE_SEC</sec> ergibt 2147483647. Commit 78f3cbe292d.

§7.3.7.3.1 Eigene XSD nach dem Chameleon-Muster

Spec: §7.3.7.3.1, S. 29 — “Users of this specification who may want to define schema files to specify the syntax of specific Data Samples can follow the XML Chameleon Schema Definition pattern.”

Repo: —

Tests: —

Status: n/a (informative) — Möglichkeit für Anwender.

§7.3.7.3.2 Folgen und Felder mit Elementen item

Spec: §7.3.7.3.2, S. 29 — “The general XML representation of IDL sequences and arrays is done following a schema defined as an XSD complexType. The complexType contains zero or more elements named item. Nested inside each element is the XSD schema obtained from mapping the IDL type of the element itself.”

Repo: crates/xml/src/sample.rs::parse_member_value, parse_array_items; crates/xml/src/sample.rs::serialize_value_body

Tests: crates/xml/src/sample.rs::tests::parse_sample_with_sequence_using_item_tag, crates/xml/src/sample.rs::tests::parse_sample_with_array_using_item_tag, crates/xml/src/sample.rs::tests::parse_sample_array_length_is_checked, crates/xml/src/sample.rs::tests::parse_sample_sequence_over_bound_rejected, crates/xml/src/sample.rs::tests::parse_sample_multidimensional_array_is_nested, crates/xml/src/sample.rs::tests::parse_sample_with_empty_sequence, crates/xml/tests/types_and_samples.rs::t21_sample_with_sequence_items, crates/xml/src/sample.rs::tests::serialize_sample_uses_item_tag_for_sequence

Status: done — die Länge eines Feldes fester Länge und die Grenze einer Folge werden geprüft (XmlError::ValueOutOfRange); ein mehrdimensionales Feld wird als verschachtelte Ebenen item gelesen. Commit 38e5855e99f.

§7.3.7.3.2.1 Beispiel (Non-normative)

Spec: §7.3.7.3.2.1, S. 29 — CoordinatesSeq mit Elementen item.

Repo: —

Tests: —

Status: n/a (informative) — Beispiel; es typisiert x und y als xs:Integer (XSD kennt xs:integer).

§7.3.7.4.1 Structure Types (non-normative)

Spec: §7.3.7.4.1, S. 30 — <aStruct> mit zweimal <aLong> und <aNestedStruct>.

Repo: —

Tests: —

Status: n/a (informative) — Beispiel. Eine Struktur der IDL hat keine zwei Felder gleichen Namens; der Leser weist das zweite <aLong> ab (parse_sample_duplicate_member_rejected).

§7.3.7.4.2 Unions (non-normative)

Spec: §7.3.7.4.2, S. 30 — <data><aUnion><aLong>0</aLong></aUnion></data>.

Repo: —

Tests: —

Status: n/a (informative) — Beispiel; §7.3.7.3 hat keine normative Regel für Unions. Das Beispiel nennt das aktive Feld ohne Diskriminator; parse_union_value liest es (parse_sample_union_without_discriminator), und die Form mit <discriminator> liest es ebenso (parse_sample_with_union). Commit 0fc2106581d.

§7.3.7.4.3 Sequences (non-normative)

Spec: §7.3.7.4.3, S. 30 — Folgen von double und von Strukturen mit item.

Repo: —

Tests: crates/xml/tests/spec_items.rs::sequence_and_array_examples

Status: done — sequence_and_array_examples liest das Beispiel.

§7.3.7.4.4 Arrays (non-normative)

Spec: §7.3.7.4.4, S. 30 — Felder von long und von Strukturen mit item.

Repo: —

Tests: crates/xml/tests/spec_items.rs::sequence_and_array_examples

Status: done — sequence_and_array_examples liest das Beispiel.

§7.3.7.4.5 Primitive Types (non-normative)

Spec: §7.3.7.4.5, S. 30–31 — aShort, aUShort, anEnum, aLong, aULong, aLongLong, aULongLong, aFloat, aDouble, aBoolean, aString, anotherString mit Zeichenreferenzen, anOctet als 0x00, aChar.

Repo: —

Tests: crates/xml/tests/spec_items.rs::primitive_types_example

Status: done — primitive_types_example liest alle Felder des Beispiels und prüft die Werte. Table 7.1 hat keine Zeilen für short, unsigned short, long long, unsigned long long, float, double, octet und char; ihre Form ist nur durch dieses Beispiel beschrieben. Commit 5e03ee5e374.


§8 Building Block Sets

§8 Block Sets als Zusammenstellung von Building Blocks

Spec: §8, S. 32 — “This Chapter defines some relevant combinations of building blocks called building block sets. A block set is a collection of building blocks. Block sets provide a convenient mechanism to group related building blocks so that other specifications can reference the complete set as opposed to the individual building blocks.”

Repo: —

Tests: —

Status: n/a (informative) — Begriff; der einzige Block Set steht in den Items zu §8.1.

§8.1 DDS System Block Set mit fünf Building Blocks

Spec: §8.1, S. 32 — “This block set offers the ability to describe a complete DDS system. It contains: Building Block QoS, Building Block Types, Building Block Domains, Building Block DomainParticipants, Building Block Applications”.

Repo: crates/xml/src/zerodds_xml.rs::parse_dds_xml, parse_dds_xml_with; crates/xml/schemas/dds-xml_dds_system_definitions_nonamespace.xsd (complexType ddsSystem)

Tests: crates/xml/src/zerodds_xml.rs::tests::parse_mixed_top_level, crates/xml/tests/dds_xml_full.rs::all_four_libraries_roundtrip, crates/xml/tests/types_and_samples.rs::t17_dds_xml_resolve_type, crates/xml/tests/dds_xml_full.rs::empty_dds_root_is_valid

Status: done — <dds> nimmt die fünf Bibliotheken in jeder Reihenfolge und Zahl an; ein anderes Kind endet mit XmlError::UnknownElement. Data Samples gehören nicht dazu. Die Reihenfolge der Bibliotheken zählt für die Regeln „vorher definiert“ (Items zu §7.3.4.4.1 und §7.3.6.4.2).

§8.1 Chameleon-Datei des Block Set

Spec: §8.1, S. 32 — “dds-xml_dds_system_definitions_nonamespace.xsd contains all the XSD type definitions for the DDS System Block Set. It defines no targetNamespace so that it can be reused by other schemas following the XML Chameleon Schema Definition pattern.”

Repo: crates/xml/schemas/dds-xml_dds_system_definitions_nonamespace.xsd

Tests: crates/xml/src/schemas.rs::tests::nonamespace_xsds_omit_target_namespace, crates/xml/tests/schema_validation.rs::every_in_tree_schema_compiles

Status: done — die Datei der OMG liegt unverändert im Baum; sie bindet die Chameleon-Datei von Applications ein, die die übrigen einbindet, und hat weder targetNamespace noch Wurzelelement. every_in_tree_schema_compiles braucht xmllint.

§8.1 <dds> als oberstes Element im Namensraum

Spec: §8.1, S. 32 — “dds-xml_dds_system_definitions.xsd defines the top-level element, and sets targetNamespace to http://www.omg.org/spec/DDS-XML.”

Repo: crates/xml/schemas/dds-xml_dds_system_definitions.xsd

Tests: crates/xml/src/schemas.rs::tests::namespaced_xsds_define_top_level_element, crates/xml/src/schemas.rs::tests::namespaced_xsds_include_target_namespace

Status: done


Audit-Status

165 done / 0 partial / 0 open / 0 blocked / 51 n/a (informative).

Offene Punkte: keine.