Create DomainParticipant, Topic, and Type
=========================================

.. highlight:: c

A DomainParticipantFactory_ creates *DomainParticipants*, and a
*DomainParticipant* itself is the factory for creating *Publishers*, *Subscribers*,
and *Topics*.

When creating a *DomainParticipant*, you may need to customize
DomainParticipantQos_, notably for:

- **Resource limits**.  Default resource limits are set at
  minimum values.
- **Initial peers**.
- **Discovery**. The name of the registered discovery component ("dpde"
  or "dpse") must be assigned to DiscoveryQosPolicy_'s name.
- **Participant Name**. Every *DomainParticipant* is given the same default
  name.  Must be unique when using DPSE discovery.

Example code:

- Create a *DomainParticipant* with configured DomainParticipantQos_:
  
  ::
  
    DDS_DomainParticipant *participant = NULL;
    struct DDS_DomainParticipantQos dp_qos =
         DDS_DomainParticipantQos_INITIALIZER;

    /* DDS domain of DomainParticipant */
    DDS_Long domain_id = 0;

    /* Name of your registered Discovery component */
    if (!RT_ComponentFactoryId_set_name(&dp_qos.discovery.discovery.name, "dpde"))
    {
         /* failure */
    }

    /* Initial peers: use only default multicast peer */
    DDS_StringSeq_set_maximum(&dp_qos.discovery.initial_peers,1);
    DDS_StringSeq_set_length(&dp_qos.discovery.initial_peers,1);
    *DDS_StringSeq_get_reference(&dp_qos.discovery.initial_peers,0) =
        DDS_String_dup("239.255.0.1");

    /* Resource limits */
    dp_qos.resource_limits.max_destination_ports = 32;
    dp_qos.resource_limits.max_receive_ports = 32;
    dp_qos.resource_limits.local_topic_allocation = 1;
    dp_qos.resource_limits.local_type_allocation = 1;
    dp_qos.resource_limits.local_reader_allocation = 1;
    dp_qos.resource_limits.local_writer_allocation = 1;
    dp_qos.resource_limits.remote_participant_allocation = 8;
    dp_qos.resource_limits.remote_reader_allocation = 8;
    dp_qos.resource_limits.remote_writer_allocation = 8;

    /* Participant name */
    strcpy(dp_qos.participant_name.name, "Participant_1");

    participant =
         DDS_DomainParticipantFactory_create_participant(factory,
                                                         domain_id,
                                                         &dp_qos,
                                                         NULL,
                                                         DDS_STATUS_MASK_NONE);
     if (participant == NULL)
     {
         /* failure */
     }

Register Type
-------------

Your data types that have been generated from IDL need to be registered
with the *DomainParticipants* that will be using them. Each registered type
must have a unique name, preferably the same as its IDL defined name.

::

  DDS_ReturnCode_t retcode;

  retcode = DDS_DomainParticipant_register_type(participant,
                                                "HelloWorld",
                                                HelloWorldTypePlugin_get());
  if (retcode != DDS_RETCODE_OK)
  {
      /* failure */
  }

Create Topic of Registered Type
-------------------------------

DDS *Topics* encapsulate the types being communicated, and you can create
*Topics* for your type once your type is registered.

A topic is given a name at creation (e.g. "Example HelloWorld").  The type
associated with the *Topic* is specified with its registered name.

::

  DDS_Topic *topic = NULL;

  topic = DDS_DomainParticipant_create_topic(participant,
                                             "Example HelloWorld",
                                             "HelloWorld",
                                             &DDS_TOPIC_QOS_DEFAULT,
                                             NULL,
                                             DDS_STATUS_MASK_NONE);

  if (topic == NULL)
  {
      /* failure */
  }

DPSE Discovery: Assert Remote Participant
-----------------------------------------

DPSE Discovery relies on the application to specify the other, or remote,
*DomainParticipants* that its local *DomainParticipants* are allowed to
discover. Your application must call a DPSE_ API for each remote participant
to be discovered. The API takes as input the name of the remote
participant.

::

  /* Enable discovery of remote participant with name Participant_2 */
  retcode = DPSE_RemoteParticipant_assert(participant, "Participant_2");
  if (retcode != DDS_RETCODE_OK)
  {
      /* failure */
  }
  
For more information, see the :doc:`../usersmanual/domains` section in the User's Manual.