quickfix_ruby 1.14.3

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 (149) hide show
  1. checksums.yaml +7 -0
  2. data/ext/quickfix/Acceptor.cpp +248 -0
  3. data/ext/quickfix/Acceptor.h +127 -0
  4. data/ext/quickfix/Allocator.h +9 -0
  5. data/ext/quickfix/Application.h +127 -0
  6. data/ext/quickfix/AtomicCount.h +109 -0
  7. data/ext/quickfix/DOMDocument.h +74 -0
  8. data/ext/quickfix/DataDictionary.cpp +618 -0
  9. data/ext/quickfix/DataDictionary.h +539 -0
  10. data/ext/quickfix/DataDictionaryProvider.cpp +71 -0
  11. data/ext/quickfix/DataDictionaryProvider.h +70 -0
  12. data/ext/quickfix/DatabaseConnectionID.h +105 -0
  13. data/ext/quickfix/DatabaseConnectionPool.h +91 -0
  14. data/ext/quickfix/Dictionary.cpp +162 -0
  15. data/ext/quickfix/Dictionary.h +94 -0
  16. data/ext/quickfix/Event.h +95 -0
  17. data/ext/quickfix/Exceptions.h +299 -0
  18. data/ext/quickfix/Field.h +672 -0
  19. data/ext/quickfix/FieldConvertors.h +863 -0
  20. data/ext/quickfix/FieldMap.cpp +238 -0
  21. data/ext/quickfix/FieldMap.h +244 -0
  22. data/ext/quickfix/FieldNumbers.h +46 -0
  23. data/ext/quickfix/FieldTypes.cpp +64 -0
  24. data/ext/quickfix/FieldTypes.h +698 -0
  25. data/ext/quickfix/Fields.h +31 -0
  26. data/ext/quickfix/FileLog.cpp +200 -0
  27. data/ext/quickfix/FileLog.h +112 -0
  28. data/ext/quickfix/FileStore.cpp +332 -0
  29. data/ext/quickfix/FileStore.h +129 -0
  30. data/ext/quickfix/FixFieldNumbers.h +1537 -0
  31. data/ext/quickfix/FixFields.h +1538 -0
  32. data/ext/quickfix/FixValues.h +3281 -0
  33. data/ext/quickfix/FlexLexer.h +188 -0
  34. data/ext/quickfix/Group.cpp +64 -0
  35. data/ext/quickfix/Group.h +73 -0
  36. data/ext/quickfix/HtmlBuilder.h +186 -0
  37. data/ext/quickfix/HttpConnection.cpp +739 -0
  38. data/ext/quickfix/HttpConnection.h +78 -0
  39. data/ext/quickfix/HttpMessage.cpp +149 -0
  40. data/ext/quickfix/HttpMessage.h +133 -0
  41. data/ext/quickfix/HttpParser.cpp +49 -0
  42. data/ext/quickfix/HttpParser.h +54 -0
  43. data/ext/quickfix/HttpServer.cpp +169 -0
  44. data/ext/quickfix/HttpServer.h +78 -0
  45. data/ext/quickfix/Initiator.cpp +289 -0
  46. data/ext/quickfix/Initiator.h +149 -0
  47. data/ext/quickfix/Log.cpp +77 -0
  48. data/ext/quickfix/Log.h +179 -0
  49. data/ext/quickfix/Message.cpp +580 -0
  50. data/ext/quickfix/Message.h +370 -0
  51. data/ext/quickfix/MessageCracker.h +188 -0
  52. data/ext/quickfix/MessageSorters.cpp +105 -0
  53. data/ext/quickfix/MessageSorters.h +156 -0
  54. data/ext/quickfix/MessageStore.cpp +146 -0
  55. data/ext/quickfix/MessageStore.h +174 -0
  56. data/ext/quickfix/Mutex.h +131 -0
  57. data/ext/quickfix/MySQLConnection.h +194 -0
  58. data/ext/quickfix/MySQLLog.cpp +275 -0
  59. data/ext/quickfix/MySQLLog.h +145 -0
  60. data/ext/quickfix/MySQLStore.cpp +331 -0
  61. data/ext/quickfix/MySQLStore.h +142 -0
  62. data/ext/quickfix/NullStore.cpp +54 -0
  63. data/ext/quickfix/NullStore.h +99 -0
  64. data/ext/quickfix/OdbcConnection.h +266 -0
  65. data/ext/quickfix/OdbcLog.cpp +252 -0
  66. data/ext/quickfix/OdbcLog.h +117 -0
  67. data/ext/quickfix/OdbcStore.cpp +338 -0
  68. data/ext/quickfix/OdbcStore.h +113 -0
  69. data/ext/quickfix/PUGIXML_DOMDocument.cpp +112 -0
  70. data/ext/quickfix/PUGIXML_DOMDocument.h +81 -0
  71. data/ext/quickfix/Parser.cpp +103 -0
  72. data/ext/quickfix/Parser.h +57 -0
  73. data/ext/quickfix/PostgreSQLConnection.h +176 -0
  74. data/ext/quickfix/PostgreSQLLog.cpp +276 -0
  75. data/ext/quickfix/PostgreSQLLog.h +144 -0
  76. data/ext/quickfix/PostgreSQLStore.cpp +334 -0
  77. data/ext/quickfix/PostgreSQLStore.h +141 -0
  78. data/ext/quickfix/Queue.h +75 -0
  79. data/ext/quickfix/QuickfixRuby.cpp +252066 -0
  80. data/ext/quickfix/QuickfixRuby.h +34 -0
  81. data/ext/quickfix/Responder.h +43 -0
  82. data/ext/quickfix/Session.cpp +1487 -0
  83. data/ext/quickfix/Session.h +335 -0
  84. data/ext/quickfix/SessionFactory.cpp +274 -0
  85. data/ext/quickfix/SessionFactory.h +86 -0
  86. data/ext/quickfix/SessionID.h +170 -0
  87. data/ext/quickfix/SessionSettings.cpp +189 -0
  88. data/ext/quickfix/SessionSettings.h +171 -0
  89. data/ext/quickfix/SessionState.h +231 -0
  90. data/ext/quickfix/Settings.cpp +100 -0
  91. data/ext/quickfix/Settings.h +53 -0
  92. data/ext/quickfix/SharedArray.h +150 -0
  93. data/ext/quickfix/SocketAcceptor.cpp +222 -0
  94. data/ext/quickfix/SocketAcceptor.h +75 -0
  95. data/ext/quickfix/SocketConnection.cpp +238 -0
  96. data/ext/quickfix/SocketConnection.h +103 -0
  97. data/ext/quickfix/SocketConnector.cpp +116 -0
  98. data/ext/quickfix/SocketConnector.h +67 -0
  99. data/ext/quickfix/SocketInitiator.cpp +260 -0
  100. data/ext/quickfix/SocketInitiator.h +81 -0
  101. data/ext/quickfix/SocketMonitor.cpp +335 -0
  102. data/ext/quickfix/SocketMonitor.h +111 -0
  103. data/ext/quickfix/SocketServer.cpp +177 -0
  104. data/ext/quickfix/SocketServer.h +100 -0
  105. data/ext/quickfix/ThreadedSocketAcceptor.cpp +258 -0
  106. data/ext/quickfix/ThreadedSocketAcceptor.h +98 -0
  107. data/ext/quickfix/ThreadedSocketConnection.cpp +209 -0
  108. data/ext/quickfix/ThreadedSocketConnection.h +82 -0
  109. data/ext/quickfix/ThreadedSocketInitiator.cpp +268 -0
  110. data/ext/quickfix/ThreadedSocketInitiator.h +84 -0
  111. data/ext/quickfix/TimeRange.cpp +173 -0
  112. data/ext/quickfix/TimeRange.h +258 -0
  113. data/ext/quickfix/Utility.cpp +537 -0
  114. data/ext/quickfix/Utility.h +219 -0
  115. data/ext/quickfix/Values.h +62 -0
  116. data/ext/quickfix/config.h +0 -0
  117. data/ext/quickfix/config_windows.h +0 -0
  118. data/ext/quickfix/extconf.rb +12 -0
  119. data/ext/quickfix/index.h +37 -0
  120. data/ext/quickfix/pugiconfig.hpp +72 -0
  121. data/ext/quickfix/pugixml.cpp +10765 -0
  122. data/ext/quickfix/pugixml.hpp +1341 -0
  123. data/ext/quickfix/strptime.h +7 -0
  124. data/lib/quickfix40.rb +274 -0
  125. data/lib/quickfix41.rb +351 -0
  126. data/lib/quickfix42.rb +1184 -0
  127. data/lib/quickfix43.rb +3504 -0
  128. data/lib/quickfix44.rb +10721 -0
  129. data/lib/quickfix50.rb +13426 -0
  130. data/lib/quickfix50sp1.rb +15629 -0
  131. data/lib/quickfix50sp2.rb +17068 -0
  132. data/lib/quickfix_fields.rb +19853 -0
  133. data/lib/quickfix_ruby.rb +82 -0
  134. data/lib/quickfixt11.rb +70 -0
  135. data/spec/FIX40.xml +862 -0
  136. data/spec/FIX41.xml +1285 -0
  137. data/spec/FIX42.xml +2746 -0
  138. data/spec/FIX43.xml +4229 -0
  139. data/spec/FIX44.xml +6596 -0
  140. data/spec/FIX50.xml +8137 -0
  141. data/spec/FIX50SP1.xml +9496 -0
  142. data/spec/FIX50SP2.xml +10011 -0
  143. data/spec/FIXT11.xml +313 -0
  144. data/test/test_DataDictionaryTestCase.rb +268 -0
  145. data/test/test_DictionaryTestCase.rb +112 -0
  146. data/test/test_FieldBaseTestCase.rb +24 -0
  147. data/test/test_MessageTestCase.rb +368 -0
  148. data/test/test_SessionSettingsTestCase.rb +41 -0
  149. metadata +193 -0
