Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include <fstream>
00031 #include <sstream>
00032
00033 #ifdef RVIZ_HAVE_YAMLCPP_05
00034 #include <yaml-cpp/yaml.h>
00035 #else
00036 #include <yaml-cpp/node.h>
00037 #include <yaml-cpp/parser.h>
00038 #endif
00039
00040 #include "rviz/yaml_config_reader.h"
00041
00042 namespace rviz
00043 {
00044
00045 YamlConfigReader::YamlConfigReader()
00046 : error_( false )
00047 {}
00048
00049 void YamlConfigReader::readFile( Config& config, const QString& filename )
00050 {
00051 std::ifstream in( qPrintable( filename ));
00052 readStream( config, in, filename );
00053 }
00054
00055 void YamlConfigReader::readString( Config& config, const QString& data, const QString& filename )
00056 {
00057 std::stringstream ss( data.toStdString() );
00058 readStream( config, ss, filename );
00059 }
00060
00061 void YamlConfigReader::readStream( Config& config, std::istream& in, const QString& filename )
00062 {
00063 try
00064 {
00065 YAML::Node yaml_node;
00066 #ifdef RVIZ_HAVE_YAMLCPP_05
00067 yaml_node = YAML::Load(in);
00068 #else
00069 YAML::Parser parser( in );
00070 parser.GetNextDocument( yaml_node );
00071 #endif
00072 error_ = false;
00073 message_ = "";
00074 readYamlNode( config, yaml_node );
00075 }
00076 catch( YAML::ParserException& ex )
00077 {
00078 message_ = ex.what();
00079 error_ = true;
00080 }
00081 }
00082
00083 void YamlConfigReader::readYamlNode( Config& config, const YAML::Node& yaml_node )
00084 {
00085 switch( yaml_node.Type() )
00086 {
00087 case YAML::NodeType::Map:
00088 {
00089 #ifdef RVIZ_HAVE_YAMLCPP_05
00090 for( YAML::const_iterator it = yaml_node.begin(); it != yaml_node.end(); ++it )
00091 #else
00092 for( YAML::Iterator it = yaml_node.begin(); it != yaml_node.end(); ++it )
00093 #endif
00094 {
00095 std::string key;
00096 #ifdef RVIZ_HAVE_YAMLCPP_05
00097 key = it->first.as<std::string>();
00098 #else
00099 it.first() >> key;
00100 #endif
00101 Config child = config.mapMakeChild( QString::fromStdString( key ));
00102 #ifdef RVIZ_HAVE_YAMLCPP_05
00103 readYamlNode( child, it->second );
00104 #else
00105 readYamlNode( child, it.second() );
00106 #endif
00107 }
00108 break;
00109 }
00110 case YAML::NodeType::Sequence:
00111 {
00112 #ifdef RVIZ_HAVE_YAMLCPP_05
00113 for( YAML::const_iterator it = yaml_node.begin(); it != yaml_node.end(); ++it )
00114 #else
00115 for( YAML::Iterator it = yaml_node.begin(); it != yaml_node.end(); ++it )
00116 #endif
00117 {
00118 Config child = config.listAppendNew();
00119 readYamlNode( child, *it );
00120 }
00121 break;
00122 }
00123 case YAML::NodeType::Scalar:
00124 {
00125 std::string s;
00126 #ifdef RVIZ_HAVE_YAMLCPP_05
00127 s = yaml_node.as<std::string>();
00128 #else
00129 yaml_node >> s;
00130 #endif
00131 config.setValue( QString::fromStdString( s ));
00132 break;
00133 }
00134 case YAML::NodeType::Null:
00135 default:
00136 break;
00137 }
00138 }
00139
00140 bool YamlConfigReader::error()
00141 {
00142 return error_;
00143 }
00144
00145 QString YamlConfigReader::errorMessage()
00146 {
00147 return message_;
00148 }
00149
00150 }