package oculusPrime;
import oculusPrime.commport.ArduinoPrime;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class Network {
Application app;
State state;
Settings settings;
int networkInfoToStateFailCount = 0;
public Network (Application a) {
app = a;
state = State.getReference();
settings = Settings.getReference();
pollInfo();
}
private void pollInfo() {
new Thread(new Runnable() {
public void run() {
try {
long wait = 0;
while (true) {
if (!state.exists(State.values.localaddress)) Util.updateLocalIPAddress();
else if (state.equals(State.values.localaddress, "127.0.0.1")) Util.updateLocalIPAddress();
if (!state.exists(State.values.externaladdress)) updateExternalIPAddress();
if (System.currentTimeMillis() > wait && networkInfoToStateFailCount < 10) {
if (networkInfoToState()) {
wait = 0;
networkInfoToStateFailCount = 0;
}
else {
wait = System.currentTimeMillis() + Util.ONE_MINUTE;
networkInfoToStateFailCount ++;
}
}
Thread.sleep(10000);
}
} catch (Exception e) {
Util.printError(e);
}
}
}).start();
}
private boolean networkInfoToState() {
String data = Util.readUrlToString("http://127.0.0.1/?action=xmlinfo");
if ("".equals(data) || data == null) {
Util.log("network unavailable", this);
nukeStateValues();
return false;
}
Document document = Util.loadXMLFromString(data);
if (document == null) {
nukeStateValues();
return false;
}
// ssid
if (document.getElementsByTagName("networkcurrent").getLength() > 0) {
Element networkcurrent = (Element) document.getElementsByTagName("networkcurrent").item(0);
String ssid = networkcurrent.getElementsByTagName("name").item(0).getTextContent();
if (!ssid.equals(state.get(State.values.ssid))) { // changed
state.delete(State.values.externaladdress);
state.delete(State.values.localaddress);
state.set(State.values.ssid, ssid);
}
}
else {
if (state.exists(State.values.ssid)) { // changed
state.delete(State.values.externaladdress);
state.delete(State.values.localaddress);
state.delete(State.values.ssid);
}
}
// gateway
if (document.getElementsByTagName("gatewayaddress").getLength() > 0) {
Element gateway = (Element) document.getElementsByTagName("gatewayaddress").item(0);
String gatewayaddress = gateway.getTextContent();
if (!gatewayaddress.equals(state.get(State.values.gatewayaddress)))
state.set(State.values.gatewayaddress, gatewayaddress);
}
else if (state.exists(State.values.gatewayaddress))
state.delete(State.values.gatewayaddress);
// localaddress, or fallback to Util.updateLocalIPAddress();
if (document.getElementsByTagName("localaddress").getLength() > 0) {
Element local = (Element) document.getElementsByTagName("localaddress").item(0);
String localaddress = local.getTextContent();
if (!localaddress.equals(state.get(State.values.localaddress)))
state.set(State.values.localaddress, localaddress);
}
// message
if (document.getElementsByTagName("message").getLength() > 0) {
Element message = (Element) document.getElementsByTagName("message").item(0);
app.driverCallServer(PlayerCommands.messageclients, message.getTextContent());
}
// networksinrange
if (document.getElementsByTagName("networksinrange").getLength() > 0) {
String str = "";
NodeList networksinrange = document.getElementsByTagName("network");
for (int i = 0; i < networksinrange.getLength(); i++) {
if (i>0) str += ",";
str += ((Element) networksinrange.item(i)).getElementsByTagName("name").item(0).getTextContent();
str += " "+((Element) networksinrange.item(i)).getElementsByTagName("strength").item(0).getTextContent();
}
if (!str.equals(state.get(State.values.networksinrange)))
state.set(State.values.networksinrange, str);
}
else if (state.exists(State.values.networksinrange))
state.delete(State.values.networksinrange);
// networksknown
if (document.getElementsByTagName("networksknown").getLength() > 0) {
String str = "";
Element networksknown = (Element) document.getElementsByTagName("networksknown").item(0);
NodeList names = networksknown.getElementsByTagName("name");
for (int i = 0; i < names.getLength(); i++) {
if (i>0) str += ",";
str += ((Element) names.item(i)).getTextContent();
}
if (!str.equals(state.get(State.values.networksknown)))
state.set(State.values.networksknown, str);
}
else if (state.exists(State.values.networksknown))
state.delete(State.values.networksknown);
return true;
}
public static void nukeStateValues() {
State state = State.getReference();
state.delete(State.values.networksknown);
state.delete(State.values.ssid);
state.delete(State.values.gatewayaddress);
state.delete(State.values.networksinrange);
}
public void updateExternalIPAddress(){
String address = Util.readUrlToString("http://www.xaxxon.com/xaxxon/checkhost");
if(Util.validIP(address)) {
if (!address.equals(state.get(State.values.externaladdress)))
state.set(State.values.externaladdress, address);
}
else if (state.exists(State.values.externaladdress))
state.delete(State.values.externaladdress);
}
public void getNetworkSettings() {
if (!app.loginRecords.isAdmin()) return;
// String str = comport.speedslow + " " + comport.speedmed + " "
// + comport.nudgedelay + " " + comport.maxclicknudgedelay
// + " " + comport.maxclickcam
// + " " + comport.fullrotationdelay + " " + comport.onemeterdelay + " "
// + settings.readSetting(GUISettings.steeringcomp.name()) + " "
// + ArduinoPrime.CAM_HORIZ + " " + ArduinoPrime.CAM_REVERSE;
// sendplayerfunction("drivingsettingsdisplay", str);
String[] networksinrange = new String[0];
if (state.exists(State.values.networksinrange))
networksinrange = state.get(State.values.networksinrange).split(",");
String[] networksknown = new String[0];
if (state.exists(State.values.networksknown))
networksknown = state.get(State.values.networksknown).split(",");
// current ssid + strength
String currentnetwork = state.get(State.values.ssid);
for (int n=0; n<networksinrange.length; n++) {
if (networksinrange[n].split(" ")[0].equals(state.get(State.values.ssid))) {
currentnetwork = state.get(State.values.ssid)+ " "+networksinrange[n].split(" ")[1];
break;
}
}
// header
String str = "";
str += "connected to network: "+currentnetwork;
str +="<br>network IP address: "+state.get(State.values.localaddress);
str +="<br>gateway: "+state.get(State.values.gatewayaddress);
str += "<br>";
// known connnections in range
str += "<br>known wifi connections in range:";
for (int nk=0; nk<networksknown.length; nk++) {
for (int n=0; n<networksinrange.length; n++) {
if (networksinrange[n].split(" ")[0].equals(networksknown[nk])) {
if (networksinrange[n].split(" ")[0].equals(state.get(State.values.ssid))) continue;
str+="<br> "+networksknown[nk]+" "+networksinrange[n].split(" ")[1]+" ";
str+="<a href='javascript: callServer("networkconnect",""+networksknown[nk]+"")'";
str += ">connect</a>";
break;
}
}
}
//
str += "<br>";
str += "<br>other wifi connections in range:";
for (int n=0; n<networksinrange.length; n++) {
if (networksinrange[n].split(" ")[0].equals(state.get(State.values.ssid))) continue;
boolean skip = false;
for (int nk=0; nk<networksknown.length; nk++) {
if (networksinrange[n].split(" ")[0].equals(networksknown[nk])) {
skip=true;
break;
}
}
if (skip) continue;
str += "<br> "+networksinrange[n];
break;
}
str += "<br>";
str += "<br>all known wifi connections:";
for (int nk=0; nk<networksknown.length; nk++) {
str += "<br> "+networksknown[nk];
}
str += "<br>";
if (!state.exists(State.values.relayserver))
str += "<br><a class=\"blackbg\" href=\"network\" target=\"_blank\">more network controls</a><br>\n";
String server = settings.readSetting(GUISettings.relayserver);
str += "<br>relay server: "+server;
if (state.exists(State.values.relayserver)) {
str += "<br> status: connected to server";
str += "<br> <a class=\"blackbg\" href=\"javascript: relayserver('disable')\">\n" +
"disable</a>";
}
else if (state.exists(State.values.relayclient)) {
str += "<br> status: client connected from: " + state.get(State.values.relayclient);
str += "<br> <a class=\"blackbg\" href=\"javascript: relayserver('disable')\">\n" +
"disable</a>";
}
else {
str += "<br> status: not connected";
str += "<br> <a class=\"blackbg\" href=\"javascript: relayserver();\">connect</a> ><br>";
}
app.sendplayerfunction("networksettings", str);
}
public void connectNetwork(String str) {
app.driverCallServer(PlayerCommands.messageclients, "attempting connect to network: "+str);
Util.readUrlToString("http://127.0.0.1/?action=up&router="+str);
}
}