quickfix_ruby_ud 2.0.7-aarch64-linux

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 (205) hide show
  1. checksums.yaml +7 -0
  2. data/ext/quickfix/Acceptor.cpp +257 -0
  3. data/ext/quickfix/Acceptor.h +127 -0
  4. data/ext/quickfix/Allocator.h +9 -0
  5. data/ext/quickfix/Application.h +137 -0
  6. data/ext/quickfix/DOMDocument.h +70 -0
  7. data/ext/quickfix/DataDictionary.cpp +679 -0
  8. data/ext/quickfix/DataDictionary.h +607 -0
  9. data/ext/quickfix/DataDictionaryProvider.cpp +66 -0
  10. data/ext/quickfix/DataDictionaryProvider.h +67 -0
  11. data/ext/quickfix/DatabaseConnectionID.h +98 -0
  12. data/ext/quickfix/DatabaseConnectionPool.h +84 -0
  13. data/ext/quickfix/Dictionary.cpp +157 -0
  14. data/ext/quickfix/Dictionary.h +89 -0
  15. data/ext/quickfix/Event.h +89 -0
  16. data/ext/quickfix/Except.h +39 -0
  17. data/ext/quickfix/Exceptions.h +257 -0
  18. data/ext/quickfix/Field.h +654 -0
  19. data/ext/quickfix/FieldConvertors.cpp +86 -0
  20. data/ext/quickfix/FieldConvertors.h +800 -0
  21. data/ext/quickfix/FieldMap.cpp +254 -0
  22. data/ext/quickfix/FieldMap.h +327 -0
  23. data/ext/quickfix/FieldNumbers.h +44 -0
  24. data/ext/quickfix/FieldTypes.cpp +62 -0
  25. data/ext/quickfix/FieldTypes.h +817 -0
  26. data/ext/quickfix/Fields.h +30 -0
  27. data/ext/quickfix/FileLog.cpp +176 -0
  28. data/ext/quickfix/FileLog.h +110 -0
  29. data/ext/quickfix/FileStore.cpp +369 -0
  30. data/ext/quickfix/FileStore.h +131 -0
  31. data/ext/quickfix/FixCommonFields.h +13 -0
  32. data/ext/quickfix/FixFieldNumbers.h +6132 -0
  33. data/ext/quickfix/FixFields.h +6133 -0
  34. data/ext/quickfix/FixValues.h +5790 -0
  35. data/ext/quickfix/Group.cpp +44 -0
  36. data/ext/quickfix/Group.h +78 -0
  37. data/ext/quickfix/HostDetailsProvider.cpp +79 -0
  38. data/ext/quickfix/HostDetailsProvider.h +44 -0
  39. data/ext/quickfix/HtmlBuilder.h +178 -0
  40. data/ext/quickfix/HttpConnection.cpp +914 -0
  41. data/ext/quickfix/HttpConnection.h +74 -0
  42. data/ext/quickfix/HttpMessage.cpp +229 -0
  43. data/ext/quickfix/HttpMessage.h +112 -0
  44. data/ext/quickfix/HttpParser.cpp +49 -0
  45. data/ext/quickfix/HttpParser.h +49 -0
  46. data/ext/quickfix/HttpServer.cpp +152 -0
  47. data/ext/quickfix/HttpServer.h +76 -0
  48. data/ext/quickfix/Initiator.cpp +310 -0
  49. data/ext/quickfix/Initiator.h +151 -0
  50. data/ext/quickfix/Log.cpp +71 -0
  51. data/ext/quickfix/Log.h +254 -0
  52. data/ext/quickfix/Message.cpp +617 -0
  53. data/ext/quickfix/Message.h +419 -0
  54. data/ext/quickfix/MessageCracker.h +171 -0
  55. data/ext/quickfix/MessageSorters.cpp +101 -0
  56. data/ext/quickfix/MessageSorters.h +185 -0
  57. data/ext/quickfix/MessageStore.cpp +182 -0
  58. data/ext/quickfix/MessageStore.h +164 -0
  59. data/ext/quickfix/Mutex.h +120 -0
  60. data/ext/quickfix/MySQLConnection.h +187 -0
  61. data/ext/quickfix/MySQLLog.cpp +262 -0
  62. data/ext/quickfix/MySQLLog.h +158 -0
  63. data/ext/quickfix/MySQLStore.cpp +323 -0
  64. data/ext/quickfix/MySQLStore.h +161 -0
  65. data/ext/quickfix/MySQLStubs.h +203 -0
  66. data/ext/quickfix/NullStore.cpp +40 -0
  67. data/ext/quickfix/NullStore.h +89 -0
  68. data/ext/quickfix/OdbcConnection.h +241 -0
  69. data/ext/quickfix/OdbcLog.cpp +230 -0
  70. data/ext/quickfix/OdbcLog.h +109 -0
  71. data/ext/quickfix/OdbcStore.cpp +313 -0
  72. data/ext/quickfix/OdbcStore.h +124 -0
  73. data/ext/quickfix/PUGIXML_DOMDocument.cpp +112 -0
  74. data/ext/quickfix/PUGIXML_DOMDocument.h +81 -0
  75. data/ext/quickfix/Parser.cpp +111 -0
  76. data/ext/quickfix/Parser.h +50 -0
  77. data/ext/quickfix/PostgreSQLConnection.h +163 -0
  78. data/ext/quickfix/PostgreSQLLog.cpp +263 -0
  79. data/ext/quickfix/PostgreSQLLog.h +157 -0
  80. data/ext/quickfix/PostgreSQLStore.cpp +327 -0
  81. data/ext/quickfix/PostgreSQLStore.h +160 -0
  82. data/ext/quickfix/PostgreSQLStubs.h +203 -0
  83. data/ext/quickfix/Queue.h +66 -0
  84. data/ext/quickfix/QuickfixRuby.cpp +131900 -0
  85. data/ext/quickfix/QuickfixRuby.h +56 -0
  86. data/ext/quickfix/Responder.h +41 -0
  87. data/ext/quickfix/SSLSocketAcceptor.cpp +409 -0
  88. data/ext/quickfix/SSLSocketAcceptor.h +186 -0
  89. data/ext/quickfix/SSLSocketConnection.cpp +434 -0
  90. data/ext/quickfix/SSLSocketConnection.h +221 -0
  91. data/ext/quickfix/SSLSocketInitiator.cpp +558 -0
  92. data/ext/quickfix/SSLSocketInitiator.h +203 -0
  93. data/ext/quickfix/SSLStubs.h +129 -0
  94. data/ext/quickfix/Session.cpp +1437 -0
  95. data/ext/quickfix/Session.h +343 -0
  96. data/ext/quickfix/SessionFactory.cpp +314 -0
  97. data/ext/quickfix/SessionFactory.h +84 -0
  98. data/ext/quickfix/SessionID.h +136 -0
  99. data/ext/quickfix/SessionSettings.cpp +165 -0
  100. data/ext/quickfix/SessionSettings.h +283 -0
  101. data/ext/quickfix/SessionState.h +260 -0
  102. data/ext/quickfix/Settings.cpp +160 -0
  103. data/ext/quickfix/Settings.h +56 -0
  104. data/ext/quickfix/SharedArray.h +274 -0
  105. data/ext/quickfix/SocketAcceptor.cpp +216 -0
  106. data/ext/quickfix/SocketAcceptor.h +77 -0
  107. data/ext/quickfix/SocketConnection.cpp +256 -0
  108. data/ext/quickfix/SocketConnection.h +102 -0
  109. data/ext/quickfix/SocketConnector.cpp +112 -0
  110. data/ext/quickfix/SocketConnector.h +76 -0
  111. data/ext/quickfix/SocketInitiator.cpp +241 -0
  112. data/ext/quickfix/SocketInitiator.h +76 -0
  113. data/ext/quickfix/SocketMonitor.h +26 -0
  114. data/ext/quickfix/SocketMonitor_UNIX.cpp +238 -0
  115. data/ext/quickfix/SocketMonitor_UNIX.h +101 -0
  116. data/ext/quickfix/SocketMonitor_WIN32.cpp +248 -0
  117. data/ext/quickfix/SocketMonitor_WIN32.h +99 -0
  118. data/ext/quickfix/SocketServer.cpp +163 -0
  119. data/ext/quickfix/SocketServer.h +100 -0
  120. data/ext/quickfix/ThreadedSSLSocketAcceptor.cpp +436 -0
  121. data/ext/quickfix/ThreadedSSLSocketAcceptor.h +209 -0
  122. data/ext/quickfix/ThreadedSSLSocketConnection.cpp +364 -0
  123. data/ext/quickfix/ThreadedSSLSocketConnection.h +191 -0
  124. data/ext/quickfix/ThreadedSSLSocketInitiator.cpp +434 -0
  125. data/ext/quickfix/ThreadedSSLSocketInitiator.h +193 -0
  126. data/ext/quickfix/ThreadedSocketAcceptor.cpp +242 -0
  127. data/ext/quickfix/ThreadedSocketAcceptor.h +95 -0
  128. data/ext/quickfix/ThreadedSocketConnection.cpp +227 -0
  129. data/ext/quickfix/ThreadedSocketConnection.h +89 -0
  130. data/ext/quickfix/ThreadedSocketInitiator.cpp +238 -0
  131. data/ext/quickfix/ThreadedSocketInitiator.h +78 -0
  132. data/ext/quickfix/TimeRange.cpp +227 -0
  133. data/ext/quickfix/TimeRange.h +215 -0
  134. data/ext/quickfix/Utility.cpp +639 -0
  135. data/ext/quickfix/Utility.h +255 -0
  136. data/ext/quickfix/UtilitySSL.cpp +1612 -0
  137. data/ext/quickfix/UtilitySSL.h +274 -0
  138. data/ext/quickfix/Values.h +63 -0
  139. data/ext/quickfix/config-all.h +10 -0
  140. data/ext/quickfix/config.h +10 -0
  141. data/ext/quickfix/config_unix.h +178 -0
  142. data/ext/quickfix/config_windows.h +0 -0
  143. data/ext/quickfix/dirent_windows.h +838 -0
  144. data/ext/quickfix/double-conversion/bignum-dtoa.cc +641 -0
  145. data/ext/quickfix/double-conversion/bignum-dtoa.h +84 -0
  146. data/ext/quickfix/double-conversion/bignum.cc +766 -0
  147. data/ext/quickfix/double-conversion/bignum.h +144 -0
  148. data/ext/quickfix/double-conversion/cached-powers.cc +176 -0
  149. data/ext/quickfix/double-conversion/cached-powers.h +64 -0
  150. data/ext/quickfix/double-conversion/diy-fp.cc +57 -0
  151. data/ext/quickfix/double-conversion/diy-fp.h +118 -0
  152. data/ext/quickfix/double-conversion/double-conversion.cc +994 -0
  153. data/ext/quickfix/double-conversion/double-conversion.h +543 -0
  154. data/ext/quickfix/double-conversion/fast-dtoa.cc +665 -0
  155. data/ext/quickfix/double-conversion/fast-dtoa.h +88 -0
  156. data/ext/quickfix/double-conversion/fixed-dtoa.cc +404 -0
  157. data/ext/quickfix/double-conversion/fixed-dtoa.h +56 -0
  158. data/ext/quickfix/double-conversion/ieee.h +402 -0
  159. data/ext/quickfix/double-conversion/strtod.cc +557 -0
  160. data/ext/quickfix/double-conversion/strtod.h +45 -0
  161. data/ext/quickfix/double-conversion/utils.h +374 -0
  162. data/ext/quickfix/extconf.rb +76 -0
  163. data/ext/quickfix/index.h +37 -0
  164. data/ext/quickfix/pugiconfig.hpp +77 -0
  165. data/ext/quickfix/pugixml.cpp +13237 -0
  166. data/ext/quickfix/pugixml.hpp +1516 -0
  167. data/ext/quickfix/scope_guard.hpp +215 -0
  168. data/ext/quickfix/stdint_msvc.h +254 -0
  169. data/ext/quickfix/strptime.h +7 -0
  170. data/lib/2.4/quickfix.so +0 -0
  171. data/lib/2.5/quickfix.so +0 -0
  172. data/lib/2.6/quickfix.so +0 -0
  173. data/lib/2.7/quickfix.so +0 -0
  174. data/lib/3.0/quickfix.so +0 -0
  175. data/lib/3.1/quickfix.so +0 -0
  176. data/lib/3.2/quickfix.so +0 -0
  177. data/lib/3.3/quickfix.so +0 -0
  178. data/lib/3.4/quickfix.so +0 -0
  179. data/lib/quickfix40.rb +274 -0
  180. data/lib/quickfix41.rb +351 -0
  181. data/lib/quickfix42.rb +1184 -0
  182. data/lib/quickfix43.rb +3504 -0
  183. data/lib/quickfix44.rb +14040 -0
  184. data/lib/quickfix50.rb +20051 -0
  185. data/lib/quickfix50sp1.rb +23596 -0
  186. data/lib/quickfix50sp2.rb +412444 -0
  187. data/lib/quickfix_fields.rb +79393 -0
  188. data/lib/quickfix_ruby.rb +82 -0
  189. data/lib/quickfixt11.rb +65 -0
  190. data/spec/FIX40.xml +862 -0
  191. data/spec/FIX41.xml +1282 -0
  192. data/spec/FIX42.xml +2743 -0
  193. data/spec/FIX43.xml +4230 -0
  194. data/spec/FIX44.xml +6600 -0
  195. data/spec/FIX50.xml +8142 -0
  196. data/spec/FIX50SP1.xml +9506 -0
  197. data/spec/FIX50SP2.xml +26069 -0
  198. data/spec/FIXT11.xml +252 -0
  199. data/test/DataDictionaryTestCase.rb +268 -0
  200. data/test/DictionaryTestCase.rb +112 -0
  201. data/test/FieldBaseTestCase.rb +24 -0
  202. data/test/MessageStoreTestCase.rb +19 -0
  203. data/test/MessageTestCase.rb +368 -0
  204. data/test/SessionSettingsTestCase.rb +41 -0
  205. metadata +247 -0
