xref: /aosp_15_r20/external/nanopb-c/examples/using_union_messages/encode.c (revision c8d645cafcee3f91213d30caa0fe303887010b9b)
1*c8d645caSAndroid Build Coastguard Worker /* This program takes a command line argument and encodes a message in
2*c8d645caSAndroid Build Coastguard Worker  * one of MsgType1, MsgType2 or MsgType3.
3*c8d645caSAndroid Build Coastguard Worker  */
4*c8d645caSAndroid Build Coastguard Worker 
5*c8d645caSAndroid Build Coastguard Worker #include <stdio.h>
6*c8d645caSAndroid Build Coastguard Worker #include <string.h>
7*c8d645caSAndroid Build Coastguard Worker #include <stdlib.h>
8*c8d645caSAndroid Build Coastguard Worker 
9*c8d645caSAndroid Build Coastguard Worker #include <pb_encode.h>
10*c8d645caSAndroid Build Coastguard Worker #include "unionproto.pb.h"
11*c8d645caSAndroid Build Coastguard Worker 
12*c8d645caSAndroid Build Coastguard Worker /* This function is the core of the union encoding process. It handles
13*c8d645caSAndroid Build Coastguard Worker  * the top-level pb_field_t array manually, in order to encode a correct
14*c8d645caSAndroid Build Coastguard Worker  * field tag before the message. The pointer to MsgType_fields array is
15*c8d645caSAndroid Build Coastguard Worker  * used as an unique identifier for the message type.
16*c8d645caSAndroid Build Coastguard Worker  */
encode_unionmessage(pb_ostream_t * stream,const pb_field_t messagetype[],const void * message)17*c8d645caSAndroid Build Coastguard Worker bool encode_unionmessage(pb_ostream_t *stream, const pb_field_t messagetype[], const void *message)
18*c8d645caSAndroid Build Coastguard Worker {
19*c8d645caSAndroid Build Coastguard Worker     const pb_field_t *field;
20*c8d645caSAndroid Build Coastguard Worker     for (field = UnionMessage_fields; field->tag != 0; field++)
21*c8d645caSAndroid Build Coastguard Worker     {
22*c8d645caSAndroid Build Coastguard Worker         if (field->ptr == messagetype)
23*c8d645caSAndroid Build Coastguard Worker         {
24*c8d645caSAndroid Build Coastguard Worker             /* This is our field, encode the message using it. */
25*c8d645caSAndroid Build Coastguard Worker             if (!pb_encode_tag_for_field(stream, field))
26*c8d645caSAndroid Build Coastguard Worker                 return false;
27*c8d645caSAndroid Build Coastguard Worker 
28*c8d645caSAndroid Build Coastguard Worker             return pb_encode_submessage(stream, messagetype, message);
29*c8d645caSAndroid Build Coastguard Worker         }
30*c8d645caSAndroid Build Coastguard Worker     }
31*c8d645caSAndroid Build Coastguard Worker 
32*c8d645caSAndroid Build Coastguard Worker     /* Didn't find the field for messagetype */
33*c8d645caSAndroid Build Coastguard Worker     return false;
34*c8d645caSAndroid Build Coastguard Worker }
35*c8d645caSAndroid Build Coastguard Worker 
main(int argc,char ** argv)36*c8d645caSAndroid Build Coastguard Worker int main(int argc, char **argv)
37*c8d645caSAndroid Build Coastguard Worker {
38*c8d645caSAndroid Build Coastguard Worker     if (argc != 2)
39*c8d645caSAndroid Build Coastguard Worker     {
40*c8d645caSAndroid Build Coastguard Worker         fprintf(stderr, "Usage: %s (1|2|3)\n", argv[0]);
41*c8d645caSAndroid Build Coastguard Worker         return 1;
42*c8d645caSAndroid Build Coastguard Worker     }
43*c8d645caSAndroid Build Coastguard Worker 
44*c8d645caSAndroid Build Coastguard Worker     uint8_t buffer[512];
45*c8d645caSAndroid Build Coastguard Worker     pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
46*c8d645caSAndroid Build Coastguard Worker 
47*c8d645caSAndroid Build Coastguard Worker     bool status = false;
48*c8d645caSAndroid Build Coastguard Worker     int msgtype = atoi(argv[1]);
49*c8d645caSAndroid Build Coastguard Worker     if (msgtype == 1)
50*c8d645caSAndroid Build Coastguard Worker     {
51*c8d645caSAndroid Build Coastguard Worker         /* Send message of type 1 */
52*c8d645caSAndroid Build Coastguard Worker         MsgType1 msg = {42};
53*c8d645caSAndroid Build Coastguard Worker         status = encode_unionmessage(&stream, MsgType1_fields, &msg);
54*c8d645caSAndroid Build Coastguard Worker     }
55*c8d645caSAndroid Build Coastguard Worker     else if (msgtype == 2)
56*c8d645caSAndroid Build Coastguard Worker     {
57*c8d645caSAndroid Build Coastguard Worker         /* Send message of type 2 */
58*c8d645caSAndroid Build Coastguard Worker         MsgType2 msg = {true};
59*c8d645caSAndroid Build Coastguard Worker         status = encode_unionmessage(&stream, MsgType2_fields, &msg);
60*c8d645caSAndroid Build Coastguard Worker     }
61*c8d645caSAndroid Build Coastguard Worker     else if (msgtype == 3)
62*c8d645caSAndroid Build Coastguard Worker     {
63*c8d645caSAndroid Build Coastguard Worker         /* Send message of type 3 */
64*c8d645caSAndroid Build Coastguard Worker         MsgType3 msg = {3, 1415};
65*c8d645caSAndroid Build Coastguard Worker         status = encode_unionmessage(&stream, MsgType3_fields, &msg);
66*c8d645caSAndroid Build Coastguard Worker     }
67*c8d645caSAndroid Build Coastguard Worker     else
68*c8d645caSAndroid Build Coastguard Worker     {
69*c8d645caSAndroid Build Coastguard Worker         fprintf(stderr, "Unknown message type: %d\n", msgtype);
70*c8d645caSAndroid Build Coastguard Worker         return 2;
71*c8d645caSAndroid Build Coastguard Worker     }
72*c8d645caSAndroid Build Coastguard Worker 
73*c8d645caSAndroid Build Coastguard Worker     if (!status)
74*c8d645caSAndroid Build Coastguard Worker     {
75*c8d645caSAndroid Build Coastguard Worker         fprintf(stderr, "Encoding failed!\n");
76*c8d645caSAndroid Build Coastguard Worker         return 3;
77*c8d645caSAndroid Build Coastguard Worker     }
78*c8d645caSAndroid Build Coastguard Worker     else
79*c8d645caSAndroid Build Coastguard Worker     {
80*c8d645caSAndroid Build Coastguard Worker         fwrite(buffer, 1, stream.bytes_written, stdout);
81*c8d645caSAndroid Build Coastguard Worker         return 0; /* Success */
82*c8d645caSAndroid Build Coastguard Worker     }
83*c8d645caSAndroid Build Coastguard Worker }
84*c8d645caSAndroid Build Coastguard Worker 
85*c8d645caSAndroid Build Coastguard Worker 
86