package com.jcumulus.server.rtmfp.flow;
/**
* 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.B;
import com.jcumulus.server.rtmfp.stream.BinaryWriter;
import com.google.common.base.Strings;
import java.util.*;
import org.apache.log4j.Logger;
public class F
{
public F(BinaryWriter a)
{
C = new HashMap();
A = new ArrayList();
G = new LinkedList();
F = a;
}
public void A(String s)
{
H = Integer.valueOf(0);
if(Strings.isNullOrEmpty(s))
{
F.B(((byte)(E ? 1 : 6)));
return;
}
if(!E)
{
if(B)
{
if(s.length() > 65535)
{
F.B((byte)12);
F.A(s.length());
F.A(s);
} else
{
F.B((byte)2);
F.D(s.getBytes());
}
return;
}
F.B((byte)17);
}
F.B((byte)6);
E(s);
H = Integer.valueOf(A.size());
}
private void B(String s)
{
H = Integer.valueOf(0);
if(!E)
{
F.D(s.getBytes());
return;
} else
{
E(s);
return;
}
}
private void E(String s)
{
if(!Strings.isNullOrEmpty(s))
{
Integer integer = (Integer)C.get(s);
if(integer != null)
{
F.D(integer.intValue() << 1);
return;
}
C.put(s, Integer.valueOf(C.size()));
}
F.D(s.length() << 1 | 1);
F.A(s);
}
public void A()
{
H = Integer.valueOf(0);
F.B(((byte)(E ? 1 : 5)));
}
public void A(boolean flag)
{
H = Integer.valueOf(0);
if(!E)
{
F.B((byte)1);
F.B((byte)(flag ? 1 : 0));
} else
{
F.B(((byte)(flag ? 3 : 2)));
}
}
public void A(B b)
{
H = Integer.valueOf(0);
if(!E)
{
if(B)
{
F.B((byte)11);
F.A((double)b.getTime() / 1000D);
F.A((short)0);
return;
}
F.B((byte)17);
}
F.B((byte)8);
F.B((byte)1);
F.A((double)b.getTime() / 1000D);
A.add(Integer.valueOf(8));
H = Integer.valueOf(A.size());
}
public void A(double d)
{
H = Integer.valueOf(0);
F.B(((byte)(E ? 5 : 0)));
F.A(d);
}
public void A(int i)
{
H = Integer.valueOf(0);
if(!E)
{
if(B)
{
A(i);
return;
}
F.B((byte)17);
}
F.B((byte)4);
if(i > 0xfffffff)
{
D.error("AMF Integer maximum value reached");
i = 0xfffffff;
} else
if(i < 0)
i += 0x20000000;
F.D(i);
}
private BinaryWriter B(int i)
{
H = Integer.valueOf(0);
if(!E)
F.B((byte)17);
F.B((byte)12);
F.D(i << 1 | 1);
A.add(Integer.valueOf(12));
H = Integer.valueOf(A.size());
return F;
}
public void A(byte abyte0[], int i)
{
BinaryWriter a = B(i);
a.A(abyte0, i);
}
void A(String s, Integer integer)
{
B(s);
if(integer != null)
A(integer.intValue());
else
A();
}
void A(String s, Double double1)
{
B(s);
if(double1 != null)
A(double1.doubleValue());
else
A();
}
void A(String s, String s1)
{
B(s);
if(s1 != null)
A(s1);
else
A();
}
void A(String s, B b)
{
B(s);
if(b != null)
A(b);
else
A();
}
void A(String s, Boolean boolean1)
{
B(s);
if(boolean1 != null)
A(boolean1.booleanValue());
else
A();
}
void A(String s, byte abyte0[])
{
B(s);
if(abyte0 != null)
A(abyte0, abyte0.length);
else
A();
}
void A(String s, E e)
{
B(s);
if(e != null)
A(e);
else
A();
}
void C(String s)
{
B(s);
A();
}
void C()
{
A("", false);
}
void D(String s)
{
A(s, false);
}
void A(String s, boolean flag)
{
H = Integer.valueOf(0);
if(!E)
{
if(B && !flag)
{
G.push(Integer.valueOf(0));
if(Strings.isNullOrEmpty(s))
{
F.B((byte)3);
} else
{
F.B((byte)16);
A(s);
}
return;
}
F.B((byte)17);
E = true;
}
F.B((byte)10);
A.add(Integer.valueOf(10));
H = Integer.valueOf(A.size());
G.push(H);
int i = 1;
i |= 2;
if(flag)
i |= 4;
else
i |= 8;
F.D(i);
B(s);
}
void B()
{
if(G.size() == 0)
{
D.error("AMFWriter.endObject called without beginObject calling");
return;
}
H = (Integer)G.pollLast();
if(!E)
{
F.A((short)0);
F.B((byte)9);
return;
}
F.B((byte)1);
if(G.size() == 0 || ((Integer)G.getLast()).intValue() == 0)
E = false;
}
public void A(Object obj)
{
if(obj == null)
A();
else
if(obj instanceof E)
A((E)obj);
else
if(obj instanceof Integer)
A(((Integer)obj).intValue());
else
if(obj instanceof String)
A((String)obj);
else
if(obj instanceof Number)
A(((Number)obj).doubleValue());
else
if(obj instanceof B)
A((B)obj);
else
A(obj.toString());
}
public void A(E e)
{
C();
Map map = e.A();
for(Iterator iterator = map.keySet().iterator(); iterator.hasNext();)
{
String s = (String)iterator.next();
H h = (H)map.get(s);
if(com.jcumulus.server.rtmfp.flow.H.Boolean == h)
A(s, e.A(s));
else
if(com.jcumulus.server.rtmfp.flow.H.String == h)
A(s, e.H(s));
else
if(com.jcumulus.server.rtmfp.flow.H.Number == h)
A(s, e.D(s));
else
if(com.jcumulus.server.rtmfp.flow.H.Integer == h)
A(s, e.B(s));
else
if(com.jcumulus.server.rtmfp.flow.H.Date == h)
A(s, e.C(s));
else
if(com.jcumulus.server.rtmfp.flow.H.Null == h)
C(s);
else
if(com.jcumulus.server.rtmfp.flow.H.Object == h)
A(s, e.E(s));
else
D.error((new StringBuilder()).append("Unknown AMFObject '").append(h).append("' type").toString());
}
B();
}
public boolean D()
{
return B;
}
public void B(boolean flag)
{
B = flag;
}
public BinaryWriter E()
{
return F;
}
private static final Logger D = Logger.getLogger(F.class);
BinaryWriter F;
Integer H;
boolean B;
Map C;
List A;
LinkedList G;
boolean E;
}