@@ -0,0 +1,256 @@
1
+ /****************************************************************************
2
+ ** Copyright (c) 2001-2014
3
+ **
4
+ ** This file is part of the QuickFIX FIX Engine
5
+ **
6
+ ** This file may be distributed under the terms of the quickfixengine.org
7
+ ** license as defined by quickfixengine.org and appearing in the file
8
+ ** LICENSE included in the packaging of this file.
9
+ **
10
+ ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
11
+ ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
12
+ **
13
+ ** See http://www.quickfixengine.org/LICENSE for licensing information.
14
+ **
15
+ ** Contact ask@quickfixengine.org if any conditions of this licensing are
16
+ ** not clear to you.
17
+ **
18
+ ****************************************************************************/
19
+
20
+ #ifdef _MSC_VER
21
+ #include "stdafx.h"
22
+ #else
23
+ #include "config.h"
24
+ #include <poll.h>
25
+ #endif
26
+
27
+ #include "Session.h"
28
+ #include "SocketAcceptor.h"
29
+ #include "SocketConnection.h"
30
+ #include "SocketConnector.h"
31
+ #include "SocketInitiator.h"
32
+ #include "Utility.h"
33
+
34
+ namespace FIX {
35
+ SocketConnection::SocketConnection(socket_handle s, Sessions sessions, SocketMonitor *pMonitor)
36
+ : m_socket(s),
37
+ m_sendLength(0),
38
+ m_sessions(sessions),
39
+ m_pSession(0),
40
+ m_pMonitor(pMonitor) {
41
+ #ifdef _MSC_VER
42
+ FD_ZERO(&m_fds);
43
+ FD_SET(m_socket, &m_fds);
44
+ #endif
45
+ }
46
+
47
+ SocketConnection::SocketConnection(
48
+ SocketInitiator &i,
49
+ const SessionID &sessionID,
50
+ socket_handle s,
51
+ SocketMonitor *pMonitor)
52
+ : m_socket(s),
53
+ m_sendLength(0),
54
+ m_pSession(i.getSession(sessionID, *this)),
55
+ m_pMonitor(pMonitor) {
56
+ #ifdef _MSC_VER
57
+ FD_ZERO(&m_fds);
58
+ FD_SET(m_socket, &m_fds);
59
+ #endif
60
+ m_sessions.insert(sessionID);
61
+ }
62
+
63
+ SocketConnection::~SocketConnection() {
64
+ if (m_pSession) {
65
+ Session::unregisterSession(m_pSession->getSessionID());
66
+ }
67
+ }
68
+
69
+ bool SocketConnection::send(const std::string &message) {
70
+ Locker l(m_mutex);
71
+
72
+ m_sendQueue.push_back(message);
73
+ processQueue();
74
+ signal();
75
+ return true;
76
+ }
77
+
78
+ bool SocketConnection::processQueue() {
79
+ Locker l(m_mutex);
80
+
81
+ if (!m_sendQueue.size()) {
82
+ return true;
83
+ }
84
+
85
+ #ifdef _MSC_VER
86
+ struct timeval timeout = {0, 0};
87
+ fd_set writeset = m_fds;
88
+ if (select(0, 0, &writeset, 0, &timeout) <= 0) {
89
+ return false;
90
+ }
91
+ #else
92
+ struct pollfd pfd = {m_socket, POLLOUT, 0};
93
+ if (poll(&pfd, 1, 0) <= 0) {
94
+ return false;
95
+ }
96
+ #endif
97
+
98
+ const std::string &msg = m_sendQueue.front();
99
+
100
+ ssize_t result = socket_send(m_socket, msg.c_str() + m_sendLength, msg.length() - m_sendLength);
101
+
102
+ if (result > 0) {
103
+ m_sendLength += result;
104
+ }
105
+
106
+ if (m_sendLength == msg.length()) {
107
+ m_sendLength = 0;
108
+ m_sendQueue.pop_front();
109
+ }
110
+
111
+ return !m_sendQueue.size();
112
+ }
113
+
114
+ void SocketConnection::disconnect() {
115
+ if (m_pMonitor) {
116
+ m_pMonitor->drop(m_socket);
117
+ }
118
+ }
119
+
120
+ bool SocketConnection::read(SocketConnector &s) {
121
+ if (!m_pSession) {
122
+ return false;
123
+ }
124
+
125
+ try {
126
+ readFromSocket();
127
+ readMessages(s.getMonitor());
128
+ } catch (SocketRecvFailed &e) {
129
+ m_pSession->getLog()->onEvent(e.what());
130
+ return false;
131
+ }
132
+ return true;
133
+ }
134
+
135
+ bool SocketConnection::read(SocketAcceptor &acceptor, SocketServer &server) {
136
+ std::string message;
137
+ try {
138
+ if (!m_pSession) {
139
+ #if _MSC_VER
140
+ struct timeval timeout = {1, 0};
141
+ fd_set readset = m_fds;
142
+ #else
143
+ int timeout = 1000; // 1000ms = 1 second
144
+ struct pollfd pfd = {m_socket, POLLIN | POLLPRI, 0};
145
+ #endif
146
+
147
+ while (!readMessage(message)) {
148
+ #if _MSC_VER
149
+ int result = select(0, &readset, 0, 0, &timeout);
150
+ #else
151
+ int result = poll(&pfd, 1, timeout);
152
+ #endif
153
+ if (result > 0) {
154
+ readFromSocket();
155
+ } else if (result == 0) {
156
+ return false;
157
+ } else if (result < 0) {
158
+ return false;
159
+ }
160
+ }
161
+
162
+ m_pSession = Session::lookupSession(message, true);
163
+ if (!isValidSession()) {
164
+ m_pSession = 0;
165
+ if (acceptor.getLog()) {
166
+ acceptor.getLog()->onEvent("Session not found for incoming message: " + message);
167
+ acceptor.getLog()->onIncoming(message);
168
+ }
169
+ }
170
+ if (m_pSession) {
171
+ m_pSession = acceptor.getSession(message, *this);
172
+ }
173
+ if (m_pSession) {
174
+ m_pSession->next(message, UtcTimeStamp::now());
175
+ }
176
+ if (!m_pSession) {
177
+ server.getMonitor().drop(m_socket);
178
+ return false;
179
+ }
180
+
181
+ if (m_pSession->isAcceptor()) {
182
+ std::string remote_address = socket_peername(m_socket);
183
+ if (!m_pSession->getAllowedRemoteAddresses().empty() && !m_pSession->inAllowedRemoteAddresses(remote_address)) {
184
+ m_pSession->getLog()->onEvent("Deny connections to the acceptor from " + remote_address);
185
+ return false;
186
+ }
187
+ m_pSession->getLog()->onEvent("Allows connections to the acceptor from " + remote_address);
188
+ }
189
+
190
+ Session::registerSession(m_pSession->getSessionID());
191
+ return true;
192
+ } else {
193
+ readFromSocket();
194
+ readMessages(server.getMonitor());
195
+ return true;
196
+ }
197
+ } catch (SocketRecvFailed &e) {
198
+ if (m_pSession) {
199
+ m_pSession->getLog()->onEvent(e.what());
200
+ }
201
+ server.getMonitor().drop(m_socket);
202
+ } catch (InvalidMessage &) {
203
+ server.getMonitor().drop(m_socket);
204
+ }
205
+ return false;
206
+ }
207
+
208
+ bool SocketConnection::isValidSession() {
209
+ if (m_pSession == 0) {
210
+ return false;
211
+ }
212
+ SessionID sessionID = m_pSession->getSessionID();
213
+ if (Session::isSessionRegistered(sessionID)) {
214
+ return false;
215
+ }
216
+ return !(m_sessions.find(sessionID) == m_sessions.end());
217
+ }
218
+
219
+ void SocketConnection::readFromSocket() EXCEPT(SocketRecvFailed) {
220
+ ssize_t size = socket_recv(m_socket, m_buffer, sizeof(m_buffer));
221
+ if (size <= 0) {
222
+ throw SocketRecvFailed(size);
223
+ }
224
+ m_parser.addToStream(m_buffer, size);
225
+ }
226
+
227
+ bool SocketConnection::readMessage(std::string &msg) {
228
+ try {
229
+ return m_parser.readFixMessage(msg);
230
+ } catch (MessageParseError &) {}
231
+ return true;
232
+ }
233
+
234
+ void SocketConnection::readMessages(SocketMonitor &socketMonitor) {
235
+ if (!m_pSession) {
236
+ return;
237
+ }
238
+
239
+ std::string message;
240
+ while (readMessage(message)) {
241
+ try {
242
+ m_pSession->next(message, UtcTimeStamp::now());
243
+ } catch (InvalidMessage &) {
244
+ if (!m_pSession->isLoggedOn()) {
245
+ socketMonitor.drop(m_socket);
246
+ }
247
+ }
248
+ }
249
+ }
250
+
251
+ void SocketConnection::onTimeout() {
252
+ if (m_pSession) {
253
+ m_pSession->next(UtcTimeStamp::now());
254
+ }
255
+ }
256
+ } // namespace FIX
@@ -0,0 +1,102 @@
1
+ /* -*- C++ -*- */
2
+
3
+ /****************************************************************************
4
+ ** Copyright (c) 2001-2014
5
+ **
6
+ ** This file is part of the QuickFIX FIX Engine
7
+ **
8
+ ** This file may be distributed under the terms of the quickfixengine.org
9
+ ** license as defined by quickfixengine.org and appearing in the file
10
+ ** LICENSE included in the packaging of this file.
11
+ **
12
+ ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
13
+ ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
14
+ **
15
+ ** See http://www.quickfixengine.org/LICENSE for licensing information.
16
+ **
17
+ ** Contact ask@quickfixengine.org if any conditions of this licensing are
18
+ ** not clear to you.
19
+ **
20
+ ****************************************************************************/
21
+
22
+ #ifndef FIX_SOCKETCONNECTION_H
23
+ #define FIX_SOCKETCONNECTION_H
24
+
25
+ #ifdef _MSC_VER
26
+ #pragma warning(disable : 4503 4355 4786 4290)
27
+ #endif
28
+
29
+ #include "Mutex.h"
30
+ #include "Parser.h"
31
+ #include "Responder.h"
32
+ #include "SessionID.h"
33
+ #include "SocketMonitor.h"
34
+ #include "Utility.h"
35
+ #include <set>
36
+
37
+ namespace FIX {
38
+ class SocketAcceptor;
39
+ class SocketServer;
40
+ class SocketConnector;
41
+ class SocketInitiator;
42
+ class Session;
43
+
44
+ /// Encapsulates a socket file descriptor (single-threaded).
45
+ class SocketConnection : Responder {
46
+ public:
47
+ typedef std::set<SessionID> Sessions;
48
+
49
+ SocketConnection(socket_handle s, Sessions sessions, SocketMonitor *pMonitor);
50
+ SocketConnection(SocketInitiator &, const SessionID &, socket_handle, SocketMonitor *);
51
+ virtual ~SocketConnection();
52
+
53
+ socket_handle getSocket() const { return m_socket; }
54
+ Session *getSession() const { return m_pSession; }
55
+
56
+ bool read(SocketConnector &s);
57
+ bool read(SocketAcceptor &, SocketServer &);
58
+ bool processQueue();
59
+
60
+ void signal() {
61
+ Locker l(m_mutex);
62
+ if (m_sendQueue.size() == 1) {
63
+ m_pMonitor->signal(m_socket);
64
+ }
65
+ }
66
+
67
+ void unsignal() {
68
+ Locker l(m_mutex);
69
+ if (m_sendQueue.size() == 0) {
70
+ m_pMonitor->unsignal(m_socket);
71
+ }
72
+ }
73
+
74
+ void onTimeout();
75
+
76
+ private:
77
+ typedef std::deque<std::string, ALLOCATOR<std::string>> Queue;
78
+
79
+ bool isValidSession();
80
+ void readFromSocket() EXCEPT(SocketRecvFailed);
81
+ bool readMessage(std::string &msg);
82
+ void readMessages(SocketMonitor &s);
83
+ bool send(const std::string &);
84
+ void disconnect();
85
+
86
+ socket_handle m_socket;
87
+ char m_buffer[BUFSIZ];
88
+
89
+ Parser m_parser;
90
+ Queue m_sendQueue;
91
+ ssize_t m_sendLength;
92
+ Sessions m_sessions;
93
+ Session *m_pSession;
94
+ SocketMonitor *m_pMonitor;
95
+ Mutex m_mutex;
96
+ #ifdef _MSC_VER
97
+ fd_set m_fds;
98
+ #endif
99
+ };
100
+ } // namespace FIX
101
+
102
+ #endif // FIX_SOCKETCONNECTION_H
@@ -0,0 +1,112 @@
1
+ /****************************************************************************
2
+ ** Copyright (c) 2001-2014
3
+ **
4
+ ** This file is part of the QuickFIX FIX Engine
5
+ **
6
+ ** This file may be distributed under the terms of the quickfixengine.org
7
+ ** license as defined by quickfixengine.org and appearing in the file
8
+ ** LICENSE included in the packaging of this file.
9
+ **
10
+ ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
11
+ ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
12
+ **
13
+ ** See http://www.quickfixengine.org/LICENSE for licensing information.
14
+ **
15
+ ** Contact ask@quickfixengine.org if any conditions of this licensing are
16
+ ** not clear to you.
17
+ **
18
+ ****************************************************************************/
19
+
20
+ #ifdef _MSC_VER
21
+ #include "stdafx.h"
22
+ #else
23
+ #include "config.h"
24
+ #endif
25
+
26
+ #include "SocketConnector.h"
27
+ #include "Utility.h"
28
+ #ifndef _MSC_VER
29
+ #include <sys/ioctl.h>
30
+ #include <sys/stat.h>
31
+ #include <sys/types.h>
32
+ #include <unistd.h>
33
+ #endif
34
+ #include <iostream>
35
+
36
+ namespace FIX {
37
+ /// Handles events from SocketMonitor for client connections.
38
+ class ConnectorWrapper : public SocketMonitor::Strategy {
39
+ public:
40
+ ConnectorWrapper(SocketConnector &connector, SocketConnector::Strategy &strategy)
41
+ : m_connector(connector),
42
+ m_strategy(strategy) {}
43
+
44
+ private:
45
+ virtual void onConnect(SocketMonitor &, socket_handle socket) override { m_strategy.onConnect(m_connector, socket); }
46
+
47
+ virtual void onWrite(SocketMonitor &, socket_handle socket) override { m_strategy.onWrite(m_connector, socket); }
48
+
49
+ virtual void onEvent(SocketMonitor &, socket_handle socket) override {
50
+ if (!m_strategy.onData(m_connector, socket)) {
51
+ m_strategy.onDisconnect(m_connector, socket);
52
+ }
53
+ }
54
+
55
+ virtual void onError(SocketMonitor &, socket_handle socket) override { m_strategy.onDisconnect(m_connector, socket); }
56
+
57
+ virtual void onError(SocketMonitor &) override { m_strategy.onError(m_connector); }
58
+
59
+ virtual void onTimeout(SocketMonitor &) override { m_strategy.onTimeout(m_connector); };
60
+
61
+ SocketConnector &m_connector;
62
+ SocketConnector::Strategy &m_strategy;
63
+ };
64
+
65
+ SocketConnector::SocketConnector(int timeout)
66
+ : m_monitor(timeout) {}
67
+
68
+ socket_handle SocketConnector::connect(
69
+ const std::string &address,
70
+ int port,
71
+ bool noDelay,
72
+ int sendBufSize,
73
+ int rcvBufSize,
74
+ const std::string &sourceAddress,
75
+ int sourcePort) {
76
+ socket_handle socket = socket_createConnector();
77
+
78
+ if (socket != INVALID_SOCKET_HANDLE) {
79
+ if (noDelay) {
80
+ socket_setsockopt(socket, TCP_NODELAY);
81
+ }
82
+ if (sendBufSize) {
83
+ socket_setsockopt(socket, SO_SNDBUF, sendBufSize);
84
+ }
85
+ if (rcvBufSize) {
86
+ socket_setsockopt(socket, SO_RCVBUF, rcvBufSize);
87
+ }
88
+ if (!sourceAddress.empty() || sourcePort) {
89
+ socket_bind(socket, sourceAddress.c_str(), sourcePort);
90
+ }
91
+ m_monitor.addConnect(socket);
92
+ socket_connect(socket, address.c_str(), port);
93
+ }
94
+ return socket;
95
+ }
96
+
97
+ socket_handle SocketConnector::connect(
98
+ const std::string &address,
99
+ int port,
100
+ bool noDelay,
101
+ int sendBufSize,
102
+ int rcvBufSize,
103
+ Strategy &strategy) {
104
+ socket_handle socket = connect(address, port, noDelay, sendBufSize, rcvBufSize, "", 0);
105
+ return socket;
106
+ }
107
+
108
+ void SocketConnector::block(Strategy &strategy, bool poll, double timeout) {
109
+ ConnectorWrapper wrapper(*this, strategy);
110
+ m_monitor.block(wrapper, poll, timeout);
111
+ }
112
+ } // namespace FIX
@@ -0,0 +1,76 @@
1
+ /* -*- C++ -*- */
2
+
3
+ /****************************************************************************
4
+ ** Copyright (c) 2001-2014
5
+ **
6
+ ** This file is part of the QuickFIX FIX Engine
7
+ **
8
+ ** This file may be distributed under the terms of the quickfixengine.org
9
+ ** license as defined by quickfixengine.org and appearing in the file
10
+ ** LICENSE included in the packaging of this file.
11
+ **
12
+ ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
13
+ ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
14
+ **
15
+ ** See http://www.quickfixengine.org/LICENSE for licensing information.
16
+ **
17
+ ** Contact ask@quickfixengine.org if any conditions of this licensing are
18
+ ** not clear to you.
19
+ **
20
+ ****************************************************************************/
21
+
22
+ #ifndef FIX_SOCKETCONNECTOR_H
23
+ #define FIX_SOCKETCONNECTOR_H
24
+
25
+ #ifdef _MSC_VER
26
+ #pragma warning(disable : 4503 4355 4786 4290)
27
+ #endif
28
+
29
+ #include "SocketMonitor.h"
30
+ #include "Utility.h"
31
+ #include <string>
32
+
33
+ namespace FIX {
34
+ /// Connects sockets to remote ports and addresses.
35
+ class SocketConnector {
36
+ public:
37
+ class Strategy;
38
+
39
+ SocketConnector(int timeout = 0);
40
+
41
+ socket_handle connect(
42
+ const std::string &address,
43
+ int port,
44
+ bool noDelay,
45
+ int sendBufSize,
46
+ int rcvBufSize,
47
+ const std::string &sourceAddress = "",
48
+ int sourcePort = 0);
49
+ socket_handle connect(
50
+ const std::string &address,
51
+ int port,
52
+ bool noDelay,
53
+ int sendBufSize,
54
+ int rcvBufSize,
55
+ Strategy &);
56
+ void block(Strategy &strategy, bool poll = 0, double timeout = 0.0);
57
+ SocketMonitor &getMonitor() { return m_monitor; }
58
+
59
+ private:
60
+ SocketMonitor m_monitor;
61
+
62
+ public:
63
+ class Strategy {
64
+ public:
65
+ virtual ~Strategy() {}
66
+ virtual void onConnect(SocketConnector &, socket_handle socket) = 0;
67
+ virtual void onWrite(SocketConnector &, socket_handle socket) = 0;
68
+ virtual bool onData(SocketConnector &, socket_handle socket) = 0;
69
+ virtual void onDisconnect(SocketConnector &, socket_handle socket) = 0;
70
+ virtual void onError(SocketConnector &) = 0;
71
+ virtual void onTimeout(SocketConnector &) {};
72
+ };
73
+ };
74
+ } // namespace FIX
75
+
76
+ #endif // FIX_SOCKETCONNECTOR_H