package com.frostwire.mp3;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.util.Arrays;
public class EncodedText {
public static final byte TEXT_ENCODING_ISO_8859_1 = 0;
public static final byte TEXT_ENCODING_UTF_16 = 1;
public static final byte TEXT_ENCODING_UTF_16BE = 2;
public static final byte TEXT_ENCODING_UTF_8 = 3;
public static final String CHARSET_ISO_8859_1 = "ISO-8859-1";
public static final String CHARSET_UTF_16 = "UTF-16";
public static final String CHARSET_UTF_16BE = "UTF-16BE";
public static final String CHARSET_UTF_8 = "UTF-8";
private static final String[] characterSets = {
CHARSET_ISO_8859_1,
CHARSET_UTF_16,
CHARSET_UTF_16BE,
CHARSET_UTF_8
};
private byte[] value;
private byte textEncoding;
public EncodedText(byte textEncoding, byte[] value) {
this.textEncoding = textEncoding;
this.value = value;
}
public EncodedText(byte textEncoding, String ascii) {
this.textEncoding = textEncoding;
value = stringToUnicodeBytes(ascii, characterSetForTextEncoding(textEncoding));
}
private String characterSetForTextEncoding(byte textEncoding) {
try {
return characterSets[textEncoding];
} catch (ArrayIndexOutOfBoundsException e) {
throw new IllegalArgumentException("Invalid text encoding " + textEncoding);
}
}
public byte getTextEncoding() {
return textEncoding;
}
public void setTextEncoding(byte textEncoding) {
this.textEncoding = textEncoding;
}
public byte[] toBytes() {
return value;
}
public String toString() {
return unicodeBytesToString(value, characterSetForTextEncoding(textEncoding));
}
public String getCharacterSet() {
return characterSetForTextEncoding(textEncoding);
}
public boolean equals(Object obj) {
if (! (obj instanceof EncodedText)) return false;
if (super.equals(obj)) return true;
EncodedText other = (EncodedText) obj;
if (textEncoding != other.textEncoding) return false;
if (! Arrays.equals(value, other.value)) return false;
return true;
}
public static String unicodeBytesToString(byte[] bytes, String characterSet) {
Charset charset = Charset.forName(characterSet);
CharsetDecoder decoder = charset.newDecoder();
try {
CharBuffer cbuf = decoder.decode(ByteBuffer.wrap(bytes));
String s = cbuf.toString();
int length = s.indexOf(0);
if (length == -1) return s;
return s.substring(0, length);
} catch (CharacterCodingException e) {
return null;
}
}
public static byte[] stringToUnicodeBytes(String s, String characterSet) {
Charset charset = Charset.forName(characterSet);
CharsetEncoder encoder = charset.newEncoder();
ByteBuffer byteBuffer;
try {
byteBuffer = encoder.encode(CharBuffer.wrap(s));
return BufferTools.copyBuffer(byteBuffer.array(), 0, byteBuffer.limit());
} catch (CharacterCodingException e) {
return stringToUTF8Bytes(s);
}
}
private static byte[] stringToUTF8Bytes(String s) {
try {
return s.getBytes("UTF-8");
} catch (UnsupportedEncodingException e1) {
return s.getBytes();
}
}
}