/*
* @(#)IFFChunk.java 1.1 2006-07-20
*
* Copyright (c) 1999-2006 Werner Randelshofer, Goldau, Switzerland.
* All rights reserved.
*
* You may not use, copy or modify this file, except in compliance with the
* license agreement you entered into with Werner Randelshofer.
* For details see accompanying license terms.
*/
package org.monte.media.iff;
import java.util.*;
/**
* IFF Chunks form the building blocks of an IFF file.
* This class is made for reading purposes only. See MutableIFFChunk
* for writing purposes.
*
* @author Werner Randelshofer, Hausmatt 10, CH-6405 Goldau, Switzerland
* @version 1.1 2006-07-20 Reworked for Java 1.5.
* <br>1.0 1999-10-19
*/
public class IFFChunk {
private int id;
private int type;
private long size;
private long scan;
private byte[] data;
private Hashtable<IFFChunk,IFFChunk> propertyChunks;
private Vector<IFFChunk> collectionChunks;
public IFFChunk(int type, int id) {
this.id = id;
this.type = type;
this.size = -1;
this.scan = -1;
}
public IFFChunk(int type, int id, long size, long scan) {
this.id = id;
this.type = type;
this.size = size;
this.scan = scan;
}
@SuppressWarnings("unchecked")
public IFFChunk(int type, int id, long size, long scan, IFFChunk propGroup) {
this.id = id;
this.type = type;
this.size = size;
this.scan = scan;
if (propGroup != null) {
if (propGroup.propertyChunks != null) {
propertyChunks = (Hashtable<IFFChunk,IFFChunk>)propGroup.propertyChunks.clone(); }
if (propGroup.collectionChunks != null) {
collectionChunks = (Vector<IFFChunk>)propGroup.collectionChunks.clone(); }
}
}
/**
* @return ID of chunk.
*/
public int getID() {
return id; }
/**
* @return Type of chunk.
*/
public int getType() {
return type; }
/**
* @return Size of chunk.
*/
public long getSize() {
return size; }
/**
* @return Scan position of chunk within the file.
*/
public long getScan() {
return scan; }
public void putPropertyChunk(IFFChunk chunk) {
if (propertyChunks == null) {
propertyChunks = new Hashtable<IFFChunk,IFFChunk>(); }
propertyChunks.put(chunk,chunk);
}
public IFFChunk getPropertyChunk(int id) {
if (propertyChunks == null) {
return null; }
IFFChunk chunk = new IFFChunk(type, id);
return (IFFChunk)propertyChunks.get(chunk);
}
public Enumeration propertyChunks() {
if (propertyChunks == null) {
propertyChunks = new Hashtable<IFFChunk,IFFChunk>(); }
return propertyChunks.keys();
}
public void addCollectionChunk(IFFChunk chunk) {
if (collectionChunks == null) {
collectionChunks = new Vector<IFFChunk>(); }
collectionChunks.addElement(chunk);
}
public IFFChunk[] getCollectionChunks(int id) {
if (collectionChunks == null) {
return new IFFChunk[0]; }
Enumeration enm = collectionChunks.elements();
int i = 0;
while ( enm.hasMoreElements() ) {
IFFChunk chunk = (IFFChunk)enm.nextElement();
if (chunk.id == id) {
i++; }
}
IFFChunk[] array = new IFFChunk[i];
i = 0;
enm = collectionChunks.elements();
while ( enm.hasMoreElements() ) {
IFFChunk chunk = (IFFChunk)enm.nextElement();
if (chunk.id == id) {
array[i++] = chunk; }
}
return array;
}
public Enumeration collectionChunks() {
if (collectionChunks == null) {
collectionChunks = new Vector<IFFChunk>(); }
return collectionChunks.elements();
}
/**
* Sets the data.
* Note: The array will not be cloned.
*/
public void setData(byte[] data) {
this.data = data; }
/**
* Gets the data.
* Note: The array will not be cloned.
*/
public byte[] getData() {
return data; }
@Override
public boolean equals(Object another) {
if (another instanceof IFFChunk) {
IFFChunk that = (IFFChunk) another;
return (that.id == this.id && that.type == this.type);
}
return false;
}
@Override
public int hashCode() {
return id; }
@Override
public String toString() {
return super.toString()+"{"+IFFParser.idToString(getType())+","+IFFParser.idToString(getID())+"}";
}
}