summaryrefslogtreecommitdiff
path: root/examples/msg.c
blob: 487e7436028accfd44689fd9a2a851cf715f7f0f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/*
 * upb - a minimalist implementation of protocol buffers.
 *
 * Copyright (c) 2011 Google Inc.  See LICENSE for details.
 * Author: Josh Haberman <jhaberman@gmail.com>
 *
 * A simple example that demonstrates creating a standard message object
 * and parsing into it, using a dynamic reflection-based approach.
 *
 * Note that with this approach there are no strongly-typed struct or class
 * definitions to use from C -- this is essentially a reflection-based
 * interface.  Note that parsing and serializing are still very fast since
 * they are JIT-based.
 *
 * If this seems a bit verbose, you may prefer an approach that generates
 * strongly-typed struct definitions (upb will likely provide this, but it is
 * not yet implemented).
 *
 * TODO: make this file compiled as part of "make examples"
 * TODO: test that this actually works (WARNING: UNTESTED!)
 */

#include "upb/msg.h"
#include "upb/pb/glue.h"

const char *descfile = "example.proto.pb";
const char *type = "example.SampleMessage";
const char *msgfile = "sample_message.pb";

int main() {
  // First we load the descriptor that describes the message into a upb_msgdef.
  // This could come from a string that is compiled into the program or from a
  // separate file as we do here.  Since defs always live in a symtab, we
  // create one of those also.
  upb_symtab *s = upb_symtab_new();
  upb_status status = UPB_STATUS_INIT;
  if (!upb_load_descriptor_file_into_symtab(s, descfile, &status)) {
    fprintf(stderr, "Couldn't load descriptor file '%s': %s\n", descfile,
            upb_status_getstr(&status));
    return -1;
  }

  const upb_msgdef *md = upb_symtab_lookupmsg(s, type);
  if (!md) {
    fprintf(stderr, "Descriptor did not contain type '%s'\n", type);
    return -1;
  }

  // Parse a file into a new message object.
  void *msg = upb_filetonewmsg(msgfile, md, &status);
  if (!msg) {
    fprintf(stderr, "Error parsing message file '%s': %s\n", msgfile,
            upb_status_getstr(&status));
    return -1;
  }

  // TODO: Inspect some fields.
  return 0;
}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback