// Path: localnet/src/main/java/dev/jokr/localnet/discovery/models/DiscoveryReply.java
// public class DiscoveryReply implements Serializable {
// 
//     private String ip;
//     private int port;
// 
//     public DiscoveryReply(String ip, int port) {
//         this.ip = ip;
//         this.port = port;
//     }
// 
//     public String getIp() {
//         return ip;
//     }
// 
//     public int getPort() {
//         return port;
//     }
// }
// 
// Path: localnet/src/main/java/dev/jokr/localnet/utils/NetworkUtil.java
// public class NetworkUtil {
// 
// 
//     // My favourite number. We need hardcoded port because we cannot broadcast over all ports
//     public static final int BASE_PORT = 52100;
// 
//     /**
//      * Checks to see if a specific port is available.
//      *
//      * @param port the port to check for availability
//      */
//     public static boolean available(int port) {
//         ServerSocket ss = null;
//         DatagramSocket ds = null;
//         try {
//             ss = new ServerSocket(port);
//             ss.setReuseAddress(true);
//             ds = new DatagramSocket(port);
//             ds.setReuseAddress(true);
//             return true;
//         } catch (IOException e) {
//         } finally {
//             if (ds != null) {
//                 ds.close();
//             }
// 
//             if (ss != null) {
//                 try {
//                     ss.close();
//                 } catch (IOException e) {
//                 /* should not be thrown */
//                 }
//             }
//         }
// 
//         return false;
//     }
// 
// 
//     public static long getIdFromIpAddress(String ipAddr) {
//         int[] ip = new int[4];
//         String[] parts = ipAddr.split("\\.");
// 
//         for (int i = 0; i < 4; i++) {
//             ip[i] = Integer.parseInt(parts[i]);
//         }
// 
//         long ipNumbers = 0;
//         for (int i = 0; i < 4; i++) {
//             ipNumbers += ip[i] << (24 - (8 * i));
//         }
// 
//         return ipNumbers;
//     }
// }
// 
// Path: localnet/src/main/java/dev/jokr/localnet/utils/SerializationUtil.java
// public class SerializationUtil {
// 
//     public static byte[] serialize(Object o) {
//         ByteArrayOutputStream bos = new ByteArrayOutputStream();
//         ObjectOutput out = null;
//         byte[] bytes = null;
//         try {
//             out = new ObjectOutputStream(bos);
//             out.writeObject(o);
//             bytes = bos.toByteArray();
//         } catch (IOException e) {
//             e.printStackTrace();
//         } finally {
//             try {
//                 if (out != null) {
//                     out.close();
//                 }
//             } catch (IOException ex) {
//                 // ignore close exception
//             }
//             try {
//                 bos.close();
//             } catch (IOException ex) {
//                 // ignore close exception
//             }
//         }
//         return bytes;
//     }
// 
//     public static Object deserialize(byte[] bytes) {
//         ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
//         ObjectInput in = null;
//         Object o = null;
//         try {
//             in = new ObjectInputStream(bis);
//             o = in.readObject();
//         } catch (ClassNotFoundException e) {
//             e.printStackTrace();
//         } catch (IOException e) {
//             e.printStackTrace();
//         } finally {
//             try {
//                 bis.close();
//             } catch (IOException ex) {
//                 // ignore close exception
//             }
//             try {
//                 if (in != null) {
//                     in.close();
//                 }
//             } catch (IOException ex) {
//                 // ignore close exception
//             }
//         }
//         return o;
//     }
// 
// }


import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import dev.jokr.localnet.discovery.models.DiscoveryReply;
import dev.jokr.localnet.utils.NetworkUtil;
import dev.jokr.localnet.utils.SerializationUtil;
package dev.jokr.localnet;




/**
 * Created by JoKr on 8/28/2016.
 */
class DiscoverySocketThread implements Runnable {

    private DiscoveryReply reply;
    private DatagramSocket socket;

    public DiscoverySocketThread(DiscoveryReply reply) {
        this.reply = reply;
    }

