// Near Infinity - An Infinity Engine Browser and Editor
// Copyright (C) 2001 - 2005 Jon Olav Hauglid
// See LICENSE.txt for license information
package org.infinity.datatype;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import org.infinity.resource.StructEntry;
import org.infinity.util.Misc;
import org.infinity.util.io.StreamUtils;
public final class TextString extends Datatype implements InlineEditable, IsTextual
{
private final ByteBuffer buffer;
private String text;
public TextString(ByteBuffer buffer, int offset, int length, String name)
{
this(null, buffer, offset, length, name);
}
public TextString(StructEntry parent, ByteBuffer buffer, int offset, int length, String name)
{
super(parent, offset, length, name);
this.buffer = StreamUtils.getByteBuffer(length);
read(buffer, offset);
}
// --------------------- Begin Interface InlineEditable ---------------------
@Override
public boolean update(Object value)
{
String newstring = (String)value;
if (newstring.length() > getSize())
return false;
text = newstring;
return true;
}
// --------------------- End Interface InlineEditable ---------------------
// --------------------- Begin Interface Writeable ---------------------
@Override
public void write(OutputStream os) throws IOException
{
if (text != null) {
byte[] buf = text.getBytes(Misc.CHARSET_DEFAULT);
buffer.position(0);
buffer.put(buf, 0, Math.min(buf.length, buffer.limit()));
while (buffer.remaining() > 0) {
buffer.put((byte)0);
}
}
buffer.position(0);
StreamUtils.writeBytes(os, buffer);
}
// --------------------- End Interface Writeable ---------------------
//--------------------- Begin Interface Readable ---------------------
@Override
public int read(ByteBuffer buffer, int offset)
{
StreamUtils.copyBytes(buffer, offset, this.buffer, 0, getSize());
text = null;
return offset + getSize();
}
//--------------------- End Interface Readable ---------------------
//--------------------- Begin Interface IsTextual ---------------------
@Override
public String getText()
{
if (text == null) {
buffer.position(0);
text = StreamUtils.readString(buffer, buffer.limit());
}
return text;
}
//--------------------- End Interface IsTextual ---------------------
@Override
public String toString()
{
return getText();
}
}