Thread: Re: [Quickfix-developers] Contributing code
Brought to you by:
orenmnero
From: Miller, O. <OM...@ri...> - 2003-11-17 18:03:05
|
Post them to this list. -------------------------- Sent from my BlackBerry Wireless Handheld -----Original Message----- From: Howard Engelhart <ho...@ex...> To: QuickFIX Questions <qui...@li...> Sent: Mon Nov 17 11:43:03 2003 Subject: [Quickfix-developers] Contributing code I have made a couple of minor changes to the QuickFIX lib that I would = like to submit for review for possible inclusion into the next version = of QuickFIX. Is that possible? If so how should I proceed? Thanks, Howard ho...@ex... |
From: Howard E. <ho...@ex...> - 2003-11-18 13:50:01
|
I have made minor modifications to the qf lib to fix the following two issues. These changes have been tested and running on our servers without problems. I hope they can be added for future release. thanks, Howard Issues: 1.) A second socket connection (to acceptor) made using a SessionID already in uses causes the library to behave erratically. 2.) FIX Field 141 (ResetSeqNumFlag) on the Logon Message is ignored. Issue #1 If a FIX client connects to the QuickFIX acceptor, using a SessionID already in use, it fouls the state of the Session object associated with that SessionID resulting in the Second connection being dropped, but the first connection no longer calling events on the Application class. It is also impossible to prevent the second connection from being accepted within the Application class override, because the OnLogon event is never raised. Fix My fix for this solution is to disconnect an existing connection when a second connection with a "connected" SessionID comes in. The first connection is disconnected (App gets LogOut event) and the second connection is accepted (App gets Logon event). Modules Affected: (Acceptor.cpp, SocketConnection.cpp) Acceptor.cpp ====================================== Method: Acceptor::getSession, at line 149 Adding the disconnect line will cause any existing session using that SessionID to be LoggedOff and the socket connection to be closed. If there is no connection currently using that SessionID the call is harmless. Change --------------- Sessions::iterator i = m_sessions.find( sessionID ); if ( i != m_sessions.end() ) { i->second->setResponder( &responder ); return i->second; } To --------------- Sessions::iterator i = m_sessions.find( sessionID ); if ( i != m_sessions.end() ) { // ADD THE NEXT LINE i->second->disconnect(); i->second->setResponder( &responder ); return i->second; } SocketConnection.cpp ====================================== Method: SocketConnection::disconnect This clearing the Session ptr of a SocketConnection prevents the Session disconnect method from being called twice (called the first time in the Acceptor::getSession method) when the SocketMonitor drop is processed. Change --------------- void SocketConnection::disconnect() { QF_STACK_PUSH(SocketConnection::disconnect) if ( m_pMonitor ) m_pMonitor->drop( m_socket ); QF_STACK_POP } To --------------- void SocketConnection::disconnect() { QF_STACK_PUSH(SocketConnection::disconnect) // ADD THE NEXT LINE m_pSession = 0; if ( m_pMonitor ) m_pMonitor->drop( m_socket ); QF_STACK_POP } Issue #2 The ResetSeqNumFlag tag is ignored when Sessions logon to quickfix server. Fix Add code to the Session::nextLogon and the Session::generateLogon methods to handle the request. I list the diffs, followed by the full modified methods Modules Affected: (Session.cpp) Session.cpp ====================================== Method: Session::nextLogon Remove ------------ < bool verified = verify( logon, false, true ); Add ------------ > ResetSeqNumFlag resetSeqNumFlag(false); > logon.getField(resetSeqNumFlag); > > bool verified = verify( logon, false, (false == resetSeqNumFlag.getValue()) ); 213a217,224 > if (resetSeqNumFlag.getValue() == true) > { > m_state.onEvent( "Received Logon with SequenceReset FROM: " > + IntConvertor::convert(getExpectedTargetNum()) + > " TO: 1" ); > m_state.store()->reset(); > } > Method: Session::generateLogon Add ------------ 544a556,563 > > if (aLogon.isSetField(FIELD::ResetSeqNumFlag)) > { > ResetSeqNumFlag resetSeqNumFlag(false); > aLogon.getField(resetSeqNumFlag); > logon.setField(resetSeqNumFlag); > } > void Session::nextLogon( const Message& logon ) { QF_STACK_PUSH(Session::nextLogon) if ( m_state.shouldSendLogon() ) { m_state.onEvent( "Received logon response before sending request" ); disconnect(); return ; } SenderCompID senderCompID; TargetCompID targetCompID; logon.getHeader().getField( senderCompID ); logon.getHeader().getField( targetCompID ); ResetSeqNumFlag resetSeqNumFlag(false); logon.getField(resetSeqNumFlag); bool verified = verify( logon, false, (false == resetSeqNumFlag.getValue()) ); if ( isCorrectCompID( senderCompID, targetCompID ) ) m_state.receivedLogon( true ); if ( !verified ) return ; if ( !m_state.initiate() ) { logon.getField( m_state.heartBtInt() ); m_state.onEvent( "Received logon request" ); generateLogon( logon ); m_state.onEvent( "Responding to logon request" ); } else m_state.onEvent( "Received logon response" ); if (resetSeqNumFlag.getValue() == true) { m_state.onEvent( "Received Logon with SequenceReset FROM: " + IntConvertor::convert(getExpectedTargetNum()) + " TO: 1" ); m_state.store()->reset(); } MsgSeqNum msgSeqNum; logon.getHeader().getField( msgSeqNum ); if ( isTargetTooHigh( msgSeqNum ) ) { doTargetTooHigh( logon ); } else { m_state.incrNextTargetMsgSeqNum(); nextQueued(); } if ( isLoggedOn() ) m_application.onLogon( m_sessionID ); QF_STACK_POP } void Session::generateLogon( const Message& aLogon ) { QF_STACK_PUSH(Session::generateLogon) Message logon; EncryptMethod encryptMethod; HeartBtInt heartBtInt; logon.setField( EncryptMethod( 0 ) ); aLogon.getField( heartBtInt ); logon.getHeader().setField( MsgType( "A" ) ); logon.setField( heartBtInt ); if (aLogon.isSetField(FIELD::ResetSeqNumFlag)) { ResetSeqNumFlag resetSeqNumFlag(false); aLogon.getField(resetSeqNumFlag); logon.setField(resetSeqNumFlag); } fill( logon.getHeader() ); sendRaw( logon ); m_state.sentLogon( true ); QF_STACK_POP } On Mon, 2003-11-17 at 23:24, qui...@li... wrote: > > --__--__-- > > Message: 2 > Subject: Re: [Quickfix-developers] Contributing code > Date: Mon, 17 Nov 2003 12:02:23 -0600 > From: "Miller, Oren" <OM...@ri...> > To: <ho...@ex...>, > <qui...@li...> > > Post them to this list. > > -------------------------- > Sent from my BlackBerry Wireless Handheld > > > -----Original Message----- > From: Howard Engelhart <ho...@ex...> > To: QuickFIX Questions <qui...@li...> > Sent: Mon Nov 17 11:43:03 2003 > Subject: [Quickfix-developers] Contributing code > > I have made a couple of minor changes to the QuickFIX lib that I would = > like to submit for review for possible inclusion into the next version = > of QuickFIX. Is that possible? If so how should I proceed? > > Thanks, > > Howard > ho...@ex... > |
From: Joerg T. <Joe...@ma...> - 2003-11-18 14:08:53
|
Hi Howard, > Issue #1 > If a FIX client connects to the QuickFIX acceptor, using a SessionID > already in use, it fouls the state of the Session object associated with > that SessionID resulting in the Second connection being dropped, but the > first connection no longer calling events on the Application class. It > is also impossible to prevent the second connection from being accepted > within the Application class override, because the OnLogon event is > never raised. > > Fix > My fix for this solution is to disconnect an existing connection when a > second connection with a "connected" SessionID comes in. The first > connection is disconnected (App gets LogOut event) and the second > connection is accepted (App gets Logon event). The FIX 4.3 spec says in the chapter "FIX Session-level Testcases and Expected Behaviour", section "Test Cases" on page 39: b. Logon message received with duplicate identity (e. g. same IP, port, SenderCompID, TargetCompID, etc. as existing connection) 1. Generate an "error" condition in test output. 2. Disconnect without sending a message (note sending a Reject or Logout would consume a MsgSeqNum) IMHO, this solution violates the FIX spec. The second connection attempt should be dropped. Could you implement this? > Modules Affected: (Acceptor.cpp, SocketConnection.cpp) > Modules Affected: (Session.cpp) It would be nice to have the complete changed files. Doing diff against the current CVS version is quite easy. Thanks! Cheers, Jörg -- Joerg Thoennes http://macd.com Tel.: +49 (0)241 44597-24 Macdonald Associates GmbH Fax : +49 (0)241 44597-10 Lothringer Str. 52, D-52070 Aachen |
From: James C. D. <jc...@co...> - 2003-11-18 14:24:47
|
PE1FVEEgSFRUUC1FUVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJz ZXQ9dXRmLTgiPgo8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yLy9F TiI+CjxIVE1MPgo8SEVBRD4KCjxNRVRBIE5BTUU9IkdlbmVyYXRvciIgQ09OVEVOVD0iTVMgRXhj aGFuZ2UgU2VydmVyIHZlcnNpb24gNi4wLjY0ODcuMSI+CjxUSVRMRT5SZTogW1F1aWNrZml4LWRl dmVsb3BlcnNdIENvbnRyaWJ1dGluZyBjb2RlPC9USVRMRT4KPC9IRUFEPgo8Qk9EWSBkaXI9bHRy Pgo8RElWPkluIGtlZXBpbmcgd2l0aCB0aGUgc3Bpcml0IGluIHdoaWNoIFF1aWNrRml4IHdhcyBk ZXZlbG9wZWQsIElNSE8sSSBmZWVsIAp0aGF0ICh3aGVyZSBhcHByb3ByaWF0ZSkgY29kZSBjb250 cmlidXRpb25zIHNob3VsZCBiZSBhY2NvbXBhbmllZCB3aXRoIHVuaXQgCmFuZC9vciBhY2NlcHRh bmNlIHRlc3RzLjwvRElWPgo8RElWPiZuYnNwOzwvRElWPgo8RElWPiZuYnNwOzwvRElWPgo8RElW PkppbSBEb3duczwvRElWPgo8QkxPQ0tRVU9URSBkaXI9bHRyIHN0eWxlPSJNQVJHSU4tUklHSFQ6 IDBweCI+CiAgPERJVj48Rk9OVCBzaXplPTI+LS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0gPEJS PjxCPkZyb206PC9CPiAKICBxdWlja2ZpeC1kZXZlbG9wZXJzLWFkbWluQGxpc3RzLnNvdXJjZWZv cmdlLm5ldCZuYnNwO29uIGJlaGFsZiBvZiZuYnNwO0pvZXJnIAogIFRob2VubmVzIDxCUj48Qj5T ZW50OjwvQj4gVHVlIDExLzE4LzIwMDMgODowOCBBTSA8QlI+PEI+VG86PC9CPiAKICBob3dhcmRA ZXhhZC5jb20gPEJSPjxCPkNjOjwvQj4gUXVpY2tGSVggUXVlc3Rpb25zIDxCUj48Qj5TdWJqZWN0 OjwvQj4gUmU6IAogIFtRdWlja2ZpeC1kZXZlbG9wZXJzXSBDb250cmlidXRpbmcgY29kZTxCUj48 QlI+PC9GT05UPjwvRElWPgogIDxQPjxGT05UIHNpemU9Mj5IaSBIb3dhcmQsPEJSPjxCUj4mZ3Q7 IElzc3VlICMxPEJSPiZndDsgSWYgYSBGSVggY2xpZW50IAogIGNvbm5lY3RzIHRvIHRoZSBRdWlj a0ZJWCBhY2NlcHRvciwgdXNpbmcgYSBTZXNzaW9uSUQ8QlI+Jmd0OyBhbHJlYWR5IGluIHVzZSwg CiAgaXQgZm91bHMgdGhlIHN0YXRlIG9mIHRoZSBTZXNzaW9uIG9iamVjdCBhc3NvY2lhdGVkIHdp dGg8QlI+Jmd0OyB0aGF0IAogIFNlc3Npb25JRCByZXN1bHRpbmcgaW4gdGhlIFNlY29uZCBjb25u ZWN0aW9uIGJlaW5nIGRyb3BwZWQsIGJ1dCB0aGU8QlI+Jmd0OyAKICBmaXJzdCBjb25uZWN0aW9u IG5vIGxvbmdlciBjYWxsaW5nIGV2ZW50cyBvbiB0aGUgQXBwbGljYXRpb24gY2xhc3MuJm5ic3A7 IAogIEl0PEJSPiZndDsgaXMgYWxzbyBpbXBvc3NpYmxlIHRvIHByZXZlbnQgdGhlIHNlY29uZCBj b25uZWN0aW9uIGZyb20gYmVpbmcgCiAgYWNjZXB0ZWQ8QlI+Jmd0OyB3aXRoaW4gdGhlIEFwcGxp Y2F0aW9uIGNsYXNzIG92ZXJyaWRlLCBiZWNhdXNlIHRoZSBPbkxvZ29uIAogIGV2ZW50IGlzPEJS PiZndDsgbmV2ZXIgcmFpc2VkLjxCUj4mZ3Q7PEJSPiZndDsgRml4PEJSPiZndDsgTXkgZml4IGZv ciB0aGlzIAogIHNvbHV0aW9uIGlzIHRvIGRpc2Nvbm5lY3QgYW4gZXhpc3RpbmcgY29ubmVjdGlv biB3aGVuIGE8QlI+Jmd0OyBzZWNvbmQgCiAgY29ubmVjdGlvbiB3aXRoIGEgImNvbm5lY3RlZCIg U2Vzc2lvbklEIGNvbWVzIGluLiZuYnNwOyBUaGUgZmlyc3Q8QlI+Jmd0OyAKICBjb25uZWN0aW9u IGlzIGRpc2Nvbm5lY3RlZCAoQXBwIGdldHMgTG9nT3V0IGV2ZW50KSBhbmQgdGhlIHNlY29uZDxC Uj4mZ3Q7IAogIGNvbm5lY3Rpb24gaXMgYWNjZXB0ZWQgKEFwcCBnZXRzIExvZ29uIGV2ZW50KS48 QlI+PEJSPlRoZSBGSVggNC4zIHNwZWMgc2F5cyBpbiAKICB0aGUgY2hhcHRlciAiRklYIFNlc3Np b24tbGV2ZWwgVGVzdGNhc2VzIGFuZDxCUj5FeHBlY3RlZCBCZWhhdmlvdXIiLCBzZWN0aW9uIAog ICJUZXN0IENhc2VzIiBvbiBwYWdlIDM5OjxCUj48QlI+Yi4gTG9nb24gbWVzc2FnZSByZWNlaXZl ZCB3aXRoIGR1cGxpY2F0ZSAKICBpZGVudGl0eSAoZS4gZy4gc2FtZSBJUCwgcG9ydCw8QlI+Jm5i c3A7Jm5ic3A7Jm5ic3A7IFNlbmRlckNvbXBJRCwgCiAgVGFyZ2V0Q29tcElELCBldGMuIGFzIGV4 aXN0aW5nIGNvbm5lY3Rpb24pPEJSPjxCUj4xLiBHZW5lcmF0ZSBhbiAiZXJyb3IiIAogIGNvbmRp dGlvbiBpbiB0ZXN0IG91dHB1dC48QlI+Mi4gRGlzY29ubmVjdCB3aXRob3V0IHNlbmRpbmcgYSBt ZXNzYWdlIChub3RlIAogIHNlbmRpbmcgYSBSZWplY3Qgb3IgTG9nb3V0PEJSPiZuYnNwOyZuYnNw OyZuYnNwOyB3b3VsZCBjb25zdW1lIGEgCiAgTXNnU2VxTnVtKTxCUj48QlI+SU1ITywgdGhpcyBz b2x1dGlvbiB2aW9sYXRlcyB0aGUgRklYIHNwZWMuIFRoZSBzZWNvbmQgCiAgY29ubmVjdGlvbiBh dHRlbXB0PEJSPnNob3VsZCBiZSBkcm9wcGVkLiBDb3VsZCB5b3UgaW1wbGVtZW50IHRoaXM/PEJS PjxCUj4mZ3Q7IAogIE1vZHVsZXMgQWZmZWN0ZWQ6IChBY2NlcHRvci5jcHAsIFNvY2tldENvbm5l Y3Rpb24uY3BwKTxCUj4mZ3Q7IE1vZHVsZXMgCiAgQWZmZWN0ZWQ6IChTZXNzaW9uLmNwcCk8QlI+ PEJSPkl0IHdvdWxkIGJlIG5pY2UgdG8gaGF2ZSB0aGUgY29tcGxldGUgY2hhbmdlZCAKICBmaWxl cy4gRG9pbmcgZGlmZiBhZ2FpbnN0PEJSPnRoZSBjdXJyZW50IENWUyB2ZXJzaW9uIGlzIHF1aXRl IGVhc3kuIAogIFRoYW5rcyE8QlI+PEJSPkNoZWVycywgSsO2cmc8QlI+PEJSPi0tPEJSPkpvZXJn IAogIFRob2VubmVzPEJSPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAKICA8QSBocmVmPSJodHRwOi8vbWFjZC5j b20iPmh0dHA6Ly9tYWNkLmNvbTwvQT48QlI+VGVsLjogKzQ5ICgwKTI0MSAKICA0NDU5Ny0yNCZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBNYWNkb25hbGQgQXNzb2NpYXRlcyBHbWJIPEJS PkZheCA6ICs0OSAKICAoMCkyNDEgNDQ1OTctMTAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsgTG90aHJpbmdlciBTdHIuIDUyLCBELTUyMDcwIAogIEFhY2hlbjxCUj48QlI+PEJSPjxCUj4t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPEJS PlRoaXMgCiAgU0YuIE5ldCBlbWFpbCBpcyBzcG9uc29yZWQgYnk6IEdvVG9NeVBDPEJSPkdvVG9N eVBDIGlzIHRoZSBmYXN0LCBlYXN5IGFuZCAKICBzZWN1cmUgd2F5IHRvIGFjY2VzcyB5b3VyIGNv bXB1dGVyIGZyb208QlI+YW55IFdlYiBicm93c2VyIG9yIHdpcmVsZXNzIGRldmljZS4gCiAgQ2xp Y2sgaGVyZSB0byBUcnkgaXQgRnJlZSE8QlI+PEEgCiAgaHJlZj0iaHR0cHM6Ly93d3cuZ290b215 cGMuY29tL3RyL09TRE4vQVcvUTRfMjAwMy90L2cyMmxwP1RhcmdldD1tbS9nMjJscC50bXBsIj5o dHRwczovL3d3dy5nb3RvbXlwYy5jb20vdHIvT1NETi9BVy9RNF8yMDAzL3QvZzIybHA/VGFyZ2V0 PW1tL2cyMmxwLnRtcGw8L0E+PEJSPl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fPEJSPlF1aWNrZml4LWRldmVsb3BlcnMgCiAgbWFpbGluZyBsaXN0PEJSPlF1 aWNrZml4LWRldmVsb3BlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0PEJSPjxBIAogIGhyZWY9Imh0 dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3F1aWNrZml4LWRldmVs b3BlcnMiPmh0dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3F1aWNr Zml4LWRldmVsb3BlcnM8L0E+PEJSPjwvRk9OVD48L1A+PC9CTE9DS1FVT1RFPgoKPC9CT0RZPgo8 L0hUTUw+ |
From: Joerg T. <Joe...@ma...> - 2003-11-18 14:46:32
|
James C. Downs wrote: > In keeping with the spirit in which QuickFix was developed, IMHO,I feel > that (where appropriate) code contributions should be accompanied with > unit and/or acceptance tests. Thanks, Jim. I really forgot to mention that. Actually, we should only need unit tests. The acceptence test of QuickFIX have been taken from the specs "FIX Session-level test cases and expected behaviour". Maybe for the ResetSeqNum feature there is no such test since QuickFIX did not implement it so far. Howard, if you send me the files I will start integrating them into the current CVS. Cheers, Jörg -- Joerg Thoennes http://macd.com Tel.: +49 (0)241 44597-24 Macdonald Associates GmbH Fax : +49 (0)241 44597-10 Lothringer Str. 52, D-52070 Aachen |
From: Howard E. <ho...@ex...> - 2003-11-18 16:10:33
|
Hello J=C3=B6rg, Thanks for the info. I should have checked the spec myself. I can take a look at changing it accordingly. The nice thing about this solution is that it required only minor changes to the lib, and no changes to any of the interfaces. I'm not sure, but I think I would need to make more significant changes to implement it as you suggest. I think the way to do it would be to enable the SocketAcceptor in its onConnect method to check for an existing connection using that session and then drop if one is found. If you could point me in the direction of a simpler solution, I'd be happy to take a look. Regarding Unit/Acceptance testing, what would you need for that? (This is my first time contributing to an open source project.) As for the ResetSeqNum code, I will send you my version of Session.cpp. Thanks again, Howard On Tue, 2003-11-18 at 10:42, qui...@li... wrote: > Message: 2 > Date: Tue, 18 Nov 2003 15:08:48 +0100 > From: Joerg Thoennes <Joe...@ma...> > Organization: Macdonald Associates > To: ho...@ex... > CC: QuickFIX Questions <qui...@li...> > Subject: Re: [Quickfix-developers] Contributing code >=20 > Hi Howard, >=20 > > Issue #1 > > If a FIX client connects to the QuickFIX acceptor, using a SessionID=20 > > already in use, it fouls the state of the Session object associated w= ith=20 > > that SessionID resulting in the Second connection being dropped, but = the=20 > > first connection no longer calling events on the Application class. = It=20 > > is also impossible to prevent the second connection from being accept= ed=20 > > within the Application class override, because the OnLogon event is=20 > > never raised. > >=20 > > Fix > > My fix for this solution is to disconnect an existing connection when= a=20 > > second connection with a "connected" SessionID comes in. The first=20 > > connection is disconnected (App gets LogOut event) and the second=20 > > connection is accepted (App gets Logon event). >=20 > The FIX 4.3 spec says in the chapter "FIX Session-level Testcases and=20 > Expected Behaviour", section "Test Cases" on page 39: >=20 > b. Logon message received with duplicate identity (e. g. same IP, port, > SenderCompID, TargetCompID, etc. as existing connection) >=20 > 1. Generate an "error" condition in test output. > 2. Disconnect without sending a message (note sending a Reject or Logou= t > would consume a MsgSeqNum) >=20 > IMHO, this solution violates the FIX spec. The second connection attemp= t=20 > should be dropped. Could you implement this? >=20 > > Modules Affected: (Acceptor.cpp, SocketConnection.cpp) > > Modules Affected: (Session.cpp) >=20 > It would be nice to have the complete changed files. Doing diff against= =20 > the current CVS version is quite easy. Thanks! >=20 > Cheers, J=C3=B6rg >=20 > --=20 > Joerg Thoennes > http://macd.com > Tel.: +49 (0)241 44597-24 Macdonald Associates GmbH > Fax : +49 (0)241 44597-10 Lothringer Str. 52, D-52070 Aachen >=20 >=20 >=20 > --__--__-- >=20 > Message: 3 > Subject: RE: [Quickfix-developers] Contributing code > Date: Tue, 18 Nov 2003 08:24:11 -0600 > From: "James C. Downs" <jc...@co...> > To: "Joerg Thoennes" <Joe...@ma...>, > <ho...@ex...> > Cc: "QuickFIX Questions" <qui...@li...> >=20 > PE1FVEEgSFRUUC1FUVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGN= oYXJz > ZXQ9dXRmLTgiPgo8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4= yLy9F > TiI+CjxIVE1MPgo8SEVBRD4KCjxNRVRBIE5BTUU9IkdlbmVyYXRvciIgQ09OVEVOVD0iTVM= gRXhj > aGFuZ2UgU2VydmVyIHZlcnNpb24gNi4wLjY0ODcuMSI+CjxUSVRMRT5SZTogW1F1aWNrZml= 4LWRl > dmVsb3BlcnNdIENvbnRyaWJ1dGluZyBjb2RlPC9USVRMRT4KPC9IRUFEPgo8Qk9EWSBkaXI= 9bHRy > Pgo8RElWPkluIGtlZXBpbmcgd2l0aCB0aGUgc3Bpcml0IGluIHdoaWNoIFF1aWNrRml4IHd= hcyBk > ZXZlbG9wZWQsIElNSE8sSSBmZWVsIAp0aGF0ICh3aGVyZSBhcHByb3ByaWF0ZSkgY29kZSB= jb250 > cmlidXRpb25zIHNob3VsZCBiZSBhY2NvbXBhbmllZCB3aXRoIHVuaXQgCmFuZC9vciBhY2N= lcHRh > bmNlIHRlc3RzLjwvRElWPgo8RElWPiZuYnNwOzwvRElWPgo8RElWPiZuYnNwOzwvRElWPgo= 8RElW > PkppbSBEb3duczwvRElWPgo8QkxPQ0tRVU9URSBkaXI9bHRyIHN0eWxlPSJNQVJHSU4tUkl= HSFQ6 > IDBweCI+CiAgPERJVj48Rk9OVCBzaXplPTI+LS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0= gPEJS > PjxCPkZyb206PC9CPiAKICBxdWlja2ZpeC1kZXZlbG9wZXJzLWFkbWluQGxpc3RzLnNvdXJ= jZWZv > cmdlLm5ldCZuYnNwO29uIGJlaGFsZiBvZiZuYnNwO0pvZXJnIAogIFRob2VubmVzIDxCUj4= 8Qj5T > ZW50OjwvQj4gVHVlIDExLzE4LzIwMDMgODowOCBBTSA8QlI+PEI+VG86PC9CPiAKICBob3d= hcmRA > ZXhhZC5jb20gPEJSPjxCPkNjOjwvQj4gUXVpY2tGSVggUXVlc3Rpb25zIDxCUj48Qj5TdWJ= qZWN0 > OjwvQj4gUmU6IAogIFtRdWlja2ZpeC1kZXZlbG9wZXJzXSBDb250cmlidXRpbmcgY29kZTx= CUj48 > QlI+PC9GT05UPjwvRElWPgogIDxQPjxGT05UIHNpemU9Mj5IaSBIb3dhcmQsPEJSPjxCUj4= mZ3Q7 > IElzc3VlICMxPEJSPiZndDsgSWYgYSBGSVggY2xpZW50IAogIGNvbm5lY3RzIHRvIHRoZSB= RdWlj > a0ZJWCBhY2NlcHRvciwgdXNpbmcgYSBTZXNzaW9uSUQ8QlI+Jmd0OyBhbHJlYWR5IGluIHV= zZSwg > CiAgaXQgZm91bHMgdGhlIHN0YXRlIG9mIHRoZSBTZXNzaW9uIG9iamVjdCBhc3NvY2lhdGV= kIHdp > dGg8QlI+Jmd0OyB0aGF0IAogIFNlc3Npb25JRCByZXN1bHRpbmcgaW4gdGhlIFNlY29uZCB= jb25u > ZWN0aW9uIGJlaW5nIGRyb3BwZWQsIGJ1dCB0aGU8QlI+Jmd0OyAKICBmaXJzdCBjb25uZWN= 0aW9u > IG5vIGxvbmdlciBjYWxsaW5nIGV2ZW50cyBvbiB0aGUgQXBwbGljYXRpb24gY2xhc3MuJm5= ic3A7 > IAogIEl0PEJSPiZndDsgaXMgYWxzbyBpbXBvc3NpYmxlIHRvIHByZXZlbnQgdGhlIHNlY29= uZCBj > b25uZWN0aW9uIGZyb20gYmVpbmcgCiAgYWNjZXB0ZWQ8QlI+Jmd0OyB3aXRoaW4gdGhlIEF= wcGxp > Y2F0aW9uIGNsYXNzIG92ZXJyaWRlLCBiZWNhdXNlIHRoZSBPbkxvZ29uIAogIGV2ZW50IGl= zPEJS > PiZndDsgbmV2ZXIgcmFpc2VkLjxCUj4mZ3Q7PEJSPiZndDsgRml4PEJSPiZndDsgTXkgZml= 4IGZv > ciB0aGlzIAogIHNvbHV0aW9uIGlzIHRvIGRpc2Nvbm5lY3QgYW4gZXhpc3RpbmcgY29ubmV= jdGlv > biB3aGVuIGE8QlI+Jmd0OyBzZWNvbmQgCiAgY29ubmVjdGlvbiB3aXRoIGEgImNvbm5lY3R= lZCIg > U2Vzc2lvbklEIGNvbWVzIGluLiZuYnNwOyBUaGUgZmlyc3Q8QlI+Jmd0OyAKICBjb25uZWN= 0aW9u > IGlzIGRpc2Nvbm5lY3RlZCAoQXBwIGdldHMgTG9nT3V0IGV2ZW50KSBhbmQgdGhlIHNlY29= uZDxC > Uj4mZ3Q7IAogIGNvbm5lY3Rpb24gaXMgYWNjZXB0ZWQgKEFwcCBnZXRzIExvZ29uIGV2ZW5= 0KS48 > QlI+PEJSPlRoZSBGSVggNC4zIHNwZWMgc2F5cyBpbiAKICB0aGUgY2hhcHRlciAiRklYIFN= lc3Np > b24tbGV2ZWwgVGVzdGNhc2VzIGFuZDxCUj5FeHBlY3RlZCBCZWhhdmlvdXIiLCBzZWN0aW9= uIAog > ICJUZXN0IENhc2VzIiBvbiBwYWdlIDM5OjxCUj48QlI+Yi4gTG9nb24gbWVzc2FnZSByZWN= laXZl > ZCB3aXRoIGR1cGxpY2F0ZSAKICBpZGVudGl0eSAoZS4gZy4gc2FtZSBJUCwgcG9ydCw8QlI= +Jm5i > c3A7Jm5ic3A7Jm5ic3A7IFNlbmRlckNvbXBJRCwgCiAgVGFyZ2V0Q29tcElELCBldGMuIGF= zIGV4 > aXN0aW5nIGNvbm5lY3Rpb24pPEJSPjxCUj4xLiBHZW5lcmF0ZSBhbiAiZXJyb3IiIAogIGN= vbmRp > dGlvbiBpbiB0ZXN0IG91dHB1dC48QlI+Mi4gRGlzY29ubmVjdCB3aXRob3V0IHNlbmRpbmc= gYSBt > ZXNzYWdlIChub3RlIAogIHNlbmRpbmcgYSBSZWplY3Qgb3IgTG9nb3V0PEJSPiZuYnNwOyZ= uYnNw > OyZuYnNwOyB3b3VsZCBjb25zdW1lIGEgCiAgTXNnU2VxTnVtKTxCUj48QlI+SU1ITywgdGh= pcyBz > b2x1dGlvbiB2aW9sYXRlcyB0aGUgRklYIHNwZWMuIFRoZSBzZWNvbmQgCiAgY29ubmVjdGl= vbiBh > dHRlbXB0PEJSPnNob3VsZCBiZSBkcm9wcGVkLiBDb3VsZCB5b3UgaW1wbGVtZW50IHRoaXM= /PEJS > PjxCUj4mZ3Q7IAogIE1vZHVsZXMgQWZmZWN0ZWQ6IChBY2NlcHRvci5jcHAsIFNvY2tldEN= vbm5l > Y3Rpb24uY3BwKTxCUj4mZ3Q7IE1vZHVsZXMgCiAgQWZmZWN0ZWQ6IChTZXNzaW9uLmNwcCk= 8QlI+ > PEJSPkl0IHdvdWxkIGJlIG5pY2UgdG8gaGF2ZSB0aGUgY29tcGxldGUgY2hhbmdlZCAKICB= maWxl > cy4gRG9pbmcgZGlmZiBhZ2FpbnN0PEJSPnRoZSBjdXJyZW50IENWUyB2ZXJzaW9uIGlzIHF= 1aXRl > IGVhc3kuIAogIFRoYW5rcyE8QlI+PEJSPkNoZWVycywgSsO2cmc8QlI+PEJSPi0tPEJSPkp= vZXJn > IAogIFRob2VubmVzPEJSPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZ= uYnNw > OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnN= wOyZu > YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZ= uYnNw > OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAKICA8QSBocmVmPSJodHRwOi8vbWF= jZC5j > b20iPmh0dHA6Ly9tYWNkLmNvbTwvQT48QlI+VGVsLjogKzQ5ICgwKTI0MSAKICA0NDU5Ny0= yNCZu > YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBNYWNkb25hbGQgQXNzb2NpYXRlcyBHbWJ= IPEJS > PkZheCA6ICs0OSAKICAoMCkyNDEgNDQ1OTctMTAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs= mbmJz > cDsgTG90aHJpbmdlciBTdHIuIDUyLCBELTUyMDcwIAogIEFhY2hlbjxCUj48QlI+PEJSPjx= CUj4t > LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0= tPEJS > PlRoaXMgCiAgU0YuIE5ldCBlbWFpbCBpcyBzcG9uc29yZWQgYnk6IEdvVG9NeVBDPEJSPkd= vVG9N > eVBDIGlzIHRoZSBmYXN0LCBlYXN5IGFuZCAKICBzZWN1cmUgd2F5IHRvIGFjY2VzcyB5b3V= yIGNv > bXB1dGVyIGZyb208QlI+YW55IFdlYiBicm93c2VyIG9yIHdpcmVsZXNzIGRldmljZS4gCiA= gQ2xp > Y2sgaGVyZSB0byBUcnkgaXQgRnJlZSE8QlI+PEEgCiAgaHJlZj0iaHR0cHM6Ly93d3cuZ29= 0b215 > cGMuY29tL3RyL09TRE4vQVcvUTRfMjAwMy90L2cyMmxwP1RhcmdldD1tbS9nMjJscC50bXB= sIj5o > dHRwczovL3d3dy5nb3RvbXlwYy5jb20vdHIvT1NETi9BVy9RNF8yMDAzL3QvZzIybHA/VGF= yZ2V0 > PW1tL2cyMmxwLnRtcGw8L0E+PEJSPl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19= fX19f > X19fX19fX19fX19fPEJSPlF1aWNrZml4LWRldmVsb3BlcnMgCiAgbWFpbGluZyBsaXN0PEJ= SPlF1 > aWNrZml4LWRldmVsb3BlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0PEJSPjxBIAogIGhyZWY= 9Imh0 > dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3F1aWNrZml4LWR= ldmVs > b3BlcnMiPmh0dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3F= 1aWNr > Zml4LWRldmVsb3BlcnM8L0E+PEJSPjwvRk9OVD48L1A+PC9CTE9DS1FVT1RFPgoKPC9CT0R= ZPgo8 > L0hUTUw+ >=20 >=20 > --__--__-- >=20 > Message: 4 > Date: Tue, 18 Nov 2003 15:46:04 +0100 > From: Joerg Thoennes <Joe...@ma...> > Organization: Macdonald Associates > To: "James C. Downs" <jc...@co...> > CC: ho...@ex...,=20 > QuickFIX Questions <qui...@li...> > Subject: Re: [Quickfix-developers] Contributing code >=20 > James C. Downs wrote: > > In keeping with the spirit in which QuickFix was developed, IMHO,I fe= el=20 > > that (where appropriate) code contributions should be accompanied wit= h=20 > > unit and/or acceptance tests. >=20 > Thanks, Jim. I really forgot to mention that. Actually, we should only=20 > need unit tests. The acceptence test of QuickFIX have been taken from=20 > the specs "FIX Session-level test cases and expected behaviour". Maybe=20 > for the ResetSeqNum feature there is no such test since QuickFIX did no= t=20 > implement it so far. >=20 > Howard, if you send me the files I will start integrating them into the= =20 > current CVS. >=20 > Cheers, J=C3=83=C2=B6rg |