package com.grendelscan.commons.flex.arrays;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.grendelscan.commons.flex.AbstractAmfData;
import com.grendelscan.commons.flex.AbstractAmfDataContainer;
import com.grendelscan.commons.flex.AmfOutputStream;
import com.grendelscan.commons.flex.dataTypeDefinitions.AmfDataType;
import com.grendelscan.commons.flex.output.AmfOutputStreamRegistry;
import com.grendelscan.commons.http.dataHandling.references.DataReference;
import com.grendelscan.commons.flex.AmfUtils;
public class AmfByteArray extends AbstractAmfData
{
private static final Logger LOGGER = LoggerFactory.getLogger(AmfByteArray.class);
/**
*
*/
private static final long serialVersionUID = 1L;
private ArrayList<Byte> data;
public AmfByteArray(String name, AbstractAmfDataContainer<?> parent, int transactionId)
{
super(name, AmfDataType.kByteArray, parent, false, transactionId);
data = new ArrayList<Byte>(1);
}
public AmfByteArray(String name, byte[] bytes, AbstractAmfDataContainer<?> parent, int transactionId)
{
this(name, parent, transactionId);
data = new ArrayList<Byte>(bytes.length);
for (byte b: bytes)
{
data.add(b);
}
}
@Override
public ArrayList<AbstractAmfData> getChildren()
{
return null;
}
@Override
public void writeBytes(OutputStream out)
{
AmfOutputStream outputStream = AmfOutputStreamRegistry.getStream(out);
try
{
writeCodeToStream(outputStream);
if (useAmf3Code)
{
// Write out an invalid reference, storing the length in the unused
// 28-bits.
AmfUtils.writeUInt29(outputStream, (data.size() << 1) | 1);
}
else
{
outputStream.writeInt(data.size());
}
for (Byte b: data)
{
if (b == null)
{
outputStream.write(0);
}
else
{
outputStream.write(b);
}
}
}
catch (IOException e)
{
LOGGER.error("Problem writing AMF: " + e.toString(), e);
}
}
}