Files
jlibzeroconf/src/main/java/com/softwarecraftsmen/dns/messaging/serializer/AtomicWriter.java
2012-05-04 17:44:49 -07:00

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);
}
}
}