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