blob: b464888a6c0b743271edfb0a41dbb45950e288e1 [file] [log] [blame]
/**
* Copyright 2003-2005 Arthur van Hoff, Rick Blair
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.activemq.jmdns;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* HostInfo information on the local host to be able to cope with change of addresses.
*
* @version %I%, %G%
* @author Pierre Frisch, Werner Randelshofer
*/
class HostInfo
{
private static Logger logger = Logger.getLogger(HostInfo.class.toString());
protected String name;
protected InetAddress address;
protected NetworkInterface interfaze;
/**
* This is used to create a unique name for the host name.
*/
private int hostNameCount;
public HostInfo(InetAddress address, String name)
{
super();
this.address = address;
this.name = name;
if (address != null)
{
try
{
interfaze = NetworkInterface.getByInetAddress(address);
}
catch (Exception exception)
{
// FIXME Shouldn't we take an action here?
logger.log(Level.WARNING, "LocalHostInfo() exception ", exception);
}
}
}
public String getName()
{
return name;
}
public InetAddress getAddress()
{
return address;
}
public NetworkInterface getInterface()
{
return interfaze;
}
synchronized String incrementHostName()
{
hostNameCount++;
int plocal = name.indexOf(".local.");
int punder = name.lastIndexOf("-");
name = name.substring(0, (punder == -1 ? plocal : punder)) + "-" + hostNameCount + ".local.";
return name;
}
boolean shouldIgnorePacket(DatagramPacket packet)
{
boolean result = false;
if (getAddress() != null)
{
InetAddress from = packet.getAddress();
if (from != null)
{
if (from.isLinkLocalAddress() && (!getAddress().isLinkLocalAddress()))
{
// Ignore linklocal packets on regular interfaces, unless this is
// also a linklocal interface. This is to avoid duplicates. This is
// a terrible hack caused by the lack of an API to get the address
// of the interface on which the packet was received.
result = true;
}
if (from.isLoopbackAddress() && (!getAddress().isLoopbackAddress()))
{
// Ignore loopback packets on a regular interface unless this is
// also a loopback interface.
result = true;
}
}
}
return result;
}
DNSRecord.Address getDNSAddressRecord(DNSRecord.Address address)
{
return (DNSConstants.TYPE_AAAA == address.type ? getDNS6AddressRecord() : getDNS4AddressRecord());
}
DNSRecord.Address getDNS4AddressRecord()
{
if ((getAddress() != null) &&
((getAddress() instanceof Inet4Address) ||
((getAddress() instanceof Inet6Address) && (((Inet6Address) getAddress()).isIPv4CompatibleAddress()))))
{
return new DNSRecord.Address(getName(), DNSConstants.TYPE_A, DNSConstants.CLASS_IN, DNSConstants.DNS_TTL, getAddress());
}
return null;
}
DNSRecord.Address getDNS6AddressRecord()
{
if ((getAddress() != null) && (getAddress() instanceof Inet6Address))
{
return new DNSRecord.Address(getName(), DNSConstants.TYPE_AAAA, DNSConstants.CLASS_IN, DNSConstants.DNS_TTL, getAddress());
}
return null;
}
public String toString()
{
StringBuffer buf = new StringBuffer();
buf.append("local host info[");
buf.append(getName() != null ? getName() : "no name");
buf.append(", ");
buf.append(getInterface() != null ? getInterface().getDisplayName() : "???");
buf.append(":");
buf.append(getAddress() != null ? getAddress().getHostAddress() : "no address");
buf.append("]");
return buf.toString();
}
}