tor.util.ByteFifo.java Source code

Java tutorial

Introduction

Here is the source code for tor.util.ByteFifo.java

Source

/*
    Tor Research Framework - easy to use tor client library/framework
    Copyright (C) 2014  Dr Gareth Owen <drgowen@gmail.com>
    www.ghowen.me / github.com/drgowen/tor-research-framework
    
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
package tor.util;

import org.bouncycastle.util.Arrays;

public class ByteFifo {

    byte buffer[];
    int in = 0, out = 0;
    int count = 0;

    /*test code
      * ByteFifo fifo = new ByteFifo(10);
    for(int i=0; i<5; i++) {
       fifo.put("hello".getBytes());
       System.out.println(new String(fifo.get(4)));
    }*/

    public ByteFifo(int capacity) {
        buffer = new byte[capacity];
    }

    public boolean isEmpty() {
        return in == out;
    }

    public synchronized void put(byte[] toput) {
        for (byte b : toput) {
            buffer[in] = b;
            in = (in + 1) % buffer.length;
            count++;
            if (count >= buffer.length)
                throw new RuntimeException("buffer overflow");
        }
    }

    public int available() {
        return count;
    }

    // bytes = -1 for unlimited
    public synchronized byte[] get(int bytes) {
        byte buf[] = new byte[buffer.length];
        int cnt = 0;
        while (count > 0 && (bytes == -1 || cnt < bytes)) {
            buf[cnt++] = buffer[out];
            count--;
            out = (out + 1) % buffer.length;
        }
        return Arrays.copyOfRange(buf, 0, cnt);
    }

}