protobuf.lua 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960
  1. --
  2. --------------------------------------------------------------------------------
  3. -- FILE: protobuf.lua
  4. -- DESCRIPTION: protoc-gen-lua
  5. -- Google's Protocol Buffers project, ported to lua.
  6. -- https://code.google.com/p/protoc-gen-lua/
  7. --
  8. -- Copyright (c) 2010 , 林卓毅 (Zhuoyi Lin) netsnail@gmail.com
  9. -- All rights reserved.
  10. --
  11. -- Use, modification and distribution are subject to the "New BSD License"
  12. -- as listed at <url: http://www.opensource.org/licenses/bsd-license.php >.
  13. --
  14. -- COMPANY: NetEase
  15. -- CREATED: 2010年07月29日 14时30分02秒 CST
  16. --------------------------------------------------------------------------------
  17. --
  18. local setmetatable = setmetatable
  19. local rawset = rawset
  20. local rawget = rawget
  21. local error = error
  22. local ipairs = ipairs
  23. local pairs = pairs
  24. local print = print
  25. local table = table
  26. local string = string
  27. local tostring = tostring
  28. local type = type
  29. local pb = require "pb"
  30. local wire_format = require "protobuf.wire_format"
  31. local type_checkers = require "protobuf.type_checkers"
  32. local encoder = require "protobuf.encoder"
  33. local decoder = require "protobuf.decoder"
  34. local listener_mod = require "protobuf.listener"
  35. local containers = require "protobuf.containers"
  36. local descriptor = require "protobuf.descriptor"
  37. local FieldDescriptor = descriptor.FieldDescriptor
  38. local text_format = require "protobuf.text_format"
  39. module("protobuf.protobuf")
  40. local function make_descriptor(name, descriptor, usable_key)
  41. local meta = {
  42. __newindex = function(self, key, value)
  43. if usable_key[key] then
  44. rawset(self, key, value)
  45. else
  46. error("error key: "..key)
  47. end
  48. end
  49. };
  50. meta.__index = meta
  51. meta.__call = function()
  52. return setmetatable({}, meta)
  53. end
  54. _M[name] = setmetatable(descriptor, meta);
  55. end
  56. make_descriptor("Descriptor", {}, {
  57. name = true,
  58. full_name = true,
  59. filename = true,
  60. containing_type = true,
  61. fields = true,
  62. nested_types = true,
  63. enum_types = true,
  64. extensions = true,
  65. options = true,
  66. is_extendable = true,
  67. extension_ranges = true,
  68. })
  69. make_descriptor("FieldDescriptor", FieldDescriptor, {
  70. name = true,
  71. full_name = true,
  72. index = true,
  73. number = true,
  74. type = true,
  75. cpp_type = true,
  76. label = true,
  77. has_default_value = true,
  78. default_value = true,
  79. containing_type = true,
  80. message_type = true,
  81. enum_type = true,
  82. is_extension = true,
  83. extension_scope = true,
  84. })
  85. make_descriptor("EnumDescriptor", {}, {
  86. name = true,
  87. full_name = true,
  88. values = true,
  89. containing_type = true,
  90. options = true
  91. })
  92. make_descriptor("EnumValueDescriptor", {}, {
  93. name = true,
  94. index = true,
  95. number = true,
  96. type = true,
  97. options = true
  98. })
  99. -- Maps from field type to expected wiretype.
  100. local FIELD_TYPE_TO_WIRE_TYPE = {
  101. [FieldDescriptor.TYPE_DOUBLE] = wire_format.WIRETYPE_FIXED64,
  102. [FieldDescriptor.TYPE_FLOAT] = wire_format.WIRETYPE_FIXED32,
  103. [FieldDescriptor.TYPE_INT64] = wire_format.WIRETYPE_VARINT,
  104. [FieldDescriptor.TYPE_UINT64] = wire_format.WIRETYPE_VARINT,
  105. [FieldDescriptor.TYPE_INT32] = wire_format.WIRETYPE_VARINT,
  106. [FieldDescriptor.TYPE_FIXED64] = wire_format.WIRETYPE_FIXED64,
  107. [FieldDescriptor.TYPE_FIXED32] = wire_format.WIRETYPE_FIXED32,
  108. [FieldDescriptor.TYPE_BOOL] = wire_format.WIRETYPE_VARINT,
  109. [FieldDescriptor.TYPE_STRING] = wire_format.WIRETYPE_LENGTH_DELIMITED,
  110. [FieldDescriptor.TYPE_GROUP] = wire_format.WIRETYPE_START_GROUP,
  111. [FieldDescriptor.TYPE_MESSAGE] = wire_format.WIRETYPE_LENGTH_DELIMITED,
  112. [FieldDescriptor.TYPE_BYTES] = wire_format.WIRETYPE_LENGTH_DELIMITED,
  113. [FieldDescriptor.TYPE_UINT32] = wire_format.WIRETYPE_VARINT,
  114. [FieldDescriptor.TYPE_ENUM] = wire_format.WIRETYPE_VARINT,
  115. [FieldDescriptor.TYPE_SFIXED32] = wire_format.WIRETYPE_FIXED32,
  116. [FieldDescriptor.TYPE_SFIXED64] = wire_format.WIRETYPE_FIXED64,
  117. [FieldDescriptor.TYPE_SINT32] = wire_format.WIRETYPE_VARINT,
  118. [FieldDescriptor.TYPE_SINT64] = wire_format.WIRETYPE_VARINT
  119. }
  120. local NON_PACKABLE_TYPES = {
  121. [FieldDescriptor.TYPE_STRING] = true,
  122. [FieldDescriptor.TYPE_GROUP] = true,
  123. [FieldDescriptor.TYPE_MESSAGE] = true,
  124. [FieldDescriptor.TYPE_BYTES] = true
  125. }
  126. local _VALUE_CHECKERS = {
  127. [FieldDescriptor.CPPTYPE_INT32] = type_checkers.Int32ValueChecker(),
  128. [FieldDescriptor.CPPTYPE_INT64] = type_checkers.TypeChecker({string = true, number = true}),
  129. [FieldDescriptor.CPPTYPE_UINT32] = type_checkers.Uint32ValueChecker(),
  130. [FieldDescriptor.CPPTYPE_UINT64] = type_checkers.TypeChecker({string = true, number = true}),
  131. [FieldDescriptor.CPPTYPE_DOUBLE] = type_checkers.TypeChecker({number = true}),
  132. [FieldDescriptor.CPPTYPE_FLOAT] = type_checkers.TypeChecker({number = true}),
  133. [FieldDescriptor.CPPTYPE_BOOL] = type_checkers.TypeChecker({boolean = true, bool = true, int=true}),
  134. [FieldDescriptor.CPPTYPE_ENUM] = type_checkers.Int32ValueChecker(),
  135. [FieldDescriptor.CPPTYPE_STRING] = type_checkers.TypeChecker({string = true})
  136. }
  137. local TYPE_TO_BYTE_SIZE_FN = {
  138. [FieldDescriptor.TYPE_DOUBLE] = wire_format.DoubleByteSize,
  139. [FieldDescriptor.TYPE_FLOAT] = wire_format.FloatByteSize,
  140. [FieldDescriptor.TYPE_INT64] = wire_format.Int64ByteSize,
  141. [FieldDescriptor.TYPE_UINT64] = wire_format.UInt64ByteSize,
  142. [FieldDescriptor.TYPE_INT32] = wire_format.Int32ByteSize,
  143. [FieldDescriptor.TYPE_FIXED64] = wire_format.Fixed64ByteSize,
  144. [FieldDescriptor.TYPE_FIXED32] = wire_format.Fixed32ByteSize,
  145. [FieldDescriptor.TYPE_BOOL] = wire_format.BoolByteSize,
  146. [FieldDescriptor.TYPE_STRING] = wire_format.StringByteSize,
  147. [FieldDescriptor.TYPE_GROUP] = wire_format.GroupByteSize,
  148. [FieldDescriptor.TYPE_MESSAGE] = wire_format.MessageByteSize,
  149. [FieldDescriptor.TYPE_BYTES] = wire_format.BytesByteSize,
  150. [FieldDescriptor.TYPE_UINT32] = wire_format.UInt32ByteSize,
  151. [FieldDescriptor.TYPE_ENUM] = wire_format.EnumByteSize,
  152. [FieldDescriptor.TYPE_SFIXED32] = wire_format.SFixed32ByteSize,
  153. [FieldDescriptor.TYPE_SFIXED64] = wire_format.SFixed64ByteSize,
  154. [FieldDescriptor.TYPE_SINT32] = wire_format.SInt32ByteSize,
  155. [FieldDescriptor.TYPE_SINT64] = wire_format.SInt64ByteSize
  156. }
  157. local TYPE_TO_ENCODER = {
  158. [FieldDescriptor.TYPE_DOUBLE] = encoder.DoubleEncoder,
  159. [FieldDescriptor.TYPE_FLOAT] = encoder.FloatEncoder,
  160. [FieldDescriptor.TYPE_INT64] = encoder.Int64Encoder,
  161. [FieldDescriptor.TYPE_UINT64] = encoder.UInt64Encoder,
  162. [FieldDescriptor.TYPE_INT32] = encoder.Int32Encoder,
  163. [FieldDescriptor.TYPE_FIXED64] = encoder.Fixed64Encoder,
  164. [FieldDescriptor.TYPE_FIXED32] = encoder.Fixed32Encoder,
  165. [FieldDescriptor.TYPE_BOOL] = encoder.BoolEncoder,
  166. [FieldDescriptor.TYPE_STRING] = encoder.StringEncoder,
  167. [FieldDescriptor.TYPE_GROUP] = encoder.GroupEncoder,
  168. [FieldDescriptor.TYPE_MESSAGE] = encoder.MessageEncoder,
  169. [FieldDescriptor.TYPE_BYTES] = encoder.BytesEncoder,
  170. [FieldDescriptor.TYPE_UINT32] = encoder.UInt32Encoder,
  171. [FieldDescriptor.TYPE_ENUM] = encoder.EnumEncoder,
  172. [FieldDescriptor.TYPE_SFIXED32] = encoder.SFixed32Encoder,
  173. [FieldDescriptor.TYPE_SFIXED64] = encoder.SFixed64Encoder,
  174. [FieldDescriptor.TYPE_SINT32] = encoder.SInt32Encoder,
  175. [FieldDescriptor.TYPE_SINT64] = encoder.SInt64Encoder
  176. }
  177. local TYPE_TO_SIZER = {
  178. [FieldDescriptor.TYPE_DOUBLE] = encoder.DoubleSizer,
  179. [FieldDescriptor.TYPE_FLOAT] = encoder.FloatSizer,
  180. [FieldDescriptor.TYPE_INT64] = encoder.Int64Sizer,
  181. [FieldDescriptor.TYPE_UINT64] = encoder.UInt64Sizer,
  182. [FieldDescriptor.TYPE_INT32] = encoder.Int32Sizer,
  183. [FieldDescriptor.TYPE_FIXED64] = encoder.Fixed64Sizer,
  184. [FieldDescriptor.TYPE_FIXED32] = encoder.Fixed32Sizer,
  185. [FieldDescriptor.TYPE_BOOL] = encoder.BoolSizer,
  186. [FieldDescriptor.TYPE_STRING] = encoder.StringSizer,
  187. [FieldDescriptor.TYPE_GROUP] = encoder.GroupSizer,
  188. [FieldDescriptor.TYPE_MESSAGE] = encoder.MessageSizer,
  189. [FieldDescriptor.TYPE_BYTES] = encoder.BytesSizer,
  190. [FieldDescriptor.TYPE_UINT32] = encoder.UInt32Sizer,
  191. [FieldDescriptor.TYPE_ENUM] = encoder.EnumSizer,
  192. [FieldDescriptor.TYPE_SFIXED32] = encoder.SFixed32Sizer,
  193. [FieldDescriptor.TYPE_SFIXED64] = encoder.SFixed64Sizer,
  194. [FieldDescriptor.TYPE_SINT32] = encoder.SInt32Sizer,
  195. [FieldDescriptor.TYPE_SINT64] = encoder.SInt64Sizer
  196. }
  197. local TYPE_TO_DECODER = {
  198. [FieldDescriptor.TYPE_DOUBLE] = decoder.DoubleDecoder,
  199. [FieldDescriptor.TYPE_FLOAT] = decoder.FloatDecoder,
  200. [FieldDescriptor.TYPE_INT64] = decoder.Int64Decoder,
  201. [FieldDescriptor.TYPE_UINT64] = decoder.UInt64Decoder,
  202. [FieldDescriptor.TYPE_INT32] = decoder.Int32Decoder,
  203. [FieldDescriptor.TYPE_FIXED64] = decoder.Fixed64Decoder,
  204. [FieldDescriptor.TYPE_FIXED32] = decoder.Fixed32Decoder,
  205. [FieldDescriptor.TYPE_BOOL] = decoder.BoolDecoder,
  206. [FieldDescriptor.TYPE_STRING] = decoder.StringDecoder,
  207. [FieldDescriptor.TYPE_GROUP] = decoder.GroupDecoder,
  208. [FieldDescriptor.TYPE_MESSAGE] = decoder.MessageDecoder,
  209. [FieldDescriptor.TYPE_BYTES] = decoder.BytesDecoder,
  210. [FieldDescriptor.TYPE_UINT32] = decoder.UInt32Decoder,
  211. [FieldDescriptor.TYPE_ENUM] = decoder.EnumDecoder,
  212. [FieldDescriptor.TYPE_SFIXED32] = decoder.SFixed32Decoder,
  213. [FieldDescriptor.TYPE_SFIXED64] = decoder.SFixed64Decoder,
  214. [FieldDescriptor.TYPE_SINT32] = decoder.SInt32Decoder,
  215. [FieldDescriptor.TYPE_SINT64] = decoder.SInt64Decoder
  216. }
  217. local FIELD_TYPE_TO_WIRE_TYPE = {
  218. [FieldDescriptor.TYPE_DOUBLE] = wire_format.WIRETYPE_FIXED64,
  219. [FieldDescriptor.TYPE_FLOAT] = wire_format.WIRETYPE_FIXED32,
  220. [FieldDescriptor.TYPE_INT64] = wire_format.WIRETYPE_VARINT,
  221. [FieldDescriptor.TYPE_UINT64] = wire_format.WIRETYPE_VARINT,
  222. [FieldDescriptor.TYPE_INT32] = wire_format.WIRETYPE_VARINT,
  223. [FieldDescriptor.TYPE_FIXED64] = wire_format.WIRETYPE_FIXED64,
  224. [FieldDescriptor.TYPE_FIXED32] = wire_format.WIRETYPE_FIXED32,
  225. [FieldDescriptor.TYPE_BOOL] = wire_format.WIRETYPE_VARINT,
  226. [FieldDescriptor.TYPE_STRING] = wire_format.WIRETYPE_LENGTH_DELIMITED,
  227. [FieldDescriptor.TYPE_GROUP] = wire_format.WIRETYPE_START_GROUP,
  228. [FieldDescriptor.TYPE_MESSAGE] = wire_format.WIRETYPE_LENGTH_DELIMITED,
  229. [FieldDescriptor.TYPE_BYTES] = wire_format.WIRETYPE_LENGTH_DELIMITED,
  230. [FieldDescriptor.TYPE_UINT32] = wire_format.WIRETYPE_VARINT,
  231. [FieldDescriptor.TYPE_ENUM] = wire_format.WIRETYPE_VARINT,
  232. [FieldDescriptor.TYPE_SFIXED32] = wire_format.WIRETYPE_FIXED32,
  233. [FieldDescriptor.TYPE_SFIXED64] = wire_format.WIRETYPE_FIXED64,
  234. [FieldDescriptor.TYPE_SINT32] = wire_format.WIRETYPE_VARINT,
  235. [FieldDescriptor.TYPE_SINT64] = wire_format.WIRETYPE_VARINT
  236. }
  237. local function IsTypePackable(field_type)
  238. return NON_PACKABLE_TYPES[field_type] == nil
  239. end
  240. local function GetTypeChecker(cpp_type, field_type)
  241. if (cpp_type == FieldDescriptor.CPPTYPE_STRING and field_type == FieldDescriptor.TYPE_STRING) then
  242. return type_checkers.UnicodeValueChecker()
  243. end
  244. return _VALUE_CHECKERS[cpp_type]
  245. end
  246. local function _DefaultValueConstructorForField(field)
  247. if field.label == FieldDescriptor.LABEL_REPEATED then
  248. if type(field.default_value) ~= "table" or #(field.default_value) ~= 0 then
  249. error('Repeated field default value not empty list:' .. tostring(field.default_value))
  250. end
  251. if field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE then
  252. local message_type = field.message_type
  253. return function (message)
  254. return containers.RepeatedCompositeFieldContainer(message._listener_for_children, message_type)
  255. end
  256. else
  257. local type_checker = GetTypeChecker(field.cpp_type, field.type)
  258. return function (message)
  259. return containers.RepeatedScalarFieldContainer(message._listener_for_children, type_checker)
  260. end
  261. end
  262. end
  263. if field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE then
  264. local message_type = field.message_type
  265. return function (message)
  266. result = message_type._concrete_class()
  267. result._SetListener(message._listener_for_children)
  268. return result
  269. end
  270. end
  271. return function (message)
  272. return field.default_value
  273. end
  274. end
  275. local function _AttachFieldHelpers(message_meta, field_descriptor)
  276. local is_repeated = (field_descriptor.label == FieldDescriptor.LABEL_REPEATED)
  277. local is_packed = (field_descriptor.has_options and field_descriptor.GetOptions().packed)
  278. rawset(field_descriptor, "_encoder", TYPE_TO_ENCODER[field_descriptor.type](field_descriptor.number, is_repeated, is_packed))
  279. rawset(field_descriptor, "_sizer", TYPE_TO_SIZER[field_descriptor.type](field_descriptor.number, is_repeated, is_packed))
  280. rawset(field_descriptor, "_default_constructor", _DefaultValueConstructorForField(field_descriptor))
  281. local AddDecoder = function(wiretype, is_packed)
  282. local tag_bytes = encoder.TagBytes(field_descriptor.number, wiretype)
  283. message_meta._decoders_by_tag[tag_bytes] = TYPE_TO_DECODER[field_descriptor.type](field_descriptor.number, is_repeated, is_packed, field_descriptor, field_descriptor._default_constructor)
  284. end
  285. AddDecoder(FIELD_TYPE_TO_WIRE_TYPE[field_descriptor.type], False)
  286. if is_repeated and IsTypePackable(field_descriptor.type) then
  287. AddDecoder(wire_format.WIRETYPE_LENGTH_DELIMITED, True)
  288. end
  289. end
  290. local function _AddEnumValues(descriptor, message_meta)
  291. for _, enum_type in ipairs(descriptor.enum_types) do
  292. for _, enum_value in ipairs(enum_type.values) do
  293. message_meta._member[enum_value.name] = enum_value.number
  294. end
  295. end
  296. end
  297. local function _InitMethod(message_meta)
  298. return function()
  299. local self = {}
  300. self._cached_byte_size = 0
  301. self._cached_byte_size_dirty = false
  302. self._fields = {}
  303. self._is_present_in_parent = false
  304. self._listener = listener_mod.NullMessageListener()
  305. self._listener_for_children = listener_mod.Listener(self)
  306. return setmetatable(self, message_meta)
  307. end
  308. end
  309. local function _AddPropertiesForRepeatedField(field, message_meta)
  310. local property_name = field.name
  311. message_meta._getter[property_name] = function(self)
  312. local field_value = self._fields[field]
  313. if field_value == nil then
  314. field_value = field._default_constructor(self)
  315. self._fields[field] = field_value
  316. if not self._cached_byte_size_dirty then
  317. message_meta._member._Modified(self)
  318. end
  319. end
  320. return field_value
  321. end
  322. message_meta._setter[property_name] = function(self)
  323. error('Assignment not allowed to repeated field "' .. property_name .. '" in protocol message object.')
  324. end
  325. end
  326. local function _AddPropertiesForNonRepeatedCompositeField(field, message_meta)
  327. local property_name = field.name
  328. local message_type = field.message_type
  329. message_meta._getter[property_name] = function(self)
  330. local field_value = self._fields[field]
  331. if field_value == nil then
  332. field_value = message_type._concrete_class()
  333. field_value:_SetListener(self._listener_for_children)
  334. self._fields[field] = field_value
  335. if not self._cached_byte_size_dirty then
  336. message_meta._member._Modified(self)
  337. end
  338. end
  339. return field_value
  340. end
  341. message_meta._setter[property_name] = function(self, new_value)
  342. error('Assignment not allowed to composite field' .. property_name .. 'in protocol message object.' )
  343. end
  344. end
  345. local function _AddPropertiesForNonRepeatedScalarField(field, message)
  346. local property_name = field.name
  347. local type_checker = GetTypeChecker(field.cpp_type, field.type)
  348. local default_value = field.default_value
  349. message._getter[property_name] = function(self)
  350. local value = self._fields[field]
  351. if value ~= nil then
  352. return self._fields[field]
  353. else
  354. return default_value
  355. end
  356. end
  357. message._setter[property_name] = function(self, new_value)
  358. type_checker(new_value)
  359. self._fields[field] = new_value
  360. if not self._cached_byte_size_dirty then
  361. message._member._Modified(self)
  362. end
  363. end
  364. end
  365. local function _AddPropertiesForField(field, message_meta)
  366. constant_name = field.name:upper() .. "_FIELD_NUMBER"
  367. message_meta._member[constant_name] = field.number
  368. if field.label == FieldDescriptor.LABEL_REPEATED then
  369. _AddPropertiesForRepeatedField(field, message_meta)
  370. elseif field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE then
  371. _AddPropertiesForNonRepeatedCompositeField(field, message_meta)
  372. else
  373. _AddPropertiesForNonRepeatedScalarField(field, message_meta)
  374. end
  375. end
  376. local _ED_meta = {
  377. __index = function(self, extension_handle)
  378. local _extended_message = rawget(self, "_extended_message")
  379. local value = _extended_message._fields[extension_handle]
  380. if value ~= nil then
  381. return value
  382. end
  383. if extension_handle.label == FieldDescriptor.LABEL_REPEATED then
  384. value = extension_handle._default_constructor(self._extended_message)
  385. elseif extension_handle.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE then
  386. value = extension_handle.message_type._concrete_class()
  387. value:_SetListener(_extended_message._listener_for_children)
  388. else
  389. return extension_handle.default_value
  390. end
  391. _extended_message._fields[extension_handle] = value
  392. return value
  393. end,
  394. __newindex = function(self, extension_handle, value)
  395. local _extended_message = rawget(self, "_extended_message")
  396. if (extension_handle.label == FieldDescriptor.LABEL_REPEATED or
  397. extension_handle.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE) then
  398. error('Cannot assign to extension "'.. extension_handle.full_name .. '" because it is a repeated or composite type.')
  399. end
  400. local type_checker = GetTypeChecker(extension_handle.cpp_type, extension_handle.type)
  401. type_checker.CheckValue(value)
  402. _extended_message._fields[extension_handle] = value
  403. _extended_message._Modified()
  404. end
  405. }
  406. local function _ExtensionDict(message)
  407. local o = {}
  408. o._extended_message = message
  409. return setmetatable(o, _ED_meta)
  410. end
  411. local function _AddPropertiesForFields(descriptor, message_meta)
  412. for _, field in ipairs(descriptor.fields) do
  413. _AddPropertiesForField(field, message_meta)
  414. end
  415. if descriptor.is_extendable then
  416. message_meta._getter.Extensions = function(self) return _ExtensionDict(self) end
  417. end
  418. end
  419. local function _AddPropertiesForExtensions(descriptor, message_meta)
  420. local extension_dict = descriptor._extensions_by_name
  421. for extension_name, extension_field in pairs(extension_dict) do
  422. local constant_name = string.upper(extension_name) .. "_FIELD_NUMBER"
  423. message_meta._member[constant_name] = extension_field.number
  424. end
  425. end
  426. local function _AddStaticMethods(message_meta)
  427. message_meta._member.RegisterExtension = function(extension_handle)
  428. extension_handle.containing_type = message_meta._descriptor
  429. _AttachFieldHelpers(message_meta, extension_handle)
  430. if message_meta._extensions_by_number[extension_handle.number] == nil then
  431. message_meta._extensions_by_number[extension_handle.number] = extension_handle
  432. else
  433. error(
  434. string.format('Extensions "%s" and "%s" both try to extend message type "%s" with field number %d.',
  435. extension_handle.full_name, actual_handle.full_name,
  436. message_meta._descriptor.full_name, extension_handle.number))
  437. end
  438. message_meta._extensions_by_name[extension_handle.full_name] = extension_handle
  439. end
  440. message_meta._member.FromString = function(s)
  441. local message = message_meta._member.__call()
  442. message.MergeFromString(s)
  443. return message
  444. end
  445. end
  446. local function _IsPresent(descriptor, value)
  447. if descriptor.label == FieldDescriptor.LABEL_REPEATED then
  448. return value
  449. elseif descriptor.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE then
  450. return value._is_present_in_parent
  451. else
  452. return true
  453. end
  454. end
  455. function sortFunc(a, b)
  456. return a.index < b.index
  457. end
  458. function pairsByKeys (t, f)
  459. local a = {}
  460. for n in pairs(t) do table.insert(a, n) end
  461. table.sort(a, f)
  462. local i = 0 -- iterator variable
  463. local iter = function () -- iterator function
  464. i = i + 1
  465. if a[i] == nil then return nil
  466. else return a[i], t[a[i]]
  467. end
  468. end
  469. return iter
  470. end
  471. local function _AddListFieldsMethod(message_descriptor, message_meta)
  472. message_meta._member.ListFields = function (self)
  473. local list_field = function(fields)
  474. --local f, s, v = pairs(self._fields)
  475. local f,s,v = pairsByKeys(self._fields, sortFunc)
  476. local iter = function(a, i)
  477. while true do
  478. local descriptor, value = f(a, i)
  479. if descriptor == nil then
  480. return
  481. elseif _IsPresent(descriptor, value) then
  482. return descriptor, value
  483. end
  484. end
  485. end
  486. return iter, s, v
  487. end
  488. return list_field(self._fields)
  489. end
  490. end
  491. local function _AddHasFieldMethod(message_descriptor, message_meta)
  492. local singular_fields = {}
  493. for _, field in ipairs(message_descriptor.fields) do
  494. if field.label ~= FieldDescriptor.LABEL_REPEATED then
  495. singular_fields[field.name] = field
  496. end
  497. end
  498. message_meta._member.HasField = function (self, field_name)
  499. field = singular_fields[field_name]
  500. if field == nil then
  501. error('Protocol message has no singular "'.. field_name.. '" field.')
  502. end
  503. if field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE then
  504. value = self._fields[field]
  505. return value ~= nil and value._is_present_in_parent
  506. else
  507. local valueTmp = self._fields[field]
  508. return valueTmp ~= nil
  509. end
  510. end
  511. end
  512. local function _AddClearFieldMethod(message_descriptor, message_meta)
  513. local singular_fields = {}
  514. for _, field in ipairs(message_descriptor.fields) do
  515. if field.label ~= FieldDescriptor.LABEL_REPEATED then
  516. singular_fields[field.name] = field
  517. end
  518. end
  519. message_meta._member.ClearField = function(self, field_name)
  520. field = singular_fields[field_name]
  521. if field == nil then
  522. error('Protocol message has no singular "'.. field_name.. '" field.')
  523. end
  524. if self._fields[field] then
  525. self._fields[field] = nil
  526. end
  527. message_meta._member._Modified(self)
  528. end
  529. end
  530. local function _AddClearExtensionMethod(message_meta)
  531. message_meta._member.ClearExtension = function(self, extension_handle)
  532. if self._fields[extension_handle] == nil then
  533. self._fields[extension_handle] = nil
  534. end
  535. message_meta._member._Modified(self)
  536. end
  537. end
  538. local function _AddClearMethod(message_descriptor, message_meta)
  539. message_meta._member.Clear = function(self)
  540. self._fields = {}
  541. message_meta._member._Modified(self)
  542. end
  543. end
  544. local function _AddStrMethod(message_meta)
  545. local format = text_format.msg_format
  546. message_meta.__tostring = function(self)
  547. return format(self)
  548. end
  549. end
  550. local function _AddHasExtensionMethod(message_meta)
  551. message_meta._member.HasExtension = function(self, extension_handle)
  552. if extension_handle.label == FieldDescriptor.LABEL_REPEATED then
  553. error(extension_handle.full_name .. ' is repeated.')
  554. end
  555. if extension_handle.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE then
  556. value = self._fields[extension_handle]
  557. return value ~= nil and value._is_present_in_parent
  558. else
  559. return self._fields[extension_handle]
  560. end
  561. end
  562. end
  563. local function _AddSetListenerMethod(message_meta)
  564. message_meta._member._SetListener = function(self, listener)
  565. if listener ~= nil then
  566. self._listener = listener_mod.NullMessageListener()
  567. else
  568. self._listener = listener
  569. end
  570. end
  571. end
  572. local function _AddByteSizeMethod(message_descriptor, message_meta)
  573. message_meta._member.ByteSize = function(self)
  574. --kaiser
  575. --bug:这里在Repeat字段的结构体如果第一个字段不是int变量会产生_cached_byte_size_dirty为false而导致byte size为0
  576. --如果bytesize为0让它强制计算byte size
  577. if not self._cached_byte_size_dirty and self._cached_byte_size > 0 then
  578. return self._cached_byte_size
  579. end
  580. local size = 0
  581. for field_descriptor, field_value in message_meta._member.ListFields(self) do
  582. size = field_descriptor._sizer(field_value) + size
  583. end
  584. self._cached_byte_size = size
  585. self._cached_byte_size_dirty = false
  586. self._listener_for_children.dirty = false
  587. return size
  588. end
  589. end
  590. local function _AddSerializeToStringMethod(message_descriptor, message_meta)
  591. message_meta._member.SerializeToString = function(self)
  592. if not message_meta._member.IsInitialized(self) then
  593. error('Message is missing required fields: ' ..
  594. table.concat(message_meta._member.FindInitializationErrors(self), ','))
  595. end
  596. return message_meta._member.SerializePartialToString(self)
  597. end
  598. message_meta._member.SerializeToIOString = function(self, iostring)
  599. if not message_meta._member.IsInitialized(self) then
  600. error('Message is missing required fields: ' ..
  601. table.concat(message_meta._member.FindInitializationErrors(self), ','))
  602. end
  603. return message_meta._member.SerializePartialToIOString(self, iostring)
  604. end
  605. end
  606. local function _AddSerializePartialToStringMethod(message_descriptor, message_meta)
  607. local concat = table.concat
  608. local _internal_serialize = function(self, write_bytes)
  609. for field_descriptor, field_value in message_meta._member.ListFields(self) do
  610. field_descriptor._encoder(write_bytes, field_value)
  611. end
  612. end
  613. local _serialize_partial_to_iostring = function(self, iostring)
  614. local w = iostring.write
  615. local write = function(value)
  616. w(iostring, value)
  617. end
  618. _internal_serialize(self, write)
  619. return
  620. end
  621. local _serialize_partial_to_string = function(self)
  622. local out = {}
  623. local write = function(value)
  624. out[#out + 1] = value
  625. end
  626. _internal_serialize(self, write)
  627. return concat(out)
  628. end
  629. message_meta._member._InternalSerialize = _internal_serialize
  630. message_meta._member.SerializePartialToIOString = _serialize_partial_to_iostring
  631. message_meta._member.SerializePartialToString = _serialize_partial_to_string
  632. end
  633. local function _AddMergeFromStringMethod(message_descriptor, message_meta)
  634. local ReadTag = decoder.ReadTag
  635. local SkipField = decoder.SkipField
  636. local decoders_by_tag = message_meta._decoders_by_tag
  637. local _internal_parse = function(self, buffer, pos, pend)
  638. message_meta._member._Modified(self)
  639. local field_dict = self._fields
  640. local tag_bytes, new_pos
  641. local field_decoder
  642. while pos ~= pend do
  643. tag_bytes, new_pos = ReadTag(buffer, pos)
  644. field_decoder = decoders_by_tag[tag_bytes]
  645. if field_decoder == nil then
  646. new_pos = SkipField(buffer, new_pos, pend, tag_bytes)
  647. if new_pos == -1 then
  648. return pos
  649. end
  650. pos = new_pos
  651. else
  652. pos = field_decoder(buffer, new_pos, pend, self, field_dict)
  653. end
  654. end
  655. return pos
  656. end
  657. message_meta._member._InternalParse = _internal_parse
  658. local merge_from_string = function(self, serialized)
  659. local length = #serialized
  660. if _internal_parse(self, serialized, 0, length) ~= length then
  661. error('Unexpected end-group tag.')
  662. end
  663. return length
  664. end
  665. message_meta._member.MergeFromString = merge_from_string
  666. message_meta._member.ParseFromString = function(self, serialized)
  667. message_meta._member.Clear(self)
  668. merge_from_string(self, serialized)
  669. end
  670. end
  671. local function _AddIsInitializedMethod(message_descriptor, message_meta)
  672. local required_fields = {}
  673. for _, field in ipairs(message_descriptor.fields) do
  674. if field.label == FieldDescriptor.LABEL_REQUIRED then
  675. required_fields[#required_fields + 1] = field
  676. end
  677. end
  678. message_meta._member.IsInitialized = function(self, errors)
  679. for _, field in ipairs(required_fields) do
  680. if self._fields[field] == nil or
  681. (field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE and not self._fields[field]._is_present_in_parent) then
  682. if errors ~= nil then
  683. errors[#errors + 1] = message_meta._member.FindInitializationErrors(self)
  684. end
  685. return false
  686. end
  687. end
  688. for field, value in pairs(self._fields) do
  689. if field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE then
  690. if field.label == FieldDescriptor.LABEL_REPEATED then
  691. for _, element in ipairs(value) do
  692. if not element:IsInitialized() then
  693. if errors ~= nil then
  694. errors[#errors + 1] = message_meta._member.FindInitializationErrors(self)
  695. end
  696. return false
  697. end
  698. end
  699. elseif value._is_present_in_parent and not value:IsInitialized() then
  700. if errors ~= nil then
  701. errors[#errors + 1] = message_meta._member.FindInitializationErrors(self)
  702. end
  703. return false
  704. end
  705. end
  706. end
  707. return true
  708. end
  709. message_meta._member.FindInitializationErrors = function(self)
  710. local errors = {}
  711. for _,field in ipairs(required_fields) do
  712. if not message_meta._member.HasField(self, field.name) then
  713. errors[#errors + 1] = field.name
  714. end
  715. end
  716. for field, value in message_meta._member.ListFields(self) do
  717. if field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE then
  718. if field.is_extension then
  719. name = string.format("(%s)", field.full_name)
  720. else
  721. name = field.name
  722. end
  723. if field.label == FieldDescriptor.LABEL_REPEATED then
  724. for i, element in ipairs(value) do
  725. prefix = string.format("%s[%d].", name, i)
  726. sub_errors = element:FindInitializationErrors()
  727. for _, e in ipairs(sub_errors) do
  728. errors[#errors + 1] = prefix .. e
  729. end
  730. end
  731. else
  732. prefix = name .. "."
  733. sub_errors = value:FindInitializationErrors()
  734. for _, e in ipairs(sub_errors) do
  735. errors[#errors + 1] = prefix .. e
  736. end
  737. end
  738. end
  739. end
  740. return errors
  741. end
  742. end
  743. local function _AddMergeFromMethod(message_meta)
  744. local LABEL_REPEATED = FieldDescriptor.LABEL_REPEATED
  745. local CPPTYPE_MESSAGE = FieldDescriptor.CPPTYPE_MESSAGE
  746. message_meta._member.MergeFrom = function (self, msg)
  747. assert(msg ~= self)
  748. message_meta._member._Modified(self)
  749. local fields = self._fields
  750. for field, value in pairs(msg._fields) do
  751. if field.label == LABEL_REPEATED or field.cpp_type == CPPTYPE_MESSAGE then
  752. field_value = fields[field]
  753. if field_value == nil then
  754. field_value = field._default_constructor(self)
  755. fields[field] = field_value
  756. end
  757. field_value:MergeFrom(value)
  758. else
  759. self._fields[field] = value
  760. end
  761. end
  762. end
  763. end
  764. local function _AddMessageMethods(message_descriptor, message_meta)
  765. _AddListFieldsMethod(message_descriptor, message_meta)
  766. _AddHasFieldMethod(message_descriptor, message_meta)
  767. _AddClearFieldMethod(message_descriptor, message_meta)
  768. if message_descriptor.is_extendable then
  769. _AddClearExtensionMethod(message_meta)
  770. _AddHasExtensionMethod(message_meta)
  771. end
  772. _AddClearMethod(message_descriptor, message_meta)
  773. -- _AddEqualsMethod(message_descriptor, message_meta)
  774. _AddStrMethod(message_meta)
  775. _AddSetListenerMethod(message_meta)
  776. _AddByteSizeMethod(message_descriptor, message_meta)
  777. _AddSerializeToStringMethod(message_descriptor, message_meta)
  778. _AddSerializePartialToStringMethod(message_descriptor, message_meta)
  779. _AddMergeFromStringMethod(message_descriptor, message_meta)
  780. _AddIsInitializedMethod(message_descriptor, message_meta)
  781. _AddMergeFromMethod(message_meta)
  782. end
  783. local function _AddPrivateHelperMethods(message_meta)
  784. local Modified = function (self)
  785. if not self._cached_byte_size_dirty then
  786. self._cached_byte_size_dirty = true
  787. self._listener_for_children.dirty = true
  788. self._is_present_in_parent = true
  789. self._listener:Modified()
  790. end
  791. end
  792. message_meta._member._Modified = Modified
  793. message_meta._member.SetInParent = Modified
  794. end
  795. local function property_getter(message_meta)
  796. local getter = message_meta._getter
  797. local member = message_meta._member
  798. return function (self, property)
  799. local g = getter[property]
  800. if g then
  801. return g(self)
  802. else
  803. return member[property]
  804. end
  805. end
  806. end
  807. local function property_setter(message_meta)
  808. local setter = message_meta._setter
  809. return function (self, property, value)
  810. local s = setter[property]
  811. if s then
  812. s(self, value)
  813. else
  814. error(property .. " not found")
  815. end
  816. end
  817. end
  818. function _AddClassAttributesForNestedExtensions(descriptor, message_meta)
  819. local extension_dict = descriptor._extensions_by_name
  820. for extension_name, extension_field in pairs(extension_dict) do
  821. message_meta._member[extension_name] = extension_field
  822. end
  823. end
  824. local function Message(descriptor)
  825. local message_meta = {}
  826. message_meta._decoders_by_tag = {}
  827. rawset(descriptor, "_extensions_by_name", {})
  828. for _, k in ipairs(descriptor.extensions) do
  829. descriptor._extensions_by_name[k.name] = k
  830. end
  831. rawset(descriptor, "_extensions_by_number", {})
  832. for _, k in ipairs(descriptor.extensions) do
  833. descriptor._extensions_by_number[k.number] = k
  834. end
  835. message_meta._descriptor = descriptor
  836. message_meta._extensions_by_name = {}
  837. message_meta._extensions_by_number = {}
  838. message_meta._getter = {}
  839. message_meta._setter = {}
  840. message_meta._member = {}
  841. -- message_meta._name = descriptor.full_name
  842. local ns = setmetatable({}, message_meta._member)
  843. message_meta._member.__call = _InitMethod(message_meta)
  844. message_meta._member.__index = message_meta._member
  845. message_meta._member.type = ns
  846. if rawget(descriptor, "_concrete_class") == nil then
  847. rawset(descriptor, "_concrete_class", ns)
  848. for k, field in ipairs(descriptor.fields) do
  849. _AttachFieldHelpers(message_meta, field)
  850. end
  851. end
  852. _AddEnumValues(descriptor, message_meta)
  853. _AddClassAttributesForNestedExtensions(descriptor, message_meta)
  854. _AddPropertiesForFields(descriptor, message_meta)
  855. _AddPropertiesForExtensions(descriptor, message_meta)
  856. _AddStaticMethods(message_meta)
  857. _AddMessageMethods(descriptor, message_meta)
  858. _AddPrivateHelperMethods(message_meta)
  859. message_meta.__index = property_getter(message_meta)
  860. message_meta.__newindex = property_setter(message_meta)
  861. return ns
  862. end
  863. _M.Message = Message