Hello,

have you any luck finding where there may be problem?

On Monday, 15 June 2015 08:27:30 UTC+2, Jan Kyjovský wrote:
>
> It has grown a bit since I started so I will attach zipped whole project.
>
> On Friday, 12 June 2015 08:47:59 UTC+2, 肖锋 wrote:
>>
>>
>>
>> On Wednesday, June 10, 2015 at 9:49:03 PM UTC-7, Jan Kyjovský wrote:
>>>
>>> I did as you told me. And tried to compile my proto files with protoc. 
>>> Well it eat them up without any problem so I guess that clear that there is 
>>> no problem with them but in that case why is it causing such error to me.
>>>
>>> As I gave some hint before problem is happening when I am trying to do 
>>> following with phone.proto which is being added as second into descriptor 
>>> database
>>>
>>>     compiler::Parser parser;
>>>
>>>     parser.RecordErrorsTo(&errCollector);
>>>     bool bV = parser.Parse(&tokenizer, result);
>>>     std::string strErr = errCollector.GetErrorAndWarnings();
>>>
>>>     return bV;
>>>
>>> Parse returns false and error collector holds following error:
>>> 1:1: ERROR: Multiple package definitions.
>>>
>>> Do you have nay idea what that could meant?
>>>
>> Could you post the whole content of your code? It would be easier for me 
>> to figure out what's wrong if I can run the code myself.
>>  
>>
>>>
>>> On Tuesday, 9 June 2015 20:31:38 UTC+2, Feng Xiao wrote:
>>>>
>>>>
>>>>
>>>> On Mon, Jun 8, 2015 at 10:23 PM, Jan Kyjovský <jan.ky...@tieto.com> 
>>>> wrote:
>>>>
>>>>> I have remade code so I now add into descriptor database all 
>>>>> protofiles specified by directory. There is but little problem with error 
>>>>> handling. From nature how I am handling errors it seems that message is 
>>>>> possible to decode but there is one error in error collector which is 
>>>>> bothering me:
>>>>>
>>>>> 1:1: ERROR: Multiple package definitions.
>>>>>
>>>>> *My protos are defined as follows:*
>>>>> *addressbook_fragmented.proto:*
>>>>> import "phone.proto";
>>>>>
>>>>> package tutorial;
>>>>>
>>>>> option java_package = "com.example.tutorial";
>>>>> option java_outer_classname = "AddressBookProtos";
>>>>>
>>>>> message Person {
>>>>>   required string name = 1;
>>>>>   required int32 id = 2;        // Unique ID number for this person.
>>>>>   optional string email = 3;
>>>>>
>>>>> //  enum PhoneType {
>>>>> //    MOBILE = 0;
>>>>> //    HOME = 1;
>>>>> //    WORK = 2;
>>>>> //  }
>>>>>
>>>>>   message PhoneNumber {
>>>>>     required string number = 1;
>>>>>     optional PhoneType type = 2 [default = HOME];
>>>>>   }
>>>>>
>>>>>   repeated PhoneNumber phone = 4;
>>>>>   optional int32 age = 5;
>>>>> }
>>>>>
>>>>> // Our address book file is just one of these.
>>>>> message AddressBook {
>>>>>   repeated Person person = 1;
>>>>> }
>>>>>
>>>>> *phone.proto:*
>>>>> package tutorial;
>>>>>
>>>>> enum PhoneType {
>>>>>   MOBILE = 0;
>>>>>   HOME = 1;
>>>>>   WORK = 2;
>>>>> }
>>>>>
>>>>> Even though there is error in error collector I can ignore it and 
>>>>> decode message successfully. Yet if I try to remove this package info 
>>>>> from 
>>>>> phone.proto itis not detecting any error but FindMessageTypeByName fails 
>>>>> to 
>>>>> find data type. I am suspecting since not all references for person data 
>>>>> type I am asking for are resolved it fails.
>>>>>
>>>>> So I am confused how exactly should be these package keywords be used?
>>>>>
>>>> I don't see a problem in your use of "package". You could try to run 
>>>> protoc on these proto files and see if it reports any error. I suspect 
>>>> it's 
>>>> not the .proto file's problem.
>>>>  
>>>>
>>>>>
>>>>> On Wednesday, 3 June 2015 19:05:59 UTC+2, Feng Xiao wrote:
>>>>>
>>>>>>
>>>>>>
>>>>>> On Wed, Jun 3, 2015 at 12:40 AM, Jan Kyjovský <jan.ky...@tieto.com> 
>>>>>> wrote:
>>>>>>
>>>>>>> HI,
>>>>>>>
>>>>>>> I somehow understand what you mean but still I lack in experience 
>>>>>>> with it. I tried to switch to descriptor database but still I got some 
>>>>>>> problems.
>>>>>>>
>>>>>>> C_ProtoDecoder::C_ProtoDecoder(std::string strFile)
>>>>>>> {
>>>>>>>     m_strProtoFile = strFile;
>>>>>>>
>>>>>>>     // Build the descriptor pool
>>>>>>>     m_bConstructed = ParseProtoFile(&m_ProtoFileDescr);
>>>>>>>
>>>>>>>     if (m_bConstructed)
>>>>>>>     {
>>>>>>>         m_ProtoDescrDatabase.Add(m_ProtoFileDescr);
>>>>>>>         m_Pool = new DescriptorPool(&m_ProtoDescrDatabase);
>>>>>>>     }
>>>>>>> }
>>>>>>>
>>>>>>> C_ProtoDecoder::~C_ProtoDecoder()
>>>>>>> {
>>>>>>>     delete m_Pool;
>>>>>>> }
>>>>>>>
>>>>>>> bool C_ProtoDecoder::DecodeDataAsTypeFromWireFormat(std::string 
>>>>>>> strWireFormat, std::string strType)
>>>>>>> {
>>>>>>>     Descriptor *descriptor = (Descriptor 
>>>>>>> *)m_Pool->FindMessageTypeByName(strType);
>>>>>>>     Message *message = 
>>>>>>> m_MessageFactory.GetPrototype(descriptor)->New();
>>>>>>>
>>>>>>>     if (descriptor == NULL)
>>>>>>>     {
>>>>>>>         char szError[256];
>>>>>>>
>>>>>>>         sprintf(szError, "Unknown data type %s!", strType.c_str());
>>>>>>>         m_InternalPrinter.AddErrorMessage(szError);
>>>>>>>
>>>>>>>         return false;
>>>>>>>     }
>>>>>>>
>>>>>>>     bool bFlag = message->ParseFromString(strWireFormat);
>>>>>>>
>>>>>>>     if (!bFlag)
>>>>>>>     {
>>>>>>>         m_InternalPrinter.AddErrorMessage("Encoding error!");
>>>>>>>     }
>>>>>>>     else
>>>>>>>     {
>>>>>>>         m_Transformator.MorphToStructs(*message);
>>>>>>>     }
>>>>>>>
>>>>>>>     return true;
>>>>>>> }
>>>>>>>
>>>>>>> bool C_ProtoDecoder::ParseProtoFile(FileDescriptorProto *result)
>>>>>>> {
>>>>>>>   int file_descriptor = open(m_strProtoFile.c_str(), O_RDONLY);
>>>>>>>
>>>>>>>     if (file_descriptor == -1)
>>>>>>>     {
>>>>>>>         char szError[256];
>>>>>>>
>>>>>>>         sprintf(szError, "Invalid proto file \"%s\"!", 
>>>>>>> m_strProtoFile.c_str());
>>>>>>>         m_InternalPrinter.AddErrorMessage(szError);
>>>>>>>
>>>>>>>         return false;
>>>>>>>     }
>>>>>>>
>>>>>>>     C_ParserErrorCollector errCollector;
>>>>>>>
>>>>>>>     io::FileInputStream stream(file_descriptor);
>>>>>>>     stream.SetCloseOnDelete(true);
>>>>>>>     io::Tokenizer tokenizer(&stream, &errCollector);
>>>>>>>     result->set_name(m_strProtoFile);
>>>>>>>
>>>>>>>     compiler::Parser parser;
>>>>>>>
>>>>>>>     return parser.Parse(&tokenizer, result);
>>>>>>> }
>>>>>>>
>>>>>>> I have used SimpleDescriptorDatabase since it looked like it has 
>>>>>>> already implemented and its covering what I will be requiring from it 
>>>>>>> (or 
>>>>>>> at least I think it does)
>>>>>>>
>>>>>> If you use SimpleDescriptorDatabase, you need to add all .proto files 
>>>>>> into the database explicitly. For example, if you have 2 .proto files 
>>>>>> foo.proto and bar.proto, where bar.proto imports foo.proto, you need to 
>>>>>> add 
>>>>>> both foo.proto and bar.proto to SimpleDescriptorDatabase. If you already 
>>>>>> have a list of all proto files, using SimpleDescriptorDatabase should be 
>>>>>> fine. 
>>>>>>  
>>>>>>
>>>>>>>
>>>>>>> Everything is fine until I try to get descriptor by 
>>>>>>> FindMessageTypeByName from pool. It returns null. Am I committing some 
>>>>>>> steps?
>>>>>>>
>>>>>> I don't see anything obviously wrong in your code.
>>>>>>  
>>>>>>
>>>>>>  
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Tuesday, 2 June 2015 19:49:53 UTC+2, Feng Xiao wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> On Mon, Jun 1, 2015 at 9:55 PM, Jan Kyjovský <jan.ky...@tieto.com> 
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> Hi again,
>>>>>>>>>
>>>>>>>>> As I have stated before I am done with decoding, but now I am 
>>>>>>>>> solving different type of problem. As I have mentioned before imports 
>>>>>>>>> may 
>>>>>>>>> prove problematic to our implementation.
>>>>>>>>>
>>>>>>>>> Let me describe use-case how it will be used. There will be 
>>>>>>>>> configuration stating for which data (message number, specific field) 
>>>>>>>>> will 
>>>>>>>>> be applied which proto file and structure (data type). Therefore 
>>>>>>>>> there is 
>>>>>>>>> no knowledge about other proto files up until now. In run time data 
>>>>>>>>> are 
>>>>>>>>> fetched and shipped to decoder. In current implementation is 
>>>>>>>>> specified 
>>>>>>>>> proto file loaded and specific type used for decoding. That much is 
>>>>>>>>> clear 
>>>>>>>>> and works. But if some parts of structures are imported. It will 
>>>>>>>>> fail. That 
>>>>>>>>> much is clear that using just one file descriptor will be not enough 
>>>>>>>>> as you 
>>>>>>>>> have mentioned earlier.
>>>>>>>>>
>>>>>>>>> That leads to your proposition (posted earlier) to use 
>>>>>>>>> DescriptorDatabase. I have looked on implementation of classes 
>>>>>>>>> derived from 
>>>>>>>>> DscriptorDatabase. I am more or less able to provide directory for 
>>>>>>>>> SourceTree, but that doesn't answer question about import. I mean 
>>>>>>>>> since I 
>>>>>>>>> am aware of only one proto file. Is import done automatically or 
>>>>>>>>> other 
>>>>>>>>> files has to be also included manually into database?
>>>>>>>>>
>>>>>>>>
>>>>>>>>> Another question I have is bout order of operations. You mentioned 
>>>>>>>>> that I have to first call FindFileByName() before 
>>>>>>>>> callingFindMessageTypeByName(). That may be problem since I am not 
>>>>>>>>> aware in 
>>>>>>>>> which proto file may be located.
>>>>>>>>>
>>>>>>>>> Also I have noticed in code note that proto files with types used 
>>>>>>>>> in other proto files have to be "loaded" first. So is there any way 
>>>>>>>>> how to 
>>>>>>>>> ensure right order of loading?
>>>>>>>>>
>>>>>>>> Most of the work is done by DescriptorPool. Basically when you call 
>>>>>>>> FindFileByName() on a .proto file that is not yet loaded into the 
>>>>>>>> pool, 
>>>>>>>> DescriptorPool will call FindFileByName() on its underlying 
>>>>>>>> DescriptorDatabase to get the FileDescriptorProto for file. Then 
>>>>>>>> DescriptorPool will check the imports of this FileDescriptorPool. If 
>>>>>>>> it 
>>>>>>>> finds unsatisfied imports (i.e., files imported but not yet in the 
>>>>>>>> pool), 
>>>>>>>> it will issue FindFileByName() to the DescriptorDatabase again for 
>>>>>>>> these 
>>>>>>>> files.
>>>>>>>>
>>>>>>>> So basically DescriptorDatabase only needs to know how to load a 
>>>>>>>> single .proto file, while DescriptorPool will take care of the imports 
>>>>>>>> and 
>>>>>>>> ordering.
>>>>>>>>
>>>>>>>> Depending on what DescriptorDatabase you are using, you may or may 
>>>>>>>> not need to call FindFileByName() first. If the DescriptorDatabase has 
>>>>>>>> implement FindFileContainingSymbol, then calling 
>>>>>>>> DescriptorPool::FindMessageTypeByName() directly will be able to find 
>>>>>>>> the 
>>>>>>>> file using this method. If not (the case with 
>>>>>>>> SourceTreeDescriptorDatabase), FindFileByName() must be called first. 
>>>>>>>> As 
>>>>>>>> DescriptorPool will be able to find imports by itself, you don't need 
>>>>>>>> to 
>>>>>>>> call FindFileByName() for every file, but just the file that you 
>>>>>>>> actually 
>>>>>>>> need to use.
>>>>>>>>  
>>>>>>>>
>>>>>>>>>
>>>>>>>>> I hope my question are not too strange but I my knowledge about 
>>>>>>>>> google protocol buffers are a bit limited.
>>>>>>>>>
>>>>>>>>> -- 
>>>>>>>>> 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 protobuf+u...@googlegroups.com.
>>>>>>>>> To post to this group, send email to prot...@googlegroups.com.
>>>>>>>>> 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 protobuf+u...@googlegroups.com.
>>>>>>> To post to this group, send email to prot...@googlegroups.com.
>>>>>>> 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 protobuf+u...@googlegroups.com.
>>>>> To post to this group, send email to prot...@googlegroups.com.
>>>>> 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 protobuf+unsubscr...@googlegroups.com.
To post to this group, send email to protobuf@googlegroups.com.
Visit this group at http://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.

Reply via email to