Variable proto contains some information about structure although 
proto.name is blank (don't know why).
BuildFile returns NULL as well as FindMessageTypeByName. Whey I went deeper 
in debugging I noticed that BuildFile is trying to look up for that file I 
provide in its tables but these are empty as well.

On Tuesday, 9 September 2014 22:35:05 UTC+2, Feng Xiao wrote:
>
>
>
> On Mon, Sep 8, 2014 at 10:32 PM, Jan Kyjovský <[email protected] 
> <javascript:>> wrote:
>
>> Hi,
>>
>> sorry for delay. I've been experimenting with that eve since I could 
>> return to this issue. Mostly about composition of project since whenever I 
>> try separate your sources from projects and use them individually I§ve been 
>> getting tons of errors (linking one included). In the end I get along with 
>> static library linked in my project. But putting that aside.
>>
>> I haven't get as far as to use all your example. I am stuck and fact that 
>> when asking pool for specific message I am getting empty default descriptor 
>> as result. I am attaching my code so far could you please advise where I am 
>> making mistake?
>>
>> Its just short program where I was trying to figure out how to use it.
>>
>> #include <io.h>
>> #include <fcntl.h>
>> #include <stdio.h>
>> #include <string>
>> #include <vector>
>> #include "descriptor.h"
>> #include "descriptor.pb.h"
>> #include "zero_copy_stream_impl.h"
>> #include "tokenizer.h"
>> #include "parser.h"
>> #include "substitute.h"
>> #include "dynamic_message.h"
>>
>> using namespace google::protobuf;
>>
>> class ParserErrorCollector : public io::ErrorCollector
>> {
>> public:
>> ParserErrorCollector() {}
>> ~ParserErrorCollector() {}
>>
>> std::string text_;
>>
>> // implements ErrorCollector -------------------------------------
>> void AddError(int line, int column, const std::string& message)
>> {
>> strings::SubstituteAndAppend(&text_, "$0:$1: $2\n", line + 1, column + 1, 
>> message);
>> }
>>
>> void AddWarning(int line, int column, const std::string& message)
>> {
>> AddError(line, column, "WARNING:" + message);
>> }
>> };
>>
>> bool ParseProtoFile(std::string strFileName, FileDescriptorProto* result);
>>
>> void main()
>> {
>> std::string strFile = 
>> "C:\\Users\\kyjovjan\\Desktop\\ProtoExperiment\\addressbook.proto";
>>
>> // Build the descriptor pool
>> DescriptorPool pool;
>>
>> FileDescriptorProto proto;
>> ParseProtoFile(strFile, &proto); 
>>
> pool.BuildFile(proto);
>>
> Have you checked the return value of these two method calls?
>  
>
>>
>> // Suppose you want to parse a message type with a specific type name.
>> const Descriptor* descriptor = pool.FindMessageTypeByName("AddressBook");
>>
> Does this return NULL or non-NULL? If it's the later, it means you have 
> successfully constructed the descriptor for AddressBook. 
>  
>
>> DynamicMessageFactory factory;
>> Message *message = factory.GetPrototype(descriptor)->New();
>> }
>>
>> // Convert .proto files into parsed FileDescriptorProto
>> bool ParseProtoFile(std::string strFileName, FileDescriptorProto* result)
>> {
>>   int file_descriptor = open(strFileName.c_str(), O_RDONLY);
>>
>> ParserErrorCollector errCollector;
>>
>> io::FileInputStream stream(file_descriptor);
>> stream.SetCloseOnDelete(true);
>> io::Tokenizer tokenizer(&stream, &errCollector);
>> compiler::Parser parser;
>>
>> return parser.Parse(&tokenizer, result);
>>
>> return true;
>> }
>>
>>
>> On Tuesday, 12 August 2014 19:36:13 UTC+2, Feng Xiao wrote:
>>>
>>> Protobuf supports creating message types dynamically at runtime and use 
>>> them for parsing/serialization/etc.
>>>
>>> First you need to build up a DescriptorPool 
>>> <https://code.google.com/p/protobuf/source/browse/trunk/src/google/protobuf/descriptor.h#1141>
>>>  
>>> that contains all types that you may want to use. There are two approaches 
>>> to construct this pool. One is to call DescriptorPool::BuildFile() directly 
>>> with parsed proto files. For example:
>>>   // Convert .proto files into parsed FileDescriptorProto
>>>   bool ParseProtoFile(string filename, FileDescriptorProto* result) {
>>>     FileInputStream stream(filename);
>>>     google::protobuf::io::Tokenizer tokenizer(&stream);
>>>     google::protobuf::compiler::Parser parser;
>>>     return parser.Parse(&tokenizer, result);
>>>   }
>>>   // Build the descriptor pool
>>>   DescriptorPool pool;
>>>   for (string filename : proto_files) {
>>>     FileDescriptorProto proto;
>>>     ParseProtoFile(filename, &proto);
>>>     pool.BuildFile(proto);
>>>   }
>>>
>>> After you have the pool, you can query for a type by its name. For 
>>> example, DescriptorPool::FindMessageTypeByName().
>>>
>>> Then to actually parse/serialize/use message types in the pool, you need 
>>> to construct message objects around them. DynamicMessage 
>>> <https://code.google.com/p/protobuf/source/browse/trunk/src/google/protobuf/dynamic_message.h#53>
>>>  
>>> is used for that:
>>>   // Suppose you want to parse a message type with a specific type name.
>>>   Descriptor* descriptor = pool.FindMessageTypeByName(
>>> message_type_to_parse);
>>>   DynamicMessageFactory factory;
>>>   unique_ptr<Message> message = factory.GetPrototype(descriptor)->New();
>>>   // Use the message object for parsing/etc.
>>>   message->ParseFromString(input_data);
>>>   // Access a specific field in the message
>>>   FieldDescriptor* field = descriptor->FindFieldByName(field_to_read);
>>>   switch (field->type()) {
>>>     case TYPE_INT32: message->GetReflection()->GetInt32(*message, 
>>> field); break;
>>>     ...
>>>   }
>>>
>>> On Mon, Aug 11, 2014 at 9:31 PM, Jan Kyjovský <[email protected]> 
>>> wrote:
>>>
>>>> Hi,
>>>>
>>>> I have very specific problem. I have data and proto file available and 
>>>> my application should take both and based on external configuration 
>>>> determine how to interpret data (many different types/messages in proto). 
>>>> Yet that can be determine only during run. My question is if there is any 
>>>> support for that, I mean that I will be able to parse proto and decode 
>>>> data 
>>>> based on content of interpret intermediate structures.
>>>>
>>>> I have been trying to analyze this possibility directly from codes but 
>>>> not with much success. I would be glad for any guidance.
>>>>
>>>> -- 
>>>> You received this message because you are subscribed to the Google 
>>>> Groups "Protocol Buffers" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>> an email to [email protected].
>>>> To post to this group, send email to [email protected].
>>>> Visit this group at http://groups.google.com/group/protobuf.
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>
>>>  -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Protocol Buffers" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected] <javascript:>.
>> To post to this group, send email to [email protected] 
>> <javascript:>.
>> Visit this group at http://groups.google.com/group/protobuf.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.

Reply via email to