package transfer;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Murashko Arthur
 */
public class ImageFileTransfer {
    private static int bufferSize = 1024;

    public static void send(Socket socket, File imageFile) {
        FileInputStream inputFile = null;
        ObjectOutputStream out = null;
        ImagePackage imagePackage = null;
        byte [] bytes = new byte[bufferSize];
        int length = 0;

        try {
            try {
                inputFile = new FileInputStream(imageFile);
                out = new ObjectOutputStream(socket.getOutputStream());

                while (true) {
                    length = inputFile.read(bytes, 0, bufferSize);
                    if (length == -1) {
                        imagePackage = new ImagePackage(bytes, 0, true);
                        out.writeObject(imagePackage);
                        break;
                    }
                    imagePackage = new ImagePackage(bytes, length, false);
                    out.writeObject(imagePackage);
                    out.flush();
                }
            } finally {
                inputFile.close();
                System.out.println("Файл передан.");
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ImageFileTransfer.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ImageFileTransfer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static File read(Socket socket) {
        File imageFile = null;
        FileOutputStream outImgFile = null;
        ObjectInputStream input = null;
        ImagePackage imagePackage = null;
        try {
            try {
                outImgFile = new FileOutputStream(new File("testingImg2.jpg"));
                input = new ObjectInputStream(socket.getInputStream());
                imagePackage = (ImagePackage) input.readObject();

                while (!imagePackage.isFinish()) {
                    outImgFile.write(imagePackage.getBytes(), 0, imagePackage.getLength());
                    imagePackage = (ImagePackage) input.readObject();
                }
            } finally {
                outImgFile.close();
            }
        } catch (IOException ex) {
            Logger.getLogger(ImageFileTransfer.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ImageFileTransfer.class.getName()).log(Level.SEVERE, null, ex);
        }
        return imageFile;
    }

    private static class ImagePackage implements Serializable {
        private boolean finish;
        private int length;
        private byte[] bytes;

        public ImagePackage(byte[] b, int length, boolean f) {
            this.length = length;
            bytes = b.clone();
            finish = f;
        }

        public boolean isFinish() {
            return finish;
        }

        public byte[] getBytes() {
            return bytes;
        }

        public int getLength() {
            return this.length;
        }
    }
}
