package com.faforever.client.relay; import com.google.common.io.LittleEndianDataOutputStream; import java.io.BufferedOutputStream; import java.io.IOException; import java.io.OutputStream; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.List; /** * Writes data to Forged Alliance (the game, not the lobby). */ public class FaDataOutputStream extends OutputStream { public static final int FIELD_TYPE_INT = 0; public static final int FIELD_TYPE_FOLLOWING_STRING = 2; public static final int FIELD_TYPE_STRING = 1; public static final char DELIMITER = '\b'; private final LittleEndianDataOutputStream outputStream; private Charset charset; public FaDataOutputStream(OutputStream outputStream) { this.outputStream = new LittleEndianDataOutputStream(new BufferedOutputStream(outputStream)); charset = StandardCharsets.UTF_8; } @Override public void write(int b) throws IOException { outputStream.write(b); } @Override public void flush() throws IOException { outputStream.flush(); } public void writeArgs(List<Object> args) throws IOException { writeInt(args.size()); for (Object arg : args) { if (arg instanceof Double) { writeByte(FIELD_TYPE_INT); writeInt(((Double) arg).intValue()); } else if (arg instanceof Integer) { writeByte(FIELD_TYPE_INT); writeInt((int) arg); } else if (arg instanceof String) { String value = (String) arg; writeByte(FIELD_TYPE_STRING); writeInt(value.length()); writeString(value); } } } public void writeInt(int value) throws IOException { outputStream.writeInt(value); } public void writeByte(int b) throws IOException { outputStream.writeByte(b); } public void writeString(String string) throws IOException { outputStream.write(string.getBytes(charset)); } }