| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 | /* 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 <pb_common.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_msgdesc_t *messagetype, void *message){    pb_field_iter_t iter;    if (!pb_field_iter_begin(&iter, UnionMessage_fields, message))        return false;    do    {        if (iter.submsg_desc == messagetype)        {            /* This is our field, encode the message using it. */            if (!pb_encode_tag_for_field(stream, &iter))                return false;                        return pb_encode_submessage(stream, messagetype, message);        }    } while (pb_field_iter_next(&iter));        /* 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 */    }}
 |