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
00037 #if !defined( _OESS_1__TLV__BASIC_STRING_HPP_ )
00038 #define _OESS_1__TLV__BASIC_STRING_HPP_
00039
00040 #include <oess_1/tlv/h/declspec.hpp>
00041
00042 #include <string>
00043
00044 #include <auto_ptr_3/h/vect_ptr.hpp>
00045
00046 #include <oess_1/io/h/bin_data_size.hpp>
00047
00048 #include <oess_1/tlv/h/base.hpp>
00049 #include <oess_1/tlv/h/default_processors.hpp>
00050
00051 namespace oess_1
00052 {
00053
00054 namespace tlv
00055 {
00056
00057
00058
00059
00060
00062
00070 template< class Tag_type,
00071 class Char = oess_1::char_t,
00072 class Tag_processor = default_tag_processor_t< Tag_type >,
00073 class Length_processor = default_length_processor_t< Tag_type > >
00074 class basic_string_tlv_t :
00075 public tlv_base_t
00076 {
00077 public :
00079 typedef std::basic_string< Char > string_type_t;
00080
00082 typedef string_type_t value_type_t;
00083
00086 typedef basic_string_tlv_t< Tag_type, Char,
00087 Tag_processor, Length_processor >
00088 self_t;
00089
00090 private :
00092 Tag_processor m_tag;
00093
00095 Length_processor m_length;
00096
00098 string_type_t m_value;
00099
00100 public :
00102 basic_string_tlv_t( Tag_type id )
00103 :
00104 m_tag( id )
00105 {
00106 }
00107
00109 basic_string_tlv_t(
00110 Tag_type id,
00111 const string_type_t & value )
00112 :
00113 m_tag( id ),
00114 m_value( value )
00115 {
00116 }
00117
00119 basic_string_tlv_t(
00120 const self_t & o )
00121 :
00122 m_tag( o.m_tag ),
00123 m_length( o.m_length ),
00124 m_value( o.m_value )
00125 {
00126 }
00127
00128 virtual ~basic_string_tlv_t()
00129 {
00130 }
00131
00133 self_t &
00134 operator=( const self_t & o )
00135 {
00136 if( &o != this )
00137 {
00138 m_tag = o.m_tag;
00139 m_length = o.m_length;
00140 m_value = o.m_value;
00141 }
00142 return *this;
00143 }
00144
00146 const string_type_t &
00147 query_value() const
00148 {
00149 return m_value;
00150 }
00151
00153 void
00154 set_value(
00156 const string_type_t & value )
00157 {
00158 m_value = value;
00159 }
00160
00162 virtual default_tag_type_t
00163 tlv_tag() const
00164 {
00165 return m_tag.query_tag();
00166 }
00167
00171 virtual size_t
00172 tlv_size() const
00173 {
00174 size_t length = m_value.length() *
00175 oess_1::io::bin_data_size_t< Char >::image_size;
00176 length += m_length.tlv_length_size( length );
00177 length += m_tag.tlv_tag_size();
00178
00179 return length;
00180 }
00181
00183
00188 virtual void
00189 tlv_unpack(
00192 oess_1::io::ibinstream_t & s,
00194 default_tag_type_t )
00195 {
00196 size_t length;
00197 m_length.tlv_unpack_length( s, length );
00198 if( length )
00199 {
00200 auto_ptr_3::vect_ptr_t< Char > tmp(
00201 new Char[ length ], length );
00202 s.read( tmp.query(), length );
00203
00204 m_value.assign( tmp.query(), length );
00205 }
00206 else
00207
00208 m_value.erase( m_value.begin(), m_value.end() );
00209 }
00210
00212
00217 virtual void
00218 tlv_pack(
00221 oess_1::io::obinstream_t & s ) const
00222 {
00223 size_t length = m_value.length() *
00224 oess_1::io::bin_data_size_t< Char >::image_size;
00225
00226 m_tag.tlv_pack_tag( s );
00227 m_length.tlv_pack_length( s, length );
00228 if( length )
00229 s.write( m_value.data(), m_value.length() );
00230 }
00231 };
00232
00233 }
00234
00235 }
00236
00237 #endif
00238