package com.brandon3055.townbuilder.schematics;
import com.brandon3055.townbuilder.TownBuilder;
import com.brandon3055.townbuilder.network.PacketByteStream;
import com.brandon3055.townbuilder.utills.LogHelper;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.text.TextComponentString;
import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Brandon on 2/03/2015.
*/
public class FileHandler {
public static FileHandler instance = new FileHandler();
public boolean transferInProgress = false;
private byte[] bytes;
private List<PacketByteStream> receivedPackets;
public String fileName;
private int transferTimeOut = 0;
private EntityPlayer player;
@SubscribeEvent
public void serverTick(TickEvent.ServerTickEvent event)
{
if (transferInProgress && event.phase == TickEvent.Phase.END && transferTimeOut++ >= 200)
{
transferInProgress = false;
transferTimeOut = 0;
receivedPackets = null;
if (player != null) player.addChatComponentMessage(new TextComponentString(TextFormatting.RED + "[SERVER] Upload Failed (missing packet(s))"));
LogHelper.error("File upload failed (did not receive all packets)");
}
}
public void sendFileToServer(String filename)
{
if (TownBuilder.proxy.isDedicatedServer())
{
LogHelper.error("Attempt to send file from wrong side!!!");
return;
}
this.fileName = filename;
FileInputStream fis = null;
BufferedInputStream bis = null;
File file = SchematicHandler.getFile(filename);
bytes = new byte[(int)file.length()];
try
{
fis = new FileInputStream(file);
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
bis = new BufferedInputStream(fis);
int length = 0;
try
{
length = bis.read(bytes);
}
catch (IOException e)
{
e.printStackTrace();
}
List<byte[]> splitBytes = new ArrayList<byte[]>();
for (int i = 0; i < bytes.length; i ++)
{
int packet = i / 32000;
if (splitBytes.size() <= packet) {
int size = bytes.length - i;
splitBytes.add(new byte[size >= 32000 ? 32000 : size]);
}
splitBytes.get(packet)[i - packet * 32000] = bytes[i];
}
LogHelper.info("sending " + bytes.length + " bytes");
for (int i = 0; i < splitBytes.size(); i++) {
TownBuilder.network.sendToServer(new PacketByteStream(splitBytes.get(i), splitBytes.size(), i));
}
TownBuilder.proxy.getClientPlayer().addChatComponentMessage(new TextComponentString(TextFormatting.GREEN + "[CLIENT] File Sent"));
}
public void receiveFile(PacketByteStream message, MessageContext ctx) {
if (player == null) player = ctx.getServerHandler().playerEntity;
if (transferInProgress && ctx.getServerHandler().playerEntity != player || !TownBuilder.proxy.isOp(player.getName()))
{
ctx.getServerHandler().playerEntity.addChatComponentMessage(new TextComponentString(TextFormatting.RED + "[SERVER] Error Transfer already in progress... "));
LogHelper.error("#####################################################");
LogHelper.error("Client attempted to send unauthorised file to server");
LogHelper.error("This is ether a result of a bug or client hacking");
LogHelper.error("Please report to brandon3055");
LogHelper.error("Sender: " + ctx.getServerHandler().playerEntity.getName());
LogHelper.error("#####################################################");
return;
}
//receive
transferInProgress = true;
transferTimeOut = 0;
if (receivedPackets == null) {
player = ctx.getServerHandler().playerEntity;
LogHelper.info("Receiving File from " + ctx.getServerHandler().playerEntity.getName() + " [" + message.packetCount + " packets]");
ctx.getServerHandler().playerEntity.addChatComponentMessage(new TextComponentString(TextFormatting.DARK_GREEN + "[SERVER] Receiving File"));
receivedPackets = new ArrayList<PacketByteStream>(message.packetCount);
}
receivedPackets.add(message.packetindex, message);
if (receivedPackets.size() < message.packetCount) return;
//process
int totalBytes = 0;
for (PacketByteStream p : receivedPackets) totalBytes += p.bytes.length;
byte[] receivedBytes = new byte[totalBytes];
for (int i = 0; i < receivedPackets.size(); i++)
{
byte[] b = receivedPackets.get(i).bytes;
for (int j = 0; j < b.length; j++)
{
receivedBytes[j + (i * 32000)] = b[j];
}
}
LogHelper.info("received " + receivedBytes.length + " bytes");
FileOutputStream fos = null;
BufferedOutputStream bos = null;
try
{
fos = new FileOutputStream(new File(SchematicHandler.getSaveFolder(), fileName + ".schematic"));
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
bos = new BufferedOutputStream(fos);
try
{
bos.write(receivedBytes, 0, receivedBytes.length);
}
catch (IOException e)
{
e.printStackTrace();
}
try
{
bos.flush();
fos.close();
bos.close();
}
catch (IOException e)
{
e.printStackTrace();
}
transferInProgress = false;
receivedPackets = null;
ctx.getServerHandler().playerEntity.addChatComponentMessage(new TextComponentString(TextFormatting.GREEN + "[SERVER] File Received"));
}
}