amps-python-client 5.3.4.1__zip → 5.3.4.2__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 (917) hide show
  1. amps-python-client-5.3.4.2/PKG-INFO +112 -0
  2. amps-python-client-5.3.4.2/docs/command-reference/doctrees/chapters/ack-messages.doctree +0 -0
  3. amps-python-client-5.3.4.2/docs/command-reference/doctrees/chapters/content-messages.doctree +0 -0
  4. amps-python-client-5.3.4.2/docs/command-reference/doctrees/chapters/intro.doctree +0 -0
  5. amps-python-client-5.3.4.2/docs/command-reference/doctrees/chapters/logon.doctree +0 -0
  6. amps-python-client-5.3.4.2/docs/command-reference/doctrees/chapters/protocol-reference.doctree +0 -0
  7. amps-python-client-5.3.4.2/docs/command-reference/doctrees/chapters/publishing.doctree +0 -0
  8. amps-python-client-5.3.4.2/docs/command-reference/doctrees/chapters/query-delimiters.doctree +0 -0
  9. amps-python-client-5.3.4.2/docs/command-reference/doctrees/chapters/query-subscribe.doctree +0 -0
  10. amps-python-client-5.3.4.2/docs/command-reference/doctrees/chapters/removing.doctree +0 -0
  11. amps-python-client-5.3.4.2/docs/command-reference/doctrees/chapters/utilities.doctree +0 -0
  12. amps-python-client-5.3.4.2/docs/command-reference/doctrees/environment.pickle +0 -0
  13. amps-python-client-5.3.4.2/docs/command-reference/doctrees/index.doctree +0 -0
  14. amps-python-client-5.3.4.2/docs/command-reference/html/.buildinfo +4 -0
  15. amps-python-client-5.3.4.2/docs/command-reference/html/_sources/chapters/ack-messages.rst.txt +8 -0
  16. amps-python-client-5.3.4.2/docs/command-reference/html/_sources/chapters/content-messages.rst.txt +8 -0
  17. amps-python-client-5.3.4.2/docs/command-reference/html/_sources/chapters/intro.rst.txt +8 -0
  18. amps-python-client-5.3.4.2/docs/command-reference/html/_sources/chapters/logon.rst.txt +8 -0
  19. amps-python-client-5.3.4.2/docs/command-reference/html/_sources/chapters/protocol-reference.rst.txt +8 -0
  20. amps-python-client-5.3.4.2/docs/command-reference/html/_sources/chapters/publishing.rst.txt +8 -0
  21. amps-python-client-5.3.4.2/docs/command-reference/html/_sources/chapters/query-delimiters.rst.txt +8 -0
  22. amps-python-client-5.3.4.2/docs/command-reference/html/_sources/chapters/query-subscribe.rst.txt +8 -0
  23. amps-python-client-5.3.4.2/docs/command-reference/html/_sources/chapters/removing.rst.txt +8 -0
  24. amps-python-client-5.3.4.2/docs/command-reference/html/_sources/chapters/utilities.rst.txt +8 -0
  25. amps-python-client-5.3.4.2/docs/command-reference/html/_sources/index.rst.txt +36 -0
  26. amps-python-client-5.3.4.2/docs/command-reference/html/_static/custom.css +161 -0
  27. amps-python-client-5.3.4.2/docs/command-reference/html/chapters/ack-messages.html +95 -0
  28. amps-python-client-5.3.4.2/docs/command-reference/html/chapters/content-messages.html +95 -0
  29. amps-python-client-5.3.4.2/docs/command-reference/html/chapters/intro.html +95 -0
  30. amps-python-client-5.3.4.2/docs/command-reference/html/chapters/logon.html +95 -0
  31. amps-python-client-5.3.4.2/docs/command-reference/html/chapters/protocol-reference.html +93 -0
  32. amps-python-client-5.3.4.2/docs/command-reference/html/chapters/publishing.html +95 -0
  33. amps-python-client-5.3.4.2/docs/command-reference/html/chapters/query-delimiters.html +95 -0
  34. amps-python-client-5.3.4.2/docs/command-reference/html/chapters/query-subscribe.html +95 -0
  35. amps-python-client-5.3.4.2/docs/command-reference/html/chapters/removing.html +95 -0
  36. amps-python-client-5.3.4.2/docs/command-reference/html/chapters/utilities.html +95 -0
  37. amps-python-client-5.3.4.2/docs/command-reference/html/genindex.html +97 -0
  38. amps-python-client-5.3.4.2/docs/command-reference/html/index.html +98 -0
  39. amps-python-client-5.3.4.2/docs/command-reference/html/objects.inv +6 -0
  40. amps-python-client-5.3.4.2/docs/command-reference/html/search.html +107 -0
  41. amps-python-client-5.3.4.2/docs/command-reference/html/searchindex.js +1 -0
  42. amps-python-client-5.3.4.2/docs/html/.buildinfo +4 -0
  43. amps-python-client-5.3.4.2/docs/html/code.html +6616 -0
  44. amps-python-client-5.3.4.2/docs/html/genindex.html +1363 -0
  45. amps-python-client-5.3.4.2/docs/html/index.html +131 -0
  46. amps-python-client-5.3.4.2/docs/html/objects.inv +0 -0
  47. amps-python-client-5.3.4.2/docs/html/py-modindex.html +111 -0
  48. amps-python-client-5.3.4.2/docs/html/search.html +107 -0
  49. amps-python-client-5.3.4.2/docs/html/searchindex.js +1 -0
  50. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/advanced-topics.doctree +0 -0
  51. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/cpp-compiler-list.doctree +0 -0
  52. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/cpp-feature-table.doctree +0 -0
  53. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/creating-commands.doctree +0 -0
  54. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/deltas.doctree +0 -0
  55. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/error-handling.doctree +0 -0
  56. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/exceptions.doctree +0 -0
  57. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/first-program.doctree +0 -0
  58. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/high-availability.doctree +0 -0
  59. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/installing.doctree +0 -0
  60. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/introduction.doctree +0 -0
  61. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/moving-from-python-lite.doctree +0 -0
  62. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/performance-tips.doctree +0 -0
  63. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/queues.doctree +0 -0
  64. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/sow.doctree +0 -0
  65. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/subscriptions.doctree +0 -0
  66. amps-python-client-5.3.4.2/docs/python/doctrees/chapters/utilities.doctree +0 -0
  67. amps-python-client-5.3.4.2/docs/python/doctrees/environment.pickle +0 -0
  68. amps-python-client-5.3.4.2/docs/python/doctrees/index.doctree +0 -0
  69. amps-python-client-5.3.4.2/docs/python/html/.buildinfo +4 -0
  70. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/advanced-topics.rst.txt +398 -0
  71. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/cpp-feature-table.rst.txt +26 -0
  72. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/creating-commands.rst.txt +159 -0
  73. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/deltas.rst.txt +79 -0
  74. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/error-handling.rst.txt +481 -0
  75. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/exceptions.rst.txt +123 -0
  76. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/first-program.rst.txt +168 -0
  77. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/high-availability.rst.txt +879 -0
  78. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/installing.rst.txt +184 -0
  79. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/introduction.rst.txt +50 -0
  80. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/moving-from-python-lite.rst.txt +32 -0
  81. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/performance-tips.rst.txt +432 -0
  82. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/queues.rst.txt +282 -0
  83. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/sow.rst.txt +294 -0
  84. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/subscriptions.rst.txt +374 -0
  85. amps-python-client-5.3.4.2/docs/python/html/_sources/chapters/utilities.rst.txt +214 -0
  86. amps-python-client-5.3.4.2/docs/python/html/_static/custom.css +161 -0
  87. amps-python-client-5.3.4.2/docs/python/html/chapters/advanced-topics.html +447 -0
  88. amps-python-client-5.3.4.2/docs/python/html/chapters/cpp-compiler-list.html +92 -0
  89. amps-python-client-5.3.4.2/docs/python/html/chapters/cpp-feature-table.html +156 -0
  90. amps-python-client-5.3.4.2/docs/python/html/chapters/creating-commands.html +2882 -0
  91. amps-python-client-5.3.4.2/docs/python/html/chapters/deltas.html +169 -0
  92. amps-python-client-5.3.4.2/docs/python/html/chapters/error-handling.html +745 -0
  93. amps-python-client-5.3.4.2/docs/python/html/chapters/exceptions.html +266 -0
  94. amps-python-client-5.3.4.2/docs/python/html/chapters/first-program.html +526 -0
  95. amps-python-client-5.3.4.2/docs/python/html/chapters/high-availability.html +1017 -0
  96. amps-python-client-5.3.4.2/docs/python/html/chapters/installing.html +264 -0
  97. amps-python-client-5.3.4.2/docs/python/html/chapters/introduction.html +245 -0
  98. amps-python-client-5.3.4.2/docs/python/html/chapters/moving-from-python-lite.html +118 -0
  99. amps-python-client-5.3.4.2/docs/python/html/chapters/performance-tips.html +499 -0
  100. amps-python-client-5.3.4.2/docs/python/html/chapters/queues.html +352 -0
  101. amps-python-client-5.3.4.2/docs/python/html/chapters/sow.html +383 -0
  102. amps-python-client-5.3.4.2/docs/python/html/chapters/subscriptions.html +535 -0
  103. amps-python-client-5.3.4.2/docs/python/html/chapters/utilities.html +302 -0
  104. amps-python-client-5.3.4.2/docs/python/html/genindex.html +351 -0
  105. amps-python-client-5.3.4.2/docs/python/html/index.html +382 -0
  106. amps-python-client-5.3.4.2/docs/python/html/objects.inv +0 -0
  107. amps-python-client-5.3.4.2/docs/python/html/search.html +107 -0
  108. amps-python-client-5.3.4.2/docs/python/html/searchindex.js +1 -0
  109. amps-python-client-5.3.4.2/docs/python-quickstart/doctrees/chapters/crankitup.doctree +0 -0
  110. amps-python-client-5.3.4.2/docs/python-quickstart/doctrees/chapters/equipment.doctree +0 -0
  111. amps-python-client-5.3.4.2/docs/python-quickstart/doctrees/environment.pickle +0 -0
  112. amps-python-client-5.3.4.2/docs/python-quickstart/doctrees/index.doctree +0 -0
  113. amps-python-client-5.3.4.2/docs/python-quickstart/html/.buildinfo +4 -0
  114. amps-python-client-5.3.4.2/docs/python-quickstart/html/_static/custom.css +161 -0
  115. amps-python-client-5.3.4.2/docs/python-quickstart/html/chapters/crankitup.html +271 -0
  116. amps-python-client-5.3.4.2/docs/python-quickstart/html/chapters/equipment.html +105 -0
  117. amps-python-client-5.3.4.2/docs/python-quickstart/html/genindex.html +97 -0
  118. amps-python-client-5.3.4.2/docs/python-quickstart/html/index.html +381 -0
  119. amps-python-client-5.3.4.2/docs/python-quickstart/html/objects.inv +0 -0
  120. amps-python-client-5.3.4.2/docs/python-quickstart/html/search.html +107 -0
  121. amps-python-client-5.3.4.2/docs/python-quickstart/html/searchindex.js +1 -0
  122. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/acks.doctree +0 -0
  123. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/actions.doctree +0 -0
  124. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/amps-statistics.doctree +0 -0
  125. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/amps_expressions.doctree +0 -0
  126. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/amps_functions.doctree +0 -0
  127. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/auxiliary_modules.doctree +0 -0
  128. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/config-file-shortcuts.doctree +0 -0
  129. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/conflated_topics.doctree +0 -0
  130. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/constructing-fields.doctree +0 -0
  131. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/daemon.doctree +0 -0
  132. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/delta.doctree +0 -0
  133. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/distribution.doctree +0 -0
  134. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/enrichment.doctree +0 -0
  135. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/events.doctree +0 -0
  136. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/file_format_versions.doctree +0 -0
  137. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/glossary.doctree +0 -0
  138. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/ha.doctree +0 -0
  139. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/installing_and_starting.doctree +0 -0
  140. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/intro.doctree +0 -0
  141. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/logging.doctree +0 -0
  142. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/messageTypes.doctree +0 -0
  143. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/monitoring.doctree +0 -0
  144. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/oof.doctree +0 -0
  145. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/operation.doctree +0 -0
  146. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/pub_sub.doctree +0 -0
  147. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/queues.doctree +0 -0
  148. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/replication.doctree +0 -0
  149. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/securing.doctree +0 -0
  150. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/sow.doctree +0 -0
  151. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/sow_queries.doctree +0 -0
  152. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/spark.doctree +0 -0
  153. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/transports.doctree +0 -0
  154. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/troubleshooting.doctree +0 -0
  155. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/txlog.doctree +0 -0
  156. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/usecases.doctree +0 -0
  157. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/utilities.doctree +0 -0
  158. amps-python-client-5.3.4.2/docs/user-guide/doctrees/chapters/views.doctree +0 -0
  159. amps-python-client-5.3.4.2/docs/user-guide/doctrees/environment.pickle +0 -0
  160. amps-python-client-5.3.4.2/docs/user-guide/doctrees/index.doctree +0 -0
  161. amps-python-client-5.3.4.2/docs/user-guide/html/.buildinfo +4 -0
  162. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/acks.rst.txt +8 -0
  163. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/actions.rst.txt +8 -0
  164. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/amps-statistics.rst.txt +8 -0
  165. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/amps_expressions.rst.txt +8 -0
  166. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/amps_functions.rst.txt +8 -0
  167. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/auxiliary_modules.rst.txt +8 -0
  168. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/config-file-shortcuts.rst.txt +8 -0
  169. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/conflated_topics.rst.txt +8 -0
  170. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/constructing-fields.rst.txt +8 -0
  171. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/daemon.rst.txt +8 -0
  172. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/delta.rst.txt +8 -0
  173. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/distribution.rst.txt +8 -0
  174. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/enrichment.rst.txt +8 -0
  175. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/events.rst.txt +8 -0
  176. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/file_format_versions.rst.txt +8 -0
  177. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/glossary.rst.txt +8 -0
  178. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/ha.rst.txt +8 -0
  179. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/installing_and_starting.rst.txt +8 -0
  180. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/intro.rst.txt +8 -0
  181. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/logging.rst.txt +8 -0
  182. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/messageTypes.rst.txt +8 -0
  183. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/monitoring.rst.txt +8 -0
  184. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/oof.rst.txt +8 -0
  185. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/operation.rst.txt +8 -0
  186. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/pub_sub.rst.txt +8 -0
  187. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/queues.rst.txt +8 -0
  188. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/replication.rst.txt +8 -0
  189. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/securing.rst.txt +8 -0
  190. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/sow.rst.txt +8 -0
  191. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/sow_queries.rst.txt +8 -0
  192. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/transports.rst.txt +8 -0
  193. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/troubleshooting.rst.txt +8 -0
  194. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/txlog.rst.txt +8 -0
  195. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/usecases.rst.txt +8 -0
  196. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/utilities.rst.txt +8 -0
  197. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/chapters/views.rst.txt +8 -0
  198. amps-python-client-5.3.4.2/docs/user-guide/html/_sources/index.rst.txt +62 -0
  199. amps-python-client-5.3.4.2/docs/user-guide/html/_static/custom.css +161 -0
  200. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/acks.html +94 -0
  201. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/actions.html +94 -0
  202. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/amps-statistics.html +94 -0
  203. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/amps_expressions.html +94 -0
  204. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/amps_functions.html +94 -0
  205. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/auxiliary_modules.html +94 -0
  206. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/config-file-shortcuts.html +94 -0
  207. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/conflated_topics.html +94 -0
  208. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/constructing-fields.html +94 -0
  209. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/daemon.html +94 -0
  210. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/delta.html +94 -0
  211. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/distribution.html +94 -0
  212. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/enrichment.html +94 -0
  213. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/events.html +94 -0
  214. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/file_format_versions.html +94 -0
  215. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/glossary.html +92 -0
  216. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/ha.html +94 -0
  217. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/installing_and_starting.html +94 -0
  218. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/intro.html +94 -0
  219. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/logging.html +94 -0
  220. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/messageTypes.html +94 -0
  221. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/monitoring.html +94 -0
  222. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/oof.html +94 -0
  223. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/operation.html +94 -0
  224. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/pub_sub.html +94 -0
  225. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/queues.html +94 -0
  226. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/replication.html +94 -0
  227. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/securing.html +94 -0
  228. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/sow.html +94 -0
  229. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/sow_queries.html +94 -0
  230. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/spark.html +819 -0
  231. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/transports.html +94 -0
  232. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/troubleshooting.html +94 -0
  233. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/txlog.html +94 -0
  234. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/usecases.html +94 -0
  235. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/utilities.html +94 -0
  236. amps-python-client-5.3.4.2/docs/user-guide/html/chapters/views.html +94 -0
  237. amps-python-client-5.3.4.2/docs/user-guide/html/genindex.html +133 -0
  238. amps-python-client-5.3.4.2/docs/user-guide/html/index.html +96 -0
  239. amps-python-client-5.3.4.2/docs/user-guide/html/objects.inv +0 -0
  240. amps-python-client-5.3.4.2/docs/user-guide/html/search.html +106 -0
  241. amps-python-client-5.3.4.2/docs/user-guide/html/searchindex.js +1 -0
  242. amps-python-client-5.3.4.2/include/ampspy_bookmarkstore.hpp +63 -0
  243. amps-python-client-5.3.4.2/include/ampspy_compat.h +63 -0
  244. amps-python-client-5.3.4.2/include/ampspy_defs.hpp +181 -0
  245. amps-python-client-5.3.4.2/include/ampspy_recoverypointadapter.hpp +52 -0
  246. amps-python-client-5.3.4.2/include/ampspy_shims.hpp +113 -0
  247. amps-python-client-5.3.4.2/include/ampspy_type_object.hpp +242 -0
  248. amps-python-client-5.3.4.2/include/ampspy_types.hpp +1139 -0
  249. amps-python-client-5.3.4.2/include/ampspyver.h +30 -0
  250. amps-python-client-5.3.4.2/index.html +66 -0
  251. amps-python-client-5.3.4.2/samples/AMPSConsolePublisher.py +59 -0
  252. amps-python-client-5.3.4.2/samples/AMPSConsoleSubscriber.py +63 -0
  253. amps-python-client-5.3.4.2/samples/AMPSFIXBuilderPublisher.py +71 -0
  254. amps-python-client-5.3.4.2/samples/AMPSFIXShredderSubscriber.py +69 -0
  255. amps-python-client-5.3.4.2/samples/AMPSNVFIXBuilderPublisher.py +71 -0
  256. amps-python-client-5.3.4.2/samples/AMPSNVFIXShredderSubscriber.py +67 -0
  257. amps-python-client-5.3.4.2/samples/AMPSPublishForReplay.py +81 -0
  258. amps-python-client-5.3.4.2/samples/AMPSQueueConsumer.py +69 -0
  259. amps-python-client-5.3.4.2/samples/AMPSQueuePublisher.py +59 -0
  260. amps-python-client-5.3.4.2/samples/AMPSSOWConsolePublisher.py +67 -0
  261. amps-python-client-5.3.4.2/samples/AMPSSOWConsoleSubscriber.py +77 -0
  262. amps-python-client-5.3.4.2/samples/AMPSSOWandSubscribeConsoleSubscriber.py +79 -0
  263. amps-python-client-5.3.4.2/samples/AMPSSOWandSubscribeWithOOF.py +108 -0
  264. amps-python-client-5.3.4.2/samples/AMPSSubscribeForReplay.py +128 -0
  265. amps-python-client-5.3.4.2/samples/AMPSUpdateForOOF.py +123 -0
  266. amps-python-client-5.3.4.2/samples/CompositeMessagePublisher.py +84 -0
  267. amps-python-client-5.3.4.2/samples/CompositeMessageSubscriber.py +87 -0
  268. amps-python-client-5.3.4.2/samples/RandomServerChooser.py +66 -0
  269. amps-python-client-5.3.4.2/samples/sample.xml +335 -0
  270. amps-python-client-5.3.4.2/setup.py +210 -0
  271. amps-python-client-5.3.4.2/setup_amps.py +94 -0
  272. amps-python-client-5.3.4.2/src/ampspy_shims.cpp +214 -0
  273. amps-python-client-5.3.4.2/src/ampspy_type_object.cpp +495 -0
  274. amps-python-client-5.3.4.2/src/authenticator.cpp +128 -0
  275. amps-python-client-5.3.4.2/src/bookmarkstore.cpp +246 -0
  276. amps-python-client-5.3.4.2/src/client.cpp +2648 -0
  277. amps-python-client-5.3.4.2/src/client_docs.h +956 -0
  278. amps-python-client-5.3.4.2/src/cmessagehandler.cpp +161 -0
  279. amps-python-client-5.3.4.2/src/command.cpp +164 -0
  280. amps-python-client-5.3.4.2/src/command_docs.h +269 -0
  281. amps-python-client-5.3.4.2/src/compositemessagebuilder.cpp +113 -0
  282. amps-python-client-5.3.4.2/src/compositemessageparser.cpp +151 -0
  283. amps-python-client-5.3.4.2/src/conflatingrecoverypointadapter.cpp +197 -0
  284. amps-python-client-5.3.4.2/src/cpp/include/amps/BlockPublishStore.hpp +2053 -0
  285. amps-python-client-5.3.4.2/src/cpp/include/amps/BlockStore.hpp +677 -0
  286. amps-python-client-5.3.4.2/src/cpp/include/amps/BookmarkStore.hpp +542 -0
  287. amps-python-client-5.3.4.2/src/cpp/include/amps/Buffer.hpp +214 -0
  288. amps-python-client-5.3.4.2/src/cpp/include/amps/CompositeMessageBuilder.hpp +174 -0
  289. amps-python-client-5.3.4.2/src/cpp/include/amps/CompositeMessageParser.hpp +151 -0
  290. amps-python-client-5.3.4.2/src/cpp/include/amps/DefaultServerChooser.hpp +162 -0
  291. amps-python-client-5.3.4.2/src/cpp/include/amps/Field.hpp +719 -0
  292. amps-python-client-5.3.4.2/src/cpp/include/amps/HAClient.hpp +370 -0
  293. amps-python-client-5.3.4.2/src/cpp/include/amps/HAClientImpl.hpp +460 -0
  294. amps-python-client-5.3.4.2/src/cpp/include/amps/HybridPublishStore.hpp +481 -0
  295. amps-python-client-5.3.4.2/src/cpp/include/amps/LoggedBookmarkStore.hpp +1256 -0
  296. amps-python-client-5.3.4.2/src/cpp/include/amps/MMapBookmarkStore.hpp +1283 -0
  297. amps-python-client-5.3.4.2/src/cpp/include/amps/MMapStoreBuffer.hpp +290 -0
  298. amps-python-client-5.3.4.2/src/cpp/include/amps/MemoryBookmarkStore.hpp +1628 -0
  299. amps-python-client-5.3.4.2/src/cpp/include/amps/MemoryPublishStore.hpp +66 -0
  300. amps-python-client-5.3.4.2/src/cpp/include/amps/MemoryStoreBuffer.hpp +244 -0
  301. amps-python-client-5.3.4.2/src/cpp/include/amps/MemorySubscriptionManager.hpp +850 -0
  302. amps-python-client-5.3.4.2/src/cpp/include/amps/Message.hpp +1819 -0
  303. amps-python-client-5.3.4.2/src/cpp/include/amps/MessageRouter.hpp +647 -0
  304. amps-python-client-5.3.4.2/src/cpp/include/amps/PublishStore.hpp +158 -0
  305. amps-python-client-5.3.4.2/src/cpp/include/amps/ReconnectDelayStrategy.hpp +106 -0
  306. amps-python-client-5.3.4.2/src/cpp/include/amps/ReconnectDelayStrategyImpl.hpp +317 -0
  307. amps-python-client-5.3.4.2/src/cpp/include/amps/RecoveryPoint.hpp +323 -0
  308. amps-python-client-5.3.4.2/src/cpp/include/amps/RecoveryPointAdapter.hpp +501 -0
  309. amps-python-client-5.3.4.2/src/cpp/include/amps/RingBookmarkStore.hpp +669 -0
  310. amps-python-client-5.3.4.2/src/cpp/include/amps/SOWRecoveryPointAdapter.hpp +494 -0
  311. amps-python-client-5.3.4.2/src/cpp/include/amps/ServerChooser.hpp +145 -0
  312. amps-python-client-5.3.4.2/src/cpp/include/amps/ServerChooserImpl.hpp +95 -0
  313. amps-python-client-5.3.4.2/src/cpp/include/amps/amps.h +803 -0
  314. amps-python-client-5.3.4.2/src/cpp/include/amps/amps_impl.h +208 -0
  315. amps-python-client-5.3.4.2/src/cpp/include/amps/amps_ssl.h +78 -0
  316. amps-python-client-5.3.4.2/src/cpp/include/amps/ampscrc.hpp +210 -0
  317. amps-python-client-5.3.4.2/src/cpp/include/amps/ampsplusplus.hpp +8850 -0
  318. amps-python-client-5.3.4.2/src/cpp/include/amps/ampsuri.h +84 -0
  319. amps-python-client-5.3.4.2/src/cpp/include/amps/ampsver.h +41 -0
  320. amps-python-client-5.3.4.2/src/cpp/include/amps/ampsver.h.in +41 -0
  321. amps-python-client-5.3.4.2/src/cpp/include/amps/constants.hpp +194 -0
  322. amps-python-client-5.3.4.2/src/cpp/include/amps/util.hpp +1722 -0
  323. amps-python-client-5.3.4.2/src/cpp/src/amps_protocol.c +693 -0
  324. amps-python-client-5.3.4.2/src/cpp/src/amps_ssl.c +489 -0
  325. amps-python-client-5.3.4.2/src/cpp/src/atfork.c +451 -0
  326. amps-python-client-5.3.4.2/src/cpp/src/client.c +498 -0
  327. amps-python-client-5.3.4.2/src/cpp/src/message.c +837 -0
  328. amps-python-client-5.3.4.2/src/cpp/src/message_generated.h +611 -0
  329. amps-python-client-5.3.4.2/src/cpp/src/tcp.c +1517 -0
  330. amps-python-client-5.3.4.2/src/cpp/src/tcps.c +1885 -0
  331. amps-python-client-5.3.4.2/src/cpp/src/transports.c +129 -0
  332. amps-python-client-5.3.4.2/src/cpp/src/unix.c +1002 -0
  333. amps-python-client-5.3.4.2/src/cpp/src/uri.c +301 -0
  334. amps-python-client-5.3.4.2/src/exponentialdelaystrategy.cpp +137 -0
  335. amps-python-client-5.3.4.2/src/failedwritehandler.cpp +116 -0
  336. amps-python-client-5.3.4.2/src/fixbuilder.cpp +146 -0
  337. amps-python-client-5.3.4.2/src/fixeddelaystrategy.cpp +114 -0
  338. amps-python-client-5.3.4.2/src/fixshredder.cpp +105 -0
  339. amps-python-client-5.3.4.2/src/fixshredder_docs.h +38 -0
  340. amps-python-client-5.3.4.2/src/haclient.cpp +691 -0
  341. amps-python-client-5.3.4.2/src/haclient_docs.h +186 -0
  342. amps-python-client-5.3.4.2/src/hybridpublishstore.cpp +137 -0
  343. amps-python-client-5.3.4.2/src/hybridpublishstore_docs.h +31 -0
  344. amps-python-client-5.3.4.2/src/memorybookmarkstore.cpp +373 -0
  345. amps-python-client-5.3.4.2/src/memorybookmarkstore_docs.h +39 -0
  346. amps-python-client-5.3.4.2/src/memorypublishstore.cpp +160 -0
  347. amps-python-client-5.3.4.2/src/memorypublishstore_docs.h +32 -0
  348. amps-python-client-5.3.4.2/src/message.cpp +765 -0
  349. amps-python-client-5.3.4.2/src/message_docs.h +306 -0
  350. amps-python-client-5.3.4.2/src/messagestream.cpp +630 -0
  351. amps-python-client-5.3.4.2/src/messagestream_docs.h +45 -0
  352. amps-python-client-5.3.4.2/src/mmapbookmarkstore.cpp +422 -0
  353. amps-python-client-5.3.4.2/src/nvfixbuilder.cpp +160 -0
  354. amps-python-client-5.3.4.2/src/nvfixbuilder_docs.h +35 -0
  355. amps-python-client-5.3.4.2/src/nvfixshredder.cpp +99 -0
  356. amps-python-client-5.3.4.2/src/nvfixshredder_docs.h +43 -0
  357. amps-python-client-5.3.4.2/src/publishstore.cpp +183 -0
  358. amps-python-client-5.3.4.2/src/raw_wrapper.cpp +765 -0
  359. amps-python-client-5.3.4.2/src/reason.cpp +71 -0
  360. amps-python-client-5.3.4.2/src/recoverypoint.cpp +135 -0
  361. amps-python-client-5.3.4.2/src/recoverypointadapter.cpp +171 -0
  362. amps-python-client-5.3.4.2/src/ringbookmarkstore.cpp +360 -0
  363. amps-python-client-5.3.4.2/src/serverchooser.cpp +245 -0
  364. amps-python-client-5.3.4.2/src/serverchooser_docs.h +41 -0
  365. amps-python-client-5.3.4.2/src/sowrecoverypointadapter.cpp +248 -0
  366. amps-python-client-5.3.4.2/src/store.cpp +62 -0
  367. amps-python-client-5.3.4.2/src/versioninfo.cpp +175 -0
  368. amps-python-client-5.3.4.1/PKG-INFO +0 -112
  369. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/ack-messages.doctree +0 -0
  370. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/content-messages.doctree +0 -0
  371. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/intro.doctree +0 -0
  372. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/logon.doctree +0 -0
  373. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/protocol-reference.doctree +0 -0
  374. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/publishing.doctree +0 -0
  375. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/query-delimiters.doctree +0 -0
  376. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/query-subscribe.doctree +0 -0
  377. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/removing.doctree +0 -0
  378. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/utilities.doctree +0 -0
  379. amps-python-client-5.3.4.1/docs/command-reference/doctrees/environment.pickle +0 -0
  380. amps-python-client-5.3.4.1/docs/command-reference/doctrees/index.doctree +0 -0
  381. amps-python-client-5.3.4.1/docs/command-reference/html/.buildinfo +0 -4
  382. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/ack-messages.rst.txt +0 -32
  383. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/content-messages.rst.txt +0 -27
  384. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/intro.rst.txt +0 -43
  385. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/logon.rst.txt +0 -231
  386. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/protocol-reference.rst.txt +0 -1474
  387. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/publishing.rst.txt +0 -25
  388. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/query-delimiters.rst.txt +0 -12
  389. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/query-subscribe.rst.txt +0 -23
  390. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/removing.rst.txt +0 -6
  391. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/utilities.rst.txt +0 -13
  392. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/index.rst.txt +0 -56
  393. amps-python-client-5.3.4.1/docs/command-reference/html/_static/custom.css +0 -192
  394. amps-python-client-5.3.4.1/docs/command-reference/html/_static/custom.css.backup +0 -161
  395. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/ack-messages.html +0 -417
  396. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/content-messages.html +0 -417
  397. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/intro.html +0 -126
  398. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/logon.html +0 -295
  399. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/protocol-reference.html +0 -1190
  400. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/publishing.html +0 -436
  401. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/query-delimiters.html +0 -173
  402. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/query-subscribe.html +0 -2123
  403. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/removing.html +0 -299
  404. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/utilities.html +0 -287
  405. amps-python-client-5.3.4.1/docs/command-reference/html/genindex.html +0 -97
  406. amps-python-client-5.3.4.1/docs/command-reference/html/index.html +0 -138
  407. amps-python-client-5.3.4.1/docs/command-reference/html/objects.inv +0 -0
  408. amps-python-client-5.3.4.1/docs/command-reference/html/search.html +0 -107
  409. amps-python-client-5.3.4.1/docs/command-reference/html/searchindex.js +0 -1
  410. amps-python-client-5.3.4.1/docs/html/.buildinfo +0 -4
  411. amps-python-client-5.3.4.1/docs/html/code.html +0 -6503
  412. amps-python-client-5.3.4.1/docs/html/genindex.html +0 -1361
  413. amps-python-client-5.3.4.1/docs/html/index.html +0 -131
  414. amps-python-client-5.3.4.1/docs/html/objects.inv +0 -0
  415. amps-python-client-5.3.4.1/docs/html/py-modindex.html +0 -111
  416. amps-python-client-5.3.4.1/docs/html/search.html +0 -107
  417. amps-python-client-5.3.4.1/docs/html/searchindex.js +0 -1
  418. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/advanced-topics.doctree +0 -0
  419. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/cpp-compiler-list.doctree +0 -0
  420. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/cpp-feature-table.doctree +0 -0
  421. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/creating-commands.doctree +0 -0
  422. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/deltas.doctree +0 -0
  423. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/error-handling.doctree +0 -0
  424. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/exceptions.doctree +0 -0
  425. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/first-program.doctree +0 -0
  426. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/high-availability.doctree +0 -0
  427. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/installing.doctree +0 -0
  428. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/introduction.doctree +0 -0
  429. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/moving-from-python-lite.doctree +0 -0
  430. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/performance-tips.doctree +0 -0
  431. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/queues.doctree +0 -0
  432. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/sow.doctree +0 -0
  433. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/subscriptions.doctree +0 -0
  434. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/utilities.doctree +0 -0
  435. amps-python-client-5.3.4.1/docs/python/doctrees/environment.pickle +0 -0
  436. amps-python-client-5.3.4.1/docs/python/doctrees/index.doctree +0 -0
  437. amps-python-client-5.3.4.1/docs/python/html/.buildinfo +0 -4
  438. amps-python-client-5.3.4.1/docs/python/html/_images/caution.svg +0 -25
  439. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/advanced-topics.rst.txt +0 -398
  440. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/cpp-feature-table.rst.txt +0 -26
  441. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/creating-commands.rst.txt +0 -159
  442. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/deltas.rst.txt +0 -79
  443. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/error-handling.rst.txt +0 -482
  444. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/exceptions.rst.txt +0 -128
  445. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/first-program.rst.txt +0 -142
  446. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/high-availability.rst.txt +0 -876
  447. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/installing.rst.txt +0 -184
  448. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/introduction.rst.txt +0 -50
  449. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/moving-from-python-lite.rst.txt +0 -32
  450. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/performance-tips.rst.txt +0 -434
  451. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/queues.rst.txt +0 -282
  452. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/sow.rst.txt +0 -292
  453. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/subscriptions.rst.txt +0 -374
  454. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/utilities.rst.txt +0 -214
  455. amps-python-client-5.3.4.1/docs/python/html/_static/custom.css +0 -192
  456. amps-python-client-5.3.4.1/docs/python/html/_static/custom.css.backup +0 -161
  457. amps-python-client-5.3.4.1/docs/python/html/chapters/advanced-topics.html +0 -447
  458. amps-python-client-5.3.4.1/docs/python/html/chapters/cpp-compiler-list.html +0 -92
  459. amps-python-client-5.3.4.1/docs/python/html/chapters/cpp-feature-table.html +0 -156
  460. amps-python-client-5.3.4.1/docs/python/html/chapters/creating-commands.html +0 -2837
  461. amps-python-client-5.3.4.1/docs/python/html/chapters/deltas.html +0 -169
  462. amps-python-client-5.3.4.1/docs/python/html/chapters/error-handling.html +0 -746
  463. amps-python-client-5.3.4.1/docs/python/html/chapters/exceptions.html +0 -272
  464. amps-python-client-5.3.4.1/docs/python/html/chapters/first-program.html +0 -499
  465. amps-python-client-5.3.4.1/docs/python/html/chapters/high-availability.html +0 -1014
  466. amps-python-client-5.3.4.1/docs/python/html/chapters/installing.html +0 -264
  467. amps-python-client-5.3.4.1/docs/python/html/chapters/introduction.html +0 -245
  468. amps-python-client-5.3.4.1/docs/python/html/chapters/moving-from-python-lite.html +0 -118
  469. amps-python-client-5.3.4.1/docs/python/html/chapters/performance-tips.html +0 -499
  470. amps-python-client-5.3.4.1/docs/python/html/chapters/queues.html +0 -352
  471. amps-python-client-5.3.4.1/docs/python/html/chapters/sow.html +0 -381
  472. amps-python-client-5.3.4.1/docs/python/html/chapters/subscriptions.html +0 -535
  473. amps-python-client-5.3.4.1/docs/python/html/chapters/utilities.html +0 -302
  474. amps-python-client-5.3.4.1/docs/python/html/genindex.html +0 -351
  475. amps-python-client-5.3.4.1/docs/python/html/index.html +0 -380
  476. amps-python-client-5.3.4.1/docs/python/html/objects.inv +0 -0
  477. amps-python-client-5.3.4.1/docs/python/html/search.html +0 -107
  478. amps-python-client-5.3.4.1/docs/python/html/searchindex.js +0 -1
  479. amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/chapters/crankitup.doctree +0 -0
  480. amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/chapters/equipment.doctree +0 -0
  481. amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/environment.pickle +0 -0
  482. amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/index.doctree +0 -0
  483. amps-python-client-5.3.4.1/docs/python-quickstart/html/.buildinfo +0 -4
  484. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/custom.css +0 -192
  485. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/custom.css.backup +0 -161
  486. amps-python-client-5.3.4.1/docs/python-quickstart/html/chapters/crankitup.html +0 -271
  487. amps-python-client-5.3.4.1/docs/python-quickstart/html/chapters/equipment.html +0 -105
  488. amps-python-client-5.3.4.1/docs/python-quickstart/html/genindex.html +0 -97
  489. amps-python-client-5.3.4.1/docs/python-quickstart/html/index.html +0 -382
  490. amps-python-client-5.3.4.1/docs/python-quickstart/html/objects.inv +0 -0
  491. amps-python-client-5.3.4.1/docs/python-quickstart/html/search.html +0 -107
  492. amps-python-client-5.3.4.1/docs/python-quickstart/html/searchindex.js +0 -1
  493. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/acks.doctree +0 -0
  494. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/actions.doctree +0 -0
  495. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/amps-statistics.doctree +0 -0
  496. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/amps_expressions.doctree +0 -0
  497. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/amps_functions.doctree +0 -0
  498. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/auxiliary_modules.doctree +0 -0
  499. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/config-file-shortcuts.doctree +0 -0
  500. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/conflated_topics.doctree +0 -0
  501. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/constructing-fields.doctree +0 -0
  502. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/daemon.doctree +0 -0
  503. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/delta.doctree +0 -0
  504. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/distribution.doctree +0 -0
  505. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/enrichment.doctree +0 -0
  506. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/events.doctree +0 -0
  507. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/file_format_versions.doctree +0 -0
  508. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/glossary.doctree +0 -0
  509. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/ha.doctree +0 -0
  510. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/installing_and_starting.doctree +0 -0
  511. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/intro.doctree +0 -0
  512. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/logging.doctree +0 -0
  513. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/messageTypes.doctree +0 -0
  514. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/monitoring.doctree +0 -0
  515. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/oof.doctree +0 -0
  516. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/operation.doctree +0 -0
  517. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/pub_sub.doctree +0 -0
  518. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/queues.doctree +0 -0
  519. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/replication.doctree +0 -0
  520. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/securing.doctree +0 -0
  521. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/sow.doctree +0 -0
  522. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/sow_queries.doctree +0 -0
  523. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/spark.doctree +0 -0
  524. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/transports.doctree +0 -0
  525. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/troubleshooting.doctree +0 -0
  526. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/txlog.doctree +0 -0
  527. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/usecases.doctree +0 -0
  528. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/utilities.doctree +0 -0
  529. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/views.doctree +0 -0
  530. amps-python-client-5.3.4.1/docs/user-guide/doctrees/environment.pickle +0 -0
  531. amps-python-client-5.3.4.1/docs/user-guide/doctrees/index.doctree +0 -0
  532. amps-python-client-5.3.4.1/docs/user-guide/html/.buildinfo +0 -4
  533. amps-python-client-5.3.4.1/docs/user-guide/html/_images/AMPS-Queues-Intro.svg +0 -1330
  534. amps-python-client-5.3.4.1/docs/user-guide/html/_images/GeoRepl.png +0 -0
  535. amps-python-client-5.3.4.1/docs/user-guide/html/_images/HA_async_ack.png +0 -0
  536. amps-python-client-5.3.4.1/docs/user-guide/html/_images/HA_sync_ack.png +0 -0
  537. amps-python-client-5.3.4.1/docs/user-guide/html/_images/Hot-Hot-Replication.png +0 -0
  538. amps-python-client-5.3.4.1/docs/user-guide/html/_images/MessageOrdering.svg +0 -235
  539. amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF5.png +0 -0
  540. amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF6.png +0 -0
  541. amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF7.png +0 -0
  542. amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF8.png +0 -0
  543. amps-python-client-5.3.4.1/docs/user-guide/html/_images/PubSub1.svg +0 -1
  544. amps-python-client-5.3.4.1/docs/user-guide/html/_images/PubSub2.svg +0 -1
  545. amps-python-client-5.3.4.1/docs/user-guide/html/_images/SOWAndSubscribeAndReplace.svg +0 -684
  546. amps-python-client-5.3.4.1/docs/user-guide/html/_images/SOWQuery1.svg +0 -402
  547. amps-python-client-5.3.4.1/docs/user-guide/html/_images/SOWQuery2.svg +0 -505
  548. amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig1.svg +0 -1
  549. amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig2.svg +0 -1
  550. amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig3.svg +0 -1
  551. amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig4.svg +0 -1
  552. amps-python-client-5.3.4.1/docs/user-guide/html/_images/caution.png +0 -0
  553. amps-python-client-5.3.4.1/docs/user-guide/html/_images/caution.svg +0 -25
  554. amps-python-client-5.3.4.1/docs/user-guide/html/_images/chicago_group.png +0 -0
  555. amps-python-client-5.3.4.1/docs/user-guide/html/_images/delta_original_messages.png +0 -0
  556. amps-python-client-5.3.4.1/docs/user-guide/html/_images/delta_update_message.png +0 -0
  557. amps-python-client-5.3.4.1/docs/user-guide/html/_images/important.png +0 -0
  558. amps-python-client-5.3.4.1/docs/user-guide/html/_images/important.svg +0 -25
  559. amps-python-client-5.3.4.1/docs/user-guide/html/_images/inline_view_conflation.svg +0 -1
  560. amps-python-client-5.3.4.1/docs/user-guide/html/_images/paginated_subs_pub.png +0 -0
  561. amps-python-client-5.3.4.1/docs/user-guide/html/_images/paginated_subs_sub.png +0 -0
  562. amps-python-client-5.3.4.1/docs/user-guide/html/_images/queue_usage_overview.svg +0 -627
  563. amps-python-client-5.3.4.1/docs/user-guide/html/_images/replication_hub.png +0 -0
  564. amps-python-client-5.3.4.1/docs/user-guide/html/_images/replication_scenario_with_ha.png +0 -0
  565. amps-python-client-5.3.4.1/docs/user-guide/html/_images/sow_overview_1.svg +0 -248
  566. amps-python-client-5.3.4.1/docs/user-guide/html/_images/sow_overview_2.svg +0 -183
  567. amps-python-client-5.3.4.1/docs/user-guide/html/_images/sow_update_sequence.svg +0 -1
  568. amps-python-client-5.3.4.1/docs/user-guide/html/_images/tip.png +0 -0
  569. amps-python-client-5.3.4.1/docs/user-guide/html/_images/tip.svg +0 -31
  570. amps-python-client-5.3.4.1/docs/user-guide/html/_images/warning.png +0 -0
  571. amps-python-client-5.3.4.1/docs/user-guide/html/_images/warning.svg +0 -23
  572. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/acks.rst.txt +0 -232
  573. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/actions.rst.txt +0 -111
  574. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/amps-statistics.rst.txt +0 -358
  575. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/amps_expressions.rst.txt +0 -83
  576. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/amps_functions.rst.txt +0 -11
  577. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/auxiliary_modules.rst.txt +0 -86
  578. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/config-file-shortcuts.rst.txt +0 -9
  579. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/conflated_topics.rst.txt +0 -111
  580. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/constructing-fields.rst.txt +0 -269
  581. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/daemon.rst.txt +0 -232
  582. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/delta.rst.txt +0 -556
  583. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/distribution.rst.txt +0 -186
  584. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/enrichment.rst.txt +0 -191
  585. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/events.rst.txt +0 -39
  586. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/file_format_versions.rst.txt +0 -203
  587. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/glossary.rst.txt +0 -101
  588. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/ha.rst.txt +0 -465
  589. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/installing_and_starting.rst.txt +0 -23
  590. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/intro.rst.txt +0 -116
  591. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/logging.rst.txt +0 -34
  592. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/messageTypes.rst.txt +0 -1398
  593. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/monitoring.rst.txt +0 -326
  594. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/oof.rst.txt +0 -312
  595. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/operation.rst.txt +0 -27
  596. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/pub_sub.rst.txt +0 -49
  597. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/queues.rst.txt +0 -1351
  598. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/replication.rst.txt +0 -1228
  599. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/securing.rst.txt +0 -657
  600. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/sow.rst.txt +0 -57
  601. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/sow_queries.rst.txt +0 -25
  602. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/transports.rst.txt +0 -291
  603. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/troubleshooting.rst.txt +0 -517
  604. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/txlog.rst.txt +0 -62
  605. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/usecases.rst.txt +0 -21
  606. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/utilities.rst.txt +0 -62
  607. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/views.rst.txt +0 -175
  608. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/index.rst.txt +0 -110
  609. amps-python-client-5.3.4.1/docs/user-guide/html/_static/custom.css +0 -192
  610. amps-python-client-5.3.4.1/docs/user-guide/html/_static/custom.css.backup +0 -161
  611. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/acks.html +0 -289
  612. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/actions.html +0 -3782
  613. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/amps-statistics.html +0 -439
  614. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/amps_expressions.html +0 -1552
  615. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/amps_functions.html +0 -1626
  616. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/auxiliary_modules.html +0 -2548
  617. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/config-file-shortcuts.html +0 -508
  618. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/conflated_topics.html +0 -328
  619. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/constructing-fields.html +0 -447
  620. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/daemon.html +0 -295
  621. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/delta.html +0 -609
  622. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/distribution.html +0 -246
  623. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/enrichment.html +0 -264
  624. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/events.html +0 -449
  625. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/file_format_versions.html +0 -229
  626. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/glossary.html +0 -215
  627. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/ha.html +0 -978
  628. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/installing_and_starting.html +0 -357
  629. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/intro.html +0 -572
  630. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/logging.html +0 -972
  631. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/messageTypes.html +0 -1280
  632. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/monitoring.html +0 -718
  633. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/oof.html +0 -341
  634. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/operation.html +0 -1515
  635. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/pub_sub.html +0 -934
  636. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/queues.html +0 -1767
  637. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/replication.html +0 -1777
  638. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/securing.html +0 -697
  639. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/sow.html +0 -1038
  640. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/sow_queries.html +0 -621
  641. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/spark.html +0 -819
  642. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/transports.html +0 -352
  643. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/troubleshooting.html +0 -530
  644. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/txlog.html +0 -1013
  645. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/usecases.html +0 -288
  646. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/utilities.html +0 -133
  647. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/views.html +0 -1120
  648. amps-python-client-5.3.4.1/docs/user-guide/html/genindex.html +0 -1261
  649. amps-python-client-5.3.4.1/docs/user-guide/html/index.html +0 -163
  650. amps-python-client-5.3.4.1/docs/user-guide/html/objects.inv +0 -0
  651. amps-python-client-5.3.4.1/docs/user-guide/html/search.html +0 -106
  652. amps-python-client-5.3.4.1/docs/user-guide/html/searchindex.js +0 -1
  653. amps-python-client-5.3.4.1/include/ampspy_bookmarkstore.hpp +0 -63
  654. amps-python-client-5.3.4.1/include/ampspy_compat.h +0 -63
  655. amps-python-client-5.3.4.1/include/ampspy_defs.hpp +0 -181
  656. amps-python-client-5.3.4.1/include/ampspy_recoverypointadapter.hpp +0 -52
  657. amps-python-client-5.3.4.1/include/ampspy_shims.hpp +0 -113
  658. amps-python-client-5.3.4.1/include/ampspy_type_object.hpp +0 -242
  659. amps-python-client-5.3.4.1/include/ampspy_types.hpp +0 -1139
  660. amps-python-client-5.3.4.1/include/ampspyver.h +0 -30
  661. amps-python-client-5.3.4.1/index.html +0 -66
  662. amps-python-client-5.3.4.1/samples/AMPSConsolePublisher.py +0 -59
  663. amps-python-client-5.3.4.1/samples/AMPSConsoleSubscriber.py +0 -63
  664. amps-python-client-5.3.4.1/samples/AMPSFIXBuilderPublisher.py +0 -71
  665. amps-python-client-5.3.4.1/samples/AMPSFIXShredderSubscriber.py +0 -69
  666. amps-python-client-5.3.4.1/samples/AMPSNVFIXBuilderPublisher.py +0 -71
  667. amps-python-client-5.3.4.1/samples/AMPSNVFIXShredderSubscriber.py +0 -67
  668. amps-python-client-5.3.4.1/samples/AMPSPublishForReplay.py +0 -81
  669. amps-python-client-5.3.4.1/samples/AMPSQueueConsumer.py +0 -69
  670. amps-python-client-5.3.4.1/samples/AMPSQueuePublisher.py +0 -59
  671. amps-python-client-5.3.4.1/samples/AMPSSOWConsolePublisher.py +0 -67
  672. amps-python-client-5.3.4.1/samples/AMPSSOWConsoleSubscriber.py +0 -77
  673. amps-python-client-5.3.4.1/samples/AMPSSOWandSubscribeConsoleSubscriber.py +0 -79
  674. amps-python-client-5.3.4.1/samples/AMPSSOWandSubscribeWithOOF.py +0 -108
  675. amps-python-client-5.3.4.1/samples/AMPSSubscribeForReplay.py +0 -128
  676. amps-python-client-5.3.4.1/samples/AMPSUpdateForOOF.py +0 -123
  677. amps-python-client-5.3.4.1/samples/CompositeMessagePublisher.py +0 -84
  678. amps-python-client-5.3.4.1/samples/CompositeMessageSubscriber.py +0 -87
  679. amps-python-client-5.3.4.1/samples/RandomServerChooser.py +0 -41
  680. amps-python-client-5.3.4.1/samples/sample.xml +0 -335
  681. amps-python-client-5.3.4.1/setup.py +0 -209
  682. amps-python-client-5.3.4.1/setup_amps.py +0 -94
  683. amps-python-client-5.3.4.1/src/ampspy_shims.cpp +0 -203
  684. amps-python-client-5.3.4.1/src/ampspy_type_object.cpp +0 -484
  685. amps-python-client-5.3.4.1/src/authenticator.cpp +0 -128
  686. amps-python-client-5.3.4.1/src/bookmarkstore.cpp +0 -238
  687. amps-python-client-5.3.4.1/src/client.cpp +0 -2430
  688. amps-python-client-5.3.4.1/src/client_docs.h +0 -956
  689. amps-python-client-5.3.4.1/src/cmessagehandler.cpp +0 -151
  690. amps-python-client-5.3.4.1/src/command.cpp +0 -164
  691. amps-python-client-5.3.4.1/src/command_docs.h +0 -194
  692. amps-python-client-5.3.4.1/src/compositemessagebuilder.cpp +0 -111
  693. amps-python-client-5.3.4.1/src/compositemessageparser.cpp +0 -146
  694. amps-python-client-5.3.4.1/src/conflatingrecoverypointadapter.cpp +0 -194
  695. amps-python-client-5.3.4.1/src/cpp/include/amps/BlockPublishStore.hpp +0 -2053
  696. amps-python-client-5.3.4.1/src/cpp/include/amps/BlockStore.hpp +0 -677
  697. amps-python-client-5.3.4.1/src/cpp/include/amps/BookmarkStore.hpp +0 -542
  698. amps-python-client-5.3.4.1/src/cpp/include/amps/Buffer.hpp +0 -214
  699. amps-python-client-5.3.4.1/src/cpp/include/amps/CompositeMessageBuilder.hpp +0 -174
  700. amps-python-client-5.3.4.1/src/cpp/include/amps/CompositeMessageParser.hpp +0 -151
  701. amps-python-client-5.3.4.1/src/cpp/include/amps/DefaultServerChooser.hpp +0 -162
  702. amps-python-client-5.3.4.1/src/cpp/include/amps/Field.hpp +0 -719
  703. amps-python-client-5.3.4.1/src/cpp/include/amps/HAClient.hpp +0 -370
  704. amps-python-client-5.3.4.1/src/cpp/include/amps/HAClientImpl.hpp +0 -460
  705. amps-python-client-5.3.4.1/src/cpp/include/amps/HybridPublishStore.hpp +0 -481
  706. amps-python-client-5.3.4.1/src/cpp/include/amps/LoggedBookmarkStore.hpp +0 -1255
  707. amps-python-client-5.3.4.1/src/cpp/include/amps/MMapBookmarkStore.hpp +0 -1283
  708. amps-python-client-5.3.4.1/src/cpp/include/amps/MMapStoreBuffer.hpp +0 -290
  709. amps-python-client-5.3.4.1/src/cpp/include/amps/MemoryBookmarkStore.hpp +0 -1622
  710. amps-python-client-5.3.4.1/src/cpp/include/amps/MemoryPublishStore.hpp +0 -66
  711. amps-python-client-5.3.4.1/src/cpp/include/amps/MemoryStoreBuffer.hpp +0 -244
  712. amps-python-client-5.3.4.1/src/cpp/include/amps/MemorySubscriptionManager.hpp +0 -850
  713. amps-python-client-5.3.4.1/src/cpp/include/amps/Message.hpp +0 -1819
  714. amps-python-client-5.3.4.1/src/cpp/include/amps/MessageRouter.hpp +0 -618
  715. amps-python-client-5.3.4.1/src/cpp/include/amps/PublishStore.hpp +0 -158
  716. amps-python-client-5.3.4.1/src/cpp/include/amps/ReconnectDelayStrategy.hpp +0 -106
  717. amps-python-client-5.3.4.1/src/cpp/include/amps/ReconnectDelayStrategyImpl.hpp +0 -317
  718. amps-python-client-5.3.4.1/src/cpp/include/amps/RecoveryPoint.hpp +0 -323
  719. amps-python-client-5.3.4.1/src/cpp/include/amps/RecoveryPointAdapter.hpp +0 -501
  720. amps-python-client-5.3.4.1/src/cpp/include/amps/RingBookmarkStore.hpp +0 -669
  721. amps-python-client-5.3.4.1/src/cpp/include/amps/SOWRecoveryPointAdapter.hpp +0 -490
  722. amps-python-client-5.3.4.1/src/cpp/include/amps/ServerChooser.hpp +0 -145
  723. amps-python-client-5.3.4.1/src/cpp/include/amps/ServerChooserImpl.hpp +0 -95
  724. amps-python-client-5.3.4.1/src/cpp/include/amps/amps.h +0 -775
  725. amps-python-client-5.3.4.1/src/cpp/include/amps/amps_impl.h +0 -204
  726. amps-python-client-5.3.4.1/src/cpp/include/amps/amps_ssl.h +0 -78
  727. amps-python-client-5.3.4.1/src/cpp/include/amps/ampscrc.hpp +0 -210
  728. amps-python-client-5.3.4.1/src/cpp/include/amps/ampsplusplus.hpp +0 -8817
  729. amps-python-client-5.3.4.1/src/cpp/include/amps/ampsuri.h +0 -84
  730. amps-python-client-5.3.4.1/src/cpp/include/amps/ampsver.h +0 -41
  731. amps-python-client-5.3.4.1/src/cpp/include/amps/ampsver.h.in +0 -41
  732. amps-python-client-5.3.4.1/src/cpp/include/amps/constants.hpp +0 -194
  733. amps-python-client-5.3.4.1/src/cpp/include/amps/util.hpp +0 -1692
  734. amps-python-client-5.3.4.1/src/cpp/src/amps_protocol.c +0 -688
  735. amps-python-client-5.3.4.1/src/cpp/src/amps_ssl.c +0 -489
  736. amps-python-client-5.3.4.1/src/cpp/src/atfork.c +0 -446
  737. amps-python-client-5.3.4.1/src/cpp/src/client.c +0 -483
  738. amps-python-client-5.3.4.1/src/cpp/src/message.c +0 -837
  739. amps-python-client-5.3.4.1/src/cpp/src/message_generated.h +0 -611
  740. amps-python-client-5.3.4.1/src/cpp/src/tcp.c +0 -1489
  741. amps-python-client-5.3.4.1/src/cpp/src/tcps.c +0 -1894
  742. amps-python-client-5.3.4.1/src/cpp/src/transports.c +0 -123
  743. amps-python-client-5.3.4.1/src/cpp/src/unix.c +0 -984
  744. amps-python-client-5.3.4.1/src/cpp/src/uri.c +0 -301
  745. amps-python-client-5.3.4.1/src/exponentialdelaystrategy.cpp +0 -137
  746. amps-python-client-5.3.4.1/src/failedwritehandler.cpp +0 -116
  747. amps-python-client-5.3.4.1/src/fixbuilder.cpp +0 -146
  748. amps-python-client-5.3.4.1/src/fixeddelaystrategy.cpp +0 -114
  749. amps-python-client-5.3.4.1/src/fixshredder.cpp +0 -105
  750. amps-python-client-5.3.4.1/src/fixshredder_docs.h +0 -38
  751. amps-python-client-5.3.4.1/src/haclient.cpp +0 -691
  752. amps-python-client-5.3.4.1/src/haclient_docs.h +0 -132
  753. amps-python-client-5.3.4.1/src/hybridpublishstore.cpp +0 -137
  754. amps-python-client-5.3.4.1/src/hybridpublishstore_docs.h +0 -31
  755. amps-python-client-5.3.4.1/src/memorybookmarkstore.cpp +0 -373
  756. amps-python-client-5.3.4.1/src/memorybookmarkstore_docs.h +0 -39
  757. amps-python-client-5.3.4.1/src/memorypublishstore.cpp +0 -160
  758. amps-python-client-5.3.4.1/src/memorypublishstore_docs.h +0 -32
  759. amps-python-client-5.3.4.1/src/message.cpp +0 -765
  760. amps-python-client-5.3.4.1/src/message_docs.h +0 -306
  761. amps-python-client-5.3.4.1/src/messagestream.cpp +0 -623
  762. amps-python-client-5.3.4.1/src/messagestream_docs.h +0 -45
  763. amps-python-client-5.3.4.1/src/mmapbookmarkstore.cpp +0 -422
  764. amps-python-client-5.3.4.1/src/nvfixbuilder.cpp +0 -160
  765. amps-python-client-5.3.4.1/src/nvfixbuilder_docs.h +0 -33
  766. amps-python-client-5.3.4.1/src/nvfixshredder.cpp +0 -99
  767. amps-python-client-5.3.4.1/src/nvfixshredder_docs.h +0 -39
  768. amps-python-client-5.3.4.1/src/publishstore.cpp +0 -183
  769. amps-python-client-5.3.4.1/src/raw_wrapper.cpp +0 -756
  770. amps-python-client-5.3.4.1/src/reason.cpp +0 -71
  771. amps-python-client-5.3.4.1/src/recoverypoint.cpp +0 -135
  772. amps-python-client-5.3.4.1/src/recoverypointadapter.cpp +0 -171
  773. amps-python-client-5.3.4.1/src/ringbookmarkstore.cpp +0 -360
  774. amps-python-client-5.3.4.1/src/serverchooser.cpp +0 -245
  775. amps-python-client-5.3.4.1/src/serverchooser_docs.h +0 -39
  776. amps-python-client-5.3.4.1/src/sowrecoverypointadapter.cpp +0 -248
  777. amps-python-client-5.3.4.1/src/store.cpp +0 -62
  778. amps-python-client-5.3.4.1/src/versioninfo.cpp +0 -175
  779. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/HISTORY +0 -0
  780. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/LICENSE +0 -0
  781. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/README.md +0 -0
  782. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/ajax-loader.gif +0 -0
  783. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/alabaster.css +0 -0
  784. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/basic.css +0 -0
  785. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/comment-bright.png +0 -0
  786. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/comment-close.png +0 -0
  787. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/comment.png +0 -0
  788. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/doctools.js +0 -0
  789. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/down-pressed.png +0 -0
  790. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/down.png +0 -0
  791. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/file.png +0 -0
  792. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/flag_logo.png +0 -0
  793. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/flag_logo.svg +0 -0
  794. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/jquery-3.1.0.js +0 -0
  795. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/jquery.js +0 -0
  796. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/minus.png +0 -0
  797. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/plus.png +0 -0
  798. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/pygments.css +0 -0
  799. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/searchtools.js +0 -0
  800. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/underscore-1.3.1.js +0 -0
  801. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/underscore.js +0 -0
  802. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/up-pressed.png +0 -0
  803. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/up.png +0 -0
  804. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/command-reference/html/_static/websupport.js +0 -0
  805. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_sources/code.rst.txt +0 -0
  806. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_sources/index.rst.txt +0 -0
  807. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/ajax-loader.gif +0 -0
  808. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/basic.css +0 -0
  809. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/classic.css +0 -0
  810. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/comment-bright.png +0 -0
  811. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/comment-close.png +0 -0
  812. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/comment.png +0 -0
  813. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/default.css +0 -0
  814. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/doctools.js +0 -0
  815. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/down-pressed.png +0 -0
  816. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/down.png +0 -0
  817. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/file.png +0 -0
  818. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/jquery-3.1.0.js +0 -0
  819. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/jquery.js +0 -0
  820. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/minus.png +0 -0
  821. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/plus.png +0 -0
  822. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/pygments.css +0 -0
  823. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/searchtools.js +0 -0
  824. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/sidebar.js +0 -0
  825. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/underscore-1.3.1.js +0 -0
  826. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/underscore.js +0 -0
  827. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/up-pressed.png +0 -0
  828. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/up.png +0 -0
  829. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/html/_static/websupport.js +0 -0
  830. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_images/caution.png +0 -0
  831. {amps-python-client-5.3.4.1/docs/command-reference → amps-python-client-5.3.4.2/docs/python}/html/_images/caution.svg +0 -0
  832. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_images/connection_string.svg +0 -0
  833. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_images/important.png +0 -0
  834. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_images/important.svg +0 -0
  835. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_images/tip.png +0 -0
  836. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_images/tip.svg +0 -0
  837. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_images/warning.png +0 -0
  838. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_sources/chapters/cpp-compiler-list.rst.txt +0 -0
  839. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_sources/index.rst.txt +0 -0
  840. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/ajax-loader.gif +0 -0
  841. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/alabaster.css +0 -0
  842. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/basic.css +0 -0
  843. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/comment-bright.png +0 -0
  844. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/comment-close.png +0 -0
  845. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/comment.png +0 -0
  846. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/doctools.js +0 -0
  847. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/down-pressed.png +0 -0
  848. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/down.png +0 -0
  849. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/file.png +0 -0
  850. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/flag_logo.png +0 -0
  851. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/flag_logo.svg +0 -0
  852. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/jquery-3.1.0.js +0 -0
  853. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/jquery.js +0 -0
  854. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/minus.png +0 -0
  855. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/plus.png +0 -0
  856. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/pygments.css +0 -0
  857. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/searchtools.js +0 -0
  858. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/underscore-1.3.1.js +0 -0
  859. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/underscore.js +0 -0
  860. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/up-pressed.png +0 -0
  861. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/up.png +0 -0
  862. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python/html/_static/websupport.js +0 -0
  863. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_sources/chapters/crankitup.rst.txt +0 -0
  864. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_sources/chapters/equipment.rst.txt +0 -0
  865. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_sources/index.rst.txt +0 -0
  866. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/ajax-loader.gif +0 -0
  867. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/alabaster.css +0 -0
  868. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/basic.css +0 -0
  869. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/comment-bright.png +0 -0
  870. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/comment-close.png +0 -0
  871. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/comment.png +0 -0
  872. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/doctools.js +0 -0
  873. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/down-pressed.png +0 -0
  874. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/down.png +0 -0
  875. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/file.png +0 -0
  876. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/flag_logo.png +0 -0
  877. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/flag_logo.svg +0 -0
  878. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/jquery-3.1.0.js +0 -0
  879. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/jquery.js +0 -0
  880. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/minus.png +0 -0
  881. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/plus.png +0 -0
  882. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/pygments.css +0 -0
  883. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/searchtools.js +0 -0
  884. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/underscore-1.3.1.js +0 -0
  885. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/underscore.js +0 -0
  886. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/up-pressed.png +0 -0
  887. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/up.png +0 -0
  888. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/python-quickstart/html/_static/websupport.js +0 -0
  889. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/resources/custom.css +0 -0
  890. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/resources/flag_logo.svg +0 -0
  891. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_sources/chapters/spark.rst.txt +0 -0
  892. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/ajax-loader.gif +0 -0
  893. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/alabaster.css +0 -0
  894. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/basic.css +0 -0
  895. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/comment-bright.png +0 -0
  896. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/comment-close.png +0 -0
  897. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/comment.png +0 -0
  898. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/doctools.js +0 -0
  899. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/down-pressed.png +0 -0
  900. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/down.png +0 -0
  901. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/file.png +0 -0
  902. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/flag_logo.png +0 -0
  903. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/flag_logo.svg +0 -0
  904. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/jquery-3.1.0.js +0 -0
  905. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/jquery.js +0 -0
  906. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/minus.png +0 -0
  907. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/plus.png +0 -0
  908. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/pygments.css +0 -0
  909. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/searchtools.js +0 -0
  910. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/underscore-1.3.1.js +0 -0
  911. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/underscore.js +0 -0
  912. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/up-pressed.png +0 -0
  913. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/up.png +0 -0
  914. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/docs/user-guide/html/_static/websupport.js +0 -0
  915. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/src/cpp/include/amps/amps_generated.h +0 -0
  916. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/src/cpp/src/amps_protocol_generated.h +0 -0
  917. {amps-python-client-5.3.4.1 → amps-python-client-5.3.4.2}/src/cpp/src/makefile +0 -0
