Source code for cyclonedds.domain

"""
 * Copyright(c) 2021 to 2022 ZettaScale Technology and others
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 * v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
"""

import ctypes as ct
from typing import List, Optional

from .internal import c_call, dds_c_t, dds_domain_default
from .core import Entity, DDSException, Listener
from .topic import Topic
from .qos import _CQos, LimitedScopeQos, DomainParticipantQos, Qos


[docs]class Domain(Entity): """A Domain represents a DDS domain with a set configuration. On the network a Domain is nothing more than an integer id. DDS domains are guaranteed to never mix, allowing logical separation of parts of your application. """ def __init__(self, domain_id: int, config: Optional[str] = None): """Initialize a domain with domain id and configuration. The configuration is either a xml string or an url to a xml file. """ self._id = domain_id if config is not None: super().__init__(self._create_domain(dds_c_t.domainid(domain_id), config.encode("ascii"))) else: super().__init__(self._create_domain(dds_c_t.domainid(domain_id), None))
[docs] def get_participants(self) -> List[Entity]: """Get all local participants of a domain.""" num_participants = self._lookup_participant(self._id, None, 0) if num_participants < 0: raise DDSException(num_participants, f"Occurred when getting the number of participants of domain {self._id}") elif num_participants == 0: return [] participants_list = (dds_c_t.entity * num_participants)() ret = self._lookup_participant( self._id, ct.cast(ct.byref(participants_list), ct.POINTER(dds_c_t.entity)), num_participants ) if ret >= 0: return [Entity.get_entity(participants_list[i]) for i in range(ret)] raise DDSException(ret, f"Occurred when getting the participants of domain {self._id}")
@c_call("dds_create_domain") def _create_domain(self, id: dds_c_t.domainid, config: ct.c_char_p) -> dds_c_t.entity: pass @c_call("dds_lookup_participant") def _lookup_participant(self, id: dds_c_t.domainid, participants: ct.POINTER(dds_c_t.entity), size: ct.c_size_t) \ -> dds_c_t.entity: pass
[docs]class DomainParticipant(Entity): """The DomainParticipant is the central entrypoint for any DDS Application. It serves as root entity for all other entities. """ def __init__(self, domain_id: int = dds_domain_default, qos: Optional[Qos] = None, listener: Optional[Listener] = None): """Initialize a DomainParticipant. Parameters ---------- domain_id: int, optional, default as per Cyclone DDS configuration The DDS Domain to use qos: cyclonedds.qos.Qos, optional, default None Apply DomainParticipant Qos. listener: cyclonedds.core.Listener, optional, default None Attach a Listener to the participant """ if qos is not None: if isinstance(qos, LimitedScopeQos) and not isinstance(qos, DomainParticipantQos): raise TypeError(f"{qos} is not appropriate for a DomainParticipant") elif not isinstance(qos, Qos): raise TypeError(f"{qos} is not a valid qos object") if listener is not None: if not isinstance(listener, Listener): raise TypeError(f"{listener} is not a valid listener object.") cqos = _CQos.qos_to_cqos(qos) if qos else None try: super().__init__(self._create_participant(domain_id, cqos, listener._ref if listener else None), listener=listener) finally: if cqos: _CQos.cqos_destroy(cqos) @c_call("dds_create_participant") def _create_participant(self, domain_id: dds_c_t.domainid, qos: dds_c_t.qos_p, listener: dds_c_t.listener_p) \ -> dds_c_t.entity: pass