bool run_test(DomainParticipant_var& dp_sub, DomainParticipant_var& dp_pub) { OpenDDS::DCPS::RepoId sub_repo_id, pub_repo_id; { OpenDDS::DCPS::DomainParticipantImpl* dp_impl = dynamic_cast<OpenDDS::DCPS::DomainParticipantImpl*>(dp_sub.in()); sub_repo_id = dp_impl->get_id (); OpenDDS::DCPS::GuidConverter converter(sub_repo_id); ACE_DEBUG ((LM_DEBUG, ACE_TEXT("%P ") ACE_TEXT("Sub Domain Participant GUID=%C\n"), std::string(converter).c_str())); } { OpenDDS::DCPS::DomainParticipantImpl* dp_impl = dynamic_cast<OpenDDS::DCPS::DomainParticipantImpl*>(dp_pub.in()); pub_repo_id = dp_impl->get_id (); OpenDDS::DCPS::GuidConverter converter(pub_repo_id); ACE_DEBUG ((LM_DEBUG, ACE_TEXT("%P ") ACE_TEXT("Pub Domain Participant GUID=%C\n"), std::string(converter).c_str())); } // If we are running with an rtps_udp transport, it can't be shared between // participants. TransportConfig_rch cfg = TheTransportRegistry->get_config("dp1"); if (!cfg.is_nil()) { TheTransportRegistry->bind_config(cfg, dp_sub); } cfg = TheTransportRegistry->get_config("dp2"); if (!cfg.is_nil()) { TheTransportRegistry->bind_config(cfg, dp_pub); } Subscriber_var bit_sub = dp_sub->get_builtin_subscriber(); if (!read_participant_bit(bit_sub, dp_sub, pub_repo_id, TestConfig::PARTICIPANT_USER_DATA())) { return false; } // Each domain participant's handle to the other InstanceHandle_t dp_sub_ih, dp_pub_ih; InstanceHandle_t pub_ih, sub_ih, ig_ih; if (!(check_discovered_participants(dp_sub, dp_pub_ih) && check_discovered_participants(dp_pub, dp_sub_ih))) { return false; } DataWriter_var dw = create_data_writer(dp_pub); if (!dw) { ACE_DEBUG((LM_ERROR, "ERROR: %P could not create Data Writer (participant 2)\n")); return false; } if (!read_publication_bit(bit_sub, dp_sub, pub_repo_id, pub_ih, TestConfig::DATA_WRITER_USER_DATA(), TestConfig::TOPIC_DATA(), 1, 1)) { return false; } DataReader_var dr = create_data_reader(dp_sub); if (!dr) { ACE_DEBUG((LM_ERROR, "ERROR: %P could not create Data Reader (participant 1)\n")); return false; } if (!read_subscription_bit(dp_pub->get_builtin_subscriber(), dp_pub, sub_repo_id, sub_ih, TestConfig::DATA_READER_USER_DATA(), TestConfig::TOPIC_DATA())) { return false; } // Wait for the reader to associate with the writer. WriterSync::wait_match(dw); // Remove the writer and its topic, then re-create them. The writer's // participant should still have discovery info about the reader so that // the association between the new writer and old reader can be established. recreate_data_writer_and_topic(dw, dr); // Wait for the reader to associate with the writer. WriterSync::wait_match(dw); // The new writer is associated with the reader, but the reader may still // also be associated with the old writer. wait_match(dr, 1); // Get the new instance handle as pub_ih if (!read_publication_bit(bit_sub, dp_sub, pub_repo_id, pub_ih, TestConfig::DATA_WRITER_USER_DATA(), TestConfig::TOPIC_DATA(), 1, 2)) { return false; } TestMsgDataWriter_var tmdw = TestMsgDataWriter::_narrow(dw); const TestMsg msg = {42}; tmdw->write(msg, HANDLE_NIL); ReadCondition_var rc = dr->create_readcondition(ANY_SAMPLE_STATE, ANY_VIEW_STATE, ALIVE_INSTANCE_STATE); WaitSet_var waiter = new WaitSet; waiter->attach_condition(rc); ConditionSeq activeConditions; const Duration_t timeout = { 90, 0 }; ReturnCode_t result = waiter->wait(activeConditions, timeout); waiter->detach_condition(rc); if (result != RETCODE_OK) { ACE_DEBUG((LM_ERROR, "ERROR: %P TestMsg reader could not wait for condition: %d\n", result)); return false; } TestMsgDataReader_var tmdr = TestMsgDataReader::_narrow(dr); TestMsgSeq data; SampleInfoSeq infos; ReturnCode_t ret = tmdr->read_w_condition(data, infos, LENGTH_UNLIMITED, rc); if (ret != RETCODE_OK) { ACE_DEBUG((LM_ERROR, "ERROR: %P could not read TestMsg: %d\n", ret)); return false; } bool ok = false; for (CORBA::ULong i = 0; i < data.length(); ++i) { if (infos[i].valid_data) { ok = true; ACE_DEBUG((LM_DEBUG, "%P Read data sample: %d\n", data[i].value)); } } if (!ok) { ACE_DEBUG((LM_ERROR, "ERROR: %P no valid data from TestMsg data reader\n")); } // Change dp qos { DomainParticipantQos dp_qos; dp_pub->get_qos(dp_qos); set_qos(dp_qos.user_data.value, TestConfig::PARTICIPANT_USER_DATA2()); dp_pub->set_qos(dp_qos); } // Change dw qos { DataWriterQos dw_qos; dw->get_qos(dw_qos); set_qos(dw_qos.user_data.value, TestConfig::DATA_WRITER_USER_DATA2()); dw->set_qos(dw_qos); } // Change dr qos { DataReaderQos dr_qos; dr->get_qos(dr_qos); set_qos(dr_qos.user_data.value, TestConfig::DATA_READER_USER_DATA2()); dr->set_qos(dr_qos); } // Wait for propagation ACE_OS::sleep(3); if (!read_participant_bit(bit_sub, dp_sub, pub_repo_id, TestConfig::PARTICIPANT_USER_DATA2())) { return false; } if (!read_publication_bit(bit_sub, dp_sub, pub_repo_id, ig_ih, TestConfig::DATA_WRITER_USER_DATA2(), TestConfig::TOPIC_DATA(), 1, 1)) { return false; } if (!read_subscription_bit(dp_pub->get_builtin_subscriber(), dp_pub, sub_repo_id, ig_ih, TestConfig::DATA_READER_USER_DATA2(), TestConfig::TOPIC_DATA())) { return false; } // Set dw topic qos Topic_var topic = dw->get_topic(); TopicQos topic_qos; topic->get_qos(topic_qos); set_qos(topic_qos.topic_data.value, TestConfig::TOPIC_DATA2()); topic->set_qos(topic_qos); // Set dr topic qos TopicDescription_var topic_desc = dr->get_topicdescription(); topic = Topic::_narrow(topic_desc); topic->get_qos(topic_qos); set_qos(topic_qos.topic_data.value, TestConfig::TOPIC_DATA2()); topic->set_qos(topic_qos); // Wait for propagation ACE_OS::sleep(3); if (!read_publication_bit(bit_sub, dp_sub, pub_repo_id, ig_ih, TestConfig::DATA_WRITER_USER_DATA2(), TestConfig::TOPIC_DATA2(), 1, 1)) { return false; } if (!read_subscription_bit(dp_pub->get_builtin_subscriber(), dp_pub, sub_repo_id, ig_ih, TestConfig::DATA_READER_USER_DATA2(), TestConfig::TOPIC_DATA2())) { return false; } // Test ignore dp_sub->ignore_publication(pub_ih); if (!read_publication_bit(bit_sub, dp_sub, pub_repo_id, pub_ih, TestConfig::DATA_WRITER_USER_DATA2(), TestConfig::TOPIC_DATA2(), 0, 0)) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("ERROR: %P Could not ignore publication\n")), false); } dp_pub->ignore_subscription(sub_ih); if (!read_subscription_bit(dp_pub->get_builtin_subscriber(), dp_pub, sub_repo_id, sub_ih, TestConfig::DATA_READER_USER_DATA2(), TestConfig::TOPIC_DATA2(), true)) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("ERROR: %P Could not ignore subscription\n")), false); } dp_sub->ignore_participant(dp_pub_ih); InstanceHandleSeq handles; dp_sub->get_discovered_participants(handles); // Check that the handle is no longer in the sequence. for (CORBA::ULong i = 0; i < handles.length (); ++i) { if (handles[i] == dp_pub_ih) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("ERROR: %P Could not ignore participant\n")), false); } } return ok; }
int ignore () { #if !defined (DDS_HAS_MINIMUM_BIT) switch (ignore_kind) { case IGNORE_PARTICIPANT: { // Normally a client application would use some Qos like // the USER_DATA to find the Built-In Topic InstanceHandle_t // value for an entity (e.g. a DomainParticipant) but this // test knows everything and can use the discovery RepoID. ::OpenDDS::DCPS::RepoId part_id = participant_servant->get_id (); //SHH one of these should be the subscriber participant and the other should be the publisher participant. ::OpenDDS::DCPS::RepoId ignore_id = participant_servant->get_id (); std::stringstream participantBuffer; participantBuffer << part_id; std::stringstream ignoreBuffer; ignoreBuffer << ignore_id; ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) IGNORE_PARTICIPANT, participant %C ignore participant %C .\n"), participantBuffer.str().c_str(), ignoreBuffer.str().c_str())); InstanceHandle_t handle = participant_servant->get_handle(ignore_id); ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) IGNORE_PARTICIPANT, ignored participant %C has handle 0x%x.\n"), ignoreBuffer.str().c_str(), handle )); DDS::ReturnCode_t ret = participant->ignore_participant(handle); if (ret != ::DDS::RETCODE_OK) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) IGNORE_PARTICIPANT, ") ACE_TEXT(" participant %C ignore participant %C returned error %d\n"), participantBuffer.str().c_str(), ignoreBuffer.str().c_str(), ret)); return -1; } } break; case IGNORE_TOPIC: { ::OpenDDS::DCPS::RepoId part_id = participant_servant->get_id (); ::OpenDDS::DCPS::RepoId ignore_id = topic_servant->get_id (); std::stringstream participantBuffer; participantBuffer << part_id; std::stringstream ignoreBuffer; ignoreBuffer << ignore_id; ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) IGNORE_TOPIC, participant %C ignore topic %C .\n"), participantBuffer.str().c_str(), ignoreBuffer.str().c_str())); InstanceHandle_t handle = participant_servant->get_handle(ignore_id); ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) IGNORE_TOPIC, ignored topic %C has handle 0x%x.\n"), ignoreBuffer.str().c_str(), handle )); DDS::ReturnCode_t ret = participant->ignore_topic(handle); if (ret != ::DDS::RETCODE_OK) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) IGNORE_TOPIC, ") ACE_TEXT(" ignore_topic 0x%x return error %d\n"), handle, ret)); return -1; } } break; case IGNORE_PUBLICATION: { ::OpenDDS::DCPS::RepoId part_id = participant_servant->get_id (); ::OpenDDS::DCPS::RepoId ignore_id = datawriter_servant->get_publication_id (); std::stringstream participantBuffer; participantBuffer << part_id; std::stringstream ignoreBuffer; ignoreBuffer << ignore_id; ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) IGNORE_PUBLICATION, participant %C ignore publication %C .\n"), participantBuffer.str().c_str(), ignoreBuffer.str().c_str())); InstanceHandle_t handle = participant_servant->get_handle(ignore_id); ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) IGNORE_PUBLICATION, ignored topic %C has handle 0x%x.\n"), ignoreBuffer.str().c_str(), handle )); DDS::ReturnCode_t ret = participant->ignore_publication(handle); if (ret != ::DDS::RETCODE_OK) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) IGNORE_PUBLICATION, ") ACE_TEXT(" ignore_publication 0x%x return error %d\n"), handle, ret)); return -1; } } break; case IGNORE_SUBSCRIPTION: { ::OpenDDS::DCPS::RepoId part_id = participant_servant->get_id (); ::OpenDDS::DCPS::RepoId ignore_id = datareader_servant->get_subscription_id (); std::stringstream participantBuffer; participantBuffer << part_id; std::stringstream ignoreBuffer; ignoreBuffer << ignore_id; ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) IGNORE_SUBSCRIPTION, participant %C ignore subscription %C .\n"), participantBuffer.str().c_str(), ignoreBuffer.str().c_str())); InstanceHandle_t handle = participant_servant->get_handle(ignore_id); ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) IGNORE_SUBSCRIPTION, ignored topic %C has handle 0x%x.\n"), ignoreBuffer.str().c_str(), handle )); DDS::ReturnCode_t ret = participant->ignore_subscription(handle); if (ret != ::DDS::RETCODE_OK) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) IGNORE_SUBSCRIPTION, ") ACE_TEXT(" ignore_subscription 0x%x returned error %d\n"), handle, ret)); return -1; } } break; default: ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) ignore, ") ACE_TEXT(" unknown ignore kind %d\n"), ignore_kind)); return -1; break; } return 0; #else return -1; #endif // !defined (DDS_HAS_MINIMUM_BIT) }
int ignore () { #if !defined (DDS_HAS_MINIMUM_BIT) switch (ignore_kind) { case IGNORE_PARTICIPANT: { // Normally a client application would use some Qos like // the USER_DATA to find the Built-In Topic InstanceHandle_t // value for an entity (e.g. a DomainParticipant) but this // test knows everything and can use the DCPSInfo RepoID. ::TAO::DCPS::RepoId part_id = participant_servant->get_id (); //SHH one of these should be the subscriber participant and the other should be the publisher participant. ::TAO::DCPS::RepoId ignore_id = participant_servant->get_id (); ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) IGNORE_PARTICIPANT, participant %d ignore participant %d .\n"), part_id, ignore_id)); ::DDS::InstanceHandleSeq handles; ::TAO::DCPS::ReaderIdSeq ignore_ids; ignore_ids.length (1); ignore_ids[0] = ignore_id; ::TAO::DCPS::BIT_Helper_2 < ::DDS::ParticipantBuiltinTopicDataDataReader, ::DDS::ParticipantBuiltinTopicDataDataReader_var, ::DDS::ParticipantBuiltinTopicDataSeq, ::TAO::DCPS::ReaderIdSeq > hh; ::DDS::ReturnCode_t ret = hh.repo_ids_to_instance_handles(participant_servant, ::TAO::DCPS::BUILT_IN_PARTICIPANT_TOPIC, ignore_ids, handles); if (ret != ::DDS::RETCODE_OK) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) IGNORE_PARTICIPANT, ") ACE_TEXT(" repo_ids_to_instance_handles returned error %d\n"), ret)); return -1; } ret = participant->ignore_participant (handles[0]); if (ret != ::DDS::RETCODE_OK) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) IGNORE_PARTICIPANT, ") ACE_TEXT(" participant %d ignore participant %d returned error %d\n"), part_id, ignore_id, ret)); return -1; } } break; case IGNORE_TOPIC: { ::TAO::DCPS::RepoId part_id = participant_servant->get_id (); ::TAO::DCPS::RepoId ignore_id = topic_servant->get_id (); ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) IGNORE_TOPIC, participant %d ignore topic %d .\n"), part_id, ignore_id)); ::DDS::InstanceHandleSeq handles; ::TAO::DCPS::ReaderIdSeq ignore_ids; ignore_ids.length (1); ignore_ids[0] = ignore_id; ::TAO::DCPS::BIT_Helper_2 < ::DDS::TopicBuiltinTopicDataDataReader, ::DDS::TopicBuiltinTopicDataDataReader_var, ::DDS::TopicBuiltinTopicDataSeq, ::TAO::DCPS::ReaderIdSeq > hh; ::DDS::ReturnCode_t ret = hh.repo_ids_to_instance_handles(participant_servant, ::TAO::DCPS::BUILT_IN_TOPIC_TOPIC, ignore_ids, handles); if (ret != ::DDS::RETCODE_OK) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) IGNORE_TOPIC, ") ACE_TEXT(" repo_ids_to_instance_handles returned error %d.\n"), ret)); return -1; } ret = participant->ignore_topic (handles[0]); if (ret != ::DDS::RETCODE_OK) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) IGNORE_TOPIC, ") ACE_TEXT(" ignore_topic %d return error %d\n"), handles[0], ret)); return -1; } } break; case IGNORE_PUBLICATION: { ::TAO::DCPS::RepoId part_id = participant_servant->get_id (); ::TAO::DCPS::RepoId ignore_id = datawriter_servant->get_publication_id (); ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) IGNORE_PUBLICATION, participant %d ignore publication %d .\n"), part_id, ignore_id)); ::DDS::InstanceHandleSeq handles; ::TAO::DCPS::ReaderIdSeq ignore_ids; ignore_ids.length (1); ignore_ids[0] = ignore_id; ::TAO::DCPS::BIT_Helper_2 < ::DDS::PublicationBuiltinTopicDataDataReader, ::DDS::PublicationBuiltinTopicDataDataReader_var, ::DDS::PublicationBuiltinTopicDataSeq, ::TAO::DCPS::ReaderIdSeq > hh; ::DDS::ReturnCode_t ret = hh.repo_ids_to_instance_handles(participant_servant, ::TAO::DCPS::BUILT_IN_PUBLICATION_TOPIC, ignore_ids, handles); if (ret != ::DDS::RETCODE_OK) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) IGNORE_PUBLICATION, ") ACE_TEXT(" repo_ids_to_instance_handles returned error %d\n"), ret)); return -1; } ret = participant->ignore_publication (handles[0]); if (ret != ::DDS::RETCODE_OK) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) IGNORE_PUBLICATION, ") ACE_TEXT(" ignore_publication %d return error %d\n"), handles[0], ret)); return -1; } } break; case IGNORE_SUBSCRIPTION: { ::TAO::DCPS::RepoId part_id = participant_servant->get_id (); ::TAO::DCPS::RepoId ignore_id = datareader_servant->get_subscription_id (); ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) IGNORE_SUBSCRIPTION, participant %d ignore subscription %d .\n"), part_id, ignore_id)); ::DDS::InstanceHandleSeq handles; ::TAO::DCPS::ReaderIdSeq ignore_ids; ignore_ids.length (1); ignore_ids[0] = ignore_id; ::TAO::DCPS::BIT_Helper_2 < ::DDS::SubscriptionBuiltinTopicDataDataReader, ::DDS::SubscriptionBuiltinTopicDataDataReader_var, ::DDS::SubscriptionBuiltinTopicDataSeq, ::TAO::DCPS::ReaderIdSeq > hh; ::DDS::ReturnCode_t ret = hh.repo_ids_to_instance_handles(participant_servant, ::TAO::DCPS::BUILT_IN_SUBSCRIPTION_TOPIC, ignore_ids, handles); if (ret != ::DDS::RETCODE_OK) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) IGNORE_SUBSCRIPTION, ") ACE_TEXT(" repo_ids_to_instance_handles returned error %d\n"), ret)); return -1; } ret = participant->ignore_subscription (handles[0]); if (ret != ::DDS::RETCODE_OK) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) IGNORE_SUBSCRIPTION, ") ACE_TEXT(" ignore_subscription %d returned error 5d\n"), handles[0], ret)); return -1; } } break; default: ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) ignore, ") ACE_TEXT(" unknown ignore kind %d\n"), ignore_kind)); return -1; break; } return 0; #else return -1; #endif // !defined (DDS_HAS_MINIMUM_BIT) }