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