00001 #include "dds/DCPS/QOS_XML_Handler/QOS_XML_Loader.h"
00002 #include "dds/DCPS/QOS_XML_Handler/XML_File_Intf.h"
00003 #include "ace/Tokenizer_T.h"
00004 #include "dds/DCPS/debug.h"
00005
00006 OPENDDS_BEGIN_VERSIONED_NAMESPACE_DECL
00007
00008 namespace OpenDDS {
00009 namespace DCPS {
00010
00011 QOS_XML_Loader::QOS_XML_Loader (void)
00012 {
00013 }
00014
00015 QOS_XML_Loader::~QOS_XML_Loader (void)
00016 {
00017 }
00018
00019
00020 char*
00021 QOS_XML_Loader::get_xml_file_name (const char * qos_profile)
00022 {
00023 if (qos_profile)
00024 {
00025 char* buf = ACE_OS::strdup (qos_profile);
00026 ACE_Tokenizer_T<char> tok (buf);
00027 tok.delimiter_replace ('#', 0);
00028 const char * file_name = tok.next ();
00029
00030 if (file_name == 0)
00031 {
00032 ACE_OS::free (buf);
00033 if (DCPS_debug_level > 5)
00034 {
00035 ACE_ERROR ((LM_ERROR,
00036 "get_xml_file_name <%C> - "
00037 "Error: malformed qos_profile. Expected format: "
00038 "<xml_file_base_name>#<profile_name>\n",
00039 qos_profile));
00040 }
00041 return 0;
00042 }
00043
00044 char * ret = (char*)ACE_OS::malloc (ACE_OS::strlen (file_name) + 5);
00045 ret = ACE_OS::strcpy (ret, file_name);
00046 ret = ACE_OS::strcat (ret, ".xml");
00047 ACE_OS::free (buf);
00048 return ret;
00049 }
00050
00051 return 0;
00052 }
00053
00054 char*
00055 QOS_XML_Loader::get_profile_name (const char * qos_profile)
00056 {
00057 if (qos_profile)
00058 {
00059 char* buf = ACE_OS::strdup (qos_profile);
00060 ACE_Tokenizer_T<char> tok (buf);
00061 tok.delimiter_replace ('#', 0);
00062 const char * lib_name = tok.next ();
00063 const char * prof_name = tok.next ();
00064
00065 if (lib_name == 0 || prof_name == 0 || tok.next () != 0)
00066 {
00067 ACE_OS::free (buf);
00068 if (DCPS_debug_level > 5)
00069 {
00070 ACE_ERROR ((LM_ERROR,
00071 "get_profile_name <%C> - "
00072 "Error: malformed qos_profile. Expected format: "
00073 "<xml_file_base_name>#<profile_name>\n",
00074 qos_profile));
00075 }
00076 return 0;
00077 }
00078
00079 char * ret = ACE_OS::strdup (prof_name);
00080 ACE_OS::free (buf);
00081 return ret;
00082 }
00083
00084 return 0;
00085 }
00086
00087
00088 DDS::ReturnCode_t
00089 QOS_XML_Loader::init (const char * qos_profile)
00090 {
00091 if (!qos_profile)
00092 {
00093 if (DCPS_debug_level > 5)
00094 {
00095 ACE_ERROR ((LM_ERROR,
00096 ACE_TEXT ("QOS_XML_Loader::init - ")
00097 ACE_TEXT ("Passed an empty qos_profile, returning.\n")));
00098 }
00099 return ::DDS::RETCODE_BAD_PARAMETER;
00100 }
00101
00102 char *filename = this->get_xml_file_name (qos_profile);
00103
00104 if (!filename)
00105 {
00106 if (DCPS_debug_level > 5)
00107 {
00108 ACE_ERROR ((LM_ERROR,
00109 ACE_TEXT ("QOS_XML_Loader::init - ")
00110 ACE_TEXT ("Unable to extract a file name from <%C>, returning.\n"),
00111 qos_profile));
00112 }
00113 return ::DDS::RETCODE_BAD_PARAMETER;
00114 }
00115
00116 this->xml_file_.add_search_path (
00117 ACE_TEXT("DDS_ROOT"),
00118 ACE_TEXT("/docs/schema/"));
00119
00120 DDS::ReturnCode_t const retcode = this->xml_file_.init (filename);
00121
00122 ACE_OS::free (filename);
00123
00124 return retcode;
00125 }
00126
00127 DDS::ReturnCode_t
00128 QOS_XML_Loader::get_datawriter_qos (
00129 ::DDS::DataWriterQos& dw_qos,
00130 const char * qos_profile,
00131 const char * topic_name)
00132 {
00133 if (!qos_profile)
00134 {
00135 if (DCPS_debug_level > 9)
00136 {
00137 ACE_DEBUG ((LM_DEBUG,
00138 ACE_TEXT ("QOS_XML_Loader::get_datawriter_qos - ")
00139 ACE_TEXT ("No QOS profile provided. Can't do anything, ")
00140 ACE_TEXT ("returning\n")));
00141 }
00142
00143 return DDS::RETCODE_OK;
00144 }
00145
00146 char* profile_name = this->get_profile_name (qos_profile);
00147
00148 if (!profile_name)
00149 {
00150 if (DCPS_debug_level > 5)
00151 {
00152 ACE_ERROR ((LM_ERROR,
00153 ACE_TEXT ("QOS_XML_Loader::get_datawriter_qos - ")
00154 ACE_TEXT ("Error parsing profile string <%C>, returning.\n"),
00155 qos_profile));
00156 }
00157 return ::DDS::RETCODE_BAD_PARAMETER;
00158 }
00159
00160 DDS::ReturnCode_t retcode = DDS::RETCODE_OK;
00161
00162 try
00163 {
00164 retcode = this->xml_file_.get_datawriter_qos (dw_qos,
00165 profile_name,
00166 topic_name);
00167 }
00168 catch (...)
00169 {
00170 if (DCPS_debug_level > 5)
00171 {
00172 ACE_ERROR ((LM_ERROR,
00173 ACE_TEXT ("QOS_XML_Loader::get_datawriter_qos - ")
00174 ACE_TEXT ("Caught unexpected exception.\n")));
00175 }
00176 retcode = DDS::RETCODE_ERROR;
00177 }
00178 ACE_OS::free (profile_name);
00179 return retcode;
00180 }
00181
00182 DDS::ReturnCode_t
00183 QOS_XML_Loader::get_datareader_qos (
00184 DDS::DataReaderQos& dr_qos,
00185 const char * qos_profile,
00186 const char * topic_name)
00187 {
00188 if (!qos_profile)
00189 {
00190 if (DCPS_debug_level > 9)
00191 {
00192 ACE_DEBUG ((LM_DEBUG,
00193 ACE_TEXT ("QOS_XML_Loader::get_datareader_qos - ")
00194 ACE_TEXT ("No QOS profile provided. Can't do anything, ")
00195 ACE_TEXT ("returning\n")));
00196 }
00197
00198 return DDS::RETCODE_OK;
00199 }
00200
00201 char* profile_name = this->get_profile_name (qos_profile);
00202
00203 if (!profile_name)
00204 {
00205 if (DCPS_debug_level > 5)
00206 {
00207 ACE_ERROR ((LM_ERROR,
00208 ACE_TEXT ("QOS_XML_Loader::get_datareader_qos - ")
00209 ACE_TEXT ("Error parsing profile string <%C>, returning.\n"),
00210 qos_profile));
00211 }
00212 return ::DDS::RETCODE_BAD_PARAMETER;
00213 }
00214
00215 DDS::ReturnCode_t retcode = DDS::RETCODE_OK;
00216
00217 try
00218 {
00219 retcode = this->xml_file_.get_datareader_qos (dr_qos,
00220 profile_name,
00221 topic_name);
00222 }
00223 catch (...)
00224 {
00225 if (DCPS_debug_level > 5)
00226 {
00227 ACE_ERROR ((LM_ERROR,
00228 ACE_TEXT ("QOS_XML_Loader::get_datareader_qos - ")
00229 ACE_TEXT ("Caught unexpected exception.\n")));
00230 }
00231 retcode = ::DDS::RETCODE_ERROR;
00232 }
00233 ACE_OS::free (profile_name);
00234
00235 return retcode;
00236 }
00237
00238 DDS::ReturnCode_t
00239 QOS_XML_Loader::get_publisher_qos (
00240 DDS::PublisherQos& pub_qos,
00241 const char * qos_profile)
00242 {
00243 if (!qos_profile)
00244 {
00245 if (DCPS_debug_level > 9)
00246 {
00247 ACE_DEBUG ((LM_DEBUG,
00248 ACE_TEXT ("QOS_XML_Loader::get_publisher_qos - ")
00249 ACE_TEXT ("No QOS profile provided. Can't do anything, ")
00250 ACE_TEXT ("returning\n")));
00251 }
00252
00253 return DDS::RETCODE_OK;
00254 }
00255
00256 char* profile_name = this->get_profile_name (qos_profile);
00257
00258 if (!profile_name)
00259 {
00260 if (DCPS_debug_level > 5)
00261 {
00262 ACE_ERROR ((LM_ERROR,
00263 ACE_TEXT ("QOS_XML_Loader::get_publisher_qos - ")
00264 ACE_TEXT ("Error parsing profile string <%C>, returning.\n"),
00265 qos_profile));
00266 }
00267 return ::DDS::RETCODE_BAD_PARAMETER;
00268 }
00269
00270 DDS::ReturnCode_t retcode = DDS::RETCODE_OK;
00271
00272 try
00273 {
00274 retcode = this->xml_file_.get_publisher_qos (pub_qos, profile_name);
00275 }
00276 catch (...)
00277 {
00278 if (DCPS_debug_level > 5)
00279 {
00280 ACE_ERROR ((LM_ERROR,
00281 ACE_TEXT ("QOS_XML_Loader::get_publisher_qos - ")
00282 ACE_TEXT ("Caught unexpected exception.\n")));
00283 }
00284 retcode = DDS::RETCODE_ERROR;
00285 }
00286 ACE_OS::free (profile_name);
00287
00288 return retcode;
00289 }
00290
00291 DDS::ReturnCode_t
00292 QOS_XML_Loader::get_subscriber_qos (
00293 DDS::SubscriberQos& sub_qos,
00294 const char * qos_profile)
00295 {
00296 if (!qos_profile)
00297 {
00298 if (DCPS_debug_level > 9)
00299 {
00300 ACE_DEBUG ((LM_DEBUG,
00301 ACE_TEXT ("QOS_XML_Loader::get_subscriber_qos - ")
00302 ACE_TEXT ("No QOS profile provided. Can't do anything, ")
00303 ACE_TEXT ("returning\n")));
00304 }
00305
00306 return DDS::RETCODE_OK;
00307 }
00308
00309 char* profile_name = this->get_profile_name (qos_profile);
00310
00311 if (!profile_name)
00312 {
00313 if (DCPS_debug_level > 5)
00314 {
00315 ACE_ERROR ((LM_ERROR,
00316 ACE_TEXT ("QOS_XML_Loader::get_subscriber_qos - ")
00317 ACE_TEXT ("Error parsing profile string <%C>, returning.\n"),
00318 qos_profile));
00319 }
00320 return ::DDS::RETCODE_BAD_PARAMETER;
00321 }
00322
00323 DDS::ReturnCode_t retcode = DDS::RETCODE_OK;
00324
00325 try
00326 {
00327 retcode = this->xml_file_.get_subscriber_qos (sub_qos, profile_name);
00328 }
00329 catch (...)
00330 {
00331 if (DCPS_debug_level > 5)
00332 {
00333 ACE_ERROR ((LM_ERROR,
00334 ACE_TEXT ("QOS_XML_Loader::get_subscriber_qos - ")
00335 ACE_TEXT ("Caught unexpected exception.\n")));
00336 }
00337 retcode = DDS::RETCODE_ERROR;
00338 }
00339
00340 ACE_OS::free (profile_name);
00341
00342 return retcode;
00343 }
00344
00345 DDS::ReturnCode_t
00346 QOS_XML_Loader::get_topic_qos (
00347 DDS::TopicQos& topic_qos,
00348 const char * qos_profile,
00349 const char * topic_name)
00350 {
00351 if (!qos_profile)
00352 {
00353 if (DCPS_debug_level > 9)
00354 {
00355 ACE_DEBUG ((LM_DEBUG,
00356 ACE_TEXT ("QOS_XML_Loader::get_topic_qos - ")
00357 ACE_TEXT ("No QOS profile provided. Can't do anything, ")
00358 ACE_TEXT ("returning\n")));
00359 }
00360
00361 return DDS::RETCODE_OK;
00362 }
00363
00364 char* profile_name = this->get_profile_name (qos_profile);
00365
00366 if (!profile_name)
00367 {
00368 if (DCPS_debug_level > 5)
00369 {
00370 ACE_ERROR ((LM_ERROR,
00371 ACE_TEXT ("QOS_XML_Loader::get_topic_qos - ")
00372 ACE_TEXT ("Error parsing profile string <%C>, returning.\n"),
00373 qos_profile));
00374 }
00375 return ::DDS::RETCODE_BAD_PARAMETER;
00376 }
00377
00378 DDS::ReturnCode_t retcode = DDS::RETCODE_OK;
00379
00380 try
00381 {
00382 retcode = this->xml_file_.get_topic_qos (topic_qos,
00383 profile_name,
00384 topic_name);
00385 }
00386 catch (...)
00387 {
00388 if (DCPS_debug_level > 5)
00389 {
00390 ACE_ERROR ((LM_ERROR,
00391 ACE_TEXT ("QOS_XML_Loader::get_topic_qos - ")
00392 ACE_TEXT ("Caught unexpected exception.\n")));
00393 }
00394 retcode = DDS::RETCODE_ERROR;
00395 }
00396
00397 ACE_OS::free (profile_name);
00398
00399 return retcode;
00400 }
00401
00402 DDS::ReturnCode_t
00403 QOS_XML_Loader::get_participant_qos (
00404 DDS::DomainParticipantQos& part_qos,
00405 const char * qos_profile)
00406 {
00407 if (!qos_profile)
00408 {
00409 if (DCPS_debug_level > 9)
00410 {
00411 ACE_DEBUG ((LM_DEBUG,
00412 ACE_TEXT ("QOS_XML_Loader::get_participant_qos - ")
00413 ACE_TEXT ("No QOS profile provided. Can't do anything, ")
00414 ACE_TEXT ("returning\n")));
00415 }
00416
00417 return DDS::RETCODE_OK;
00418 }
00419
00420 char* profile_name = this->get_profile_name (qos_profile);
00421
00422 if (!profile_name)
00423 {
00424 if (DCPS_debug_level > 5)
00425 {
00426 ACE_ERROR ((LM_ERROR,
00427 ACE_TEXT ("QOS_XML_Loader::get_participant_qos - ")
00428 ACE_TEXT ("Error parsing profile string <%C>, returning.\n"),
00429 qos_profile));
00430 }
00431 return ::DDS::RETCODE_BAD_PARAMETER;
00432 }
00433
00434 DDS::ReturnCode_t retcode = DDS::RETCODE_OK;
00435
00436 try
00437 {
00438 retcode = this->xml_file_.get_participant_qos (part_qos, profile_name);
00439 }
00440 catch (...)
00441 {
00442 if (DCPS_debug_level > 5)
00443 {
00444 ACE_ERROR ((LM_ERROR,
00445 ACE_TEXT ("QOS_XML_Loader::get_participant_qos - ")
00446 ACE_TEXT ("Caught unexpected exception.\n")));
00447 }
00448 retcode = DDS::RETCODE_ERROR;
00449 }
00450
00451 ACE_OS::free (profile_name);
00452
00453 return retcode;
00454 }
00455 }
00456 }
00457
00458 OPENDDS_END_VERSIONED_NAMESPACE_DECL