Connection.java

package fr.umlv.ji.tcp.redirector;
import java.nio.*;
import java.util.*;
/**
 * Classe stockant l'état d'un sens de communication.
 */
public class Connection {
  /** Taille du tampon de stockage. */
  protected final static int BUFFER_SIZE = 32768;
  /** Tampon de stockage de ce qui est reçu. */
  protected ByteBuffer buffer;
  /** Tampon "vue" du tampon de stockage, utilisé pour l'écriture. */
  protected ByteBuffer writeView;
  /** Constructeur par défaut. */
  public Connection() {
    buffer = ByteBuffer.allocateDirect(BUFFER_SIZE);
    writeView = buffer.duplicate();
    writeView.limit(0);
  }
  /** Détermine s'il reste des choses à écrire. */
  public boolean readyToWrite() { return writeView.hasRemaining(); }
  /** Récupère le tampon à écrire. */
  public ByteBuffer getWriteView() { return writeView; }
  /** Récupère le tampon où écrire. */
  public ByteBuffer getBuffer() { return buffer; }
  /** Mise à jour de la vue après une lecture. */
  public void updateWriteView() {
    writeView.limit(buffer.position());
  }
  /** Libère, si nécessaire et possible, de l'espace dans le tampon. */
  public void tryCompact() {
    // Libérer de l'espace si on a déjà utilisé la moitié du tampon et que
    // les données à déplacer font moins du quart de la taille du tampon.
    if ((buffer.position() > (BUFFER_SIZE/2)) &&
    (writeView.capacity()-writeView.position()) < (BUFFER_SIZE/4)) {
      writeView.compact().flip();
      buffer.position(writeView.limit());
    }
  }
}