Hi,

I've done some experiment using protocol buffers extension but I kind
of wondering if I am doing things the right way. For the encoding I've
seen some explanation on the multi message encoding, and what I am
doing seems ok. On the other hand I am kind of suspicious about my
decoding routine.

my .proto file is pretty straightforward
message Message {
  extensions 50000 to max;
}
message Dummy {
  optional float x = 1;
  optional float y = 2;
}
message Foo {
  optional int v = 1;
}
extend Message {
  optional Dummy dummy = 50000;
}
extend Message {
optional Foo foo = 50001;
}

My encoding code look like :
int fd = open(argv[1], O_CREAT|O_RDONLY|O_WRONLY);
google::protobuf::io::ZeroCopyOutputStream* raw_output = new
google::protobuf::io::FileOutputStream(fd);
google::protobuf::io::CodedOutputStream* coded_output = new
google::protobuf::io::CodedOutputStream(raw_output);
ns_message::Message message;
ns_message::Dummy* dummy =
message.MutableExtension(ns_message::dummy);
dummy->set_x(5);
int size = message.ByteSize();
coded_output->WriteVarint32(size);
message.SerializeToCodedStream(coded_output);

message.ClearExtension(ns_message::dummy);
ns_message::Foo* zoom = message.MutableExtension(csi_message::zoom);
[encoding the same way....]


For the decoding here is what I am doing:

int fd = open(argv[1], O_RDONLY);
google::protobuf::io::ZeroCopyInputStream* raw_input = new
google::protobuf::io::FileInputStream(fd);
google::protobuf::io::CodedInputStream* coded_input = new
google::protobuf::io::CodedInputStream(raw_input);
ns_message::Message message;
google::protobuf::uint32 size;
while ( coded_input->ReadVarint32(&size) ) {
  int previous = coded_input->PushLimit(size);
  message.ParseFromCodedStream(coded_input);
  coded_input->PopLimit(previous);
  std::vector<const google::protobuf::FieldDescriptor*> fields;
  const google::protobuf::Reflection* reflection =
message.GetReflection();
  reflection->ListFields(message, &fields);
  for (int i = 0; i < fields.size(); ++i) {
    if (fields[i]->is_extension()) {
      getExtensionMessage(message, fields[i]);
    }
  }
}

getExtensionMessage doesn't do anything fancy for the moment
  if(field->name() == "dummy") {
    csi_message::* Dummy = dummy.MutableExtension(ns_message::dummy);
    print(*dummy);
 }

Thanks in advance for your comments.

-- 
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To post to this group, send email to proto...@googlegroups.com.
To unsubscribe from this group, send email to 
protobuf+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/protobuf?hl=en.

Reply via email to