diff options
author | Mike Lockwood <lockwood@google.com> | 2012-03-21 12:26:23 -0700 |
---|---|---|
committer | Mike Lockwood <lockwood@google.com> | 2012-03-21 12:26:23 -0700 |
commit | f4eb7466d5c09098f9dc54137ed3235e3c43fc9f (patch) | |
tree | 56e1bf5e433e60e3a18d5a9d08b7d55a64d8ae1d /src/javax/jmdns/JmDNS.java | |
parent | 19376825c9e562c188aef9ccd09a7220bd3c0a20 (diff) | |
parent | 76f0067cea0428b683cba2f187d81e723658f964 (diff) | |
download | jmdns-9d3ac61c9b94b7c9cb02a53a3c2ad6184882b63d.tar.gz |
Merge remote-tracking branch 'goog/ics-aah-exp'android-wear-n-preview-3android-wear-n-preview-2android-wear-n-preview-1android-wear-7.1.1_r1android-wear-5.1.1_r1android-wear-5.1.0_r1android-wear-5.0.0_r1android-sdk-support_r11android-sdk-4.4.2_r1.0.1android-sdk-4.4.2_r1android-n-preview-5android-n-preview-4android-n-preview-3android-n-preview-2android-n-preview-1android-n-iot-preview-2android-m-preview-2android-m-preview-1android-m-previewandroid-l-preview_r2android-cts-6.0_r9android-cts-6.0_r8android-cts-6.0_r7android-cts-6.0_r6android-cts-6.0_r5android-cts-6.0_r4android-cts-6.0_r32android-cts-6.0_r31android-cts-6.0_r30android-cts-6.0_r3android-cts-6.0_r29android-cts-6.0_r28android-cts-6.0_r27android-cts-6.0_r26android-cts-6.0_r25android-cts-6.0_r24android-cts-6.0_r23android-cts-6.0_r22android-cts-6.0_r21android-cts-6.0_r20android-cts-6.0_r2android-cts-6.0_r19android-cts-6.0_r18android-cts-6.0_r17android-cts-6.0_r16android-cts-6.0_r15android-cts-6.0_r14android-cts-6.0_r13android-cts-6.0_r12android-cts-6.0_r1android-cts-5.1_r9android-cts-5.1_r8android-cts-5.1_r7android-cts-5.1_r6android-cts-5.1_r5android-cts-5.1_r4android-cts-5.1_r3android-cts-5.1_r28android-cts-5.1_r27android-cts-5.1_r26android-cts-5.1_r25android-cts-5.1_r24android-cts-5.1_r23android-cts-5.1_r22android-cts-5.1_r21android-cts-5.1_r20android-cts-5.1_r2android-cts-5.1_r19android-cts-5.1_r18android-cts-5.1_r17android-cts-5.1_r16android-cts-5.1_r15android-cts-5.1_r14android-cts-5.1_r13android-cts-5.1_r10android-cts-5.1_r1android-cts-5.0_r9android-cts-5.0_r8android-cts-5.0_r7android-cts-5.0_r6android-cts-5.0_r5android-cts-5.0_r4android-cts-5.0_r3android-cts-4.4_r4android-cts-4.4_r1android-cts-4.2_r2android-cts-4.2_r1android-cts-4.1_r4android-cts-4.1_r2android-cts-4.1_r1android-6.0.1_r9android-6.0.1_r81android-6.0.1_r80android-6.0.1_r8android-6.0.1_r79android-6.0.1_r78android-6.0.1_r77android-6.0.1_r74android-6.0.1_r73android-6.0.1_r72android-6.0.1_r70android-6.0.1_r7android-6.0.1_r69android-6.0.1_r68android-6.0.1_r67android-6.0.1_r66android-6.0.1_r65android-6.0.1_r63android-6.0.1_r62android-6.0.1_r61android-6.0.1_r60android-6.0.1_r59android-6.0.1_r58android-6.0.1_r57android-6.0.1_r56android-6.0.1_r55android-6.0.1_r54android-6.0.1_r53android-6.0.1_r52android-6.0.1_r51android-6.0.1_r50android-6.0.1_r5android-6.0.1_r49android-6.0.1_r48android-6.0.1_r47android-6.0.1_r46android-6.0.1_r45android-6.0.1_r43android-6.0.1_r42android-6.0.1_r41android-6.0.1_r40android-6.0.1_r4android-6.0.1_r33android-6.0.1_r32android-6.0.1_r31android-6.0.1_r30android-6.0.1_r3android-6.0.1_r28android-6.0.1_r27android-6.0.1_r26android-6.0.1_r25android-6.0.1_r24android-6.0.1_r22android-6.0.1_r21android-6.0.1_r20android-6.0.1_r18android-6.0.1_r17android-6.0.1_r16android-6.0.1_r13android-6.0.1_r12android-6.0.1_r11android-6.0.1_r10android-6.0.1_r1android-6.0.0_r7android-6.0.0_r6android-6.0.0_r5android-6.0.0_r41android-6.0.0_r4android-6.0.0_r3android-6.0.0_r26android-6.0.0_r25android-6.0.0_r24android-6.0.0_r23android-6.0.0_r2android-6.0.0_r13android-6.0.0_r12android-6.0.0_r11android-6.0.0_r1android-5.1.1_r9android-5.1.1_r8android-5.1.1_r7android-5.1.1_r6android-5.1.1_r5android-5.1.1_r4android-5.1.1_r38android-5.1.1_r37android-5.1.1_r36android-5.1.1_r35android-5.1.1_r34android-5.1.1_r33android-5.1.1_r30android-5.1.1_r3android-5.1.1_r29android-5.1.1_r28android-5.1.1_r26android-5.1.1_r25android-5.1.1_r24android-5.1.1_r23android-5.1.1_r22android-5.1.1_r20android-5.1.1_r2android-5.1.1_r19android-5.1.1_r18android-5.1.1_r17android-5.1.1_r16android-5.1.1_r15android-5.1.1_r14android-5.1.1_r13android-5.1.1_r12android-5.1.1_r10android-5.1.1_r1android-5.1.0_r5android-5.1.0_r4android-5.1.0_r3android-5.1.0_r1android-5.0.2_r3android-5.0.2_r1android-5.0.1_r1android-5.0.0_r7android-5.0.0_r6android-5.0.0_r5.1android-5.0.0_r5android-5.0.0_r4android-5.0.0_r3android-5.0.0_r2android-5.0.0_r1android-4.4w_r1android-4.4_r1.2.0.1android-4.4_r1.2android-4.4_r1.1.0.1android-4.4_r1.1android-4.4_r1.0.1android-4.4_r1android-4.4_r0.9android-4.4_r0.8android-4.4_r0.7android-4.4.4_r2.0.1android-4.4.4_r2android-4.4.4_r1.0.1android-4.4.4_r1android-4.4.3_r1.1.0.1android-4.4.3_r1.1android-4.4.3_r1.0.1android-4.4.3_r1android-4.4.2_r2.0.1android-4.4.2_r2android-4.4.2_r1.0.1android-4.4.2_r1android-4.4.1_r1.0.1android-4.4.1_r1android-4.3_r3.1android-4.3_r3android-4.3_r2.3android-4.3_r2.2android-4.3_r2.1android-4.3_r2android-4.3_r1.1android-4.3_r1android-4.3_r0.9.1android-4.3_r0.9android-4.3.1_r1android-4.2_r1android-4.2.2_r1.2android-4.2.2_r1.1android-4.2.2_r1android-4.2.1_r1.2android-4.2.1_r1.1android-4.2.1_r1android-4.1.2_r2.1android-4.1.2_r2android-4.1.2_r1android-4.1.1_r6.1android-4.1.1_r6android-4.1.1_r5android-4.1.1_r4android-4.1.1_r3android-4.1.1_r2android-4.1.1_r1.1android-4.1.1_r1tools_r22.2tools_r22tools_r21nougat-mr1-wear-releasen-iot-preview-2master-soongmarshmallow-releasemarshmallow-mr3-releasemarshmallow-mr2-releasemarshmallow-mr1-releasemarshmallow-mr1-devmarshmallow-dr1.6-releasemarshmallow-dr1.5-releasemarshmallow-dr1.5-devmarshmallow-dr-releasemarshmallow-dr-dragon-releasemarshmallow-dr-devmarshmallow-devmarshmallow-cts-releaselollipop-wear-releaselollipop-releaselollipop-mr1-wfc-releaselollipop-mr1-releaselollipop-mr1-fi-releaselollipop-mr1-devlollipop-mr1-cts-releaselollipop-devlollipop-cts-releasel-previewkitkat-wearkitkat-releasekitkat-mr2.2-releasekitkat-mr2.1-releasekitkat-mr2-releasekitkat-mr1.1-releasekitkat-mr1-releasekitkat-devkitkat-cts-releasekitkat-cts-devjb-releasejb-mr2.0.0-releasejb-mr2.0-releasejb-mr2-releasejb-mr2-devjb-mr1.1-releasejb-mr1.1-dev-plus-aospjb-mr1.1-devjb-mr1-releasejb-mr1-dev-plus-aospjb-mr1-devjb-mr0-releasejb-devidea133-weekly-releaseidea133
Diffstat (limited to 'src/javax/jmdns/JmDNS.java')
-rw-r--r-- | src/javax/jmdns/JmDNS.java | 433 |
1 files changed, 433 insertions, 0 deletions
diff --git a/src/javax/jmdns/JmDNS.java b/src/javax/jmdns/JmDNS.java new file mode 100644 index 0000000..1c3285c --- /dev/null +++ b/src/javax/jmdns/JmDNS.java @@ -0,0 +1,433 @@ +// /Copyright 2003-2005 Arthur van Hoff, Rick Blair +// Licensed under Apache License version 2.0 +// Original license LGPL + +package javax.jmdns; + +import java.io.Closeable; +import java.io.IOException; +import java.net.InetAddress; +import java.util.Collection; +import java.util.Map; + +import javax.jmdns.impl.JmDNSImpl; + +/** + * mDNS implementation in Java. + * + * @author Arthur van Hoff, Rick Blair, Jeff Sonstein, Werner Randelshofer, Pierre Frisch, Scott Lewis, Scott Cytacki + */ +public abstract class JmDNS implements Closeable { + + /** + * + */ + public static interface Delegate { + + /** + * This method is called if JmDNS cannot recover from an I/O error. + * + * @param dns + * target DNS + * @param infos + * service info registered with the DNS + */ + public void cannotRecoverFromIOError(JmDNS dns, Collection<ServiceInfo> infos); + + } + + /** + * The version of JmDNS. + */ + public static final String VERSION = "3.4.2"; + + /** + * <p> + * Create an instance of JmDNS. + * </p> + * <p> + * <b>Note:</b> This is a convenience method. The preferred constructor is {@link #create(InetAddress, String)}.<br/> + * Check that your platform correctly handle the default localhost IP address and the local hostname. In doubt use the explicit constructor.<br/> + * This call is equivalent to <code>create(null, null)</code>. + * </p> + * + * @see #create(InetAddress, String) + * @return jmDNS instance + * @exception IOException + * if an exception occurs during the socket creation + */ + public static JmDNS create() throws IOException { + return new JmDNSImpl(null, null); + } + + /** + * <p> + * Create an instance of JmDNS and bind it to a specific network interface given its IP-address. + * </p> + * <p> + * <b>Note:</b> This is a convenience method. The preferred constructor is {@link #create(InetAddress, String)}.<br/> + * Check that your platform correctly handle the default localhost IP address and the local hostname. In doubt use the explicit constructor.<br/> + * This call is equivalent to <code>create(addr, null)</code>. + * </p> + * + * @see #create(InetAddress, String) + * @param addr + * IP address to bind to. + * @return jmDNS instance + * @exception IOException + * if an exception occurs during the socket creation + */ + public static JmDNS create(final InetAddress addr) throws IOException { + return new JmDNSImpl(addr, null); + } + + /** + * <p> + * Create an instance of JmDNS. + * </p> + * <p> + * <b>Note:</b> This is a convenience method. The preferred constructor is {@link #create(InetAddress, String)}.<br/> + * Check that your platform correctly handle the default localhost IP address and the local hostname. In doubt use the explicit constructor.<br/> + * This call is equivalent to <code>create(null, name)</code>. + * </p> + * + * @see #create(InetAddress, String) + * @param name + * name of the newly created JmDNS + * @return jmDNS instance + * @exception IOException + * if an exception occurs during the socket creation + */ + public static JmDNS create(final String name) throws IOException { + return new JmDNSImpl(null, name); + } + + /** + * <p> + * Create an instance of JmDNS and bind it to a specific network interface given its IP-address. + * </p> + * If <code>addr</code> parameter is null this method will try to resolve to a local IP address of the machine using a network discovery: + * <ol> + * <li>Check the system property <code>net.mdns.interface</code></li> + * <li>Check the JVM local host</li> + * <li>Use the {@link NetworkTopologyDiscovery} to find a valid network interface and IP.</li> + * <li>In the last resort bind to the loopback address. This is non functional in most cases.</li> + * </ol> + * If <code>name</code> parameter is null will use the hostname. The hostname is determined by the following algorithm: + * <ol> + * <li>Get the hostname from the InetAdress obtained before.</li> + * <li>If the hostname is a reverse lookup default to <code>JmDNS name</code> or <code>computer</code> if null.</li> + * <li>If the name contains <code>'.'</code> replace them by <code>'-'</code></li> + * <li>Add <code>.local.</code> at the end of the name.</li> + * </ol> + * <p> + * <b>Note:</b> If you need to use a custom {@link NetworkTopologyDiscovery} it must be setup before any call to this method. This is done by setting up a {@link NetworkTopologyDiscovery.Factory.ClassDelegate} and installing it using + * {@link NetworkTopologyDiscovery.Factory#setClassDelegate(NetworkTopologyDiscovery.Factory.ClassDelegate)}. This must be done before creating a {@link JmDNS} or {@link JmmDNS} instance. + * </p> + * + * @param addr + * IP address to bind to. + * @param name + * name of the newly created JmDNS + * @return jmDNS instance + * @exception IOException + * if an exception occurs during the socket creation + */ + public static JmDNS create(final InetAddress addr, final String name) throws IOException { + return new JmDNSImpl(addr, name); + } + + /** + * Return the name of the JmDNS instance. This is an arbitrary string that is useful for distinguishing instances. + * + * @return name of the JmDNS + */ + public abstract String getName(); + + /** + * Return the HostName associated with this JmDNS instance. Note: May not be the same as what started. The host name is subject to negotiation. + * + * @return Host name + */ + public abstract String getHostName(); + + /** + * Return the address of the interface to which this instance of JmDNS is bound. + * + * @return Internet Address + * @exception IOException + * if there is an error in the underlying protocol, such as a TCP error. + */ + public abstract InetAddress getInetAddress() throws IOException; + + /** + * Return the address of the interface to which this instance of JmDNS is bound. + * + * @return Internet Address + * @exception IOException + * if there is an error in the underlying protocol, such as a TCP error. + * @deprecated do not use this implementation yields unpredictable results use {@link #getInetAddress()} + */ + @Deprecated + public abstract InetAddress getInterface() throws IOException; + + /** + * Get service information. If the information is not cached, the method will block until updated information is received. + * <p/> + * Usage note: Do not call this method from the AWT event dispatcher thread. You will make the user interface unresponsive. + * + * @param type + * fully qualified service type, such as <code>_http._tcp.local.</code> . + * @param name + * unqualified service name, such as <code>foobar</code> . + * @return null if the service information cannot be obtained + */ + public abstract ServiceInfo getServiceInfo(String type, String name); + + /** + * Get service information. If the information is not cached, the method will block for the given timeout until updated information is received. + * <p/> + * Usage note: If you call this method from the AWT event dispatcher thread, use a small timeout, or you will make the user interface unresponsive. + * + * @param type + * full qualified service type, such as <code>_http._tcp.local.</code> . + * @param name + * unqualified service name, such as <code>foobar</code> . + * @param timeout + * timeout in milliseconds. Typical timeout should be 5s. + * @return null if the service information cannot be obtained + */ + public abstract ServiceInfo getServiceInfo(String type, String name, long timeout); + + /** + * Get service information. If the information is not cached, the method will block until updated information is received. + * <p/> + * Usage note: Do not call this method from the AWT event dispatcher thread. You will make the user interface unresponsive. + * + * @param type + * fully qualified service type, such as <code>_http._tcp.local.</code> . + * @param name + * unqualified service name, such as <code>foobar</code> . + * @param persistent + * if <code>true</code> ServiceListener.resolveService will be called whenever new new information is received. + * @return null if the service information cannot be obtained + */ + public abstract ServiceInfo getServiceInfo(String type, String name, boolean persistent); + + /** + * Get service information. If the information is not cached, the method will block for the given timeout until updated information is received. + * <p/> + * Usage note: If you call this method from the AWT event dispatcher thread, use a small timeout, or you will make the user interface unresponsive. + * + * @param type + * full qualified service type, such as <code>_http._tcp.local.</code> . + * @param name + * unqualified service name, such as <code>foobar</code> . + * @param timeout + * timeout in milliseconds. Typical timeout should be 5s. + * @param persistent + * if <code>true</code> ServiceListener.resolveService will be called whenever new new information is received. + * @return null if the service information cannot be obtained + */ + public abstract ServiceInfo getServiceInfo(String type, String name, boolean persistent, long timeout); + + /** + * Request service information. The information about the service is requested and the ServiceListener.resolveService method is called as soon as it is available. + * <p/> + * Usage note: Do not call this method from the AWT event dispatcher thread. You will make the user interface unresponsive. + * + * @param type + * full qualified service type, such as <code>_http._tcp.local.</code> . + * @param name + * unqualified service name, such as <code>foobar</code> . + */ + public abstract void requestServiceInfo(String type, String name); + + /** + * Request service information. The information about the service is requested and the ServiceListener.resolveService method is called as soon as it is available. + * <p/> + * Usage note: Do not call this method from the AWT event dispatcher thread. You will make the user interface unresponsive. + * + * @param type + * full qualified service type, such as <code>_http._tcp.local.</code> . + * @param name + * unqualified service name, such as <code>foobar</code> . + * @param persistent + * if <code>true</code> ServiceListener.resolveService will be called whenever new new information is received. + */ + public abstract void requestServiceInfo(String type, String name, boolean persistent); + + /** + * Request service information. The information about the service is requested and the ServiceListener.resolveService method is called as soon as it is available. + * + * @param type + * full qualified service type, such as <code>_http._tcp.local.</code> . + * @param name + * unqualified service name, such as <code>foobar</code> . + * @param timeout + * timeout in milliseconds + */ + public abstract void requestServiceInfo(String type, String name, long timeout); + + /** + * Request service information. The information about the service is requested and the ServiceListener.resolveService method is called as soon as it is available. + * + * @param type + * full qualified service type, such as <code>_http._tcp.local.</code> . + * @param name + * unqualified service name, such as <code>foobar</code> . + * @param persistent + * if <code>true</code> ServiceListener.resolveService will be called whenever new new information is received. + * @param timeout + * timeout in milliseconds + */ + public abstract void requestServiceInfo(String type, String name, boolean persistent, long timeout); + + /** + * Listen for service types. + * + * @param listener + * listener for service types + * @exception IOException + * if there is an error in the underlying protocol, such as a TCP error. + */ + public abstract void addServiceTypeListener(ServiceTypeListener listener) throws IOException; + + /** + * Remove listener for service types. + * + * @param listener + * listener for service types + */ + public abstract void removeServiceTypeListener(ServiceTypeListener listener); + + /** + * Listen for services of a given type. The type has to be a fully qualified type name such as <code>_http._tcp.local.</code>. + * + * @param type + * full qualified service type, such as <code>_http._tcp.local.</code>. + * @param listener + * listener for service updates + */ + public abstract void addServiceListener(String type, ServiceListener listener); + + /** + * Remove listener for services of a given type. + * + * @param type + * full qualified service type, such as <code>_http._tcp.local.</code>. + * @param listener + * listener for service updates + */ + public abstract void removeServiceListener(String type, ServiceListener listener); + + /** + * Register a service. The service is registered for access by other jmdns clients. The name of the service may be changed to make it unique.<br> + * Note that the given {@code ServiceInfo} is bound to this {@code JmDNS} instance, and should not be reused for any other {@linkplain #registerService(ServiceInfo)}. + * + * @param info + * service info to register + * @exception IOException + * if there is an error in the underlying protocol, such as a TCP error. + */ + public abstract void registerService(ServiceInfo info) throws IOException; + + /** + * Unregister a service. The service should have been registered. + * <p> + * <b>Note:</b> Unregistered services will not disappear form the list of services immediately. According to the specification, when unregistering services we send goodbye packets and then wait <b>1s</b> before purging the cache.<br/> + * This is support for shared records that can be rescued by some other cooperation DNS. + * + * <pre> + * Clients receiving a Multicast DNS Response with a TTL of zero SHOULD NOT immediately delete the record from the cache, but instead record a TTL of 1 and then delete the record one second later. + * </pre> + * + * </p> + * + * @param info + * service info to remove + */ + public abstract void unregisterService(ServiceInfo info); + + /** + * Unregister all services. + */ + public abstract void unregisterAllServices(); + + /** + * Register a service type. If this service type was not already known, all service listeners will be notified of the new service type. + * <p> + * Service types are automatically registered as they are discovered. + * </p> + * + * @param type + * full qualified service type, such as <code>_http._tcp.local.</code>. + * @return <code>true</code> if the type or subtype was added, <code>false</code> if the type was already registered. + */ + public abstract boolean registerServiceType(String type); + + /** + * List Services and serviceTypes. Debugging Only + * + * @deprecated since 3.2.2 + */ + @Deprecated + public abstract void printServices(); + + /** + * Returns a list of service infos of the specified type. + * + * @param type + * Service type name, such as <code>_http._tcp.local.</code>. + * @return An array of service instance. + */ + public abstract ServiceInfo[] list(String type); + + /** + * Returns a list of service infos of the specified type. + * + * @param type + * Service type name, such as <code>_http._tcp.local.</code>. + * @param timeout + * timeout in milliseconds. Typical timeout should be 6s. + * @return An array of service instance. + */ + public abstract ServiceInfo[] list(String type, long timeout); + + /** + * Returns a list of service infos of the specified type sorted by subtype. Any service that do not register a subtype is listed in the empty subtype section. + * + * @param type + * Service type name, such as <code>_http._tcp.local.</code>. + * @return A dictionary of service info by subtypes. + */ + public abstract Map<String, ServiceInfo[]> listBySubtype(String type); + + /** + * Returns a list of service infos of the specified type sorted by subtype. Any service that do not register a subtype is listed in the empty subtype section. + * + * @param type + * Service type name, such as <code>_http._tcp.local.</code>. + * @param timeout + * timeout in milliseconds. Typical timeout should be 6s. + * @return A dictionary of service info by subtypes. + */ + public abstract Map<String, ServiceInfo[]> listBySubtype(String type, long timeout); + + /** + * Returns the instance delegate + * + * @return instance delegate + */ + public abstract Delegate getDelegate(); + + /** + * Sets the instance delegate + * + * @param value + * new instance delegate + * @return previous instance delegate + */ + public abstract Delegate setDelegate(Delegate value); + +} |