package org.ripple.power.txns.btc;
import java.io.EOFException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
/**
* <p>The 'headers' message is returned in response to a 'getheaders' message.
* Note that the returned header includes the block header (80 bytes) plus
* the transaction count (the count is set to zero)</p>
*
* <p>Headers Message</p>
* <pre>
* Size Field Description
* ==== ===== ===========
* VarInt Count Number of headers
* Variable Entries Header entries
* </pre>
*/
public class HeadersMessage {
/**
* Build the 'headers' message
*
* @param peer Destination peer
* @param hdrList List of block headers
* @return 'headers' message
*/
public static Message buildHeadersMessage(Peer peer, List<BlockHeader> hdrList) {
SerializedBuffer msgBuffer = new SerializedBuffer(hdrList.size()*(BlockHeader.HEADER_SIZE+1)+4);
//
// Build the message data
//
msgBuffer.putVarInt(hdrList.size());
for(BlockHeader header:hdrList){
header.getBytes(msgBuffer).putVarInt(0);
}
//
// Build the message
//
ByteBuffer buffer = MessageHeader.buildMessage("headers", msgBuffer);
return new Message(buffer, peer, MessageHeader.MessageCommand.HEADERS);
}
/**
* Process the 'headers' message
*
* @param msg Message
* @param inBuffer Input buffer
* @param msgListener Message listener
* @throws EOFException End-of-data encountered while processing input stream
* @throws VerificationException Verification error
*/
public static void processHeadersMessage(Message msg, SerializedBuffer inBuffer, MessageListener msgListener)
throws EOFException, VerificationException {
//
// Build the block header list
//
int count = inBuffer.getVarInt();
if (count < 0 || count > 2000)
throw new VerificationException("More than 2000 headers", RejectMessage.REJECT_INVALID);
List<BlockHeader> hdrList = new ArrayList<>(count);
for (int i=0; i<count; i++) {
hdrList.add(new BlockHeader(inBuffer, true));
inBuffer.getVarInt();
}
//
// Notify the message listener
//
msgListener.processBlockHeaders(msg, hdrList);
}
}