25using google::protobuf::MessageFactory;
27ProtobufFactory::ProtobufFactory() {
28 pool_.reset(
new DescriptorPool());
29 factory_.reset(
new DynamicMessageFactory(pool_.get()));
38 const google::protobuf::Message& message) {
39 const Descriptor* descriptor = message.GetDescriptor();
44 FileDescriptorProto file_desc_proto;
45 desc.file()->CopyTo(&file_desc_proto);
50 FileDescriptorProto file_desc_proto;
51 file_desc_proto.ParseFromString(proto_desc.
desc());
57 for (
int i = 0; i < proto_desc.dependencies_size(); ++i) {
62 FileDescriptorProto dep_file_desc_proto;
63 dep_file_desc_proto.ParseFromString(dep.desc());
64 const google::protobuf::Descriptor* descriptor =
68 if (descriptor !=
nullptr) {
69 file_desc_proto.set_dependency(i, descriptor->file()->name());
76 FileDescriptorProto file_desc_proto;
77 file_desc_proto.ParseFromString(proto_str);
83 proto_desc.ParseFromString(proto_desc_str);
89 const FileDescriptorProto& file_desc_proto) {
91 std::lock_guard<std::mutex> lg(register_mutex_);
92 auto file_desc = pool_->BuildFileCollectingErrors(file_desc_proto, &ec);
104bool ProtobufFactory::GetProtoDesc(
const FileDescriptor* file_desc,
106 FileDescriptorProto file_desc_proto;
107 file_desc->CopyTo(&file_desc_proto);
109 if (!file_desc_proto.SerializeToString(&str)) {
113 proto_desc->set_desc(str);
115 for (
int i = 0; i < file_desc->dependency_count(); ++i) {
116 auto desc = proto_desc->add_dependencies();
117 if (!GetProtoDesc(file_desc->dependency(i), desc)) {
126 std::string* desc_str) {
128 if (!GetProtoDesc(desc->file(), &proto_desc)) {
129 AERROR <<
"Failed to get descriptor from message";
133 if (!proto_desc.SerializeToString(desc_str)) {
134 AERROR <<
"Failed to get descriptor from message";
139 const google::protobuf::Message& message, std::string* desc_str) {
140 const Descriptor* desc = message.GetDescriptor();
145 std::string* desc_str) {
146 auto desc = pool_->FindMessageTypeByName(type);
147 if (desc ==
nullptr) {
150 google::protobuf::DescriptorProto dp;
152 dp.SerializeToString(desc_str);
156 std::string* desc_str) {
157 auto desc = DescriptorPool::generated_pool()->FindMessageTypeByName(type);
158 if (desc !=
nullptr) {
162 desc = pool_->FindMessageTypeByName(type);
163 if (desc ==
nullptr) {
170 std::string& location) {
171 auto desc = DescriptorPool::generated_pool()->FindMessageTypeByName(type);
172 if (desc !=
nullptr) {
173 location = (desc->file())->name();
177 desc = pool_->FindMessageTypeByName(type);
178 if (desc ==
nullptr) {
181 location = (desc->file())->name();
187 const std::string& type)
const {
188 google::protobuf::Message* message = GetMessageByGeneratedType(type);
189 if (message !=
nullptr) {
193 const google::protobuf::Descriptor* descriptor =
194 pool_->FindMessageTypeByName(type);
195 if (descriptor ==
nullptr) {
196 AERROR <<
"cannot find [" << type <<
"] descriptor";
200 const google::protobuf::Message* prototype =
201 factory_->GetPrototype(descriptor);
202 if (prototype ==
nullptr) {
203 AERROR <<
"cannot find [" << type <<
"] prototype";
207 return prototype->New();
210google::protobuf::Message* ProtobufFactory::GetMessageByGeneratedType(
211 const std::string& type)
const {
213 DescriptorPool::generated_pool()->FindMessageTypeByName(type);
214 if (descriptor ==
nullptr) {
220 MessageFactory::generated_factory()->GetPrototype(descriptor);
221 if (prototype ==
nullptr) {
226 return prototype->New();
230 const std::string& name)
const {
231 return pool_->FindMessageTypeByName(name);
235 const std::string& name)
const {
236 return pool_->FindServiceByName(name);
240 const FileDescriptorProto& file_desc_proto) {
241 const std::string& scope = file_desc_proto.package();
243 if (file_desc_proto.message_type_size()) {
244 type = scope +
"." + file_desc_proto.message_type(0).name();
246 const google::protobuf::Descriptor* descriptor =
247 pool_->FindMessageTypeByName(type);
251void ErrorCollector::AddError(
const std::string& filename,
252 const std::string& element_name,
253 const google::protobuf::Message* descriptor,
254 ErrorLocation location,
255 const std::string& message) {
259 AWARN <<
"[" << filename <<
"] " << message;
262void ErrorCollector::AddWarning(
const std::string& filename,
263 const std::string& element_name,
264 const google::protobuf::Message* descriptor,
265 ErrorLocation location,
266 const std::string& message) {
270 AWARN <<
"[" << filename <<
"] " << message;
const google::protobuf::ServiceDescriptor * FindServiceByName(const std::string &name) const
bool RegisterMessage(const std::string &proto_desc_str)
const Descriptor * FindMessageTypeByName(const std::string &type) const
const Descriptor * FindMessageTypeByFile(const FileDescriptorProto &file_desc_proto)
bool RegisterPythonMessage(const std::string &proto_str)
void GetPythonDesc(const std::string &type, std::string *desc_str)
void GetProtoPath(const std::string &type, std::string &location)
static void GetDescriptorString(const google::protobuf::Message &message, std::string *desc_str)
google::protobuf::Message * GenerateMessageByType(const std::string &type) const
repeated ProtoDesc dependencies