tdr.lua.txt 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. -- Tencent is pleased to support the open source community by making xLua available.
  2. -- Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.
  3. -- Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
  4. -- http://opensource.org/licenses/MIT
  5. -- Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
  6. require "libtdrlua"
  7. local m = {}
  8. for k, v in pairs(libtdrlua) do m[k] = v end
  9. local load_metalib, load_metalib_buf, free_metalib, get_meta, table2buf, buf2table, str2table, metamaxbufsize, bufalloc, buffree, buf2str
  10. load_metalib, m.load_metalib = m.load_metalib, nil
  11. load_metalib_buf, m.load_metalib_buf = m.load_metalib_buf, nil
  12. free_metalib, m.free_metalib = m.free_metalib, nil
  13. get_meta, m.get_meta = m.get_meta, nil
  14. table2buf, m.table2buf = m.table2buf, nil
  15. buf2table, m.buf2table = m.buf2table, nil
  16. str2table, m.str2table = m.str2table, nil
  17. buf2str, m.buf2str = m.buf2str, nil
  18. metamaxbufsize, m.metamaxbufsize = m.metamaxbufsize, nil
  19. bufalloc, m.bufalloc = m.bufalloc, nil
  20. buffree, m.buffree = m.buffree, nil
  21. local function create_msg_pk(meta, buf, buf_size)
  22. return {
  23. buff = buf,
  24. pack = function(obj)
  25. local ret_code, used_size = table2buf(meta, obj, buf, buf_size, 0)
  26. if ret_code ~= 0 then
  27. return ret_code, used_size
  28. end
  29. return buf2str(buf, used_size)
  30. end,
  31. unpack = function(str)
  32. return libtdrlua.str2table(meta, str, 0)
  33. end
  34. }
  35. end
  36. local function create_lib(metalib)
  37. return setmetatable({}, {
  38. __index = function(obj, k)
  39. local ret_code, meta = libtdrlua.get_meta(metalib, k)
  40. if ret_code ~= 0 then
  41. error("libtdrlua.get_meta() failed: errno=".. ret_code .. ",msg=" .. meta)
  42. end
  43. local ret_code, buf_size = libtdrlua.metamaxbufsize(metalib, k)
  44. if ret_code ~= 0 then
  45. error("libtdrlua.metamaxbufsize() failed: errno=".. ret_code .. ",msg=" .. buf_size)
  46. end
  47. local ret_code, buf = libtdrlua.bufalloc(buf_size)
  48. if ret_code ~= 0 then
  49. error("libtdrlua.bufalloc() failed: errno=".. ret_code .. ",msg=" .. buf)
  50. end
  51. local pk = create_msg_pk(meta, buf, buf_size)
  52. rawset(obj, k, pk)
  53. return pk
  54. end
  55. })
  56. end
  57. function m.from_file(file)
  58. local ret_code, metalib = libtdrlua.load_metalib(file)
  59. if ret_code ~= 0 then
  60. error("libtdrlua.load_metalib() failed: " .. metalib)
  61. end
  62. return create_lib(metalib)
  63. end
  64. function m.from_memory(str)
  65. local ret_code, metalib = libtdrlua.load_metalib_buf(str)
  66. if ret_code ~= 0 then
  67. error("libtdrlua.load_metalib_buf() failed: errno=".. ret_code .. ",msg=" .. metalib)
  68. end
  69. return create_lib(metalib)
  70. end
  71. return m