amps-python-client 5.3.4.1__zip

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (550) hide show
  1. amps-python-client-5.3.4.1/HISTORY +7 -0
  2. amps-python-client-5.3.4.1/LICENSE +157 -0
  3. amps-python-client-5.3.4.1/PKG-INFO +112 -0
  4. amps-python-client-5.3.4.1/README.md +96 -0
  5. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/ack-messages.doctree +0 -0
  6. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/content-messages.doctree +0 -0
  7. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/intro.doctree +0 -0
  8. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/logon.doctree +0 -0
  9. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/protocol-reference.doctree +0 -0
  10. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/publishing.doctree +0 -0
  11. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/query-delimiters.doctree +0 -0
  12. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/query-subscribe.doctree +0 -0
  13. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/removing.doctree +0 -0
  14. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/utilities.doctree +0 -0
  15. amps-python-client-5.3.4.1/docs/command-reference/doctrees/environment.pickle +0 -0
  16. amps-python-client-5.3.4.1/docs/command-reference/doctrees/index.doctree +0 -0
  17. amps-python-client-5.3.4.1/docs/command-reference/html/.buildinfo +4 -0
  18. amps-python-client-5.3.4.1/docs/command-reference/html/_images/caution.svg +25 -0
  19. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/ack-messages.rst.txt +32 -0
  20. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/content-messages.rst.txt +27 -0
  21. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/intro.rst.txt +43 -0
  22. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/logon.rst.txt +231 -0
  23. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/protocol-reference.rst.txt +1474 -0
  24. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/publishing.rst.txt +25 -0
  25. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/query-delimiters.rst.txt +12 -0
  26. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/query-subscribe.rst.txt +23 -0
  27. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/removing.rst.txt +6 -0
  28. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/utilities.rst.txt +13 -0
  29. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/index.rst.txt +56 -0
  30. amps-python-client-5.3.4.1/docs/command-reference/html/_static/ajax-loader.gif +0 -0
  31. amps-python-client-5.3.4.1/docs/command-reference/html/_static/alabaster.css +699 -0
  32. amps-python-client-5.3.4.1/docs/command-reference/html/_static/basic.css +632 -0
  33. amps-python-client-5.3.4.1/docs/command-reference/html/_static/comment-bright.png +0 -0
  34. amps-python-client-5.3.4.1/docs/command-reference/html/_static/comment-close.png +0 -0
  35. amps-python-client-5.3.4.1/docs/command-reference/html/_static/comment.png +0 -0
  36. amps-python-client-5.3.4.1/docs/command-reference/html/_static/custom.css +192 -0
  37. amps-python-client-5.3.4.1/docs/command-reference/html/_static/custom.css.backup +161 -0
  38. amps-python-client-5.3.4.1/docs/command-reference/html/_static/doctools.js +287 -0
  39. amps-python-client-5.3.4.1/docs/command-reference/html/_static/down-pressed.png +0 -0
  40. amps-python-client-5.3.4.1/docs/command-reference/html/_static/down.png +0 -0
  41. amps-python-client-5.3.4.1/docs/command-reference/html/_static/file.png +0 -0
  42. amps-python-client-5.3.4.1/docs/command-reference/html/_static/flag_logo.png +0 -0
  43. amps-python-client-5.3.4.1/docs/command-reference/html/_static/flag_logo.svg +153 -0
  44. amps-python-client-5.3.4.1/docs/command-reference/html/_static/jquery-3.1.0.js +10074 -0
  45. amps-python-client-5.3.4.1/docs/command-reference/html/_static/jquery.js +4 -0
  46. amps-python-client-5.3.4.1/docs/command-reference/html/_static/minus.png +0 -0
  47. amps-python-client-5.3.4.1/docs/command-reference/html/_static/plus.png +0 -0
  48. amps-python-client-5.3.4.1/docs/command-reference/html/_static/pygments.css +74 -0
  49. amps-python-client-5.3.4.1/docs/command-reference/html/_static/searchtools.js +758 -0
  50. amps-python-client-5.3.4.1/docs/command-reference/html/_static/underscore-1.3.1.js +999 -0
  51. amps-python-client-5.3.4.1/docs/command-reference/html/_static/underscore.js +31 -0
  52. amps-python-client-5.3.4.1/docs/command-reference/html/_static/up-pressed.png +0 -0
  53. amps-python-client-5.3.4.1/docs/command-reference/html/_static/up.png +0 -0
  54. amps-python-client-5.3.4.1/docs/command-reference/html/_static/websupport.js +808 -0
  55. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/ack-messages.html +417 -0
  56. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/content-messages.html +417 -0
  57. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/intro.html +126 -0
  58. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/logon.html +295 -0
  59. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/protocol-reference.html +1190 -0
  60. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/publishing.html +436 -0
  61. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/query-delimiters.html +173 -0
  62. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/query-subscribe.html +2123 -0
  63. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/removing.html +299 -0
  64. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/utilities.html +287 -0
  65. amps-python-client-5.3.4.1/docs/command-reference/html/genindex.html +97 -0
  66. amps-python-client-5.3.4.1/docs/command-reference/html/index.html +138 -0
  67. amps-python-client-5.3.4.1/docs/command-reference/html/objects.inv +0 -0
  68. amps-python-client-5.3.4.1/docs/command-reference/html/search.html +107 -0
  69. amps-python-client-5.3.4.1/docs/command-reference/html/searchindex.js +1 -0
  70. amps-python-client-5.3.4.1/docs/html/.buildinfo +4 -0
  71. amps-python-client-5.3.4.1/docs/html/_sources/code.rst.txt +6 -0
  72. amps-python-client-5.3.4.1/docs/html/_sources/index.rst.txt +29 -0
  73. amps-python-client-5.3.4.1/docs/html/_static/ajax-loader.gif +0 -0
  74. amps-python-client-5.3.4.1/docs/html/_static/basic.css +632 -0
  75. amps-python-client-5.3.4.1/docs/html/_static/classic.css +261 -0
  76. amps-python-client-5.3.4.1/docs/html/_static/comment-bright.png +0 -0
  77. amps-python-client-5.3.4.1/docs/html/_static/comment-close.png +0 -0
  78. amps-python-client-5.3.4.1/docs/html/_static/comment.png +0 -0
  79. amps-python-client-5.3.4.1/docs/html/_static/default.css +1 -0
  80. amps-python-client-5.3.4.1/docs/html/_static/doctools.js +287 -0
  81. amps-python-client-5.3.4.1/docs/html/_static/down-pressed.png +0 -0
  82. amps-python-client-5.3.4.1/docs/html/_static/down.png +0 -0
  83. amps-python-client-5.3.4.1/docs/html/_static/file.png +0 -0
  84. amps-python-client-5.3.4.1/docs/html/_static/jquery-3.1.0.js +10074 -0
  85. amps-python-client-5.3.4.1/docs/html/_static/jquery.js +4 -0
  86. amps-python-client-5.3.4.1/docs/html/_static/minus.png +0 -0
  87. amps-python-client-5.3.4.1/docs/html/_static/plus.png +0 -0
  88. amps-python-client-5.3.4.1/docs/html/_static/pygments.css +74 -0
  89. amps-python-client-5.3.4.1/docs/html/_static/searchtools.js +758 -0
  90. amps-python-client-5.3.4.1/docs/html/_static/sidebar.js +159 -0
  91. amps-python-client-5.3.4.1/docs/html/_static/underscore-1.3.1.js +999 -0
  92. amps-python-client-5.3.4.1/docs/html/_static/underscore.js +31 -0
  93. amps-python-client-5.3.4.1/docs/html/_static/up-pressed.png +0 -0
  94. amps-python-client-5.3.4.1/docs/html/_static/up.png +0 -0
  95. amps-python-client-5.3.4.1/docs/html/_static/websupport.js +808 -0
  96. amps-python-client-5.3.4.1/docs/html/code.html +6503 -0
  97. amps-python-client-5.3.4.1/docs/html/genindex.html +1361 -0
  98. amps-python-client-5.3.4.1/docs/html/index.html +131 -0
  99. amps-python-client-5.3.4.1/docs/html/objects.inv +0 -0
  100. amps-python-client-5.3.4.1/docs/html/py-modindex.html +111 -0
  101. amps-python-client-5.3.4.1/docs/html/search.html +107 -0
  102. amps-python-client-5.3.4.1/docs/html/searchindex.js +1 -0
  103. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/advanced-topics.doctree +0 -0
  104. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/cpp-compiler-list.doctree +0 -0
  105. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/cpp-feature-table.doctree +0 -0
  106. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/creating-commands.doctree +0 -0
  107. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/deltas.doctree +0 -0
  108. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/error-handling.doctree +0 -0
  109. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/exceptions.doctree +0 -0
  110. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/first-program.doctree +0 -0
  111. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/high-availability.doctree +0 -0
  112. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/installing.doctree +0 -0
  113. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/introduction.doctree +0 -0
  114. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/moving-from-python-lite.doctree +0 -0
  115. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/performance-tips.doctree +0 -0
  116. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/queues.doctree +0 -0
  117. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/sow.doctree +0 -0
  118. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/subscriptions.doctree +0 -0
  119. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/utilities.doctree +0 -0
  120. amps-python-client-5.3.4.1/docs/python/doctrees/environment.pickle +0 -0
  121. amps-python-client-5.3.4.1/docs/python/doctrees/index.doctree +0 -0
  122. amps-python-client-5.3.4.1/docs/python/html/.buildinfo +4 -0
  123. amps-python-client-5.3.4.1/docs/python/html/_images/caution.png +0 -0
  124. amps-python-client-5.3.4.1/docs/python/html/_images/caution.svg +25 -0
  125. amps-python-client-5.3.4.1/docs/python/html/_images/connection_string.svg +461 -0
  126. amps-python-client-5.3.4.1/docs/python/html/_images/important.png +0 -0
  127. amps-python-client-5.3.4.1/docs/python/html/_images/important.svg +25 -0
  128. amps-python-client-5.3.4.1/docs/python/html/_images/tip.png +0 -0
  129. amps-python-client-5.3.4.1/docs/python/html/_images/tip.svg +31 -0
  130. amps-python-client-5.3.4.1/docs/python/html/_images/warning.png +0 -0
  131. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/advanced-topics.rst.txt +398 -0
  132. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/cpp-compiler-list.rst.txt +6 -0
  133. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/cpp-feature-table.rst.txt +26 -0
  134. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/creating-commands.rst.txt +159 -0
  135. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/deltas.rst.txt +79 -0
  136. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/error-handling.rst.txt +482 -0
  137. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/exceptions.rst.txt +128 -0
  138. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/first-program.rst.txt +142 -0
  139. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/high-availability.rst.txt +876 -0
  140. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/installing.rst.txt +184 -0
  141. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/introduction.rst.txt +50 -0
  142. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/moving-from-python-lite.rst.txt +32 -0
  143. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/performance-tips.rst.txt +434 -0
  144. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/queues.rst.txt +282 -0
  145. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/sow.rst.txt +292 -0
  146. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/subscriptions.rst.txt +374 -0
  147. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/utilities.rst.txt +214 -0
  148. amps-python-client-5.3.4.1/docs/python/html/_sources/index.rst.txt +44 -0
  149. amps-python-client-5.3.4.1/docs/python/html/_static/ajax-loader.gif +0 -0
  150. amps-python-client-5.3.4.1/docs/python/html/_static/alabaster.css +699 -0
  151. amps-python-client-5.3.4.1/docs/python/html/_static/basic.css +632 -0
  152. amps-python-client-5.3.4.1/docs/python/html/_static/comment-bright.png +0 -0
  153. amps-python-client-5.3.4.1/docs/python/html/_static/comment-close.png +0 -0
  154. amps-python-client-5.3.4.1/docs/python/html/_static/comment.png +0 -0
  155. amps-python-client-5.3.4.1/docs/python/html/_static/custom.css +192 -0
  156. amps-python-client-5.3.4.1/docs/python/html/_static/custom.css.backup +161 -0
  157. amps-python-client-5.3.4.1/docs/python/html/_static/doctools.js +287 -0
  158. amps-python-client-5.3.4.1/docs/python/html/_static/down-pressed.png +0 -0
  159. amps-python-client-5.3.4.1/docs/python/html/_static/down.png +0 -0
  160. amps-python-client-5.3.4.1/docs/python/html/_static/file.png +0 -0
  161. amps-python-client-5.3.4.1/docs/python/html/_static/flag_logo.png +0 -0
  162. amps-python-client-5.3.4.1/docs/python/html/_static/flag_logo.svg +153 -0
  163. amps-python-client-5.3.4.1/docs/python/html/_static/jquery-3.1.0.js +10074 -0
  164. amps-python-client-5.3.4.1/docs/python/html/_static/jquery.js +4 -0
  165. amps-python-client-5.3.4.1/docs/python/html/_static/minus.png +0 -0
  166. amps-python-client-5.3.4.1/docs/python/html/_static/plus.png +0 -0
  167. amps-python-client-5.3.4.1/docs/python/html/_static/pygments.css +74 -0
  168. amps-python-client-5.3.4.1/docs/python/html/_static/searchtools.js +758 -0
  169. amps-python-client-5.3.4.1/docs/python/html/_static/underscore-1.3.1.js +999 -0
  170. amps-python-client-5.3.4.1/docs/python/html/_static/underscore.js +31 -0
  171. amps-python-client-5.3.4.1/docs/python/html/_static/up-pressed.png +0 -0
  172. amps-python-client-5.3.4.1/docs/python/html/_static/up.png +0 -0
  173. amps-python-client-5.3.4.1/docs/python/html/_static/websupport.js +808 -0
  174. amps-python-client-5.3.4.1/docs/python/html/chapters/advanced-topics.html +447 -0
  175. amps-python-client-5.3.4.1/docs/python/html/chapters/cpp-compiler-list.html +92 -0
  176. amps-python-client-5.3.4.1/docs/python/html/chapters/cpp-feature-table.html +156 -0
  177. amps-python-client-5.3.4.1/docs/python/html/chapters/creating-commands.html +2837 -0
  178. amps-python-client-5.3.4.1/docs/python/html/chapters/deltas.html +169 -0
  179. amps-python-client-5.3.4.1/docs/python/html/chapters/error-handling.html +746 -0
  180. amps-python-client-5.3.4.1/docs/python/html/chapters/exceptions.html +272 -0
  181. amps-python-client-5.3.4.1/docs/python/html/chapters/first-program.html +499 -0
  182. amps-python-client-5.3.4.1/docs/python/html/chapters/high-availability.html +1014 -0
  183. amps-python-client-5.3.4.1/docs/python/html/chapters/installing.html +264 -0
  184. amps-python-client-5.3.4.1/docs/python/html/chapters/introduction.html +245 -0
  185. amps-python-client-5.3.4.1/docs/python/html/chapters/moving-from-python-lite.html +118 -0
  186. amps-python-client-5.3.4.1/docs/python/html/chapters/performance-tips.html +499 -0
  187. amps-python-client-5.3.4.1/docs/python/html/chapters/queues.html +352 -0
  188. amps-python-client-5.3.4.1/docs/python/html/chapters/sow.html +381 -0
  189. amps-python-client-5.3.4.1/docs/python/html/chapters/subscriptions.html +535 -0
  190. amps-python-client-5.3.4.1/docs/python/html/chapters/utilities.html +302 -0
  191. amps-python-client-5.3.4.1/docs/python/html/genindex.html +351 -0
  192. amps-python-client-5.3.4.1/docs/python/html/index.html +380 -0
  193. amps-python-client-5.3.4.1/docs/python/html/objects.inv +0 -0
  194. amps-python-client-5.3.4.1/docs/python/html/search.html +107 -0
  195. amps-python-client-5.3.4.1/docs/python/html/searchindex.js +1 -0
  196. amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/chapters/crankitup.doctree +0 -0
  197. amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/chapters/equipment.doctree +0 -0
  198. amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/environment.pickle +0 -0
  199. amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/index.doctree +0 -0
  200. amps-python-client-5.3.4.1/docs/python-quickstart/html/.buildinfo +4 -0
  201. amps-python-client-5.3.4.1/docs/python-quickstart/html/_sources/chapters/crankitup.rst.txt +155 -0
  202. amps-python-client-5.3.4.1/docs/python-quickstart/html/_sources/chapters/equipment.rst.txt +19 -0
  203. amps-python-client-5.3.4.1/docs/python-quickstart/html/_sources/index.rst.txt +20 -0
  204. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/ajax-loader.gif +0 -0
  205. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/alabaster.css +699 -0
  206. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/basic.css +632 -0
  207. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/comment-bright.png +0 -0
  208. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/comment-close.png +0 -0
  209. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/comment.png +0 -0
  210. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/custom.css +192 -0
  211. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/custom.css.backup +161 -0
  212. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/doctools.js +287 -0
  213. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/down-pressed.png +0 -0
  214. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/down.png +0 -0
  215. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/file.png +0 -0
  216. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/flag_logo.png +0 -0
  217. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/flag_logo.svg +153 -0
  218. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/jquery-3.1.0.js +10074 -0
  219. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/jquery.js +4 -0
  220. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/minus.png +0 -0
  221. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/plus.png +0 -0
  222. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/pygments.css +74 -0
  223. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/searchtools.js +758 -0
  224. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/underscore-1.3.1.js +999 -0
  225. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/underscore.js +31 -0
  226. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/up-pressed.png +0 -0
  227. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/up.png +0 -0
  228. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/websupport.js +808 -0
  229. amps-python-client-5.3.4.1/docs/python-quickstart/html/chapters/crankitup.html +271 -0
  230. amps-python-client-5.3.4.1/docs/python-quickstart/html/chapters/equipment.html +105 -0
  231. amps-python-client-5.3.4.1/docs/python-quickstart/html/genindex.html +97 -0
  232. amps-python-client-5.3.4.1/docs/python-quickstart/html/index.html +382 -0
  233. amps-python-client-5.3.4.1/docs/python-quickstart/html/objects.inv +0 -0
  234. amps-python-client-5.3.4.1/docs/python-quickstart/html/search.html +107 -0
  235. amps-python-client-5.3.4.1/docs/python-quickstart/html/searchindex.js +1 -0
  236. amps-python-client-5.3.4.1/docs/resources/custom.css +9 -0
  237. amps-python-client-5.3.4.1/docs/resources/flag_logo.svg +153 -0
  238. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/acks.doctree +0 -0
  239. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/actions.doctree +0 -0
  240. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/amps-statistics.doctree +0 -0
  241. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/amps_expressions.doctree +0 -0
  242. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/amps_functions.doctree +0 -0
  243. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/auxiliary_modules.doctree +0 -0
  244. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/config-file-shortcuts.doctree +0 -0
  245. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/conflated_topics.doctree +0 -0
  246. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/constructing-fields.doctree +0 -0
  247. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/daemon.doctree +0 -0
  248. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/delta.doctree +0 -0
  249. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/distribution.doctree +0 -0
  250. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/enrichment.doctree +0 -0
  251. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/events.doctree +0 -0
  252. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/file_format_versions.doctree +0 -0
  253. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/glossary.doctree +0 -0
  254. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/ha.doctree +0 -0
  255. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/installing_and_starting.doctree +0 -0
  256. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/intro.doctree +0 -0
  257. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/logging.doctree +0 -0
  258. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/messageTypes.doctree +0 -0
  259. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/monitoring.doctree +0 -0
  260. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/oof.doctree +0 -0
  261. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/operation.doctree +0 -0
  262. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/pub_sub.doctree +0 -0
  263. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/queues.doctree +0 -0
  264. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/replication.doctree +0 -0
  265. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/securing.doctree +0 -0
  266. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/sow.doctree +0 -0
  267. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/sow_queries.doctree +0 -0
  268. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/spark.doctree +0 -0
  269. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/transports.doctree +0 -0
  270. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/troubleshooting.doctree +0 -0
  271. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/txlog.doctree +0 -0
  272. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/usecases.doctree +0 -0
  273. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/utilities.doctree +0 -0
  274. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/views.doctree +0 -0
  275. amps-python-client-5.3.4.1/docs/user-guide/doctrees/environment.pickle +0 -0
  276. amps-python-client-5.3.4.1/docs/user-guide/doctrees/index.doctree +0 -0
  277. amps-python-client-5.3.4.1/docs/user-guide/html/.buildinfo +4 -0
  278. amps-python-client-5.3.4.1/docs/user-guide/html/_images/AMPS-Queues-Intro.svg +1330 -0
  279. amps-python-client-5.3.4.1/docs/user-guide/html/_images/GeoRepl.png +0 -0
  280. amps-python-client-5.3.4.1/docs/user-guide/html/_images/HA_async_ack.png +0 -0
  281. amps-python-client-5.3.4.1/docs/user-guide/html/_images/HA_sync_ack.png +0 -0
  282. amps-python-client-5.3.4.1/docs/user-guide/html/_images/Hot-Hot-Replication.png +0 -0
  283. amps-python-client-5.3.4.1/docs/user-guide/html/_images/MessageOrdering.svg +235 -0
  284. amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF5.png +0 -0
  285. amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF6.png +0 -0
  286. amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF7.png +0 -0
  287. amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF8.png +0 -0
  288. amps-python-client-5.3.4.1/docs/user-guide/html/_images/PubSub1.svg +1 -0
  289. amps-python-client-5.3.4.1/docs/user-guide/html/_images/PubSub2.svg +1 -0
  290. amps-python-client-5.3.4.1/docs/user-guide/html/_images/SOWAndSubscribeAndReplace.svg +684 -0
  291. amps-python-client-5.3.4.1/docs/user-guide/html/_images/SOWQuery1.svg +402 -0
  292. amps-python-client-5.3.4.1/docs/user-guide/html/_images/SOWQuery2.svg +505 -0
  293. amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig1.svg +1 -0
  294. amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig2.svg +1 -0
  295. amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig3.svg +1 -0
  296. amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig4.svg +1 -0
  297. amps-python-client-5.3.4.1/docs/user-guide/html/_images/caution.png +0 -0
  298. amps-python-client-5.3.4.1/docs/user-guide/html/_images/caution.svg +25 -0
  299. amps-python-client-5.3.4.1/docs/user-guide/html/_images/chicago_group.png +0 -0
  300. amps-python-client-5.3.4.1/docs/user-guide/html/_images/delta_original_messages.png +0 -0
  301. amps-python-client-5.3.4.1/docs/user-guide/html/_images/delta_update_message.png +0 -0
  302. amps-python-client-5.3.4.1/docs/user-guide/html/_images/important.png +0 -0
  303. amps-python-client-5.3.4.1/docs/user-guide/html/_images/important.svg +25 -0
  304. amps-python-client-5.3.4.1/docs/user-guide/html/_images/inline_view_conflation.svg +1 -0
  305. amps-python-client-5.3.4.1/docs/user-guide/html/_images/paginated_subs_pub.png +0 -0
  306. amps-python-client-5.3.4.1/docs/user-guide/html/_images/paginated_subs_sub.png +0 -0
  307. amps-python-client-5.3.4.1/docs/user-guide/html/_images/queue_usage_overview.svg +627 -0
  308. amps-python-client-5.3.4.1/docs/user-guide/html/_images/replication_hub.png +0 -0
  309. amps-python-client-5.3.4.1/docs/user-guide/html/_images/replication_scenario_with_ha.png +0 -0
  310. amps-python-client-5.3.4.1/docs/user-guide/html/_images/sow_overview_1.svg +248 -0
  311. amps-python-client-5.3.4.1/docs/user-guide/html/_images/sow_overview_2.svg +183 -0
  312. amps-python-client-5.3.4.1/docs/user-guide/html/_images/sow_update_sequence.svg +1 -0
  313. amps-python-client-5.3.4.1/docs/user-guide/html/_images/tip.png +0 -0
  314. amps-python-client-5.3.4.1/docs/user-guide/html/_images/tip.svg +31 -0
  315. amps-python-client-5.3.4.1/docs/user-guide/html/_images/warning.png +0 -0
  316. amps-python-client-5.3.4.1/docs/user-guide/html/_images/warning.svg +23 -0
  317. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/acks.rst.txt +232 -0
  318. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/actions.rst.txt +111 -0
  319. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/amps-statistics.rst.txt +358 -0
  320. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/amps_expressions.rst.txt +83 -0
  321. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/amps_functions.rst.txt +11 -0
  322. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/auxiliary_modules.rst.txt +86 -0
  323. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/config-file-shortcuts.rst.txt +9 -0
  324. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/conflated_topics.rst.txt +111 -0
  325. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/constructing-fields.rst.txt +269 -0
  326. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/daemon.rst.txt +232 -0
  327. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/delta.rst.txt +556 -0
  328. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/distribution.rst.txt +186 -0
  329. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/enrichment.rst.txt +191 -0
  330. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/events.rst.txt +39 -0
  331. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/file_format_versions.rst.txt +203 -0
  332. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/glossary.rst.txt +101 -0
  333. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/ha.rst.txt +465 -0
  334. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/installing_and_starting.rst.txt +23 -0
  335. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/intro.rst.txt +116 -0
  336. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/logging.rst.txt +34 -0
  337. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/messageTypes.rst.txt +1398 -0
  338. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/monitoring.rst.txt +326 -0
  339. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/oof.rst.txt +312 -0
  340. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/operation.rst.txt +27 -0
  341. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/pub_sub.rst.txt +49 -0
  342. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/queues.rst.txt +1351 -0
  343. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/replication.rst.txt +1228 -0
  344. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/securing.rst.txt +657 -0
  345. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/sow.rst.txt +57 -0
  346. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/sow_queries.rst.txt +25 -0
  347. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/spark.rst.txt +824 -0
  348. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/transports.rst.txt +291 -0
  349. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/troubleshooting.rst.txt +517 -0
  350. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/txlog.rst.txt +62 -0
  351. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/usecases.rst.txt +21 -0
  352. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/utilities.rst.txt +62 -0
  353. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/views.rst.txt +175 -0
  354. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/index.rst.txt +110 -0
  355. amps-python-client-5.3.4.1/docs/user-guide/html/_static/ajax-loader.gif +0 -0
  356. amps-python-client-5.3.4.1/docs/user-guide/html/_static/alabaster.css +695 -0
  357. amps-python-client-5.3.4.1/docs/user-guide/html/_static/basic.css +632 -0
  358. amps-python-client-5.3.4.1/docs/user-guide/html/_static/comment-bright.png +0 -0
  359. amps-python-client-5.3.4.1/docs/user-guide/html/_static/comment-close.png +0 -0
  360. amps-python-client-5.3.4.1/docs/user-guide/html/_static/comment.png +0 -0
  361. amps-python-client-5.3.4.1/docs/user-guide/html/_static/custom.css +192 -0
  362. amps-python-client-5.3.4.1/docs/user-guide/html/_static/custom.css.backup +161 -0
  363. amps-python-client-5.3.4.1/docs/user-guide/html/_static/doctools.js +287 -0
  364. amps-python-client-5.3.4.1/docs/user-guide/html/_static/down-pressed.png +0 -0
  365. amps-python-client-5.3.4.1/docs/user-guide/html/_static/down.png +0 -0
  366. amps-python-client-5.3.4.1/docs/user-guide/html/_static/file.png +0 -0
  367. amps-python-client-5.3.4.1/docs/user-guide/html/_static/flag_logo.png +0 -0
  368. amps-python-client-5.3.4.1/docs/user-guide/html/_static/flag_logo.svg +153 -0
  369. amps-python-client-5.3.4.1/docs/user-guide/html/_static/jquery-3.1.0.js +10074 -0
  370. amps-python-client-5.3.4.1/docs/user-guide/html/_static/jquery.js +4 -0
  371. amps-python-client-5.3.4.1/docs/user-guide/html/_static/minus.png +0 -0
  372. amps-python-client-5.3.4.1/docs/user-guide/html/_static/plus.png +0 -0
  373. amps-python-client-5.3.4.1/docs/user-guide/html/_static/pygments.css +74 -0
  374. amps-python-client-5.3.4.1/docs/user-guide/html/_static/searchtools.js +758 -0
  375. amps-python-client-5.3.4.1/docs/user-guide/html/_static/underscore-1.3.1.js +999 -0
  376. amps-python-client-5.3.4.1/docs/user-guide/html/_static/underscore.js +31 -0
  377. amps-python-client-5.3.4.1/docs/user-guide/html/_static/up-pressed.png +0 -0
  378. amps-python-client-5.3.4.1/docs/user-guide/html/_static/up.png +0 -0
  379. amps-python-client-5.3.4.1/docs/user-guide/html/_static/websupport.js +808 -0
  380. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/acks.html +289 -0
  381. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/actions.html +3782 -0
  382. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/amps-statistics.html +439 -0
  383. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/amps_expressions.html +1552 -0
  384. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/amps_functions.html +1626 -0
  385. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/auxiliary_modules.html +2548 -0
  386. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/config-file-shortcuts.html +508 -0
  387. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/conflated_topics.html +328 -0
  388. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/constructing-fields.html +447 -0
  389. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/daemon.html +295 -0
  390. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/delta.html +609 -0
  391. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/distribution.html +246 -0
  392. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/enrichment.html +264 -0
  393. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/events.html +449 -0
  394. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/file_format_versions.html +229 -0
  395. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/glossary.html +215 -0
  396. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/ha.html +978 -0
  397. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/installing_and_starting.html +357 -0
  398. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/intro.html +572 -0
  399. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/logging.html +972 -0
  400. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/messageTypes.html +1280 -0
  401. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/monitoring.html +718 -0
  402. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/oof.html +341 -0
  403. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/operation.html +1515 -0
  404. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/pub_sub.html +934 -0
  405. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/queues.html +1767 -0
  406. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/replication.html +1777 -0
  407. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/securing.html +697 -0
  408. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/sow.html +1038 -0
  409. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/sow_queries.html +621 -0
  410. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/spark.html +819 -0
  411. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/transports.html +352 -0
  412. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/troubleshooting.html +530 -0
  413. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/txlog.html +1013 -0
  414. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/usecases.html +288 -0
  415. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/utilities.html +133 -0
  416. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/views.html +1120 -0
  417. amps-python-client-5.3.4.1/docs/user-guide/html/genindex.html +1261 -0
  418. amps-python-client-5.3.4.1/docs/user-guide/html/index.html +163 -0
  419. amps-python-client-5.3.4.1/docs/user-guide/html/objects.inv +0 -0
  420. amps-python-client-5.3.4.1/docs/user-guide/html/search.html +106 -0
  421. amps-python-client-5.3.4.1/docs/user-guide/html/searchindex.js +1 -0
  422. amps-python-client-5.3.4.1/include/ampspy_bookmarkstore.hpp +63 -0
  423. amps-python-client-5.3.4.1/include/ampspy_compat.h +63 -0
  424. amps-python-client-5.3.4.1/include/ampspy_defs.hpp +181 -0
  425. amps-python-client-5.3.4.1/include/ampspy_recoverypointadapter.hpp +52 -0
  426. amps-python-client-5.3.4.1/include/ampspy_shims.hpp +113 -0
  427. amps-python-client-5.3.4.1/include/ampspy_type_object.hpp +242 -0
  428. amps-python-client-5.3.4.1/include/ampspy_types.hpp +1139 -0
  429. amps-python-client-5.3.4.1/include/ampspyver.h +30 -0
  430. amps-python-client-5.3.4.1/index.html +66 -0
  431. amps-python-client-5.3.4.1/samples/AMPSConsolePublisher.py +59 -0
  432. amps-python-client-5.3.4.1/samples/AMPSConsoleSubscriber.py +63 -0
  433. amps-python-client-5.3.4.1/samples/AMPSFIXBuilderPublisher.py +71 -0
  434. amps-python-client-5.3.4.1/samples/AMPSFIXShredderSubscriber.py +69 -0
  435. amps-python-client-5.3.4.1/samples/AMPSNVFIXBuilderPublisher.py +71 -0
  436. amps-python-client-5.3.4.1/samples/AMPSNVFIXShredderSubscriber.py +67 -0
  437. amps-python-client-5.3.4.1/samples/AMPSPublishForReplay.py +81 -0
  438. amps-python-client-5.3.4.1/samples/AMPSQueueConsumer.py +69 -0
  439. amps-python-client-5.3.4.1/samples/AMPSQueuePublisher.py +59 -0
  440. amps-python-client-5.3.4.1/samples/AMPSSOWConsolePublisher.py +67 -0
  441. amps-python-client-5.3.4.1/samples/AMPSSOWConsoleSubscriber.py +77 -0
  442. amps-python-client-5.3.4.1/samples/AMPSSOWandSubscribeConsoleSubscriber.py +79 -0
  443. amps-python-client-5.3.4.1/samples/AMPSSOWandSubscribeWithOOF.py +108 -0
  444. amps-python-client-5.3.4.1/samples/AMPSSubscribeForReplay.py +128 -0
  445. amps-python-client-5.3.4.1/samples/AMPSUpdateForOOF.py +123 -0
  446. amps-python-client-5.3.4.1/samples/CompositeMessagePublisher.py +84 -0
  447. amps-python-client-5.3.4.1/samples/CompositeMessageSubscriber.py +87 -0
  448. amps-python-client-5.3.4.1/samples/RandomServerChooser.py +41 -0
  449. amps-python-client-5.3.4.1/samples/sample.xml +335 -0
  450. amps-python-client-5.3.4.1/setup.py +209 -0
  451. amps-python-client-5.3.4.1/setup_amps.py +94 -0
  452. amps-python-client-5.3.4.1/src/ampspy_shims.cpp +203 -0
  453. amps-python-client-5.3.4.1/src/ampspy_type_object.cpp +484 -0
  454. amps-python-client-5.3.4.1/src/authenticator.cpp +128 -0
  455. amps-python-client-5.3.4.1/src/bookmarkstore.cpp +238 -0
  456. amps-python-client-5.3.4.1/src/client.cpp +2430 -0
  457. amps-python-client-5.3.4.1/src/client_docs.h +956 -0
  458. amps-python-client-5.3.4.1/src/cmessagehandler.cpp +151 -0
  459. amps-python-client-5.3.4.1/src/command.cpp +164 -0
  460. amps-python-client-5.3.4.1/src/command_docs.h +194 -0
  461. amps-python-client-5.3.4.1/src/compositemessagebuilder.cpp +111 -0
  462. amps-python-client-5.3.4.1/src/compositemessageparser.cpp +146 -0
  463. amps-python-client-5.3.4.1/src/conflatingrecoverypointadapter.cpp +194 -0
  464. amps-python-client-5.3.4.1/src/cpp/include/amps/BlockPublishStore.hpp +2053 -0
  465. amps-python-client-5.3.4.1/src/cpp/include/amps/BlockStore.hpp +677 -0
  466. amps-python-client-5.3.4.1/src/cpp/include/amps/BookmarkStore.hpp +542 -0
  467. amps-python-client-5.3.4.1/src/cpp/include/amps/Buffer.hpp +214 -0
  468. amps-python-client-5.3.4.1/src/cpp/include/amps/CompositeMessageBuilder.hpp +174 -0
  469. amps-python-client-5.3.4.1/src/cpp/include/amps/CompositeMessageParser.hpp +151 -0
  470. amps-python-client-5.3.4.1/src/cpp/include/amps/DefaultServerChooser.hpp +162 -0
  471. amps-python-client-5.3.4.1/src/cpp/include/amps/Field.hpp +719 -0
  472. amps-python-client-5.3.4.1/src/cpp/include/amps/HAClient.hpp +370 -0
  473. amps-python-client-5.3.4.1/src/cpp/include/amps/HAClientImpl.hpp +460 -0
  474. amps-python-client-5.3.4.1/src/cpp/include/amps/HybridPublishStore.hpp +481 -0
  475. amps-python-client-5.3.4.1/src/cpp/include/amps/LoggedBookmarkStore.hpp +1255 -0
  476. amps-python-client-5.3.4.1/src/cpp/include/amps/MMapBookmarkStore.hpp +1283 -0
  477. amps-python-client-5.3.4.1/src/cpp/include/amps/MMapStoreBuffer.hpp +290 -0
  478. amps-python-client-5.3.4.1/src/cpp/include/amps/MemoryBookmarkStore.hpp +1622 -0
  479. amps-python-client-5.3.4.1/src/cpp/include/amps/MemoryPublishStore.hpp +66 -0
  480. amps-python-client-5.3.4.1/src/cpp/include/amps/MemoryStoreBuffer.hpp +244 -0
  481. amps-python-client-5.3.4.1/src/cpp/include/amps/MemorySubscriptionManager.hpp +850 -0
  482. amps-python-client-5.3.4.1/src/cpp/include/amps/Message.hpp +1819 -0
  483. amps-python-client-5.3.4.1/src/cpp/include/amps/MessageRouter.hpp +618 -0
  484. amps-python-client-5.3.4.1/src/cpp/include/amps/PublishStore.hpp +158 -0
  485. amps-python-client-5.3.4.1/src/cpp/include/amps/ReconnectDelayStrategy.hpp +106 -0
  486. amps-python-client-5.3.4.1/src/cpp/include/amps/ReconnectDelayStrategyImpl.hpp +317 -0
  487. amps-python-client-5.3.4.1/src/cpp/include/amps/RecoveryPoint.hpp +323 -0
  488. amps-python-client-5.3.4.1/src/cpp/include/amps/RecoveryPointAdapter.hpp +501 -0
  489. amps-python-client-5.3.4.1/src/cpp/include/amps/RingBookmarkStore.hpp +669 -0
  490. amps-python-client-5.3.4.1/src/cpp/include/amps/SOWRecoveryPointAdapter.hpp +490 -0
  491. amps-python-client-5.3.4.1/src/cpp/include/amps/ServerChooser.hpp +145 -0
  492. amps-python-client-5.3.4.1/src/cpp/include/amps/ServerChooserImpl.hpp +95 -0
  493. amps-python-client-5.3.4.1/src/cpp/include/amps/amps.h +775 -0
  494. amps-python-client-5.3.4.1/src/cpp/include/amps/amps_generated.h +46 -0
  495. amps-python-client-5.3.4.1/src/cpp/include/amps/amps_impl.h +204 -0
  496. amps-python-client-5.3.4.1/src/cpp/include/amps/amps_ssl.h +78 -0
  497. amps-python-client-5.3.4.1/src/cpp/include/amps/ampscrc.hpp +210 -0
  498. amps-python-client-5.3.4.1/src/cpp/include/amps/ampsplusplus.hpp +8817 -0
  499. amps-python-client-5.3.4.1/src/cpp/include/amps/ampsuri.h +84 -0
  500. amps-python-client-5.3.4.1/src/cpp/include/amps/ampsver.h +41 -0
  501. amps-python-client-5.3.4.1/src/cpp/include/amps/ampsver.h.in +41 -0
  502. amps-python-client-5.3.4.1/src/cpp/include/amps/constants.hpp +194 -0
  503. amps-python-client-5.3.4.1/src/cpp/include/amps/util.hpp +1692 -0
  504. amps-python-client-5.3.4.1/src/cpp/src/amps_protocol.c +688 -0
  505. amps-python-client-5.3.4.1/src/cpp/src/amps_protocol_generated.h +80 -0
  506. amps-python-client-5.3.4.1/src/cpp/src/amps_ssl.c +489 -0
  507. amps-python-client-5.3.4.1/src/cpp/src/atfork.c +446 -0
  508. amps-python-client-5.3.4.1/src/cpp/src/client.c +483 -0
  509. amps-python-client-5.3.4.1/src/cpp/src/makefile +92 -0
  510. amps-python-client-5.3.4.1/src/cpp/src/message.c +837 -0
  511. amps-python-client-5.3.4.1/src/cpp/src/message_generated.h +611 -0
  512. amps-python-client-5.3.4.1/src/cpp/src/tcp.c +1489 -0
  513. amps-python-client-5.3.4.1/src/cpp/src/tcps.c +1894 -0
  514. amps-python-client-5.3.4.1/src/cpp/src/transports.c +123 -0
  515. amps-python-client-5.3.4.1/src/cpp/src/unix.c +984 -0
  516. amps-python-client-5.3.4.1/src/cpp/src/uri.c +301 -0
  517. amps-python-client-5.3.4.1/src/exponentialdelaystrategy.cpp +137 -0
  518. amps-python-client-5.3.4.1/src/failedwritehandler.cpp +116 -0
  519. amps-python-client-5.3.4.1/src/fixbuilder.cpp +146 -0
  520. amps-python-client-5.3.4.1/src/fixeddelaystrategy.cpp +114 -0
  521. amps-python-client-5.3.4.1/src/fixshredder.cpp +105 -0
  522. amps-python-client-5.3.4.1/src/fixshredder_docs.h +38 -0
  523. amps-python-client-5.3.4.1/src/haclient.cpp +691 -0
  524. amps-python-client-5.3.4.1/src/haclient_docs.h +132 -0
  525. amps-python-client-5.3.4.1/src/hybridpublishstore.cpp +137 -0
  526. amps-python-client-5.3.4.1/src/hybridpublishstore_docs.h +31 -0
  527. amps-python-client-5.3.4.1/src/memorybookmarkstore.cpp +373 -0
  528. amps-python-client-5.3.4.1/src/memorybookmarkstore_docs.h +39 -0
  529. amps-python-client-5.3.4.1/src/memorypublishstore.cpp +160 -0
  530. amps-python-client-5.3.4.1/src/memorypublishstore_docs.h +32 -0
  531. amps-python-client-5.3.4.1/src/message.cpp +765 -0
  532. amps-python-client-5.3.4.1/src/message_docs.h +306 -0
  533. amps-python-client-5.3.4.1/src/messagestream.cpp +623 -0
  534. amps-python-client-5.3.4.1/src/messagestream_docs.h +45 -0
  535. amps-python-client-5.3.4.1/src/mmapbookmarkstore.cpp +422 -0
  536. amps-python-client-5.3.4.1/src/nvfixbuilder.cpp +160 -0
  537. amps-python-client-5.3.4.1/src/nvfixbuilder_docs.h +33 -0
  538. amps-python-client-5.3.4.1/src/nvfixshredder.cpp +99 -0
  539. amps-python-client-5.3.4.1/src/nvfixshredder_docs.h +39 -0
  540. amps-python-client-5.3.4.1/src/publishstore.cpp +183 -0
  541. amps-python-client-5.3.4.1/src/raw_wrapper.cpp +756 -0
  542. amps-python-client-5.3.4.1/src/reason.cpp +71 -0
  543. amps-python-client-5.3.4.1/src/recoverypoint.cpp +135 -0
  544. amps-python-client-5.3.4.1/src/recoverypointadapter.cpp +171 -0
  545. amps-python-client-5.3.4.1/src/ringbookmarkstore.cpp +360 -0
  546. amps-python-client-5.3.4.1/src/serverchooser.cpp +245 -0
  547. amps-python-client-5.3.4.1/src/serverchooser_docs.h +39 -0
  548. amps-python-client-5.3.4.1/src/sowrecoverypointadapter.cpp +248 -0
  549. amps-python-client-5.3.4.1/src/store.cpp +62 -0
  550. amps-python-client-5.3.4.1/src/versioninfo.cpp +175 -0
