mirror of https://github.com/grpc/grpc.git
The C based gRPC (C++, Python, Ruby, Objective-C, PHP, C#)
https://grpc.io/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.2 KiB
88 lines
2.2 KiB
/* A very simple decoding test case, using person.proto. |
|
* Produces output compatible with protoc --decode. |
|
* Reads the encoded data from stdin and prints the values |
|
* to stdout as text. |
|
* |
|
* Run e.g. ./test_encode1 | ./test_decode1 |
|
*/ |
|
|
|
#include <stdio.h> |
|
#include <pb_decode.h> |
|
#include "person.pb.h" |
|
#include "test_helpers.h" |
|
|
|
/* This function is called once from main(), it handles |
|
the decoding and printing. */ |
|
bool print_person(pb_istream_t *stream) |
|
{ |
|
int i; |
|
Person person = Person_init_zero; |
|
|
|
if (!pb_decode(stream, Person_fields, &person)) |
|
return false; |
|
|
|
/* Now the decoding is done, rest is just to print stuff out. */ |
|
|
|
printf("name: \"%s\"\n", person.name); |
|
printf("id: %ld\n", (long)person.id); |
|
|
|
if (person.has_email) |
|
printf("email: \"%s\"\n", person.email); |
|
|
|
for (i = 0; i < person.phone_count; i++) |
|
{ |
|
Person_PhoneNumber *phone = &person.phone[i]; |
|
printf("phone {\n"); |
|
printf(" number: \"%s\"\n", phone->number); |
|
|
|
if (phone->has_type) |
|
{ |
|
switch (phone->type) |
|
{ |
|
case Person_PhoneType_WORK: |
|
printf(" type: WORK\n"); |
|
break; |
|
|
|
case Person_PhoneType_HOME: |
|
printf(" type: HOME\n"); |
|
break; |
|
|
|
case Person_PhoneType_MOBILE: |
|
printf(" type: MOBILE\n"); |
|
break; |
|
} |
|
} |
|
printf("}\n"); |
|
} |
|
|
|
return true; |
|
} |
|
|
|
int main() |
|
{ |
|
uint8_t buffer[Person_size]; |
|
pb_istream_t stream; |
|
size_t count; |
|
|
|
/* Read the data into buffer */ |
|
SET_BINARY_MODE(stdin); |
|
count = fread(buffer, 1, sizeof(buffer), stdin); |
|
|
|
if (!feof(stdin)) |
|
{ |
|
printf("Message does not fit in buffer\n"); |
|
return 1; |
|
} |
|
|
|
/* Construct a pb_istream_t for reading from the buffer */ |
|
stream = pb_istream_from_buffer(buffer, count); |
|
|
|
/* Decode and print out the stuff */ |
|
if (!print_person(&stream)) |
|
{ |
|
printf("Parsing failed: %s\n", PB_GET_ERROR(&stream)); |
|
return 1; |
|
} else { |
|
return 0; |
|
} |
|
}
|
|
|