132
135
%% I, D, T and F, as well as the QPid extensions b, d, f, l, s, t, x,
135
table_field_to_binary({FName, longstr, Value}) ->
136
[short_string_to_binary(FName), "S", long_string_to_binary(Value)];
138
table_field_to_binary({FName, signedint, Value}) ->
139
[short_string_to_binary(FName), "I", <<Value:32/signed>>];
141
table_field_to_binary({FName, decimal, {Before, After}}) ->
142
[short_string_to_binary(FName), "D", Before, <<After:32>>];
144
table_field_to_binary({FName, timestamp, Value}) ->
145
[short_string_to_binary(FName), "T", <<Value:64>>];
147
table_field_to_binary({FName, table, Value}) ->
148
[short_string_to_binary(FName), "F", table_to_binary(Value)];
150
table_field_to_binary({FName, byte, Value}) ->
151
[short_string_to_binary(FName), "b", <<Value:8/unsigned>>];
153
table_field_to_binary({FName, double, Value}) ->
154
[short_string_to_binary(FName), "d", <<Value:64/float>>];
156
table_field_to_binary({FName, float, Value}) ->
157
[short_string_to_binary(FName), "f", <<Value:32/float>>];
159
table_field_to_binary({FName, long, Value}) ->
160
[short_string_to_binary(FName), "l", <<Value:64/signed>>];
162
table_field_to_binary({FName, short, Value}) ->
163
[short_string_to_binary(FName), "s", <<Value:16/signed>>];
165
table_field_to_binary({FName, bool, Value}) ->
166
[short_string_to_binary(FName), "t", if Value -> 1; true -> 0 end];
168
table_field_to_binary({FName, binary, Value}) ->
169
[short_string_to_binary(FName), "x", long_string_to_binary(Value)];
171
table_field_to_binary({FName, void, _Value}) ->
172
[short_string_to_binary(FName), "V"].
138
table_field_to_binary({FName, Type, Value}) ->
139
[short_string_to_binary(FName) | field_value_to_binary(Type, Value)].
141
field_value_to_binary(longstr, Value) ->
142
["S", long_string_to_binary(Value)];
144
field_value_to_binary(signedint, Value) ->
145
["I", <<Value:32/signed>>];
147
field_value_to_binary(decimal, {Before, After}) ->
148
["D", Before, <<After:32>>];
150
field_value_to_binary(timestamp, Value) ->
153
field_value_to_binary(table, Value) ->
154
["F", table_to_binary(Value)];
156
field_value_to_binary(array, Value) ->
157
["A", array_to_binary(Value)];
159
field_value_to_binary(byte, Value) ->
160
["b", <<Value:8/unsigned>>];
162
field_value_to_binary(double, Value) ->
163
["d", <<Value:64/float>>];
165
field_value_to_binary(float, Value) ->
166
["f", <<Value:32/float>>];
168
field_value_to_binary(long, Value) ->
169
["l", <<Value:64/signed>>];
171
field_value_to_binary(short, Value) ->
172
["s", <<Value:16/signed>>];
174
field_value_to_binary(bool, Value) ->
175
["t", if Value -> 1; true -> 0 end];
177
field_value_to_binary(binary, Value) ->
178
["x", long_string_to_binary(Value)];
180
field_value_to_binary(void, _Value) ->
174
183
table_to_binary(Table) when is_list(Table) ->
175
184
BinTable = generate_table(Table),
176
185
[<<(size(BinTable)):32>>, BinTable].
187
array_to_binary(Array) when is_list(Array) ->
188
BinArray = generate_array(Array),
189
[<<(size(BinArray)):32>>, BinArray].
178
191
generate_table(Table) when is_list(Table) ->
179
192
list_to_binary(lists:map(fun table_field_to_binary/1, Table)).
194
generate_array(Array) when is_list(Array) ->
195
list_to_binary(lists:map(
196
fun ({Type, Value}) -> field_value_to_binary(Type, Value) end,
182
short_string_to_binary(String) when is_binary(String) and (size(String) < 256) ->
183
[<<(size(String)):8>>, String];
199
short_string_to_binary(String) when is_binary(String) ->
201
if Len < 256 -> [<<(size(String)):8>>, String];
202
true -> exit(content_properties_shortstr_overflow)
184
204
short_string_to_binary(String) ->
185
205
StringLength = length(String),
186
true = (StringLength < 256), % assertion
187
[<<StringLength:8>>, String].
206
if StringLength < 256 -> [<<StringLength:8>>, String];
207
true -> exit(content_properties_shortstr_overflow)
190
210
long_string_to_binary(String) when is_binary(String) ->
191
211
[<<(size(String)):32>>, String];
192
212
long_string_to_binary(String) ->
193
213
[<<(length(String)):32>>, String].
196
215
encode_properties([], []) ->
198
217
encode_properties(TypeList, ValueList) ->
238
260
encode_property(timestamp, Int) ->
239
261
<<Int:64/unsigned>>;
240
262
encode_property(table, Table) ->
244
encode_table(Table) ->
245
TableBin = list_to_binary(lists:map(fun encode_table_entry/1, Table)),
246
Len = size(TableBin),
247
<<Len:32/unsigned, TableBin:Len/binary>>.
250
encode_table_entry({Name, longstr, Value}) ->
253
<<NLen:8/unsigned, Name:NLen/binary, "S", VLen:32/unsigned, Value:VLen/binary>>;
254
encode_table_entry({Name, signedint, Value}) ->
256
<<NLen:8/unsigned, Name:NLen/binary, "I", Value:32/signed>>;
257
encode_table_entry({Name, decimal, {Before, After}}) ->
259
<<NLen:8/unsigned, Name:NLen/binary, "D", Before:8/unsigned, After:32/unsigned>>;
260
encode_table_entry({Name, timestamp, Value}) ->
262
<<NLen:8/unsigned, Name:NLen/binary, "T", Value:64/unsigned>>;
263
encode_table_entry({Name, table, Value}) ->
265
TableBin = encode_table(Value),
266
<<NLen:8/unsigned, Name:NLen/binary, "F", TableBin/binary>>.
263
table_to_binary(Table).
268
265
check_empty_content_body_frame_size() ->
269
266
%% Intended to ensure that EMPTY_CONTENT_BODY_FRAME_SIZE is