The publish_<msgName>_Message method initializes the message with pub_beginMessage, calls various pub_set<type>Field methods to set field values, and sends or cancels the message.
The API method that publishes the message includes the message name in the form publish_<msgName>_Message. Any characters that are not alphanumeric are changed to underscores. For example, publish_Bond_Quote_Message publishes the Bond Quote message.
You must add error handling to each message processing loop.
The publish_<msgName>_Message stub first defines the PUB_SEND_MESSAGE_CONTEXT structure with variables for each field in the message. This structure must be allocated before calling pub_beginMessage().
For example, the stub generated from the Bond Quote sample message definition begins with:
uint16_t publish_Bond_Quote_Message()
{
PUB_SEND_MESSAGE_CONTEXT ctx;
uchar * Instrument;
uint32_t Quote_Date;
int32_t Quote_Sequence_Number;
uint32_t Quote_Time_Date;
uint32_t Quote_Time_Time;
double Ask_Price;
int32_t Ask_Size;
double Bid_Price;
int32_t Bid_Size;
double Yield;
uint16_t errorCode;
Next, the stub calls pub_beginMessage() to begin defining the message.
The stub calls pub_cancelMessage() in each message processing loop to execute if an error is returned.
For example, the Bond Quote stub starts a new message as:
// Parse your message here.
// Start a new message.
errorCode = pub_beginMessage( 8, &ctx );
if( errorCode != ERR_NONE ) {
pub_cancelMessage( &ctx );
// Add error handling code.
return errorCode;
}
The stub adds a pub_set<type>Field() method in a processing loop for each field from the message definition. You must add error handling.
If a field can be null, your code must check for null and call pub_setNullField. Calls to pub_setNullField are commented out in the stub.
For decimal field types, the stub includes all potential API methods for processing the field, with all but pub_setDecimalField commented out. To use a different method, comment out pub_setDecimalField and uncomment the method you want. When choosing a set field method, consider that supported datatypes may have performance or granularity implications.
For example, the Bond Quote stub processes the Bid Price field as:
// Add the Bid Price field to the message.
errorCode = pub_setDecimalField( &ctx, "Bid Price", Bid_Price );
// errorCode = pub_setDecimalFieldFromMantissa( &ctx, "Bid Price", Bid_Price_Mantissa, Bid_Price_Exponent );
// errorCode = pub_setDecimalFieldFromString( &ctx, "Bid Price", Bid_Price_String );
// errorCode = pub_setNullField( &ctx, "Bid Price" );
if( errorCode != ERR_NONE ) {
pub_cancelMessage( &ctx );
// Add error handling code.
return errorCode;
}
The stub calls pub_sendMessage to send the message, or pub_cancelMessage upon error.