@@ -0,0 +1,335 @@
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 "SocketMonitor.h"
27
+ #include "Utility.h"
28
+ #include <exception>
29
+ #include <set>
30
+ #include <algorithm>
31
+ #include <iostream>
32
+
33
+ namespace FIX
34
+ {
35
+ SocketMonitor::SocketMonitor( int timeout )
36
+ : m_timeout( timeout )
37
+ {
38
+ socket_init();
39
+
40
+ std::pair<int, int> sockets = socket_createpair();
41
+ m_signal = sockets.first;
42
+ m_interrupt = sockets.second;
43
+ socket_setnonblock( m_signal );
44
+ socket_setnonblock( m_interrupt );
45
+ m_readSockets.insert( m_interrupt );
46
+
47
+ m_timeval.tv_sec = 0;
48
+ m_timeval.tv_usec = 0;
49
+ #ifndef SELECT_DECREMENTS_TIME
50
+ m_ticks = clock();
51
+ #endif
52
+ }
53
+
54
+ SocketMonitor::~SocketMonitor()
55
+ {
56
+ Sockets::iterator i;
57
+ for ( i = m_readSockets.begin(); i != m_readSockets.end(); ++i ) {
58
+ socket_close( *i );
59
+ }
60
+
61
+ socket_close( m_signal );
62
+ socket_term();
63
+ }
64
+
65
+ bool SocketMonitor::addConnect( int s )
66
+ {
67
+ socket_setnonblock( s );
68
+ Sockets::iterator i = m_connectSockets.find( s );
69
+ if( i != m_connectSockets.end() ) return false;
70
+
71
+ m_connectSockets.insert( s );
72
+ return true;
73
+ }
74
+
75
+ bool SocketMonitor::addRead( int s )
76
+ {
77
+ socket_setnonblock( s );
78
+ Sockets::iterator i = m_readSockets.find( s );
79
+ if( i != m_readSockets.end() ) return false;
80
+
81
+ m_readSockets.insert( s );
82
+ return true;
83
+ }
84
+
85
+ bool SocketMonitor::addWrite( int s )
86
+ {
87
+ if( m_readSockets.find(s) == m_readSockets.end() )
88
+ return false;
89
+
90
+ socket_setnonblock( s );
91
+ Sockets::iterator i = m_writeSockets.find( s );
92
+ if( i != m_writeSockets.end() ) return false;
93
+
94
+ m_writeSockets.insert( s );
95
+ return true;
96
+ }
97
+
98
+ bool SocketMonitor::drop( int s )
99
+ {
100
+ Sockets::iterator i = m_readSockets.find( s );
101
+ Sockets::iterator j = m_writeSockets.find( s );
102
+ Sockets::iterator k = m_connectSockets.find( s );
103
+
104
+ if ( i != m_readSockets.end() ||
105
+ j != m_writeSockets.end() ||
106
+ k != m_connectSockets.end() )
107
+ {
108
+ socket_close( s );
109
+ m_readSockets.erase( s );
110
+ m_writeSockets.erase( s );
111
+ m_connectSockets.erase( s );
112
+ m_dropped.push( s );
113
+ return true;
114
+ }
115
+ return false;
116
+ }
117
+
118
+ inline timeval* SocketMonitor::getTimeval( bool poll, double timeout )
119
+ {
120
+ if ( poll )
121
+ {
122
+ m_timeval.tv_sec = 0;
123
+ m_timeval.tv_usec = 0;
124
+ return &m_timeval;
125
+ }
126
+
127
+ timeout = m_timeout;
128
+
129
+ if ( !timeout )
130
+ return 0;
131
+ #ifdef SELECT_MODIFIES_TIMEVAL
132
+ if ( !m_timeval.tv_sec && !m_timeval.tv_usec && timeout )
133
+ m_timeval.tv_sec = timeout;
134
+ return &m_timeval;
135
+ #else
136
+ double elapsed = ( double ) ( clock() - m_ticks ) / ( double ) CLOCKS_PER_SEC;
137
+ if ( elapsed >= timeout || elapsed == 0.0 )
138
+ {
139
+ m_ticks = clock();
140
+ m_timeval.tv_sec = 0;
141
+ m_timeval.tv_usec = (timeout * 1000000);
142
+ }
143
+ else
144
+ {
145
+ m_timeval.tv_sec = 0;
146
+ m_timeval.tv_usec = ( ( timeout - elapsed ) * 1000000 );
147
+ }
148
+ return &m_timeval;
149
+ #endif
150
+ }
151
+
152
+ bool SocketMonitor::sleepIfEmpty( bool poll )
153
+ {
154
+ if( poll )
155
+ return false;
156
+
157
+ if ( m_readSockets.empty() &&
158
+ m_writeSockets.empty() &&
159
+ m_connectSockets.empty() )
160
+ {
161
+ process_sleep( m_timeout );
162
+ return true;
163
+ }
164
+ else
165
+ return false;
166
+ }
167
+
168
+ void SocketMonitor::signal( int socket )
169
+ {
170
+ socket_send( m_signal, (char*)&socket, sizeof(socket) );
171
+ }
172
+
173
+ void SocketMonitor::unsignal( int s )
174
+ {
175
+ Sockets::iterator i = m_writeSockets.find( s );
176
+ if( i == m_writeSockets.end() ) return;
177
+
178
+ m_writeSockets.erase( s );
179
+ }
180
+
181
+ void SocketMonitor::block( Strategy& strategy, bool poll, double timeout )
182
+ {
183
+ while ( m_dropped.size() )
184
+ {
185
+ strategy.onError( *this, m_dropped.front() );
186
+ m_dropped.pop();
187
+ if ( m_dropped.size() == 0 )
188
+ return ;
189
+ }
190
+
191
+ fd_set readSet;
192
+ FD_ZERO( &readSet );
193
+ buildSet( m_readSockets, readSet );
194
+ fd_set writeSet;
195
+ FD_ZERO( &writeSet );
196
+ buildSet( m_connectSockets, writeSet );
197
+ buildSet( m_writeSockets, writeSet );
198
+ fd_set exceptSet;
199
+ FD_ZERO( &exceptSet );
200
+ buildSet( m_connectSockets, exceptSet );
201
+
202
+ if ( sleepIfEmpty(poll) )
203
+ {
204
+ strategy.onTimeout( *this );
205
+ return;
206
+ }
207
+
208
+ int result = select( FD_SETSIZE, &readSet, &writeSet, &exceptSet, getTimeval(poll, timeout) );
209
+
210
+ if ( result == 0 )
211
+ {
212
+ strategy.onTimeout( *this );
213
+ return;
214
+ }
215
+ else if ( result > 0 )
216
+ {
217
+ processExceptSet( strategy, exceptSet );
218
+ processWriteSet( strategy, writeSet );
219
+ processReadSet( strategy, readSet );
220
+ }
221
+ else
222
+ {
223
+ strategy.onError( *this );
224
+ }
225
+ }
226
+
227
+ void SocketMonitor::processReadSet( Strategy& strategy, fd_set& readSet )
228
+ {
229
+ #ifdef _MSC_VER
230
+ for ( unsigned i = 0; i < readSet.fd_count; ++i )
231
+ {
232
+ int s = readSet.fd_array[ i ];
233
+ if( s == m_interrupt )
234
+ {
235
+ int socket = 0;
236
+ recv( s, (char*)&socket, sizeof(socket), 0 );
237
+ addWrite( socket );
238
+ }
239
+ else
240
+ {
241
+ strategy.onEvent( *this, s );
242
+ }
243
+ }
244
+ #else
245
+ Sockets::iterator i;
246
+ Sockets sockets = m_readSockets;
247
+ for ( i = sockets.begin(); i != sockets.end(); ++i )
248
+ {
249
+ int s = *i;
250
+ if ( !FD_ISSET( *i, &readSet ) )
251
+ continue;
252
+ if( s == m_interrupt )
253
+ {
254
+ int socket = 0;
255
+ recv( s, (char*)&socket, sizeof(socket), 0 );
256
+ addWrite( socket );
257
+ }
258
+ else
259
+ {
260
+ strategy.onEvent( *this, s );
261
+ }
262
+ }
263
+ #endif
264
+ }
265
+
266
+ void SocketMonitor::processWriteSet( Strategy& strategy, fd_set& writeSet )
267
+ {
268
+ #ifdef _MSC_VER
269
+ for ( unsigned i = 0; i < writeSet.fd_count; ++i )
270
+ {
271
+ int s = writeSet.fd_array[ i ];
272
+ if( m_connectSockets.find(s) != m_connectSockets.end() )
273
+ {
274
+ m_connectSockets.erase( s );
275
+ m_readSockets.insert( s );
276
+ strategy.onConnect( *this, s );
277
+ }
278
+ else
279
+ {
280
+ strategy.onWrite( *this, s );
281
+ }
282
+ }
283
+ #else
284
+ Sockets::iterator i;
285
+ Sockets sockets = m_connectSockets;
286
+ for( i = sockets.begin(); i != sockets.end(); ++i )
287
+ {
288
+ int s = *i;
289
+ if ( !FD_ISSET( *i, &writeSet ) )
290
+ continue;
291
+ m_connectSockets.erase( s );
292
+ m_readSockets.insert( s );
293
+ strategy.onConnect( *this, s );
294
+ }
295
+
296
+ sockets = m_writeSockets;
297
+ for( i = sockets.begin(); i != sockets.end(); ++i )
298
+ {
299
+ int s = *i;
300
+ if ( !FD_ISSET( *i, &writeSet ) )
301
+ continue;
302
+ strategy.onWrite( *this, s );
303
+ }
304
+ #endif
305
+ }
306
+
307
+ void SocketMonitor::processExceptSet( Strategy& strategy, fd_set& exceptSet )
308
+ {
309
+ #ifdef _MSC_VER
310
+ for ( unsigned i = 0; i < exceptSet.fd_count; ++i )
311
+ {
312
+ int s = exceptSet.fd_array[ i ];
313
+ strategy.onError( *this, s );
314
+ }
315
+ #else
316
+ Sockets::iterator i;
317
+ Sockets sockets = m_connectSockets;
318
+ for ( i = sockets.begin(); i != sockets.end(); ++i )
319
+ {
320
+ int s = *i;
321
+ if ( !FD_ISSET( *i, &exceptSet ) )
322
+ continue;
323
+ strategy.onError( *this, s );
324
+ }
325
+ #endif
326
+ }
327
+
328
+ void SocketMonitor::buildSet( const Sockets& sockets, fd_set& watchSet )
329
+ {
330
+ Sockets::const_iterator iter;
331
+ for ( iter = sockets.begin(); iter != sockets.end(); ++iter ) {
332
+ FD_SET( *iter, &watchSet );
333
+ }
334
+ }
335
+ }
@@ -0,0 +1,111 @@
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_SOCKETMONITOR_H
23
+ #define FIX_SOCKETMONITOR_H
24
+
25
+ #ifdef _MSC_VER
26
+ #pragma warning( disable : 4503 4355 4786 4290 )
27
+ #endif
28
+
29
+ #ifdef _MSC_VER
30
+ #include <Winsock2.h>
31
+ typedef int socklen_t;
32
+ #else
33
+ #include <sys/types.h>
34
+ #include <sys/socket.h>
35
+ #include <sys/time.h>
36
+ #include <netinet/in.h>
37
+ #include <arpa/inet.h>
38
+ #endif
39
+
40
+ #include <set>
41
+ #include <queue>
42
+ #include <time.h>
43
+
44
+ namespace FIX
45
+ {
46
+ /// Monitors events on a collection of sockets.
47
+ class SocketMonitor
48
+ {
49
+ public:
50
+ class Strategy;
51
+
52
+ SocketMonitor( int timeout = 0 );
53
+ virtual ~SocketMonitor();
54
+
55
+ bool addConnect( int socket );
56
+ bool addRead( int socket );
57
+ bool addWrite( int socket );
58
+ bool drop( int socket );
59
+ void signal( int socket );
60
+ void unsignal( int socket );
61
+ void block( Strategy& strategy, bool poll = 0, double timeout = 0.0 );
62
+
63
+ size_t numSockets()
64
+ { return m_readSockets.size() - 1; }
65
+
66
+ private:
67
+ typedef std::set < int > Sockets;
68
+ typedef std::queue < int > Queue;
69
+
70
+ void setsockopt();
71
+ bool bind();
72
+ bool listen();
73
+ void buildSet( const Sockets&, fd_set& );
74
+ inline timeval* getTimeval( bool poll, double timeout );
75
+ inline bool sleepIfEmpty( bool poll );
76
+
77
+ void processReadSet( Strategy&, fd_set& );
78
+ void processWriteSet( Strategy&, fd_set& );
79
+ void processExceptSet( Strategy&, fd_set& );
80
+
81
+ int m_timeout;
82
+ timeval m_timeval;
83
+ #ifndef SELECT_DECREMENTS_TIME
84
+ clock_t m_ticks;
85
+ #endif
86
+
87
+ int m_signal;
88
+ int m_interrupt;
89
+ Sockets m_connectSockets;
90
+ Sockets m_readSockets;
91
+ Sockets m_writeSockets;
92
+ Queue m_dropped;
93
+
94
+ public:
95
+ class Strategy
96
+ {
97
+ public:
98
+ virtual ~Strategy()
99
+ {}
100
+ virtual void onConnect( SocketMonitor&, int socket ) = 0;
101
+ virtual void onEvent( SocketMonitor&, int socket ) = 0;
102
+ virtual void onWrite( SocketMonitor&, int socket ) = 0;
103
+ virtual void onError( SocketMonitor&, int socket ) = 0;
104
+ virtual void onError( SocketMonitor& ) = 0;
105
+ virtual void onTimeout( SocketMonitor& )
106
+ {}}
107
+ ;
108
+ };
109
+ }
110
+
111
+ #endif //FIX_SOCKETMONITOR_H
@@ -0,0 +1,177 @@
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 "SocketServer.h"
27
+ #include "Utility.h"
28
+ #include "Exceptions.h"
29
+ #ifndef _MSC_VER
30
+ #include <unistd.h>
31
+ #include <sys/ioctl.h>
32
+ #include <sys/types.h>
33
+ #include <sys/stat.h>
34
+ #endif
35
+ #include <exception>
36
+
37
+ namespace FIX
38
+ {
39
+ /// Handles events from SocketMonitor for server connections.
40
+ class ServerWrapper : public SocketMonitor::Strategy
41
+ {
42
+ public:
43
+ ServerWrapper( std::set<int> sockets, SocketServer& server,
44
+ SocketServer::Strategy& strategy )
45
+ : m_sockets( sockets ), m_server( server ), m_strategy( strategy ) {}
46
+
47
+ private:
48
+ void onConnect( SocketMonitor&, int socket )
49
+ {
50
+ }
51
+
52
+ void onEvent( SocketMonitor& monitor, int socket )
53
+ {
54
+ if( m_sockets.find(socket) != m_sockets.end() )
55
+ {
56
+ m_strategy.onConnect( m_server, socket, m_server.accept(socket) );
57
+ }
58
+ else
59
+ {
60
+ if( !m_strategy.onData( m_server, socket ) )
61
+ onError( monitor, socket );
62
+ }
63
+ }
64
+
65
+ void onWrite( SocketMonitor&, int socket )
66
+ {
67
+ m_strategy.onWrite( m_server, socket );
68
+ }
69
+
70
+ void onError( SocketMonitor& monitor, int socket )
71
+ {
72
+ m_strategy.onDisconnect( m_server, socket );
73
+ monitor.drop( socket );
74
+ }
75
+
76
+ void onError( SocketMonitor& )
77
+ {
78
+ m_strategy.onError( m_server );
79
+ }
80
+
81
+ void onTimeout( SocketMonitor& )
82
+ {
83
+ m_strategy.onTimeout( m_server );
84
+ };
85
+
86
+ typedef std::set<int>
87
+ Sockets;
88
+
89
+ Sockets m_sockets;
90
+ SocketServer& m_server;
91
+ SocketServer::Strategy& m_strategy;
92
+ };
93
+
94
+ SocketServer::SocketServer( int timeout )
95
+ : m_monitor( timeout ) {}
96
+
97
+ int SocketServer::add( int port, bool reuse, bool noDelay,
98
+ int sendBufSize, int rcvBufSize )
99
+ throw( SocketException& )
100
+ {
101
+ if( m_portToInfo.find(port) != m_portToInfo.end() )
102
+ return m_portToInfo[port].m_socket;
103
+
104
+ int socket = socket_createAcceptor( port, reuse );
105
+ if( socket < 0 )
106
+ throw SocketException();
107
+ if( noDelay )
108
+ socket_setsockopt( socket, TCP_NODELAY );
109
+ if( sendBufSize )
110
+ socket_setsockopt( socket, SO_SNDBUF, sendBufSize );
111
+ if( rcvBufSize )
112
+ socket_setsockopt( socket, SO_RCVBUF, rcvBufSize );
113
+ m_monitor.addRead( socket );
114
+
115
+ SocketInfo info( socket, port, noDelay, sendBufSize, rcvBufSize );
116
+ m_socketToInfo[socket] = info;
117
+ m_portToInfo[port] = info;
118
+ return socket;
119
+ }
120
+
121
+ int SocketServer::accept( int socket )
122
+ {
123
+ SocketInfo info = m_socketToInfo[socket];
124
+
125
+ int result = socket_accept( socket );
126
+ if( info.m_noDelay )
127
+ socket_setsockopt( result, TCP_NODELAY );
128
+ if( info.m_sendBufSize )
129
+ socket_setsockopt( result, SO_SNDBUF, info.m_sendBufSize );
130
+ if( info.m_rcvBufSize )
131
+ socket_setsockopt( result, SO_RCVBUF, info.m_rcvBufSize );
132
+ if ( result >= 0 )
133
+ m_monitor.addConnect( result );
134
+ return result;
135
+ }
136
+
137
+ void SocketServer::close()
138
+ {
139
+ SocketToInfo::iterator i = m_socketToInfo.begin();
140
+ for( ; i != m_socketToInfo.end(); ++i )
141
+ {
142
+ int s = i->first;
143
+ socket_close( s );
144
+ socket_invalidate( s );
145
+ }
146
+ }
147
+
148
+ bool SocketServer::block( Strategy& strategy, bool poll, double timeout )
149
+ {
150
+ std::set<int> sockets;
151
+ SocketToInfo::iterator i = m_socketToInfo.begin();
152
+ for( ; i != m_socketToInfo.end(); ++i )
153
+ {
154
+ if( !socket_isValid(i->first) )
155
+ return false;
156
+ sockets.insert( i->first );
157
+ }
158
+
159
+ ServerWrapper wrapper( sockets, *this, strategy );
160
+ m_monitor.block( wrapper, poll, timeout );
161
+ return true;
162
+ }
163
+
164
+ int SocketServer::socketToPort( int socket )
165
+ {
166
+ SocketToInfo::iterator find = m_socketToInfo.find( socket );
167
+ if( find == m_socketToInfo.end() ) return 0;
168
+ return find->second.m_port;
169
+ }
170
+
171
+ int SocketServer::portToSocket( int port )
172
+ {
173
+ SocketToInfo::iterator find = m_portToInfo.find( port );
174
+ if( find == m_portToInfo.end() ) return 0;
175
+ return find->second.m_socket;
176
+ }
177
+ }
@@ -0,0 +1,100 @@
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_SOCKETSERVER_H
23
+ #define FIX_SOCKETSERVER_H
24
+
25
+ #ifdef _MSC_VER
26
+ #pragma warning( disable : 4503 4355 4786 4290 )
27
+ #endif
28
+
29
+ #include "SocketMonitor.h"
30
+ #include "Exceptions.h"
31
+ #include <map>
32
+ #include <set>
33
+ #include <queue>
34
+
35
+ namespace FIX
36
+ {
37
+ /// Information about listening socket
38
+ struct SocketInfo
39
+ {
40
+ SocketInfo()
41
+ : m_socket( -1 ), m_port( 0 ), m_noDelay( false ),
42
+ m_sendBufSize( 0 ), m_rcvBufSize( 0 ) {}
43
+
44
+ SocketInfo( int socket, short port, bool noDelay, int sendBufSize, int rcvBufSize )
45
+ : m_socket( socket ), m_port( port ), m_noDelay( noDelay ),
46
+ m_sendBufSize( sendBufSize ), m_rcvBufSize( rcvBufSize ) {}
47
+
48
+ int m_socket;
49
+ short m_port;
50
+ bool m_noDelay;
51
+ int m_sendBufSize;
52
+ int m_rcvBufSize;
53
+ };
54
+
55
+ /// Listens for and accepts incoming socket connections on a port.
56
+ class SocketServer
57
+ {
58
+ public:
59
+ class Strategy;
60
+
61
+ SocketServer( int timeout = 0 );
62
+
63
+ int add( int port, bool reuse = false, bool noDelay = false,
64
+ int sendBufSize = 0, int rcvBufSize = 0 ) throw( SocketException& );
65
+ int accept( int socket );
66
+ void close();
67
+ bool block( Strategy& strategy, bool poll = 0, double timeout = 0.0 );
68
+
69
+ size_t numConnections() { return m_monitor.numSockets() - 1; }
70
+ SocketMonitor& getMonitor() { return m_monitor; }
71
+
72
+ int socketToPort( int socket );
73
+ int portToSocket( int port );
74
+
75
+ private:
76
+ typedef std::map<int, SocketInfo>
77
+ SocketToInfo;
78
+ typedef std::map<int, SocketInfo>
79
+ PortToInfo;
80
+
81
+ SocketToInfo m_socketToInfo;
82
+ PortToInfo m_portToInfo;
83
+ SocketMonitor m_monitor;
84
+
85
+ public:
86
+ class Strategy
87
+ {
88
+ public:
89
+ virtual ~Strategy() {}
90
+ virtual void onConnect( SocketServer&, int acceptSocket, int socket ) = 0;
91
+ virtual void onWrite( SocketServer&, int socket ) = 0;
92
+ virtual bool onData( SocketServer&, int socket ) = 0;
93
+ virtual void onDisconnect( SocketServer&, int socket ) = 0;
94
+ virtual void onError( SocketServer& ) = 0;
95
+ virtual void onTimeout( SocketServer& ) {};
96
+ };
97
+ };
98
+ }
99
+
100
+ #endif //FIX_SOCKETSERVER_H