/**
* JEBML - Java library to read/write EBML/Matroska elements.
* Copyright (C) 2004 Jory Stone <jebml@jory.info>
* Based on Javatroska (C) 2002 John Cannon <spyder@matroska.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.jcodec.containers.mkv.ebml;
/**
* Baisc class for handling an EBML string data type. This class encapsulates
* both UTF and ASCII string types and can use any string type supported by the
* Java platform.
*
* @author John Cannon
*/
public class StringElement extends BinaryElement {
private String charset = "UTF-8";
/** Creates a new instance of StringElement */
public StringElement(byte[] typeID) {
super(typeID);
}
public StringElement(byte[] typeID, String encoding) {
super(typeID);
charset = encoding;
}
private boolean checkForCharsetHack() {
// Check if we are trying to read UTF-8, if so lets try UTF8.
// Microsofts Java supports "UTF8" but not "UTF-8"
if (charset.compareTo("UTF-8") == 0) {
charset = "UTF8";
// Let's try again
return true;
} else if (charset.compareTo("US-ASCII") == 0) {
// This is the same story as UTF-8,
// If Microsoft is going to hijack Java they should at least support
// the orignal :>
charset = "ASCII";
// Let's try again
return true;
}
return false;
}
public String get() {
try {
if (data == null)
throw new java.lang.IllegalStateException("Call readData() before trying to extract the string value.");
return new String(data.array(), charset);
} catch (java.io.UnsupportedEncodingException ex) {
if (checkForCharsetHack()) {
return get();
}
ex.printStackTrace();
return "";
}
}
public void set(String value) {
try {
setData(value.getBytes(charset));
} catch (java.io.UnsupportedEncodingException ex) {
if (checkForCharsetHack()) {
set(value);
return;
}
ex.printStackTrace();
}
}
public String getEncoding() {
return charset;
}
}