All Downloads are FREE. Search and download functionalities are using the official Maven repository.

zmq.V1Encoder Maven / Gradle / Ivy

package zmq;

import java.nio.ByteBuffer;

// Encoder for 0MQ framing protocol. Converts messages into data stream.

public class V1Encoder extends EncoderBase
{
    private static final int size_ready = 0;
    private static final int message_ready = 1;
    
    private Msg in_progress;
    private final byte[] tmpbuf;
    private IMsgSource msg_source;
    
    public V1Encoder (int bufsize_, IMsgSource session)
    {
        super (bufsize_);
        tmpbuf = new byte [9];
        msg_source = session;
        
        //  Write 0 bytes to the batch and go to message_ready state.
        next_step ((byte[])null, 0, message_ready, true);
    }

    @Override
    public void set_msg_source (IMsgSource msg_source_)
    {
        msg_source = msg_source_;
    }

    @Override
    protected boolean next() 
    {
        switch(state()) {
        case size_ready:
            return size_ready ();
        case message_ready:
            return message_ready ();
        default:
            return false;
        }
    }

    
    private final boolean size_ready ()
    {
        //  Write message body into the buffer.
        next_step (in_progress.data (), in_progress.size (),
            message_ready, !in_progress.hasMore());
        return true;
    }

    
    private final boolean message_ready ()
    {
        //  Read new message. If there is none, return false.
        //  Note that new state is set only if write is successful. That way
        //  unsuccessful write will cause retry on the next state machine
        //  invocation.
        
        if (msg_source == null)
            return false;
        
        in_progress = msg_source.pull_msg ();
        if (in_progress == null) {
            return false;
        }

        int protocol_flags = 0;
        if (in_progress.hasMore ())
            protocol_flags |= V1Protocol.MORE_FLAG;
        if (in_progress.size () > 255)
            protocol_flags |= V1Protocol.LARGE_FLAG;
        tmpbuf [0] = (byte) protocol_flags;
        
        //  Encode the message length. For messages less then 256 bytes,
        //  the length is encoded as 8-bit unsigned integer. For larger
        //  messages, 64-bit unsigned integer in network byte order is used.
        final int size = in_progress.size ();
        if (size > 255) {
            ByteBuffer b = ByteBuffer.wrap (tmpbuf);
            b.position (1);
            b.putLong (size);
            next_step (tmpbuf, 9, size_ready, false);
        }
        else {
            tmpbuf [1] = (byte) (size);
            next_step (tmpbuf, 2, size_ready, false);
        }
        return true;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy