text: // Copyright 2019 Proyectos y Sistemas de Mantenimiento SL (eProsima).
  //
  // Licensed under the Apache License, Version 2.0 (the "License");
  // you may not use this file except in compliance with the License.
  // You may obtain a copy of the License at
  //
  //     http://www.apache.org/licenses/LICENSE-2.0
  //
  // Unless required by applicable law or agreed to in writing, software
  // distributed under the License is distributed on an "AS IS" BASIS,
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  // See the License for the specific language governing permissions and
  // limitations under the License.
  
  #include "HelloWorld.h"
  
  #include <uxr/client/client.h>
  #include <ucdr/microcdr.h>
  
  #include <stdio.h> //printf
  #include <string.h> //strcmp
  #include <stdlib.h> //atoi
  
  #define STREAM_HISTORY  8
  #define BUFFER_SIZE     UXR_CONFIG_UDP_TRANSPORT_MTU * STREAM_HISTORY
  
  int main(int args, char** argv)
  {
      // CLI
      if(3 > args || 0 == atoi(argv[2]))
      {
          printf("usage: program [-h | --help] | ip port [<max_topics>]\n");
          return 0;
      }
  
      char* ip = argv[1];
      uint16_t port = (uint16_t)atoi(argv[2]);
      uint32_t max_topics = (args == 4) ? (uint32_t)atoi(argv[3]) : UINT32_MAX;
  
      // Transport
      uxrUDPTransport transport;
      uxrUDPPlatform udp_platform;
      if(!uxr_init_udp_transport(&transport, &udp_platform, ip, port))
      {
          printf("Error at create transport.\n");
          return 1;
      }
  
      // Session
      uxrSession session;
      uxr_init_session(&session, &transport.comm, 0xAAAABBBB);
      if(!uxr_create_session(&session))
      {
          printf("Error at create session.\n");
          return 1;
      }
  
      // Streams
      uint8_t output_reliable_stream_buffer[BUFFER_SIZE];
      uxrStreamId reliable_out = uxr_create_output_reliable_stream(&session, output_reliable_stream_buffer, BUFFER_SIZE, STREAM_HISTORY);
  
      uint8_t input_reliable_stream_buffer[BUFFER_SIZE];
      uxr_create_input_reliable_stream(&session, input_reliable_stream_buffer, BUFFER_SIZE, STREAM_HISTORY);
  
      // Create entities
      uxrObjectId participant_id = uxr_object_id(0x01, UXR_PARTICIPANT_ID);
      const char* participant_ref = "participant_name";
      uint16_t participant_req = uxr_buffer_create_participant_ref(&session, reliable_out, participant_id, 0, participant_ref, UXR_REPLACE);
  
      uxrObjectId topic_id = uxr_object_id(0x01, UXR_TOPIC_ID);
      const char* topic_ref = "topic_name";
      uint16_t topic_req = uxr_buffer_create_topic_ref(&session, reliable_out, topic_id, participant_id, topic_ref, UXR_REPLACE);
  
      uxrObjectId publisher_id = uxr_object_id(0x01, UXR_PUBLISHER_ID);
      const char* publisher_xml = "";
      uint16_t publisher_req = uxr_buffer_create_publisher_xml(&session, reliable_out, publisher_id, participant_id, publisher_xml, UXR_REPLACE);
  
      uxrObjectId datawriter_id = uxr_object_id(0x01, UXR_DATAWRITER_ID);
      const char* datawriter_ref = topic_ref;
      uint16_t datawriter_req = uxr_buffer_create_datawriter_xml(&session, reliable_out, datawriter_id, publisher_id, datawriter_ref, UXR_REPLACE);
  
      // Send create entities message and wait its status
      uint8_t status[4];
      uint16_t requests[4] = {participant_req, topic_req, publisher_req, datawriter_req};
      if(!uxr_run_session_until_all_status(&session, 1000, requests, status, 4))
      {
          printf("Error at create entities: participant: %i topic: %i publisher: %i darawriter: %i\n", status[0], status[1], status[2], status[3]);
          return 1;
      }
  
      // Write topics
      bool connected = true;
      uint32_t count = 0;
      while(connected && count < max_topics)
      {
          HelloWorld topic = {++count, "Hello DDS world!"};
  
          ucdrBuffer ub;
          uint32_t topic_size = HelloWorld_size_of_topic(&topic, 0);
          uxr_prepare_output_stream(&session, reliable_out, datawriter_id, &ub, topic_size);
          HelloWorld_serialize_topic(&ub, &topic);
  
          printf("Send topic: %s, id: %i\n", topic.message, topic.index);
          connected = uxr_run_session_time(&session, 1000);
      }
  
      // Delete resources
      uxr_delete_session(&session);
      uxr_close_udp_transport(&transport);
  
      return 0;
  }
  