Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(358)

Side by Side Diff: third_party/protobuf/src/google/protobuf/util/type_resolver_util.cc

Issue 2495533002: third_party/protobuf: Update to HEAD (83d681ee2c) (Closed)
Patch Set: Make chrome settings proto generated file a component Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Protocol Buffers - Google's data interchange format 1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc. All rights reserved. 2 // Copyright 2008 Google Inc. All rights reserved.
3 // https://developers.google.com/protocol-buffers/ 3 // https://developers.google.com/protocol-buffers/
4 // 4 //
5 // Redistribution and use in source and binary forms, with or without 5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are 6 // modification, are permitted provided that the following conditions are
7 // met: 7 // met:
8 // 8 //
9 // * Redistributions of source code must retain the above copyright 9 // * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer. 10 // notice, this list of conditions and the following disclaimer.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 using google::protobuf::Enum; 47 using google::protobuf::Enum;
48 using google::protobuf::EnumValue; 48 using google::protobuf::EnumValue;
49 using google::protobuf::Field; 49 using google::protobuf::Field;
50 using google::protobuf::Option; 50 using google::protobuf::Option;
51 using google::protobuf::Type; 51 using google::protobuf::Type;
52 52
53 using util::Status; 53 using util::Status;
54 using util::error::INVALID_ARGUMENT; 54 using util::error::INVALID_ARGUMENT;
55 using util::error::NOT_FOUND; 55 using util::error::NOT_FOUND;
56 56
57 bool SplitTypeUrl(const string& type_url, string* url_prefix,
58 string* message_name) {
59 size_t pos = type_url.find_last_of("/");
60 if (pos == string::npos) {
61 return false;
62 }
63 *url_prefix = type_url.substr(0, pos);
64 *message_name = type_url.substr(pos + 1);
65 return true;
66 }
67
68 class DescriptorPoolTypeResolver : public TypeResolver { 57 class DescriptorPoolTypeResolver : public TypeResolver {
69 public: 58 public:
70 DescriptorPoolTypeResolver(const string& url_prefix, 59 DescriptorPoolTypeResolver(const string& url_prefix,
71 const DescriptorPool* pool) 60 const DescriptorPool* pool)
72 : url_prefix_(url_prefix), pool_(pool) {} 61 : url_prefix_(url_prefix), pool_(pool) {}
73 62
74 Status ResolveMessageType(const string& type_url, Type* type) { 63 Status ResolveMessageType(const string& type_url, Type* type) {
75 string url_prefix, message_name; 64 string type_name;
76 if (!SplitTypeUrl(type_url, &url_prefix, &message_name) || 65 Status status = ParseTypeUrl(type_url, &type_name);
77 url_prefix != url_prefix_) { 66 if (!status.ok()) {
78 return Status(INVALID_ARGUMENT, 67 return status;
79 StrCat("Invalid type URL, type URLs must be of the form '",
80 url_prefix_, "/<typename>', got: ", type_url));
81 } 68 }
82 if (url_prefix != url_prefix_) { 69
83 return Status(INVALID_ARGUMENT, 70 const Descriptor* descriptor = pool_->FindMessageTypeByName(type_name);
84 "Cannot resolve types from URL: " + url_prefix);
85 }
86 const Descriptor* descriptor = pool_->FindMessageTypeByName(message_name);
87 if (descriptor == NULL) { 71 if (descriptor == NULL) {
88 return Status(NOT_FOUND, 72 return Status(NOT_FOUND, "Invalid type URL, unknown type: " + type_name);
89 "Invalid type URL, unknown type: " + message_name);
90 } 73 }
91 ConvertDescriptor(descriptor, type); 74 ConvertDescriptor(descriptor, type);
92 return Status(); 75 return Status();
93 } 76 }
94 77
95 Status ResolveEnumType(const string& type_url, Enum* enum_type) { 78 Status ResolveEnumType(const string& type_url, Enum* enum_type) {
96 string url_prefix, type_name; 79 string type_name;
97 if (!SplitTypeUrl(type_url, &url_prefix, &type_name) || 80 Status status = ParseTypeUrl(type_url, &type_name);
98 url_prefix != url_prefix_) { 81 if (!status.ok()) {
99 return Status(INVALID_ARGUMENT, 82 return status;
100 StrCat("Invalid type URL, type URLs must be of the form '",
101 url_prefix_, "/<typename>', got: ", type_url));
102 } 83 }
103 if (url_prefix != url_prefix_) { 84
104 return Status(INVALID_ARGUMENT,
105 "Cannot resolve types from URL: " + url_prefix);
106 }
107 const EnumDescriptor* descriptor = pool_->FindEnumTypeByName(type_name); 85 const EnumDescriptor* descriptor = pool_->FindEnumTypeByName(type_name);
108 if (descriptor == NULL) { 86 if (descriptor == NULL) {
109 return Status(NOT_FOUND, "Invalid type URL, unknown type: " + type_name); 87 return Status(NOT_FOUND, "Invalid type URL, unknown type: " + type_name);
110 } 88 }
111 ConvertEnumDescriptor(descriptor, enum_type); 89 ConvertEnumDescriptor(descriptor, enum_type);
112 return Status(); 90 return Status();
113 } 91 }
114 92
115 private: 93 private:
116 void ConvertDescriptor(const Descriptor* descriptor, Type* type) { 94 void ConvertDescriptor(const Descriptor* descriptor, Type* type) {
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 } 174 }
197 175
198 string GetTypeUrl(const Descriptor* descriptor) { 176 string GetTypeUrl(const Descriptor* descriptor) {
199 return url_prefix_ + "/" + descriptor->full_name(); 177 return url_prefix_ + "/" + descriptor->full_name();
200 } 178 }
201 179
202 string GetTypeUrl(const EnumDescriptor* descriptor) { 180 string GetTypeUrl(const EnumDescriptor* descriptor) {
203 return url_prefix_ + "/" + descriptor->full_name(); 181 return url_prefix_ + "/" + descriptor->full_name();
204 } 182 }
205 183
184 Status ParseTypeUrl(const string& type_url, string* type_name) {
185 if (type_url.substr(0, url_prefix_.size() + 1) != url_prefix_ + "/") {
186 return Status(INVALID_ARGUMENT,
187 StrCat("Invalid type URL, type URLs must be of the form '",
188 url_prefix_, "/<typename>', got: ", type_url));
189 }
190 *type_name = type_url.substr(url_prefix_.size() + 1);
191 return Status();
192 }
193
206 string DefaultValueAsString(const FieldDescriptor* descriptor) { 194 string DefaultValueAsString(const FieldDescriptor* descriptor) {
207 switch (descriptor->cpp_type()) { 195 switch (descriptor->cpp_type()) {
208 case FieldDescriptor::CPPTYPE_INT32: 196 case FieldDescriptor::CPPTYPE_INT32:
209 return SimpleItoa(descriptor->default_value_int32()); 197 return SimpleItoa(descriptor->default_value_int32());
210 break; 198 break;
211 case FieldDescriptor::CPPTYPE_INT64: 199 case FieldDescriptor::CPPTYPE_INT64:
212 return SimpleItoa(descriptor->default_value_int64()); 200 return SimpleItoa(descriptor->default_value_int64());
213 break; 201 break;
214 case FieldDescriptor::CPPTYPE_UINT32: 202 case FieldDescriptor::CPPTYPE_UINT32:
215 return SimpleItoa(descriptor->default_value_uint32()); 203 return SimpleItoa(descriptor->default_value_uint32());
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 } // namespace 238 } // namespace
251 239
252 TypeResolver* NewTypeResolverForDescriptorPool(const string& url_prefix, 240 TypeResolver* NewTypeResolverForDescriptorPool(const string& url_prefix,
253 const DescriptorPool* pool) { 241 const DescriptorPool* pool) {
254 return new DescriptorPoolTypeResolver(url_prefix, pool); 242 return new DescriptorPoolTypeResolver(url_prefix, pool);
255 } 243 }
256 244
257 } // namespace util 245 } // namespace util
258 } // namespace protobuf 246 } // namespace protobuf
259 } // namespace google 247 } // namespace google
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698