1*c8d645caSAndroid Build Coastguard Worker /* Encode a message using oneof fields */
2*c8d645caSAndroid Build Coastguard Worker
3*c8d645caSAndroid Build Coastguard Worker #include <stdio.h>
4*c8d645caSAndroid Build Coastguard Worker #include <stdlib.h>
5*c8d645caSAndroid Build Coastguard Worker #include <pb_encode.h>
6*c8d645caSAndroid Build Coastguard Worker #include "oneof.pb.h"
7*c8d645caSAndroid Build Coastguard Worker #include "test_helpers.h"
8*c8d645caSAndroid Build Coastguard Worker
main(int argc,char ** argv)9*c8d645caSAndroid Build Coastguard Worker int main(int argc, char **argv)
10*c8d645caSAndroid Build Coastguard Worker {
11*c8d645caSAndroid Build Coastguard Worker uint8_t buffer[OneOfMessage_size];
12*c8d645caSAndroid Build Coastguard Worker OneOfMessage msg = OneOfMessage_init_zero;
13*c8d645caSAndroid Build Coastguard Worker pb_ostream_t stream;
14*c8d645caSAndroid Build Coastguard Worker int option;
15*c8d645caSAndroid Build Coastguard Worker
16*c8d645caSAndroid Build Coastguard Worker if (argc != 2)
17*c8d645caSAndroid Build Coastguard Worker {
18*c8d645caSAndroid Build Coastguard Worker fprintf(stderr, "Usage: encode_oneof [number]\n");
19*c8d645caSAndroid Build Coastguard Worker return 1;
20*c8d645caSAndroid Build Coastguard Worker }
21*c8d645caSAndroid Build Coastguard Worker option = atoi(argv[1]);
22*c8d645caSAndroid Build Coastguard Worker
23*c8d645caSAndroid Build Coastguard Worker /* Prefix and suffix are used to test that the union does not disturb
24*c8d645caSAndroid Build Coastguard Worker * other fields in the same message. */
25*c8d645caSAndroid Build Coastguard Worker msg.prefix = 123;
26*c8d645caSAndroid Build Coastguard Worker
27*c8d645caSAndroid Build Coastguard Worker /* We encode one of the 'values' fields based on command line argument */
28*c8d645caSAndroid Build Coastguard Worker if (option == 1)
29*c8d645caSAndroid Build Coastguard Worker {
30*c8d645caSAndroid Build Coastguard Worker msg.which_values = OneOfMessage_first_tag;
31*c8d645caSAndroid Build Coastguard Worker msg.values.first = 999;
32*c8d645caSAndroid Build Coastguard Worker }
33*c8d645caSAndroid Build Coastguard Worker else if (option == 2)
34*c8d645caSAndroid Build Coastguard Worker {
35*c8d645caSAndroid Build Coastguard Worker msg.which_values = OneOfMessage_second_tag;
36*c8d645caSAndroid Build Coastguard Worker strcpy(msg.values.second, "abcd");
37*c8d645caSAndroid Build Coastguard Worker }
38*c8d645caSAndroid Build Coastguard Worker else if (option == 3)
39*c8d645caSAndroid Build Coastguard Worker {
40*c8d645caSAndroid Build Coastguard Worker msg.which_values = OneOfMessage_third_tag;
41*c8d645caSAndroid Build Coastguard Worker msg.values.third.array_count = 5;
42*c8d645caSAndroid Build Coastguard Worker msg.values.third.array[0] = 1;
43*c8d645caSAndroid Build Coastguard Worker msg.values.third.array[1] = 2;
44*c8d645caSAndroid Build Coastguard Worker msg.values.third.array[2] = 3;
45*c8d645caSAndroid Build Coastguard Worker msg.values.third.array[3] = 4;
46*c8d645caSAndroid Build Coastguard Worker msg.values.third.array[4] = 5;
47*c8d645caSAndroid Build Coastguard Worker }
48*c8d645caSAndroid Build Coastguard Worker
49*c8d645caSAndroid Build Coastguard Worker msg.suffix = 321;
50*c8d645caSAndroid Build Coastguard Worker
51*c8d645caSAndroid Build Coastguard Worker stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
52*c8d645caSAndroid Build Coastguard Worker
53*c8d645caSAndroid Build Coastguard Worker if (pb_encode(&stream, OneOfMessage_fields, &msg))
54*c8d645caSAndroid Build Coastguard Worker {
55*c8d645caSAndroid Build Coastguard Worker SET_BINARY_MODE(stdout);
56*c8d645caSAndroid Build Coastguard Worker fwrite(buffer, 1, stream.bytes_written, stdout);
57*c8d645caSAndroid Build Coastguard Worker return 0;
58*c8d645caSAndroid Build Coastguard Worker }
59*c8d645caSAndroid Build Coastguard Worker else
60*c8d645caSAndroid Build Coastguard Worker {
61*c8d645caSAndroid Build Coastguard Worker fprintf(stderr, "Encoding failed: %s\n", PB_GET_ERROR(&stream));
62*c8d645caSAndroid Build Coastguard Worker return 1;
63*c8d645caSAndroid Build Coastguard Worker }
64*c8d645caSAndroid Build Coastguard Worker }
65