diff --git a/.classpath b/.classpath index 81a5936bb..64e8893d5 100644 --- a/.classpath +++ b/.classpath @@ -16,7 +16,8 @@ - + + diff --git a/app/.classpath b/app/.classpath index f32ff129b..0ddf5f099 100644 --- a/app/.classpath +++ b/app/.classpath @@ -38,7 +38,9 @@ - + + + diff --git a/app/lib/jmdns-3.4.1.jar b/app/lib/jmdns-3.4.1.jar deleted file mode 100644 index 4fcd002b4..000000000 Binary files a/app/lib/jmdns-3.4.1.jar and /dev/null differ diff --git a/app/lib/jmdns-3.5.1.jar b/app/lib/jmdns-3.5.1.jar new file mode 100644 index 000000000..f9527c104 Binary files /dev/null and b/app/lib/jmdns-3.5.1.jar differ diff --git a/app/lib/jmdns.LICENSE.ASL-2.0-LGPL-2.1.txt b/app/lib/jmdns.LICENSE.ASL-2.0-LGPL-2.1.txt index e2ada0455..7b90a6caa 100644 --- a/app/lib/jmdns.LICENSE.ASL-2.0-LGPL-2.1.txt +++ b/app/lib/jmdns.LICENSE.ASL-2.0-LGPL-2.1.txt @@ -1,2 +1,2 @@ -https://jmdns.svn.sourceforge.net/svnroot/jmdns/tags/jmdns-3.4.1/LICENSE-LGPL.txt -https://jmdns.svn.sourceforge.net/svnroot/jmdns/tags/jmdns-3.4.1/LICENSE +https://jmdns.svn.sourceforge.net/svnroot/jmdns/tags/jmdns-3.5.1/LICENSE-LGPL.txt +https://jmdns.svn.sourceforge.net/svnroot/jmdns/tags/jmdns-3.5.1/LICENSE diff --git a/app/lib/slf4j-api-1.7.22.jar b/app/lib/slf4j-api-1.7.22.jar new file mode 100644 index 000000000..ddf3dc951 Binary files /dev/null and b/app/lib/slf4j-api-1.7.22.jar differ diff --git a/app/lib/slf4j-simple-1.7.22.jar b/app/lib/slf4j-simple-1.7.22.jar new file mode 100644 index 000000000..13ee902df Binary files /dev/null and b/app/lib/slf4j-simple-1.7.22.jar differ diff --git a/arduino-core/.classpath b/arduino-core/.classpath index 065243de8..4167a9dd3 100644 --- a/arduino-core/.classpath +++ b/arduino-core/.classpath @@ -5,7 +5,9 @@ - + + + diff --git a/arduino-core/lib/jmdns-3.4.1.jar b/arduino-core/lib/jmdns-3.4.1.jar deleted file mode 100644 index 4fcd002b4..000000000 Binary files a/arduino-core/lib/jmdns-3.4.1.jar and /dev/null differ diff --git a/arduino-core/lib/jmdns-3.5.1.jar b/arduino-core/lib/jmdns-3.5.1.jar new file mode 100644 index 000000000..f9527c104 Binary files /dev/null and b/arduino-core/lib/jmdns-3.5.1.jar differ diff --git a/arduino-core/lib/jmdns.LICENSE.ASL-2.0-LGPL-2.1.txt b/arduino-core/lib/jmdns.LICENSE.ASL-2.0-LGPL-2.1.txt index e2ada0455..7b90a6caa 100644 --- a/arduino-core/lib/jmdns.LICENSE.ASL-2.0-LGPL-2.1.txt +++ b/arduino-core/lib/jmdns.LICENSE.ASL-2.0-LGPL-2.1.txt @@ -1,2 +1,2 @@ -https://jmdns.svn.sourceforge.net/svnroot/jmdns/tags/jmdns-3.4.1/LICENSE-LGPL.txt -https://jmdns.svn.sourceforge.net/svnroot/jmdns/tags/jmdns-3.4.1/LICENSE +https://jmdns.svn.sourceforge.net/svnroot/jmdns/tags/jmdns-3.5.1/LICENSE-LGPL.txt +https://jmdns.svn.sourceforge.net/svnroot/jmdns/tags/jmdns-3.5.1/LICENSE diff --git a/arduino-core/lib/slf4j-api-1.7.22.jar b/arduino-core/lib/slf4j-api-1.7.22.jar new file mode 100644 index 000000000..ddf3dc951 Binary files /dev/null and b/arduino-core/lib/slf4j-api-1.7.22.jar differ diff --git a/arduino-core/lib/slf4j-simple-1.7.22.jar b/arduino-core/lib/slf4j-simple-1.7.22.jar new file mode 100644 index 000000000..13ee902df Binary files /dev/null and b/arduino-core/lib/slf4j-simple-1.7.22.jar differ diff --git a/arduino-core/src/cc/arduino/packages/discoverers/NetworkDiscovery.java b/arduino-core/src/cc/arduino/packages/discoverers/NetworkDiscovery.java index e88568a1e..42d6ec78c 100644 --- a/arduino-core/src/cc/arduino/packages/discoverers/NetworkDiscovery.java +++ b/arduino-core/src/cc/arduino/packages/discoverers/NetworkDiscovery.java @@ -31,89 +31,38 @@ package cc.arduino.packages.discoverers; import cc.arduino.packages.BoardPort; import cc.arduino.packages.Discovery; -import cc.arduino.packages.discoverers.network.BoardReachabilityFilter; -import cc.arduino.packages.discoverers.network.NetworkChecker; -import org.apache.commons.compress.utils.IOUtils; import processing.app.BaseNoGui; -import processing.app.zeroconf.jmdns.ArduinoDNSTaskStarter; import javax.jmdns.*; -import javax.jmdns.impl.DNSTaskStarter; import java.io.IOException; import java.net.InetAddress; import java.util.*; -public class NetworkDiscovery implements Discovery, ServiceListener, cc.arduino.packages.discoverers.network.NetworkTopologyListener { +import cc.arduino.packages.discoverers.network.BoardReachabilityFilter; + +public class NetworkDiscovery implements Discovery, ServiceListener { private static final int MAX_TIME_AWAITING_FOR_PACKAGES = 5000; - private final List boardPortsDiscoveredWithJmDNS; - private final Map mappedJmDNSs; - private Timer networkCheckerTimer; - private Timer boardReachabilityFilterTimer; - private final List reachableBoardPorts; + private final List reachableBoardPorts = new LinkedList<>(); + private final List boardPortsDiscoveredWithJmDNS = new LinkedList<>(); + private Timer reachabilityTimer; + private JmmDNS jmdns = null; - public NetworkDiscovery() { - DNSTaskStarter.Factory.setClassDelegate(new ArduinoDNSTaskStarter()); - this.boardPortsDiscoveredWithJmDNS = new LinkedList<>(); - this.mappedJmDNSs = new Hashtable<>(); - this.reachableBoardPorts = new LinkedList<>(); - } - - @Override - public List listDiscoveredBoards() { - synchronized (reachableBoardPorts) { - return new LinkedList<>(reachableBoardPorts); - } - } - - @Override - public List listDiscoveredBoards(boolean complete) { - synchronized (reachableBoardPorts) { - return new LinkedList<>(reachableBoardPorts); - } - } - - public void setReachableBoardPorts(List newReachableBoardPorts) { - synchronized (reachableBoardPorts) { - this.reachableBoardPorts.clear(); - this.reachableBoardPorts.addAll(newReachableBoardPorts); - } - } - - public List getBoardPortsDiscoveredWithJmDNS() { + private void removeDuplicateBoards(BoardPort newBoard) { synchronized (boardPortsDiscoveredWithJmDNS) { - return new LinkedList<>(boardPortsDiscoveredWithJmDNS); + Iterator iterator = boardPortsDiscoveredWithJmDNS.iterator(); + while (iterator.hasNext()) { + BoardPort board = iterator.next(); + if (newBoard.getAddress().equals(board.getAddress())) { + iterator.remove(); + } + } } } - @Override - public void start() throws IOException { - this.networkCheckerTimer = new Timer(NetworkChecker.class.getName()); - new NetworkChecker(this, NetworkTopologyDiscovery.Factory.getInstance()).start(networkCheckerTimer); - this.boardReachabilityFilterTimer = new Timer(BoardReachabilityFilter.class.getName()); - new BoardReachabilityFilter(this).start(boardReachabilityFilterTimer); - } - - @Override - public void stop() throws IOException { - this.networkCheckerTimer.purge(); - this.boardReachabilityFilterTimer.purge(); - // we don't close each JmDNS instance as it's too slow - } - @Override public void serviceAdded(ServiceEvent serviceEvent) { - String type = serviceEvent.getType(); - String name = serviceEvent.getName(); - - JmDNS dns = serviceEvent.getDNS(); - - dns.requestServiceInfo(type, name); - ServiceInfo serviceInfo = dns.getServiceInfo(type, name); - if (serviceInfo != null) { - dns.requestServiceInfo(type, name); - } } @Override @@ -126,11 +75,9 @@ public class NetworkDiscovery implements Discovery, ServiceListener, cc.arduino. @Override public void serviceResolved(ServiceEvent serviceEvent) { - int sleptFor = 0; - while (BaseNoGui.packages == null && sleptFor <= MAX_TIME_AWAITING_FOR_PACKAGES) { + while (BaseNoGui.packages == null) { try { Thread.sleep(1000); - sleptFor += 1000; } catch (InterruptedException e) { e.printStackTrace(); } @@ -151,7 +98,7 @@ public class NetworkDiscovery implements Discovery, ServiceListener, cc.arduino. port.getPrefs().put("board", board); port.getPrefs().put("distro_version", info.getPropertyString("distro_version")); port.getPrefs().put("port", "" + info.getPort()); - + //Add additional fields to permit generic ota updates //and make sure we do not intefere with Arduino boards // define "ssh_upload=no" TXT property to use generic uploader @@ -190,35 +137,56 @@ public class NetworkDiscovery implements Discovery, ServiceListener, cc.arduino. } } - private void removeDuplicateBoards(BoardPort newBoard) { - synchronized (boardPortsDiscoveredWithJmDNS) { - Iterator iterator = boardPortsDiscoveredWithJmDNS.iterator(); - while (iterator.hasNext()) { - BoardPort board = iterator.next(); - if (newBoard.getAddress().equals(board.getAddress())) { - iterator.remove(); - } - } - } + public NetworkDiscovery() { + } @Override - public void inetAddressAdded(InetAddress address) { - if (mappedJmDNSs.containsKey(address)) { - return; - } + public void start() { + jmdns = JmmDNS.Factory.getInstance(); + jmdns.addServiceListener("_arduino._tcp.local.", this); + reachabilityTimer = new Timer(); + new BoardReachabilityFilter(this).start(reachabilityTimer); + } + + @Override + public void stop() { + jmdns.unregisterAllServices(); + // we don't close the JmmDNS instance as it's too slow + /* try { - JmDNS jmDNS = JmDNS.create(address); - jmDNS.addServiceListener("_arduino._tcp.local.", this); - mappedJmDNSs.put(address, jmDNS); - } catch (Exception e) { + jmdns.close(); + } catch (IOException e) { e.printStackTrace(); } + */ + reachabilityTimer.cancel(); } @Override - public void inetAddressRemoved(InetAddress address) { - JmDNS jmDNS = mappedJmDNSs.remove(address); - IOUtils.closeQuietly(jmDNS); + public List listDiscoveredBoards() { + synchronized (reachableBoardPorts) { + return new LinkedList<>(reachableBoardPorts); + } + } + + @Override + public List listDiscoveredBoards(boolean complete) { + synchronized (reachableBoardPorts) { + return new LinkedList<>(reachableBoardPorts); + } + } + + public void setReachableBoardPorts(List newReachableBoardPorts) { + synchronized (reachableBoardPorts) { + this.reachableBoardPorts.clear(); + this.reachableBoardPorts.addAll(newReachableBoardPorts); + } + } + + public List getBoardPortsDiscoveredWithJmDNS() { + synchronized (boardPortsDiscoveredWithJmDNS) { + return new LinkedList<>(boardPortsDiscoveredWithJmDNS); + } } } diff --git a/arduino-core/src/cc/arduino/packages/discoverers/network/BoardReachabilityFilter.java b/arduino-core/src/cc/arduino/packages/discoverers/network/BoardReachabilityFilter.java index 433142eb3..c8fbc1557 100644 --- a/arduino-core/src/cc/arduino/packages/discoverers/network/BoardReachabilityFilter.java +++ b/arduino-core/src/cc/arduino/packages/discoverers/network/BoardReachabilityFilter.java @@ -34,23 +34,28 @@ import cc.arduino.packages.discoverers.NetworkDiscovery; import processing.app.helpers.NetUtils; import java.net.InetAddress; +import java.net.NetworkInterface; +import java.util.Enumeration; import java.net.UnknownHostException; import java.util.*; public class BoardReachabilityFilter extends TimerTask { private final NetworkDiscovery networkDiscovery; + private Enumeration staticNetworkInterfaces; + private final List staticNetworkInterfacesList = new LinkedList<>(); public BoardReachabilityFilter(NetworkDiscovery networkDiscovery) { this.networkDiscovery = networkDiscovery; } public void start(Timer timer) { - timer.schedule(this, 0, 3000); + timer.schedule(this, 0, 5000); } @Override public void run() { + List boardPorts = networkDiscovery.getBoardPortsDiscoveredWithJmDNS(); Iterator boardPortIterator = boardPorts.iterator(); diff --git a/arduino-core/src/cc/arduino/packages/discoverers/network/NetworkChecker.java b/arduino-core/src/cc/arduino/packages/discoverers/network/NetworkChecker.java deleted file mode 100644 index df58c220d..000000000 --- a/arduino-core/src/cc/arduino/packages/discoverers/network/NetworkChecker.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * This file is part of Arduino. - * - * Arduino is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * As a special exception, you may use this file as part of a free software - * library without restriction. Specifically, if other files instantiate - * templates or use macros or inline functions from this file, or you compile - * this file and link it with other files to produce an executable, this - * file does not by itself cause the resulting executable to be covered by - * the GNU General Public License. This exception does not however - * invalidate any other reasons why the executable file might be covered by - * the GNU General Public License. - * - * Copyright 2013 Arduino LLC (http://www.arduino.cc/) - */ - -package cc.arduino.packages.discoverers.network; - -import javax.jmdns.NetworkTopologyDiscovery; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.net.SocketException; -import java.util.*; - -public class NetworkChecker extends TimerTask { - - private final NetworkTopologyListener topologyListener; - private final NetworkTopologyDiscovery topology; - - private Set knownAddresses; - - public NetworkChecker(NetworkTopologyListener topologyListener, NetworkTopologyDiscovery topology) { - super(); - this.topologyListener = topologyListener; - this.topology = topology; - this.knownAddresses = Collections.synchronizedSet(new HashSet<>()); - } - - public void start(Timer timer) { - timer.schedule(this, 0, 3000); - } - - @Override - public void run() { - if (!hasNetworkInterfaces()) { - return; - } - try { - InetAddress[] curentAddresses = topology.getInetAddresses(); - Set current = new HashSet<>(curentAddresses.length); - for (InetAddress address : curentAddresses) { - current.add(address); - if (!knownAddresses.contains(address)) { - topologyListener.inetAddressAdded(address); - } - } - knownAddresses.stream().filter(address -> !current.contains(address)).forEach(topologyListener::inetAddressRemoved); - knownAddresses = current; - } catch (Exception e) { - e.printStackTrace(); - } - } - - private boolean hasNetworkInterfaces() { - try { - return NetworkInterface.getNetworkInterfaces() != null; - } catch (SocketException e) { - return false; - } - } -} diff --git a/arduino-core/src/cc/arduino/packages/discoverers/network/NetworkTopologyListener.java b/arduino-core/src/cc/arduino/packages/discoverers/network/NetworkTopologyListener.java deleted file mode 100644 index f963baa6c..000000000 --- a/arduino-core/src/cc/arduino/packages/discoverers/network/NetworkTopologyListener.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * This file is part of Arduino. - * - * Arduino is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * As a special exception, you may use this file as part of a free software - * library without restriction. Specifically, if other files instantiate - * templates or use macros or inline functions from this file, or you compile - * this file and link it with other files to produce an executable, this - * file does not by itself cause the resulting executable to be covered by - * the GNU General Public License. This exception does not however - * invalidate any other reasons why the executable file might be covered by - * the GNU General Public License. - * - * Copyright 2013 Arduino LLC (http://www.arduino.cc/) - */ - -package cc.arduino.packages.discoverers.network; - -import java.net.InetAddress; - -public interface NetworkTopologyListener { - - void inetAddressAdded(InetAddress address); - - void inetAddressRemoved(InetAddress address); - -} diff --git a/arduino-core/src/processing/app/zeroconf/jmdns/ArduinoDNSTaskStarter.java b/arduino-core/src/processing/app/zeroconf/jmdns/ArduinoDNSTaskStarter.java deleted file mode 100644 index dd08cb9e1..000000000 --- a/arduino-core/src/processing/app/zeroconf/jmdns/ArduinoDNSTaskStarter.java +++ /dev/null @@ -1,94 +0,0 @@ -package processing.app.zeroconf.jmdns; - -import javax.jmdns.impl.DNSIncoming; -import javax.jmdns.impl.DNSTaskStarter; -import javax.jmdns.impl.JmDNSImpl; -import javax.jmdns.impl.ServiceInfoImpl; -import javax.jmdns.impl.tasks.RecordReaper; -import java.util.Timer; - -public class ArduinoDNSTaskStarter implements DNSTaskStarter.Factory.ClassDelegate { - - @Override - public DNSTaskStarter newDNSTaskStarter(final JmDNSImpl jmDNSImpl) { - final DNSTaskStarter.DNSTaskStarterImpl delegate = new DNSTaskStarter.DNSTaskStarterImpl(jmDNSImpl); - final DNSTaskStarter.DNSTaskStarterImpl.StarterTimer timer = new DNSTaskStarter.DNSTaskStarterImpl.StarterTimer("JmDNS(" + jmDNSImpl.getName() + ").Timer", true); - - return new DNSTaskStarter() { - - @Override - public void purgeTimer() { - delegate.purgeTimer(); - timer.purge(); - } - - @Override - public void purgeStateTimer() { - delegate.purgeStateTimer(); - } - - @Override - public void cancelTimer() { - delegate.cancelTimer(); - timer.cancel(); - } - - @Override - public void cancelStateTimer() { - delegate.cancelStateTimer(); - } - - @Override - public void startProber() { - delegate.startProber(); - } - - @Override - public void startAnnouncer() { - delegate.startAnnouncer(); - } - - @Override - public void startRenewer() { - delegate.startRenewer(); - } - - @Override - public void startCanceler() { - delegate.startCanceler(); - } - - @Override - public void startReaper() { - new RecordReaper(jmDNSImpl) { - @Override - public void start(Timer timer) { - if (!this.getDns().isCanceling() && !this.getDns().isCanceled()) { - timer.schedule(this, 0, 500); - } - } - }.start(timer); - } - - @Override - public void startServiceInfoResolver(ServiceInfoImpl info) { - delegate.startServiceInfoResolver(info); - } - - @Override - public void startTypeResolver() { - delegate.startTypeResolver(); - } - - @Override - public void startServiceResolver(String type) { - delegate.startServiceResolver(type); - } - - @Override - public void startResponder(DNSIncoming in, int port) { - delegate.startResponder(in, port); - } - }; - } -} diff --git a/build/windows/launcher/config.xml b/build/windows/launcher/config.xml index 7168db2e0..0bf56ea03 100644 --- a/build/windows/launcher/config.xml +++ b/build/windows/launcher/config.xml @@ -41,7 +41,9 @@ %EXEDIR%/lib/jackson-databind-2.6.3.jar %EXEDIR%/lib/jackson-module-mrbean-2.6.3.jar %EXEDIR%/lib/java-semver-0.8.0.jar - %EXEDIR%/lib/jmdns-3.4.1.jar + %EXEDIR%/lib/jmdns-3.5.1.jar + %EXEDIR%/lib/slf4j-simple-1.7.22.jar + %EXEDIR%/lib/slf4j-api-1.7.22.jar %EXEDIR%/lib/jna-4.2.2.jar %EXEDIR%/lib/jna-platform-4.2.2.jar %EXEDIR%/lib/jsch-0.1.50.jar diff --git a/build/windows/launcher/config_debug.xml b/build/windows/launcher/config_debug.xml index 171013302..f6fbfe9e1 100644 --- a/build/windows/launcher/config_debug.xml +++ b/build/windows/launcher/config_debug.xml @@ -41,7 +41,9 @@ %EXEDIR%/lib/jackson-databind-2.6.3.jar %EXEDIR%/lib/jackson-module-mrbean-2.6.3.jar %EXEDIR%/lib/java-semver-0.8.0.jar - %EXEDIR%/lib/jmdns-3.4.1.jar + %EXEDIR%/lib/jmdns-3.5.1.jar + %EXEDIR%/lib/slf4j-simple-1.7.22.jar + %EXEDIR%/lib/slf4j-api-1.7.22.jar %EXEDIR%/lib/jna-4.2.2.jar %EXEDIR%/lib/jna-platform-4.2.2.jar %EXEDIR%/lib/jsch-0.1.50.jar