13742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman// Copyright 2003-2005 Arthur van Hoff, Rick Blair
23742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman// Licensed under Apache License version 2.0
33742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman// Original license LGPL
43742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
53742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanpackage javax.jmdns.impl;
63742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
73742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport java.io.IOException;
83742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport java.net.DatagramPacket;
93742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport java.util.logging.Level;
103742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport java.util.logging.Logger;
113742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
123742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport javax.jmdns.impl.constants.DNSConstants;
133742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
143742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman/**
153742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Listen for multicast packets.
163742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */
173742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanclass SocketListener extends Thread {
183742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    static Logger           logger = Logger.getLogger(SocketListener.class.getName());
193742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
203742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
213742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     *
223742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
233742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    private final JmDNSImpl _jmDNSImpl;
243742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
253742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    /**
263742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     * @param jmDNSImpl
273742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman     */
283742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    SocketListener(JmDNSImpl jmDNSImpl) {
293742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        super("SocketListener(" + (jmDNSImpl != null ? jmDNSImpl.getName() : "") + ")");
303742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        this.setDaemon(true);
313742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        this._jmDNSImpl = jmDNSImpl;
323742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
333742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
343742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    @Override
353742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public void run() {
363742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        try {
373742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            byte buf[] = new byte[DNSConstants.MAX_MSG_ABSOLUTE];
383742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            DatagramPacket packet = new DatagramPacket(buf, buf.length);
393742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            while (!this._jmDNSImpl.isCanceling() && !this._jmDNSImpl.isCanceled()) {
403742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                packet.setLength(buf.length);
413742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                this._jmDNSImpl.getSocket().receive(packet);
423742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                if (this._jmDNSImpl.isCanceling() || this._jmDNSImpl.isCanceled() || this._jmDNSImpl.isClosing() || this._jmDNSImpl.isClosed()) {
433742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                    break;
443742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                }
453742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                try {
463742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                    if (this._jmDNSImpl.getLocalHost().shouldIgnorePacket(packet)) {
473742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                        continue;
483742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                    }
493742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
503742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                    DNSIncoming msg = new DNSIncoming(packet);
513742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                    if (logger.isLoggable(Level.FINEST)) {
523742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                        logger.finest(this.getName() + ".run() JmDNS in:" + msg.print(true));
533742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                    }
543742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                    if (msg.isQuery()) {
553742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                        if (packet.getPort() != DNSConstants.MDNS_PORT) {
563742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                            this._jmDNSImpl.handleQuery(msg, packet.getAddress(), packet.getPort());
573742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                        }
583742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                        this._jmDNSImpl.handleQuery(msg, this._jmDNSImpl.getGroup(), DNSConstants.MDNS_PORT);
593742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                    } else {
603742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                        this._jmDNSImpl.handleResponse(msg);
613742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                    }
623742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                } catch (IOException e) {
633742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                    logger.log(Level.WARNING, this.getName() + ".run() exception ", e);
643742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                }
653742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            }
663742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        } catch (IOException e) {
673742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            if (!this._jmDNSImpl.isCanceling() && !this._jmDNSImpl.isCanceled() && !this._jmDNSImpl.isClosing() && !this._jmDNSImpl.isClosed()) {
683742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                logger.log(Level.WARNING, this.getName() + ".run() exception ", e);
693742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman                this._jmDNSImpl.recover();
703742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            }
713742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        }
723742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        if (logger.isLoggable(Level.FINEST)) {
733742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman            logger.finest(this.getName() + ".run() exiting.");
743742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        }
753742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
763742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
773742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    public JmDNSImpl getDns() {
783742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman        return _jmDNSImpl;
793742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman    }
803742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman
813742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman}
82