/*
Реализация среды исполнения языка программирования
Объектно-ориентированный продвинутый векторный транслятор
Copyright © 2021, 2024 Малик Разработчик
Это свободная программа: вы можете перераспространять ее и/или изменять
ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
в каком она была опубликована Фондом свободного программного обеспечения;
либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
Эта программа распространяется в надежде, что она будет полезной,
но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
общественной лицензии GNU.
Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
вместе с этой программой. Если это не так, см.
<https://www.gnu.org/licenses/>.
*/
package platform.independent.streamformat.text.plain;
import avt.io.*;
import avt.io.charset.*;
import avt.io.extension.*;
import platform.independent.streamformat.*;
import platform.independent.streamformat.text.*;
public class PlainCodec(Object, TextCodec, OutputAdapter, CharsetOutputAdapter, InputAdapter, CharsetInputAdapter, TextEncoder, MutableDataHolder, DataHolder, TextDecoder)
{
private String fldText;
public () { }
public void saveToDataStream(DataOutputStream stream) throws IOException { saveToDataStream(stream, (CharEncoder) null); }
public void saveToDataStream(DataOutputStream stream, CharEncoder encoder) throws IOException {
if(stream == null)
{
throw new NullPointerException(String.format(avt.lang.package.getResourceString("null-pointer.argument"), new Object[] { "stream" }));
}
String text = fldText;
if(text == null)
{
throw new EmptyAdapterException(platform.independent.streamformat.package.getResourceString("empty-adapter"));
}
if(encoder == null) encoder = Charset.getDefault().newEncoder();
stream.write(encoder.encode(text.toCharArray()));
}
public void loadFromDataStream(DataInputStream stream) throws IOException { loadFromDataStream(stream, (CharDecoder) null); }
public void loadFromDataStream(DataInputStream stream, CharDecoder decoder) throws IOException {
if(stream == null)
{
throw new NullPointerException(String.format(avt.lang.package.getResourceString("null-pointer.argument"), new Object[] { "stream" }));
}
LimitedSizeExtension sizeable = (LimitedSizeExtension) stream.getExtension(LimitedSizeExtension.class);
if(sizeable == null)
{
throw new InvalidStreamException(String.format(
platform.independent.streamformat.package.getResourceString("invalid-stream.input.unsupported-extension"), new Object[] { LimitedSizeExtension.class.simpleName }
));
}
long size = sizeable.available();
if(size < 0 || size > Int.MAX_VALUE)
{
throw new InvalidStreamException(platform.independent.streamformat.package.getResourceString("invalid-stream.input.size-too-large"));
}
int length = (int) size;
byte[] buffer = new byte[length];
if((length = stream.read(buffer)) <= 0)
{
fldText = "";
return;
}
char[] text = (decoder != null ? decoder : Charset.getDefault().newDecoder()).decode(buffer, 0, length);
fldText = new String(text);
}
public void setText(String text) throws InvalidDataFormatException, UnsupportedDataException { fldText = text; }
public void clear() { fldText = null; }
public boolean isEmpty() { return fldText == null; }
public String getText() { return fldText; }
}