quickfix_ruby 1.14.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/ext/quickfix/Acceptor.cpp +248 -0
- data/ext/quickfix/Acceptor.h +127 -0
- data/ext/quickfix/Allocator.h +9 -0
- data/ext/quickfix/Application.h +127 -0
- data/ext/quickfix/AtomicCount.h +109 -0
- data/ext/quickfix/DOMDocument.h +74 -0
- data/ext/quickfix/DataDictionary.cpp +618 -0
- data/ext/quickfix/DataDictionary.h +539 -0
- data/ext/quickfix/DataDictionaryProvider.cpp +71 -0
- data/ext/quickfix/DataDictionaryProvider.h +70 -0
- data/ext/quickfix/DatabaseConnectionID.h +105 -0
- data/ext/quickfix/DatabaseConnectionPool.h +91 -0
- data/ext/quickfix/Dictionary.cpp +162 -0
- data/ext/quickfix/Dictionary.h +94 -0
- data/ext/quickfix/Event.h +95 -0
- data/ext/quickfix/Exceptions.h +299 -0
- data/ext/quickfix/Field.h +672 -0
- data/ext/quickfix/FieldConvertors.h +863 -0
- data/ext/quickfix/FieldMap.cpp +238 -0
- data/ext/quickfix/FieldMap.h +244 -0
- data/ext/quickfix/FieldNumbers.h +46 -0
- data/ext/quickfix/FieldTypes.cpp +64 -0
- data/ext/quickfix/FieldTypes.h +698 -0
- data/ext/quickfix/Fields.h +31 -0
- data/ext/quickfix/FileLog.cpp +200 -0
- data/ext/quickfix/FileLog.h +112 -0
- data/ext/quickfix/FileStore.cpp +332 -0
- data/ext/quickfix/FileStore.h +129 -0
- data/ext/quickfix/FixFieldNumbers.h +1537 -0
- data/ext/quickfix/FixFields.h +1538 -0
- data/ext/quickfix/FixValues.h +3281 -0
- data/ext/quickfix/FlexLexer.h +188 -0
- data/ext/quickfix/Group.cpp +64 -0
- data/ext/quickfix/Group.h +73 -0
- data/ext/quickfix/HtmlBuilder.h +186 -0
- data/ext/quickfix/HttpConnection.cpp +739 -0
- data/ext/quickfix/HttpConnection.h +78 -0
- data/ext/quickfix/HttpMessage.cpp +149 -0
- data/ext/quickfix/HttpMessage.h +133 -0
- data/ext/quickfix/HttpParser.cpp +49 -0
- data/ext/quickfix/HttpParser.h +54 -0
- data/ext/quickfix/HttpServer.cpp +169 -0
- data/ext/quickfix/HttpServer.h +78 -0
- data/ext/quickfix/Initiator.cpp +289 -0
- data/ext/quickfix/Initiator.h +149 -0
- data/ext/quickfix/Log.cpp +77 -0
- data/ext/quickfix/Log.h +179 -0
- data/ext/quickfix/Message.cpp +580 -0
- data/ext/quickfix/Message.h +370 -0
- data/ext/quickfix/MessageCracker.h +188 -0
- data/ext/quickfix/MessageSorters.cpp +105 -0
- data/ext/quickfix/MessageSorters.h +156 -0
- data/ext/quickfix/MessageStore.cpp +146 -0
- data/ext/quickfix/MessageStore.h +174 -0
- data/ext/quickfix/Mutex.h +131 -0
- data/ext/quickfix/MySQLConnection.h +194 -0
- data/ext/quickfix/MySQLLog.cpp +275 -0
- data/ext/quickfix/MySQLLog.h +145 -0
- data/ext/quickfix/MySQLStore.cpp +331 -0
- data/ext/quickfix/MySQLStore.h +142 -0
- data/ext/quickfix/NullStore.cpp +54 -0
- data/ext/quickfix/NullStore.h +99 -0
- data/ext/quickfix/OdbcConnection.h +266 -0
- data/ext/quickfix/OdbcLog.cpp +252 -0
- data/ext/quickfix/OdbcLog.h +117 -0
- data/ext/quickfix/OdbcStore.cpp +338 -0
- data/ext/quickfix/OdbcStore.h +113 -0
- data/ext/quickfix/PUGIXML_DOMDocument.cpp +112 -0
- data/ext/quickfix/PUGIXML_DOMDocument.h +81 -0
- data/ext/quickfix/Parser.cpp +103 -0
- data/ext/quickfix/Parser.h +57 -0
- data/ext/quickfix/PostgreSQLConnection.h +176 -0
- data/ext/quickfix/PostgreSQLLog.cpp +276 -0
- data/ext/quickfix/PostgreSQLLog.h +144 -0
- data/ext/quickfix/PostgreSQLStore.cpp +334 -0
- data/ext/quickfix/PostgreSQLStore.h +141 -0
- data/ext/quickfix/Queue.h +75 -0
- data/ext/quickfix/QuickfixRuby.cpp +252066 -0
- data/ext/quickfix/QuickfixRuby.h +34 -0
- data/ext/quickfix/Responder.h +43 -0
- data/ext/quickfix/Session.cpp +1487 -0
- data/ext/quickfix/Session.h +335 -0
- data/ext/quickfix/SessionFactory.cpp +274 -0
- data/ext/quickfix/SessionFactory.h +86 -0
- data/ext/quickfix/SessionID.h +170 -0
- data/ext/quickfix/SessionSettings.cpp +189 -0
- data/ext/quickfix/SessionSettings.h +171 -0
- data/ext/quickfix/SessionState.h +231 -0
- data/ext/quickfix/Settings.cpp +100 -0
- data/ext/quickfix/Settings.h +53 -0
- data/ext/quickfix/SharedArray.h +150 -0
- data/ext/quickfix/SocketAcceptor.cpp +222 -0
- data/ext/quickfix/SocketAcceptor.h +75 -0
- data/ext/quickfix/SocketConnection.cpp +238 -0
- data/ext/quickfix/SocketConnection.h +103 -0
- data/ext/quickfix/SocketConnector.cpp +116 -0
- data/ext/quickfix/SocketConnector.h +67 -0
- data/ext/quickfix/SocketInitiator.cpp +260 -0
- data/ext/quickfix/SocketInitiator.h +81 -0
- data/ext/quickfix/SocketMonitor.cpp +335 -0
- data/ext/quickfix/SocketMonitor.h +111 -0
- data/ext/quickfix/SocketServer.cpp +177 -0
- data/ext/quickfix/SocketServer.h +100 -0
- data/ext/quickfix/ThreadedSocketAcceptor.cpp +258 -0
- data/ext/quickfix/ThreadedSocketAcceptor.h +98 -0
- data/ext/quickfix/ThreadedSocketConnection.cpp +209 -0
- data/ext/quickfix/ThreadedSocketConnection.h +82 -0
- data/ext/quickfix/ThreadedSocketInitiator.cpp +268 -0
- data/ext/quickfix/ThreadedSocketInitiator.h +84 -0
- data/ext/quickfix/TimeRange.cpp +173 -0
- data/ext/quickfix/TimeRange.h +258 -0
- data/ext/quickfix/Utility.cpp +537 -0
- data/ext/quickfix/Utility.h +219 -0
- data/ext/quickfix/Values.h +62 -0
- data/ext/quickfix/config.h +0 -0
- data/ext/quickfix/config_windows.h +0 -0
- data/ext/quickfix/extconf.rb +12 -0
- data/ext/quickfix/index.h +37 -0
- data/ext/quickfix/pugiconfig.hpp +72 -0
- data/ext/quickfix/pugixml.cpp +10765 -0
- data/ext/quickfix/pugixml.hpp +1341 -0
- data/ext/quickfix/strptime.h +7 -0
- data/lib/quickfix40.rb +274 -0
- data/lib/quickfix41.rb +351 -0
- data/lib/quickfix42.rb +1184 -0
- data/lib/quickfix43.rb +3504 -0
- data/lib/quickfix44.rb +10721 -0
- data/lib/quickfix50.rb +13426 -0
- data/lib/quickfix50sp1.rb +15629 -0
- data/lib/quickfix50sp2.rb +17068 -0
- data/lib/quickfix_fields.rb +19853 -0
- data/lib/quickfix_ruby.rb +82 -0
- data/lib/quickfixt11.rb +70 -0
- data/spec/FIX40.xml +862 -0
- data/spec/FIX41.xml +1285 -0
- data/spec/FIX42.xml +2746 -0
- data/spec/FIX43.xml +4229 -0
- data/spec/FIX44.xml +6596 -0
- data/spec/FIX50.xml +8137 -0
- data/spec/FIX50SP1.xml +9496 -0
- data/spec/FIX50SP2.xml +10011 -0
- data/spec/FIXT11.xml +313 -0
- data/test/test_DataDictionaryTestCase.rb +268 -0
- data/test/test_DictionaryTestCase.rb +112 -0
- data/test/test_FieldBaseTestCase.rb +24 -0
- data/test/test_MessageTestCase.rb +368 -0
- data/test/test_SessionSettingsTestCase.rb +41 -0
- metadata +193 -0
@@ -0,0 +1,289 @@
|
|
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 "Initiator.h"
|
27
|
+
#include "Utility.h"
|
28
|
+
#include "Session.h"
|
29
|
+
#include "SessionFactory.h"
|
30
|
+
#include "HttpServer.h"
|
31
|
+
#include <algorithm>
|
32
|
+
#include <fstream>
|
33
|
+
|
34
|
+
namespace FIX
|
35
|
+
{
|
36
|
+
Initiator::Initiator( Application& application,
|
37
|
+
MessageStoreFactory& messageStoreFactory,
|
38
|
+
const SessionSettings& settings ) throw( ConfigError )
|
39
|
+
: m_threadid( 0 ),
|
40
|
+
m_application( application ),
|
41
|
+
m_messageStoreFactory( messageStoreFactory ),
|
42
|
+
m_settings( settings ),
|
43
|
+
m_pLogFactory( 0 ),
|
44
|
+
m_pLog( 0 ),
|
45
|
+
m_firstPoll( true ),
|
46
|
+
m_stop( true )
|
47
|
+
{ initialize(); }
|
48
|
+
|
49
|
+
Initiator::Initiator( Application& application,
|
50
|
+
MessageStoreFactory& messageStoreFactory,
|
51
|
+
const SessionSettings& settings,
|
52
|
+
LogFactory& logFactory ) throw( ConfigError )
|
53
|
+
: m_threadid( 0 ),
|
54
|
+
m_application( application ),
|
55
|
+
m_messageStoreFactory( messageStoreFactory ),
|
56
|
+
m_settings( settings ),
|
57
|
+
m_pLogFactory( &logFactory ),
|
58
|
+
m_pLog( logFactory.create() ),
|
59
|
+
m_firstPoll( true ),
|
60
|
+
m_stop( true )
|
61
|
+
{ initialize(); }
|
62
|
+
|
63
|
+
void Initiator::initialize() throw ( ConfigError )
|
64
|
+
{
|
65
|
+
std::set < SessionID > sessions = m_settings.getSessions();
|
66
|
+
std::set < SessionID > ::iterator i;
|
67
|
+
|
68
|
+
if ( !sessions.size() )
|
69
|
+
throw ConfigError( "No sessions defined" );
|
70
|
+
|
71
|
+
SessionFactory factory( m_application, m_messageStoreFactory,
|
72
|
+
m_pLogFactory );
|
73
|
+
|
74
|
+
for ( i = sessions.begin(); i != sessions.end(); ++i )
|
75
|
+
{
|
76
|
+
if ( m_settings.get( *i ).getString( "ConnectionType" ) == "initiator" )
|
77
|
+
{
|
78
|
+
m_sessionIDs.insert( *i );
|
79
|
+
m_sessions[ *i ] = factory.create( *i, m_settings.get( *i ) );
|
80
|
+
setDisconnected( *i );
|
81
|
+
}
|
82
|
+
}
|
83
|
+
|
84
|
+
if ( !m_sessions.size() )
|
85
|
+
throw ConfigError( "No sessions defined for initiator" );
|
86
|
+
}
|
87
|
+
|
88
|
+
Initiator::~Initiator()
|
89
|
+
{
|
90
|
+
Sessions::iterator i;
|
91
|
+
for ( i = m_sessions.begin(); i != m_sessions.end(); ++i )
|
92
|
+
delete i->second;
|
93
|
+
|
94
|
+
if( m_pLogFactory && m_pLog )
|
95
|
+
m_pLogFactory->destroy( m_pLog );
|
96
|
+
}
|
97
|
+
|
98
|
+
Session* Initiator::getSession( const SessionID& sessionID,
|
99
|
+
Responder& responder )
|
100
|
+
{
|
101
|
+
Sessions::iterator i = m_sessions.find( sessionID );
|
102
|
+
if ( i != m_sessions.end() )
|
103
|
+
{
|
104
|
+
i->second->setResponder( &responder );
|
105
|
+
return i->second;
|
106
|
+
}
|
107
|
+
return 0;
|
108
|
+
}
|
109
|
+
|
110
|
+
Session* Initiator::getSession( const SessionID& sessionID ) const
|
111
|
+
{
|
112
|
+
Sessions::const_iterator i = m_sessions.find( sessionID );
|
113
|
+
if( i != m_sessions.end() )
|
114
|
+
return i->second;
|
115
|
+
else
|
116
|
+
return 0;
|
117
|
+
}
|
118
|
+
|
119
|
+
const Dictionary* const Initiator::getSessionSettings( const SessionID& sessionID ) const
|
120
|
+
{
|
121
|
+
try
|
122
|
+
{
|
123
|
+
return &m_settings.get( sessionID );
|
124
|
+
}
|
125
|
+
catch( ConfigError& )
|
126
|
+
{
|
127
|
+
return 0;
|
128
|
+
}
|
129
|
+
}
|
130
|
+
|
131
|
+
void Initiator::connect()
|
132
|
+
{
|
133
|
+
Locker l(m_mutex);
|
134
|
+
|
135
|
+
SessionIDs disconnected = m_disconnected;
|
136
|
+
SessionIDs::iterator i = disconnected.begin();
|
137
|
+
for ( ; i != disconnected.end(); ++i )
|
138
|
+
{
|
139
|
+
Session* pSession = Session::lookupSession( *i );
|
140
|
+
if ( pSession->isEnabled() && pSession->isSessionTime(UtcTimeStamp()) )
|
141
|
+
doConnect( *i, m_settings.get( *i ));
|
142
|
+
}
|
143
|
+
}
|
144
|
+
|
145
|
+
void Initiator::setPending( const SessionID& sessionID )
|
146
|
+
{
|
147
|
+
Locker l(m_mutex);
|
148
|
+
|
149
|
+
m_pending.insert( sessionID );
|
150
|
+
m_connected.erase( sessionID );
|
151
|
+
m_disconnected.erase( sessionID );
|
152
|
+
}
|
153
|
+
|
154
|
+
void Initiator::setConnected( const SessionID& sessionID )
|
155
|
+
{
|
156
|
+
Locker l(m_mutex);
|
157
|
+
|
158
|
+
m_pending.erase( sessionID );
|
159
|
+
m_connected.insert( sessionID );
|
160
|
+
m_disconnected.erase( sessionID );
|
161
|
+
}
|
162
|
+
|
163
|
+
void Initiator::setDisconnected( const SessionID& sessionID )
|
164
|
+
{
|
165
|
+
Locker l(m_mutex);
|
166
|
+
|
167
|
+
m_pending.erase( sessionID );
|
168
|
+
m_connected.erase( sessionID );
|
169
|
+
m_disconnected.insert( sessionID );
|
170
|
+
}
|
171
|
+
|
172
|
+
bool Initiator::isPending( const SessionID& sessionID )
|
173
|
+
{
|
174
|
+
Locker l(m_mutex);
|
175
|
+
return m_pending.find( sessionID ) != m_pending.end();
|
176
|
+
}
|
177
|
+
|
178
|
+
bool Initiator::isConnected( const SessionID& sessionID )
|
179
|
+
{
|
180
|
+
Locker l(m_mutex);
|
181
|
+
return m_connected.find( sessionID ) != m_connected.end();
|
182
|
+
}
|
183
|
+
|
184
|
+
bool Initiator::isDisconnected( const SessionID& sessionID )
|
185
|
+
{
|
186
|
+
Locker l(m_mutex);
|
187
|
+
return m_disconnected.find( sessionID ) != m_disconnected.end();
|
188
|
+
}
|
189
|
+
|
190
|
+
void Initiator::start() throw ( ConfigError, RuntimeError )
|
191
|
+
{
|
192
|
+
m_stop = false;
|
193
|
+
onConfigure( m_settings );
|
194
|
+
onInitialize( m_settings );
|
195
|
+
|
196
|
+
HttpServer::startGlobal( m_settings );
|
197
|
+
|
198
|
+
if( !thread_spawn( &startThread, this, m_threadid ) )
|
199
|
+
throw RuntimeError("Unable to spawn thread");
|
200
|
+
}
|
201
|
+
|
202
|
+
|
203
|
+
void Initiator::block() throw ( ConfigError, RuntimeError )
|
204
|
+
{
|
205
|
+
m_stop = false;
|
206
|
+
onConfigure( m_settings );
|
207
|
+
onInitialize( m_settings );
|
208
|
+
|
209
|
+
startThread(this);
|
210
|
+
}
|
211
|
+
|
212
|
+
bool Initiator::poll( double timeout ) throw ( ConfigError, RuntimeError )
|
213
|
+
{
|
214
|
+
if( m_firstPoll )
|
215
|
+
{
|
216
|
+
m_stop = false;
|
217
|
+
onConfigure( m_settings );
|
218
|
+
onInitialize( m_settings );
|
219
|
+
connect();
|
220
|
+
m_firstPoll = false;
|
221
|
+
}
|
222
|
+
|
223
|
+
return onPoll( timeout );
|
224
|
+
}
|
225
|
+
|
226
|
+
void Initiator::stop( bool force )
|
227
|
+
{
|
228
|
+
if( isStopped() ) return;
|
229
|
+
|
230
|
+
HttpServer::stopGlobal();
|
231
|
+
|
232
|
+
std::vector<Session*> enabledSessions;
|
233
|
+
|
234
|
+
SessionIDs connected = m_connected;
|
235
|
+
SessionIDs::iterator i = connected.begin();
|
236
|
+
for ( ; i != connected.end(); ++i )
|
237
|
+
{
|
238
|
+
Session* pSession = Session::lookupSession(*i);
|
239
|
+
if( pSession && pSession->isEnabled() )
|
240
|
+
{
|
241
|
+
enabledSessions.push_back( pSession );
|
242
|
+
pSession->logout();
|
243
|
+
}
|
244
|
+
}
|
245
|
+
|
246
|
+
if( !force )
|
247
|
+
{
|
248
|
+
for ( int second = 1; second <= 10 && isLoggedOn(); ++second )
|
249
|
+
process_sleep( 1 );
|
250
|
+
}
|
251
|
+
|
252
|
+
{
|
253
|
+
Locker l(m_mutex);
|
254
|
+
for ( i = connected.begin(); i != connected.end(); ++i )
|
255
|
+
setDisconnected( Session::lookupSession(*i)->getSessionID() );
|
256
|
+
}
|
257
|
+
|
258
|
+
m_stop = true;
|
259
|
+
onStop();
|
260
|
+
if( m_threadid )
|
261
|
+
thread_join( m_threadid );
|
262
|
+
m_threadid = 0;
|
263
|
+
|
264
|
+
std::vector<Session*>::iterator session = enabledSessions.begin();
|
265
|
+
for( ; session != enabledSessions.end(); ++session )
|
266
|
+
(*session)->logon();
|
267
|
+
}
|
268
|
+
|
269
|
+
bool Initiator::isLoggedOn()
|
270
|
+
{
|
271
|
+
Locker l(m_mutex);
|
272
|
+
|
273
|
+
SessionIDs connected = m_connected;
|
274
|
+
SessionIDs::iterator i = connected.begin();
|
275
|
+
for ( ; i != connected.end(); ++i )
|
276
|
+
{
|
277
|
+
if( Session::lookupSession(*i)->isLoggedOn() )
|
278
|
+
return true;
|
279
|
+
}
|
280
|
+
return false;
|
281
|
+
}
|
282
|
+
|
283
|
+
THREAD_PROC Initiator::startThread( void* p )
|
284
|
+
{
|
285
|
+
Initiator * pInitiator = static_cast < Initiator* > ( p );
|
286
|
+
pInitiator->onStart();
|
287
|
+
return 0;
|
288
|
+
}
|
289
|
+
}
|
@@ -0,0 +1,149 @@
|
|
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_INITIATOR_H
|
23
|
+
#define FIX_INITIATOR_H
|
24
|
+
|
25
|
+
#ifdef _MSC_VER
|
26
|
+
#pragma warning( disable : 4503 4355 4786 4290 )
|
27
|
+
#endif
|
28
|
+
|
29
|
+
#include "Application.h"
|
30
|
+
#include "MessageStore.h"
|
31
|
+
#include "Log.h"
|
32
|
+
#include "Responder.h"
|
33
|
+
#include "SessionSettings.h"
|
34
|
+
#include "Exceptions.h"
|
35
|
+
#include "Mutex.h"
|
36
|
+
#include "Session.h"
|
37
|
+
#include <set>
|
38
|
+
#include <map>
|
39
|
+
#include <string>
|
40
|
+
|
41
|
+
namespace FIX
|
42
|
+
{
|
43
|
+
class Client;
|
44
|
+
|
45
|
+
/**
|
46
|
+
* Base for classes which act as an initiator for establishing connections.
|
47
|
+
*
|
48
|
+
* Most users will not need to implement one of these. The default
|
49
|
+
* SocketInitiator implementation will be used in most cases.
|
50
|
+
*/
|
51
|
+
class Initiator
|
52
|
+
{
|
53
|
+
public:
|
54
|
+
Initiator( Application&, MessageStoreFactory&,
|
55
|
+
const SessionSettings& ) throw( ConfigError );
|
56
|
+
Initiator( Application&, MessageStoreFactory&,
|
57
|
+
const SessionSettings&, LogFactory& ) throw( ConfigError );
|
58
|
+
|
59
|
+
virtual ~Initiator();
|
60
|
+
|
61
|
+
/// Start initiator.
|
62
|
+
void start() throw ( ConfigError, RuntimeError );
|
63
|
+
/// Block on the initiator
|
64
|
+
void block() throw ( ConfigError, RuntimeError );
|
65
|
+
/// Poll the initiator
|
66
|
+
bool poll( double timeout = 0.0 ) throw ( ConfigError, RuntimeError );
|
67
|
+
|
68
|
+
/// Stop initiator.
|
69
|
+
void stop( bool force = false );
|
70
|
+
|
71
|
+
/// Check to see if any sessions are currently logged on
|
72
|
+
bool isLoggedOn();
|
73
|
+
|
74
|
+
Session* getSession( const SessionID& sessionID, Responder& );
|
75
|
+
|
76
|
+
const std::set<SessionID>& getSessions() const { return m_sessionIDs; }
|
77
|
+
Session* getSession( const SessionID& sessionID ) const;
|
78
|
+
const Dictionary* const getSessionSettings( const SessionID& sessionID ) const;
|
79
|
+
|
80
|
+
bool has( const SessionID& id )
|
81
|
+
{ return m_sessions.find( id ) != m_sessions.end(); }
|
82
|
+
|
83
|
+
bool isStopped() { return m_stop; }
|
84
|
+
|
85
|
+
public:
|
86
|
+
Application& getApplication() { return m_application; }
|
87
|
+
MessageStoreFactory& getMessageStoreFactory()
|
88
|
+
{ return m_messageStoreFactory; }
|
89
|
+
|
90
|
+
Log* getLog()
|
91
|
+
{
|
92
|
+
if( m_pLog ) return m_pLog;
|
93
|
+
return &m_nullLog;
|
94
|
+
}
|
95
|
+
|
96
|
+
protected:
|
97
|
+
void setPending( const SessionID& );
|
98
|
+
void setConnected( const SessionID& );
|
99
|
+
void setDisconnected( const SessionID& );
|
100
|
+
|
101
|
+
bool isPending( const SessionID& );
|
102
|
+
bool isConnected( const SessionID& );
|
103
|
+
bool isDisconnected( const SessionID& );
|
104
|
+
void connect();
|
105
|
+
|
106
|
+
private:
|
107
|
+
void initialize() throw ( ConfigError );
|
108
|
+
|
109
|
+
/// Implemented to configure acceptor
|
110
|
+
virtual void onConfigure( const SessionSettings& ) throw ( ConfigError ) {};
|
111
|
+
/// Implemented to initialize initiator
|
112
|
+
virtual void onInitialize( const SessionSettings& ) throw ( RuntimeError ) {};
|
113
|
+
/// Implemented to start connecting to targets.
|
114
|
+
virtual void onStart() = 0;
|
115
|
+
/// Implemented to connect and poll for events.
|
116
|
+
virtual bool onPoll( double timeout ) = 0;
|
117
|
+
/// Implemented to stop a running initiator.
|
118
|
+
virtual void onStop() = 0;
|
119
|
+
/// Implemented to connect a session to its target.
|
120
|
+
virtual void doConnect( const SessionID&, const Dictionary& ) = 0;
|
121
|
+
|
122
|
+
static THREAD_PROC startThread( void* p );
|
123
|
+
|
124
|
+
typedef std::set < SessionID > SessionIDs;
|
125
|
+
typedef std::map < SessionID, int > SessionState;
|
126
|
+
typedef std::map < SessionID, Session* > Sessions;
|
127
|
+
|
128
|
+
Sessions m_sessions;
|
129
|
+
SessionIDs m_sessionIDs;
|
130
|
+
SessionIDs m_pending;
|
131
|
+
SessionIDs m_connected;
|
132
|
+
SessionIDs m_disconnected;
|
133
|
+
SessionState m_sessionState;
|
134
|
+
|
135
|
+
thread_id m_threadid;
|
136
|
+
Application& m_application;
|
137
|
+
MessageStoreFactory& m_messageStoreFactory;
|
138
|
+
SessionSettings m_settings;
|
139
|
+
LogFactory* m_pLogFactory;
|
140
|
+
Log* m_pLog;
|
141
|
+
NullLog m_nullLog;
|
142
|
+
bool m_firstPoll;
|
143
|
+
bool m_stop;
|
144
|
+
Mutex m_mutex;
|
145
|
+
};
|
146
|
+
/*! @} */
|
147
|
+
}
|
148
|
+
|
149
|
+
#endif // FIX_INITIATOR_H
|
@@ -0,0 +1,77 @@
|
|
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 "Log.h"
|
27
|
+
|
28
|
+
namespace FIX
|
29
|
+
{
|
30
|
+
Mutex ScreenLog::s_mutex;
|
31
|
+
|
32
|
+
Log* ScreenLogFactory::create()
|
33
|
+
{
|
34
|
+
bool incoming, outgoing, event;
|
35
|
+
init( m_settings.get(), incoming, outgoing, event );
|
36
|
+
return new ScreenLog( incoming, outgoing, event );
|
37
|
+
}
|
38
|
+
|
39
|
+
Log* ScreenLogFactory::create( const SessionID& sessionID )
|
40
|
+
{
|
41
|
+
Dictionary settings;
|
42
|
+
if( m_settings.has(sessionID) )
|
43
|
+
settings = m_settings.get( sessionID );
|
44
|
+
|
45
|
+
bool incoming, outgoing, event;
|
46
|
+
init( settings, incoming, outgoing, event );
|
47
|
+
return new ScreenLog( sessionID, incoming, outgoing, event );
|
48
|
+
}
|
49
|
+
|
50
|
+
void ScreenLogFactory::init( const Dictionary& settings, bool& incoming, bool& outgoing, bool& event )
|
51
|
+
{
|
52
|
+
if( m_useSettings )
|
53
|
+
{
|
54
|
+
incoming = true;
|
55
|
+
outgoing = true;
|
56
|
+
event = true;
|
57
|
+
|
58
|
+
if( settings.has(SCREEN_LOG_SHOW_INCOMING) )
|
59
|
+
incoming = settings.getBool(SCREEN_LOG_SHOW_INCOMING);
|
60
|
+
if( settings.has(SCREEN_LOG_SHOW_OUTGOING) )
|
61
|
+
outgoing = settings.getBool(SCREEN_LOG_SHOW_OUTGOING);
|
62
|
+
if( settings.has(SCREEN_LOG_SHOW_EVENTS) )
|
63
|
+
event = settings.getBool(SCREEN_LOG_SHOW_EVENTS);
|
64
|
+
}
|
65
|
+
else
|
66
|
+
{
|
67
|
+
incoming = m_incoming;
|
68
|
+
outgoing = m_outgoing;
|
69
|
+
event = m_event;
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
73
|
+
void ScreenLogFactory::destroy( Log* pLog )
|
74
|
+
{
|
75
|
+
delete pLog;
|
76
|
+
}
|
77
|
+
} //namespace FIX
|
data/ext/quickfix/Log.h
ADDED
@@ -0,0 +1,179 @@
|
|
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_LOG_H
|
23
|
+
#define FIX_LOG_H
|
24
|
+
|
25
|
+
#ifdef _MSC_VER
|
26
|
+
#pragma warning( disable : 4503 4355 4786 4290 )
|
27
|
+
#endif
|
28
|
+
|
29
|
+
#include "Message.h"
|
30
|
+
#include "Mutex.h"
|
31
|
+
#include "SessionSettings.h"
|
32
|
+
#include <map>
|
33
|
+
#include <vector>
|
34
|
+
|
35
|
+
namespace FIX
|
36
|
+
{
|
37
|
+
class Log;
|
38
|
+
|
39
|
+
/**
|
40
|
+
* This interface must be implemented to create a Log.
|
41
|
+
*/
|
42
|
+
class LogFactory
|
43
|
+
{
|
44
|
+
public:
|
45
|
+
virtual ~LogFactory() {}
|
46
|
+
virtual Log* create() = 0;
|
47
|
+
virtual Log* create( const SessionID& ) = 0;
|
48
|
+
virtual void destroy( Log* ) = 0;
|
49
|
+
};
|
50
|
+
|
51
|
+
/**
|
52
|
+
* Creates a screen based implementation of Log.
|
53
|
+
*
|
54
|
+
* This displays all log events onto the standard output
|
55
|
+
*/
|
56
|
+
class ScreenLogFactory : public LogFactory
|
57
|
+
{
|
58
|
+
public:
|
59
|
+
ScreenLogFactory( const SessionSettings& settings )
|
60
|
+
: m_useSettings( true ), m_settings( settings ) {};
|
61
|
+
ScreenLogFactory( bool incoming, bool outgoing, bool event )
|
62
|
+
: m_incoming( incoming ), m_outgoing( outgoing ), m_event( event ), m_useSettings( false ) {}
|
63
|
+
|
64
|
+
Log* create();
|
65
|
+
Log* create( const SessionID& );
|
66
|
+
void destroy( Log* log );
|
67
|
+
|
68
|
+
private:
|
69
|
+
void init( const Dictionary& settings, bool& incoming, bool& outgoing, bool& event );
|
70
|
+
|
71
|
+
bool m_incoming;
|
72
|
+
bool m_outgoing;
|
73
|
+
bool m_event;
|
74
|
+
bool m_useSettings;
|
75
|
+
SessionSettings m_settings;
|
76
|
+
};
|
77
|
+
|
78
|
+
/**
|
79
|
+
* This interface must be implemented to log messages and events
|
80
|
+
*/
|
81
|
+
class Log
|
82
|
+
{
|
83
|
+
public:
|
84
|
+
virtual ~Log() {}
|
85
|
+
|
86
|
+
virtual void clear() = 0;
|
87
|
+
virtual void backup() = 0;
|
88
|
+
virtual void onIncoming( const std::string& ) = 0;
|
89
|
+
virtual void onOutgoing( const std::string& ) = 0;
|
90
|
+
virtual void onEvent( const std::string& ) = 0;
|
91
|
+
};
|
92
|
+
/*! @} */
|
93
|
+
|
94
|
+
/**
|
95
|
+
* Null implementation of Log
|
96
|
+
*
|
97
|
+
* This is only for internal use. Used when no log factory is
|
98
|
+
* passed to the initiator or acceptor.
|
99
|
+
*/
|
100
|
+
class NullLog : public Log
|
101
|
+
{
|
102
|
+
public:
|
103
|
+
void clear() {}
|
104
|
+
void backup() {}
|
105
|
+
void onIncoming( const std::string& ) {}
|
106
|
+
void onOutgoing( const std::string& ) {}
|
107
|
+
void onEvent( const std::string& ) {}
|
108
|
+
};
|
109
|
+
|
110
|
+
/**
|
111
|
+
* Screen based implementation of Log.
|
112
|
+
*
|
113
|
+
* This will display all log information onto the standard output
|
114
|
+
*/
|
115
|
+
class ScreenLog : public Log
|
116
|
+
{
|
117
|
+
public:
|
118
|
+
ScreenLog( bool incoming, bool outgoing, bool event )
|
119
|
+
: m_prefix( "GLOBAL" ),
|
120
|
+
m_incoming( incoming ), m_outgoing( outgoing ), m_event( event ), m_millisecondsInTimeStamp( true ) {}
|
121
|
+
|
122
|
+
ScreenLog( const SessionID& sessionID,
|
123
|
+
bool incoming, bool outgoing, bool event )
|
124
|
+
: m_prefix( sessionID.toString() ),
|
125
|
+
m_incoming( incoming ), m_outgoing( outgoing ), m_event( event ), m_millisecondsInTimeStamp( true ) {}
|
126
|
+
|
127
|
+
void clear() {}
|
128
|
+
void backup() {}
|
129
|
+
|
130
|
+
void onIncoming( const std::string& value )
|
131
|
+
{
|
132
|
+
if ( !m_incoming ) return ;
|
133
|
+
Locker l( s_mutex );
|
134
|
+
m_time.setCurrent();
|
135
|
+
std::cout << "<" << UtcTimeStampConvertor::convert(m_time, m_millisecondsInTimeStamp)
|
136
|
+
<< ", " << m_prefix
|
137
|
+
<< ", " << "incoming>" << std::endl
|
138
|
+
<< " (" << value << ")" << std::endl;
|
139
|
+
}
|
140
|
+
|
141
|
+
void onOutgoing( const std::string& value )
|
142
|
+
{
|
143
|
+
if ( !m_outgoing ) return ;
|
144
|
+
Locker l( s_mutex );
|
145
|
+
m_time.setCurrent();
|
146
|
+
std::cout << "<" << UtcTimeStampConvertor::convert(m_time, m_millisecondsInTimeStamp)
|
147
|
+
<< ", " << m_prefix
|
148
|
+
<< ", " << "outgoing>" << std::endl
|
149
|
+
<< " (" << value << ")" << std::endl;
|
150
|
+
}
|
151
|
+
|
152
|
+
void onEvent( const std::string& value )
|
153
|
+
{
|
154
|
+
if ( !m_event ) return ;
|
155
|
+
Locker l( s_mutex );
|
156
|
+
m_time.setCurrent();
|
157
|
+
std::cout << "<" << UtcTimeStampConvertor::convert(m_time, m_millisecondsInTimeStamp)
|
158
|
+
<< ", " << m_prefix
|
159
|
+
<< ", " << "event>" << std::endl
|
160
|
+
<< " (" << value << ")" << std::endl;
|
161
|
+
}
|
162
|
+
|
163
|
+
bool getMillisecondsInTimeStamp() const
|
164
|
+
{ return m_millisecondsInTimeStamp; }
|
165
|
+
void setMillisecondsInTimeStamp ( bool value )
|
166
|
+
{ m_millisecondsInTimeStamp = value; }
|
167
|
+
|
168
|
+
private:
|
169
|
+
std::string m_prefix;
|
170
|
+
UtcTimeStamp m_time;
|
171
|
+
bool m_incoming;
|
172
|
+
bool m_outgoing;
|
173
|
+
bool m_event;
|
174
|
+
static Mutex s_mutex;
|
175
|
+
bool m_millisecondsInTimeStamp;
|
176
|
+
};
|
177
|
+
}
|
178
|
+
|
179
|
+
#endif //FIX_LOG_H
|