/******************************************************************************* * gMix open source project - https://svs.informatik.uni-hamburg.de/gmix/ * Copyright (C) 2014 SVS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. *******************************************************************************/ package userGeneratedContent.testbedPlugIns.layerPlugIns.layer5application.socks_v0_001.multiplexer; import java.io.IOException; import java.io.OutputStream; import java.util.Arrays; import staticContent.framework.util.Util; public class DemuxOutputStream extends OutputStream { private OutputStream jointOsToMultiplexer; private int multiplexId; private volatile boolean isClosed = false; public DemuxOutputStream(OutputStream jointOsToMultiplexer, int multiplexId) { this.jointOsToMultiplexer = jointOsToMultiplexer; this.multiplexId = multiplexId; } @Override public void write(int b) throws IOException { synchronized (jointOsToMultiplexer) { jointOsToMultiplexer.write(formMultimplexMessage(new byte[]{(byte)b})); } } public void write(byte b[], int off, int len) throws IOException { synchronized (jointOsToMultiplexer) { jointOsToMultiplexer.write(formMultimplexMessage(Arrays.copyOfRange(b, off, off + len))); } } public void flush() throws IOException { synchronized (jointOsToMultiplexer) { jointOsToMultiplexer.flush(); } } public void close() throws IOException { synchronized (jointOsToMultiplexer) { if (!isClosed) { isClosed = true; // send DISCONNECT message (or acknowledge DISCONNECT) jointOsToMultiplexer.write(Util.concatArrays(new byte[][] {Util.intToByteArray(multiplexId), Util.shortToByteArray(-1)})); jointOsToMultiplexer.flush(); } } } private byte[] formMultimplexMessage(byte[] payload) { return Util.concatArrays(new byte[][] {Util.intToByteArray(multiplexId), Util.shortToByteArray(payload.length), payload}); } }