17ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Encoding testcase for callback fields */
27ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
37ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <stdio.h>
47ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <string.h>
57ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <pb_encode.h>
67ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include "callbacks.pb.h"
77ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include "test_helpers.h"
87ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
97ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenbool encode_string(pb_ostream_t *stream, const pb_field_t *field, void * const *arg)
107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{
117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    char *str = "Hello world!";
127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    if (!pb_encode_tag_for_field(stream, field))
147ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        return false;
157ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
167ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    return pb_encode_string(stream, (uint8_t*)str, strlen(str));
177ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen}
187ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
197ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenbool encode_int32(pb_ostream_t *stream, const pb_field_t *field, void * const *arg)
207ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{
217ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    if (!pb_encode_tag_for_field(stream, field))
227ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        return false;
237ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
247ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    return pb_encode_varint(stream, 42);
257ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen}
267ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
277ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenbool encode_fixed32(pb_ostream_t *stream, const pb_field_t *field, void * const *arg)
287ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{
297ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    uint32_t value = 42;
307ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
317ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    if (!pb_encode_tag_for_field(stream, field))
327ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        return false;
337ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
347ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    return pb_encode_fixed32(stream, &value);
357ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen}
367ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
377ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenbool encode_fixed64(pb_ostream_t *stream, const pb_field_t *field, void * const *arg)
387ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{
397ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    uint64_t value = 42;
407ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
417ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    if (!pb_encode_tag_for_field(stream, field))
427ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        return false;
437ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
447ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    return pb_encode_fixed64(stream, &value);
457ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen}
467ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
477ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenbool encode_repeatedstring(pb_ostream_t *stream, const pb_field_t *field, void * const *arg)
487ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{
497ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    char *str[4] = {"Hello world!", "", "Test", "Test2"};
507ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    int i;
517ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
527ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    for (i = 0; i < 4; i++)
537ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    {
547ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        if (!pb_encode_tag_for_field(stream, field))
557ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen            return false;
567ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
577ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        if (!pb_encode_string(stream, (uint8_t*)str[i], strlen(str[i])))
587ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen            return false;
597ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    }
607ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    return true;
617ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen}
627ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
637ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenint main()
647ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{
657ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    uint8_t buffer[1024];
667ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    pb_ostream_t stream;
677ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TestMessage testmessage = {{{NULL}}};
687ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
697ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    stream = pb_ostream_from_buffer(buffer, 1024);
707ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
717ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    testmessage.stringvalue.funcs.encode = &encode_string;
727ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    testmessage.int32value.funcs.encode = &encode_int32;
737ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    testmessage.fixed32value.funcs.encode = &encode_fixed32;
747ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    testmessage.fixed64value.funcs.encode = &encode_fixed64;
757ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
767ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    testmessage.has_submsg = true;
777ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    testmessage.submsg.stringvalue.funcs.encode = &encode_string;
787ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    testmessage.submsg.int32value.funcs.encode = &encode_int32;
797ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    testmessage.submsg.fixed32value.funcs.encode = &encode_fixed32;
807ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    testmessage.submsg.fixed64value.funcs.encode = &encode_fixed64;
817ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
827ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    testmessage.repeatedstring.funcs.encode = &encode_repeatedstring;
837ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
847ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    if (!pb_encode(&stream, TestMessage_fields, &testmessage))
857ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        return 1;
867ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
877ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    SET_BINARY_MODE(stdout);
887ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    if (fwrite(buffer, stream.bytes_written, 1, stdout) != 1)
897ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        return 2;
907ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
917ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    return 0;
927ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen}
93