rufus-lua-win 5.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (459) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +69 -0
  6. data/Rakefile +1 -0
  7. data/lib/rufus/lua/win.rb +18 -0
  8. data/lib/rufus/lua/win/version.rb +7 -0
  9. data/rufus-lua-win.gemspec +23 -0
  10. data/vendor/lua/bin/liblua.dll +0 -0
  11. data/vendor/lua/lib/lua/LuaXml.lua +119 -0
  12. data/vendor/lua/lib/lua/alien.lua +250 -0
  13. data/vendor/lua/lib/lua/alien/core.dll +0 -0
  14. data/vendor/lua/lib/lua/alien/struct.dll +0 -0
  15. data/vendor/lua/lib/lua/base.lua +536 -0
  16. data/vendor/lua/lib/lua/bin.lua +20 -0
  17. data/vendor/lua/lib/lua/bit.dll +0 -0
  18. data/vendor/lua/lib/lua/cdlua.dll +0 -0
  19. data/vendor/lua/lib/lua/cdluacontextplus.dll +0 -0
  20. data/vendor/lua/lib/lua/cdluagl.dll +0 -0
  21. data/vendor/lua/lib/lua/cdluaim.dll +0 -0
  22. data/vendor/lua/lib/lua/cdluapdf.dll +0 -0
  23. data/vendor/lua/lib/lua/copas.lua +543 -0
  24. data/vendor/lua/lib/lua/coxpcall.lua +57 -0
  25. data/vendor/lua/lib/lua/date.lua +745 -0
  26. data/vendor/lua/lib/lua/debug_ext.lua +84 -0
  27. data/vendor/lua/lib/lua/debug_init.lua +2 -0
  28. data/vendor/lua/lib/lua/des56.dll +0 -0
  29. data/vendor/lua/lib/lua/dist/config.lua +109 -0
  30. data/vendor/lua/lib/lua/dist/constraints.lua +271 -0
  31. data/vendor/lua/lib/lua/dist/depends.lua +601 -0
  32. data/vendor/lua/lib/lua/dist/git.lua +307 -0
  33. data/vendor/lua/lib/lua/dist/init.lua +278 -0
  34. data/vendor/lua/lib/lua/dist/manifest.lua +225 -0
  35. data/vendor/lua/lib/lua/dist/package.lua +583 -0
  36. data/vendor/lua/lib/lua/dist/sys.lua +367 -0
  37. data/vendor/lua/lib/lua/dist/utils.lua +130 -0
  38. data/vendor/lua/lib/lua/ex.dll +0 -0
  39. data/vendor/lua/lib/lua/fstable.lua +116 -0
  40. data/vendor/lua/lib/lua/getopt.lua +273 -0
  41. data/vendor/lua/lib/lua/git.lua +5 -0
  42. data/vendor/lua/lib/lua/git/core.dll +0 -0
  43. data/vendor/lua/lib/lua/git/objects.lua +121 -0
  44. data/vendor/lua/lib/lua/git/pack.lua +316 -0
  45. data/vendor/lua/lib/lua/git/protocol.lua +188 -0
  46. data/vendor/lua/lib/lua/git/repo.lua +283 -0
  47. data/vendor/lua/lib/lua/git/util.lua +233 -0
  48. data/vendor/lua/lib/lua/gzio.dll +0 -0
  49. data/vendor/lua/lib/lua/gzip.lua +81 -0
  50. data/vendor/lua/lib/lua/iconv.dll +0 -0
  51. data/vendor/lua/lib/lua/imlua.dll +0 -0
  52. data/vendor/lua/lib/lua/imlua_fftw.dll +0 -0
  53. data/vendor/lua/lib/lua/imlua_jp2.dll +0 -0
  54. data/vendor/lua/lib/lua/imlua_process.dll +0 -0
  55. data/vendor/lua/lib/lua/imlua_process_omp.dll +0 -0
  56. data/vendor/lua/lib/lua/io_ext.lua +115 -0
  57. data/vendor/lua/lib/lua/iuplua.dll +0 -0
  58. data/vendor/lua/lib/lua/iuplua_mglplot.dll +0 -0
  59. data/vendor/lua/lib/lua/iuplua_pplot.dll +0 -0
  60. data/vendor/lua/lib/lua/iupluacd.dll +0 -0
  61. data/vendor/lua/lib/lua/iupluacontrols.dll +0 -0
  62. data/vendor/lua/lib/lua/iupluagl.dll +0 -0
  63. data/vendor/lua/lib/lua/iupluaim.dll +0 -0
  64. data/vendor/lua/lib/lua/iupluaimglib.dll +0 -0
  65. data/vendor/lua/lib/lua/iupluatuio.dll +0 -0
  66. data/vendor/lua/lib/lua/lanes-keeper.lua +302 -0
  67. data/vendor/lua/lib/lua/lanes.lua +591 -0
  68. data/vendor/lua/lib/lua/lanes/core.dll +0 -0
  69. data/vendor/lua/lib/lua/lcs.lua +55 -0
  70. data/vendor/lua/lib/lua/lemock.lua +659 -0
  71. data/vendor/lua/lib/lua/lfs.dll +0 -0
  72. data/vendor/lua/lib/lua/list.lua +375 -0
  73. data/vendor/lua/lib/lua/logging.lua +189 -0
  74. data/vendor/lua/lib/lua/logging/console.lua +22 -0
  75. data/vendor/lua/lib/lua/logging/email.lua +44 -0
  76. data/vendor/lua/lib/lua/logging/file.lua +55 -0
  77. data/vendor/lua/lib/lua/logging/rolling_file.lua +81 -0
  78. data/vendor/lua/lib/lua/logging/socket.lua +35 -0
  79. data/vendor/lua/lib/lua/logging/sql.lua +64 -0
  80. data/vendor/lua/lib/lua/loop/base.lua +68 -0
  81. data/vendor/lua/lib/lua/loop/cached.lua +312 -0
  82. data/vendor/lua/lib/lua/loop/collection/MapWithArrayOfKeys.lua +64 -0
  83. data/vendor/lua/lib/lua/loop/collection/ObjectCache.lua +39 -0
  84. data/vendor/lua/lib/lua/loop/collection/OrderedSet.lua +164 -0
  85. data/vendor/lua/lib/lua/loop/collection/PriorityQueue.lua +86 -0
  86. data/vendor/lua/lib/lua/loop/collection/UnorderedArray.lua +32 -0
  87. data/vendor/lua/lib/lua/loop/collection/UnorderedArraySet.lua +56 -0
  88. data/vendor/lua/lib/lua/loop/compiler/Arguments.lua +108 -0
  89. data/vendor/lua/lib/lua/loop/compiler/Conditional.lua +50 -0
  90. data/vendor/lua/lib/lua/loop/compiler/Expression.lua +215 -0
  91. data/vendor/lua/lib/lua/loop/component/base.lua +221 -0
  92. data/vendor/lua/lib/lua/loop/component/contained.lua +71 -0
  93. data/vendor/lua/lib/lua/loop/component/dynamic.lua +223 -0
  94. data/vendor/lua/lib/lua/loop/component/intercepted.lua +354 -0
  95. data/vendor/lua/lib/lua/loop/component/wrapped.lua +195 -0
  96. data/vendor/lua/lib/lua/loop/debug/Inspector.lua +521 -0
  97. data/vendor/lua/lib/lua/loop/debug/Matcher.lua +192 -0
  98. data/vendor/lua/lib/lua/loop/debug/Verbose.lua +266 -0
  99. data/vendor/lua/lib/lua/loop/debug/Viewer.lua +200 -0
  100. data/vendor/lua/lib/lua/loop/multiple.lua +105 -0
  101. data/vendor/lua/lib/lua/loop/object/Exception.lua +57 -0
  102. data/vendor/lua/lib/lua/loop/object/Publisher.lua +43 -0
  103. data/vendor/lua/lib/lua/loop/object/Wrapper.lua +39 -0
  104. data/vendor/lua/lib/lua/loop/scoped.lua +585 -0
  105. data/vendor/lua/lib/lua/loop/serial/FileStream.lua +48 -0
  106. data/vendor/lua/lib/lua/loop/serial/Serializer.lua +291 -0
  107. data/vendor/lua/lib/lua/loop/serial/SocketStream.lua +51 -0
  108. data/vendor/lua/lib/lua/loop/serial/StringStream.lua +47 -0
  109. data/vendor/lua/lib/lua/loop/simple.lua +75 -0
  110. data/vendor/lua/lib/lua/loop/table.lua +71 -0
  111. data/vendor/lua/lib/lua/loop/thread/CoSocket.lua +416 -0
  112. data/vendor/lua/lib/lua/loop/thread/IOScheduler.lua +170 -0
  113. data/vendor/lua/lib/lua/loop/thread/Scheduler.lua +327 -0
  114. data/vendor/lua/lib/lua/loop/thread/SocketScheduler.lua +88 -0
  115. data/vendor/lua/lib/lua/loop/thread/Timer.lua +54 -0
  116. data/vendor/lua/lib/lua/lpeg.dll +0 -0
  117. data/vendor/lua/lib/lua/ltn12.lua +292 -0
  118. data/vendor/lua/lib/lua/luaXML_lib.dll +0 -0
  119. data/vendor/lua/lib/lua/luacurl.dll +0 -0
  120. data/vendor/lua/lib/lua/luadoc/config.lua +34 -0
  121. data/vendor/lua/lib/lua/luadoc/doclet/debug.lua +46 -0
  122. data/vendor/lua/lib/lua/luadoc/doclet/formatter.lua +84 -0
  123. data/vendor/lua/lib/lua/luadoc/doclet/html.lua +289 -0
  124. data/vendor/lua/lib/lua/luadoc/doclet/html/file.lp +113 -0
  125. data/vendor/lua/lib/lua/luadoc/doclet/html/function.lp +64 -0
  126. data/vendor/lua/lib/lua/luadoc/doclet/html/index.lp +70 -0
  127. data/vendor/lua/lib/lua/luadoc/doclet/html/luadoc.css +286 -0
  128. data/vendor/lua/lib/lua/luadoc/doclet/html/menu.lp +55 -0
  129. data/vendor/lua/lib/lua/luadoc/doclet/html/module.lp +109 -0
  130. data/vendor/lua/lib/lua/luadoc/doclet/html/table.lp +15 -0
  131. data/vendor/lua/lib/lua/luadoc/doclet/raw.lua +12 -0
  132. data/vendor/lua/lib/lua/luadoc/init.lua +58 -0
  133. data/vendor/lua/lib/lua/luadoc/lp.lua +130 -0
  134. data/vendor/lua/lib/lua/luadoc/taglet/standard.lua +495 -0
  135. data/vendor/lua/lib/lua/luadoc/taglet/standard/tags.lua +171 -0
  136. data/vendor/lua/lib/lua/luadoc/util.lua +233 -0
  137. data/vendor/lua/lib/lua/luagl.dll +0 -0
  138. data/vendor/lua/lib/lua/luaglu.dll +0 -0
  139. data/vendor/lua/lib/lua/luaidl.lua +113 -0
  140. data/vendor/lua/lib/lua/luaidl/lex.lua +793 -0
  141. data/vendor/lua/lib/lua/luaidl/pre.lua +149 -0
  142. data/vendor/lua/lib/lua/luaidl/sin.lua +3631 -0
  143. data/vendor/lua/lib/lua/luarocks/add.lua +108 -0
  144. data/vendor/lua/lib/lua/luarocks/admin_remove.lua +87 -0
  145. data/vendor/lua/lib/lua/luarocks/build.lua +330 -0
  146. data/vendor/lua/lib/lua/luarocks/build/builtin.lua +253 -0
  147. data/vendor/lua/lib/lua/luarocks/build/cmake.lua +54 -0
  148. data/vendor/lua/lib/lua/luarocks/build/command.lua +32 -0
  149. data/vendor/lua/lib/lua/luarocks/build/make.lua +92 -0
  150. data/vendor/lua/lib/lua/luarocks/cache.lua +85 -0
  151. data/vendor/lua/lib/lua/luarocks/cfg.lua +449 -0
  152. data/vendor/lua/lib/lua/luarocks/command_line.lua +163 -0
  153. data/vendor/lua/lib/lua/luarocks/deps.lua +654 -0
  154. data/vendor/lua/lib/lua/luarocks/dir.lua +69 -0
  155. data/vendor/lua/lib/lua/luarocks/download.lua +90 -0
  156. data/vendor/lua/lib/lua/luarocks/fetch.lua +321 -0
  157. data/vendor/lua/lib/lua/luarocks/fetch/cvs.lua +44 -0
  158. data/vendor/lua/lib/lua/luarocks/fetch/git.lua +81 -0
  159. data/vendor/lua/lib/lua/luarocks/fetch/git_file.lua +17 -0
  160. data/vendor/lua/lib/lua/luarocks/fetch/hg.lua +54 -0
  161. data/vendor/lua/lib/lua/luarocks/fetch/sscm.lua +42 -0
  162. data/vendor/lua/lib/lua/luarocks/fetch/svn.lua +53 -0
  163. data/vendor/lua/lib/lua/luarocks/fs.lua +40 -0
  164. data/vendor/lua/lib/lua/luarocks/fs/lua.lua +676 -0
  165. data/vendor/lua/lib/lua/luarocks/fs/unix.lua +88 -0
  166. data/vendor/lua/lib/lua/luarocks/fs/unix/tools.lua +325 -0
  167. data/vendor/lua/lib/lua/luarocks/fs/win32.lua +107 -0
  168. data/vendor/lua/lib/lua/luarocks/fs/win32/tools.lua +334 -0
  169. data/vendor/lua/lib/lua/luarocks/help.lua +101 -0
  170. data/vendor/lua/lib/lua/luarocks/index.lua +172 -0
  171. data/vendor/lua/lib/lua/luarocks/install.lua +151 -0
  172. data/vendor/lua/lib/lua/luarocks/list.lua +35 -0
  173. data/vendor/lua/lib/lua/luarocks/loader.lua +228 -0
  174. data/vendor/lua/lib/lua/luarocks/make.lua +71 -0
  175. data/vendor/lua/lib/lua/luarocks/make_manifest.lua +34 -0
  176. data/vendor/lua/lib/lua/luarocks/manif.lua +360 -0
  177. data/vendor/lua/lib/lua/luarocks/manif_core.lua +75 -0
  178. data/vendor/lua/lib/lua/luarocks/new_version.lua +141 -0
  179. data/vendor/lua/lib/lua/luarocks/pack.lua +205 -0
  180. data/vendor/lua/lib/lua/luarocks/path.lua +315 -0
  181. data/vendor/lua/lib/lua/luarocks/persist.lua +173 -0
  182. data/vendor/lua/lib/lua/luarocks/refresh_cache.lua +30 -0
  183. data/vendor/lua/lib/lua/luarocks/remove.lua +135 -0
  184. data/vendor/lua/lib/lua/luarocks/rep.lua +313 -0
  185. data/vendor/lua/lib/lua/luarocks/require.lua +6 -0
  186. data/vendor/lua/lib/lua/luarocks/search.lua +399 -0
  187. data/vendor/lua/lib/lua/luarocks/show.lua +138 -0
  188. data/vendor/lua/lib/lua/luarocks/site_config.lua +23 -0
  189. data/vendor/lua/lib/lua/luarocks/tools/patch.lua +712 -0
  190. data/vendor/lua/lib/lua/luarocks/tools/tar.lua +144 -0
  191. data/vendor/lua/lib/lua/luarocks/tools/zip.lua +245 -0
  192. data/vendor/lua/lib/lua/luarocks/type_check.lua +267 -0
  193. data/vendor/lua/lib/lua/luarocks/unpack.lua +151 -0
  194. data/vendor/lua/lib/lua/luarocks/util.lua +420 -0
  195. data/vendor/lua/lib/lua/luarocks/validate.lua +164 -0
  196. data/vendor/lua/lib/lua/luars232.dll +0 -0
  197. data/vendor/lua/lib/lua/luasql/mysql.dll +0 -0
  198. data/vendor/lua/lib/lua/luasql/postgres.dll +0 -0
  199. data/vendor/lua/lib/lua/luasql/sqlite3.dll +0 -0
  200. data/vendor/lua/lib/lua/luaunit.lua +601 -0
  201. data/vendor/lua/lib/lua/lxp.dll +0 -0
  202. data/vendor/lua/lib/lua/lxp/lom.lua +60 -0
  203. data/vendor/lua/lib/lua/math_ext.lua +27 -0
  204. data/vendor/lua/lib/lua/mbox.lua +53 -0
  205. data/vendor/lua/lib/lua/md5.lua +19 -0
  206. data/vendor/lua/lib/lua/md5/core.dll +0 -0
  207. data/vendor/lua/lib/lua/metalua.lua +0 -0
  208. data/vendor/lua/lib/lua/metalua/ast_to_string.mlua +553 -0
  209. data/vendor/lua/lib/lua/metalua/base.lua +104 -0
  210. data/vendor/lua/lib/lua/metalua/bytecode.lua +0 -0
  211. data/vendor/lua/lib/lua/metalua/clopts.mlua +204 -0
  212. data/vendor/lua/lib/lua/metalua/compiler.lua +3 -0
  213. data/vendor/lua/lib/lua/metalua/dollar.mlua +24 -0
  214. data/vendor/lua/lib/lua/metalua/extension/H-runtime.mlua +216 -0
  215. data/vendor/lua/lib/lua/metalua/extension/H.mlua +22 -0
  216. data/vendor/lua/lib/lua/metalua/extension/anaphoric.mlua +54 -0
  217. data/vendor/lua/lib/lua/metalua/extension/clist.mlua +149 -0
  218. data/vendor/lua/lib/lua/metalua/extension/continue.mlua +53 -0
  219. data/vendor/lua/lib/lua/metalua/extension/localin.mlua +2 -0
  220. data/vendor/lua/lib/lua/metalua/extension/log.mlua +39 -0
  221. data/vendor/lua/lib/lua/metalua/extension/match.mlua +374 -0
  222. data/vendor/lua/lib/lua/metalua/extension/ternary.mlua +10 -0
  223. data/vendor/lua/lib/lua/metalua/extension/trycatch.mlua +189 -0
  224. data/vendor/lua/lib/lua/metalua/extension/types-runtime.mlua +159 -0
  225. data/vendor/lua/lib/lua/metalua/extension/types.mlua +352 -0
  226. data/vendor/lua/lib/lua/metalua/extension/withdo.mlua +30 -0
  227. data/vendor/lua/lib/lua/metalua/extension/xglobal-runtime.lua +41 -0
  228. data/vendor/lua/lib/lua/metalua/extension/xglobal.mlua +20 -0
  229. data/vendor/lua/lib/lua/metalua/extension/xloop.mlua +100 -0
  230. data/vendor/lua/lib/lua/metalua/extension/xmatch.mlua +216 -0
  231. data/vendor/lua/lib/lua/metalua/metaloop.mlua +76 -0
  232. data/vendor/lua/lib/lua/metalua/mlc.lua +0 -0
  233. data/vendor/lua/lib/lua/metalua/mlc_xcall.lua +119 -0
  234. data/vendor/lua/lib/lua/metalua/mlp.lua +0 -0
  235. data/vendor/lua/lib/lua/metalua/package2.lua +101 -0
  236. data/vendor/lua/lib/lua/metalua/runtime.lua +3 -0
  237. data/vendor/lua/lib/lua/metalua/string2.lua +44 -0
  238. data/vendor/lua/lib/lua/metalua/table2.lua +372 -0
  239. data/vendor/lua/lib/lua/metalua/walk.mlua +304 -0
  240. data/vendor/lua/lib/lua/metalua/walk/bindings.mlua +41 -0
  241. data/vendor/lua/lib/lua/metalua/walk/id.mlua +186 -0
  242. data/vendor/lua/lib/lua/metalua/walk/scope.lua +54 -0
  243. data/vendor/lua/lib/lua/mime.lua +87 -0
  244. data/vendor/lua/lib/lua/mime/core.dll +0 -0
  245. data/vendor/lua/lib/lua/mobdebug.lua +1484 -0
  246. data/vendor/lua/lib/lua/modules.lua +16 -0
  247. data/vendor/lua/lib/lua/object.lua +56 -0
  248. data/vendor/lua/lib/lua/oil/Exception.lua +26 -0
  249. data/vendor/lua/lib/lua/oil/arch.lua +27 -0
  250. data/vendor/lua/lib/lua/oil/arch/basic/client.lua +29 -0
  251. data/vendor/lua/lib/lua/oil/arch/basic/common.lua +13 -0
  252. data/vendor/lua/lib/lua/oil/arch/basic/server.lua +27 -0
  253. data/vendor/lua/lib/lua/oil/arch/cooperative/common.lua +10 -0
  254. data/vendor/lua/lib/lua/oil/arch/cooperative/server.lua +16 -0
  255. data/vendor/lua/lib/lua/oil/arch/corba/client.lua +39 -0
  256. data/vendor/lua/lib/lua/oil/arch/corba/common.lua +58 -0
  257. data/vendor/lua/lib/lua/oil/arch/corba/intercepted/client.lua +9 -0
  258. data/vendor/lua/lib/lua/oil/arch/corba/intercepted/server.lua +9 -0
  259. data/vendor/lua/lib/lua/oil/arch/corba/server.lua +35 -0
  260. data/vendor/lua/lib/lua/oil/arch/ludo/byref.lua +18 -0
  261. data/vendor/lua/lib/lua/oil/arch/ludo/client.lua +19 -0
  262. data/vendor/lua/lib/lua/oil/arch/ludo/common.lua +18 -0
  263. data/vendor/lua/lib/lua/oil/arch/ludo/server.lua +19 -0
  264. data/vendor/lua/lib/lua/oil/arch/typed/client.lua +27 -0
  265. data/vendor/lua/lib/lua/oil/arch/typed/common.lua +9 -0
  266. data/vendor/lua/lib/lua/oil/arch/typed/server.lua +18 -0
  267. data/vendor/lua/lib/lua/oil/assert.lua +87 -0
  268. data/vendor/lua/lib/lua/oil/builder.lua +45 -0
  269. data/vendor/lua/lib/lua/oil/builder/basic/client.lua +31 -0
  270. data/vendor/lua/lib/lua/oil/builder/basic/common.lua +11 -0
  271. data/vendor/lua/lib/lua/oil/builder/basic/server.lua +13 -0
  272. data/vendor/lua/lib/lua/oil/builder/cooperative/common.lua +11 -0
  273. data/vendor/lua/lib/lua/oil/builder/cooperative/server.lua +11 -0
  274. data/vendor/lua/lib/lua/oil/builder/corba/client.lua +13 -0
  275. data/vendor/lua/lib/lua/oil/builder/corba/common.lua +24 -0
  276. data/vendor/lua/lib/lua/oil/builder/corba/gencode.lua +13 -0
  277. data/vendor/lua/lib/lua/oil/builder/corba/intercepted/client.lua +11 -0
  278. data/vendor/lua/lib/lua/oil/builder/corba/intercepted/server.lua +11 -0
  279. data/vendor/lua/lib/lua/oil/builder/corba/server.lua +13 -0
  280. data/vendor/lua/lib/lua/oil/builder/lua/client.lua +11 -0
  281. data/vendor/lua/lib/lua/oil/builder/lua/server.lua +12 -0
  282. data/vendor/lua/lib/lua/oil/builder/ludo/byref.lua +13 -0
  283. data/vendor/lua/lib/lua/oil/builder/ludo/client.lua +13 -0
  284. data/vendor/lua/lib/lua/oil/builder/ludo/common.lua +14 -0
  285. data/vendor/lua/lib/lua/oil/builder/ludo/server.lua +13 -0
  286. data/vendor/lua/lib/lua/oil/builder/typed/client.lua +16 -0
  287. data/vendor/lua/lib/lua/oil/builder/typed/server.lua +12 -0
  288. data/vendor/lua/lib/lua/oil/compat.lua +846 -0
  289. data/vendor/lua/lib/lua/oil/component.lua +1 -0
  290. data/vendor/lua/lib/lua/oil/corba/giop.lua +301 -0
  291. data/vendor/lua/lib/lua/oil/corba/giop/Codec.lua +1568 -0
  292. data/vendor/lua/lib/lua/oil/corba/giop/CodecGen.lua +589 -0
  293. data/vendor/lua/lib/lua/oil/corba/giop/Exception.lua +25 -0
  294. data/vendor/lua/lib/lua/oil/corba/giop/Indexer.lua +63 -0
  295. data/vendor/lua/lib/lua/oil/corba/giop/Listener.lua +343 -0
  296. data/vendor/lua/lib/lua/oil/corba/giop/Messenger.lua +228 -0
  297. data/vendor/lua/lib/lua/oil/corba/giop/Referrer.lua +180 -0
  298. data/vendor/lua/lib/lua/oil/corba/giop/Requester.lua +462 -0
  299. data/vendor/lua/lib/lua/oil/corba/idl.lua +597 -0
  300. data/vendor/lua/lib/lua/oil/corba/idl/Compiler.lua +133 -0
  301. data/vendor/lua/lib/lua/oil/corba/idl/Importer.lua +235 -0
  302. data/vendor/lua/lib/lua/oil/corba/idl/Indexer.lua +95 -0
  303. data/vendor/lua/lib/lua/oil/corba/idl/Registry.lua +1821 -0
  304. data/vendor/lua/lib/lua/oil/corba/idl/ir.lua +847 -0
  305. data/vendor/lua/lib/lua/oil/corba/idl/sysex.lua +21 -0
  306. data/vendor/lua/lib/lua/oil/corba/iiop/Profiler.lua +200 -0
  307. data/vendor/lua/lib/lua/oil/corba/intercepted/Listener.lua +158 -0
  308. data/vendor/lua/lib/lua/oil/corba/intercepted/Requester.lua +181 -0
  309. data/vendor/lua/lib/lua/oil/corba/services/event.lua +126 -0
  310. data/vendor/lua/lib/lua/oil/corba/services/event/ConsumerAdmin.lua +50 -0
  311. data/vendor/lua/lib/lua/oil/corba/services/event/EventFactory.lua +15 -0
  312. data/vendor/lua/lib/lua/oil/corba/services/event/EventQueue.lua +37 -0
  313. data/vendor/lua/lib/lua/oil/corba/services/event/ProxyPushConsumer.lua +75 -0
  314. data/vendor/lua/lib/lua/oil/corba/services/event/ProxyPushSupplier.lua +62 -0
  315. data/vendor/lua/lib/lua/oil/corba/services/event/SingleDeferredDispatcher.lua +60 -0
  316. data/vendor/lua/lib/lua/oil/corba/services/event/SingleSynchronousDispatcher.lua +39 -0
  317. data/vendor/lua/lib/lua/oil/corba/services/event/SupplierAdmin.lua +50 -0
  318. data/vendor/lua/lib/lua/oil/corba/services/naming.lua +436 -0
  319. data/vendor/lua/lib/lua/oil/kernel/base/Acceptor.lua +268 -0
  320. data/vendor/lua/lib/lua/oil/kernel/base/Channels.lua +121 -0
  321. data/vendor/lua/lib/lua/oil/kernel/base/Connector.lua +147 -0
  322. data/vendor/lua/lib/lua/oil/kernel/base/Dispatcher.lua +99 -0
  323. data/vendor/lua/lib/lua/oil/kernel/base/Proxies.lua +86 -0
  324. data/vendor/lua/lib/lua/oil/kernel/base/Proxies/asynchronous.lua +56 -0
  325. data/vendor/lua/lib/lua/oil/kernel/base/Proxies/protected.lua +17 -0
  326. data/vendor/lua/lib/lua/oil/kernel/base/Proxies/synchronous.lua +17 -0
  327. data/vendor/lua/lib/lua/oil/kernel/base/Proxies/utils.lua +29 -0
  328. data/vendor/lua/lib/lua/oil/kernel/base/Receiver.lua +110 -0
  329. data/vendor/lua/lib/lua/oil/kernel/base/Servants.lua +207 -0
  330. data/vendor/lua/lib/lua/oil/kernel/base/Sockets.lua +44 -0
  331. data/vendor/lua/lib/lua/oil/kernel/cooperative/Receiver.lua +139 -0
  332. data/vendor/lua/lib/lua/oil/kernel/intercepted/Listener.lua +47 -0
  333. data/vendor/lua/lib/lua/oil/kernel/intercepted/Requester.lua +58 -0
  334. data/vendor/lua/lib/lua/oil/kernel/lua/Dispatcher.lua +76 -0
  335. data/vendor/lua/lib/lua/oil/kernel/lua/Proxies.lua +69 -0
  336. data/vendor/lua/lib/lua/oil/kernel/typed/Dispatcher.lua +91 -0
  337. data/vendor/lua/lib/lua/oil/kernel/typed/Proxies.lua +153 -0
  338. data/vendor/lua/lib/lua/oil/kernel/typed/Servants.lua +137 -0
  339. data/vendor/lua/lib/lua/oil/ludo/Codec.lua +66 -0
  340. data/vendor/lua/lib/lua/oil/ludo/CodecByRef.lua +103 -0
  341. data/vendor/lua/lib/lua/oil/ludo/Listener.lua +151 -0
  342. data/vendor/lua/lib/lua/oil/ludo/Referrer.lua +72 -0
  343. data/vendor/lua/lib/lua/oil/ludo/Requester.lua +107 -0
  344. data/vendor/lua/lib/lua/oil/oo.lua +1 -0
  345. data/vendor/lua/lib/lua/oil/port.lua +1 -0
  346. data/vendor/lua/lib/lua/oil/properties.lua +57 -0
  347. data/vendor/lua/lib/lua/oil/verbose.lua +133 -0
  348. data/vendor/lua/lib/lua/package_ext.lua +15 -0
  349. data/vendor/lua/lib/lua/parser.lua +268 -0
  350. data/vendor/lua/lib/lua/pl/Date.lua +555 -0
  351. data/vendor/lua/lib/lua/pl/List.lua +613 -0
  352. data/vendor/lua/lib/lua/pl/Map.lua +113 -0
  353. data/vendor/lua/lib/lua/pl/MultiMap.lua +62 -0
  354. data/vendor/lua/lib/lua/pl/OrderedMap.lua +151 -0
  355. data/vendor/lua/lib/lua/pl/Set.lua +153 -0
  356. data/vendor/lua/lib/lua/pl/app.lua +165 -0
  357. data/vendor/lua/lib/lua/pl/array2d.lua +501 -0
  358. data/vendor/lua/lib/lua/pl/class.lua +180 -0
  359. data/vendor/lua/lib/lua/pl/comprehension.lua +286 -0
  360. data/vendor/lua/lib/lua/pl/config.lua +176 -0
  361. data/vendor/lua/lib/lua/pl/data.lua +606 -0
  362. data/vendor/lua/lib/lua/pl/dir.lua +475 -0
  363. data/vendor/lua/lib/lua/pl/file.lua +70 -0
  364. data/vendor/lua/lib/lua/pl/func.lua +376 -0
  365. data/vendor/lua/lib/lua/pl/init.lua +68 -0
  366. data/vendor/lua/lib/lua/pl/input.lua +173 -0
  367. data/vendor/lua/lib/lua/pl/lapp.lua +407 -0
  368. data/vendor/lua/lib/lua/pl/lexer.lua +456 -0
  369. data/vendor/lua/lib/lua/pl/luabalanced.lua +264 -0
  370. data/vendor/lua/lib/lua/pl/operator.lua +201 -0
  371. data/vendor/lua/lib/lua/pl/path.lua +398 -0
  372. data/vendor/lua/lib/lua/pl/permute.lua +63 -0
  373. data/vendor/lua/lib/lua/pl/platf/luajava.lua +101 -0
  374. data/vendor/lua/lib/lua/pl/pretty.lua +285 -0
  375. data/vendor/lua/lib/lua/pl/seq.lua +551 -0
  376. data/vendor/lua/lib/lua/pl/sip.lua +344 -0
  377. data/vendor/lua/lib/lua/pl/strict.lua +70 -0
  378. data/vendor/lua/lib/lua/pl/stringio.lua +158 -0
  379. data/vendor/lua/lib/lua/pl/stringx.lua +440 -0
  380. data/vendor/lua/lib/lua/pl/tablex.lua +817 -0
  381. data/vendor/lua/lib/lua/pl/template.lua +103 -0
  382. data/vendor/lua/lib/lua/pl/test.lua +135 -0
  383. data/vendor/lua/lib/lua/pl/text.lua +243 -0
  384. data/vendor/lua/lib/lua/pl/utils.lua +550 -0
  385. data/vendor/lua/lib/lua/pl/xml.lua +689 -0
  386. data/vendor/lua/lib/lua/profiler.dll +0 -0
  387. data/vendor/lua/lib/lua/re.lua +248 -0
  388. data/vendor/lua/lib/lua/rex_onig.dll +0 -0
  389. data/vendor/lua/lib/lua/rex_pcre.dll +0 -0
  390. data/vendor/lua/lib/lua/rex_posix.dll +0 -0
  391. data/vendor/lua/lib/lua/rings.dll +0 -0
  392. data/vendor/lua/lib/lua/serialize.lua +193 -0
  393. data/vendor/lua/lib/lua/set.lua +149 -0
  394. data/vendor/lua/lib/lua/socket.lua +133 -0
  395. data/vendor/lua/lib/lua/socket/core.dll +0 -0
  396. data/vendor/lua/lib/lua/socket/ftp.lua +281 -0
  397. data/vendor/lua/lib/lua/socket/http.lua +350 -0
  398. data/vendor/lua/lib/lua/socket/smtp.lua +251 -0
  399. data/vendor/lua/lib/lua/socket/tp.lua +123 -0
  400. data/vendor/lua/lib/lua/socket/url.lua +297 -0
  401. data/vendor/lua/lib/lua/ssl.dll +0 -0
  402. data/vendor/lua/lib/lua/ssl.lua +93 -0
  403. data/vendor/lua/lib/lua/ssl/https.lua +138 -0
  404. data/vendor/lua/lib/lua/stable.lua +28 -0
  405. data/vendor/lua/lib/lua/std.lua +16 -0
  406. data/vendor/lua/lib/lua/strbuf.lua +32 -0
  407. data/vendor/lua/lib/lua/strict.lua +45 -0
  408. data/vendor/lua/lib/lua/string_ext.lua +274 -0
  409. data/vendor/lua/lib/lua/table_ext.lua +117 -0
  410. data/vendor/lua/lib/lua/tar.lua +262 -0
  411. data/vendor/lua/lib/lua/task.dll +0 -0
  412. data/vendor/lua/lib/lua/tree.lua +81 -0
  413. data/vendor/lua/lib/lua/unicode.dll +0 -0
  414. data/vendor/lua/lib/lua/verbose_require.lua +11 -0
  415. data/vendor/lua/lib/lua/vstruct.lua +86 -0
  416. data/vendor/lua/lib/lua/vstruct/ast.lua +192 -0
  417. data/vendor/lua/lib/lua/vstruct/ast/Bitpack.lua +33 -0
  418. data/vendor/lua/lib/lua/vstruct/ast/Generator.lua +174 -0
  419. data/vendor/lua/lib/lua/vstruct/ast/IO.lua +45 -0
  420. data/vendor/lua/lib/lua/vstruct/ast/List.lua +56 -0
  421. data/vendor/lua/lib/lua/vstruct/ast/Name.lua +20 -0
  422. data/vendor/lua/lib/lua/vstruct/ast/Repeat.lua +23 -0
  423. data/vendor/lua/lib/lua/vstruct/ast/Root.lua +19 -0
  424. data/vendor/lua/lib/lua/vstruct/ast/Table.lua +65 -0
  425. data/vendor/lua/lib/lua/vstruct/cursor.lua +81 -0
  426. data/vendor/lua/lib/lua/vstruct/io.lua +45 -0
  427. data/vendor/lua/lib/lua/vstruct/io/a.lua +24 -0
  428. data/vendor/lua/lib/lua/vstruct/io/b.lua +28 -0
  429. data/vendor/lua/lib/lua/vstruct/io/bigendian.lua +21 -0
  430. data/vendor/lua/lib/lua/vstruct/io/c.lua +25 -0
  431. data/vendor/lua/lib/lua/vstruct/io/defaults.lua +24 -0
  432. data/vendor/lua/lib/lua/vstruct/io/endianness.lua +41 -0
  433. data/vendor/lua/lib/lua/vstruct/io/f.lua +129 -0
  434. data/vendor/lua/lib/lua/vstruct/io/hostendian.lua +21 -0
  435. data/vendor/lua/lib/lua/vstruct/io/i.lua +42 -0
  436. data/vendor/lua/lib/lua/vstruct/io/littleendian.lua +21 -0
  437. data/vendor/lua/lib/lua/vstruct/io/m.lua +62 -0
  438. data/vendor/lua/lib/lua/vstruct/io/p.lua +23 -0
  439. data/vendor/lua/lib/lua/vstruct/io/s.lua +27 -0
  440. data/vendor/lua/lib/lua/vstruct/io/seekb.lua +18 -0
  441. data/vendor/lua/lib/lua/vstruct/io/seekf.lua +18 -0
  442. data/vendor/lua/lib/lua/vstruct/io/seekto.lua +18 -0
  443. data/vendor/lua/lib/lua/vstruct/io/u.lua +54 -0
  444. data/vendor/lua/lib/lua/vstruct/io/x.lua +34 -0
  445. data/vendor/lua/lib/lua/vstruct/io/z.lua +63 -0
  446. data/vendor/lua/lib/lua/vstruct/lexer.lua +100 -0
  447. data/vendor/lua/lib/lua/vstruct/pack.lua +142 -0
  448. data/vendor/lua/lib/lua/vstruct/test.lua +47 -0
  449. data/vendor/lua/lib/lua/vstruct/test/basic.lua +73 -0
  450. data/vendor/lua/lib/lua/vstruct/test/common.lua +100 -0
  451. data/vendor/lua/lib/lua/vstruct/test/fp-bigendian.lua +56 -0
  452. data/vendor/lua/lib/lua/vstruct/test/fp-littleendian.lua +56 -0
  453. data/vendor/lua/lib/lua/vstruct/test/struct-test-gen.lua +1230 -0
  454. data/vendor/lua/lib/lua/vstruct/unpack.lua +126 -0
  455. data/vendor/lua/lib/lua/wx.dll +0 -0
  456. data/vendor/lua/lib/lua/xml.lua +75 -0
  457. data/vendor/lua/lib/lua/zip.dll +0 -0
  458. data/vendor/lua/lib/lua/zlib.dll +0 -0
  459. metadata +529 -0