@@ -0,0 +1,984 @@
1
+ /*//////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // Copyright (c) 2010-2023 60East Technologies Inc., All Rights Reserved.
4
+ //
5
+ // This computer software is owned by 60East Technologies Inc. and is
6
+ // protected by U.S. copyright laws and other laws and by international
7
+ // treaties. This computer software is furnished by 60East Technologies
8
+ // Inc. pursuant to a written license agreement and may be used, copied,
9
+ // transmitted, and stored only in accordance with the terms of such
10
+ // license agreement and with the inclusion of the above copyright notice.
11
+ // This computer software or any other copies thereof may not be provided
12
+ // or otherwise made available to any other person.
13
+ //
14
+ // U.S. Government Restricted Rights. This computer software: (a) was
15
+ // developed at private expense and is in all respects the proprietary
16
+ // information of 60East Technologies Inc.; (b) was not developed with
17
+ // government funds; (c) is a trade secret of 60East Technologies Inc.
18
+ // for all purposes of the Freedom of Information Act; and (d) is a
19
+ // commercial item and thus, pursuant to Section 12.212 of the Federal
20
+ // Acquisition Regulations (FAR) and DFAR Supplement Section 227.7202,
21
+ // Government's use, duplication or disclosure of the computer software
22
+ // is subject to the restrictions set forth by 60East Technologies Inc..
23
+ //
24
+ ///////////////////////////////////////////////////////////////////////// */
25
+ #ifndef _WIN32
26
+ #include <amps/amps_impl.h>
27
+ #include <sys/un.h>
28
+ #include <amps/ampsuri.h>
29
+
30
+ #define GET_ERRNO (errno)
31
+ #define SOCK_ERRORCODE(x) x
32
+ #include <pthread.h>
33
+
34
+ static pthread_mutexattr_t _mutexattr_recursive;
35
+ #define AMPS_INITLOCK(x) { \
36
+ pthread_mutexattr_init(&_mutexattr_recursive); \
37
+ pthread_mutexattr_settype(&_mutexattr_recursive, PTHREAD_MUTEX_RECURSIVE);\
38
+ pthread_mutex_init(x, &_mutexattr_recursive); }
39
+ #define AMPS_LOCK(x) pthread_mutex_lock(x)
40
+ #define AMPS_SPIN_LOCK(x) amps_spin_lock_counted(x)
41
+ #define AMPS_SPIN_LOCK_UNLIMITED(x) amps_spin_lock_unlimited(x)
42
+
43
+ #define AMPS_UNLOCK(x) pthread_mutex_unlock(x)
44
+ #define AMPS_KILLLOCK(x) pthread_mutex_destroy(x)
45
+ #if __STDC_VERSION__ >= 201100
46
+ #include <stdatomic.h>
47
+ #define AMPS_IEX(ptr, value) atomic_exchange_explicit((ptr), (value), memory_order_acq_rel)
48
+ #define AMPS_IEX_GET(ptr, value) atomic_exchange_explicit((ptr), (value), memory_order_acq_rel)
49
+ #define AMPS_IEX_LONG(ptr, value) atomic_exchange_explicit((ptr), (value), memory_order_acq_rel)
50
+ #define AMPS_FETCH_ADD(ptr, value) atomic_fetch_add_explicit((ptr), (value), memory_order_acq_rel)
51
+ #define AMPS_FETCH_SUB(ptr, value) atomic_fetch_sub_explicit((ptr), (value), memory_order_acq_rel)
52
+ #define AMPS_JOIN(x) \
53
+ tid = atomic_exchange((&x), (pthread_t)0); \
54
+ if(tid!=(pthread_t)0 && tid!=pthread_self()) \
55
+ { \
56
+ pthread_join(tid, NULL); \
57
+ }
58
+ #else
59
+ #define AMPS_IEX(ptr, value) (void)__sync_lock_test_and_set((ptr), (value))
60
+ #define AMPS_IEX_GET(ptr, value) __sync_lock_test_and_set((ptr), (value))
61
+ #define AMPS_IEX_LONG(ptr, value) (void)__sync_lock_test_and_set((ptr), (value))
62
+ #define AMPS_FETCH_ADD(ptr, value) __sync_fetch_and_add((ptr), (value))
63
+ #define AMPS_FETCH_SUB(ptr, value) __sync_fetch_and_sub((ptr), (value))
64
+
65
+ #define AMPS_JOIN(x) \
66
+ tid = AMPS_FETCH_ADD(&x, (pthread_t)0); \
67
+ if(tid!=(pthread_t)0 && tid!=pthread_self()) \
68
+ { \
69
+ if(__sync_bool_compare_and_swap(&x, tid, (pthread_t)0)) \
70
+ { \
71
+ pthread_join(tid, NULL); \
72
+ } \
73
+ }
74
+ #endif
75
+ #define AMPS_JOIN_DECLARE() \
76
+ pthread_t tid = (pthread_t)0;
77
+
78
+ #define AMPS_SLEEP(x) { \
79
+ static struct timespec ts = { x/1000, (x%1000) * 1000000 }; \
80
+ nanosleep(&ts, NULL); }
81
+
82
+ typedef struct
83
+ {
84
+ amps_thread_created_callback threadCreatedCallback;
85
+ void* threadCreatedCallbackUserData;
86
+ char* buf;
87
+ amps_int64_t serializer;
88
+ amps_handler messageHandler;
89
+ void* messageHandlerUserData;
90
+ amps_transport_filter_function filterFunction;
91
+ void* filterUserData;
92
+
93
+ amps_predisconnect_handler predisconnectHandler;
94
+ void* predisconnectHandlerUserData;
95
+ amps_handler disconnectHandler;
96
+ void* disconnectHandlerUserData;
97
+ amps_uint64_t readTimeoutMillis;
98
+ amps_uint64_t idleTimeMillis;
99
+ #if __STDC_VERSION__ >= 201100
100
+ atomic_int_fast64_t threadCreatedCallbackResult;
101
+ _Atomic unsigned connectionVersion;
102
+ #else
103
+ volatile amps_int64_t threadCreatedCallbackResult;
104
+ volatile unsigned connectionVersion;
105
+ #endif
106
+
107
+ size_t capacity;
108
+ #if __STDC_VERSION__ >= 201100
109
+ _Atomic AMPS_SOCKET fd;
110
+ atomic_bool disconnecting;
111
+ atomic_bool destroying;
112
+ #else
113
+ volatile AMPS_SOCKET fd;
114
+ volatile int disconnecting;
115
+ volatile int destroying;
116
+ #endif
117
+ pthread_mutex_t lock;
118
+ pthread_mutex_t sendLock;
119
+ #if __STDC_VERSION__ >= 201100
120
+ _Atomic pthread_t thread;
121
+ #else
122
+ volatile pthread_t thread;
123
+ #endif
124
+ struct sockaddr_un sockaddr;
125
+ char lastErrorBuf[1024];
126
+ }
127
+ amps_unix_t;
128
+
129
+
130
+ const amps_char* amps_unix_get_last_error(
131
+ amps_handle transport)
132
+ {
133
+ return ((amps_unix_t*)transport)->lastErrorBuf;
134
+ }
135
+
136
+ void amps_unix_set_error(
137
+ amps_unix_t* transport,
138
+ const amps_char* buffer)
139
+ {
140
+ _AMPS_SNPRINTF(transport->lastErrorBuf, sizeof(transport->lastErrorBuf), "%s", buffer);
141
+ transport->lastErrorBuf[sizeof(transport->lastErrorBuf) - 1] = '\0';
142
+ }
143
+
144
+ void amps_unix_set_socket_error(
145
+ amps_unix_t* transport)
146
+ {
147
+ int errorCode;
148
+ errorCode = errno;
149
+ amps_unix_set_error(transport, strerror(errorCode));
150
+ }
151
+
152
+ void
153
+ amps_unix_noop_filter_function(const unsigned char* data, size_t length, short direction, void* userdata)
154
+ {;}
155
+
156
+ void amps_unix_atfork_handler(amps_unix_t* transport_, int code_)
157
+ {
158
+ switch (code_)
159
+ {
160
+ case 0:
161
+ break;
162
+ case 1:
163
+ break;
164
+ case 2:
165
+ /* Reinitialize the transport lock in the forked child */
166
+ AMPS_INITLOCK(&transport_->lock);
167
+ break;
168
+ }
169
+ }
170
+
171
+ amps_handle amps_unix_create(void)
172
+ {
173
+ amps_unix_t* transport = (amps_unix_t*)malloc(sizeof(amps_unix_t));
174
+
175
+ if (transport != NULL)
176
+ {
177
+ memset(transport, 0, sizeof(amps_unix_t));
178
+ transport->fd = AMPS_INVALID_SOCKET;
179
+ AMPS_INITLOCK(&transport->lock);
180
+ AMPS_INITLOCK(&transport->sendLock);
181
+ transport->filterFunction = &amps_unix_noop_filter_function;
182
+ amps_atfork_add(transport, (_amps_atfork_callback_function)amps_unix_atfork_handler);
183
+ }
184
+
185
+ return transport;
186
+ }
187
+
188
+ void* amps_unix_threaded_reader(void* userData);
189
+
190
+ int
191
+ amps_unix_opt_parse(const char* val, size_t valLen, int* parsed)
192
+ {
193
+ size_t i;
194
+ if (valLen == 4 && memcmp(val, "true", 4) == 0)
195
+ {
196
+ *parsed = 1;
197
+ return 1;
198
+ }
199
+ else if (valLen == 5 && memcmp(val, "false", 5) == 0)
200
+ {
201
+ *parsed = 0;
202
+ return 1;
203
+ }
204
+ else
205
+ {
206
+ *parsed = 0;
207
+ for (i = 0; i < valLen ; i++)
208
+ {
209
+ *parsed *= 10;
210
+ if (val[i] >= '0' && val[i] <= '9')
211
+ {
212
+ *parsed += val[i] - '0';
213
+ }
214
+ else
215
+ {
216
+ return 0;
217
+ }
218
+ }
219
+ }
220
+ return 1;
221
+ }
222
+
223
+ amps_result
224
+ amps_unix_apply_socket_property(AMPS_SOCKET fd, const char* key, size_t keyLen, const
225
+ char* val, size_t valLen)
226
+ {
227
+ int value = 0, level = SOL_SOCKET, optname;
228
+ unsigned int optValueSize = sizeof(int);
229
+ char* optValuePtr = (char*)&value;
230
+ struct linger lingerStruct;
231
+ if (!amps_unix_opt_parse(val, valLen, &value))
232
+ {
233
+ return AMPS_E_URI;
234
+ }
235
+ if (keyLen == strlen("unix_rcvbuf") && memcmp(key, "unix_rcvbuf", keyLen) == 0)
236
+ {
237
+ optname = SO_RCVBUF;
238
+ }
239
+ else if (keyLen == strlen("unix_keepalive") && memcmp(key, "unix_keepalive", keyLen) == 0 )
240
+ {
241
+ optname = SO_KEEPALIVE;
242
+ }
243
+ else if (keyLen == strlen("unix_sndbuf") && memcmp(key, "unix_sndbuf", keyLen) == 0)
244
+ {
245
+ optname = SO_SNDBUF;
246
+ }
247
+ else if (keyLen == strlen("unix_nodelay") && memcmp(key, "unix_nodelay", keyLen) == 0)
248
+ {
249
+ optname = TCP_NODELAY;
250
+ level = IPPROTO_TCP;
251
+ }
252
+ else if (keyLen == strlen("unix_linger") && memcmp(key, "unix_linger", keyLen) == 0)
253
+ {
254
+ optname = SO_LINGER;
255
+ lingerStruct.l_onoff = value != 0;
256
+ lingerStruct.l_linger = (u_short)value;
257
+ optValuePtr = (char*)&lingerStruct;
258
+ optValueSize = sizeof(struct linger);
259
+ }
260
+ else if (keyLen == 6 && memcmp(key, "pretty", keyLen) == 0)
261
+ {
262
+ // handled in C++ layer
263
+ return AMPS_E_OK;
264
+ }
265
+ else
266
+ {
267
+ return AMPS_E_URI;
268
+ }
269
+
270
+ /* set it */
271
+ if (setsockopt(fd, level, optname, optValuePtr, optValueSize))
272
+ {
273
+ return AMPS_E_URI;
274
+ }
275
+ return AMPS_E_OK;
276
+ }
277
+
278
+ amps_result
279
+ amps_unix_parse_properties(amps_unix_t* me, const char* address,
280
+ size_t addressLength, amps_uri_state* uriState)
281
+ {
282
+ const char* key = NULL;
283
+ size_t keyLength = 0;
284
+ /* First, enable tcp_keepalive by default */
285
+ int value = 1;
286
+ unsigned int optValueSize = sizeof(int);
287
+ char* optValuePtr = (char*)&value;
288
+ if (setsockopt(me->fd, SOL_SOCKET, SO_KEEPALIVE, optValuePtr, optValueSize))
289
+ {
290
+ return AMPS_E_URI;
291
+ }
292
+ /* Now, parse the rest of the URI */
293
+ while (uriState->part_id < AMPS_URI_ERROR)
294
+ {
295
+ amps_uri_parse(address, addressLength, uriState);
296
+ if (uriState->part_id == AMPS_URI_OPTION_KEY)
297
+ {
298
+ key = uriState->part;
299
+ keyLength = uriState->part_length;
300
+ }
301
+ else if (uriState->part_id == AMPS_URI_OPTION_VALUE)
302
+ {
303
+ const char* value = uriState->part;
304
+ size_t valueLength = uriState->part_length;
305
+ if (keyLength == 4 &&
306
+ (memcmp(key, "path", 4) == 0 || memcmp(key, "bind", 4) == 0))
307
+ {
308
+ /* Maximum path length defined in sys/un.h */
309
+ const size_t max_path_len = 108;
310
+ memcpy(me->sockaddr.sun_path, value,
311
+ valueLength < max_path_len ? valueLength : max_path_len - 1);
312
+ me->sockaddr.sun_family = AF_UNIX;
313
+ me->sockaddr.sun_path[valueLength] = '\0';
314
+ }
315
+ else if (amps_unix_apply_socket_property(me->fd, key,
316
+ keyLength, value, valueLength) != AMPS_E_OK)
317
+ {
318
+ return AMPS_E_URI;
319
+ }
320
+ }
321
+ }
322
+ if (uriState->part_id == AMPS_URI_ERROR)
323
+ {
324
+ return AMPS_E_URI;
325
+ }
326
+ return AMPS_E_OK;
327
+ }
328
+
329
+ amps_result amps_unix_connect(amps_handle transport, amps_char* address)
330
+ {
331
+ AMPS_JOIN_DECLARE();
332
+ amps_unix_t* me = (amps_unix_t*)transport;
333
+ char protocol[256];
334
+ amps_uri_state uriState;
335
+ int rc;
336
+ amps_result result = AMPS_E_OK;
337
+ AMPS_SOCKET fd = AMPS_IEX_GET(&me->fd, AMPS_INVALID_SOCKET);
338
+
339
+ AMPS_LOCK(&me->lock);
340
+ pthread_cleanup_push(amps_cleanup_unlock_mutex, (void*)&me->lock);
341
+ /* if we were previously marked as disconnecting, forget that. */
342
+ AMPS_IEX_LONG(&me->disconnecting, 0);
343
+
344
+ /* were we previously connected? go ahead and close that. */
345
+ if (fd != AMPS_INVALID_SOCKET)
346
+ {
347
+ /* this is a reconnect */
348
+ shutdown(fd, SHUT_RDWR);
349
+ closesocket(fd);
350
+ fd = AMPS_INVALID_SOCKET;
351
+ }
352
+ AMPS_JOIN(me->thread);
353
+
354
+ /* parse out the address */
355
+ memset(&uriState, 0, sizeof(amps_uri_state));
356
+ size_t address_length = strlen(address);
357
+ while (uriState.part_id < AMPS_URI_PROTOCOL)
358
+ {
359
+ amps_uri_parse(address, address_length, &uriState);
360
+ }
361
+ if (uriState.part_id != AMPS_URI_PROTOCOL)
362
+ {
363
+ amps_unix_set_error(me, "URI format invalid");
364
+ result = AMPS_E_URI; goto error;
365
+ }
366
+ memcpy(protocol, uriState.part, uriState.part_length);
367
+ protocol[uriState.part_length] = '\0';
368
+ me->serializer = amps_message_get_protocol(protocol);
369
+
370
+ if (me->serializer == -1)
371
+ {
372
+ amps_unix_set_error(me, "The URI specified an unavailable protocol.");
373
+ result = AMPS_E_URI; goto error;
374
+ }
375
+ me->fd = socket(AF_UNIX, SOCK_STREAM, 0);
376
+ if (me->fd == AMPS_INVALID_SOCKET)
377
+ {
378
+ amps_unix_set_socket_error(me);
379
+ result = AMPS_E_CONNECTION_REFUSED; goto error;
380
+ }
381
+
382
+ /* apply socket properties */
383
+ if (amps_unix_parse_properties(me, address, address_length, &uriState) != AMPS_E_OK)
384
+ {
385
+ amps_unix_set_error(me, "The URI specified invalid properties.");
386
+ result = AMPS_E_URI; goto error;
387
+ }
388
+ #ifdef __APPLE__
389
+ rc = 1; /* Set NOSIGPIPE to ON */
390
+ if (setsockopt(me->fd, SOL_SOCKET, SO_NOSIGPIPE, &rc, sizeof(rc)) < 0)
391
+ {
392
+ fd = AMPS_IEX_GET(&me->fd, AMPS_INVALID_SOCKET);
393
+ amps_unix_set_error(me, "Failed to set no SIGPIPE.");
394
+ result = AMPS_E_CONNECTION; goto error;
395
+ }
396
+ #endif
397
+
398
+ rc = connect(me->fd, (struct sockaddr*)&me->sockaddr,
399
+ sizeof(struct sockaddr_un));
400
+ if (rc == -1)
401
+ {
402
+ fd = AMPS_IEX_GET(&me->fd, AMPS_INVALID_SOCKET);
403
+ amps_unix_set_socket_error(me);
404
+ result = AMPS_E_CONNECTION_REFUSED; goto error;
405
+ }
406
+
407
+
408
+ /* Increase the connection version now, so that anyone else attempting a reconnect knows
409
+ * that they may not need to. */
410
+ me->connectionVersion++;
411
+ result = AMPS_E_OK;
412
+
413
+ /* and, start up a new reader thread */
414
+ if (me->threadCreatedCallback)
415
+ {
416
+ AMPS_IEX(&me->threadCreatedCallbackResult, -1);
417
+ }
418
+ rc = pthread_create((pthread_t*)(&me->thread), NULL,
419
+ &amps_unix_threaded_reader, me);
420
+ if (rc != 0)
421
+ {
422
+ fd = AMPS_IEX_GET(&me->fd, AMPS_INVALID_SOCKET);
423
+ amps_unix_set_error(me, "Failed to create thread for receive");
424
+ result = AMPS_E_MEMORY; goto error;
425
+ }
426
+ for (int i = 0; i < AMPS_THREAD_START_TIMEOUT && me->threadCreatedCallbackResult == -1; ++i)
427
+ {
428
+ AMPS_SLEEP(4);
429
+ }
430
+ result = (amps_result)me->threadCreatedCallbackResult;
431
+ if (me->threadCreatedCallbackResult == -1)
432
+ {
433
+ amps_unix_set_error(me, "Thread created callback failed to return in a timely manner or returned -1.");
434
+ result = AMPS_E_MEMORY;
435
+ }
436
+
437
+ error:
438
+ if (result != AMPS_E_OK)
439
+ {
440
+ if (fd != AMPS_INVALID_SOCKET)
441
+ {
442
+ shutdown(fd, SHUT_RDWR);
443
+ closesocket(fd);
444
+ }
445
+ me->thread = (pthread_t)0;
446
+ }
447
+ AMPS_UNLOCK(&me->lock);
448
+ pthread_cleanup_pop(0);
449
+ return result;
450
+ }
451
+
452
+ amps_result amps_unix_set_receiver(amps_handle transport, amps_handler receiver, void* userData)
453
+ {
454
+ amps_unix_t* me = (amps_unix_t*)transport;
455
+ me->messageHandlerUserData = userData;
456
+ me->messageHandler = receiver;
457
+ return AMPS_E_OK;
458
+ }
459
+
460
+ amps_result amps_unix_set_predisconnect(amps_handle transport,
461
+ amps_predisconnect_handler receiver,
462
+ void* userData)
463
+ {
464
+ amps_unix_t* me = (amps_unix_t*)transport;
465
+ me->predisconnectHandlerUserData = userData;
466
+ me->predisconnectHandler = receiver;
467
+ return AMPS_E_OK;
468
+ }
469
+
470
+ amps_result amps_unix_set_disconnect(amps_handle transport, amps_handler receiver, void* userData)
471
+ {
472
+ amps_unix_t* me = (amps_unix_t*)transport;
473
+ me->disconnectHandlerUserData = userData;
474
+ me->disconnectHandler = receiver;
475
+ return AMPS_E_OK;
476
+ }
477
+
478
+ void amps_unix_close(amps_handle transport)
479
+ {
480
+ AMPS_JOIN_DECLARE();
481
+ amps_unix_t* me = (amps_unix_t*)transport;
482
+ AMPS_SOCKET fd = AMPS_IEX_GET(&me->fd, AMPS_INVALID_SOCKET);
483
+ AMPS_IEX_LONG(&me->disconnecting, 1);
484
+ AMPS_SPIN_LOCK_UNLIMITED(&me->lock);
485
+ pthread_cleanup_push(amps_cleanup_unlock_mutex, (void*)&me->lock);
486
+ if (fd != AMPS_INVALID_SOCKET)
487
+ {
488
+ shutdown(fd, SHUT_RDWR);
489
+ closesocket(fd);
490
+ }
491
+ AMPS_UNLOCK(&me->lock);
492
+ pthread_cleanup_pop(0);
493
+ AMPS_JOIN(me->thread);
494
+ }
495
+
496
+ void amps_unix_destroy(amps_handle transport)
497
+ {
498
+ AMPS_JOIN_DECLARE();
499
+ amps_unix_t* me = (amps_unix_t*)transport;
500
+ AMPS_SOCKET fd = AMPS_IEX_GET(&me->fd, AMPS_INVALID_SOCKET);
501
+ amps_atfork_remove(me, (_amps_atfork_callback_function)amps_unix_atfork_handler);
502
+ AMPS_LOCK(&me->lock);
503
+ pthread_cleanup_push(amps_cleanup_unlock_mutex, (void*)&me->lock);
504
+ AMPS_IEX_LONG(&me->destroying, 1);
505
+ AMPS_IEX_LONG(&me->disconnecting, 1);
506
+ if (fd != AMPS_INVALID_SOCKET)
507
+ {
508
+ shutdown(fd, SHUT_RDWR);
509
+ closesocket(fd);
510
+ }
511
+
512
+ AMPS_UNLOCK(&me->lock);
513
+ pthread_cleanup_pop(0);
514
+ AMPS_JOIN(me->thread);
515
+ AMPS_SLEEP(1);
516
+ free(me->buf);
517
+ /* Hopefully, nobody else is using me right now. */
518
+
519
+ AMPS_KILLLOCK(&me->lock);
520
+ AMPS_KILLLOCK(&me->sendLock);
521
+
522
+ free(me);
523
+ }
524
+
525
+ /* called with me->lock not already taken */
526
+ amps_result amps_unix_handle_disconnect(
527
+ amps_unix_t* me, unsigned failedConnectionVersion)
528
+ {
529
+ int cancelState = 0;
530
+ int unusedCancelState = 0;
531
+ amps_result result = AMPS_E_OK;
532
+ AMPS_SOCKET fd = AMPS_IEX_GET(&me->fd, AMPS_INVALID_SOCKET);
533
+ if (fd != AMPS_INVALID_SOCKET)
534
+ {
535
+ shutdown(fd, SHUT_RDWR);
536
+ closesocket(fd);
537
+ }
538
+
539
+ /* first let waiters know that we've failed. */
540
+ me->predisconnectHandler(me, failedConnectionVersion, me->predisconnectHandlerUserData);
541
+
542
+ /* Now take the lock on self.
543
+ * Use a spin, the only case where it might fail should be if a recv
544
+ * thread ends up here while a send thread is already handling disconnect
545
+ * and it is trying to join this thread in disconnect. */
546
+ if (AMPS_SPIN_LOCK(&me->lock) == 0)
547
+ {
548
+ return AMPS_E_RETRY;
549
+ }
550
+ pthread_cleanup_push(amps_cleanup_unlock_mutex, (void*)&me->lock);
551
+
552
+ /* if we're being destroyed, get out of here; don't worry about unlocking */
553
+ if (me->destroying)
554
+ {
555
+ result = AMPS_E_DISCONNECTED; return result;
556
+ }
557
+
558
+ /* a new connection is available. let someone else try. */
559
+ if (failedConnectionVersion != me->connectionVersion)
560
+ {
561
+ result = AMPS_E_RETRY; goto error;
562
+ }
563
+
564
+ /* if we're disconnecting, get out of here; don't reconnect */
565
+ if (me->disconnecting)
566
+ {
567
+ result = AMPS_E_DISCONNECTED; goto error;
568
+ }
569
+
570
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cancelState);
571
+ /* Call the disconect handler. */
572
+ result = me->disconnectHandler(me, me->disconnectHandlerUserData);
573
+ pthread_setcancelstate(cancelState, &unusedCancelState);
574
+ if (result == AMPS_E_OK)
575
+ {
576
+ result = AMPS_E_RETRY;
577
+ }
578
+ error:
579
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cancelState);
580
+ AMPS_UNLOCK(&me->lock);
581
+ pthread_cleanup_pop(0);
582
+ pthread_setcancelstate(cancelState, &unusedCancelState);
583
+
584
+ return result;
585
+ }
586
+
587
+ void amps_unix_handle_stream_corruption(
588
+ amps_unix_t* me, unsigned failedConnectionVersion)
589
+ {
590
+ shutdown(me->fd, SHUT_RDWR);
591
+ amps_unix_set_error(me, "The connection appears corrupt. Disconnecting.");
592
+ amps_unix_handle_disconnect(me, failedConnectionVersion);
593
+ }
594
+
595
+
596
+ amps_result
597
+ amps_unix_send_with_version(amps_handle transport,
598
+ amps_handle message,
599
+ unsigned* version_out)
600
+ {
601
+ amps_unix_t* me = (amps_unix_t*)transport;
602
+ size_t len = 16 * 1024;
603
+ int bytesWritten = -1;
604
+ unsigned int bytesWrittenN = 0;
605
+ int bytesSent = 0;
606
+
607
+ *version_out = me->connectionVersion;
608
+
609
+ if (me->disconnecting)
610
+ {
611
+ amps_unix_set_error(me, "Disconnecting.");
612
+ return AMPS_E_DISCONNECTED;
613
+ }
614
+
615
+ if (me->fd == AMPS_INVALID_SOCKET)
616
+ {
617
+ amps_unix_set_error(me, "Not connected.");
618
+ return AMPS_E_DISCONNECTED;
619
+ }
620
+
621
+ /* serialize */
622
+ AMPS_LOCK(&me->sendLock);
623
+ while (bytesWritten < 0)
624
+ {
625
+ if (me->buf == NULL)
626
+ {
627
+ me->buf = (char*)malloc(len);
628
+ if (me->buf == NULL)
629
+ {
630
+ amps_unix_set_error(me, "Unable to allocate memory to send message.");
631
+ AMPS_UNLOCK(&me->sendLock);
632
+ return AMPS_E_MEMORY;
633
+ }
634
+ me->capacity = len;
635
+ }
636
+ else
637
+ {
638
+ len = me->capacity;
639
+ }
640
+ /* reserve 4 bytes for the length of the message */
641
+ bytesWritten = amps_message_serialize(message, me->serializer, (me->buf) + 4, len - 4);
642
+ /* amps_message_serialize could have written 0 bytes.
643
+ * who are we to judge? If it returns less than 0,
644
+ * there wasn't enough room. */
645
+ if (bytesWritten >= 0)
646
+ {
647
+ break;
648
+ }
649
+ /* free this buffer, allocate a larger buffer next time */
650
+ free(me->buf);
651
+ me->capacity = 0;
652
+ me->buf = NULL;
653
+ len = (size_t)((double)len * 1.5);
654
+ }
655
+ /* once we're done, we don't free buf -- it hangs around until we need it next time.
656
+ * record the message length all up in the first 4 bytes. */
657
+ bytesWrittenN = htonl((unsigned int)bytesWritten);
658
+ me->filterFunction((const unsigned char*)me->buf + 4, (unsigned int)bytesWritten, 0, me->filterUserData);
659
+ *((unsigned int*)(me->buf)) = bytesWrittenN;
660
+ bytesWritten += 4;
661
+ /*now, send */
662
+ while (bytesSent < bytesWritten)
663
+ {
664
+ ssize_t bytesWrittenThisTime;
665
+ bytesWrittenThisTime = send(me->fd, (me->buf) + bytesSent, (unsigned int)(bytesWritten - bytesSent), MSG_NOSIGNAL);
666
+ if (bytesWrittenThisTime <= 0)
667
+ {
668
+ /* record the error */
669
+ amps_unix_set_error(me, "The connection is closed.");
670
+ AMPS_UNLOCK(&me->sendLock);
671
+ return AMPS_E_DISCONNECTED;
672
+ }
673
+ bytesSent += (int)bytesWrittenThisTime;
674
+ }
675
+ AMPS_UNLOCK(&me->sendLock);
676
+
677
+ return AMPS_E_OK;
678
+ }
679
+
680
+ amps_result
681
+ amps_unix_send(amps_handle transport,
682
+ amps_handle message)
683
+ {
684
+ unsigned version_out;
685
+ return amps_unix_send_with_version(transport, message, &version_out);
686
+ }
687
+
688
+
689
+ void* amps_unix_threaded_reader(void* userData)
690
+ {
691
+ int unusedCancelState = 0;
692
+ amps_unix_t* me = (amps_unix_t*)userData;
693
+ unsigned char* buffer, *newBuffer, *end, *readPoint, *parsePoint;
694
+ unsigned int msglenN;
695
+ unsigned long msglen, currentPosition, bytesRead = 0;
696
+ ssize_t received;
697
+ ssize_t recv_result;
698
+ int cancelState = 0;
699
+ const size_t BUFFER_SIZE = 16 * 1024;
700
+ const unsigned MAX_MESSAGE_SIZE = 1024 * 1024 * 1024;
701
+ amps_uint64_t lastReadTime = 0;
702
+ amps_uint64_t lastIdleTime = 0;
703
+ amps_handle message;
704
+
705
+ /* capture the connection version we are using now. */
706
+ unsigned connectionVersion = me->connectionVersion;
707
+ AMPS_SOCKET fd = me->fd;
708
+
709
+ /* Wait for pthread_create to set me->thread */
710
+ while (me->thread != pthread_self()
711
+ && !me->disconnecting
712
+ && !me->destroying)
713
+ {
714
+ AMPS_SLEEP(5);
715
+ }
716
+ if (me->threadCreatedCallback)
717
+ {
718
+ amps_result result = me->threadCreatedCallback(me->thread,
719
+ me->threadCreatedCallbackUserData);
720
+ AMPS_IEX(&me->threadCreatedCallbackResult, (long)result);
721
+ if (result != AMPS_E_OK)
722
+ {
723
+ return NULL;
724
+ }
725
+ }
726
+ else
727
+ {
728
+ AMPS_IEX(&me->threadCreatedCallbackResult, (long)AMPS_E_OK);
729
+ }
730
+
731
+ lastReadTime = amps_now();
732
+ lastIdleTime = lastReadTime;
733
+
734
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cancelState);
735
+ message = amps_message_create(NULL);
736
+ buffer = malloc(BUFFER_SIZE);
737
+ pthread_cleanup_push(amps_message_destroy, (void*)message);
738
+ pthread_cleanup_push(amps_cleanup_free_buffer, (void*)(&buffer));
739
+ pthread_setcancelstate(cancelState, &unusedCancelState);
740
+ if (!buffer)
741
+ {
742
+ amps_unix_handle_disconnect(me, connectionVersion);
743
+ goto cleanup;
744
+ }
745
+
746
+ end = buffer + BUFFER_SIZE;
747
+ readPoint = buffer;
748
+ parsePoint = buffer;
749
+
750
+ /* while we're open and not disconnecting */
751
+ while (connectionVersion == me->connectionVersion
752
+ && !me->disconnecting
753
+ && fd == me->fd
754
+ && me->thread == pthread_self()
755
+ )
756
+ {
757
+ if (me->destroying)
758
+ {
759
+ goto cleanup;
760
+ }
761
+ if (me->idleTimeMillis > 0 &&
762
+ (amps_now() - lastIdleTime) > me->idleTimeMillis)
763
+ {
764
+ lastIdleTime = amps_now();
765
+ cancelState = 0;
766
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cancelState);
767
+ me->messageHandler(0L,
768
+ me->messageHandlerUserData);
769
+ pthread_setcancelstate(cancelState, &unusedCancelState);
770
+ }
771
+ recv_result = recv(fd, (char*)readPoint, (size_t)(end - readPoint), 0);
772
+ if (recv_result > 0)
773
+ {
774
+ received = recv_result;
775
+ /* Call filter function without the 4 byte size */
776
+ me->filterFunction(readPoint, (size_t)received, 1, me->filterUserData);
777
+ readPoint += received;
778
+ lastReadTime = amps_now();
779
+ }
780
+ else
781
+ {
782
+ int errorcode = GET_ERRNO;
783
+ if (errorcode == SOCK_ERRORCODE(EINTR))
784
+ {
785
+ continue;
786
+ }
787
+ /* disconnect if not a timeout error, or the user only set a read timeout, or the
788
+ * read timeout has been exceeded. */
789
+ if ( (errorcode != SOCK_ERRORCODE(ETIMEDOUT) && errorcode != SOCK_ERRORCODE(EWOULDBLOCK))
790
+ || me->idleTimeMillis == 0
791
+ || (me->readTimeoutMillis && amps_now() - lastReadTime > me->readTimeoutMillis))
792
+ {
793
+ if (fd != AMPS_INVALID_SOCKET && !me->disconnecting)
794
+ {
795
+ shutdown(fd, SHUT_RDWR);
796
+ amps_unix_handle_disconnect(me, connectionVersion);
797
+ }
798
+ goto cleanup;
799
+ }
800
+ continue;
801
+ }
802
+ while (readPoint >= parsePoint + 4
803
+ && fd == me->fd)
804
+ {
805
+ msglenN = *(unsigned int*)parsePoint;
806
+ msglen = ntohl(msglenN);
807
+ if (msglen > MAX_MESSAGE_SIZE)
808
+ {
809
+ amps_unix_handle_stream_corruption(me, connectionVersion);
810
+ goto cleanup;
811
+ }
812
+ if (readPoint >= (parsePoint + msglen + 4))
813
+ {
814
+ /* there are enough bytes to parse this guy. */
815
+ parsePoint += 4;
816
+ if (amps_message_pre_deserialize(message, me->serializer,
817
+ (amps_char*)parsePoint, msglen) == AMPS_E_OK)
818
+ {
819
+ currentPosition = 0;
820
+ while (currentPosition < msglen)
821
+ {
822
+ if (amps_message_deserialize(message, me->serializer,
823
+ currentPosition,
824
+ &bytesRead) != AMPS_E_OK)
825
+ {
826
+ amps_unix_handle_stream_corruption(me, connectionVersion);
827
+ goto cleanup;
828
+ }
829
+ if (me->messageHandler)
830
+ {
831
+ cancelState = 0;
832
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cancelState);
833
+ me->messageHandler(message,
834
+ me->messageHandlerUserData);
835
+ pthread_setcancelstate(cancelState, &unusedCancelState);
836
+ }
837
+ currentPosition += bytesRead;
838
+ }
839
+ }
840
+ else
841
+ {
842
+ amps_unix_handle_stream_corruption(me, connectionVersion);
843
+ goto cleanup;
844
+ }
845
+ parsePoint += msglen;
846
+ }
847
+ else if (end < buffer + msglen + 4)
848
+ {
849
+ /* this message is larger than the buffer
850
+ * resize to 2* larger of this message or current buffer size */
851
+ size_t newLength = end < buffer + (msglen * 2) ?
852
+ msglen * 2 : (size_t)(end - buffer);
853
+ newBuffer = malloc( newLength );
854
+ if (newBuffer == NULL)
855
+ {
856
+ assert(readPoint >= parsePoint);
857
+ /* stream broken */
858
+ shutdown(fd, SHUT_RDWR);
859
+ amps_unix_handle_disconnect(me, connectionVersion);
860
+ goto cleanup;
861
+ }
862
+ memcpy(newBuffer, parsePoint, (size_t)(readPoint - parsePoint));
863
+ readPoint = newBuffer + (readPoint - parsePoint);
864
+ parsePoint = newBuffer;
865
+ cancelState = 0;
866
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cancelState);
867
+ free(buffer);
868
+ buffer = newBuffer;
869
+ pthread_setcancelstate(cancelState, &unusedCancelState);
870
+ end = newBuffer + newLength;
871
+ assert(readPoint >= parsePoint);
872
+ break;
873
+ }
874
+ else
875
+ {
876
+ /* Need to read more data to finish this message
877
+ * Move what we have to the front of the buffer. */
878
+ break;
879
+ }
880
+ } /*while(readPoint >= parsePoint + 4) */
881
+ if (readPoint > parsePoint)
882
+ {
883
+ memmove(buffer, parsePoint, (size_t)(readPoint - parsePoint));
884
+ }
885
+ readPoint = buffer + (readPoint - parsePoint);
886
+ parsePoint = buffer;
887
+ } /* while(fd != -1) */
888
+ cleanup:
889
+ cancelState = 0;
890
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cancelState);
891
+ pthread_cleanup_pop(0);
892
+ pthread_cleanup_pop(0);
893
+ amps_message_destroy(message);
894
+ free(buffer);
895
+ if (me->destroying)
896
+ {
897
+ return 0;
898
+ }
899
+ pthread_t tid = pthread_self();
900
+ #if __STDC_VERSION__ >= 201100
901
+ if (atomic_compare_exchange_strong(&(me->thread), &tid, (pthread_t)0))
902
+ {
903
+ pthread_detach(tid);
904
+ }
905
+ #else
906
+ if (__sync_bool_compare_and_swap(&(me->thread), tid, 0))
907
+ {
908
+ pthread_detach(tid);
909
+ }
910
+ #endif
911
+ return 0;
912
+ }
913
+
914
+ amps_result
915
+ amps_unix_attempt_reconnect(amps_handle transport, unsigned version)
916
+ {
917
+ amps_result res;
918
+ amps_unix_t* me = (amps_unix_t*)transport;
919
+ if (version == 0)
920
+ {
921
+ version = me->connectionVersion;
922
+ }
923
+ res = amps_unix_handle_disconnect(transport, version);
924
+ return res;
925
+ }
926
+
927
+ /* public-api -- get a socket */
928
+ AMPS_SOCKET
929
+ amps_unix_get_socket(amps_handle transport)
930
+ {
931
+ amps_unix_t* me = (amps_unix_t*)transport;
932
+ return me->fd;
933
+ }
934
+
935
+ amps_result
936
+ amps_unix_update_read_timeout(amps_unix_t* me)
937
+ {
938
+ int timeout = (int)((me->readTimeoutMillis && me->idleTimeMillis) ?
939
+ AMPS_MIN(me->readTimeoutMillis, me->idleTimeMillis) :
940
+ AMPS_MAX(me->readTimeoutMillis, me->idleTimeMillis));
941
+ int rc = 0;
942
+ struct timeval tv;
943
+ tv.tv_sec = timeout / 1000;
944
+ tv.tv_usec = (timeout % 1000) * 1000;
945
+ rc = setsockopt(me->fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval));
946
+ if (rc == -1)
947
+ {
948
+ amps_unix_set_socket_error(me);
949
+ return AMPS_E_USAGE;
950
+ }
951
+ return AMPS_E_OK;
952
+ }
953
+ amps_result
954
+ amps_unix_set_read_timeout(amps_handle transport, int readTimeout)
955
+ {
956
+ amps_unix_t* me = (amps_unix_t*)transport;
957
+ me->readTimeoutMillis = (amps_uint64_t)readTimeout * 1000;
958
+ return amps_unix_update_read_timeout(me);
959
+ }
960
+
961
+ void
962
+ amps_unix_set_filter_function(amps_handle transport, amps_transport_filter_function filterFunction_, void* userdata_)
963
+ {
964
+ amps_unix_t* me = (amps_unix_t*)transport;
965
+ me->filterUserData = userdata_;
966
+ me->filterFunction = filterFunction_ ? filterFunction_ : amps_unix_noop_filter_function;
967
+ }
968
+
969
+ void
970
+ amps_unix_set_thread_created_callback(amps_handle transport_, amps_thread_created_callback threadCreatedCallback_, void* userdata_)
971
+ {
972
+ amps_unix_t* me = (amps_unix_t*)transport_;
973
+ me->threadCreatedCallbackUserData = userdata_;
974
+ me->threadCreatedCallback = threadCreatedCallback_;
975
+ }
976
+
977
+ amps_result
978
+ amps_unix_set_idle_time(amps_handle transport, int millis)
979
+ {
980
+ amps_unix_t* me = (amps_unix_t*)transport;
981
+ me->idleTimeMillis = (amps_uint64_t)millis;
982
+ return amps_unix_update_read_timeout(me);
983
+ }
984
+ #endif /* ifndef _WIN32 */