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)
Everything is fine until I try to get descriptor by FindMessageTypeByName
from pool. It returns null. Am I committing some steps?
On Tuesday, 2 June 2015 19:49:53 UTC+2, Feng Xiao wrote:
>
>
>
> On Mon, Jun 1, 2015 at 9:55 PM, Jan Kyjovský <[email protected]
> <javascript:>> 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 [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.