gapi_returnCode_t _DataWriterFree ( _DataWriter _this) { gapi_returnCode_t result = GAPI_RETCODE_OK; _Status status; u_writer w; assert(_this); status = _EntityStatus(_this); _TopicDescriptionDecUse(_TopicDescription(_this->topic)); _StatusSetListener(status, NULL, 0); _EntityClaim(status); _StatusDeinit(status); w = U_WRITER_GET(_this); _EntityDispose (_Entity(_this)); u_writerFree(w); return result; }
_DataWriter _DataWriterNew ( const _Topic topic, const _TypeSupport typesupport, const gapi_dataWriterQos *qos, const struct gapi_dataWriterListener *a_listener, const gapi_statusMask mask, const _Publisher publisher) { _DataWriter newDataWriter; v_writerQos writerQos; u_writer uWriter; _TypeSupport typeSupport = (_TypeSupport)typesupport; char dataWriterId[256]; gapi_string topicName; newDataWriter = _DataWriterAlloc(); if ( newDataWriter != NULL ) { _EntityInit(_Entity(newDataWriter), _Entity(publisher)); newDataWriter->topic = topic; if ( a_listener ) { newDataWriter->listener = *a_listener; } writerQos = u_writerQosNew(NULL); if ( (writerQos != NULL) ) { if ( !copyWriterQosIn(qos, writerQos) ) { u_writerQosFree (writerQos); _EntityDispose(_Entity(newDataWriter)); newDataWriter = NULL; } } else { _EntityDispose(_Entity(newDataWriter)); newDataWriter = NULL; } } if ( newDataWriter != NULL ) { u_writerCopy copy_action; newDataWriter->copy_in = _TypeSupportCopyIn(typeSupport); newDataWriter->copy_out = _TypeSupportCopyOut(typeSupport); newDataWriter->copy_cache = _TypeSupportCopyCache(typeSupport); copy_action = _TypeSupportGetWriterCopy(typeSupport); if (!copy_action) { copy_action = _DataWriterCopy; } topicName = _TopicDescriptionGetName (_TopicDescription(topic)); if (topicName) { snprintf (dataWriterId, sizeof (dataWriterId), "%sWriter", topicName); gapi_free (topicName); } else { snprintf (dataWriterId, sizeof (dataWriterId), "dataWriter"); } uWriter = u_writerNew(_PublisherUpublisher(publisher), dataWriterId, _TopicUtopic(topic), copy_action, writerQos, FALSE); if ( uWriter != NULL ) { U_WRITER_SET(newDataWriter, uWriter); } else { _EntityDispose(_Entity(newDataWriter)); newDataWriter = NULL; } u_writerQosFree(writerQos); } if ( newDataWriter != NULL ) { _Status status; status = _StatusNew(_Entity(newDataWriter), STATUS_KIND_DATAWRITER, (struct gapi_listener *)a_listener, mask); _EntityStatus(newDataWriter) = status; if (status) { _TopicDescriptionIncUse(_TopicDescription(topic)); } else { u_writerFree(uWriter); _EntityDispose(_Entity(newDataWriter)); newDataWriter = NULL; } } return newDataWriter; }
_Subscriber _BuiltinSubscriberNew ( u_participant uParticipant, _DomainParticipantFactory factory, _DomainParticipant participant) { u_subscriber s; _Status status; _Subscriber newSubscriber = _SubscriberAlloc(); gapi_handle handle; _TypeSupport typeSupport; gapi_dataReaderQos rQos; long i; s = u_participantGetBuiltinSubscriber(uParticipant); if (s) { newSubscriber = _SubscriberAlloc(); if (newSubscriber != NULL) { _EntityInit(_Entity(newSubscriber), _Entity(participant)); U_SUBSCRIBER_SET(newSubscriber, s); status = _StatusNew(_Entity(newSubscriber), STATUS_KIND_SUBSCRIBER, NULL, 0); if (status) { for ( i = 0; i < MAX_BUILTIN_TOPIC; i++ ) { _DataReader reader = NULL; _Topic topic = NULL; typeSupport = _DomainParticipantFindTypeSupport(participant, _BuiltinTopicTypeName(i)); if (typeSupport) { c_iter uTopicList; u_topic uTopic; uTopicList = u_participantFindTopic(uParticipant, _BuiltinTopicName(i), C_TIME_ZERO); uTopic = c_iterTakeFirst(uTopicList); if (uTopic) { topic = _TopicFromKernelTopic(uTopic, _BuiltinTopicName(i), _BuiltinTopicTypeName(i), typeSupport, participant, NULL); while (uTopic) { uTopic = c_iterTakeFirst(uTopicList); /* multiple instances should not occure but * just in case this loop frees all references. */ assert(uTopic == NULL); u_entityFree(u_entity(uTopic)); } } else { OS_REPORT_2(OS_WARNING,"_BuiltinSubscriberNew",0, "failed to resolve User layer Topic " "'%s' for Participant 0x%x", _BuiltinTopicName(i), participant); } } else { OS_REPORT_2(OS_WARNING,"_BuiltinSubscriberNew",0, "Builtin TypeSupport for type '%s' is not " "yet registered for Participant 0x%x", _BuiltinTopicTypeName(i), participant); } if (topic) { initBuiltinDataReaderQos(&rQos); reader = _DataReaderNew(_TopicDescription(topic), typeSupport, &rQos, NULL, 0, newSubscriber); _EntityRelease(topic); } else { OS_REPORT_2(OS_WARNING,"_BuiltinSubscriberNew",0, "failed to create Builtin Topic '%s' " "for Participant 0x%x", _BuiltinTopicName(i), participant); } if ( reader ) { _ENTITY_REGISTER_OBJECT(_Entity(newSubscriber), (_Object)reader); handle = _EntityRelease(reader); gapi_entity_enable(handle); } } newSubscriber->builtin = TRUE; _EntityStatus(newSubscriber) = status; } else { _EntityDispose(_Entity(newSubscriber)); newSubscriber = NULL; } } } return newSubscriber; }