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
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef PI_PROPERTIES_TABLEHEADER_SERIALIZER
00039 #define PI_PROPERTIES_TABLEHEADER_SERIALIZER
00040
00041 #include <rtt/Property.hpp>
00042 #include <rtt/base/PropertyIntrospection.hpp>
00043 #include <rtt/marsh/StreamProcessor.hpp>
00044
00045 namespace RTT
00046 {
00054 template<typename o_stream>
00055 class TableHeaderMarshaller
00056 : public marsh::MarshallInterface, public marsh::StreamProcessor<o_stream>
00057 {
00058 int level;
00059 int line;
00060 std::vector<std::string> header;
00061 public:
00062 typedef o_stream output_stream;
00063 typedef o_stream OutputStream;
00064
00065 TableHeaderMarshaller(output_stream &os) :
00066 marsh::StreamProcessor<o_stream>(os), level(0), line(1)
00067 {
00068
00069 header.push_back(std::string(""));
00070 }
00071
00072 virtual ~TableHeaderMarshaller() {}
00073
00074 virtual void serialize(base::PropertyBase* v)
00075 {
00076 Property<PropertyBag>* bag = dynamic_cast< Property<PropertyBag>* >( v );
00077 if ( bag )
00078 this->serialize( *bag );
00079 else
00080 store( v->getName() );
00081 }
00082
00083
00084 virtual void serialize(const PropertyBag &v)
00085 {
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101 ++level;
00102
00103
00104 for (
00105 PropertyBag::const_iterator i = v.getProperties().begin();
00106 i != v.getProperties().end();
00107 i++ )
00108 {
00109
00110 this->serialize(*i);
00111 }
00112 --level;
00113
00114 }
00115
00119 int store(const std::string& s)
00120 {
00121 if ( line == int(header.size()) )
00122 {
00123
00124 header.push_back(std::string(""));
00125 }
00126 header[line-1] += std::string(" | ") + s;
00127
00128 return header[line-1].length();
00129 }
00130
00131 virtual void serialize(const Property<PropertyBag> &v)
00132 {
00133 if ( line == int(header.size() ) )
00134 header.push_back(std::string(""));
00138 if ( int(header[line-1].length()) - int(header[line].length()) > 0 )
00139 {
00140
00141 header[line] += std::string(" | ");
00142
00143 if ( int(header[line-1].length()) - int(header[line].length()) > 0 )
00144 header[line] += std::string( header[line-1].length() - header[line].length() ,' ');
00145 }
00146
00151 std::string name = v.getName();
00152 if ( v.get().getType() != "type_less")
00153 name+= std::string(" <") + v.get().getType() + std::string(">");
00154 store( name ) ;
00155
00159 line++;
00160 if ( v.get().getProperties().empty() )
00161 store( std::string("<empty>") );
00162 else
00163 serialize(v.get());
00164 line--;
00165
00169 if ( int(header[line].length()) - int(header[line -1].length()) > 0)
00170 header[line-1] += std::string( header[line].length() - header[line-1].length(), ' ');
00171 }
00172
00173 virtual void flush()
00174 {
00175 for (std::vector<std::string>::iterator it = header.begin(); it != header.end(); ++it)
00176 if ( !it->empty())
00177 *this->s << *it <<std::string(" |")<<std::endl;
00178
00179 level = 0;
00180 line = 1;
00181 header.clear();
00182 header.push_back(std::string(""));
00183 }
00184 };
00185 }
00186 #endif