void TransportRegistry::bind_config(const TransportConfig_rch& cfg, DDS::Entity_ptr entity) { if (cfg.is_nil()) { throw Transport::NotFound(); } EntityImpl* ei = dynamic_cast<EntityImpl*>(entity); if (!ei) { throw Transport::MiscProblem(); } ei->transport_config(cfg); }
int TransportRegistry::load_transport_configuration(const OPENDDS_STRING& file_name, ACE_Configuration_Heap& cf) { const ACE_Configuration_Section_Key &root = cf.root_section(); // Create a vector to hold configuration information so we can populate // them after the transports instances are created. typedef std::pair<TransportConfig_rch, OPENDDS_VECTOR(OPENDDS_STRING) > ConfigInfo; OPENDDS_VECTOR(ConfigInfo) configInfoVec; // Record the transport instances created, so we can place them // in the implicit transport configuration for this file. OPENDDS_LIST(TransportInst_rch) instances; ACE_TString sect_name; for (int index = 0; cf.enumerate_sections(root, index, sect_name) == 0; ++index) { if (ACE_OS::strcmp(sect_name.c_str(), TRANSPORT_SECTION_NAME) == 0) { // found the [transport/*] section, now iterate through subsections... ACE_Configuration_Section_Key sect; if (cf.open_section(root, sect_name.c_str(), 0, sect) != 0) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("(%P|%t) TransportRegistry::load_transport_configuration: ") ACE_TEXT("failed to open section %s\n"), sect_name.c_str()), -1); } else { // Ensure there are no properties in this section ValueMap vm; if (pullValues(cf, sect, vm) > 0) { // There are values inside [transport] ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("(%P|%t) TransportRegistry::load_transport_configuration: ") ACE_TEXT("transport sections must have a section name\n"), sect_name.c_str()), -1); } // Process the subsections of this section (the individual transport // impls). KeyList keys; if (processSections( cf, sect, keys ) != 0) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("(%P|%t) TransportRegistry::load_transport_configuration: ") ACE_TEXT("too many nesting layers in [%s] section.\n"), sect_name.c_str()), -1); } for (KeyList::const_iterator it=keys.begin(); it != keys.end(); ++it) { OPENDDS_STRING transport_id = (*it).first; ACE_Configuration_Section_Key inst_sect = (*it).second; ValueMap values; if (pullValues( cf, (*it).second, values ) != 0) { // Get the factory_id for the transport. OPENDDS_STRING transport_type; ValueMap::const_iterator vm_it = values.find("transport_type"); if (vm_it != values.end()) { transport_type = (*vm_it).second; } else { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("(%P|%t) TransportRegistry::load_transport_configuration: ") ACE_TEXT("missing transport_type in [transport/%C] section.\n"), transport_id.c_str()), -1); } // Create the TransportInst object and load the transport // configuration in ACE_Configuration_Heap to the TransportInst // object. TransportInst_rch inst = this->create_inst(transport_id, transport_type); if (inst == 0) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("(%P|%t) TransportRegistry::load_transport_configuration: ") ACE_TEXT("Unable to create transport instance in [transport/%C] section.\n"), transport_id.c_str()), -1); } instances.push_back(inst); inst->load(cf, inst_sect); } else { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("(%P|%t) TransportRegistry::load_transport_configuration: ") ACE_TEXT("missing transport_type in [transport/%C] section.\n"), transport_id.c_str()), -1); } } } } else if (ACE_OS::strcmp(sect_name.c_str(), CONFIG_SECTION_NAME) == 0) { // found the [config/*] section, now iterate through subsections... ACE_Configuration_Section_Key sect; if (cf.open_section(root, sect_name.c_str(), 0, sect) != 0) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("(%P|%t) TransportRegistry::load_transport_configuration: ") ACE_TEXT("failed to open section [%s]\n"), sect_name.c_str()), -1); } else { // Ensure there are no properties in this section ValueMap vm; if (pullValues(cf, sect, vm) > 0) { // There are values inside [config] ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("(%P|%t) TransportRegistry::load_transport_configuration: ") ACE_TEXT("config sections must have a section name\n"), sect_name.c_str()), -1); } // Process the subsections of this section (the individual config // impls). KeyList keys; if (processSections( cf, sect, keys ) != 0) { // Don't allow multiple layers of nesting ([config/x/y]). ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("(%P|%t) TransportRegistry::load_transport_configuration: ") ACE_TEXT("too many nesting layers in [%s] section.\n"), sect_name.c_str()), -1); } for (KeyList::const_iterator it=keys.begin(); it != keys.end(); ++it) { OPENDDS_STRING config_id = (*it).first; // Create a TransportConfig object. TransportConfig_rch config = this->create_config(config_id); if (config == 0) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("(%P|%t) TransportRegistry::load_transport_configuration: ") ACE_TEXT("Unable to create transport config in [config/%C] section.\n"), config_id.c_str()), -1); } ValueMap values; pullValues( cf, (*it).second, values ); ConfigInfo configInfo; configInfo.first = config; for (ValueMap::const_iterator it=values.begin(); it != values.end(); ++it) { OPENDDS_STRING name = (*it).first; if (name == "transports") { OPENDDS_STRING value = (*it).second; char delim = ','; size_t pos = 0; OPENDDS_STRING token; while ((pos = value.find(delim)) != OPENDDS_STRING::npos) { token = value.substr(0, pos); configInfo.second.push_back(token); value.erase(0, pos + 1); } configInfo.second.push_back(value); configInfoVec.push_back(configInfo); } else if (name == "swap_bytes") { OPENDDS_STRING value = (*it).second; if ((value == "1") || (value == "true")) { config->swap_bytes_ = true; } else if ((value != "0") && (value != "false")) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("(%P|%t) TransportRegistry::load_transport_configuration: ") ACE_TEXT("Illegal value for swap_bytes (%C) in [config/%C] section.\n"), value.c_str(), config_id.c_str()), -1); } } else if (name == "passive_connect_duration") { OPENDDS_STRING value = (*it).second; if (!convertToInteger(value, config->passive_connect_duration_)) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("(%P|%t) TransportRegistry::load_transport_configuration: ") ACE_TEXT("Illegal integer value for passive_connect_duration (%s) in [config/%C] section.\n"), value.c_str(), config_id.c_str()), -1); } } else { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("(%P|%t) TransportRegistry::load_transport_configuration: ") ACE_TEXT("Unexpected entry (%C) in [config/%C] section.\n"), name.c_str(), config_id.c_str()), -1); } } if (configInfo.second.size() == 0) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("(%P|%t) TransportRegistry::load_transport_configuration: ") ACE_TEXT("No transport instances listed in [config/%C] section.\n"), config_id.c_str()), -1); } } } } else if (ACE_OS::strncmp(sect_name.c_str(), OLD_TRANSPORT_PREFIX.c_str(), OLD_TRANSPORT_PREFIX.length()) == 0) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: ") ACE_TEXT("Obsolete transport configuration found (%s).\n"), sect_name.c_str()), -1); } } // Populate the configurations with instances for (unsigned int i = 0; i < configInfoVec.size(); ++i) { TransportConfig_rch config = configInfoVec[i].first; OPENDDS_VECTOR(OPENDDS_STRING)& insts = configInfoVec[i].second; for (unsigned int j = 0; j < insts.size(); ++j) { TransportInst_rch inst = this->get_inst(insts[j]); if (inst == 0) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("(%P|%t) TransportRegistry::load_transport_configuration: ") ACE_TEXT("The inst (%C) in [config/%C] section is undefined.\n"), insts[j].c_str(), config->name().c_str()), -1); } config->instances_.push_back(inst); } } // Create and populate the default configuration for this // file with all the instances from this file. if (!instances.empty()) { TransportConfig_rch config = this->create_config(file_name); if (config == 0) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("(%P|%t) TransportRegistry::load_transport_configuration: ") ACE_TEXT("Unable to create default transport config.\n"), file_name.c_str()), -1); } instances.sort(predicate); for (OPENDDS_LIST(TransportInst_rch)::const_iterator it = instances.begin(); it != instances.end(); ++it) { config->instances_.push_back(*it); } } return 0; }
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; }