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 FIX41_MESSAGECRACKER_H
23 #define FIX41_MESSAGECRACKER_H
24 
25 
26 #include "../SessionID.h"
27 #include "../Exceptions.h"
28 
29 #include "../fix41/Message.h"
30 
31 namespace FIX41
32 {
33   class Heartbeat;
34   class TestRequest;
35   class ResendRequest;
36   class Reject;
37   class SequenceReset;
38   class Logout;
39   class IOI;
40   class Advertisement;
41   class ExecutionReport;
42   class OrderCancelReject;
43   class Logon;
44   class News;
45   class Email;
46   class NewOrderSingle;
47   class NewOrderList;
48   class OrderCancelRequest;
49   class OrderCancelReplaceRequest;
50   class OrderStatusRequest;
51   class Allocation;
52   class ListCancelRequest;
53   class ListExecute;
54   class ListStatusRequest;
55   class ListStatus;
56   class AllocationInstructionAck;
57   class DontKnowTrade;
58   class QuoteRequest;
59   class Quote;
60   class SettlementInstructions;
61 
62   class MessageCracker
63   {
64   public:
~MessageCracker()65   virtual ~MessageCracker() {}
onMessage(const Message &,const FIX::SessionID &)66   virtual void onMessage( const Message&, const FIX::SessionID& )
67     { throw FIX::UnsupportedMessageType(); }
onMessage(Message &,const FIX::SessionID &)68   virtual void onMessage( Message&, const FIX::SessionID& )
69     { throw FIX::UnsupportedMessageType(); }
onMessage(const Heartbeat &,const FIX::SessionID &)70  virtual void onMessage( const Heartbeat&, const FIX::SessionID& )
71     {}
onMessage(const TestRequest &,const FIX::SessionID &)72   virtual void onMessage( const TestRequest&, const FIX::SessionID& )
73     {}
onMessage(const ResendRequest &,const FIX::SessionID &)74   virtual void onMessage( const ResendRequest&, const FIX::SessionID& )
75     {}
onMessage(const Reject &,const FIX::SessionID &)76   virtual void onMessage( const Reject&, const FIX::SessionID& )
77     {}
onMessage(const SequenceReset &,const FIX::SessionID &)78   virtual void onMessage( const SequenceReset&, const FIX::SessionID& )
79     {}
onMessage(const Logout &,const FIX::SessionID &)80   virtual void onMessage( const Logout&, const FIX::SessionID& )
81     {}
onMessage(const IOI &,const FIX::SessionID &)82   virtual void onMessage( const IOI&, const FIX::SessionID& )
83     { throw FIX::UnsupportedMessageType(); }
onMessage(const Advertisement &,const FIX::SessionID &)84   virtual void onMessage( const Advertisement&, const FIX::SessionID& )
85     { throw FIX::UnsupportedMessageType(); }
onMessage(const ExecutionReport &,const FIX::SessionID &)86   virtual void onMessage( const ExecutionReport&, const FIX::SessionID& )
87     { throw FIX::UnsupportedMessageType(); }
onMessage(const OrderCancelReject &,const FIX::SessionID &)88   virtual void onMessage( const OrderCancelReject&, const FIX::SessionID& )
89     { throw FIX::UnsupportedMessageType(); }
onMessage(const Logon &,const FIX::SessionID &)90   virtual void onMessage( const Logon&, const FIX::SessionID& )
91     {}
onMessage(const News &,const FIX::SessionID &)92   virtual void onMessage( const News&, const FIX::SessionID& )
93     { throw FIX::UnsupportedMessageType(); }
onMessage(const Email &,const FIX::SessionID &)94   virtual void onMessage( const Email&, const FIX::SessionID& )
95     { throw FIX::UnsupportedMessageType(); }
onMessage(const NewOrderSingle &,const FIX::SessionID &)96   virtual void onMessage( const NewOrderSingle&, const FIX::SessionID& )
97     { throw FIX::UnsupportedMessageType(); }
onMessage(const NewOrderList &,const FIX::SessionID &)98   virtual void onMessage( const NewOrderList&, const FIX::SessionID& )
99     { throw FIX::UnsupportedMessageType(); }
onMessage(const OrderCancelRequest &,const FIX::SessionID &)100   virtual void onMessage( const OrderCancelRequest&, const FIX::SessionID& )
101     { throw FIX::UnsupportedMessageType(); }
onMessage(const OrderCancelReplaceRequest &,const FIX::SessionID &)102   virtual void onMessage( const OrderCancelReplaceRequest&, const FIX::SessionID& )
103     { throw FIX::UnsupportedMessageType(); }
onMessage(const OrderStatusRequest &,const FIX::SessionID &)104   virtual void onMessage( const OrderStatusRequest&, const FIX::SessionID& )
105     { throw FIX::UnsupportedMessageType(); }
onMessage(const Allocation &,const FIX::SessionID &)106   virtual void onMessage( const Allocation&, const FIX::SessionID& )
107     { throw FIX::UnsupportedMessageType(); }
onMessage(const ListCancelRequest &,const FIX::SessionID &)108   virtual void onMessage( const ListCancelRequest&, const FIX::SessionID& )
109     { throw FIX::UnsupportedMessageType(); }
onMessage(const ListExecute &,const FIX::SessionID &)110   virtual void onMessage( const ListExecute&, const FIX::SessionID& )
111     { throw FIX::UnsupportedMessageType(); }
onMessage(const ListStatusRequest &,const FIX::SessionID &)112   virtual void onMessage( const ListStatusRequest&, const FIX::SessionID& )
113     { throw FIX::UnsupportedMessageType(); }
onMessage(const ListStatus &,const FIX::SessionID &)114   virtual void onMessage( const ListStatus&, const FIX::SessionID& )
115     { throw FIX::UnsupportedMessageType(); }
onMessage(const AllocationInstructionAck &,const FIX::SessionID &)116   virtual void onMessage( const AllocationInstructionAck&, const FIX::SessionID& )
117     { throw FIX::UnsupportedMessageType(); }
onMessage(const DontKnowTrade &,const FIX::SessionID &)118   virtual void onMessage( const DontKnowTrade&, const FIX::SessionID& )
119     { throw FIX::UnsupportedMessageType(); }
onMessage(const QuoteRequest &,const FIX::SessionID &)120   virtual void onMessage( const QuoteRequest&, const FIX::SessionID& )
121     { throw FIX::UnsupportedMessageType(); }
onMessage(const Quote &,const FIX::SessionID &)122   virtual void onMessage( const Quote&, const FIX::SessionID& )
123     { throw FIX::UnsupportedMessageType(); }
onMessage(const SettlementInstructions &,const FIX::SessionID &)124   virtual void onMessage( const SettlementInstructions&, const FIX::SessionID& )
125     { throw FIX::UnsupportedMessageType(); }
onMessage(Heartbeat &,const FIX::SessionID &)126   virtual void onMessage( Heartbeat&, const FIX::SessionID& ) {}
onMessage(TestRequest &,const FIX::SessionID &)127  virtual void onMessage( TestRequest&, const FIX::SessionID& ) {}
onMessage(ResendRequest &,const FIX::SessionID &)128  virtual void onMessage( ResendRequest&, const FIX::SessionID& ) {}
onMessage(Reject &,const FIX::SessionID &)129  virtual void onMessage( Reject&, const FIX::SessionID& ) {}
onMessage(SequenceReset &,const FIX::SessionID &)130  virtual void onMessage( SequenceReset&, const FIX::SessionID& ) {}
onMessage(Logout &,const FIX::SessionID &)131  virtual void onMessage( Logout&, const FIX::SessionID& ) {}
onMessage(IOI &,const FIX::SessionID &)132  virtual void onMessage( IOI&, const FIX::SessionID& ) {}
onMessage(Advertisement &,const FIX::SessionID &)133  virtual void onMessage( Advertisement&, const FIX::SessionID& ) {}
onMessage(ExecutionReport &,const FIX::SessionID &)134  virtual void onMessage( ExecutionReport&, const FIX::SessionID& ) {}
onMessage(OrderCancelReject &,const FIX::SessionID &)135  virtual void onMessage( OrderCancelReject&, const FIX::SessionID& ) {}
onMessage(Logon &,const FIX::SessionID &)136  virtual void onMessage( Logon&, const FIX::SessionID& ) {}
onMessage(News &,const FIX::SessionID &)137  virtual void onMessage( News&, const FIX::SessionID& ) {}
onMessage(Email &,const FIX::SessionID &)138  virtual void onMessage( Email&, const FIX::SessionID& ) {}
onMessage(NewOrderSingle &,const FIX::SessionID &)139  virtual void onMessage( NewOrderSingle&, const FIX::SessionID& ) {}
onMessage(NewOrderList &,const FIX::SessionID &)140  virtual void onMessage( NewOrderList&, const FIX::SessionID& ) {}
onMessage(OrderCancelRequest &,const FIX::SessionID &)141  virtual void onMessage( OrderCancelRequest&, const FIX::SessionID& ) {}
onMessage(OrderCancelReplaceRequest &,const FIX::SessionID &)142  virtual void onMessage( OrderCancelReplaceRequest&, const FIX::SessionID& ) {}
onMessage(OrderStatusRequest &,const FIX::SessionID &)143  virtual void onMessage( OrderStatusRequest&, const FIX::SessionID& ) {}
onMessage(Allocation &,const FIX::SessionID &)144  virtual void onMessage( Allocation&, const FIX::SessionID& ) {}
onMessage(ListCancelRequest &,const FIX::SessionID &)145  virtual void onMessage( ListCancelRequest&, const FIX::SessionID& ) {}
onMessage(ListExecute &,const FIX::SessionID &)146  virtual void onMessage( ListExecute&, const FIX::SessionID& ) {}
onMessage(ListStatusRequest &,const FIX::SessionID &)147  virtual void onMessage( ListStatusRequest&, const FIX::SessionID& ) {}
onMessage(ListStatus &,const FIX::SessionID &)148  virtual void onMessage( ListStatus&, const FIX::SessionID& ) {}
onMessage(AllocationInstructionAck &,const FIX::SessionID &)149  virtual void onMessage( AllocationInstructionAck&, const FIX::SessionID& ) {}
onMessage(DontKnowTrade &,const FIX::SessionID &)150  virtual void onMessage( DontKnowTrade&, const FIX::SessionID& ) {}
onMessage(QuoteRequest &,const FIX::SessionID &)151  virtual void onMessage( QuoteRequest&, const FIX::SessionID& ) {}
onMessage(Quote &,const FIX::SessionID &)152  virtual void onMessage( Quote&, const FIX::SessionID& ) {}
onMessage(SettlementInstructions &,const FIX::SessionID &)153  virtual void onMessage( SettlementInstructions&, const FIX::SessionID& ) {}
154 
155 public:
crack(const Message & message,const FIX::SessionID & sessionID)156   void crack( const Message& message,
157               const FIX::SessionID& sessionID )
158   {
159     const std::string& msgTypeValue
160       = message.getHeader().getField( FIX::FIELD::MsgType );
161 
162     if( msgTypeValue == "0" )
163       onMessage( (const Heartbeat&)message, sessionID );
164     else
165     if( msgTypeValue == "1" )
166       onMessage( (const TestRequest&)message, sessionID );
167     else
168     if( msgTypeValue == "2" )
169       onMessage( (const ResendRequest&)message, sessionID );
170     else
171     if( msgTypeValue == "3" )
172       onMessage( (const Reject&)message, sessionID );
173     else
174     if( msgTypeValue == "4" )
175       onMessage( (const SequenceReset&)message, sessionID );
176     else
177     if( msgTypeValue == "5" )
178       onMessage( (const Logout&)message, sessionID );
179     else
180     if( msgTypeValue == "6" )
181       onMessage( (const IOI&)message, sessionID );
182     else
183     if( msgTypeValue == "7" )
184       onMessage( (const Advertisement&)message, sessionID );
185     else
186     if( msgTypeValue == "8" )
187       onMessage( (const ExecutionReport&)message, sessionID );
188     else
189     if( msgTypeValue == "9" )
190       onMessage( (const OrderCancelReject&)message, sessionID );
191     else
192     if( msgTypeValue == "A" )
193       onMessage( (const Logon&)message, sessionID );
194     else
195     if( msgTypeValue == "B" )
196       onMessage( (const News&)message, sessionID );
197     else
198     if( msgTypeValue == "C" )
199       onMessage( (const Email&)message, sessionID );
200     else
201     if( msgTypeValue == "D" )
202       onMessage( (const NewOrderSingle&)message, sessionID );
203     else
204     if( msgTypeValue == "E" )
205       onMessage( (const NewOrderList&)message, sessionID );
206     else
207     if( msgTypeValue == "F" )
208       onMessage( (const OrderCancelRequest&)message, sessionID );
209     else
210     if( msgTypeValue == "G" )
211       onMessage( (const OrderCancelReplaceRequest&)message, sessionID );
212     else
213     if( msgTypeValue == "H" )
214       onMessage( (const OrderStatusRequest&)message, sessionID );
215     else
216     if( msgTypeValue == "J" )
217       onMessage( (const Allocation&)message, sessionID );
218     else
219     if( msgTypeValue == "K" )
220       onMessage( (const ListCancelRequest&)message, sessionID );
221     else
222     if( msgTypeValue == "L" )
223       onMessage( (const ListExecute&)message, sessionID );
224     else
225     if( msgTypeValue == "M" )
226       onMessage( (const ListStatusRequest&)message, sessionID );
227     else
228     if( msgTypeValue == "N" )
229       onMessage( (const ListStatus&)message, sessionID );
230     else
231     if( msgTypeValue == "P" )
232       onMessage( (const AllocationInstructionAck&)message, sessionID );
233     else
234     if( msgTypeValue == "Q" )
235       onMessage( (const DontKnowTrade&)message, sessionID );
236     else
237     if( msgTypeValue == "R" )
238       onMessage( (const QuoteRequest&)message, sessionID );
239     else
240     if( msgTypeValue == "S" )
241       onMessage( (const Quote&)message, sessionID );
242     else
243     if( msgTypeValue == "T" )
244       onMessage( (const SettlementInstructions&)message, sessionID );
245     else onMessage( message, sessionID );
246   }
247 
crack(Message & message,const FIX::SessionID & sessionID)248 void crack( Message& message,
249             const FIX::SessionID& sessionID )
250   {
251     FIX::MsgType msgType;
252     message.getHeader().getField(msgType);
253     std::string msgTypeValue = msgType.getValue();
254 
255     if( msgTypeValue == "0" )
256       onMessage( (Heartbeat&)message, sessionID );
257     else
258     if( msgTypeValue == "1" )
259       onMessage( (TestRequest&)message, sessionID );
260     else
261     if( msgTypeValue == "2" )
262       onMessage( (ResendRequest&)message, sessionID );
263     else
264     if( msgTypeValue == "3" )
265       onMessage( (Reject&)message, sessionID );
266     else
267     if( msgTypeValue == "4" )
268       onMessage( (SequenceReset&)message, sessionID );
269     else
270     if( msgTypeValue == "5" )
271       onMessage( (Logout&)message, sessionID );
272     else
273     if( msgTypeValue == "6" )
274       onMessage( (IOI&)message, sessionID );
275     else
276     if( msgTypeValue == "7" )
277       onMessage( (Advertisement&)message, sessionID );
278     else
279     if( msgTypeValue == "8" )
280       onMessage( (ExecutionReport&)message, sessionID );
281     else
282     if( msgTypeValue == "9" )
283       onMessage( (OrderCancelReject&)message, sessionID );
284     else
285     if( msgTypeValue == "A" )
286       onMessage( (Logon&)message, sessionID );
287     else
288     if( msgTypeValue == "B" )
289       onMessage( (News&)message, sessionID );
290     else
291     if( msgTypeValue == "C" )
292       onMessage( (Email&)message, sessionID );
293     else
294     if( msgTypeValue == "D" )
295       onMessage( (NewOrderSingle&)message, sessionID );
296     else
297     if( msgTypeValue == "E" )
298       onMessage( (NewOrderList&)message, sessionID );
299     else
300     if( msgTypeValue == "F" )
301       onMessage( (OrderCancelRequest&)message, sessionID );
302     else
303     if( msgTypeValue == "G" )
304       onMessage( (OrderCancelReplaceRequest&)message, sessionID );
305     else
306     if( msgTypeValue == "H" )
307       onMessage( (OrderStatusRequest&)message, sessionID );
308     else
309     if( msgTypeValue == "J" )
310       onMessage( (Allocation&)message, sessionID );
311     else
312     if( msgTypeValue == "K" )
313       onMessage( (ListCancelRequest&)message, sessionID );
314     else
315     if( msgTypeValue == "L" )
316       onMessage( (ListExecute&)message, sessionID );
317     else
318     if( msgTypeValue == "M" )
319       onMessage( (ListStatusRequest&)message, sessionID );
320     else
321     if( msgTypeValue == "N" )
322       onMessage( (ListStatus&)message, sessionID );
323     else
324     if( msgTypeValue == "P" )
325       onMessage( (AllocationInstructionAck&)message, sessionID );
326     else
327     if( msgTypeValue == "Q" )
328       onMessage( (DontKnowTrade&)message, sessionID );
329     else
330     if( msgTypeValue == "R" )
331       onMessage( (QuoteRequest&)message, sessionID );
332     else
333     if( msgTypeValue == "S" )
334       onMessage( (Quote&)message, sessionID );
335     else
336     if( msgTypeValue == "T" )
337       onMessage( (SettlementInstructions&)message, sessionID );
338     else onMessage( message, sessionID );
339   }
340 
341   };
342 }
343 
344 #endif
345