    @Override
    public void run() {
        try {
            int port = NetworkUtil.BASE_PORT;
            boolean portAvailable = false;
            do {
                if (NetworkUtil.available(port))
                    portAvailable = true;
                else
                    port--;
            } while (!portAvailable);

            socket = new DatagramSocket(port, InetAddress.getByName("0.0.0.0"));
            socket.setBroadcast(true);

// Path: localnet/src/main/java/dev/jokr/localnet/discovery/models/DiscoveryReply.java
// public class DiscoveryReply implements Serializable {
// 
//     private String ip;
//     private int port;
// 
//     public DiscoveryReply(String ip, int port) {
//         this.ip = ip;
//         this.port = port;
//     }
// 
//     public String getIp() {
//         return ip;
//     }
// 
//     public int getPort() {
//         return port;
//     }
// }
// 
// Path: localnet/src/main/java/dev/jokr/localnet/utils/NetworkUtil.java
// public class NetworkUtil {
// 
// 
//     // My favourite number. We need hardcoded port because we cannot broadcast over all ports
//     public static final int BASE_PORT = 52100;
// 
//     /**
//      * Checks to see if a specific port is available.
//      *
//      * @param port the port to check for availability
//      */
//     public static boolean available(int port) {
//         ServerSocket ss = null;
//         DatagramSocket ds = null;
//         try {
//             ss = new ServerSocket(port);
//             ss.setReuseAddress(true);
//             ds = new DatagramSocket(port);
//             ds.setReuseAddress(true);
//             return true;
//         } catch (IOException e) {
//         } finally {
//             if (ds != null) {
//                 ds.close();
//             }
// 
//             if (ss != null) {
//                 try {
//                     ss.close();
//                 } catch (IOException e) {
//                 /* should not be thrown */
//                 }
//             }
//         }
// 
//         return false;
//     }
// 
// 
//     public static long getIdFromIpAddress(String ipAddr) {
//         int[] ip = new int[4];
//         String[] parts = ipAddr.split("\\.");
// 
//         for (int i = 0; i < 4; i++) {
//             ip[i] = Integer.parseInt(parts[i]);
//         }
// 
//         long ipNumbers = 0;
//         for (int i = 0; i < 4; i++) {
//             ipNumbers += ip[i] << (24 - (8 * i));
//         }
// 
//         return ipNumbers;
//     }
// }
// 
// Path: localnet/src/main/java/dev/jokr/localnet/utils/SerializationUtil.java
// public class SerializationUtil {
// 
//     public static byte[] serialize(Object o) {
//         ByteArrayOutputStream bos = new ByteArrayOutputStream();
//         ObjectOutput out = null;
//         byte[] bytes = null;
//         try {
//             out = new ObjectOutputStream(bos);
//             out.writeObject(o);
//             bytes = bos.toByteArray();
//         } catch (IOException e) {
//             e.printStackTrace();
//         } finally {
//             try {
//                 if (out != null) {
//                     out.close();
//                 }
//             } catch (IOException ex) {
//                 // ignore close exception
//             }
//             try {
//                 bos.close();
//             } catch (IOException ex) {
//                 // ignore close exception
//             }
//         }
//         return bytes;
//     }
// 
//     public static Object deserialize(byte[] bytes) {
//         ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
//         ObjectInput in = null;
//         Object o = null;
//         try {
//             in = new ObjectInputStream(bis);
//             o = in.readObject();
//         } catch (ClassNotFoundException e) {
//             e.printStackTrace();
//         } catch (IOException e) {
//             e.printStackTrace();
//         } finally {
//             try {
//                 bis.close();
//             } catch (IOException ex) {
//                 // ignore close exception
//             }
//             try {
//                 if (in != null) {
//                     in.close();
//                 }
//             } catch (IOException ex) {
//                 // ignore close exception
//             }
//         }
//         return o;
//     }
// 
// }


// Path: localnet/src/main/java/dev/jokr/localnet/DiscoverySocketThread.java
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import dev.jokr.localnet.discovery.models.DiscoveryReply;
import dev.jokr.localnet.utils.NetworkUtil;
import dev.jokr.localnet.utils.SerializationUtil;

package dev.jokr.localnet;




/**
 * Created by JoKr on 8/28/2016.
 */
class DiscoverySocketThread implements Runnable {

    private DiscoveryReply reply;
    private DatagramSocket socket;

    public DiscoverySocketThread(DiscoveryReply reply) {
        this.reply = reply;
    }

    @Override
    public void run() {
        try {
            int port = NetworkUtil.BASE_PORT;
            boolean portAvailable = false;
            do {
                if (NetworkUtil.available(port))
                    portAvailable = true;
                else
                    port--;
            } while (!portAvailable);

            socket = new DatagramSocket(port, InetAddress.getByName("0.0.0.0"));
            socket.setBroadcast(true);

            while (true) {