package com.jcumulus.server.rtmfp.stream; /** * jCumulus is a Java port of Cumulus OpenRTMP * * Copyright 2011 OpenRTMFP * * 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 received along this program for more * details (or else see http://www.gnu.org/licenses/). * * * This file is a part of jCumulus. */ import com.jcumulus.server.rtmfp.pipe.C; import java.math.BigInteger; import java.nio.ByteBuffer; import java.util.Arrays; import org.apache.log4j.Logger; public class BinaryWriter { private static final Logger C = Logger.getLogger(BinaryWriter.class); protected byte E[]; private int A; protected int D; protected int B; public BinaryWriter(byte abyte0[]) { E = abyte0; A = 0; D = 0; B = abyte0.length; } private void A(byte byte0) { if(A < B) { E[A] = byte0; A++; if(A > D) D = A; } else { C.warn("Limit is exceeded"); try { throw new Exception(); } catch(Exception exception) { C.error("Trace - ", exception); } } } public void B(int i) { A = i; D = i; } public int D() { return B - A; } public void E(int i) { A += i; if(A > B) { A = B; D = B; } else if(A > D) D = A; } public void F(int i) { if(i <= D) A = i; } public int C() { return A; } public void C(int i) { if(i == 0) B = E.length; else if(i > E.length) { C.warn((new StringBuilder()).append("Limit '").append(i).append("' more upper than buffer size '").append(E.length).append("' bytes").toString()); B = E.length; } else { B = i; } } public void G(int i) { D -= i; byte abyte0[] = Arrays.copyOfRange(E, i, E.length); E = new byte[E.length]; System.arraycopy(abyte0, 0, E, 0, abyte0.length); } private void A(int i, int j) { byte abyte0[] = BigInteger.valueOf(i).toByteArray(); for(int k = 0; k < j - abyte0.length; k++) A((byte)0); byte abyte1[] = abyte0; int l = abyte1.length; for(int i1 = 0; i1 < l; i1++) { byte byte0 = abyte1[i1]; A(byte0); } } public void A(double d) { byte abyte0[] = new byte[8]; ByteBuffer.wrap(abyte0).putDouble(d); B(abyte0); } public void B(byte byte0) { A(byte0); } public void A(byte abyte0[]) { A((byte)abyte0.length); B(abyte0); } public void A(short word0) { A(word0, 2); } public void A(int i) { A(i, 4); } public void C(byte abyte0[]) { B((byte)abyte0.length); byte abyte1[] = abyte0; int i = abyte1.length; for(int j = 0; j < i; j++) { byte byte0 = abyte1[j]; A(byte0); } } public void D(byte abyte0[]) { A((short)abyte0.length); byte abyte1[] = abyte0; int i = abyte1.length; for(int j = 0; j < i; j++) { byte byte0 = abyte1[j]; A(byte0); } } public void A(byte byte0, int i) { for(int j = 0; j < i; j++) A(byte0); } public void A(byte abyte0[], int i) { for(int j = 0; j < i; j++) A(abyte0[j]); } public void A(String s) { byte abyte0[] = s.getBytes(); int i = abyte0.length; for(int j = 0; j < i; j++) { Byte byte1 = Byte.valueOf(abyte0[j]); A(byte1.byteValue()); } } public void B(byte abyte0[]) { byte abyte1[] = abyte0; int i = abyte1.length; for(int j = 0; j < i; j++) { byte byte0 = abyte1[j]; A(byte0); } } public void D(int i) { byte byte0 = com.jcumulus.server.rtmfp.pipe.C.A(i); switch(byte0) { case 4: // '\004' B((byte)(0x80 | i >> 22 & 0x7f)); B((byte)(0x80 | i >> 15 & 0x7f)); B((byte)(0x80 | i >> 8 & 0x7f)); B((byte)(i & 0xff)); break; case 3: // '\003' B((byte)(0x80 | i >> 14 & 0x7f)); B((byte)(0x80 | i >> 7 & 0x7f)); B((byte)(i & 0x7f)); break; case 2: // '\002' B((byte)(0x80 | i >> 7 & 0x7f)); B((byte)(i & 0x7f)); break; default: B((byte)(i & 0x7f)); break; } } public int A() { return D; } public byte[] B() { return Arrays.copyOfRange(E, 0, D); } }