package com.jpii.navalbattle.io;
import java.net.URL;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import com.jpii.navalbattle.NavalBattle;
import com.jpii.navalbattle.data.Constants;
import com.sun.org.apache.xerces.internal.parsers.DOMParser;
public class BroadcastService {
/* Items from client */
private String announcementId;
private BroadcastThread broadcastThread;
/* Items from update.xml */
private String versionCode, versionReadable, updateText, updateUrl;
private String announcementCode, announcementTitle, announcementText, announcementUrl;
/* Items for client */
private boolean needsUpdate, hasAnnouncement, hasChecked = false;
public BroadcastService() {
announcementId = NavalBattleIO.getAttribute("announcementId");
broadcastThread = new BroadcastThread();
broadcastThread.run();
}
public String getVersionCode() {
return versionCode;
}
public String getVersionReadable() {
return versionReadable;
}
public String getUpdateText() {
return updateText;
}
public String getUpdateUrl() {
return updateUrl;
}
public String getAnnouncementCode() {
return announcementCode;
}
public String getAnnouncementTitle() {
return announcementTitle;
}
public String getAnnouncementText() {
return announcementText;
}
public String getAnnouncementUrl() {
return announcementUrl;
}
public boolean needsUpdate() {
return needsUpdate;
}
public boolean hasAnnouncement() {
return hasAnnouncement;
}
public boolean hasChecked() {
return hasChecked;
}
class BroadcastThread extends Thread {
public BroadcastThread() {
}
@Override
public void run() {
parseXml();
checkForUpdates();
checkForAnnouncement();
hasChecked = true;
}
private void parseXml() {
DOMParser parser = new DOMParser();
try {
parser.parse(new InputSource(new URL(Constants.NAVALBATTLE_UPDATE_URL).openStream()));
Document doc = parser.getDocument();
NodeList nodeList = doc.getElementsByTagName("string");
for (int i = 0; i < nodeList.getLength(); i++) {
Node n = nodeList.item(i);
NamedNodeMap m = n.getAttributes();
Node actualNode = n.getFirstChild();
if (actualNode != null) {
if(m.getNamedItem("name").getTextContent().equals("version_code")) {
versionCode = actualNode.getNodeValue();
}
if(m.getNamedItem("name").getTextContent().equals("version_readable")) {
versionReadable = actualNode.getNodeValue();
}
if(m.getNamedItem("name").getTextContent().equals("update_text")) {
updateText = actualNode.getNodeValue();
}
if(m.getNamedItem("name").getTextContent().equals("update_url")) {
updateUrl = actualNode.getNodeValue();
}
if(m.getNamedItem("name").getTextContent().equals("announcement_code")) {
announcementCode = actualNode.getNodeValue();
}
if(m.getNamedItem("name").getTextContent().equals("announcement_title")) {
announcementTitle = actualNode.getNodeValue();
}
if(m.getNamedItem("name").getTextContent().equals("announcement_text")) {
announcementText = actualNode.getNodeValue();
}
if(m.getNamedItem("name").getTextContent().equals("announcement_url")) {
announcementUrl = actualNode.getNodeValue();
}
}
}
} catch (Exception ex) {
NavalBattle.getDebugWindow().printError("BroadcastService encountered an error while downloading data");
}
}
private void checkForUpdates() {
try {
int clientVersion = Integer.parseInt(Constants.VERSION_CODE);
int latestVersion = Integer.parseInt(versionCode);
if(clientVersion < latestVersion) {
needsUpdate = true;
} else {
NavalBattle.getDebugWindow().printInfo("You are running the latest version!");
}
} catch (Exception e) { }
}
private void checkForAnnouncement() {
try {
int clientAnnouncement = Integer.parseInt(announcementId);
int latestAnnouncement = Integer.parseInt(announcementCode);
if(clientAnnouncement < latestAnnouncement || latestAnnouncement == -1) {
hasAnnouncement = true;
if(latestAnnouncement != -1) {
NavalBattleIO.saveAttribute("announcementId", announcementCode);
}
} else {
NavalBattle.getDebugWindow().printInfo("No new announcements!");
}
} catch (Exception e) { }
}
}
}