bool DepthFeedSubscriber::handle_message(BufferPtr& bp, size_t bytes_transferred) { // Decode the message QuickFAST::Codecs::DataSourceBuffer source(bp->c_array(), bytes_transferred); QuickFAST::Codecs::SingleMessageConsumer consumer; QuickFAST::Codecs::GenericMessageBuilder builder(consumer); decoder_.decodeMessage(source, builder); QuickFAST::Messages::Message& msg(consumer.message()); // Examine message contents uint64_t seq_num, msg_type, timestamp; const QuickFAST::StringBuffer* string_buffer; size_t bids_length, asks_length; std::string symbol; if (!msg.getUnsignedInteger(id_seq_num_, ValueType::UINT32, seq_num)) { std::cout << "Could not get seq num from msg" << std::endl; return false; } if (seq_num != expected_seq_) { std::cout << "ERROR: Got Seq num " << seq_num << ", expected " << expected_seq_ << std::endl; return false; } if (!msg.getUnsignedInteger(id_msg_type_, ValueType::UINT32, msg_type)) { std::cout << "Could not get msg type from msg" << std::endl; return false; } if (!msg.getString(id_symbol_, ValueType::ASCII, string_buffer)) { std::cout << "Could not get symbol from msg" << std::endl; return false; } if (!msg.getUnsignedInteger(id_timestamp_, ValueType::UINT32, timestamp)) { std::cout << "Could not get timestamp from msg" << std::endl; return false; } bool result = false; symbol = (std::string)*string_buffer; switch (msg_type) { case MSG_TYPE_DEPTH: result = handle_depth_message(symbol, seq_num, timestamp, msg); break; case MSG_TYPE_TRADE: result = handle_trade_message(symbol, seq_num, timestamp, msg); break; default: std::cout << "ERROR: Unknown message type " << msg_type << " seq num " << seq_num << std::endl; return false; } ++expected_seq_; return result; }