|  | /* This program takes a command line argument and encodes a message in | 
|  | * one of MsgType1, MsgType2 or MsgType3. | 
|  | */ | 
|  |  | 
|  | #include <stdio.h> | 
|  | #include <string.h> | 
|  | #include <stdlib.h> | 
|  |  | 
|  | #include <pb_encode.h> | 
|  | #include "unionproto.pb.h" | 
|  |  | 
|  | /* This function is the core of the union encoding process. It handles | 
|  | * the top-level pb_field_t array manually, in order to encode a correct | 
|  | * field tag before the message. The pointer to MsgType_fields array is | 
|  | * used as an unique identifier for the message type. | 
|  | */ | 
|  | bool encode_unionmessage(pb_ostream_t *stream, const pb_field_t messagetype[], const void *message) | 
|  | { | 
|  | const pb_field_t *field; | 
|  | for (field = UnionMessage_fields; field->tag != 0; field++) | 
|  | { | 
|  | if (field->ptr == messagetype) | 
|  | { | 
|  | /* This is our field, encode the message using it. */ | 
|  | if (!pb_encode_tag_for_field(stream, field)) | 
|  | return false; | 
|  |  | 
|  | return pb_encode_submessage(stream, messagetype, message); | 
|  | } | 
|  | } | 
|  |  | 
|  | /* Didn't find the field for messagetype */ | 
|  | return false; | 
|  | } | 
|  |  | 
|  | int main(int argc, char **argv) | 
|  | { | 
|  | if (argc != 2) | 
|  | { | 
|  | fprintf(stderr, "Usage: %s (1|2|3)\n", argv[0]); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | uint8_t buffer[512]; | 
|  | pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer)); | 
|  |  | 
|  | bool status = false; | 
|  | int msgtype = atoi(argv[1]); | 
|  | if (msgtype == 1) | 
|  | { | 
|  | /* Send message of type 1 */ | 
|  | MsgType1 msg = {42}; | 
|  | status = encode_unionmessage(&stream, MsgType1_fields, &msg); | 
|  | } | 
|  | else if (msgtype == 2) | 
|  | { | 
|  | /* Send message of type 2 */ | 
|  | MsgType2 msg = {true}; | 
|  | status = encode_unionmessage(&stream, MsgType2_fields, &msg); | 
|  | } | 
|  | else if (msgtype == 3) | 
|  | { | 
|  | /* Send message of type 3 */ | 
|  | MsgType3 msg = {3, 1415}; | 
|  | status = encode_unionmessage(&stream, MsgType3_fields, &msg); | 
|  | } | 
|  | else | 
|  | { | 
|  | fprintf(stderr, "Unknown message type: %d\n", msgtype); | 
|  | return 2; | 
|  | } | 
|  |  | 
|  | if (!status) | 
|  | { | 
|  | fprintf(stderr, "Encoding failed!\n"); | 
|  | return 3; | 
|  | } | 
|  | else | 
|  | { | 
|  | fwrite(buffer, 1, stream.bytes_written, stdout); | 
|  | return 0; /* Success */ | 
|  | } | 
|  | } | 
|  |  | 
|  |  |