1 /*
2
3 Copyright (c) 2002-2008, Yauheni Akhotnikau
4 Copyright (c) 2008-2013, The SObjectizer Project
5 All rights reserved.
6
7 Redistribution and use in source and binary forms, with or without
8 modification, are permitted provided that the following conditions are met:
9
10 - Redistributions of source code must retain the above copyright notice, this
11 list of conditions and the following disclaimer.
12
13 - Redistributions in binary form must reproduce the above copyright notice, this
14 list of conditions and the following disclaimer in the documentation and/or
15 other materials provided with the distribution.
16
17 - The name of the author may not be used to endorse or promote products derived
18 from this software without specific prior written permission.
19
20 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
21 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
22 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
23 EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
25 OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
28 IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
29 OF SUCH DAMAGE.
30
31 */
32
33 /*
34 ObjESSty
35 */
36
37 #include <iostream>
38 #include <exception>
39
40 #include <oess_2/io/h/mem_buf.hpp>
41
42 #include <oess_2/tlv/h/basic_string.hpp>
43 #include <oess_2/tlv/h/scalar.hpp>
44 #include <oess_2/tlv/h/tagged_scalar_wrapper.hpp>
45 #include <oess_2/tlv/h/compound.hpp>
46
47 typedef oess_2::uchar_t tag_type_t;
48
49 typedef oess_2::tlv::scalar_tlv_t< tag_type_t, oess_2::uint_t >
50 uint_scalar_tlv_t;
51
52 typedef oess_2::tlv::basic_string_tlv_t< tag_type_t, oess_2::char_t >
53 string_tlv_t;
54
55 const tag_type_t c_tag_scalar = 0x10;
56 const tag_type_t c_tag_string = 0x20;
57
58 typedef oess_2::tlv::compound_tlv_t<tag_type_t > compound_t;
59 class my_compound_tlv_t :
60 public compound_t
61 {
62 private :
63 oess_2::tlv::tagged_scalar_wrapper_t<
64 0x02, string_tlv_t >
65 m_member_1;
66 const tlv_add_t m_member_1_inserter;
67
68 oess_2::tlv::tagged_scalar_wrapper_t<
69 0x03, string_tlv_t >
70 m_member_2;
71 const tlv_add_t m_member_2_inserter;
72
73 oess_2::tlv::tagged_scalar_wrapper_t<
74 0x04, oess_2::tlv::scalar_tlv_t<
75 tag_type_t, oess_2::uint_t > >
76 m_member_3;
77 const tlv_add_t m_member_3_inserter;
78
79 oess_2::tlv::tagged_scalar_wrapper_t<
80 0x05, oess_2::tlv::scalar_tlv_t<
81 tag_type_t, oess_2::ushort_t > >
82 m_member_4;
83 const tlv_add_t m_member_4_inserter;
84
85 oess_2::tlv::tagged_scalar_wrapper_t<
86 c_tag_scalar, uint_scalar_tlv_t >
87 m_member_5;
88 const tlv_add_t m_member_5_inserter;
89
90 oess_2::tlv::tagged_scalar_wrapper_t<
91 c_tag_string, string_tlv_t >
92 m_member_6;
93 const tlv_add_t m_member_6_inserter;
94
95 public :
my_compound_tlv_t(const std::string & member_1,const std::string & member_2,oess_2::uint_t member_3,oess_2::ushort_t member_4,oess_2::uint_t member_5,const std::string & member_6)96 my_compound_tlv_t(
97 const std::string & member_1,
98 const std::string & member_2,
99 oess_2::uint_t member_3,
100 oess_2::ushort_t member_4,
101 oess_2::uint_t member_5,
102 const std::string & member_6 )
103 :
104 compound_t( 0x01 ),
105 m_member_1( member_1 ),
106 m_member_1_inserter( tlv_self(), m_member_1 ),
107
108 m_member_2( member_2 ),
109 m_member_2_inserter( tlv_self(), m_member_2 ),
110
111 m_member_3( member_3 ),
112 m_member_3_inserter( tlv_self(), m_member_3 ),
113
114 m_member_4( member_4 ),
115 m_member_4_inserter( tlv_self(), m_member_4 ),
116
117 m_member_5( member_5 ),
118 m_member_5_inserter( tlv_self(), m_member_5 ),
119
120 m_member_6( member_6 ),
121 m_member_6_inserter( tlv_self(), m_member_6 )
122 {
123 }
124
my_compound_tlv_t()125 my_compound_tlv_t()
126 :
127 compound_t( 0x01 ),
128 m_member_1_inserter( tlv_self(), m_member_1 ),
129 m_member_2_inserter( tlv_self(), m_member_2 ),
130 m_member_3_inserter( tlv_self(), m_member_3 ),
131 m_member_4_inserter( tlv_self(), m_member_4 ),
132 m_member_5_inserter( tlv_self(), m_member_5 ),
133 m_member_6_inserter( tlv_self(), m_member_6 )
134 {
135 }
136
137 std::ostream &
show(std::ostream & s) const138 show( std::ostream & s ) const
139 {
140 return ( s << "member_1: "
141 << m_member_1.query_value()
142 << ", member_2: "
143 << m_member_2.query_value()
144 << ", member_3: "
145 << m_member_3.query_value()
146 << ", member_4: "
147 << m_member_4.query_value()
148 << ", member_5: "
149 << m_member_5.query_value()
150 << ", member_6: "
151 << m_member_6.query_value() );
152 }
153 };
154
155 std::ostream &
operator <<(std::ostream & s,const my_compound_tlv_t & o)156 operator<<( std::ostream & s, const my_compound_tlv_t & o )
157 {
158 return o.show( s );
159 }
160
161 void
write_to(oess_2::io::obinstream_t & s)162 write_to(
163 oess_2::io::obinstream_t & s )
164 {
165 my_compound_tlv_t t1( "hello", "", 5, 6, 100, "-100-" );
166 my_compound_tlv_t t2( "", "hello", 7, 8, 200, "-200-" );
167
168 s << t1 << t2;
169 }
170
171 void
read_from(oess_2::io::ibinstream_t & s)172 read_from(
173 oess_2::io::ibinstream_t & s )
174 {
175 oess_2::tlv::default_tag_processor_t< tag_type_t > tag;
176
177 while( !s.eof() )
178 {
179 s >> tag;
180 std::cout << "Tag: " << tag.query_tag() << std::endl;
181 my_compound_tlv_t t;
182 t.tlv_unpack( s, tag.query_tag() );
183
184 std::cout << "Value: " << t << std::endl;
185 }
186 }
187
188 void
do_test()189 do_test()
190 {
191 oess_2::io::mem_buf_t buf;
192
193 write_to( buf );
194
195 std::cout << "buf size: " << buf.size() << std::endl;
196 buf.set_pos( 0 );
197
198 read_from( buf );
199 }
200
201 int
main(int,char **)202 main( int, char ** )
203 {
204 try
205 {
206 do_test();
207 }
208 catch( std::exception & x )
209 {
210 std::cerr << "caught: " << x.what() << std::endl;
211 }
212
213 return 0;
214 }
215
216