111 lines
2.6 KiB
Java
Executable File
111 lines
2.6 KiB
Java
Executable File
package com.softwarecraftsmen.dns.messaging.serializer;
|
|
|
|
import com.softwarecraftsmen.CanNeverHappenException;
|
|
import com.softwarecraftsmen.unsignedIntegers.Unsigned16BitInteger;
|
|
import com.softwarecraftsmen.unsignedIntegers.Unsigned32BitInteger;
|
|
import com.softwarecraftsmen.unsignedIntegers.Unsigned8BitInteger;
|
|
import static com.softwarecraftsmen.dns.NonAsciiAndControlCharactersAreNotSupportedInCharacterStringsException.throwExceptionIfUnsupportedCharacterCode;
|
|
import com.softwarecraftsmen.dns.Seconds;
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
|
import java.io.ByteArrayOutputStream;
|
|
import java.io.IOException;
|
|
|
|
public class AtomicWriter
|
|
{
|
|
private final ByteArrayOutputStream stream;
|
|
|
|
public AtomicWriter(final @NotNull ByteArrayOutputStream stream)
|
|
{
|
|
this.stream = stream;
|
|
}
|
|
|
|
@NotNull
|
|
public byte[] toByteArray()
|
|
{
|
|
return stream.toByteArray();
|
|
}
|
|
|
|
public void writeTimeToLiveInSeconds(final @NotNull Unsigned32BitInteger timeToLiveInSeconds)
|
|
{
|
|
writeUnsigned32BitInteger(timeToLiveInSeconds);
|
|
}
|
|
|
|
public void writeCharacterString(final @NotNull String characterString)
|
|
{
|
|
writeCharacterString(characterString.toCharArray());
|
|
}
|
|
|
|
public void writeCharacterString(final @NotNull char[] characterString)
|
|
{
|
|
if (characterString.length > 255)
|
|
{
|
|
throw new IllegalArgumentException("Maximum length of a character string in DNS is 255 characters");
|
|
}
|
|
writeUnsigned8BitUnsignedInteger(new Unsigned8BitInteger(characterString.length));
|
|
for (char toWrite : characterString)
|
|
{
|
|
writeCharacter(toWrite);
|
|
}
|
|
}
|
|
|
|
public void writeCharacter(final char toWrite)
|
|
{
|
|
throwExceptionIfUnsupportedCharacterCode(toWrite);
|
|
stream.write(toWrite & 0xFF);
|
|
}
|
|
|
|
public void writeUnsignedSeconds(final @NotNull Seconds seconds)
|
|
{
|
|
seconds.serialize(this);
|
|
}
|
|
|
|
public void writeUnsigned32BitInteger(final @NotNull Unsigned32BitInteger unsigned32BitInteger)
|
|
{
|
|
try
|
|
{
|
|
unsigned32BitInteger.write(stream);
|
|
}
|
|
catch (IOException e)
|
|
{
|
|
throw new CanNeverHappenException(e);
|
|
}
|
|
}
|
|
|
|
public void writeUnsigned16BitInteger(final @NotNull Unsigned16BitInteger unsigned16BitInteger)
|
|
{
|
|
try
|
|
{
|
|
unsigned16BitInteger.write(stream);
|
|
}
|
|
catch (IOException e)
|
|
{
|
|
throw new CanNeverHappenException(e);
|
|
}
|
|
}
|
|
|
|
public void writeUnsigned8BitUnsignedInteger(final @NotNull Unsigned8BitInteger unsigned8BitInteger)
|
|
{
|
|
try
|
|
{
|
|
unsigned8BitInteger.write(stream);
|
|
}
|
|
catch (IOException e)
|
|
{
|
|
throw new CanNeverHappenException(e);
|
|
}
|
|
}
|
|
|
|
public void writeBytes(final @NotNull byte[] bytes)
|
|
{
|
|
try
|
|
{
|
|
stream.write(bytes);
|
|
}
|
|
catch (IOException e)
|
|
{
|
|
throw new CanNeverHappenException(e);
|
|
}
|
|
}
|
|
}
|