package com.mpatric.mp3agic;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
public class ID3v2ChapterTOCFrameData extends AbstractID3v2FrameData {
protected boolean isRoot;
protected boolean isOrdered;
protected String id;
protected String[] childs;
protected ArrayList<ID3v2Frame> subframes = new ArrayList<ID3v2Frame>();
public ID3v2ChapterTOCFrameData(boolean unsynchronisation) {
super(unsynchronisation);
}
public ID3v2ChapterTOCFrameData(boolean unsynchronisation, boolean isRoot, boolean isOrdered,
String id, String[] childs) {
super(unsynchronisation);
this.isRoot = isRoot;
this.isOrdered = isOrdered;
this.id = id;
this.childs = childs;
}
public ID3v2ChapterTOCFrameData(boolean unsynchronisation, byte[] bytes)
throws InvalidDataException {
super(unsynchronisation);
synchroniseAndUnpackFrameData(bytes);
}
protected void unpackFrameData(byte[] bytes) throws InvalidDataException {
ByteBuffer bb = ByteBuffer.wrap(bytes);
id = ByteBufferUtils.extractNullTerminatedString(bb);
byte flags = bb.get();
if ((flags & 0x01) == 0x01) {
isRoot = true;
}
if ((flags & 0x02) == 0x02) {
isOrdered = true;
}
int childCount = bb.get(); // TODO: 0xFF -> int = 255; byte = -128;
childs = new String[childCount];
for (int i = 0; i < childCount; i++) {
childs[i] = ByteBufferUtils.extractNullTerminatedString(bb);
}
for (int offset = bb.position(); offset < bytes.length;) {
ID3v2Frame frame = new ID3v2Frame(bytes, offset);
offset += frame.getLength();
subframes.add(frame);
}
}
public void addSubframe(String id, AbstractID3v2FrameData frame) {
subframes.add(new ID3v2Frame(id, frame.toBytes()));
}
protected byte[] packFrameData() {
ByteBuffer bb = ByteBuffer.allocate(getLength());
bb.put(id.getBytes());
bb.put((byte) 0);
bb.put(getFlags());
bb.put((byte)childs.length);
for(String child: childs) {
bb.put(child.getBytes());
bb.put((byte) 0);
}
for (ID3v2Frame frame : subframes) {
try {
bb.put(frame.toBytes());
} catch (NotSupportedException e) {
e.printStackTrace();
}
}
return bb.array();
}
private byte getFlags() {
byte b = 0;
if(isRoot) {
b |= 0x01;
}
if(isOrdered) {
b |= 0x02;
}
return b;
}
public boolean isRoot() {
return isRoot;
}
public void setRoot(boolean isRoot) {
this.isRoot = isRoot;
}
public boolean isOrdered() {
return isOrdered;
}
public void setOrdered(boolean isOrdered) {
this.isOrdered = isOrdered;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String[] getChilds() {
return childs;
}
public void setChilds(String[] childs) {
this.childs = childs;
}
public ArrayList<ID3v2Frame> getSubframes() {
return subframes;
}
public void setSubframes(ArrayList<ID3v2Frame> subframes) {
this.subframes = subframes;
}
@Override
protected int getLength() {
int length = 3;
if (id != null) length += id.length();
if (childs != null) {
length += childs.length;
for (String child : childs) {
length += child.length();
}
}
if (subframes != null) {
for (ID3v2Frame frame : subframes) {
length += frame.getLength();
}
}
return length;
}
// public boolean equals(Object obj) {
// if (! (obj instanceof ID3v2ChapterFrameData)) return false;
// if (! super.equals(obj)) return false;
// ID3v2ChapterFrameData other = (ID3v2ChapterFrameData) obj;
// if (text == null) {
// if (other.text != null) return false;
// } else if (other.text == null) return false;
// else if (! text.equals(other.text)) return false;
// return true;
// }
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("ID3v2ChapterTOCFrameData [isRoot=");
builder.append(isRoot);
builder.append(", isOrdered=");
builder.append(isOrdered);
builder.append(", id=");
builder.append(id);
builder.append(", childs=");
builder.append(Arrays.toString(childs));
builder.append(", subframes=");
builder.append(subframes);
builder.append("]");
return builder.toString();
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!super.equals(obj)) return false;
if (getClass() != obj.getClass()) return false;
ID3v2ChapterTOCFrameData other = (ID3v2ChapterTOCFrameData) obj;
if (!Arrays.equals(childs, other.childs)) return false;
if (id == null) {
if (other.id != null) return false;
} else if (!id.equals(other.id)) return false;
if (isOrdered != other.isOrdered) return false;
if (isRoot != other.isRoot) return false;
if (subframes == null) {
if (other.subframes != null) return false;
} else if (!subframes.equals(other.subframes)) return false;
return true;
}
}