view src/main/java/jp/ac/u_ryukyu/treevnc/TreeVNCNetwork.java @ 208:f1d7cb4a1868

compute netmask and netaddress
author oc
date Wed, 02 Jul 2014 18:52:29 +0900
parents b31903e5b02d
children 2132018b8c68
line wrap: on
line source

package jp.ac.u_ryukyu.treevnc;

import java.net.InetAddress;
import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import java.net.Socket;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.HashMap;

import com.glavsoft.viewer.swing.ConnectionParams;

public class TreeVNCNetwork {

    
    private HashMap<String, TreeManagement> interfaces = new HashMap<String, TreeManagement>();
    private TreeRFBProto myRfb;
    public TreeRFBProto getMyRfb() {
        return myRfb;
    }

    public void setMyRfb(TreeRFBProto myRfb) {
        this.myRfb = myRfb;
    }

    public void getNetworkInterfaces() throws SocketException {
    	for (Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces(); e.hasMoreElements();) {
    		NetworkInterface ni = e.nextElement();
    		if (ni.isUp() && ni.supportsMulticast() && !ni.isLoopback()) {
    			for (InterfaceAddress ipaddress : ni.getInterfaceAddresses()) {
    				byte [] netmask = getNetMask(ipaddress);
    				String hostName = ipaddress.getAddress().getHostName();
    				TreeManagement treeManager = new TreeManagement(hostName, ConnectionParams.DEFAULT_VNC_ROOT, myRfb.getViewer().getShowTree());
    				treeManager.getList().getFirst().setPort(myRfb.getAcceptPort());
    				byte[] netaddr = ipaddress.getAddress().getAddress();
    				for(int i=0;i<netaddr.length;i++) {
    					netaddr[i] &= netmask[i];
    				}
    				treeManager.setNetMask(netmask,netaddr);
    				addNetworkInterface(ni, treeManager);               
    				System.out.println("Interfaces :" + ni.getName());
    			}
    		}
        }
    }
    
    private byte[] getNetMask(InterfaceAddress ipaddress) {
    		short prefix = ipaddress.getNetworkPrefixLength();
    		byte[] netmask = ipaddress.getAddress().getAddress();
    		for(int i = 0; i < netmask.length; i++) {
    			int bitpos = i * 8;
    			if (bitpos > prefix) {
    				netmask[i] = 0;
    			} else if (bitpos+8 > prefix) {
    				//    ex. bitpos = 0, prefix = 2 
    				//    bitpos+8-prefix
    				//    1100 0000
    				int bytemask = 0x80;
    				for(int j = 1; j < bitpos+8-prefix; j++) {
    					bytemask >>= 1;
    					bytemask |= 0x80;
    				}
    				netmask[i] = (byte)bytemask;
    			}
    		}
		return netmask ;
	}

	NetworkInterface getInterface(Socket vncSocket) {
        InetAddress address = vncSocket.getInetAddress();
        try {
            return NetworkInterface.getByInetAddress(address);
        } catch (SocketException e) {
            return null;
        }
    }

    private void addNetworkInterface(NetworkInterface ni, TreeManagement treeManager) {
        setTreeManager(ni.getName(), treeManager);
    }

	public void setTreeManager(String intf, TreeManagement treeManager) {
        interfaces.put(intf, treeManager);
	}

	public TreeManagement getTreeManager(String intf) {
		return interfaces.get(intf);
	}

	
	
}