OnixS C++ B3 BOE Binary Order Entry 1.3.0
API Documentation
Loading...
Searching...
No Matches
Gateway.h
Go to the documentation of this file.
1// Copyright Onix Solutions Limited [OnixS]. All rights reserved.
2//
3// This software owned by Onix Solutions Limited [OnixS] and is
4// protected by copyright law and international copyright treaties.
5//
6// Access to and use of the software is governed by the terms of the applicable
7// OnixS Software Services Agreement (the Agreement) and Customer end user license
8// agreements granting a non-assignable, non-transferable and non-exclusive license
9// to use the software for it's own data processing purposes under the terms defined
10// in the Agreement.
11//
12// Except as otherwise granted within the terms of the Agreement, copying or
13// reproduction of any part of this source code or associated reference material
14// to any other location for further reproduction or redistribution, and any
15// amendments to this copyright notice, are expressly prohibited.
16//
17// Any reproduction or redistribution for sale or hiring of the Software not in
18// accordance with the terms of the Agreement is a violation of copyright law.
19
20#pragma once
21
24
25#if defined(ONIXS_B3_BOE_HAS_GATEWAY_EMULATOR)
26
30
31#include <chrono>
32#include <atomic>
33
34namespace OnixS {
35namespace B3 {
36namespace BOE {
37namespace Testing {
38
39// Assume NegotiateResponse2::credentials is empty
40constexpr
42{
43 using Message = NegotiateResponse2;
44
45 return
46 Message::blockLength(Message::Schema::Version)
48 + Message::getMinimalVariableFieldsSize(Message::Schema::Version);
49}
50
51// Type aliases
58
64
67{
68public:
70 using Timeout = std::chrono::milliseconds;
71
72 Gateway(const SessionSettings::LicenseStores& licenseStores, int port, const char* host = "127.0.0.1",
73 const Timeout& acceptTimeout = defaultTimeout(),
74 const Timeout& sendReceiveTimeout = defaultTimeout());
75
77 virtual ~Gateway();
78
80 Gateway(const Gateway&) = delete;
81 Gateway& operator=(const Gateway&) = delete;
82
84 Gateway(Gateway&&) noexcept;
85 Gateway& operator=(Gateway&&) noexcept;
86
88 void swap(Gateway&) noexcept;
89
92 Gateway& acceptConnection(const Timeout& acceptTimeout = defaultTimeout());
93
96 bool tryAcceptConnection(const Timeout& acceptTimeout = defaultTimeout());
97
99 Gateway& acceptSession(SeqNumber outgoingSequenceNumber = 1);
100
107 ClientMessageListener* listener = nullptr, ClientSessionMessageListener* sessionMessageListener = nullptr,
108 std::atomic<bool>* stopRequested = nullptr);
109
111 Gateway& sendSequence(UInt32 nextSeqNo);
112
115
117 const char * host() const noexcept;
118
121 int port() const noexcept;
122
124 Gateway& enableLogger(const std::string& logFileName, unsigned int logLevel = 3);
125
128 template <typename SbeMessageType, size_t MaxMessageSize, typename MessageInitializer>
129 Gateway& send(BOE::Messaging::MessageHolder<SbeMessageType, MaxMessageSize, MessageInitializer>& msg);
130
133 template <typename SbeMessageType, size_t MaxMessageSize, typename MessageInitializer>
134 Gateway& send(BOE::Messaging::MessageHolder<SbeMessageType, MaxMessageSize, MessageInitializer>&& msg);
135
138 template <typename SbeMessageType, size_t MaxMessageSize, typename MessageInitializer>
139 Gateway& send(BOE::Messaging::MessageHolder<SbeMessageType, MaxMessageSize, MessageInitializer>& msg, SeqNumber num);
140
143 template <typename SbeMessageType, size_t MaxMessageSize, typename MessageInitializer>
144 Gateway& send(BOE::Messaging::MessageHolder<SbeMessageType, MaxMessageSize, MessageInitializer>&& msg, SeqNumber num);
145
148 template <typename SbeMessageType, size_t MaxMessageSize, typename MessageInitializer>
149 Gateway& send(BOE::Messaging::MessageHolder<SbeMessageType, MaxMessageSize, MessageInitializer>& msg, std::initializer_list<SeqNumber> numbers);
150
153 template <typename SbeMessageType, size_t MaxMessageSize, typename MessageInitializer>
154 Gateway& send(BOE::Messaging::MessageHolder<SbeMessageType, MaxMessageSize, MessageInitializer>&& msg, std::initializer_list<SeqNumber> numbers);
155
156
160 template <typename TMsg>
162
168
174 Gateway& run(ClientMessageListener& appMsgListener, ClientSessionMessageListener& sessionMsgListener);
175
178 SeqNumber outSeqNum() const noexcept;
179
181 Gateway& outSeqNum(SeqNumber nextOutSeqNum) noexcept;
182
185 UInt64 sessionVerId() const noexcept
186 {
187 return uId_;
188 }
189
192 SessionID sessionId() const noexcept
193 {
194 return sessionId_;
195 }
196
198 Gateway& tcpNoDelayOption(bool noDelay);
199
204 bool tcpNoDelayOption() const noexcept ;
205
211
217
222 int socketSendBufferSize() const noexcept;
223
229
230protected:
233 bool isConnectionClosed(const Timeout& timeout) const;
234
238 bool isConnectionClosed() const;
239
242
246
251
256
261
266
270 Establish4Ptr acceptEstablish(UInt32 outgoingSequenceNumber = 1, unsigned gatewayKeepAliveInterval = 0);
271
275 Establish4Ptr rejectEstablish(UInt32 outgoingSequenceNumber = 1, EstablishRejectCode::Enum errorCodes = EstablishRejectCode::Enum());
276
281
286
289
292
295
298
300 EstablishAck5Container createEstablishmentAck(const Establish4Ptr& request, UInt32 outgoingSequenceNumber, unsigned gatewayKeepAliveInterval = 0);
301
303 EstablishReject6Container createEstablishReject(const Establish4Ptr& request, UInt32 outgoingSequenceNumber, EstablishRejectCode::Enum errorCodes);
304
307
310
313
316
318 Gateway& sendData(const void* data, size_t size);
319
322
325 {
326 return Timeout(30000);
327 }
328
330 UInt64 uId_{0};
331
334
335private:
336
337 class Impl;
338 Impl* impl_;
339};
340
341
342template <typename TMsg>
347
348template <typename SbeMessageType, size_t MaxMessageSize, typename MessageInitializer>
350{
351 const auto messageSize = msg.setHeader();
352 auto* const header = msg.header();
353 assert(header);
354
355 return send(Messaging::SbeMessage(header + 1, messageSize), *header);
356}
357
358template <typename SbeMessageType, size_t MaxMessageSize, typename MessageInitializer>
363
364template <typename SbeMessageType, size_t MaxMessageSize, typename MessageInitializer>
366{
367 auto & header = msg->businessHeader();
368 header.setMsgSeqNum(num);
369 return send(msg);
370}
371
372template <typename SbeMessageType, size_t MaxMessageSize, typename MessageInitializer>
374{
375 auto & header = msg->businessHeader();
376 header.setMsgSeqNum(num);
377 return send(msg);
378}
379
380template <typename SbeMessageType, size_t MaxMessageSize, typename MessageInitializer>
383{
384 for(auto seqNum : numbers)
385 {
386 send(msg, seqNum);
387 }
388
389 return *this;
390}
391
392template <typename SbeMessageType, size_t MaxMessageSize, typename MessageInitializer>
394 BOE::Messaging::MessageHolder<SbeMessageType, MaxMessageSize, MessageInitializer>&& msg, std::initializer_list<SeqNumber> numbers)
395{
396 for(auto seqNum : numbers)
397 {
398 send(msg, seqNum);
399 }
400
401 return *this;
402}
403
404
405}}}}
406
407
408#endif
#define ONIXS_B3_BOE_NODISCARD
Definition Compiler.h:191
#define ONIXS_B3_BOE_EXPORTED
Definition Compiler.h:181
Contains the SimpleOpenFramingHeader, the SBE message, and the data buffer.
const SimpleOpenFramingHeader * header() const noexcept
MessageSize setHeader() noexcept
Calculates the binary size of the message and updates the Simple Open Framing Header accordingly.
std::vector< std::string > LicenseStores
Folders that contain license file(s).
int socketSendBufferSize() const noexcept
Gateway & acceptConnection(const Timeout &acceptTimeout=defaultTimeout())
Accepts an incoming connection.
Terminate7Ptr receiveTerminate()
Receive the Terminate7 message.
Gateway(const SessionSettings::LicenseStores &licenseStores, int port, const char *host="127.0.0.1", const Timeout &acceptTimeout=defaultTimeout(), const Timeout &sendReceiveTimeout=defaultTimeout())
Sequence9Container createSequence(UInt32 nextSeqNo)
Creates a Sequence9 message.
Terminate7Ptr acceptTerminate()
Receive the Terminate7 message and responds with the Terminate7 message.
bool tryAcceptConnection(const Timeout &acceptTimeout=defaultTimeout())
Accepts an incoming connection.
MessageBasePtr receive() const
Receives a message.
Gateway(const Gateway &)=delete
Deleted.
std::chrono::milliseconds Timeout
Timeout alias.
Definition Gateway.h:70
Gateway & acceptSession(SeqNumber outgoingSequenceNumber=1)
Accepts an incoming FIXP session.
Gateway & sendData(const void *data, size_t size)
Sends the given data.
SeqNumber outSeqNum() const noexcept
NegotiateResponse2Container createNegotiationResponse(const Negotiate1Ptr &request)
Creates a NegotiateResponse2 message.
Establish4Ptr receiveEstablish()
Receives the Establish4 message.
Gateway & operator=(const Gateway &)=delete
Gateway & sendTerminate(TerminationCode::Enum errCode=TerminationCode::Finished)
Sends the Terminate7 message.
EstablishReject6Container createEstablishReject(const Establish4Ptr &request, UInt32 outgoingSequenceNumber, EstablishRejectCode::Enum errorCodes)
Creates a EstablishReject6 message.
Negotiate1Ptr receiveNegotiate()
Receives the Negotiate1 message.
Gateway & sendSequence(UInt32 nextSeqNo)
Sends the Sequence9 message.
Gateway & enableLogger(const std::string &logFileName, unsigned int logLevel=3)
Enables logging.
Gateway & close()
Close the listening socket.
Gateway & disconnect()
Closes the accepted connection.
UInt64 uId_
sessionVerId.
Definition Gateway.h:330
Gateway(Gateway &&) noexcept
Move semantic.
Negotiate1Ptr acceptNegotiate()
Receives the Negotiate1 and responds with the NegotiateResponse2 message.
bool tcpNoDelayOption() const noexcept
Establish4Ptr acceptEstablish(UInt32 outgoingSequenceNumber=1, unsigned gatewayKeepAliveInterval=0)
Receive the Establish4 message and respond with the EstablishAck5 message.
SessionID sessionId() const noexcept
Definition Gateway.h:192
Establish4Ptr rejectEstablish(UInt32 outgoingSequenceNumber=1, EstablishRejectCode::Enum errorCodes=EstablishRejectCode::Enum())
Receives the Establish4 message and responds with the EstablishReject6 message.
SessionID sessionId_
sessionId.
Definition Gateway.h:333
NegotiateReject3Container createNegotiateReject(const Negotiate1Ptr &request, NegotiationRejectCode::Enum errorCodes)
Creates a NegotiateReject3 message.
EstablishAck5Container createEstablishmentAck(const Establish4Ptr &request, UInt32 outgoingSequenceNumber, unsigned gatewayKeepAliveInterval=0)
Creates a EstablishAck5 message.
Gateway & run(ClientMessageListener &listener)
Accepts an incoming connection and establishes the session.
Terminate7Container createTerminate(const Terminate7Ptr &request)
Creates a Terminate7 message.
Gateway & send(BOE::Messaging::MessageHolder< SbeMessageType, MaxMessageSize, MessageInitializer > &msg)
Sends the given message.
Definition Gateway.h:349
Negotiate1Ptr rejectNegotiate(NegotiationRejectCode::Enum errorCodes=NegotiationRejectCode::Enum())
Receives the Negotiate1 message and responds with the NegotiateReject3 message.
static Timeout defaultTimeout()
Default timeout.
Definition Gateway.h:324
Terminate7Ptr terminate(TerminationCode::Enum errCode=TerminationCode::Finished)
Sends the Terminate7 message and waits until the response is received.
UInt64 sessionVerId() const noexcept
Definition Gateway.h:185
const char * host() const noexcept
Terminate7Ptr waitUntilTerminate(ClientMessageListener *listener=nullptr, ClientSessionMessageListener *sessionMessageListener=nullptr, std::atomic< bool > *stopRequested=nullptr)
Waits until the Terminate7 message is received.
bool isConnectionClosed(const Timeout &timeout) const
Checks whether the connection is closed by the counterparty.
MessagePtr< TMsg > receiveTypedMessage()
Receives the message of the particular type.
Definition Gateway.h:343
void swap(Gateway &) noexcept
Swap with other.
Gateway & tcpNoDelayOption(bool noDelay)
Sets the value of the option to improve latency at the expense of message throughput (the TCP_NODELAY...
MessageBasePtr tryReceive(const Timeout &timeout=defaultTimeout()) const
Receives a message using the provided timeout.
UInt32 SessionID
Client connection identification on the gateway assigned by B3.
Definition Fields.h:103
MessageHolder< EstablishReject6 > EstablishReject6Container
Definition Gateway.h:55
MessageHolder< EstablishAck5 > EstablishAck5Container
Definition Gateway.h:54
MessagePtr< Negotiate1 > Negotiate1Ptr
Definition Gateway.h:60
MessageHolder< Sequence9 > Sequence9Container
Definition Gateway.h:57
MessagePtr< Terminate7 > Terminate7Ptr
Definition Gateway.h:62
MessagePtr< Establish4 > Establish4Ptr
Definition Gateway.h:61
constexpr UInt16 calculateNegotiateResponse2MaxSize()
Definition Gateway.h:41
MessageHolder< Terminate7 > Terminate7Container
Definition Gateway.h:56
MessageHolder< NegotiateReject3 > NegotiateReject3Container
Definition Gateway.h:53
MessagePtr< Sequence9 > Sequence9Ptr
Definition Gateway.h:63
MessagePtr< AnotherType > cast(const MessagePtr< BaseType > &ptr)
Tries to cast to another type.
Definition MessagePtr.h:227
MessagePtr< SbeMessage > MessageBasePtr
Definition Gateway.h:59
MessageHolder< NegotiateResponse2, calculateNegotiateResponse2MaxSize()> NegotiateResponse2Container
Definition Gateway.h:52
Messaging::UInt32 SeqNumber
Definition Messaging.h:52
Identifies the code of reject establishment.
Definition Fields.h:1232
The NegotiationResponse message is sent when a Negotiate message from the client is accepted by B3.
Definition Messages.h:593
Identifies the code of reject negotiation.
Definition Fields.h:1174
Identifies the code of termination.
Definition Fields.h:1296