@@ -0,0 +1 @@
1
+ package.loaded["oil.component"] = require "loop.component.base"
@@ -0,0 +1,301 @@
1
+ --------------------------------------------------------------------------------
2
+ ------------------------------ ##### ## ------------------------------
3
+ ------------------------------ ## ## # ## ------------------------------
4
+ ------------------------------ ## ## ## ## ------------------------------
5
+ ------------------------------ ## ## # ## ------------------------------
6
+ ------------------------------ ##### ### ###### ------------------------------
7
+ -------------------------------- --------------------------------
8
+ ----------------------- An Object Request Broker in Lua ------------------------
9
+ --------------------------------------------------------------------------------
10
+ -- Project: OiL - ORB in Lua: An Object Request Broker in Lua --
11
+ -- Release: 0.5 --
12
+ -- Title : General Inter-ORB Protocol (GIOP) IDL specifications --
13
+ -- Authors: Renato Maia <maia@inf.puc-rio.br> --
14
+ --------------------------------------------------------------------------------
15
+ -- Notes: --
16
+ -- See in section 15.4 of CORBA 3.0 specification. --
17
+ --------------------------------------------------------------------------------
18
+
19
+ --------------------------------------------------------------------------------
20
+ -- Dependencies ----------------------------------------------------------------
21
+
22
+ local require = require
23
+
24
+ local idl = require "oil.corba.idl"
25
+
26
+ --------------------------------------------------------------------------------
27
+ -- Module Declaration ----------------------------------------------------------
28
+
29
+ module "oil.corba.giop"
30
+
31
+ --------------------------------------------------------------------------------
32
+ -- Interoperable Object Reference ----------------------------------------------
33
+
34
+ TaggedProfile = idl.struct{
35
+ {name = "tag" , type = idl.ulong },
36
+ {name = "profile_data", type = idl.OctetSeq},
37
+ }
38
+ -- underscore character allows using IOR as proxy objects
39
+ IOR = idl.struct{ -- because it avoids name clashes with object members.
40
+ {name = "type_id" , type = idl.string },
41
+ {name = "profiles", type = idl.sequence{TaggedProfile}},
42
+ }
43
+
44
+ --------------------------------------------------------------------------------
45
+ -- Object basic operations -----------------------------------------------------
46
+
47
+ ObjectOperations = {
48
+ _interface = idl.operation{
49
+ name = "_interface",
50
+ result = idl.Object{
51
+ repID = "IDL:omg.org/CORBA/InterfaceDef:1.0",
52
+ name = "InterfaceDef",
53
+ },
54
+ },
55
+ _component = idl.operation{
56
+ name = "_component",
57
+ result = idl.object,
58
+ },
59
+ _is_a = idl.operation{
60
+ name = "_is_a",
61
+ result = idl.boolean,
62
+ parameters = {{ type = idl.string, name = "interface" }},
63
+ },
64
+ _non_existent = idl.operation{
65
+ name = "_non_existent",
66
+ result = idl.boolean,
67
+ },
68
+ _is_equivalent = idl.operation{
69
+ name = "_is_equivalent",
70
+ parameters = {{ type = idl.object, name = "reference" }},
71
+ result = idl.boolean,
72
+ },
73
+ -- TODO:[maia] add other basic operations
74
+ }
75
+
76
+ --------------------------------------------------------------------------------
77
+ -- System Exception Structure --------------------------------------------------
78
+
79
+ SystemExceptionIDL = idl.struct{
80
+ {name = "exception_id" , type = idl.string},
81
+ {name = "minor_code_value" , type = idl.ulong },
82
+ {name = "completion_status", type = idl.ulong },
83
+ }
84
+
85
+ SystemExceptionIDs = {
86
+ UNKNOWN = "IDL:omg.org/CORBA/UNKNOWN:1.0" , -- the unknown exception
87
+ BAD_PARAM = "IDL:omg.org/CORBA/BAD_PARAM:1.0" , -- an invalid parameter was passed
88
+ NO_MEMORY = "IDL:omg.org/CORBA/NO_MEMORY:1.0" , -- dynamic memory allocation failure
89
+ IMP_LIMIT = "IDL:omg.org/CORBA/IMP_LIMIT:1.0" , -- violated implementation limit
90
+ COMM_FAILURE = "IDL:omg.org/CORBA/COMM_FAILURE:1.0" , -- communication failure
91
+ INV_OBJREF = "IDL:omg.org/CORBA/INV_OBJREF:1.0" , -- invalid object reference
92
+ NO_PERMISSION = "IDL:omg.org/CORBA/NO_PERMISSION:1.0" , -- no permission for attempted op.
93
+ INTERNAL = "IDL:omg.org/CORBA/INTERNAL:1.0" , -- ORB internal error
94
+ MARSHAL = "IDL:omg.org/CORBA/MARSHAL:1.0" , -- error marshaling param/result
95
+ INITIALIZE = "IDL:omg.org/CORBA/INITIALIZE:1.0" , -- ORB initialization failure
96
+ NO_IMPLEMENT = "IDL:omg.org/CORBA/NO_IMPLEMENT:1.0" , -- operation implementation unavailable
97
+ BAD_TYPECODE = "IDL:omg.org/CORBA/BAD_TYPECODE:1.0" , -- bad typecode
98
+ BAD_OPERATION = "IDL:omg.org/CORBA/BAD_OPERATION:1.0" , -- invalid operation
99
+ NO_RESOURCES = "IDL:omg.org/CORBA/NO_RESOURCES:1.0" , -- insufficient resources for req.
100
+ NO_RESPONSE = "IDL:omg.org/CORBA/NO_RESPONSE:1.0" , -- response to req. not yet available
101
+ PERSIST_STORE = "IDL:omg.org/CORBA/PERSIST_STORE:1.0" , -- persistent storage failure
102
+ BAD_INV_ORDER = "IDL:omg.org/CORBA/BAD_INV_ORDER:1.0" , -- routine invocations out of order
103
+ TRANSIENT = "IDL:omg.org/CORBA/TRANSIENT:1.0" , -- transient failure - reissue request
104
+ FREE_MEM = "IDL:omg.org/CORBA/FREE_MEM:1.0" , -- cannot free memory
105
+ INV_IDENT = "IDL:omg.org/CORBA/INV_IDENT:1.0" , -- invalid identifier syntax
106
+ INV_FLAG = "IDL:omg.org/CORBA/INV_FLAG:1.0" , -- invalid flag was specified
107
+ INTF_REPOS = "IDL:omg.org/CORBA/INTF_REPOS:1.0" , -- error accessing interface repository
108
+ BAD_CONTEXT = "IDL:omg.org/CORBA/BAD_CONTEXT:1.0" , -- error processing context object
109
+ OBJ_ADAPTER = "IDL:omg.org/CORBA/OBJ_ADAPTER:1.0" , -- failure detected by object adapter
110
+ DATA_CONVERSION = "IDL:omg.org/CORBA/DATA_CONVERSION:1.0" , -- data conversion error
111
+ OBJECT_NOT_EXIST = "IDL:omg.org/CORBA/OBJECT_NOT_EXIST:1.0" , -- non-existent object, delete reference
112
+ TRANSACTION_REQUIRED = "IDL:omg.org/CORBA/TRANSACTION_REQUIRED:1.0" , -- transaction required
113
+ TRANSACTION_ROLLEDBACK = "IDL:omg.org/CORBA/TRANSACTION_ROLLEDBACK:1.0" , -- transaction rolled back
114
+ INVALID_TRANSACTION = "IDL:omg.org/CORBA/INVALID_TRANSACTION:1.0" , -- invalid transaction
115
+ INV_POLICY = "IDL:omg.org/CORBA/INV_POLICY:1.0" , -- invalid policy
116
+ CODESET_INCOMPATIBLE = "IDL:omg.org/CORBA/CODESET_INCOMPATIBLE:1.0" , -- incompatible code set
117
+ REBIND = "IDL:omg.org/CORBA/REBIND:1.0" , -- rebind needed
118
+ TIMEOUT = "IDL:omg.org/CORBA/TIMEOUT:1.0" , -- operation timed out
119
+ TRANSACTION_UNAVAILABLE = "IDL:omg.org/CORBA/TRANSACTION_UNAVAILABLE:1.0", -- no transaction
120
+ TRANSACTION_MODE = "IDL:omg.org/CORBA/TRANSACTION_MODE:1.0" , -- invalid transaction mode
121
+ BAD_QOS = "IDL:omg.org/CORBA/BAD_QOS:1.0" , -- bad quality of service
122
+ INVALID_ACTIVITY = "IDL:omg.org/CORBA/INVALID_ACTIVITY:1.0" , -- bad quality of service
123
+ ACTIVITY_COMPLETED = "IDL:omg.org/CORBA/ACTIVITY_COMPLETED:1.0" , -- bad quality of service
124
+ ACTIVITY_REQUIRED = "IDL:omg.org/CORBA/ACTIVITY_REQUIRED:1.0" , -- bad quality of service
125
+ }
126
+
127
+ --------------------------------------------------------------------------------
128
+ -- Message Header Commom to All GIOP Messages ----------------------------------
129
+
130
+ HeaderSize = 12 -- TODO:[maia] Calculate from IDL specification
131
+ MagicTag = "GIOP" -- TODO:[maia] Garantee that the string "GIOP" is
132
+ -- encoded in ISO Latin-1 (8859.1).
133
+ -- How can I do this in Lua?!
134
+
135
+ Header_v1_ = { -- Common message header for each GIOP version
136
+ [0] = idl.struct{ -- GIOP 1.0
137
+ {name = "magic" , type = idl.array{idl.char; length = 4}},
138
+ {name = "GIOP_version", type = idl.Version },
139
+ {name = "byte_order" , type = idl.boolean },
140
+ {name = "message_type", type = idl.octet },
141
+ {name = "message_size", type = idl.ulong },
142
+ },
143
+ [1] = idl.struct{ -- GIOP 1.1
144
+ {name = "magic" , type = idl.array{idl.char; length = 4}},
145
+ {name = "GIOP_version", type = idl.Version },
146
+ {name = "flags" , type = idl.octet },
147
+ {name = "message_type", type = idl.octet },
148
+ {name = "message_size", type = idl.ulong },
149
+ },
150
+ }
151
+ Header_v1_[2] = Header_v1_[1] -- GIOP 1.2, same as GIOP 1.1
152
+ Header_v1_[3] = Header_v1_[1] -- GIOP 1.3, same as GIOP 1.1
153
+
154
+ --------------------------------------------------------------------------------
155
+ -- Message Header of GIOP Messages ---------------------------------------------
156
+
157
+ RequestID = 0
158
+ ReplyID = 1
159
+ CancelRequestID = 2
160
+ LocateRequestID = 3
161
+ LocateReplyID = 4
162
+ CloseConnectionID = 5
163
+ MessageErrorID = 6
164
+ FragmentID = 7
165
+
166
+ --------------------------------------------------------------------------------
167
+
168
+ MessageType = {
169
+ [RequestID ] = "Request" ,
170
+ [ReplyID ] = "Reply" ,
171
+ [CancelRequestID ] = "CancelRequest" ,
172
+ [LocateRequestID ] = "LocateRequest" ,
173
+ [LocateReplyID ] = "LocateReply" ,
174
+ [CloseConnectionID] = "CloseConnection",
175
+ [MessageErrorID ] = "MessageError" ,
176
+ [FragmentID ] = "Fragment" ,
177
+ }
178
+
179
+ --------------------------------------------------------------------------------
180
+
181
+ local ServiceContextList = idl.sequence{idl.struct{
182
+ {name = "context_id" , type = idl.ulong },
183
+ {name = "context_data", type = idl.OctetSeq},
184
+ }}
185
+
186
+ MessageHeader_v1_ = {} -- Message headers for each GIOP version
187
+
188
+ --------------------------------------------------------------------------------
189
+
190
+ local ReplyStatusType_1_0 = idl.enum{
191
+ "NO_EXCEPTION", "USER_EXCEPTION", "SYSTEM_EXCEPTION", "LOCATION_FORWARD",
192
+ }
193
+ local LocateStatusType_1_0 = idl.enum{
194
+ "UNKNOWN_OBJECT", "OBJECT_HERE", "OBJECT_FORWARD",
195
+ }
196
+
197
+ MessageHeader_v1_[0] = { -- GIOP 1.0
198
+ [RequestID] = idl.struct{
199
+ {name = "service_context" , type = ServiceContextList},
200
+ {name = "request_id" , type = idl.ulong },
201
+ {name = "response_expected" , type = idl.boolean },
202
+ {name = "object_key" , type = idl.OctetSeq },
203
+ {name = "operation" , type = idl.string },
204
+ {name = "requesting_principal", type = idl.OctetSeq },
205
+ },
206
+ [ReplyID] = idl.struct{
207
+ {name = "service_context", type = ServiceContextList },
208
+ {name = "request_id" , type = idl.ulong },
209
+ {name = "reply_status" , type = ReplyStatusType_1_0},
210
+ },
211
+ [CancelRequestID] = idl.struct{
212
+ {name = "request_id", type = idl.ulong},
213
+ },
214
+ [LocateRequestID] = idl.struct{
215
+ {name = "request_id", type = idl.ulong },
216
+ {name = "object_key", type = idl.OctetSeq},
217
+ },
218
+ [LocateReplyID] = idl.struct{
219
+ {name = "request_id" , type = idl.ulong },
220
+ {name = "locate_status", type = LocateStatusType_1_0},
221
+ },
222
+ [CloseConnectionID] = false, -- empty header
223
+ [MessageErrorID ] = false, -- empty header
224
+ }
225
+
226
+ --------------------------------------------------------------------------------
227
+
228
+ MessageHeader_v1_[1] = { -- GIOP 1.1
229
+ [RequestID] = idl.struct{
230
+ {name = "service_context" , type = ServiceContextList },
231
+ {name = "request_id" , type = idl.ulong },
232
+ {name = "response_expected" , type = idl.boolean },
233
+ {name = "reserved" , type = idl.array{idl.octet; length = 3}},
234
+ {name = "object_key" , type = idl.OctetSeq },
235
+ {name = "operation" , type = idl.string },
236
+ {name = "requesting_principal", type = idl.OctetSeq },
237
+ },
238
+ [ReplyID ] = MessageHeader_v1_[0][ReplyID ],
239
+ [CancelRequestID ] = MessageHeader_v1_[0][CancelRequestID ],
240
+ [LocateRequestID ] = MessageHeader_v1_[0][LocateRequestID ],
241
+ [LocateReplyID ] = MessageHeader_v1_[0][LocateReplyID ],
242
+ [CloseConnectionID] = MessageHeader_v1_[0][CloseConnectionID],
243
+ [MessageErrorID ] = MessageHeader_v1_[0][MessageErrorID ],
244
+ [FragmentID ] = false, -- empty header, introduced in GIOP 1.1
245
+ }
246
+
247
+ --------------------------------------------------------------------------------
248
+
249
+ local ReplyStatusType_1_2 = idl.enum{
250
+ "NO_EXCEPTION", "USER_EXCEPTION", "SYSTEM_EXCEPTION", "LOCATION_FORWARD",
251
+ "LOCATION_FORWARD_PERM", "NEEDS_ADDRESSING_MODE",
252
+ }
253
+ local LocateStatusType_1_2 = idl.enum{
254
+ "UNKNOWN_OBJECT", "OBJECT_HERE", "OBJECT_FORWARD",
255
+ "OBJECT_FORWARD_PERM", "LOC_SYSTEM_EXCEPTION", "LOC_NEEDS_ADDRESSING_MODE",
256
+ }
257
+
258
+ local IORAddressingInfo = idl.struct{
259
+ {type = idl.ulong, name = "selected_profile_index"},
260
+ {type = IOR , name = "ior" },
261
+ }
262
+ local TargetAddress = idl.union{
263
+ switch = idl.short,
264
+ options = {
265
+ {label = 0, name = "object_key", type = idl.OctetSeq },
266
+ {label = 1, name = "profile" , type = TaggedProfile },
267
+ {label = 2, name = "ior" , type = IORAddressingInfo},
268
+ }
269
+ }
270
+
271
+ MessageHeader_v1_[2] = { -- GIOP 1.2
272
+ [RequestID] = idl.struct{
273
+ {name = "request_id" , type = idl.ulong },
274
+ {name = "response_flags" , type = idl.octet },
275
+ {name = "reserved" , type = idl.array{idl.octet; length = 3}},
276
+ {name = "target" , type = TargetAddress },
277
+ {name = "operation" , type = idl.string },
278
+ {name = "service_context", type = ServiceContextList },
279
+ },
280
+ [ReplyID] = idl.struct{
281
+ {name = "request_id" , type = idl.ulong },
282
+ {name = "reply_status" , type = ReplyStatusType_1_2},
283
+ {name = "service_context", type = ServiceContextList },
284
+ },
285
+ [CancelRequestID] = MessageHeader_v1_[1][CancelRequestID],
286
+ [LocateRequestID] = idl.struct{
287
+ {name = "request_id", type = idl.ulong },
288
+ {name = "target" , type = TargetAddress},
289
+ },
290
+ [LocateReplyID] = idl.struct{
291
+ {name = "request_id" , type = idl.ulong },
292
+ {name = "locate_status", type = LocateStatusType_1_2},
293
+ },
294
+ [CloseConnectionID] = MessageHeader_v1_[1][CloseConnectionID],
295
+ [MessageErrorID ] = MessageHeader_v1_[1][MessageErrorID ],
296
+ [FragmentID ] = MessageHeader_v1_[1][FragmentID ],
297
+ }
298
+
299
+ --------------------------------------------------------------------------------
300
+
301
+ MessageHeader_v1_[3] = MessageHeader_v1_[2] -- GIOP 1.3, same as GIOP 1.2
@@ -0,0 +1,1568 @@
1
+ --------------------------------------------------------------------------------
2
+ ------------------------------ ##### ## ------------------------------
3
+ ------------------------------ ## ## # ## ------------------------------
4
+ ------------------------------ ## ## ## ## ------------------------------
5
+ ------------------------------ ## ## # ## ------------------------------
6
+ ------------------------------ ##### ### ###### ------------------------------
7
+ -------------------------------- --------------------------------
8
+ ----------------------- An Object Request Broker in Lua ------------------------
9
+ --------------------------------------------------------------------------------
10
+ -- Project: OiL - ORB in Lua: An Object Request Broker in Lua --
11
+ -- Release: 0.5 --
12
+ -- Title : Mapping of Lua values into Common Data Representation (CDR) --
13
+ -- Authors: Renato Maia <maia@inf.puc-rio.br> --
14
+ --------------------------------------------------------------------------------
15
+ -- decoder interface: --
16
+ -- order(value) Change or return the endianess of the buffer --
17
+ -- jump(shift) Places an empty space in the data of the buffer --
18
+ -- getdata() Returns the raw data stream of marshalled data --
19
+ -- get(type) Unmarhsall a value of the given type --
20
+ -- --
21
+ -- void() Unmarshal a void type value --
22
+ -- short() Unmarshal an integer type short value --
23
+ -- long() Unmarshal an integer type long value --
24
+ -- ushort() Unmarshal an integer type unsigned short value --
25
+ -- ulong() Unmarshal an integer type unsigned long value --
26
+ -- float() Unmarshal a floating-point numeric type value --
27
+ -- double() Unmarshal a double-precision floating-point num. value --
28
+ -- boolean() Unmarshal a boolean type value --
29
+ -- char() Unmarshal a character type value --
30
+ -- octet() Unmarshal a raw byte type value --
31
+ -- any() Unmarshal a generic type value --
32
+ -- TypeCode() Unmarshal a meta-type value --
33
+ -- string() Unmarshal a string type value --
34
+ -- --
35
+ -- Object(type) Unmarhsal an Object type value, given its type --
36
+ -- struct(type) Unmarhsal a struct type value, given its type --
37
+ -- union(type) Unmarhsal a union type value, given its type --
38
+ -- enum(type) Unmarhsal an enumeration type value, given its type --
39
+ -- sequence(type) Unmarhsal a sequence type value, given its type --
40
+ -- array(type) Unmarhsal an array type value, given its type --
41
+ -- typedef(type) Unmarhsal a type definition value, given its type --
42
+ -- except(type) Unmarhsal an expection value, given its type --
43
+ -- --
44
+ -- interface(type) Unmarshall an object reference of a given interface --
45
+ -- --
46
+ -- encoder interface: --
47
+ -- order(value) Change or return the endianess of the buffer --
48
+ -- jump(shift) Jump an empty space in the data of the buffer --
49
+ -- getdata() Returns the raw data stream of marshalled data --
50
+ -- put(type) Marhsall a value of the given type --
51
+ -- --
52
+ -- void(value) Marshal a void type value --
53
+ -- short(value) Marshal an integer type short value --
54
+ -- long(value) Marshal an integer type long value --
55
+ -- ushort(value) Marshal an integer type unsigned short value --
56
+ -- ulong(value) Marshal an integer type unsigned long value --
57
+ -- float(value) Marshal a floating-point numeric type value --
58
+ -- double(value) Marshal a double-prec. floating-point num. value --
59
+ -- boolean(value) Marshal a boolean type value --
60
+ -- char(value) Marshal a character type value --
61
+ -- octet(value) Marshal a raw byte type value --
62
+ -- any(value) Marshal a generic type value --
63
+ -- TypeCode(value) Marshal a meta-type value --
64
+ -- string(value) Marshal a string type value --
65
+ -- --
66
+ -- Object(value, type) Marhsal an Object type value, given its type --
67
+ -- struct(value, type) Marhsal a struct type value, given its type --
68
+ -- union(value, type) Marhsal an union type value, given its type --
69
+ -- enum(value, type) Marhsal an enumeration type value, given its type --
70
+ -- sequence(value, type)Marhsal a sequence type value, given its type --
71
+ -- array(value, type) Marhsal an array type value, given its type --
72
+ -- typedef(value, type) Marhsal a type definition value, given its type --
73
+ -- except(value, type) Marhsal an expection value, given its type --
74
+ -- --
75
+ -- interface(value,type)Marshall an object reference of a given interface --
76
+ --------------------------------------------------------------------------------
77
+ -- Notes: --
78
+ -- See section 15.3 of CORBA 3.0 specification. --
79
+ --------------------------------------------------------------------------------
80
+ -- codec:Facet
81
+ -- encoder:object encoder()
82
+ -- decoder:object decoder(stream:string)
83
+ --
84
+ -- proxies:Receptacle
85
+ -- proxy:object proxyto(ior:table, iface:table|string)
86
+ --
87
+ -- servants:Receptacle
88
+ -- proxy:object register(implementation:object, iface:table|string)
89
+ --------------------------------------------------------------------------------
90
+
91
+ local getmetatable = getmetatable
92
+ local ipairs = ipairs
93
+ local pairs = pairs
94
+ local pcall = pcall
95
+ local rawget = rawget
96
+ local setmetatable = setmetatable
97
+ local tonumber = tonumber
98
+ local type = type
99
+
100
+ local math = require "math"
101
+ local string = require "string"
102
+ local table = require "table"
103
+
104
+ local oo = require "oil.oo"
105
+ local assert = require "oil.assert"
106
+ local bit = require "oil.bit"
107
+ local idl = require "oil.corba.idl"
108
+ local giop = require "oil.corba.giop" --[[VERBOSE]] local verbose = require "oil.verbose"; local CURSOR, CODEC, PREFIXSHIFT, SIZEINDEXPOS, verbose_marshal, verbose_unmarshal = {}
109
+
110
+ module("oil.corba.giop.Codec", oo.class)
111
+
112
+ local IndirectionTag = 0xffffffff
113
+
114
+ --------------------------------------------------------------------------------
115
+ --------------------------------------------------------------------------------
116
+
117
+ UnionLabelInfo = { name = "label", type = idl.void }
118
+
119
+ --------------------------------------------------------------------------------
120
+ -- TypeCode information --------------------------------------------------------
121
+
122
+ -- NOTE: Description of type code categories, which is defined by field type
123
+ -- empty : no further parameters are necessary to specify the associated
124
+ -- type.
125
+ -- simple : parameters that specify the associated type are defined as a
126
+ -- sequence of values.
127
+ -- complex: parameters that specify the associated type are defined as a
128
+ -- structure defined in idl that is stored in a encapsulated octet
129
+ -- sequence (i.e. which endianess may differ).
130
+
131
+ TypeCodeInfo = {
132
+ [0] = {name = "null" , type = "empty", idl = idl.null },
133
+ [1] = {name = "void" , type = "empty", idl = idl.void },
134
+ [2] = {name = "short" , type = "empty", idl = idl.short },
135
+ [3] = {name = "long" , type = "empty", idl = idl.long },
136
+ [4] = {name = "ushort" , type = "empty", idl = idl.ushort },
137
+ [5] = {name = "ulong" , type = "empty", idl = idl.ulong },
138
+ [6] = {name = "float" , type = "empty", idl = idl.float },
139
+ [7] = {name = "double" , type = "empty", idl = idl.double },
140
+ [8] = {name = "boolean" , type = "empty", idl = idl.boolean },
141
+ [9] = {name = "char" , type = "empty", idl = idl.char },
142
+ [10] = {name = "octet" , type = "empty", idl = idl.octet },
143
+ [11] = {name = "any" , type = "empty", idl = idl.any },
144
+ [12] = {name = "TypeCode" , type = "empty", idl = idl.TypeCode },
145
+ [13] = {name = "Principal", type = "empty", idl = idl.Principal, unhandled = true},
146
+
147
+ [14] = {name = "Object", type = "complex",
148
+ parameters = idl.struct{
149
+ {name = "repID", type = idl.string},
150
+ {name = "name" , type = idl.string},
151
+ },
152
+ },
153
+ [15] = {name = "struct", type = "complex",
154
+ parameters = idl.struct{
155
+ {name = "repID" , type = idl.string},
156
+ {name = "name" , type = idl.string},
157
+ {name = "fields", type = idl.sequence{
158
+ idl.struct{
159
+ {name = "name", type = idl.string},
160
+ {name = "type", type = idl.TypeCode}
161
+ },
162
+ }},
163
+ },
164
+ },
165
+ [16] = {name = "union", type = "complex",
166
+ parameters = idl.struct{
167
+ {name = "repID" , type = idl.string },
168
+ {name = "name" , type = idl.string },
169
+ {name = "switch" , type = idl.TypeCode},
170
+ {name = "default", type = idl.long },
171
+ },
172
+ mutable = {
173
+ {name = "options", type = idl.sequence{
174
+ idl.struct{
175
+ UnionLabelInfo, -- NOTE: depends on field 'switch'.
176
+ {name = "name" , type = idl.string },
177
+ {name = "type" , type = idl.TypeCode},
178
+ },
179
+ }},
180
+ setup = function(self, union)
181
+ UnionLabelInfo.type = union.switch
182
+ return self
183
+ end,
184
+ },
185
+ },
186
+ [17] = {name = "enum", type = "complex",
187
+ parameters = idl.struct{
188
+ {name = "repID" , type = idl.string },
189
+ {name = "name" , type = idl.string },
190
+ {name = "enumvalues", type = idl.sequence{idl.string}},
191
+ }
192
+ },
193
+ [18] = {name = "string", type = "simple", idl = idl.string,
194
+ parameters = idl.struct{
195
+ {name = "maxlength", type = idl.ulong}
196
+ },
197
+ },
198
+ [19] = {name = "sequence", type = "complex",
199
+ parameters = idl.struct{
200
+ {name = "elementtype", type = idl.TypeCode},
201
+ {name = "maxlength" , type = idl.ulong },
202
+ }
203
+ },
204
+ [20] = {name = "array", type = "complex",
205
+ parameters = idl.struct{
206
+ {name = "elementtype", type = idl.TypeCode},
207
+ {name = "length" , type = idl.ulong },
208
+ }
209
+ },
210
+ [21] = {name = "typedef", type = "complex",
211
+ parameters = idl.struct{
212
+ {name = "repID" , type = idl.string },
213
+ {name = "name" , type = idl.string },
214
+ {name = "original_type", type = idl.TypeCode},
215
+ },
216
+ },
217
+ [22] = {name = "except", type = "complex",
218
+ parameters = idl.struct{
219
+ {name = "repID", type = idl.string},
220
+ {name = "name", type = idl.string},
221
+ {name = "members", type = idl.sequence{
222
+ idl.struct{
223
+ {name = "name", type = idl.string },
224
+ {name = "type", type = idl.TypeCode},
225
+ },
226
+ }},
227
+ },
228
+ },
229
+
230
+ [23] = {name = "longlong" , type = "empty", idl = idl.longlong },
231
+ [24] = {name = "ulonglong" , type = "empty", idl = idl.ulonglong },
232
+ [25] = {name = "longdouble", type = "empty", idl = idl.longdouble},
233
+ [26] = {name = "wchar" , type = "empty", unhandled = true},
234
+
235
+ [27] = {name = "wstring", type = "simple", unhandled = true,
236
+ parameters = idl.struct{
237
+ {name = "maxlength", type = idl.ulong},
238
+ },
239
+ },
240
+ [28] = {name = "fixed", type = "simple", unhandled = true,
241
+ parameters = idl.struct{
242
+ {name = "digits", type = idl.ushort},
243
+ {name = "scale" , type = idl.short },
244
+ },
245
+ },
246
+
247
+ [29] = {name = "valuetype", type = "complex",
248
+ parameters = idl.struct{
249
+ {name = "repID" , type = idl.string },
250
+ {name = "name" , type = idl.string },
251
+ {name = "kind" , type = idl.short },
252
+ {name = "base_value", type = idl.TypeCode},
253
+ {name = "members" , type = idl.sequence{
254
+ idl.struct{
255
+ {name = "name" , type = idl.string },
256
+ {name = "type" , type = idl.TypeCode},
257
+ {name = "access", type = idl.short },
258
+ },
259
+ }},
260
+ },
261
+ },
262
+ [30] = {name = "valuebox", type = "complex",
263
+ parameters = idl.struct{
264
+ {name = "repID" , type = idl.string },
265
+ {name = "name" , type = idl.string },
266
+ {name = "original_type", type = idl.TypeCode},
267
+ },
268
+ },
269
+ [31] = {name = "native", type = "complex", unhandled = true,
270
+ parameters = idl.struct{
271
+ {name = "repID", type = idl.string },
272
+ {name = "name" , type = idl.string },
273
+ },
274
+ },
275
+ [32] = {name = "abstract_interface", type = "complex",
276
+ parameters = idl.struct{
277
+ {name = "repID", type = idl.string },
278
+ {name = "name" , type = idl.string },
279
+ },
280
+ },
281
+ [33] = {name = "local_interface", type = "complex",
282
+ parameters = idl.struct{
283
+ {name = "repID", type = idl.string },
284
+ {name = "name" , type = idl.string },
285
+ },
286
+ },
287
+
288
+ [IndirectionTag] = {name = "indirection marker", type = "fake"},
289
+ }
290
+
291
+ local PrimitiveSizes = {
292
+ boolean = 1,
293
+ char = 1,
294
+ octet = 1,
295
+ short = 2,
296
+ long = 4,
297
+ longlong = 8,
298
+ ushort = 2,
299
+ ulong = 4,
300
+ ulonglong = 8,
301
+ float = 4,
302
+ double = 8,
303
+ longdouble = 16,
304
+ enum = 4,
305
+ }
306
+
307
+ --------------------------------------------------------------------------------
308
+ -- Local module functions ------------------------------------------------------
309
+
310
+ local function alignment(self, size)
311
+ local extra = (self.cursor-1)%size
312
+ if extra > 0 then return size-extra end
313
+ return 0
314
+ end
315
+
316
+ NativeEndianess = (bit.endianess() == "little")
317
+
318
+ --------------------------------------------------------------------------------
319
+ -- ## ## ##### ###### ###### ## ## ##### ## ## --
320
+ -- ### ### ## ## ## ## ## ## ## ## ## ## ## --
321
+ -- ####### ####### ###### ##### ####### ####### ## ## --
322
+ -- ## # ## ## ## ## ## ## ## ## ## ## ## ## --
323
+ -- ## ## ## ## ## ## ###### ## ## ## ## ####### ####### --
324
+ --------------------------------------------------------------------------------
325
+
326
+ --------------------------------------------------------------------------------
327
+ -- Unmarshalling buffer class --------------------------------------------------
328
+
329
+ Encoder = oo.class {
330
+ previousend = 0,
331
+ index = 1,
332
+ cursor = 1,
333
+ emptychar = '\255', -- character used in buffer alignment
334
+ pack = bit.pack, -- use current platform native endianess
335
+ }
336
+
337
+ local function newhistory(history)
338
+ return setmetatable(history or {}, { __index = function(self, field)
339
+ local value = {}
340
+ self[field] = value
341
+ return value
342
+ end })
343
+ end
344
+
345
+ function Encoder:__init(object)
346
+ self = oo.rawnew(self, object)
347
+ if self.history == nil then self.history = newhistory() end
348
+ if self.format == nil then self.format = {} end
349
+ return self
350
+ end
351
+
352
+ function Encoder:shift(shift) --[[VERBOSE]] PREFIXSHIFT = shift
353
+ self.cursor = self.cursor + shift
354
+ end
355
+
356
+ function Encoder:jump(shift)
357
+ if shift > 0 then self:rawput('"', self.emptychar:rep(shift), shift) end
358
+ end
359
+
360
+ function Encoder:align(size)
361
+ local shift = alignment(self, size)
362
+ if shift > 0 then self:jump(shift) end
363
+ end
364
+
365
+ function Encoder:rawput(format, data, size) --[[VERBOSE]] CURSOR[self.cursor] = true; if CODEC == nil then CODEC = self end
366
+ local index = self.index
367
+ self.format[index] = format
368
+ self[index] = data
369
+ self.index = index+1
370
+ self.cursor = self.cursor + size
371
+ end
372
+
373
+ function Encoder:put(value, idltype)
374
+ local marshal = self[idltype._type]
375
+ if not marshal then
376
+ assert.illegal(idltype._type, "supported type", "MARSHAL")
377
+ end
378
+ return marshal(self, value, idltype)
379
+ end
380
+
381
+ function Encoder:indirection(marshal, value, ...)
382
+ local history = self.history
383
+ local previous = history[marshal][value]
384
+ if previous then
385
+ self:ulong(IndirectionTag)
386
+ self:long(previous - (self.previousend+self.cursor)) --[[VERBOSE]] verbose_marshal("indirection to "..((self.previousend+self.cursor)-previous).." bytes away (",(self.previousend+self.cursor),"-",previous,").")
387
+ else
388
+ local shift = alignment(self, PrimitiveSizes.ulong)
389
+ history[marshal][value] = (self.previousend+self.cursor+shift) --[[VERBOSE]] verbose_marshal("registering position at ",history[marshal][value]," for future indirection")
390
+ marshal(self, value, ...)
391
+ end
392
+ end
393
+
394
+ function Encoder:getdata()
395
+ return self.pack(table.concat(self.format), self)
396
+ end
397
+
398
+ function Encoder:getlength()
399
+ return self.cursor - 1
400
+ end
401
+
402
+ local NilEnabledTypes = {
403
+ any = true,
404
+ boolean = true,
405
+ Object = true,
406
+ interface = true,
407
+ valuetype = true,
408
+ }
409
+
410
+ --------------------------------------------------------------------------------
411
+ -- Marshalling functions -------------------------------------------------------
412
+
413
+ local function numbermarshaller(size, format)
414
+ return function (self, value)
415
+ assert.type(value, "number", "numeric value", "MARSHAL")
416
+ self:align(size)
417
+ self:rawput(format, value, size) --[[VERBOSE]] verbose_marshal(self, format, value)
418
+ end
419
+ end
420
+
421
+ Encoder.null = function() end
422
+ Encoder.void = Encoder.null
423
+ Encoder.short = numbermarshaller(PrimitiveSizes.short , "s")
424
+ Encoder.long = numbermarshaller(PrimitiveSizes.long , "l")
425
+ Encoder.longlong = numbermarshaller(PrimitiveSizes.longlong , "g")
426
+ Encoder.ushort = numbermarshaller(PrimitiveSizes.ushort , "S")
427
+ Encoder.ulong = numbermarshaller(PrimitiveSizes.ulong , "L")
428
+ Encoder.ulonglong = numbermarshaller(PrimitiveSizes.ulonglong , "G")
429
+ Encoder.float = numbermarshaller(PrimitiveSizes.float , "f")
430
+ Encoder.double = numbermarshaller(PrimitiveSizes.double , "d")
431
+ Encoder.longdouble = numbermarshaller(PrimitiveSizes.longdouble, "D")
432
+
433
+ function Encoder:boolean(value) --[[VERBOSE]] verbose_marshal(true, self, idl.boolean)
434
+ if value
435
+ then self:octet(1)
436
+ else self:octet(0)
437
+ end --[[VERBOSE]] verbose_marshal(false)
438
+ end
439
+
440
+ function Encoder:char(value)
441
+ assert.type(value, "string", "character", "MARSHAL")
442
+ if #value ~= 1 then
443
+ assert.illegal(value, "character", "MARSHAL")
444
+ end
445
+ self:rawput('"', value, 1) --[[VERBOSE]] verbose_marshal(self, idl.char, value)
446
+ end
447
+
448
+ function Encoder:octet(value)
449
+ assert.type(value, "number", "octet value", "MARSHAL")
450
+ self:rawput("B", value, 1) --[[VERBOSE]] verbose_marshal(self, idl.octet, value)
451
+ end
452
+
453
+ local DefaultMapping = {
454
+ number = idl.double,
455
+ string = idl.string,
456
+ boolean = idl.boolean,
457
+ ["nil"] = idl.null,
458
+ }
459
+ function Encoder:any(value) --[[VERBOSE]] verbose_marshal(true, self, idl.any)
460
+ local luatype = type(value)
461
+ local idltype = DefaultMapping[luatype]
462
+ if not idltype then
463
+ local metatable = getmetatable(value)
464
+ if metatable then
465
+ if idl.istype(metatable) then
466
+ idltype = metatable
467
+ elseif idl.istype(metatable.__type) then
468
+ idltype = metatable.__type
469
+ end
470
+ end
471
+ if luatype == "table" then
472
+ if not idltype then
473
+ idltype = value._anytype
474
+ if not idl.istype(idltype) then
475
+ idltype = nil
476
+ end
477
+ end
478
+ if idltype then
479
+ if (value._anyval ~= nil or NilEnabledTypes[idltype._type]) then
480
+ value = value._anyval
481
+ end
482
+ end
483
+ end
484
+ end
485
+ if not idltype then
486
+ assert.illegal(value, "any, unable to map to an idl type", "MARSHAL")
487
+ end --[[VERBOSE]] verbose_marshal "[type of any]"
488
+ self:TypeCode(idltype) --[[VERBOSE]] verbose_marshal "[value of any]"
489
+ self:put(value, idltype) --[[VERBOSE]] verbose_marshal(false)
490
+ end
491
+
492
+ local NullReference = { type_id = "", profiles = { n=0 } }
493
+ function Encoder:Object(value, idltype) --[[VERBOSE]] verbose_marshal(true, self, idltype, value)
494
+ local reference
495
+ if value == nil then
496
+ reference = NullReference
497
+ else
498
+ local metatable = getmetatable(value)
499
+ if metatable == giop.IOR
500
+ or metatable and metatable.__type == giop.IOR
501
+ then
502
+ reference = value
503
+ else
504
+ assert.type(value, "table", "object reference", "MARSHAL")
505
+ reference = value.__reference
506
+ if not reference or reference == value then
507
+ local servants = self.context.servants
508
+ if servants then --[[VERBOSE]] verbose_marshal(true, "implicit servant creation")
509
+ local objtype = servants:resolvetype(value) or idltype
510
+ if not objtype:is_a(idltype.repID) then
511
+ assert.illegal(value,
512
+ idltype.repID..", got a "..objtype.repID, "BAD_PARAM")
513
+ end
514
+ value = assert.results(servants:register(value, nil, objtype)) --[[VERBOSE]] verbose_marshal(false)
515
+ reference = value.__reference
516
+ else
517
+ assert.illegal(value, "Object, unable to create from value", "MARHSALL")
518
+ end
519
+ end
520
+ end
521
+ end
522
+ self:struct(reference, giop.IOR) --[[VERBOSE]] verbose_marshal(false)
523
+ end
524
+
525
+ function Encoder:struct(value, idltype) --[[VERBOSE]] verbose_marshal(true, self, idltype)
526
+ for _, field in ipairs(idltype.fields) do
527
+ local val = value[field.name] --[[VERBOSE]] verbose_marshal("[field ",field.name,"]")
528
+ if val == nil and not NilEnabledTypes[field.type._type] then
529
+ assert.illegal(value,
530
+ "struct value (no value for field "..field.name..")",
531
+ "MARSHAL")
532
+ end
533
+ self:put(val, field.type)
534
+ end --[[VERBOSE]] verbose_marshal(false)
535
+ end
536
+
537
+ function Encoder:union(value, idltype) --[[VERBOSE]] verbose_marshal(true, self, idltype)
538
+ assert.type(value, "table", "union value", "MARSHAL")
539
+ local switch = value._switch
540
+
541
+ -- Marshal discriminator
542
+ if switch == nil then
543
+ switch = idltype.selector[value._field]
544
+ if switch == nil then
545
+ for _, option in ipairs(idltype.options) do
546
+ if value[option.name] ~= nil then
547
+ switch = option.label
548
+ break
549
+ end
550
+ end
551
+ if switch == nil then
552
+ switch = idltype.options[idltype.default+1]
553
+ if switch == nil then
554
+ assert.illegal(value, "union value (no discriminator)", "MARSHAL")
555
+ end
556
+ end
557
+ end
558
+ end --[[VERBOSE]] verbose_marshal "[union switch]"
559
+ self:put(switch, idltype.switch)
560
+
561
+ local selection = idltype.selection[switch]
562
+ if selection then
563
+ -- Marshal union value
564
+ local unionvalue = value._value
565
+ if unionvalue == nil then
566
+ unionvalue = value[selection.name]
567
+ if unionvalue == nil then
568
+ assert.illegal(value, "union value (none contents)", "MARSHAL")
569
+ end
570
+ end --[[VERBOSE]] verbose_marshal("[field ",selection.name,"]")
571
+ self:put(unionvalue, selection.type)
572
+ end --[[VERBOSE]] verbose_marshal(false)
573
+ end
574
+
575
+ function Encoder:enum(value, idltype) --[[VERBOSE]] verbose_marshal(true, self, idltype, value)
576
+ value = idltype.labelvalue[value] or tonumber(value)
577
+ if not value then assert.illegal(value, "enum value", "MARSHAL") end
578
+ self:ulong(value) --[[VERBOSE]] verbose_marshal(false)
579
+ end
580
+
581
+ function Encoder:string(value) --[[VERBOSE]] verbose_marshal(true, self, idl.string, value)
582
+ assert.type(value, "string", "string value", "MARSHAL")
583
+ local length = #value
584
+ self:ulong(length + 1)
585
+ self:rawput('"', value, length)
586
+ self:rawput('"', '\0', 1) --[[VERBOSE]] verbose_marshal(false)
587
+ end
588
+
589
+ function Encoder:sequence(value, idltype) --[[VERBOSE]] verbose_marshal(true, self, idltype, value)
590
+ local elementtype = idltype.elementtype
591
+ if type(value) == "string" then
592
+ local length = #value
593
+ self:ulong(length)
594
+ while elementtype._type == "typedef" do
595
+ elementtype = elementtype.original_type
596
+ end
597
+ if elementtype == idl.octet or elementtype == idl.char then
598
+ self:rawput('"', value, length)
599
+ else
600
+ assert.illegal(value, "sequence value (table expected, got string)",
601
+ "MARSHAL")
602
+ end
603
+ else
604
+ assert.type(value, "table", "sequence value", "MARSHAL")
605
+ local length = value.n or #value
606
+ self:ulong(length)
607
+ for i = 1, length do --[[VERBOSE]] verbose_marshal("[element ",i,"]")
608
+ self:put(value[i], elementtype)
609
+ end
610
+ end --[[VERBOSE]] verbose_marshal(false)
611
+ end
612
+
613
+ function Encoder:array(value, idltype) --[[VERBOSE]] verbose_marshal(true, self, idltype, value)
614
+ local elementtype = idltype.elementtype
615
+ if type(value) == "string" then
616
+ while elementtype._type == "typedef" do
617
+ elementtype = elementtype.original_type
618
+ end
619
+ if elementtype == idl.octet or elementtype == idl.char then
620
+ local length = #value
621
+ if length ~= idltype.length then
622
+ assert.illegal(value, "array value (wrong length)", "MARSHAL")
623
+ end
624
+ self:rawput('"', value, length)
625
+ else
626
+ assert.illegal(value, "array value (table expected, got string)",
627
+ "MARSHAL")
628
+ end
629
+ else
630
+ assert.type(value, "table", "array value", "MARSHAL")
631
+ for i = 1, idltype.length do --[[VERBOSE]] verbose_marshal("[element ",i,"]")
632
+ self:put(value[i], elementtype)
633
+ end
634
+ end --[[VERBOSE]] verbose_marshal(false)
635
+ end
636
+
637
+ function Encoder:typedef(value, idltype) --[[VERBOSE]] verbose_marshal(true, self, idltype, value)
638
+ self:put(value, idltype.original_type) --[[VERBOSE]] verbose_marshal(false)
639
+ end
640
+
641
+ function Encoder:except(value, idltype) --[[VERBOSE]] verbose_marshal(true, self, idltype, value)
642
+ assert.type(value, "table", "except value", "MARSHAL")
643
+ for _, member in ipairs(idltype.members) do --[[VERBOSE]] verbose_marshal("[member ", member.name, "]")
644
+ local val = value[member.name]
645
+ if val == nil and not NilEnabledTypes[member.type._type] then
646
+ assert.illegal(value,
647
+ "except value (no value for member "..member.name..")",
648
+ "MARSHAL")
649
+ end
650
+ self:put(val, member.type)
651
+ end --[[VERBOSE]] verbose_marshal(false)
652
+ end
653
+
654
+ Encoder.interface = Encoder.Object
655
+
656
+ -- Abstract Interfaces ---------------------------------------------------------
657
+
658
+ local function index(indexable, field)
659
+ return indexable[field]
660
+ end
661
+ local function pindex(indexable, field)
662
+ local ok, value = pcall(index, indexable, field)
663
+ if ok then return value end
664
+ end
665
+
666
+ function Encoder:abstract_interface(value, idltype) --[[VERBOSE]] verbose_marshal(true, self, idltype, value)
667
+ -- get type of the value
668
+ local actualtype = getmetatable(value)
669
+ if not idl.istype(actualtype) then
670
+ actualtype = pindex(actualtype, "__type")
671
+ or pindex(value, "__type")
672
+ end
673
+ local isvalue = (value == nil)
674
+ or (actualtype and actualtype._type == "valuetype")
675
+ self:boolean(not isvalue)
676
+ if isvalue then --[[VERBOSE]] verbose_marshal("value encoded as copied value")
677
+ self:valuetype(value, idl.ValueBase)
678
+ else --[[VERBOSE]] verbose_marshal("value encoded as object reference")
679
+ self:interface(value, idltype)
680
+ end --[[VERBOSE]] verbose_marshal(false)
681
+ end
682
+
683
+ -- ValueTypes ------------------------------------------------------------------
684
+
685
+ local MinValueTag = 0x7fffff00
686
+ local MaxValueTag = 0x7fffffff
687
+ local HasCodeBase = 0x00000001
688
+ local SingleRepID = 0x00000002
689
+ local ListOfRepID = 0x00000006
690
+ local ChunkedFlag = 0x00000008
691
+
692
+ local function reserve(self, size, noupdate)
693
+ local sizeindex = self.ChunkSizeIndex
694
+ if sizeindex then
695
+ local newsize = size + (self[sizeindex] or MinValueTag)
696
+ if newsize >= MinValueTag then -- update current chunk size
697
+ if size >= MinValueTag then
698
+ assert.illegal(data, "value too large", "MARSHAL")
699
+ end --[[VERBOSE]] verbose_marshal("[new encoding chunk]")
700
+ self.ChunkSizeIndex = nil -- disable chunk encoding
701
+ self:long(0) --[[start a new chunk (size is initially 0)]]
702
+ sizeindex = self.index-1
703
+ newsize = size
704
+ self.ChunkSizeIndex = sizeindex --[[VERBOSE]] SIZEINDEXPOS = self.cursor-PrimitiveSizes.long
705
+ end
706
+ if not noupdate then
707
+ self[sizeindex] = newsize --[[VERBOSE]] CURSOR[SIZEINDEXPOS] = true
708
+ end
709
+ end
710
+ end
711
+
712
+ local function reservedalign(self, size)
713
+ reserve(self, 0)
714
+ return Encoder.align(self, size)
715
+ end
716
+
717
+ local function reservedrawput(self, format, data, size)
718
+ reserve(self, size)
719
+ return Encoder.rawput(self, format, data, size)
720
+ end
721
+
722
+ local ulongsize = PrimitiveSizes.ulong
723
+ local function reservedstring(self, value)
724
+ reserve(self, alignment(self, ulongsize) -- alignment for the stating ulong
725
+ + ulongsize -- size of ulong with the string size
726
+ + #value -- number of bytes in the string
727
+ + 1, -- terminating '\0' of the string
728
+ "no update")
729
+ return Encoder.string(self, value)
730
+ end
731
+
732
+ local function reservedsequence(self, value, idltype)
733
+ local itemsize = PrimitiveSizes[idltype.elementtype._type]
734
+ if itemsize then
735
+ local count = (type(value) == "string") and #value or (value.n or #value)
736
+ reserve(self, alignment(self, ulongsize) -- alignment for the ulong
737
+ + ulongsize -- size of ulong with item count
738
+ + count * itemsize, -- size of the contents
739
+ "no update")
740
+ end
741
+ return Encoder.sequence(self, value, idltype)
742
+ end
743
+
744
+ local function reservedarray(self, value, idltype)
745
+ local itemsize = PrimitiveSizes[idltype.elementtype._type]
746
+ if itemsize then
747
+ local count = (type(value) == "string") and #value or (value.n or #value)
748
+ reserve(self, count * itemsize, "no update") -- size of the contents
749
+ end
750
+ return Encoder.array(self, value, idltype)
751
+ end
752
+
753
+ Encoder.ValueTypeNesting = 0
754
+
755
+ local abstract = idl.ValueKind.abstract
756
+ local truncatable = idl.ValueKind.truncatable
757
+ local function encodevaluetype(self, value, idltype)
758
+ -- get type of the value
759
+ local actualtype = getmetatable(value)
760
+ if not idl.istype(actualtype) then
761
+ actualtype = pindex(actualtype, "__type")
762
+ or pindex(value, "__type")
763
+ or (idltype.kind ~= abstract and idltype or nil)
764
+ end
765
+ assert.type(actualtype, "idl valuetype", "value type", "MARSHAL")
766
+ -- collect typing information and check the type of the value
767
+ local types = {}
768
+ local type = actualtype
769
+ local argidx -- index of the formal pararameter type
770
+ local lstidx -- index of the last truncatable type
771
+ for i = 1, math.huge do
772
+ types[i] = type
773
+ if type == idltype then argidx = i end
774
+ if type.kind ~= truncatable then lstidx = i end
775
+ type = type.base_value
776
+ if type == idl.null then break end
777
+ end
778
+ local truncatable = (lstidx > 1)
779
+ if argidx == nil then
780
+ if idltype ~= idl.ValueBase then
781
+ local found
782
+ -- check whether it inherits from an abstract value
783
+ if idltype.is_abstract then
784
+ for _, type in ipairs(types) do
785
+ if type:is_a(idltype.repID) then
786
+ found = true
787
+ break
788
+ end
789
+ end
790
+ end
791
+ if not found then
792
+ assert.illegal(value, "value of type "..idltype.repID, "MARSHAL")
793
+ end
794
+ end
795
+ elseif argidx < lstidx then
796
+ lstidx = argidx -- can terminate the repID list at a well known type (param)
797
+ end
798
+ -- encode tag and typing information
799
+ local nesting = self.ValueTypeNesting
800
+ self.ChunkSizeIndex = nil -- end current chunk, if any
801
+ local chunked = nesting > 0 or truncatable
802
+ local tag = MinValueTag + (chunked and ChunkedFlag or 0)
803
+ if actualtype == idltype and nesting == 0 then --[[VERBOSE]] verbose_marshal("[value tag: no truncatable bases]")
804
+ self:ulong(tag)
805
+ elseif chunked then --[[nesting > 0 or truncatable]] --[[VERBOSE]] verbose_marshal("[value tag: lists of ",lstidx," truncatable bases]")
806
+ self:ulong(tag+ListOfRepID)
807
+ self:long(lstidx)
808
+ for i = 1, lstidx do --[[VERBOSE]] verbose_marshal("[repID of truncatable base ",i,"]")
809
+ self:indirection(self.string, types[i].repID)
810
+ end
811
+ else -- non-truncatable
812
+ self:ulong(tag+SingleRepID) --[[VERBOSE]] verbose_marshal("[value tag: single truncatable base]")
813
+ self:indirection(self.string, types[1].repID)
814
+ end
815
+ -- check if chunked encoding is necessary
816
+ if chunked then
817
+ self.ValueTypeNesting = nesting+1 -- increase value nesting level
818
+ if nesting == 0 then -- enable chunked encoding if not nested
819
+ self.history[reservedstring] = self.history[self.string]
820
+ self.align = reservedalign
821
+ self.rawput = reservedrawput
822
+ self.string = reservedstring
823
+ self.sequence = reservedsequence
824
+ self.array = reservedarray
825
+ end
826
+ self.ChunkSizeIndex = "fake" -- get prepared to start a new chunk
827
+ end
828
+ -- encode value state
829
+ local membertype, membervalue
830
+ for i = #types, 1, -1 do --[[VERBOSE]] verbose_marshal("[base value ",types[i].name,"]")
831
+ local members = types[i].members
832
+ local count = #members
833
+ for j = 1, count do
834
+ local member = members[j] --[[VERBOSE]] verbose_marshal("[field ",member.name,"]")
835
+ membertype = member.type -- used in optimization below
836
+ membervalue = value[member.name]
837
+ self:put(membervalue, membertype)
838
+ end
839
+ end
840
+ -- finalize encoding of value
841
+ if chunked then
842
+ -- encode chunk end tag
843
+ local endtag = -(nesting+1)
844
+ if membertype
845
+ and membertype._type == "valuetype"
846
+ and membervalue ~= nil
847
+ and self.ChunkSizeIndex == nil then
848
+ self[self.index-1] = endtag --[[last member was a ValueType]] --[[VERBOSE]] verbose_marshal("[end tag of nested value updated to ",endtag,"] (optimized encoding)")
849
+ else --[[VERBOSE]] verbose_marshal("[end tag of encoded value]")
850
+ self.ChunkSizeIndex = nil -- terminate current chunk
851
+ self:long(endtag)
852
+ end
853
+ self.ValueTypeNesting = nesting -- restore value nesting level
854
+ if nesting == 0 then -- disable chunked encoding if not nested
855
+ self.align = nil
856
+ self.rawput = nil
857
+ self.string = nil
858
+ self.sequence = nil
859
+ self.array = nil
860
+ self.ChunkSizeIndex = nil
861
+ else
862
+ self.ChunkSizeIndex = "fake" -- get prepared to start a new chunk
863
+ end
864
+ end
865
+ end
866
+
867
+ function Encoder:valuetype(value, idltype) --[[VERBOSE]] verbose_marshal(true, self, idltype, value)
868
+ if value == nil then
869
+ self:ulong(0) -- null tag
870
+ else
871
+ assert.type(value, "table", "value", "MARSHAL")
872
+ self:indirection(encodevaluetype, value, idltype)
873
+ end --[[VERBOSE]] verbose_marshal(false)
874
+ end
875
+
876
+ -- ValueBox --------------------------------------------------------------------
877
+
878
+ local function encodevaluebox(self, value, idltype) --[[VERBOSE]] verbose_marshal("[value tag: boxed]")
879
+ local nesting = self.ValueTypeNesting
880
+ -- encode tag
881
+ self.ChunkSizeIndex = nil -- end current chunk, if any
882
+ self:ulong(MinValueTag + (nesting==0 and 0 or ChunkedFlag))
883
+ -- check if chunked encoding is necessary
884
+ if nesting > 0 then
885
+ self.ValueTypeNesting = nesting+1 -- increase value nesting level
886
+ self.ChunkSizeIndex = "fake" -- get prepared to start a new chunk
887
+ end
888
+ -- encode value
889
+ self:put(value, idltype.original_type)
890
+ -- finalize encoding of value
891
+ if nesting > 0 then --[[VERBOSE]] verbose_marshal("[end tag of encoded value]")
892
+ self.ChunkSizeIndex = nil -- terminate current chunk
893
+ self:long(-(nesting+1)) -- encode chunk end tag
894
+ self.ValueTypeNesting = nesting-1 -- decrease value nesting level
895
+ self.ChunkSizeIndex = "fake" -- get prepared to start a new chunk
896
+ end
897
+ end
898
+
899
+ function Encoder:valuebox(value, idltype) --[[VERBOSE]] verbose_marshal(true, self, idltype, value)
900
+ if value == nil then
901
+ self:ulong(0) -- null tag
902
+ else
903
+ self:indirection(encodevaluebox, value, idltype)
904
+ end --[[VERBOSE]] verbose_marshal(false)
905
+ end
906
+
907
+ -- TypeCodes -------------------------------------------------------------------
908
+
909
+ local function encodetypeinfo(self, value, kind, tcinfo)
910
+ self:ulong(kind)
911
+ local tcparams = value.tcparams
912
+ if tcparams == nil then --[[VERBOSE]] verbose_marshal "[parameters values]"
913
+ -- create encoder for encapsulated stream
914
+ local cursor = self.previousend+self.cursor
915
+ local history
916
+ if self.encodingTypeCode then
917
+ history = self.history
918
+ else
919
+ history = newhistory()
920
+ history[encodetypeinfo][value] = self.history[encodetypeinfo][value]
921
+ end
922
+ local encoder = Encoder{
923
+ context = self.context,
924
+ history = history,
925
+ previousend = cursor-1 + 4, -- adds the size of the OctetSeq count
926
+ encodingTypeCode = true,
927
+ }
928
+ encoder:boolean(NativeEndianess) -- encapsulated stream includes endianess
929
+ -- encode parameters using the encapsulated encoder
930
+ encoder:struct(value, tcinfo.parameters)
931
+ if tcinfo.mutable then --[[VERBOSE]] verbose_marshal "[mutable parameters values]"
932
+ for _, param in ipairs(tcinfo.mutable:setup(value)) do
933
+ encoder:put(value[param.name], param.type)
934
+ end
935
+ end --[[VERBOSE]] verbose_marshal(true, "[parameters encapsulation]")
936
+ -- get encapsulated stream and save for future reuse
937
+ tcparams = encoder:getdata()
938
+ if not self.encodingTypeCode then
939
+ value.tcparams = tcparams
940
+ end --[[VERBOSE]] verbose_marshal(false)
941
+ end
942
+ self:sequence(tcparams, idl.OctetSeq)
943
+ end
944
+
945
+ local TypeCodes = { interface = 14 }
946
+ for tcode, info in pairs(TypeCodeInfo) do TypeCodes[info.name] = tcode end
947
+
948
+ function Encoder:TypeCode(value) --[[VERBOSE]] verbose_marshal(true, self, idl.TypeCode, value)
949
+ assert.type(value, "idl type", "TypeCode value", "MARSHAL")
950
+ local kind = TypeCodes[value._type]
951
+ local tcinfo = TypeCodeInfo[kind]
952
+
953
+ if not kind then assert.illegal(value, "idl type", "MARSHAL") end
954
+
955
+ if tcinfo.type == "empty" then
956
+ self:ulong(kind)
957
+ elseif tcinfo.type == "simple" then
958
+ self:ulong(kind)
959
+ for _, param in ipairs(tcinfo.parameters) do --[[VERBOSE]] verbose_marshal("[parameter ",param.name,"]")
960
+ self:put(value[param.name], param.type)
961
+ end
962
+ else
963
+ self:indirection(encodetypeinfo, value, kind, tcinfo)
964
+ end --[[VERBOSE]] verbose_marshal(false)
965
+ end
966
+
967
+ --------------------------------------------------------------------------------
968
+ --## ## ## ## ## ## #### ##### #### ## ## #### ## ## --
969
+ --## ## ### ## ### ### ## ## ## ## ## ## ## ## ## ## ## --
970
+ --## ## ###### ####### ###### ##### ### ###### ###### ## ## --
971
+ --## ## ## ### ## # ## ## ## ## ## ## ## ## ## ## ## ## --
972
+ -- #### ## ## ## ## ## ## ## ## #### ## ## ## ## ##### #####--
973
+ --------------------------------------------------------------------------------
974
+
975
+ --------------------------------------------------------------------------------
976
+ -- Unmarshalling buffer class --------------------------------------------------
977
+
978
+ Decoder = oo.class{
979
+ previousend = 0,
980
+ cursor = 1,
981
+ align = Encoder.align,
982
+ unpack = bit.unpack, -- use current platform native endianess
983
+ }
984
+
985
+ function Decoder:__init(object)
986
+ self = oo.rawnew(self, object)
987
+ if self.history == nil then self.history = {} end
988
+ return self
989
+ end
990
+
991
+ function Decoder:order(value)
992
+ if value ~= NativeEndianess then
993
+ self.unpack = bit.invunpack
994
+ end
995
+ end
996
+
997
+ function Decoder:jump(shift)
998
+ local cursor = self.cursor
999
+ if shift > 0 then --[[VERBOSE]] CURSOR[self.cursor] = true; if CODEC == nil then CODEC = self end
1000
+ self.cursor = cursor + shift --[[VERBOSE]] CURSOR[self.cursor] = false
1001
+ if self.cursor - 1 > #self.data then
1002
+ assert.illegal(self.data, "data stream, insufficient data", "MARSHAL")
1003
+ end
1004
+ end
1005
+ return cursor
1006
+ end
1007
+
1008
+ function Decoder:indirection(unmarshal, ...)
1009
+ local value
1010
+ local tag = self:ulong()
1011
+ if tag == IndirectionTag then --[[VERBOSE]] verbose_unmarshal("indirection tag found")
1012
+ local pos = self.previousend+self.cursor
1013
+ local offset = self:long()
1014
+ value = self.history[pos+offset] --[[VERBOSE]] verbose_unmarshal(value == nil and "no " or "","previous value found at position ",pos+offset," (current: ",pos,")")
1015
+ if value == nil then
1016
+ assert.illegal(offset, "indirection offset", "MARSHAL")
1017
+ end
1018
+ else
1019
+ local pos = self.previousend+self.cursor - PrimitiveSizes.ulong --[[VERBOSE]] verbose_unmarshal("calculating position of value for indirections, got ",pos)
1020
+ value = unmarshal(self, pos, tag, ...)
1021
+ end
1022
+ return value
1023
+ end
1024
+
1025
+ function Decoder:get(idltype)
1026
+ local unmarshal = self[idltype._type]
1027
+ if not unmarshal then
1028
+ assert.illegal(idltype._type, "supported type", "MARSHAL")
1029
+ end
1030
+ return unmarshal(self, idltype)
1031
+ end
1032
+
1033
+ function Decoder:append(data)
1034
+ self.data = self.data..data
1035
+ end
1036
+
1037
+ function Decoder:getdata()
1038
+ return self.data
1039
+ end
1040
+
1041
+ --------------------------------------------------------------------------------
1042
+ -- Unmarshalling functions -----------------------------------------------------
1043
+
1044
+ local function numberunmarshaller(size, format)
1045
+ return function(self)
1046
+ self:align(size)
1047
+ local cursor = self:jump(size) --[[VERBOSE]] verbose_unmarshal(self, format, self.unpack(format, self.data, nil, nil, cursor))
1048
+ return self.unpack(format, self.data, nil, nil, cursor)
1049
+ end
1050
+ end
1051
+
1052
+ Decoder.null = function() end
1053
+ Decoder.void = Decoder.null
1054
+ Decoder.short = numberunmarshaller(PrimitiveSizes.short , "s")
1055
+ Decoder.long = numberunmarshaller(PrimitiveSizes.long , "l")
1056
+ Decoder.longlong = numberunmarshaller(PrimitiveSizes.longlong , "g")
1057
+ Decoder.ushort = numberunmarshaller(PrimitiveSizes.ushort , "S")
1058
+ Decoder.ulong = numberunmarshaller(PrimitiveSizes.ulong , "L")
1059
+ Decoder.ulonglong = numberunmarshaller(PrimitiveSizes.ulonglong , "G")
1060
+ Decoder.float = numberunmarshaller(PrimitiveSizes.float , "f")
1061
+ Decoder.double = numberunmarshaller(PrimitiveSizes.double , "d")
1062
+ Decoder.longdouble = numberunmarshaller(PrimitiveSizes.longdouble, "D")
1063
+
1064
+ function Decoder:boolean() --[[VERBOSE]] verbose_unmarshal(true, self, idl.boolean)
1065
+ return (self:octet() ~= 0) --[[VERBOSE]],verbose_unmarshal(false)
1066
+ end
1067
+
1068
+ function Decoder:char()
1069
+ local cursor = self:jump(1) --[[check if there is enougth bytes]] --[[VERBOSE]] verbose_unmarshal(self, idl.char, self.data:sub(cursor, cursor))
1070
+ return self.data:sub(cursor, cursor)
1071
+ end
1072
+
1073
+ function Decoder:octet()
1074
+ local cursor = self:jump(1) --[[check if there is enougth bytes]] --[[VERBOSE]] verbose_unmarshal(self, idl.octet, self.unpack("B", self.data, nil, nil, cursor))
1075
+ return self.unpack("B", self.data, nil, nil, cursor)
1076
+ end
1077
+
1078
+ function Decoder:any() --[[VERBOSE]] verbose_unmarshal(true, self, idl.any) verbose:unmarshal "[type of any]"
1079
+ local idltype = self:TypeCode() --[[VERBOSE]] verbose_unmarshal "[value of any]"
1080
+ local value = self:get(idltype)
1081
+ if type(value) == "table" then
1082
+ value._anyval = value
1083
+ value._anytype = idltype
1084
+ else
1085
+ value = setmetatable({
1086
+ _anyval = value,
1087
+ _anytype = idltype,
1088
+ }, idltype)
1089
+ end --[[VERBOSE]] verbose_unmarshal(false)
1090
+ return value
1091
+ end
1092
+
1093
+ function Decoder:Object(idltype) --[[VERBOSE]] verbose_unmarshal(true, self, idltype)
1094
+ local ior = self:struct(giop.IOR)
1095
+ if ior.type_id == "" then --[[VERBOSE]] verbose_unmarshal "got a null reference"
1096
+ ior = nil
1097
+ else
1098
+ local proxies = self.context.proxies
1099
+ if proxies then --[[VERBOSE]] verbose_unmarshal(true, "retrieve proxy for referenced object")
1100
+ if idltype._type == "Object" then idltype = idltype.repID end
1101
+ ior = assert.results(proxies:resolve(ior, idltype)) --[[VERBOSE]] verbose_unmarshal(false)
1102
+ end
1103
+ end --[[VERBOSE]] verbose_unmarshal(false)
1104
+ return ior
1105
+ end
1106
+
1107
+ function Decoder:struct(idltype) --[[VERBOSE]] verbose_unmarshal(true, self, idltype)
1108
+ local value = {}
1109
+ for _, field in ipairs(idltype.fields) do --[[VERBOSE]] verbose_unmarshal("[field ",field.name,"]")
1110
+ value[field.name] = self:get(field.type)
1111
+ end --[[VERBOSE]] verbose_unmarshal(false)
1112
+ return setmetatable(value, idltype)
1113
+ end
1114
+
1115
+ function Decoder:union(idltype) --[[VERBOSE]] verbose_unmarshal(true, self, idltype) verbose:unmarshal "[union switch]"
1116
+ local switch = self:get(idltype.switch)
1117
+ local value = { _switch = switch }
1118
+ local option = idltype.selection[switch] or
1119
+ idltype.options[idltype.default+1]
1120
+ if option then --[[VERBOSE]] verbose_unmarshal("[field ",option.name,"]")
1121
+ value._field = option.name
1122
+ value._value = self:get(option.type)
1123
+ end --[[VERBOSE]] verbose_unmarshal(false)
1124
+ return setmetatable(value, idltype)
1125
+ end
1126
+
1127
+ function Decoder:enum(idltype) --[[VERBOSE]] verbose_unmarshal(true, self, idltype)
1128
+ local value = self:ulong() + 1
1129
+ if value > #idltype.enumvalues then
1130
+ assert.illegal(value, "enumeration value", "MARSHAL")
1131
+ end --[[VERBOSE]] verbose_unmarshal(false, "got ",idltype.enumvalues[value])
1132
+ return idltype.enumvalues[value]
1133
+ end
1134
+
1135
+ function Decoder:indirectstring(pos, length)
1136
+ local cursor = self:jump(length) -- check if there is enougth bytes
1137
+ local value = self.data:sub(cursor, cursor + length - 2)
1138
+ if pos then self.history[pos] = value end --[[VERBOSE]] verbose_unmarshal("got ",verbose.viewer:tostring(value))
1139
+ return value
1140
+ end
1141
+
1142
+ function Decoder:string() --[[VERBOSE]] verbose_unmarshal(true, self, idl.string)
1143
+ return self:indirectstring(nil, self:ulong()) --[[VERBOSE]],verbose_unmarshal(false)
1144
+ end
1145
+
1146
+ function Decoder:sequence(idltype) --[[VERBOSE]] verbose_unmarshal(true, self, idltype)
1147
+ local length = self:ulong()
1148
+ local elementtype = idltype.elementtype
1149
+ local value
1150
+ while elementtype._type == "typecode" do elementtype = elementtype.type end
1151
+ if elementtype == idl.octet or elementtype == idl.char then
1152
+ local cursor = self:jump(length) -- check if there is enougth bytes
1153
+ value = self.data:sub(cursor, cursor + length - 1) --[[VERBOSE]] verbose_unmarshal("got ", verbose.viewer:tostring(value))
1154
+ else
1155
+ value = setmetatable({ n = length }, idltype)
1156
+ for i = 1, length do --[[VERBOSE]] verbose_unmarshal("[element ",i,"]")
1157
+ value[i] = self:get(elementtype)
1158
+ end
1159
+ end --[[VERBOSE]] verbose_unmarshal(false)
1160
+ return value
1161
+ end
1162
+
1163
+ function Decoder:array(idltype) --[[VERBOSE]] verbose_unmarshal(true, self, idltype)
1164
+ local length = idltype.length
1165
+ local elementtype = idltype.elementtype
1166
+ local value
1167
+ while elementtype._type == "typecode" do elementtype = elementtype.type end
1168
+ if elementtype == idl.octet or elementtype == idl.char then
1169
+ local cursor = self:jump(length) -- check if there is enougth bytes
1170
+ value = self.data:sub(cursor, cursor + length - 1) --[[VERBOSE]] verbose_unmarshal("got ",verbose.viewer:tostring(value))
1171
+ else
1172
+ value = setmetatable({}, idltype)
1173
+ for i = 1, length do --[[VERBOSE]] verbose_unmarshal("[element ",i,"]")
1174
+ value[i] = self:get(elementtype)
1175
+ end
1176
+ end --[[VERBOSE]] verbose_unmarshal(false)
1177
+ return value
1178
+ end
1179
+
1180
+ function Decoder:typedef(idltype) --[[VERBOSE]] verbose_unmarshal(true, self, idltype)
1181
+ return self:get(idltype.original_type) --[[VERBOSE]],verbose_unmarshal(false)
1182
+ end
1183
+
1184
+ function Decoder:except(idltype) --[[VERBOSE]] verbose_unmarshal(true, self, idltype)
1185
+ local value = {}
1186
+ for _, member in ipairs(idltype.members) do --[[VERBOSE]] verbose_unmarshal("[member ",member.name,"]")
1187
+ value[member.name] = self:get(member.type)
1188
+ end --[[VERBOSE]] verbose_unmarshal(false)
1189
+ return setmetatable(value, idltype)
1190
+ end
1191
+
1192
+ Decoder.interface = Decoder.Object
1193
+
1194
+ function Decoder:abstract_interface(idltype) --[[VERBOSE]] verbose_unmarshal(true, self, idltype)
1195
+ local value
1196
+ if self:boolean() then --[[VERBOSE]] verbose_unmarshal("value is a copied value")
1197
+ value = self:interface(idltype)
1198
+ else --[[VERBOSE]] verbose_unmarshal("value is an object reference")
1199
+ value = self:valuetype(idl.ValueBase)
1200
+ end --[[VERBOSE]] verbose_unmarshal(false)
1201
+ return value
1202
+ end
1203
+
1204
+ -- ValueTypes ------------------------------------------------------------------
1205
+
1206
+ Decoder.ValueTypeNesting = 0
1207
+
1208
+ local decodevaluetype
1209
+
1210
+ local function reservedjump(self, shift)
1211
+ self.jump = nil -- disable chunk decoding
1212
+ local chunkend = self.ChunkEnd
1213
+ if chunkend == nil then
1214
+ local cursor = self.cursor
1215
+ local value = self:long()
1216
+ if value >= MinValueTag then --[[VERBOSE]] verbose_unmarshal("found nested value in chunked encoding")
1217
+ self.cursor = cursor+shift -- rollback the cursor
1218
+ return cursor -- return with chunk decoding disabled
1219
+ elseif value > 0 then
1220
+ chunkend = self.cursor + value -- calculate new chunk end
1221
+ self.ChunkEnd = chunkend --[[VERBOSE]] verbose_unmarshal("value encoding chunk started (end at ",chunkend,")")
1222
+ else -- end tag
1223
+ assert.illegal(self.data,
1224
+ "data stream, chunked value encoding ended prematurely", "MARSHAL")
1225
+ end
1226
+ end
1227
+ local result = self:jump(shift)
1228
+ if self.cursor == chunkend then --[[VERBOSE]] verbose_unmarshal("value encoding chunk finished")
1229
+ self.ChunkEnd = nil
1230
+ elseif chunkend and self.cursor > chunkend then
1231
+ assert.illegal(self.data,
1232
+ "data stream, value chunk ended prematurely", "MARSHAL")
1233
+ end
1234
+ self.jump = reservedjump -- re-enable chunk decoding
1235
+ return result
1236
+ end
1237
+
1238
+ local function skipchunks(self, nesting)
1239
+ self.jump = nil
1240
+ local chunkend = self.ChunkEnd
1241
+ if chunkend then --[[VERBOSE]] verbose_unmarshal("skipping the remains of current chunk")
1242
+ self:jump(chunkend - self.cursor)
1243
+ self.ChunkEnd = nil
1244
+ end
1245
+ repeat
1246
+ local value = self:long()
1247
+ if value >= MinValueTag then --[[VERBOSE]] verbose_unmarshal(true, "skipping nested value")
1248
+ local pos = self.previousend+self.cursor - PrimitiveSizes.ulong --[[VERBOSE]] verbose_unmarshal("calculating position of value for indirections, got ",pos)
1249
+ value = decodevaluetype(self, pos, value) --[[VERBOSE]] verbose_unmarshal(false)
1250
+ self.jump = nil
1251
+ elseif value > 0 then --[[VERBOSE]] verbose_unmarshal("skipping an entire chunk")
1252
+ self:jump(value)
1253
+ else -- end tag
1254
+ self.ValueTypeNesting = -(value+1) --[[VERBOSE]] verbose_unmarshal("found the end tag of a nested value, restoring to nesting level ",self.ValueTypeNesting)
1255
+ end
1256
+ until self.ValueTypeNesting <= nesting
1257
+ if self.ValueTypeNesting > 0 then self.jump = reservedjump end
1258
+ end
1259
+
1260
+ local truncatable = idl.ValueKind.truncatable
1261
+ local function decodevaluestate(self, value, idltype, repidlist, chunked)
1262
+ -- check if chunked decoding is necessary
1263
+ local nesting
1264
+ if chunked then
1265
+ -- increase value nesting level
1266
+ nesting = self.ValueTypeNesting
1267
+ self.ValueTypeNesting = nesting+1
1268
+ -- enable chunked decoding
1269
+ self:align(PrimitiveSizes.long)
1270
+ self.jump = reservedjump
1271
+ end
1272
+ -- find value's type description
1273
+ local type
1274
+ if repidlist == 0 then
1275
+ type = idltype
1276
+ else
1277
+ local types = self.context.types
1278
+ if types then
1279
+ for i = 1, #repidlist do
1280
+ local repID = repidlist[i]
1281
+ type = types:resolve(repID)
1282
+ if type ~= nil then break end --[[VERBOSE]] verbose_unmarshal("skipping unknown truncatable base ",repID)
1283
+ end
1284
+ end
1285
+ if type == nil then
1286
+ assert.illegal(value,
1287
+ "value, all truncatable bases are unknown", "MARSHAL")
1288
+ end
1289
+ assert.type(type, "idl valuetype", "type of received value", "MARSHAL")
1290
+ end --[[VERBOSE]] verbose_unmarshal("decoding value as a ",type.name)
1291
+ setmetatable(value, type)
1292
+ -- collect all base types
1293
+ local types = {}
1294
+ for i = 1, math.huge do
1295
+ types[i] = type
1296
+ type = type.base_value
1297
+ if type == idl.null then break end
1298
+ end
1299
+ -- decode value state
1300
+ for i = #types, 1, -1 do --[[VERBOSE]] verbose_unmarshal("[base value ",types[i].name,"]")
1301
+ local members = types[i].members
1302
+ for j = 1, #members do
1303
+ local member = members[j] --[[VERBOSE]] verbose_unmarshal("[field ",member.name,"]")
1304
+ value[member.name] = self:get(member.type)
1305
+ end
1306
+ end
1307
+ -- finalize decoding of value
1308
+ if chunked then
1309
+ skipchunks(self, nesting) -- skip the remains of this value
1310
+ end
1311
+ -- construct the value using the factory
1312
+ local factory = self.context.factories
1313
+ if factory then
1314
+ factory = factory[types[1].repID]
1315
+ if factory then --[[VERBOSE]] verbose_unmarshal(true, "building value using factory of ",types[1].repID)
1316
+ factory(value) --[[VERBOSE]] verbose_unmarshal(false) else verbose_unmarshal("no factory found for ",types[1].repID)
1317
+ end
1318
+ end
1319
+ end
1320
+
1321
+ function decodevaluetype(self, pos, tag, idltype)
1322
+ -- check for null tag
1323
+ if tag == 0 then
1324
+ return nil --[[VERBOSE]],verbose_unmarshal("got a null")
1325
+ end
1326
+ -- check tag value
1327
+ if tag < MinValueTag or tag > MaxValueTag then
1328
+ assert.illegal(tag, "value tag", "MARSHAL")
1329
+ end
1330
+ -- decode flags contained in the tag
1331
+ local codebase = tag%2
1332
+ tag = tag-codebase
1333
+ local repidlist = tag%8
1334
+ tag = tag-repidlist
1335
+ local chunked = (tag%16 == ChunkedFlag)
1336
+ -- ignore CodeBaseURL string if present
1337
+ if codebase == HasCodeBase then --[[VERBOSE]] verbose_unmarshal("[CodeBaseURL: ignored]")
1338
+ self:indirection(self.indirectstring)
1339
+ end
1340
+ -- decode typing information
1341
+ if repidlist == SingleRepID then --[[VERBOSE]] verbose_unmarshal("[single truncatable base]")
1342
+ repidlist = { self:indirection(self.indirectstring) }
1343
+ elseif repidlist == ListOfRepID then --[[VERBOSE]] verbose_unmarshal("[list of truncatable bases]")
1344
+ repidlist = {}
1345
+ for i = 1, self:long() do
1346
+ repidlist[i] = self:indirection(self.indirectstring)
1347
+ end
1348
+ elseif repidlist ~= 0 then
1349
+ assert.illegal(repidlist,
1350
+ "type information bit pattern in value tag (only 0, "
1351
+ ..SingleRepID.." and "..ListOfRepID.." are valid)", "MARSHAL")
1352
+ end
1353
+ -- create value
1354
+ local value = {}
1355
+ self.history[pos] = value
1356
+ if idltype == nil then --[[VERBOSE]] verbose_unmarshal(true, "skipping chunks of a nested value inside a chunked value")
1357
+ -- skipping chunks of a nested value
1358
+ local cursor = self.cursor
1359
+ local nesting = self.ValueTypeNesting
1360
+ function value._complete(_, idltype) --[[VERBOSE]] verbose_unmarshal(true, "resuming decoding of previously skipped nested value")
1361
+ value._complete = nil
1362
+ local cursor_back = self.cursor
1363
+ local nesting_back = self.ValueTypeNesting
1364
+ local chunkend_back = self.ChunkEnd
1365
+ local jump_back = rawget(self, "jump")
1366
+ self.cursor = cursor
1367
+ self.ValueTypeNesting = nesting
1368
+ self.ChunkEnd = nil
1369
+ self.jump = nil
1370
+ decodevaluestate(self, value, idltype, repidlist, chunked)
1371
+ self.cursor = cursor_back
1372
+ self.ValueTypeNesting = nesting_back --[[VERBOSE]] verbose_unmarshal(false)
1373
+ self.ChunkEnd = chunkend_back
1374
+ self.jump = jump_back
1375
+ end
1376
+ self.ValueTypeNesting = nesting+1
1377
+ skipchunks(self, nesting) --[[VERBOSE]] verbose_unmarshal(false)
1378
+ else
1379
+ decodevaluestate(self, value, idltype, repidlist, chunked)
1380
+ end
1381
+ return value
1382
+ end
1383
+
1384
+ function Decoder:valuetype(idltype) --[[VERBOSE]] verbose_unmarshal(true, self, idltype)
1385
+ local value = self:indirection(decodevaluetype, idltype)
1386
+ if value and value._complete then value:_complete() end --[[VERBOSE]] verbose_unmarshal(false)
1387
+ return value
1388
+ end
1389
+
1390
+ -- ValueBox --------------------------------------------------------------------
1391
+
1392
+ local function decodevaluebox(self, pos, tag, idltype)
1393
+ -- check for null tag
1394
+ if tag == 0 then
1395
+ return nil --[[VERBOSE]],verbose_unmarshal("got a null")
1396
+ end
1397
+ -- check tag value
1398
+ local chunked = (tag == MinValueTag+ChunkedFlag)
1399
+ if not chunked and tag ~= MinValueTag then
1400
+ assert.illegal(tag, "value box tag", "MARSHAL")
1401
+ end
1402
+ -- check if chunked decoding is necessary
1403
+ local nesting
1404
+ if chunked then
1405
+ -- increase value nesting level
1406
+ nesting = self.ValueTypeNesting
1407
+ self.ValueTypeNesting = nesting+1
1408
+ -- enable chunked decoding
1409
+ self:align(PrimitiveSizes.long)
1410
+ self.jump = reservedjump
1411
+ end
1412
+ -- decode value state
1413
+ local value = self:get(idltype.original_type)
1414
+ self.history[pos] = value
1415
+ -- finalize decoding of value
1416
+ if chunked then
1417
+ skipchunks(self, nesting) -- skip the remains of this value
1418
+ end
1419
+ return value
1420
+ end
1421
+
1422
+ function Decoder:valuebox(idltype) --[[VERBOSE]] verbose_unmarshal(true, self, idltype)
1423
+ return self:indirection(decodevaluebox, idltype) --[[VERBOSE]],verbose_unmarshal(false)
1424
+ end
1425
+
1426
+ --------------------------------------------------------------------------------
1427
+
1428
+ local function decodetypeinfo(self, pos, kind)
1429
+ local tcinfo = TypeCodeInfo[kind]
1430
+ if tcinfo == nil then assert.illegal(kind, "type code", "MARSHAL") end --[[VERBOSE]] verbose_unmarshal("TypeCode defines a ",tcinfo.name)
1431
+ if tcinfo.unhandled then
1432
+ assert.illegal(tcinfo.name, "supported type code", "MARSHAL")
1433
+ end
1434
+ if tcinfo.type == "empty" then
1435
+ return tcinfo.idl
1436
+ elseif tcinfo.type == "simple" then
1437
+ -- NOTE: The string type is the only simple type being handled,
1438
+ -- therefore parameters are ignored.
1439
+ for _, param in ipairs(tcinfo.parameters) do --[[VERBOSE]] verbose_unmarshal("[parameter ",param.name,"]")
1440
+ self:get(param.type)
1441
+ end
1442
+ return tcinfo.idl
1443
+ elseif tcinfo.type == "complex" then --[[VERBOSE]] verbose_unmarshal(true, "[parameters encapsulation]")
1444
+ local tcparams = self:sequence(idl.OctetSeq)
1445
+ local value = { _type = tcinfo.name }
1446
+ local history = self.history
1447
+ history[pos] = value
1448
+ if not self.encodingTypeCode then
1449
+ history = { [pos] = value } -- do not inherit history, as it is standalone
1450
+ value.tcparams = tcparams
1451
+ end
1452
+ -- create decoder for encapsulated stream
1453
+ local cursor = self.previousend+self.cursor
1454
+ local decoder = Decoder{
1455
+ data = tcparams,
1456
+ context = self.context,
1457
+ history = history,
1458
+ previousend = cursor-1 - #tcparams, -- rolls back before the OctetSeq read
1459
+ encodingTypeCode = true,
1460
+ }
1461
+ decoder:order(decoder:boolean()) -- encapsulated stream includes endianess
1462
+ -- encode parameters using the encapsulated encoder
1463
+ for _, field in ipairs(tcinfo.parameters.fields) do --[[VERBOSE]] verbose_unmarshal("[field ",field.name,"]")
1464
+ value[field.name] = decoder:get(field.type)
1465
+ end
1466
+ if tcinfo.mutable then --[[VERBOSE]] verbose_unmarshal "[mutable parameters values]"
1467
+ for _, param in ipairs(tcinfo.mutable:setup(value)) do
1468
+ value[param.name] = decoder:get(param.type)
1469
+ end
1470
+ end --[[VERBOSE]] verbose_unmarshal(false)
1471
+ -- build local TypeCode value
1472
+ return idl[tcinfo.name](value)
1473
+ end
1474
+ end
1475
+
1476
+ function Decoder:TypeCode() --[[VERBOSE]] verbose_unmarshal(true, self, idl.TypeCode)
1477
+ return self:indirection(decodetypeinfo) --[[VERBOSE]],verbose_unmarshal(false)
1478
+ end
1479
+
1480
+ --------------------------------------------------------------------------------
1481
+ --------------------------------------------------------------------------------
1482
+
1483
+ -- NOTE: second parameter indicates an encasulated octet-stream, therefore
1484
+ -- endianess must be read from stream.
1485
+ function decoder(self, octets, getorder)
1486
+ local decoder = self.Decoder{
1487
+ data = octets,
1488
+ context = self,
1489
+ }
1490
+ if getorder then decoder:order(decoder:boolean()) end
1491
+ return decoder
1492
+ end
1493
+
1494
+ -- NOTE: Presence of a parameter indicates an encapsulated octet-stream.
1495
+ function encoder(self, putorder)
1496
+ local encoder = self.Encoder{ context = self }
1497
+ if putorder then encoder:boolean(NativeEndianess) end
1498
+ return encoder
1499
+ end
1500
+
1501
+ --------------------------------------------------------------------------------
1502
+ --------------------------------------------------------------------------------
1503
+
1504
+ --[[VERBOSE]] local numtype = {
1505
+ --[[VERBOSE]] s = idl.short,
1506
+ --[[VERBOSE]] l = idl.long,
1507
+ --[[VERBOSE]] g = idl.longlong,
1508
+ --[[VERBOSE]] S = idl.ushort,
1509
+ --[[VERBOSE]] L = idl.ulong,
1510
+ --[[VERBOSE]] G = idl.ulonglong,
1511
+ --[[VERBOSE]] f = idl.float,
1512
+ --[[VERBOSE]] d = idl.double,
1513
+ --[[VERBOSE]] D = idl.longdouble,
1514
+ --[[VERBOSE]] }
1515
+ --[[VERBOSE]] verbose.codecop = {
1516
+ --[[VERBOSE]] [Encoder] = "marshal",
1517
+ --[[VERBOSE]] [Decoder] = "unmarshal",
1518
+ --[[VERBOSE]] }
1519
+ --[[VERBOSE]] local luatype = type
1520
+ --[[VERBOSE]] function verbose.custom:marshal(codec, type, value)
1521
+ -- [[VERBOSE]] if CODEC and self.flags.hexastream then
1522
+ -- [[VERBOSE]] self.hexastream(self, CODEC, CURSOR)
1523
+ -- [[VERBOSE]] CURSOR, CODEC = {}, nil
1524
+ -- [[VERBOSE]] end
1525
+ --[[VERBOSE]] local viewer = self.viewer
1526
+ --[[VERBOSE]] local output = viewer.output
1527
+ --[[VERBOSE]] local op = self.codecop[oo.classof(codec)]
1528
+ --[[VERBOSE]] if op then
1529
+ --[[VERBOSE]] type = numtype[type] or type
1530
+ --[[VERBOSE]] output:write(op," of ",type._type)
1531
+ --[[VERBOSE]] type = type.name or type.repID
1532
+ --[[VERBOSE]] if type then
1533
+ --[[VERBOSE]] output:write(" ",type)
1534
+ --[[VERBOSE]] end
1535
+ --[[VERBOSE]] if value ~= nil then
1536
+ --[[VERBOSE]] if luatype(value) == "string" then
1537
+ --[[VERBOSE]] value = value:gsub("[^%w%p%s]", "?")
1538
+ --[[VERBOSE]] end
1539
+ --[[VERBOSE]] output:write(" (got ")
1540
+ --[[VERBOSE]] viewer:write(value)
1541
+ --[[VERBOSE]] output:write(")")
1542
+ --[[VERBOSE]] end
1543
+ --[[VERBOSE]] else
1544
+ --[[VERBOSE]] return true -- cancel custom message
1545
+ --[[VERBOSE]] end
1546
+ --[[VERBOSE]] end
1547
+ --[[VERBOSE]] verbose.custom.unmarshal = verbose.custom.marshal
1548
+ --[[VERBOSE]]
1549
+ --[[VERBOSE]] function verbose_marshal(...)
1550
+ --[[VERBOSE]] verbose:marshal(...)
1551
+ --[[VERBOSE]] if CODEC and verbose.flags.hexastream then
1552
+ --[[VERBOSE]] if CURSOR[SIZEINDEXPOS] and CODEC.ChunkSizeIndex then
1553
+ --[[VERBOSE]] verbose:marshal("[chunk size updated to ",CODEC[CODEC.ChunkSizeIndex],"]")
1554
+ --[[VERBOSE]] end
1555
+ --[[VERBOSE]] verbose:hexastream(CODEC, CURSOR, PREFIXSHIFT)
1556
+ --[[VERBOSE]] CURSOR, CODEC = {}, nil
1557
+ --[[VERBOSE]] end
1558
+ --[[VERBOSE]] end
1559
+ --[[VERBOSE]] function verbose_unmarshal(...)
1560
+ --[[VERBOSE]] verbose:unmarshal(...)
1561
+ --[[VERBOSE]] if CODEC and verbose.flags.hexastream then
1562
+ --[[VERBOSE]] if CURSOR[SIZEINDEXPOS] and CODEC.ChunkSizeIndex then
1563
+ --[[VERBOSE]] verbose:marshal("[chunk size updated to ",CODEC[CODEC.ChunkSizeIndex],"]")
1564
+ --[[VERBOSE]] end
1565
+ --[[VERBOSE]] verbose:hexastream(CODEC, CURSOR)
1566
+ --[[VERBOSE]] CURSOR, CODEC = {}, nil
1567
+ --[[VERBOSE]] end
1568
+ --[[VERBOSE]] end