import kdu_jni.Kdu_cache;
import kdu_jni.KduException;


public class JP2Cache extends Kdu_cache
{
  private Mutex cacheMutex = new Mutex();

  private static final int KDU_PRECINCT_DATABIN    = 0;
  private static final int KDU_TILE_HEADER_DATABIN = 1;
  private static final int KDU_MAIN_HEADER_DATABIN = 3;

  private static byte emptyPacket[] = {-128};


  public void Acquire_lock() throws KduException
  {
    cacheMutex.lock();
  }

  public void Release_lock() throws KduException
  {
    cacheMutex.unlock();
  }

  public void addToMainHeader(byte data[]) throws KduException
  {
    Add_to_databin(KDU_MAIN_HEADER_DATABIN, 0, 0, data,
      Get_databin_length(KDU_MAIN_HEADER_DATABIN, 0, 0),
      data.length, false
    );
  }

  public int getMainHeaderLength() throws KduException
  {
    return Get_databin_length(KDU_MAIN_HEADER_DATABIN, 0, 0);
  }

  public void completeMainHeader() throws KduException
  {
    Add_to_databin(KDU_MAIN_HEADER_DATABIN, 0, 0, null,
      Get_databin_length(KDU_MAIN_HEADER_DATABIN, 0, 0),
      0, true
    );
  }

  public void addToTileHeader(byte data[], int tileID) throws KduException
  {
    Add_to_databin(KDU_TILE_HEADER_DATABIN, 0, tileID, data,
      Get_databin_length(KDU_TILE_HEADER_DATABIN, 0, tileID),
      data.length, false
    );
  }

  public void addToTileHeader(byte data[]) throws KduException
  {
    addToTileHeader(data, 0);
  }

  public int getTileHeaderLength(int tileID) throws KduException
  {
    return Get_databin_length(KDU_TILE_HEADER_DATABIN, 0, tileID);
  }

  public int getTileHeaderLength() throws KduException
  {
    return getTileHeaderLength(0);
  }

  public void completeTileHeader(int tileID) throws KduException
  {
    Add_to_databin(KDU_TILE_HEADER_DATABIN, 0, tileID, null,
      Get_databin_length(KDU_TILE_HEADER_DATABIN, 0, tileID),
      0, true
    );
  }

  public void completeTileHeader() throws KduException
  {
    completeTileHeader(0);
  }

  public void addToPrecinct(byte data[], int precID) throws KduException
  {
    Add_to_databin(KDU_PRECINCT_DATABIN, 0, precID, data,
      Get_databin_length(KDU_PRECINCT_DATABIN, 0, precID),
      data.length, false
    );
  }

  public void addEmptyPacketToPrecinct(int precID) throws KduException
  {
    Add_to_databin(KDU_PRECINCT_DATABIN, 0, precID, emptyPacket,
      Get_databin_length(KDU_PRECINCT_DATABIN, 0, precID),
      1, false
    );
  }

  public int getPrecinctLength(int precID) throws KduException
  {
    return Get_databin_length(KDU_PRECINCT_DATABIN, 0, precID);
  }

  public void completePrecinct(int precID) throws KduException
  {
    Add_to_databin(KDU_PRECINCT_DATABIN, 0, precID, null,
      Get_databin_length(KDU_PRECINCT_DATABIN, 0, precID),
      0, true
    );
  }

  public void setInitialScope() throws KduException
  {
    Set_read_scope(KDU_MAIN_HEADER_DATABIN, 0, 0);
  }
}
