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