@@ -0,0 +1,1885 @@
1
+ /*//////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // Copyright (c) 2010-2024 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
+ #if _MSC_VER < 1400
26
+ /*support for visual c++ 2003 */
27
+ #define _WIN32_WINNT 0x0400
28
+ #endif
29
+ #include <amps/amps_impl.h>
30
+ #include <amps/amps_ssl.h>
31
+ #include <amps/ampsuri.h>
32
+ #if __STDC_VERSION__ >= 201100
33
+ #include <stdatomic.h>
34
+ #include <stdbool.h>
35
+ #define AMPS_IEX(ptr, value) atomic_exchange_explicit((ptr), (value), memory_order_acq_rel)
36
+ #define AMPS_IEX_GET(ptr, value) atomic_exchange_explicit((ptr), (value), memory_order_acq_rel)
37
+ #define AMPS_IEX_LONG(ptr, value) atomic_exchange_explicit((ptr), (value), memory_order_acq_rel)
38
+ #define AMPS_FETCH_ADD(ptr, value) atomic_fetch_add_explicit((ptr), (value), memory_order_acq_rel)
39
+ #define AMPS_FETCH_SUB(ptr, value) atomic_fetch_sub_explicit((ptr), (value), memory_order_acq_rel)
40
+ #elif defined(_WIN32)
41
+ #ifdef _WIN64
42
+ #define AMPS_IEX(ptr,value) _InterlockedExchange64((LONG64*)(ptr), (LONG64)(value))
43
+ #define AMPS_IEX_GET(ptr,value) _InterlockedExchange64((LONG64*)(ptr), (LONG64)(value))
44
+ #define AMPS_IEX_LONG(ptr,value) _InterlockedExchange((ptr), (value))
45
+ #define AMPS_FETCH_ADD(ptr, value) InterlockedExchangeAdd64((LONGLONG volatile*)(ptr), (LONGLONG)(value))
46
+ #define AMPS_FETCH_SUB(ptr, value) InterlockedExchangeAdd64((LONGLONG volatile*)(ptr), (LONGLONG)(-1 * (value)))
47
+ #else
48
+ #define AMPS_IEX(ptr,value) _InterlockedExchange((long*)(ptr), (LONG)(value))
49
+ #define AMPS_IEX_GET(ptr,value) _InterlockedExchange((long*)(ptr), (LONG)(value))
50
+ #define AMPS_IEX_LONG(ptr,value) _InterlockedExchange((ptr), (LONG)(value))
51
+ #define AMPS_FETCH_ADD(ptr, value) InterlockedExchangeAdd((LONG volatile*)(ptr), (LONG)(value))
52
+ #define AMPS_FETCH_SUB(ptr, value) InterlockedExchangeAdd((LONG volatile*)(ptr), (LONG)(-1 * (value)))
53
+ #endif
54
+ #else
55
+ #define AMPS_IEX(ptr, value) (void)__sync_lock_test_and_set((ptr), (value))
56
+ #define AMPS_IEX_GET(ptr, value) __sync_lock_test_and_set((ptr), (value))
57
+ #define AMPS_IEX_LONG(ptr, value) (void)__sync_lock_test_and_set((ptr), (value))
58
+ #define AMPS_FETCH_ADD(ptr, value) __sync_fetch_and_add((ptr), (value))
59
+ #define AMPS_FETCH_SUB(ptr, value) __sync_fetch_and_sub((ptr), (value))
60
+ #endif
61
+
62
+ #ifdef _WIN32
63
+
64
+ /* Causes linked programs to add ws2_32.lib which is required by
65
+ * this module. If you'd like to turn this off, define the macro
66
+ * AMPS_WINDOWS_NO_DEFAULT_LIBS.
67
+ */
68
+ #ifndef AMPS_WINDOWS_NO_DEFAULT_LIBS
69
+ #pragma comment(lib,"ws2_32.lib")
70
+ #endif
71
+
72
+ #include <Ws2tcpip.h>
73
+ #define GET_ERRNO (WSAGetLastError())
74
+ #define SOCK_ERRORCODE(x) WSA##x
75
+ #define AMPS_INITLOCK(x) InitializeCriticalSection(x)
76
+ #define AMPS_LOCK(x) EnterCriticalSection(x)
77
+ /* defined in tcp.c */
78
+ int amps_win_spin_lock(LPCRITICAL_SECTION x);
79
+ #define AMPS_SPIN_LOCK(x) amps_win_spin_lock(x)
80
+ #define AMPS_SPIN_LOCK_UNLIMITED(x) EnterCriticalSection(x)
81
+ #define AMPS_UNLOCK(x) LeaveCriticalSection(x)
82
+ #define AMPS_KILLLOCK(x) DeleteCriticalSection(x)
83
+ int tcpsThreadTimeoutMillis = 10000;
84
+ #define AMPS_JOIN_DECLARE() \
85
+ DWORD tid = (DWORD)0; \
86
+ HANDLE tidH = (HANDLE)0
87
+
88
+ #define AMPS_JOIN(x) \
89
+ tid = (DWORD)AMPS_IEX(&x, 0); \
90
+ tidH = (HANDLE)AMPS_IEX(&x##H, 0); \
91
+ if (tid != 0) \
92
+ { \
93
+ if (tid != GetCurrentThreadId()) \
94
+ { \
95
+ if(WAIT_TIMEOUT == WaitForSingleObject(tidH, tcpsThreadTimeoutMillis)) \
96
+ { \
97
+ TerminateThread(tidH, -1); \
98
+ } \
99
+ } \
100
+ CloseHandle(tidH); \
101
+ }
102
+ #define AMPS_SLEEP(x) \
103
+ Sleep(x)
104
+ #define SHUT_RDWR SD_BOTH
105
+ #else
106
+ #define GET_ERRNO (errno)
107
+ #define SOCK_ERRORCODE(x) x
108
+ #include <pthread.h>
109
+
110
+ static pthread_mutexattr_t _mutexattr_recursive;
111
+ #define AMPS_INITLOCK(x) { \
112
+ pthread_mutexattr_init(&_mutexattr_recursive); \
113
+ pthread_mutexattr_settype(&_mutexattr_recursive, PTHREAD_MUTEX_RECURSIVE);\
114
+ pthread_mutex_init(x, &_mutexattr_recursive); }
115
+ #define AMPS_LOCK(x) pthread_mutex_lock(x)
116
+ #define AMPS_SPIN_LOCK(x) amps_spin_lock_counted(x)
117
+ #define AMPS_SPIN_LOCK_UNLIMITED(x) amps_spin_lock_unlimited(x)
118
+
119
+ #define AMPS_UNLOCK(x) pthread_mutex_unlock(x)
120
+ #define AMPS_KILLLOCK(x) pthread_mutex_destroy(x)
121
+ #define AMPS_JOIN_DECLARE() \
122
+ pthread_t tid = (pthread_t)0;
123
+
124
+ #if __STDC_VERSION__ >= 201100
125
+ #define AMPS_JOIN(x) \
126
+ tid = atomic_exchange((&x), (pthread_t)0); \
127
+ if(tid!=(pthread_t)0 && tid!=pthread_self()) \
128
+ { \
129
+ pthread_join(tid, NULL); \
130
+ }
131
+ #else
132
+ #define AMPS_JOIN(x) \
133
+ tid = AMPS_FETCH_ADD(&x, (pthread_t)0); \
134
+ if(tid!=(pthread_t)0 && tid!=pthread_self()) \
135
+ { \
136
+ if(__sync_bool_compare_and_swap(&x, tid, (pthread_t)0)) \
137
+ { \
138
+ pthread_join(tid, NULL); \
139
+ } \
140
+ }
141
+ #endif
142
+
143
+ #define AMPS_SLEEP(x) { \
144
+ static struct timespec ts = { x/1000, (x%1000) * 1000000 }; \
145
+ nanosleep(&ts, NULL); }
146
+ #endif
147
+
148
+ typedef struct
149
+ {
150
+ amps_thread_created_callback threadCreatedCallback;
151
+ void* threadCreatedCallbackUserData;
152
+ char* buf;
153
+ amps_int64_t serializer;
154
+ amps_handler messageHandler;
155
+ void* messageHandlerUserData;
156
+ amps_transport_filter_function filterFunction;
157
+ void* filterUserData;
158
+
159
+ amps_predisconnect_handler predisconnectHandler;
160
+ void* predisconnectHandlerUserData;
161
+ amps_handler disconnectHandler;
162
+ void* disconnectHandlerUserData;
163
+ amps_uint64_t readTimeoutMillis;
164
+ amps_uint64_t idleTimeMillis;
165
+ #if __STDC_VERSION__ >= 201100
166
+ atomic_int_fast64_t threadCreatedCallbackResult;
167
+ _Atomic unsigned connectionVersion;
168
+ #else
169
+ #if defined(_WIN32) && !defined(_WIN64)
170
+ volatile long threadCreatedCallbackResult;
171
+ #else
172
+ volatile amps_int64_t threadCreatedCallbackResult;
173
+ #endif
174
+ volatile unsigned connectionVersion;
175
+ #endif
176
+
177
+ size_t capacity;
178
+ #if __STDC_VERSION__ >= 201100
179
+ _Atomic AMPS_SOCKET fd;
180
+ _Atomic(_amps_SSL*) ssl;
181
+ atomic_bool disconnecting;
182
+ atomic_bool destroying;
183
+ #else
184
+ volatile AMPS_SOCKET fd;
185
+ _amps_SSL* ssl;
186
+ volatile long disconnecting;
187
+ volatile long destroying;
188
+ #endif
189
+ #ifdef _WIN32
190
+ CRITICAL_SECTION lock;
191
+ CRITICAL_SECTION sendLock;
192
+ #if __STDC_VERSION__ >= 201100
193
+ _Atomic DWORD thread;
194
+ _Atomic HANDLE threadH;
195
+ #else
196
+ volatile DWORD thread;
197
+ volatile HANDLE threadH;
198
+ #endif
199
+ #else
200
+ pthread_mutex_t lock;
201
+ pthread_mutex_t sendLock;
202
+ #if __STDC_VERSION__ >= 201100
203
+ _Atomic pthread_t thread;
204
+ #else
205
+ volatile pthread_t thread;
206
+ #endif
207
+ #endif
208
+ char lastErrorBuf[1024];
209
+ amps_thread_exit_callback threadExitCallback;
210
+ void* threadExitCallbackUserData;
211
+ }
212
+ amps_tcps_t;
213
+
214
+ const amps_char* amps_tcps_get_last_error(
215
+ amps_handle transport)
216
+ {
217
+ return ((amps_tcps_t*)transport)->lastErrorBuf;
218
+ }
219
+
220
+ void amps_tcps_set_error(
221
+ amps_tcps_t* transport,
222
+ const amps_char* buffer)
223
+ {
224
+ _AMPS_SNPRINTF(transport->lastErrorBuf, sizeof(transport->lastErrorBuf), "%s", buffer);
225
+ transport->lastErrorBuf[sizeof(transport->lastErrorBuf) - 1] = '\0';
226
+ }
227
+
228
+ void amps_tcps_set_socket_error(
229
+ amps_tcps_t* transport,
230
+ int errorCode)
231
+ {
232
+ #ifdef _WIN32
233
+ char localBuf[256];
234
+ FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, errorCode, 0, localBuf, sizeof(localBuf), NULL);
235
+ amps_tcps_set_error(transport, localBuf);
236
+ #else
237
+ amps_tcps_set_error(transport, strerror(errorCode));
238
+ #endif
239
+ }
240
+
241
+ void amps_tcps_set_hostname_error(
242
+ amps_tcps_t* transport,
243
+ int rc,
244
+ int errorCode)
245
+ {
246
+ #ifdef _WIN32
247
+ amps_tcps_set_socket_error(transport, errorCode);
248
+ #else
249
+ strncpy(transport->lastErrorBuf, gai_strerror(rc), sizeof(transport->lastErrorBuf));
250
+ transport->lastErrorBuf[sizeof(transport->lastErrorBuf) - 1] = '\0';
251
+ #endif
252
+ }
253
+
254
+ void amps_tcps_set_error_stack_error(amps_tcps_t* transport)
255
+ {
256
+ char buffer[256];
257
+ _amps_ERR_error_string_n(_amps_ERR_get_error(), buffer, 256);
258
+ amps_tcps_set_error(transport, buffer);
259
+ }
260
+
261
+ void amps_tcps_set_ssl_error(amps_tcps_t* transport,
262
+ int rc,
263
+ int sysError)
264
+ {
265
+ char buffer[256];
266
+ if (!transport->ssl)
267
+ {
268
+ _AMPS_SNPRINTF(buffer, 256, "SSL error, SSL is closing");
269
+ amps_tcps_set_error(transport, buffer);
270
+ return;
271
+ }
272
+ int sslError = _amps_SSL_get_error(transport->ssl, rc);
273
+ unsigned long errorQueue = 0;
274
+ switch (sslError)
275
+ {
276
+ case AMPS_SSL_ERROR_SSL:
277
+ amps_tcps_set_error_stack_error(transport);
278
+ break;
279
+ case AMPS_SSL_ERROR_SYSCALL:
280
+ errorQueue = _amps_ERR_get_error();
281
+ if (errorQueue)
282
+ {
283
+ _amps_ERR_error_string_n(errorQueue, buffer, 256);
284
+ amps_tcps_set_error(transport, buffer);
285
+ }
286
+ else if (rc == 0 || sysError == 0)
287
+ {
288
+ amps_tcps_set_error(transport, "An unexpected disconnect occurred.");
289
+ }
290
+ else
291
+ {
292
+ amps_tcps_set_socket_error(transport, sysError);
293
+ }
294
+ break;
295
+ default:
296
+ _AMPS_SNPRINTF(buffer, 256, "Unexpected SSL error %d", sslError);
297
+ amps_tcps_set_error(transport, buffer);
298
+ return;
299
+ }
300
+ }
301
+
302
+ void
303
+ amps_tcps_noop_filter_function(const unsigned char* data, size_t length, short direction, void* userdata)
304
+ {;}
305
+
306
+ void amps_tcps_atfork_handler(amps_tcps_t* transport_, int code_)
307
+ {
308
+ switch (code_)
309
+ {
310
+ case 0:
311
+ break;
312
+ case 1:
313
+ break;
314
+ case 2:
315
+ /* Reinitialize the transport lock in the forked child */
316
+ AMPS_INITLOCK(&transport_->lock);
317
+ break;
318
+ }
319
+ }
320
+
321
+ amps_handle amps_tcps_create(void)
322
+ {
323
+ amps_tcps_t* transport = (amps_tcps_t*)malloc(sizeof(amps_tcps_t));
324
+
325
+ if (transport != NULL)
326
+ {
327
+ memset(transport, 0, sizeof(amps_tcps_t));
328
+ transport->fd = AMPS_INVALID_SOCKET;
329
+ transport->ssl = NULL;
330
+ AMPS_INITLOCK(&transport->lock);
331
+ AMPS_INITLOCK(&transport->sendLock);
332
+ #if __STDC_VERSION__ >= 201100
333
+ transport->disconnecting = false;
334
+ transport->destroying = false;
335
+ #endif
336
+ transport->filterFunction = &amps_tcps_noop_filter_function;
337
+ amps_atfork_add(transport, (_amps_atfork_callback_function)amps_tcps_atfork_handler);
338
+ }
339
+
340
+ return transport;
341
+ }
342
+ #ifdef _WIN32
343
+ DWORD amps_tcps_threaded_reader(void* userData);
344
+ #else
345
+ void* amps_tcps_threaded_reader(void* userData);
346
+ #endif
347
+
348
+ int
349
+ amps_tcps_opt_parse(const char* val, size_t valLen, int* parsed)
350
+ {
351
+ size_t i;
352
+ if (valLen == 4 && memcmp(val, "true", 4) == 0)
353
+ {
354
+ *parsed = 1;
355
+ return 1;
356
+ }
357
+ else if (valLen == 5 && memcmp(val, "false", 5) == 0)
358
+ {
359
+ *parsed = 0;
360
+ return 1;
361
+ }
362
+ else
363
+ {
364
+ *parsed = 0;
365
+ for (i = 0; i < valLen ; i++)
366
+ {
367
+ *parsed *= 10;
368
+ if (val[i] >= '0' && val[i] <= '9')
369
+ {
370
+ *parsed += val[i] - '0';
371
+ }
372
+ else
373
+ {
374
+ return 0;
375
+ }
376
+ }
377
+ }
378
+ return 1;
379
+ }
380
+
381
+ amps_result
382
+ amps_tcps_apply_socket_property(AMPS_SOCKET fd, const char* key, size_t keyLen, const
383
+ char* val, size_t valLen)
384
+ {
385
+ int value = 0, level = SOL_SOCKET, optname;
386
+ unsigned int optValueSize = sizeof(int);
387
+ char* optValuePtr = (char*)&value;
388
+ struct linger lingerStruct;
389
+ if (keyLen == 4 && memcmp(key, "bind", keyLen) == 0)
390
+ {
391
+ struct addrinfo* pAddrInfo = NULL, addrhints;
392
+ char addr[256] = { 0 };
393
+ char port[256] = { 0 };
394
+ size_t addrLen = valLen, portLen = 0;
395
+ char* portStr = (char*)(memchr((void*)val, ':', valLen));
396
+ char* ipv6Str = (char*)(memchr((void*)val, '[', valLen));
397
+
398
+ #ifdef _WIN32
399
+ int addrFamily = 0;
400
+ WSAPROTOCOL_INFOW localProto;
401
+ int localProtoLen = sizeof(WSAPROTOCOL_INFO);
402
+ if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL_INFO, (char*)&localProto, &localProtoLen) == SOCKET_ERROR)
403
+ {
404
+ return AMPS_E_URI;
405
+ }
406
+ addrFamily = localProto.iAddressFamily;
407
+ #elif !defined(__APPLE__)
408
+ int addrFamily = 0;
409
+ socklen_t addrFamilyLen = sizeof(addrFamily);
410
+ if (getsockopt(fd, SOL_SOCKET, AMPS_SO_DOMAIN, (void*)&addrFamily, &addrFamilyLen) < 0)
411
+ {
412
+ return AMPS_E_URI;
413
+ }
414
+ #endif
415
+
416
+ if (ipv6Str)
417
+ {
418
+ ++ipv6Str;
419
+ char* ipv6StrEnd = (char*)(memchr((void*)ipv6Str, ']', (size_t)(val + valLen - ipv6Str)));
420
+ if (!ipv6StrEnd)
421
+ {
422
+ return AMPS_E_URI;
423
+ }
424
+ addrLen = (size_t)(ipv6StrEnd - ipv6Str);
425
+ memcpy(addr, ipv6Str, addrLen);
426
+ addr[addrLen] = '\0';
427
+
428
+ if ((size_t)(val + valLen - ++ipv6StrEnd) < valLen && *ipv6StrEnd == ':')
429
+ {
430
+ portLen = (size_t)(val + valLen - ++ipv6StrEnd);
431
+ memcpy(port, ipv6StrEnd, portLen);
432
+ port[portLen] = '\0';
433
+ }
434
+ }
435
+ else if (portStr)
436
+ {
437
+ addrLen = (size_t)(portStr - val);
438
+ portLen = (size_t)(val + valLen - ++portStr);
439
+ memcpy(addr, val, addrLen);
440
+ addr[addrLen] = '\0';
441
+ memcpy(port, portStr, portLen);
442
+ port[portLen] = '\0';
443
+ }
444
+ else
445
+ {
446
+ memcpy(addr, val, addrLen);
447
+ addr[addrLen] = '\0';
448
+ }
449
+
450
+ /* use getaddrinfo() to find an appropriate address */
451
+ memset(&addrhints, 0, sizeof(struct addrinfo));
452
+ addrhints.ai_socktype = SOCK_STREAM;
453
+ addrhints.ai_protocol = 0;
454
+ #ifndef __APPLE__
455
+ addrhints.ai_family = addrFamily; // match the family of the socket
456
+ #else
457
+ if (ipv6Str)
458
+ {
459
+ addrhints.ai_family = AF_INET6;
460
+ }
461
+ else
462
+ {
463
+ addrhints.ai_family = AF_INET;
464
+ }
465
+ #endif
466
+ addrhints.ai_flags = (AI_V4MAPPED | AI_ADDRCONFIG | AI_PASSIVE);
467
+
468
+ int rc = getaddrinfo(addr, port, &addrhints, &pAddrInfo);
469
+ if (rc != 0 || pAddrInfo == NULL)
470
+ {
471
+ if (pAddrInfo)
472
+ {
473
+ freeaddrinfo(pAddrInfo);
474
+ }
475
+ return AMPS_E_URI;
476
+ }
477
+
478
+ if (bind(fd, pAddrInfo->ai_addr, (socklen_t)pAddrInfo->ai_addrlen) != 0)
479
+ {
480
+ freeaddrinfo(pAddrInfo);
481
+ return AMPS_E_URI;
482
+ }
483
+ freeaddrinfo(pAddrInfo);
484
+ return AMPS_E_OK;
485
+ }
486
+ else if (keyLen == 18 && memcmp(key, "ip_protocol_prefer", keyLen) == 0)
487
+ {
488
+ // no-op; handled in the connect function
489
+ return AMPS_E_OK;
490
+ }
491
+ else if (keyLen == 3 && memcmp(key, "sni", keyLen) == 0)
492
+ {
493
+ // no-op; handled in amps_tcps_apply_ssl_properties
494
+ return AMPS_E_OK;
495
+ }
496
+ // properties after this point must only be boolean or numeric
497
+ if (!amps_tcps_opt_parse(val, valLen, &value))
498
+ {
499
+ return AMPS_E_URI;
500
+ }
501
+ if (keyLen == 10 && memcmp(key, "tcp_rcvbuf", keyLen) == 0)
502
+ {
503
+ optname = SO_RCVBUF;
504
+ }
505
+ else if (keyLen == 13 && memcmp(key, "tcp_keepalive", keyLen) == 0 )
506
+ {
507
+ optname = SO_KEEPALIVE;
508
+ }
509
+ else if (keyLen == 10 && memcmp(key, "tcp_sndbuf", keyLen) == 0)
510
+ {
511
+ optname = SO_SNDBUF;
512
+ }
513
+ else if (keyLen == 11 && memcmp(key, "tcp_nodelay", keyLen) == 0)
514
+ {
515
+ optname = TCP_NODELAY;
516
+ level = IPPROTO_TCP;
517
+ }
518
+ else if (keyLen == 10 && memcmp(key, "tcp_linger", keyLen) == 0)
519
+ {
520
+ optname = SO_LINGER;
521
+ lingerStruct.l_onoff = value != 0;
522
+ lingerStruct.l_linger = (u_short)value;
523
+ optValuePtr = (char*)&lingerStruct;
524
+ optValueSize = sizeof(struct linger);
525
+ }
526
+ else if (keyLen == 6 && memcmp(key, "pretty", keyLen) == 0)
527
+ {
528
+ // no-op; handled in C++ layer
529
+ return AMPS_E_OK;
530
+ }
531
+ else
532
+ {
533
+ return AMPS_E_URI;
534
+ }
535
+
536
+ /* set it */
537
+ if (setsockopt(fd, level, optname, optValuePtr, optValueSize))
538
+ {
539
+ return AMPS_E_URI;
540
+ }
541
+ return AMPS_E_OK;
542
+ }
543
+
544
+ amps_result
545
+ amps_tcps_apply_socket_properties(AMPS_SOCKET fd, const char* uri,
546
+ size_t uriLength, amps_uri_state* uriState)
547
+ {
548
+ const char* key = NULL;
549
+ size_t keyLength = 0;
550
+ /* First, enable tcp_keepalive by default */
551
+ int value = 1;
552
+ unsigned int optValueSize = sizeof(int);
553
+ char* optValuePtr = (char*)&value;
554
+ if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, optValuePtr, optValueSize))
555
+ {
556
+ return AMPS_E_URI;
557
+ }
558
+ /* Now, parse the rest of the URI */
559
+ while (uriState->part_id < AMPS_URI_ERROR)
560
+ {
561
+ amps_uri_parse(uri, uriLength, uriState);
562
+ if (uriState->part_id == AMPS_URI_OPTION_KEY)
563
+ {
564
+ key = uriState->part;
565
+ keyLength = uriState->part_length;
566
+ }
567
+ else if (uriState->part_id == AMPS_URI_OPTION_VALUE)
568
+ {
569
+ if (amps_tcps_apply_socket_property(fd, key, keyLength,
570
+ uriState->part, uriState->part_length) != AMPS_E_OK)
571
+ {
572
+ return AMPS_E_URI;
573
+ }
574
+ }
575
+ }
576
+ if (uriState->part_id == AMPS_URI_ERROR)
577
+ {
578
+ return AMPS_E_URI;
579
+ }
580
+ return AMPS_E_OK;
581
+ }
582
+
583
+ int
584
+ amps_tcps_apply_ssl_properties(_amps_SSL* ssl, const char* uri,
585
+ size_t uriLength, amps_uri_state* uriState)
586
+ {
587
+ int rc = 1;
588
+ const char* key = NULL;
589
+ size_t keyLength = 0;
590
+ while (uriState->part_id < AMPS_URI_ERROR)
591
+ {
592
+ amps_uri_parse(uri, uriLength, uriState);
593
+ if (uriState->part_id == AMPS_URI_OPTION_KEY)
594
+ {
595
+ key = uriState->part;
596
+ keyLength = uriState->part_length;
597
+ }
598
+ else if (uriState->part_id == AMPS_URI_OPTION_VALUE)
599
+ {
600
+ if (keyLength == 3 && memcmp(key, "sni", keyLength) == 0)
601
+ {
602
+ char* hostname = (char*)malloc(uriState->part_length + 1);
603
+ memcpy(hostname, uriState->part, uriState->part_length);
604
+ hostname[uriState->part_length] = '\0';
605
+ rc = _amps_SSL_ctrl(ssl, AMPS_SSL_CTRL_SET_TLSEXT_HOSTNAME, AMPS_TLSEXT_NAMETYPE_host_name, hostname);
606
+ free(hostname);
607
+ if (rc != 1)
608
+ {
609
+ return rc;
610
+ }
611
+ }
612
+ }
613
+ }
614
+ return rc;
615
+ }
616
+
617
+ amps_result amps_tcps_set_idle_time(amps_handle transport, int idleTimeMillis);
618
+ amps_result amps_tcps_connect(amps_handle transport, const amps_char* address)
619
+ {
620
+ AMPS_JOIN_DECLARE();
621
+ amps_tcps_t* me = (amps_tcps_t*)transport;
622
+ char* host = NULL, *port = NULL, *protocol = NULL;
623
+ amps_uri_state uri_state_socket_props, uri_state_addr_props, uri_state_ssl_props;
624
+ amps_ip_protocol_preference ip_proto_prefer = AMPS_DEFAULT_IP_PROTOCOL_PREFERENCE;
625
+ int ip_proto_pref_override = 0;
626
+ int rc, sysError, i;
627
+ amps_result result = AMPS_E_OK;
628
+ struct addrinfo* pAddrInfo = NULL, addrhints;
629
+ size_t address_length = 0;
630
+ AMPS_SOCKET fd = AMPS_INVALID_SOCKET;
631
+ _amps_SSL* ssl = 0;
632
+
633
+ #ifdef _WIN32
634
+ WSADATA wsaData;
635
+ rc = WSAStartup(MAKEWORD(2, 2), &wsaData);
636
+ if (rc != 0)
637
+ {
638
+ amps_tcps_set_error(me, "Windows Sockets could not be started.");
639
+ return AMPS_E_MEMORY;
640
+ }
641
+ #endif
642
+
643
+ AMPS_LOCK(&me->lock);
644
+ #ifndef _WIN32
645
+ pthread_cleanup_push(amps_cleanup_unlock_mutex, (void*)&me->lock);
646
+ #endif
647
+ /* if we were previously marked as disconnecting, forget that. */
648
+ AMPS_IEX_LONG(&me->disconnecting, 0);
649
+ AMPS_LOCK(&me->sendLock);
650
+ #ifndef _WIN32
651
+ pthread_cleanup_push(amps_cleanup_unlock_mutex, (void*)&me->sendLock);
652
+ #endif
653
+ fd = AMPS_IEX_GET(&me->fd, AMPS_INVALID_SOCKET);
654
+ ssl = (_amps_SSL*)AMPS_IEX_GET(&me->ssl, 0);
655
+
656
+ /* were we previously connected? go ahead and close that. */
657
+ if (ssl)
658
+ {
659
+ rc = _amps_SSL_shutdown(ssl);
660
+ sysError = GET_ERRNO;
661
+ if (rc < 0)
662
+ {
663
+ amps_tcps_set_ssl_error(me, rc, sysError);
664
+ }
665
+ }
666
+ if (fd != AMPS_INVALID_SOCKET)
667
+ {
668
+ /* this is a reconnect */
669
+ shutdown(fd, SHUT_RDWR);
670
+ closesocket(fd);
671
+ fd = AMPS_INVALID_SOCKET;
672
+ }
673
+ AMPS_JOIN(me->thread);
674
+ if (ssl)
675
+ {
676
+ _amps_SSL_free(ssl);
677
+ ssl = 0;
678
+ }
679
+
680
+ /* parse out the address */
681
+ memset(&uri_state_socket_props, 0, sizeof(amps_uri_state));
682
+ memset(&uri_state_addr_props, 0, sizeof(amps_uri_state));
683
+ memset(&uri_state_ssl_props, 0, sizeof(amps_uri_state));
684
+ address_length = strlen(address);
685
+ while (uri_state_addr_props.part_id < AMPS_URI_ERROR)
686
+ {
687
+ amps_uri_parse(address, address_length, &uri_state_addr_props);
688
+ switch (uri_state_addr_props.part_id)
689
+ {
690
+ case AMPS_URI_PROTOCOL:
691
+ protocol = _AMPS_STRNDUP(uri_state_addr_props.part, uri_state_addr_props.part_length);
692
+ me->serializer = amps_message_get_protocol(protocol);
693
+ if (me->serializer == -1)
694
+ {
695
+ amps_tcps_set_error(me,
696
+ "The URI specified an unavailable protocol.");
697
+ result = AMPS_E_URI;
698
+ goto error;
699
+ }
700
+ memcpy(&uri_state_socket_props, &uri_state_addr_props, sizeof(amps_uri_state));
701
+ memcpy(&uri_state_ssl_props, &uri_state_addr_props, sizeof(amps_uri_state));
702
+ break;
703
+ case AMPS_URI_HOST:
704
+ host = _AMPS_STRNDUP(uri_state_addr_props.part, uri_state_addr_props.part_length);
705
+ break;
706
+ case AMPS_URI_PORT:
707
+ port = _AMPS_STRNDUP(uri_state_addr_props.part, uri_state_addr_props.part_length);
708
+ break;
709
+ case AMPS_URI_OPTION_KEY:
710
+ if (uri_state_addr_props.part_length == 18 && memcmp(uri_state_addr_props.part, "ip_protocol_prefer", uri_state_addr_props.part_length) == 0)
711
+ {
712
+ ip_proto_pref_override = 1;
713
+ }
714
+ break;
715
+ case AMPS_URI_OPTION_VALUE:
716
+ if (ip_proto_pref_override)
717
+ {
718
+ if (uri_state_addr_props.part_length == 4 && memcmp(uri_state_addr_props.part, "ipv4", uri_state_addr_props.part_length) == 0)
719
+ {
720
+ ip_proto_prefer = AMPS_PREFER_IPV4;
721
+ }
722
+ else if (uri_state_addr_props.part_length == 4 && memcmp(uri_state_addr_props.part, "ipv6", uri_state_addr_props.part_length) == 0)
723
+ {
724
+ ip_proto_prefer = AMPS_PREFER_IPV6;
725
+ }
726
+ else
727
+ {
728
+ amps_tcps_set_error(me,
729
+ "The URI specified an invalid ip protocol preference.");
730
+ result = AMPS_E_URI;
731
+ goto error;
732
+ }
733
+ }
734
+ break;
735
+ default:
736
+ break;
737
+ }
738
+ }
739
+ if (uri_state_addr_props.part_id == AMPS_URI_ERROR)
740
+ {
741
+ amps_tcps_set_error(me, "URI format invalid.");
742
+ result = AMPS_E_URI;
743
+ goto error;
744
+ }
745
+
746
+ /* use getaddrinfo() to find an appropriate address */
747
+ memset(&addrhints, 0, sizeof(struct addrinfo));
748
+ addrhints.ai_socktype = SOCK_STREAM;
749
+ addrhints.ai_protocol = 0;
750
+ addrhints.ai_flags = (AI_V4MAPPED | AI_ADDRCONFIG);
751
+ addrhints.ai_family = ip_proto_prefer == AMPS_PREFER_IPV6 ? AF_INET6 : AF_INET; /* Try the preferred protocol first */
752
+
753
+ rc = getaddrinfo(host, port, &addrhints, &pAddrInfo);
754
+ sysError = GET_ERRNO;
755
+ #ifdef _WIN32
756
+ if (rc == EAI_FAMILY || rc == EAI_NONAME || rc == EAI_AGAIN || rc == EAI_SERVICE)
757
+ #else
758
+ if (rc == EAI_ADDRFAMILY || rc == EAI_NONAME || rc == EAI_AGAIN || rc == EAI_SERVICE)
759
+ #endif
760
+ {
761
+ // didn't find any addresses of the preferred protocol, try the other one.
762
+ addrhints.ai_family = ip_proto_prefer == AMPS_PREFER_IPV6 ? AF_INET : AF_INET6;
763
+ rc = getaddrinfo(host, port, &addrhints, &pAddrInfo);
764
+ sysError = GET_ERRNO;
765
+ if (rc != 0)
766
+ {
767
+ /* Try preferred protocol again without AI_ADDRCONFIG */
768
+ addrhints.ai_flags = AI_V4MAPPED;
769
+ addrhints.ai_family = ip_proto_prefer == AMPS_PREFER_IPV6 ? AF_INET6 : AF_INET;
770
+ rc = getaddrinfo(host, port, &addrhints, &pAddrInfo);
771
+ sysError = GET_ERRNO;
772
+ }
773
+ }
774
+ if (rc != 0)
775
+ {
776
+ result = AMPS_E_CONNECTION_REFUSED;
777
+ amps_tcps_set_hostname_error(me, rc, sysError);
778
+ freeaddrinfo(pAddrInfo);
779
+ goto error;
780
+ }
781
+
782
+ me->fd = socket(pAddrInfo->ai_family, pAddrInfo->ai_socktype, pAddrInfo->ai_protocol);
783
+ sysError = GET_ERRNO;
784
+ if (me->fd == AMPS_INVALID_SOCKET)
785
+ {
786
+ freeaddrinfo(pAddrInfo);
787
+ amps_tcps_set_socket_error(me, sysError);
788
+ result = AMPS_E_CONNECTION_REFUSED;
789
+ goto error;
790
+ }
791
+
792
+ /* apply socket properties */
793
+ if (amps_tcps_apply_socket_properties(me->fd, address, address_length, &uri_state_socket_props) != AMPS_E_OK)
794
+ {
795
+ freeaddrinfo(pAddrInfo);
796
+ fd = AMPS_IEX_GET(&me->fd, AMPS_INVALID_SOCKET);
797
+ amps_tcps_set_error(me, "The URI specified invalid properties.");
798
+ result = AMPS_E_URI;
799
+ goto error;
800
+ }
801
+ #ifdef __APPLE__
802
+ rc = 1; /* Set NOSIGPIPE to ON */
803
+ if (setsockopt(me->fd, SOL_SOCKET, SO_NOSIGPIPE, &rc, sizeof(rc)) < 0)
804
+ {
805
+ freeaddrinfo(pAddrInfo);
806
+ fd = AMPS_IEX_GET(&me->fd, AMPS_INVALID_SOCKET);
807
+ amps_tcps_set_error(me, "Failed to set no SIGPIPE.");
808
+ result = AMPS_E_CONNECTION;
809
+ goto error;
810
+ }
811
+ #endif
812
+
813
+ rc = connect(me->fd, pAddrInfo->ai_addr,
814
+ (socklen_t)pAddrInfo->ai_addrlen);
815
+ sysError = GET_ERRNO;
816
+ freeaddrinfo(pAddrInfo);
817
+ if (rc == -1)
818
+ {
819
+ fd = AMPS_IEX_GET(&me->fd, AMPS_INVALID_SOCKET);
820
+ amps_tcps_set_socket_error(me, sysError);
821
+ result = AMPS_E_CONNECTION_REFUSED;
822
+ goto error;
823
+ }
824
+
825
+ /* On first use, initialize an SSL context if one hasn't been created. */
826
+ if (!_amps_ssl_ctx)
827
+ {
828
+ rc = amps_ssl_init(NULL);
829
+ if (rc)
830
+ {
831
+ fd = AMPS_IEX_GET(&me->fd, AMPS_INVALID_SOCKET);
832
+ amps_tcps_set_error(me, "Could not initialize an SSL context.");
833
+ result = AMPS_E_SSL;
834
+ goto error;
835
+ }
836
+ }
837
+ /* Handshake via SSL */
838
+ _amps_ERR_clear_error();
839
+ if (!me->ssl)
840
+ {
841
+ me->ssl = _amps_SSL_new(_amps_ssl_ctx);
842
+ }
843
+ if (me->ssl == 0)
844
+ {
845
+ fd = AMPS_IEX_GET(&me->fd, AMPS_INVALID_SOCKET);
846
+ amps_tcps_set_error_stack_error(me);
847
+ result = AMPS_E_SSL;
848
+ goto error;
849
+ }
850
+
851
+ rc = _amps_SSL_set_fd(me->ssl, (int)me->fd);
852
+ sysError = GET_ERRNO;
853
+ if (rc != 1)
854
+ {
855
+ fd = AMPS_IEX_GET(&me->fd, AMPS_INVALID_SOCKET);
856
+ ssl = (_amps_SSL*)AMPS_IEX_GET(&me->ssl, 0);
857
+ amps_tcps_set_ssl_error(me, rc, sysError);
858
+ result = AMPS_E_SSL;
859
+ goto error;
860
+ }
861
+
862
+ rc = amps_tcps_apply_ssl_properties(me->ssl, address, address_length, &uri_state_ssl_props);
863
+ sysError = GET_ERRNO;
864
+ if (rc != 1)
865
+ {
866
+ fd = AMPS_IEX_GET(&me->fd, AMPS_INVALID_SOCKET);
867
+ ssl = (_amps_SSL*)AMPS_IEX_GET(&me->ssl, 0);
868
+ amps_tcps_set_ssl_error(me, rc, sysError);
869
+ result = AMPS_E_SSL;
870
+ goto error;
871
+ }
872
+
873
+ _amps_SSL_ctrl(me->ssl, AMPS_SSL_CTRL_MODE, AMPS_SSL_AUTO_RETRY, NULL);
874
+
875
+ rc = _amps_SSL_connect(me->ssl);
876
+ sysError = GET_ERRNO;
877
+ if (rc != 1)
878
+ {
879
+ fd = AMPS_IEX_GET(&me->fd, AMPS_INVALID_SOCKET);
880
+ ssl = (_amps_SSL*)AMPS_IEX_GET(&me->ssl, 0);
881
+ amps_tcps_set_ssl_error(me, rc, sysError);
882
+ result = AMPS_E_SSL;
883
+ goto error;
884
+ }
885
+
886
+ // tcps transport must use read with a timeout.
887
+ amps_tcps_set_idle_time(transport, 100);
888
+
889
+ /* Increase the connection version now, so that anyone else attempting a reconnect knows
890
+ * that they may not need to. */
891
+ me->connectionVersion++;
892
+ result = AMPS_E_OK;
893
+
894
+ /* and, start up a new reader thread */
895
+ if (me->threadCreatedCallback)
896
+ {
897
+ AMPS_IEX(&me->threadCreatedCallbackResult, -1);
898
+ }
899
+ #ifdef _WIN32
900
+ me->threadH = CreateThread(NULL, 0,
901
+ (LPTHREAD_START_ROUTINE)amps_tcps_threaded_reader,
902
+ me, CREATE_SUSPENDED, (LPDWORD)&me->thread);
903
+ /* Now that me->thread is populated, we can start the thread.
904
+ * important to do it in two steps, since we use me->thread as a poor-man's cancellation mechanism */
905
+ if (me->threadH)
906
+ {
907
+ ResumeThread(me->threadH);
908
+ }
909
+ else
910
+ {
911
+ fd = AMPS_IEX_GET(&me->fd, AMPS_INVALID_SOCKET);
912
+ ssl = (_amps_SSL*)AMPS_IEX_GET(&me->ssl, 0);
913
+ amps_tcps_set_error(me, "Failed to create thread for receive");
914
+ result = AMPS_E_MEMORY;
915
+ goto error;
916
+ }
917
+
918
+ #else
919
+ rc = pthread_create((pthread_t*)(&me->thread), NULL,
920
+ &amps_tcps_threaded_reader, me);
921
+ if (rc != 0)
922
+ {
923
+ fd = AMPS_IEX_GET(&me->fd, AMPS_INVALID_SOCKET);
924
+ ssl = AMPS_IEX_GET(&me->ssl, 0);
925
+ amps_tcps_set_error(me, "Failed to create thread for receive");
926
+ result = AMPS_E_MEMORY;
927
+ goto error;
928
+ }
929
+ #endif
930
+ for (i = 0; i < AMPS_THREAD_START_TIMEOUT && me->threadCreatedCallbackResult == -1; ++i)
931
+ {
932
+ AMPS_SLEEP(4);
933
+ }
934
+ result = (amps_result)me->threadCreatedCallbackResult;
935
+ if (me->threadCreatedCallbackResult == -1)
936
+ {
937
+ amps_tcps_set_error(me, "Thread created callback failed to return in a timely manner or returned -1.");
938
+ result = AMPS_E_MEMORY;
939
+ }
940
+ if (result != AMPS_E_OK)
941
+ {
942
+ fd = AMPS_IEX_GET(&me->fd, AMPS_INVALID_SOCKET);
943
+ ssl = (_amps_SSL*)AMPS_IEX_GET(&me->ssl, 0);
944
+ amps_tcps_set_error(me, "Thread creation callback failed");
945
+ }
946
+
947
+ error:
948
+ if (result != AMPS_E_OK)
949
+ {
950
+ if (ssl)
951
+ {
952
+ rc = _amps_SSL_shutdown(ssl);
953
+ sysError = GET_ERRNO;
954
+ if (rc < 0)
955
+ {
956
+ amps_tcps_set_ssl_error(me, rc, sysError);
957
+ }
958
+ }
959
+ if (fd != AMPS_INVALID_SOCKET)
960
+ {
961
+ shutdown(fd, SHUT_RDWR);
962
+ closesocket(fd);
963
+ }
964
+ if (ssl)
965
+ {
966
+ _amps_SSL_free(ssl);
967
+ ssl = 0;
968
+ }
969
+ #ifdef _WIN32
970
+ me->thread = 0;
971
+ #else
972
+ me->thread = (pthread_t)0;
973
+ #endif
974
+ }
975
+ free(protocol);
976
+ free(host);
977
+ free(port);
978
+ AMPS_UNLOCK(&me->sendLock);
979
+ AMPS_UNLOCK(&me->lock);
980
+ #ifndef _WIN32
981
+ pthread_cleanup_pop(0);
982
+ pthread_cleanup_pop(0);
983
+ #endif
984
+ return result;
985
+
986
+ }
987
+
988
+ amps_result amps_tcps_set_receiver(amps_handle transport, amps_handler receiver, void* userData)
989
+ {
990
+ amps_tcps_t* me = (amps_tcps_t*)transport;
991
+ me->messageHandlerUserData = userData;
992
+ me->messageHandler = receiver;
993
+ return AMPS_E_OK;
994
+ }
995
+
996
+ amps_result amps_tcps_set_predisconnect(amps_handle transport,
997
+ amps_predisconnect_handler receiver,
998
+ void* userData)
999
+ {
1000
+ amps_tcps_t* me = (amps_tcps_t*)transport;
1001
+ me->predisconnectHandlerUserData = userData;
1002
+ me->predisconnectHandler = receiver;
1003
+ return AMPS_E_OK;
1004
+ }
1005
+
1006
+ amps_result amps_tcps_set_disconnect(amps_handle transport, amps_handler receiver, void* userData)
1007
+ {
1008
+ amps_tcps_t* me = (amps_tcps_t*)transport;
1009
+ me->disconnectHandlerUserData = userData;
1010
+ me->disconnectHandler = receiver;
1011
+ return AMPS_E_OK;
1012
+ }
1013
+
1014
+ void amps_tcps_close(amps_handle transport)
1015
+ {
1016
+ AMPS_JOIN_DECLARE();
1017
+ amps_tcps_t* me = (amps_tcps_t*)transport;
1018
+ AMPS_SOCKET fd = AMPS_INVALID_SOCKET;
1019
+ _amps_SSL* ssl = 0;
1020
+ AMPS_IEX_LONG(&me->disconnecting, 1);
1021
+ AMPS_LOCK(&me->sendLock);
1022
+ #ifndef _WIN32
1023
+ pthread_cleanup_push(amps_cleanup_unlock_mutex, (void*)&me->sendLock);
1024
+ #endif
1025
+ fd = AMPS_IEX_GET(&me->fd, AMPS_INVALID_SOCKET);
1026
+ ssl = (_amps_SSL*)AMPS_IEX_GET(&me->ssl, 0);
1027
+ AMPS_UNLOCK(&me->sendLock);
1028
+ #ifndef _WIN32
1029
+ pthread_cleanup_pop(0);
1030
+ #endif
1031
+ AMPS_SPIN_LOCK_UNLIMITED(&me->lock);
1032
+ #ifndef _WIN32
1033
+ pthread_cleanup_push(amps_cleanup_unlock_mutex, (void*)&me->lock);
1034
+ #endif
1035
+ if (ssl)
1036
+ {
1037
+ int rc = _amps_SSL_shutdown(ssl);
1038
+ int sysError = GET_ERRNO;
1039
+ if (rc == 0 && fd != AMPS_INVALID_SOCKET)
1040
+ {
1041
+ // attempt to wait for the server to send back the matching close notify.
1042
+ struct timeval tv;
1043
+ fd_set readfds, exceptfds;
1044
+ tv.tv_sec = 0;
1045
+ tv.tv_usec = 10000;
1046
+ FD_ZERO(&readfds);
1047
+ FD_SET(fd, &readfds);
1048
+ FD_ZERO(&exceptfds);
1049
+ FD_SET(fd, &exceptfds);
1050
+ #ifdef _WIN32
1051
+ select(1, &readfds, 0, &exceptfds, &tv);
1052
+ #else
1053
+ select(fd + 1, &readfds, 0, &exceptfds, &tv);
1054
+ #endif
1055
+ rc = _amps_SSL_shutdown(ssl);
1056
+ }
1057
+ if (rc < 0)
1058
+ {
1059
+ amps_tcps_set_ssl_error(me, rc, sysError);
1060
+ }
1061
+ }
1062
+ if (fd != AMPS_INVALID_SOCKET)
1063
+ {
1064
+ shutdown(fd, SHUT_RDWR);
1065
+ closesocket(fd);
1066
+ }
1067
+ if (ssl)
1068
+ {
1069
+ _amps_SSL_free(ssl);
1070
+ }
1071
+ AMPS_UNLOCK(&me->lock);
1072
+ #ifndef _WIN32
1073
+ pthread_cleanup_pop(0);
1074
+ #endif
1075
+ AMPS_JOIN(me->thread);
1076
+ }
1077
+
1078
+ void amps_tcps_destroy(amps_handle transport)
1079
+ {
1080
+ AMPS_JOIN_DECLARE();
1081
+ amps_tcps_t* me = (amps_tcps_t*)transport;
1082
+ AMPS_SOCKET fd = AMPS_INVALID_SOCKET;
1083
+ _amps_SSL* ssl = 0;
1084
+ amps_atfork_remove(me, (_amps_atfork_callback_function)amps_tcps_atfork_handler);
1085
+ AMPS_LOCK(&me->sendLock);
1086
+ #ifndef _WIN32
1087
+ pthread_cleanup_push(amps_cleanup_unlock_mutex, (void*)&me->sendLock);
1088
+ #endif
1089
+ fd = AMPS_IEX_GET(&me->fd, AMPS_INVALID_SOCKET);
1090
+ ssl = (_amps_SSL*)AMPS_IEX_GET(&me->ssl, 0);
1091
+ AMPS_UNLOCK(&me->sendLock);
1092
+ #ifndef _WIN32
1093
+ pthread_cleanup_pop(0);
1094
+ #endif
1095
+ AMPS_LOCK(&me->lock);
1096
+ #ifndef _WIN32
1097
+ pthread_cleanup_push(amps_cleanup_unlock_mutex, (void*)&me->lock);
1098
+ #endif
1099
+ #if __STDC_VERSION__ >= 201100
1100
+ me->destroying = true;
1101
+ me->disconnecting = true;
1102
+ #else
1103
+ AMPS_IEX_LONG(&me->destroying, 1);
1104
+ AMPS_IEX_LONG(&me->disconnecting, 1);
1105
+ #endif
1106
+ if (ssl)
1107
+ {
1108
+ int rc = _amps_SSL_shutdown(ssl);
1109
+ int sysError = GET_ERRNO;
1110
+ if (rc == 0 && fd != AMPS_INVALID_SOCKET)
1111
+ {
1112
+ // attempt to wait for the server to send back the matching close notify.
1113
+ struct timeval tv;
1114
+ fd_set readfds, exceptfds;
1115
+ tv.tv_sec = 0;
1116
+ tv.tv_usec = 10000;
1117
+ FD_ZERO(&readfds);
1118
+ FD_SET(fd, &readfds);
1119
+ FD_ZERO(&exceptfds);
1120
+ FD_SET(fd, &exceptfds);
1121
+ #ifdef _WIN32
1122
+ select(1, &readfds, 0, &exceptfds, &tv);
1123
+ #else
1124
+ select(fd + 1, &readfds, 0, &exceptfds, &tv);
1125
+ #endif
1126
+ rc = _amps_SSL_shutdown(ssl);
1127
+ }
1128
+ if (rc < 0)
1129
+ {
1130
+ amps_tcps_set_ssl_error(me, rc, sysError);
1131
+ }
1132
+ }
1133
+ if (fd != AMPS_INVALID_SOCKET)
1134
+ {
1135
+ shutdown(fd, SHUT_RDWR);
1136
+ closesocket(fd);
1137
+ }
1138
+ if (ssl)
1139
+ {
1140
+ _amps_SSL_free(ssl);
1141
+ }
1142
+
1143
+ AMPS_UNLOCK(&me->lock);
1144
+ #ifndef _WIN32
1145
+ pthread_cleanup_pop(0);
1146
+ #endif
1147
+ AMPS_JOIN(me->thread);
1148
+ AMPS_SLEEP(1);
1149
+ free(me->buf);
1150
+ /* Hopefully, nobody else is using me right now. */
1151
+
1152
+ AMPS_KILLLOCK(&me->lock);
1153
+ AMPS_KILLLOCK(&me->sendLock);
1154
+
1155
+ free(me);
1156
+ }
1157
+
1158
+ /* called with me->lock not already taken */
1159
+ amps_result amps_tcps_handle_disconnect(
1160
+ amps_tcps_t* me, unsigned failedConnectionVersion)
1161
+ {
1162
+ AMPS_SOCKET fd = AMPS_INVALID_SOCKET;
1163
+ _amps_SSL* ssl = 0;
1164
+ #ifndef _WIN32
1165
+ int cancelState = 0;
1166
+ int unusedCancelState = 0;
1167
+ #endif
1168
+ amps_result result = AMPS_E_OK;
1169
+ AMPS_LOCK(&me->sendLock);
1170
+ #ifndef _WIN32
1171
+ pthread_cleanup_push(amps_cleanup_unlock_mutex, (void*)&me->sendLock);
1172
+ #endif
1173
+ fd = AMPS_IEX_GET(&me->fd, AMPS_INVALID_SOCKET);
1174
+ ssl = (_amps_SSL*)AMPS_IEX_GET(&me->ssl, 0);
1175
+ AMPS_UNLOCK(&me->sendLock);
1176
+ #ifndef _WIN32
1177
+ pthread_cleanup_pop(0);
1178
+ #endif
1179
+ /* close what we have right now. */
1180
+ if (ssl)
1181
+ {
1182
+ int rc = _amps_SSL_shutdown(ssl);
1183
+ int sysError = GET_ERRNO;
1184
+ if (rc == 0 && fd != AMPS_INVALID_SOCKET)
1185
+ {
1186
+ // attempt to wait for the server to send back the matching close notify.
1187
+ struct timeval tv;
1188
+ fd_set readfds, exceptfds;
1189
+ tv.tv_sec = 0;
1190
+ tv.tv_usec = 10000;
1191
+ FD_ZERO(&readfds);
1192
+ FD_SET(fd, &readfds);
1193
+ FD_ZERO(&exceptfds);
1194
+ FD_SET(fd, &exceptfds);
1195
+ #ifdef _WIN32
1196
+ select(1, &readfds, 0, &exceptfds, &tv);
1197
+ #else
1198
+ select(fd + 1, &readfds, 0, &exceptfds, &tv);
1199
+ #endif
1200
+ rc = _amps_SSL_shutdown(ssl);
1201
+ }
1202
+ if (rc < 0)
1203
+ {
1204
+ amps_tcps_set_ssl_error(me, rc, sysError);
1205
+ }
1206
+ }
1207
+ if (fd != AMPS_INVALID_SOCKET)
1208
+ {
1209
+ shutdown(fd, SHUT_RDWR);
1210
+ closesocket(fd);
1211
+ }
1212
+ if (ssl)
1213
+ {
1214
+ _amps_SSL_free(ssl);
1215
+ }
1216
+
1217
+ /* first let waiters know that we've failed. */
1218
+ me->predisconnectHandler(me, failedConnectionVersion, me->predisconnectHandlerUserData);
1219
+
1220
+ /* Now take the lock on self.
1221
+ * Use a spin, the only case where it might fail should be if a recv
1222
+ * thread ends up here while a send thread is already handling disconnect
1223
+ * and it is trying to join this thread in disconnect. */
1224
+ if (AMPS_SPIN_LOCK(&me->lock) == 0)
1225
+ {
1226
+ return AMPS_E_RETRY;
1227
+ }
1228
+ #ifndef _WIN32
1229
+ pthread_cleanup_push(amps_cleanup_unlock_mutex, (void*)&me->lock);
1230
+ #endif
1231
+
1232
+ /* if we're being destroyed, get out of here; don't worry about unlocking */
1233
+ if (me->destroying)
1234
+ {
1235
+ result = AMPS_E_DISCONNECTED; return result;
1236
+ }
1237
+
1238
+ /* a new connection is available. let someone else try. */
1239
+ if (failedConnectionVersion != me->connectionVersion)
1240
+ {
1241
+ result = AMPS_E_RETRY;
1242
+ goto error;
1243
+ }
1244
+
1245
+ /* if we're disconnecting, get out of here; don't reconnect */
1246
+ if (me->disconnecting)
1247
+ {
1248
+ result = AMPS_E_DISCONNECTED;
1249
+ goto error;
1250
+ }
1251
+
1252
+ #ifndef _WIN32
1253
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cancelState);
1254
+ #endif
1255
+ /* Call the disconect handler. */
1256
+ result = me->disconnectHandler(me, me->disconnectHandlerUserData);
1257
+ #ifndef _WIN32
1258
+ pthread_setcancelstate(cancelState, &unusedCancelState);
1259
+ #endif
1260
+ if (result == AMPS_E_OK)
1261
+ {
1262
+ result = AMPS_E_RETRY;
1263
+ }
1264
+
1265
+ error:
1266
+ #ifndef _WIN32
1267
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cancelState);
1268
+ #endif
1269
+ AMPS_UNLOCK(&me->lock);
1270
+ #ifndef _WIN32
1271
+ pthread_cleanup_pop(0);
1272
+ pthread_setcancelstate(cancelState, &unusedCancelState);
1273
+ #endif
1274
+
1275
+ return result;
1276
+ }
1277
+
1278
+ void amps_tcps_handle_stream_corruption(
1279
+ amps_tcps_t* me, unsigned failedConnectionVersion)
1280
+ {
1281
+ amps_tcps_set_error(me, "The connection appears corrupt. Disconnecting.");
1282
+ amps_tcps_handle_disconnect(me, failedConnectionVersion);
1283
+ }
1284
+
1285
+
1286
+ amps_result
1287
+ amps_tcps_send_with_version(amps_handle transport,
1288
+ amps_handle message,
1289
+ unsigned* version_out)
1290
+ {
1291
+ amps_result result = AMPS_E_OK;
1292
+ amps_tcps_t* me = (amps_tcps_t*)transport;
1293
+ size_t len = 16 * 1024;
1294
+ int bytesWritten = -1;
1295
+ unsigned int bytesWrittenN = 0;
1296
+ int bytesSent = 0;
1297
+
1298
+ *version_out = me->connectionVersion;
1299
+
1300
+ if (me->disconnecting)
1301
+ {
1302
+ amps_tcps_set_error(me, "Disconnecting.");
1303
+ return AMPS_E_DISCONNECTED;
1304
+ }
1305
+
1306
+ if (me->fd == AMPS_INVALID_SOCKET)
1307
+ {
1308
+ amps_tcps_set_error(me, "Not connected.");
1309
+ return AMPS_E_DISCONNECTED;
1310
+ }
1311
+
1312
+ /* serialize */
1313
+ AMPS_LOCK(&me->sendLock);
1314
+ #ifndef _WIN32
1315
+ pthread_cleanup_push(amps_cleanup_unlock_mutex, (void*)&me->sendLock);
1316
+ #endif
1317
+ if (me->ssl == 0)
1318
+ {
1319
+ amps_tcps_set_error(me, "Not connected.");
1320
+ result = AMPS_E_CONNECTION;
1321
+ goto error;
1322
+ }
1323
+ while (bytesWritten < 0)
1324
+ {
1325
+ if (me->buf == NULL)
1326
+ {
1327
+ me->buf = (char*)malloc(len);
1328
+ if (me->buf == NULL)
1329
+ {
1330
+ amps_tcps_set_error(me, "Unable to allocate memory to send message.");
1331
+ result = AMPS_E_MEMORY;
1332
+ goto error;
1333
+ }
1334
+ me->capacity = len;
1335
+ }
1336
+ else
1337
+ {
1338
+ len = me->capacity;
1339
+ }
1340
+ /* reserve 4 bytes for the length of the message */
1341
+ bytesWritten = amps_message_serialize(message, me->serializer, (me->buf) + 4, len - 4);
1342
+ /* amps_message_serialize could have written 0 bytes.
1343
+ * who are we to judge? If it returns less than 0,
1344
+ * there wasn't enough room. */
1345
+ if (bytesWritten >= 0)
1346
+ {
1347
+ break;
1348
+ }
1349
+ /* free this buffer, allocate a larger buffer next time */
1350
+ free(me->buf);
1351
+ me->capacity = 0;
1352
+ me->buf = NULL;
1353
+ len = (size_t)((double)len * 1.5);
1354
+ }
1355
+ /* once we're done, we don't free buf -- it hangs around until we need it next time.
1356
+ * record the message length all up in the first 4 bytes. */
1357
+ bytesWrittenN = htonl((unsigned int)bytesWritten);
1358
+ me->filterFunction((const unsigned char*)(me->buf + 4), (size_t)bytesWritten, 0, me->filterUserData);
1359
+ *((unsigned int*)(me->buf)) = bytesWrittenN;
1360
+ bytesWritten += 4;
1361
+ /*now, send */
1362
+ while (bytesSent < bytesWritten)
1363
+ {
1364
+ int bytesWrittenThisTime;
1365
+ bytesWrittenThisTime = _amps_SSL_write(me->ssl, (me->buf) + bytesSent, bytesWritten - bytesSent);
1366
+ if (bytesWrittenThisTime <= 0)
1367
+ {
1368
+ // If error code is want read or want write, this is retryable
1369
+ int errorcode_ = _amps_SSL_get_error(me->ssl, bytesWrittenThisTime);
1370
+ if (errorcode_ == AMPS_SSL_ERROR_WANT_READ
1371
+ || errorcode_ == AMPS_SSL_ERROR_WANT_WRITE)
1372
+ {
1373
+ AMPS_UNLOCK(&me->sendLock);
1374
+ if (me->disconnecting)
1375
+ {
1376
+ amps_tcps_set_error(me, "Disconnecting.");
1377
+ result = AMPS_E_DISCONNECTED;
1378
+ AMPS_LOCK(&me->sendLock);
1379
+ goto error;
1380
+ }
1381
+ if (me->fd == AMPS_INVALID_SOCKET)
1382
+ {
1383
+ amps_tcps_set_error(me, "Not connected.");
1384
+ result = AMPS_E_DISCONNECTED;
1385
+ AMPS_LOCK(&me->sendLock);
1386
+ goto error;
1387
+ }
1388
+ AMPS_LOCK(&me->sendLock);
1389
+ if (me->ssl == 0)
1390
+ {
1391
+ amps_tcps_set_error(me, "Not connected.");
1392
+ result = AMPS_E_CONNECTION;
1393
+ goto error;
1394
+ }
1395
+ continue;
1396
+ }
1397
+ /* record the error */
1398
+ amps_tcps_set_error(me, "The connection is closed.");
1399
+ result = AMPS_E_DISCONNECTED;
1400
+ goto error;
1401
+ }
1402
+ bytesSent += bytesWrittenThisTime;
1403
+ }
1404
+ error:
1405
+ AMPS_UNLOCK(&me->sendLock);
1406
+ #ifndef _WIN32
1407
+ pthread_cleanup_pop(0);
1408
+ #endif
1409
+
1410
+ return result;
1411
+ }
1412
+
1413
+ amps_result
1414
+ amps_tcps_send(amps_handle transport,
1415
+ amps_handle message)
1416
+ {
1417
+ unsigned version_out;
1418
+ return amps_tcps_send_with_version(transport, message, &version_out);
1419
+ }
1420
+
1421
+ /* Returns # bytes read, 0 if a timeout occurred without a read,
1422
+ * and <0 if an error occurred.
1423
+ */
1424
+ int amps_tcps_locked_read(amps_tcps_t* me_,
1425
+ char* readPoint_,
1426
+ int bytes_,
1427
+ int* pErrorcode_)
1428
+ {
1429
+ int rc = 0;
1430
+ int fd = (int)me_->fd;
1431
+ int locked = 0;
1432
+
1433
+ while (locked == 0)
1434
+ {
1435
+ if (me_->disconnecting || fd != me_->fd || !me_->ssl
1436
+ || me_->thread != AMPS_CURRENT_THREAD() /* our cancellation mechanism on win32 */
1437
+ || me_->destroying || fd == AMPS_INVALID_SOCKET)
1438
+ {
1439
+ return 0;
1440
+ }
1441
+ locked = (int)AMPS_SPIN_LOCK(&me_->sendLock);
1442
+ }
1443
+ if (me_->disconnecting || fd != me_->fd || !me_->ssl
1444
+ || me_->thread != AMPS_CURRENT_THREAD() /* our cancellation mechanism on win32 */
1445
+ || me_->destroying || fd == AMPS_INVALID_SOCKET)
1446
+ {
1447
+ AMPS_UNLOCK(&me_->sendLock);
1448
+ return 0;
1449
+ }
1450
+ // Use select to wait for data if none already exists on the ssl.
1451
+ if (!_amps_SSL_pending(me_->ssl))
1452
+ {
1453
+ struct timeval tv;
1454
+ fd_set readfds, exceptfds;
1455
+ tv.tv_sec = 0;
1456
+ tv.tv_usec = 1000;
1457
+ FD_ZERO(&readfds);
1458
+ FD_SET(fd, &readfds);
1459
+ FD_ZERO(&exceptfds);
1460
+ FD_SET(fd, &exceptfds);
1461
+ AMPS_UNLOCK(&me_->sendLock);
1462
+ #ifdef _WIN32
1463
+ if (select(1, &readfds, 0, &exceptfds, &tv) == 0)
1464
+ #else
1465
+ if (select(fd + 1, &readfds, 0, &exceptfds, &tv) == 0)
1466
+ #endif
1467
+ {
1468
+ return 0;
1469
+ }
1470
+ AMPS_LOCK(&me_->sendLock);
1471
+ if (me_->disconnecting || fd != me_->fd || !me_->ssl
1472
+ || me_->thread != AMPS_CURRENT_THREAD() /* our cancellation mechanism on win32 */
1473
+ || me_->destroying || fd == AMPS_INVALID_SOCKET)
1474
+ {
1475
+ AMPS_UNLOCK(&me_->sendLock);
1476
+ return 0;
1477
+ }
1478
+ }
1479
+
1480
+ #ifndef _WIN32
1481
+ pthread_cleanup_push(amps_cleanup_unlock_mutex, (void*)&me_->sendLock);
1482
+ #endif
1483
+ rc = _amps_SSL_read(me_->ssl, readPoint_, bytes_);
1484
+ *pErrorcode_ = rc <= 0 ? _amps_SSL_get_error(me_->ssl, rc) : 0;
1485
+
1486
+ AMPS_UNLOCK(&me_->sendLock);
1487
+ #ifndef _WIN32
1488
+ pthread_cleanup_pop(0);
1489
+ #endif
1490
+
1491
+ if (rc <= 0)
1492
+ {
1493
+ if (*pErrorcode_ == AMPS_SSL_ERROR_WANT_READ)
1494
+ {
1495
+ return 0;
1496
+ }
1497
+ // End of stream
1498
+ return -1;
1499
+ }
1500
+ return rc;
1501
+ }
1502
+
1503
+ #ifdef _WIN32
1504
+ DWORD amps_tcps_threaded_reader(void* userData)
1505
+ {
1506
+ DWORD self = GetCurrentThreadId();
1507
+ HANDLE selfH = GetCurrentThread();
1508
+ amps_tcps_t* me = (amps_tcps_t*)userData;
1509
+ if (me->threadCreatedCallback)
1510
+ {
1511
+ amps_result result = me->threadCreatedCallback(selfH,
1512
+ me->threadCreatedCallbackUserData);
1513
+ AMPS_IEX(&me->threadCreatedCallbackResult, (long)result);
1514
+ if (result != AMPS_E_OK)
1515
+ {
1516
+ return (DWORD)0;
1517
+ }
1518
+ }
1519
+ else
1520
+ {
1521
+ AMPS_IEX(&me->threadCreatedCallbackResult, (long)AMPS_E_OK);
1522
+ }
1523
+ #else
1524
+ void* amps_tcps_threaded_reader(void* userData)
1525
+ {
1526
+ int unusedCancelState = 0;
1527
+ amps_tcps_t* me = (amps_tcps_t*)userData;
1528
+ /* Wait for pthread_create to set me->thread */
1529
+ while (me->thread != pthread_self()
1530
+ && !me->disconnecting
1531
+ && !me->destroying)
1532
+ {
1533
+ AMPS_SLEEP(5);
1534
+ }
1535
+ if (me->threadCreatedCallback)
1536
+ {
1537
+ amps_result result = me->threadCreatedCallback(me->thread,
1538
+ me->threadCreatedCallbackUserData);
1539
+ AMPS_IEX(&me->threadCreatedCallbackResult, (long)result);
1540
+ if (result != AMPS_E_OK)
1541
+ {
1542
+ return NULL;
1543
+ }
1544
+ }
1545
+ else
1546
+ {
1547
+ AMPS_IEX(&me->threadCreatedCallbackResult, (long)AMPS_E_OK);
1548
+ }
1549
+ #endif
1550
+ unsigned char* buffer, *newBuffer, *end, *readPoint, *parsePoint;
1551
+
1552
+ unsigned int msglenN;
1553
+ unsigned long msglen, currentPosition, bytesRead = 0;
1554
+ int received;
1555
+ int cancelState = 0;
1556
+ const size_t BUFFER_SIZE = 16 * 1024;
1557
+ const unsigned MAX_MESSAGE_SIZE = 1024 * 1024 * 1024;
1558
+ amps_uint64_t lastReadTime = 0;
1559
+ amps_uint64_t lastIdleTime = 0;
1560
+ amps_handle message;
1561
+
1562
+ /* capture the connection version we are using now. */
1563
+ unsigned connectionVersion = me->connectionVersion;
1564
+ AMPS_SOCKET fd = me->fd;
1565
+
1566
+ lastReadTime = amps_now();
1567
+ lastIdleTime = lastReadTime;
1568
+
1569
+ #ifndef _WIN32
1570
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cancelState);
1571
+ #endif
1572
+ message = amps_message_create(NULL);
1573
+ buffer = (unsigned char*)malloc(BUFFER_SIZE);
1574
+ #ifndef _WIN32
1575
+ pthread_cleanup_push(amps_message_destroy, (void*)message);
1576
+ pthread_cleanup_push(amps_cleanup_free_buffer, (void*)(&buffer));
1577
+ pthread_setcancelstate(cancelState, &unusedCancelState);
1578
+ #endif
1579
+ if (!buffer)
1580
+ {
1581
+ amps_tcps_handle_disconnect(me, connectionVersion);
1582
+ goto cleanup;
1583
+ }
1584
+
1585
+ end = buffer + BUFFER_SIZE;
1586
+ readPoint = buffer;
1587
+ parsePoint = buffer;
1588
+
1589
+ /* while we're open and not disconnecting */
1590
+ while (connectionVersion == me->connectionVersion
1591
+ && !me->disconnecting
1592
+ && fd == me->fd
1593
+ && me->thread == AMPS_CURRENT_THREAD() /* our cancellation mechanism on win32 */
1594
+ )
1595
+ {
1596
+ int errorcode = 0;
1597
+ if (me->destroying)
1598
+ {
1599
+ goto cleanup;
1600
+ }
1601
+ if (me->idleTimeMillis > 0 &&
1602
+ (amps_now() - lastIdleTime) > me->idleTimeMillis)
1603
+ {
1604
+ lastIdleTime = amps_now();
1605
+ #ifndef _WIN32
1606
+ cancelState = 0;
1607
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cancelState);
1608
+ #endif
1609
+ me->messageHandler(0L,
1610
+ me->messageHandlerUserData);
1611
+ #ifndef _WIN32
1612
+ pthread_setcancelstate(cancelState, &unusedCancelState);
1613
+ #endif
1614
+ }
1615
+
1616
+ received = amps_tcps_locked_read(me, (char*) readPoint,
1617
+ (int)(end - readPoint), &errorcode);
1618
+
1619
+ if (received > 0)
1620
+ {
1621
+ /* Call filter function without the 4 byte size */
1622
+ me->filterFunction(readPoint, (size_t)received, 1, me->filterUserData);
1623
+ readPoint += received;
1624
+ lastReadTime = amps_now();
1625
+ }
1626
+ else
1627
+ {
1628
+ // errorcode could be an ssl error code, so check for errno
1629
+ int sysError = GET_ERRNO;
1630
+ if (sysError)
1631
+ {
1632
+ errorcode = sysError;
1633
+ }
1634
+ if (errorcode == SOCK_ERRORCODE(EINTR))
1635
+ {
1636
+ continue;
1637
+ }
1638
+ /* disconnect if not a timeout error, or the user only set a read timeout, or the
1639
+ * read timeout has been exceeded. */
1640
+ if ( (errorcode != 0
1641
+ && ((errorcode != SOCK_ERRORCODE(ETIMEDOUT)
1642
+ && errorcode != SOCK_ERRORCODE(EWOULDBLOCK))
1643
+ || me->idleTimeMillis == 0))
1644
+ || (me->readTimeoutMillis && amps_now() - lastReadTime > me->readTimeoutMillis))
1645
+ {
1646
+ if (!me->disconnecting)
1647
+ {
1648
+ amps_tcps_handle_disconnect(me, connectionVersion);
1649
+ }
1650
+ goto cleanup;
1651
+ }
1652
+ continue;
1653
+ }
1654
+
1655
+ while (readPoint >= parsePoint + 4 &&
1656
+ fd == me->fd &&
1657
+ me->connectionVersion == connectionVersion)
1658
+ {
1659
+ msglenN = *(unsigned int*)parsePoint;
1660
+ msglen = ntohl(msglenN);
1661
+ if (msglen > MAX_MESSAGE_SIZE)
1662
+ {
1663
+ amps_tcps_handle_stream_corruption(me, connectionVersion);
1664
+ goto cleanup;
1665
+ }
1666
+ if (readPoint >= (parsePoint + msglen + 4))
1667
+ {
1668
+ /* there are enough bytes to parse this guy. */
1669
+ parsePoint += 4;
1670
+ if (amps_message_pre_deserialize(message, me->serializer,
1671
+ (amps_char*)parsePoint, msglen) == AMPS_E_OK)
1672
+ {
1673
+ currentPosition = 0;
1674
+ while (currentPosition < msglen &&
1675
+ fd == me->fd &&
1676
+ me->connectionVersion == connectionVersion)
1677
+ {
1678
+ if (amps_message_deserialize(message, me->serializer,
1679
+ currentPosition,
1680
+ &bytesRead) != AMPS_E_OK)
1681
+ {
1682
+ amps_tcps_handle_stream_corruption(me, connectionVersion);
1683
+ goto cleanup;
1684
+ }
1685
+ if (me->messageHandler)
1686
+ {
1687
+ #ifndef _WIN32
1688
+ cancelState = 0;
1689
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cancelState);
1690
+ #endif
1691
+ me->messageHandler(message,
1692
+ me->messageHandlerUserData);
1693
+ #ifndef _WIN32
1694
+ pthread_setcancelstate(cancelState, &unusedCancelState);
1695
+ #endif
1696
+ }
1697
+ currentPosition += bytesRead;
1698
+ }
1699
+ }
1700
+ else
1701
+ {
1702
+ amps_tcps_handle_stream_corruption(me, connectionVersion);
1703
+ goto cleanup;
1704
+ }
1705
+ parsePoint += msglen;
1706
+ }
1707
+ else if (end < buffer + msglen + 4)
1708
+ {
1709
+ /* this message is larger than the buffer
1710
+ * resize to 2* larger of this message or current buffer size */
1711
+ size_t newLength = end < buffer + (msglen * 2) ?
1712
+ msglen * 2 : (size_t)(end - buffer);
1713
+ newBuffer = (unsigned char*)malloc( newLength );
1714
+ if (newBuffer == NULL)
1715
+ {
1716
+ assert(readPoint >= parsePoint);
1717
+ /* stream broken */
1718
+ amps_tcps_handle_disconnect(me, connectionVersion);
1719
+ goto cleanup;
1720
+ }
1721
+ memcpy(newBuffer, parsePoint, (size_t)(readPoint - parsePoint));
1722
+ readPoint = newBuffer + (readPoint - parsePoint);
1723
+ parsePoint = newBuffer;
1724
+ #ifndef _WIN32
1725
+ cancelState = 0;
1726
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cancelState);
1727
+ #endif
1728
+ free(buffer);
1729
+ buffer = newBuffer;
1730
+ #ifndef _WIN32
1731
+ pthread_setcancelstate(cancelState, &unusedCancelState);
1732
+ #endif
1733
+ end = newBuffer + newLength;
1734
+ assert(readPoint >= parsePoint);
1735
+ break;
1736
+ }
1737
+ else
1738
+ {
1739
+ /* Need to read more data to finish this message
1740
+ * Move what we have to the front of the buffer. */
1741
+ break;
1742
+ }
1743
+ } /*while(readPoint >= parsePoint + 4) */
1744
+ if (readPoint > parsePoint)
1745
+ {
1746
+ memmove(buffer, parsePoint, (size_t)(readPoint - parsePoint));
1747
+ }
1748
+ readPoint = buffer + (readPoint - parsePoint);
1749
+ parsePoint = buffer;
1750
+ } /* while(fd == me->fd) */
1751
+ cleanup:
1752
+ #ifndef _WIN32
1753
+ cancelState = 0;
1754
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cancelState);
1755
+ pthread_cleanup_pop(0);
1756
+ pthread_cleanup_pop(0);
1757
+ #endif
1758
+ amps_message_destroy(message);
1759
+ free(buffer);
1760
+ if (me->destroying)
1761
+ {
1762
+ return 0;
1763
+ }
1764
+ // If exiting as the reader thread, clear me->thread
1765
+ // Unless me-thread is 0, we're not getting joined, so detach
1766
+ AMPS_THREAD_ID tid = AMPS_CURRENT_THREAD();
1767
+ if (me->threadExitCallback)
1768
+ {
1769
+ me->threadExitCallback(tid, me->threadExitCallbackUserData);
1770
+ }
1771
+ #if __STDC_VERSION__ >= 201100
1772
+ if (atomic_compare_exchange_strong(&(me->thread), &tid, 0))
1773
+ #elif defined(_WIN32)
1774
+ if (InterlockedCompareExchange((volatile unsigned int*)(&(me->thread)),
1775
+ (unsigned int)tid, (unsigned int)0))
1776
+ #else
1777
+ int swapped = (int)__sync_bool_compare_and_swap(&(me->thread), tid, 0);
1778
+ if (swapped || me->thread != 0)
1779
+ #endif
1780
+ {
1781
+ #ifdef _WIN32
1782
+ CloseHandle((HANDLE)(AMPS_IEX(&(me->threadH), 0)));
1783
+ #else
1784
+ pthread_detach(tid);
1785
+ #endif
1786
+ }
1787
+
1788
+ return 0;
1789
+ }
1790
+
1791
+ amps_result
1792
+ amps_tcps_attempt_reconnect(amps_handle transport, unsigned version)
1793
+ {
1794
+ amps_result res;
1795
+ amps_tcps_t* me = (amps_tcps_t*)transport;
1796
+ if (version == 0)
1797
+ {
1798
+ version = me->connectionVersion;
1799
+ }
1800
+ res = amps_tcps_handle_disconnect(me, version);
1801
+ return res;
1802
+ }
1803
+
1804
+ /* public-api -- get a socket */
1805
+ AMPS_SOCKET
1806
+ amps_tcps_get_socket(amps_handle transport)
1807
+ {
1808
+ amps_tcps_t* me = (amps_tcps_t*)transport;
1809
+ return me->fd;
1810
+ }
1811
+
1812
+ void* amps_tcps_get_SSL(amps_handle transport)
1813
+ {
1814
+ amps_tcps_t* me = (amps_tcps_t*)transport;
1815
+ return me->ssl;
1816
+ }
1817
+
1818
+ amps_result
1819
+ amps_tcps_update_read_timeout(amps_tcps_t* me)
1820
+ {
1821
+ int timeout = (int)((me->readTimeoutMillis && me->idleTimeMillis) ?
1822
+ AMPS_MIN(me->readTimeoutMillis, me->idleTimeMillis) :
1823
+ AMPS_MAX(me->readTimeoutMillis, me->idleTimeMillis));
1824
+ int rc = 0;
1825
+ #ifdef _WIN32
1826
+ DWORD timeoutMillis = timeout;
1827
+ rc = setsockopt(me->fd, SOL_SOCKET, SO_RCVTIMEO,
1828
+ (const char*)&timeoutMillis, sizeof(DWORD));
1829
+ #else
1830
+ struct timeval tv;
1831
+ tv.tv_sec = timeout / 1000;
1832
+ tv.tv_usec = (timeout % 1000) * 1000;
1833
+ rc = setsockopt(me->fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval));
1834
+ #endif
1835
+ int sysError = GET_ERRNO;
1836
+ if (rc == -1)
1837
+ {
1838
+ amps_tcps_set_socket_error(me, sysError);
1839
+ return AMPS_E_USAGE;
1840
+ }
1841
+ return AMPS_E_OK;
1842
+ }
1843
+ amps_result
1844
+ amps_tcps_set_read_timeout(amps_handle transport, int readTimeout)
1845
+ {
1846
+ amps_tcps_t* me = (amps_tcps_t*)transport;
1847
+ me->readTimeoutMillis = (amps_uint64_t)readTimeout * 1000;
1848
+ return amps_tcps_update_read_timeout(me);
1849
+ }
1850
+
1851
+
1852
+ void
1853
+ amps_tcps_set_filter_function(amps_handle transport, amps_transport_filter_function filterFunction_, void* userdata_)
1854
+ {
1855
+ amps_tcps_t* me = (amps_tcps_t*)transport;
1856
+ me->filterUserData = userdata_;
1857
+ me->filterFunction = filterFunction_ ? filterFunction_ : amps_tcps_noop_filter_function;
1858
+ }
1859
+
1860
+ void
1861
+ amps_tcps_set_thread_created_callback(amps_handle transport_, amps_thread_created_callback threadCreatedCallback_, void* userdata_)
1862
+ {
1863
+ amps_tcps_t* me = (amps_tcps_t*)transport_;
1864
+ me->threadCreatedCallbackUserData = userdata_;
1865
+ me->threadCreatedCallback = threadCreatedCallback_;
1866
+ }
1867
+
1868
+ void
1869
+ amps_tcps_set_thread_exit_callback(amps_handle transport_, amps_thread_exit_callback threadExitCallback_, void* userdata_)
1870
+ {
1871
+ amps_tcps_t* me = (amps_tcps_t*)transport_;
1872
+ me->threadExitCallbackUserData = userdata_;
1873
+ me->threadExitCallback = threadExitCallback_;
1874
+ }
1875
+
1876
+ amps_result
1877
+ amps_tcps_set_idle_time(amps_handle transport, int millis)
1878
+ {
1879
+ amps_tcps_t* me = (amps_tcps_t*)transport;
1880
+ if (!me->idleTimeMillis || (amps_uint64_t)millis < me->idleTimeMillis)
1881
+ {
1882
+ me->idleTimeMillis = (amps_uint64_t)millis;
1883
+ }
1884
+ return amps_tcps_update_read_timeout(me);
1885
+ }