package org.ripple.power.txns.btc; import java.io.EOFException; /** * MessageProcessor will process a message received from a peer. It takes a Message, validates * the message header and then calls the appropriate message processing method based on the * message command. * * Before calling this routine, the message ByteBuffer must contain the message to be processed * with the buffer position set to the start of the message and the buffer limit set to the * end of the message. Upon return, the appropriate message listener will have been called to * handle application-specific tasks for the message. */ public class MessageProcessor { /** * Process a message * * @param msg Message to be processed * @param msgListener Application message listener * @throws EOFException End-of-data while processing the message * @throws VerificationException Message verification failed */ public static void processMessage(Message msg, MessageListener msgListener) throws EOFException, VerificationException { // // Process the message header and get the command name // SerializedBuffer inBuffer = new SerializedBuffer(msg.getBuffer()); MessageHeader.MessageCommand cmdOp = MessageHeader.processMessage(inBuffer); msg.setCommand(cmdOp); // // Process the message // switch (cmdOp) { case ADDR: AddressMessage.processAddressMessage(msg, inBuffer, msgListener); break; case ALERT: AlertMessage.processAlertMessage(msg, inBuffer, msgListener); break; case BLOCK: BlockMessage.processBlockMessage(msg, inBuffer, msgListener); break; case FILTERADD: FilterAddMessage.processFilterAddMessage(msg, inBuffer, msgListener); break; case FILTERCLEAR: FilterClearMessage.processFilterClearMessage(msg, inBuffer, msgListener); break; case FILTERLOAD: FilterLoadMessage.processFilterLoadMessage(msg, inBuffer, msgListener); break; case GETADDR: GetAddressMessage.processGetAddressMessage(msg, inBuffer, msgListener); break; case GETBLOCKS: GetBlocksMessage.processGetBlocksMessage(msg, inBuffer, msgListener); break; case GETDATA: GetDataMessage.processGetDataMessage(msg, inBuffer, msgListener); break; case GETHEADERS: GetHeadersMessage.processGetHeadersMessage(msg, inBuffer, msgListener); break; case HEADERS: HeadersMessage.processHeadersMessage(msg, inBuffer, msgListener); break; case INV: InventoryMessage.processInventoryMessage(msg, inBuffer, msgListener); break; case MEMPOOL: MempoolMessage.processMempoolMessage(msg, inBuffer, msgListener); break; case MERKLEBLOCK: MerkleBlockMessage.processMerkleBlockMessage(msg, inBuffer, msgListener); break; case NOTFOUND: NotFoundMessage.processNotFoundMessage(msg, inBuffer, msgListener); break; case PING: PingMessage.processPingMessage(msg, inBuffer, msgListener); break; case PONG: PongMessage.processPongMessage(msg, inBuffer, msgListener); break; case REJECT: RejectMessage.processRejectMessage(msg, inBuffer, msgListener); break; case TX: TransactionMessage.processTransactionMessage(msg, inBuffer, msgListener); break; case VERACK: VersionAckMessage.processVersionAckMessage(msg, inBuffer, msgListener); break; case VERSION: VersionMessage.processVersionMessage(msg, inBuffer, msgListener); break; } } }