/* * RomRaider Open-Source Tuning, Logging and Reflashing * Copyright (C) 2006-2014 RomRaider.com * * This program 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 Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package com.romraider.xml; import static com.romraider.xml.DOMHelper.unmarshallAttribute; import static java.awt.Font.BOLD; import static org.w3c.dom.Node.ELEMENT_NODE; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Point; import java.io.File; import java.util.HashMap; import java.util.Map; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import com.romraider.Settings; import com.romraider.logger.external.phidget.interfacekit.io.IntfKitSensor; public final class DOMSettingsUnmarshaller { public Settings unmarshallSettings(Node rootNode) { Settings settings = new Settings(); Node n; NodeList nodes = rootNode.getChildNodes(); for (int i = 0; i < nodes.getLength(); i++) { n = nodes.item(i); if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("window")) { settings = unmarshallWindow(n, settings); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("files")) { settings = unmarshallFiles(n, settings); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("options")) { settings = unmarshallOptions(n, settings); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("tabledisplay")) { settings = unmarshallTableDisplay(n, settings); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("logger")) { settings = unmarshallLogger(n, settings); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase(Settings.TABLE_CLIPBOARD_FORMAT_ELEMENT)) { settings = this.unmarshallClipboardFormat(n, settings); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase(Settings.ICONS_ELEMENT_NAME)) { settings = this.unmarshallIcons(n, settings); } } return settings; } private Settings unmarshallWindow(Node windowNode, Settings settings) { Node n; NodeList nodes = windowNode.getChildNodes(); for (int i = 0; i < nodes.getLength(); i++) { n = nodes.item(i); if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("maximized")) { settings.setWindowMaximized(unmarshallAttribute(n, "value", false)); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("size")) { settings.setWindowSize(new Dimension(unmarshallAttribute(n, "y", 600), unmarshallAttribute(n, "x", 800))); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("location")) { // set default location in top left screen if no settings file found settings.setWindowLocation(new Point(unmarshallAttribute(n, "x", 0), unmarshallAttribute(n, "y", 0))); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("splitpane")) { settings.setSplitPaneLocation(unmarshallAttribute(n, "location", 150)); } } return settings; } private Settings unmarshallFiles(Node urlNode, Settings settings) { Node n; NodeList nodes = urlNode.getChildNodes(); for (int i = 0; i < nodes.getLength(); i++) { n = nodes.item(i); if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("ecudefinitionfile")) { settings.addEcuDefinitionFile(new File(unmarshallAttribute(n, "name", "ecu_defs.xml"))); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("image_dir")) { settings.setLastImageDir(new File(unmarshallAttribute(n, "path", "ecu_defs.xml"))); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase(Settings.REPOSITORY_ELEMENT_NAME)) { settings.setLastRepositoryDir(new File(unmarshallAttribute(n, Settings.REPOSITORY_ATTRIBUTE_NAME, "repositories"))); } } return settings; } private Settings unmarshallOptions(Node optionNode, Settings settings) { Node n; NodeList nodes = optionNode.getChildNodes(); for (int i = 0; i < nodes.getLength(); i++) { n = nodes.item(i); if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("obsoletewarning")) { settings.setObsoleteWarning(Boolean.parseBoolean(unmarshallAttribute(n, "value", "true"))); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("debug")) { settings.setDebug(Boolean.parseBoolean(unmarshallAttribute(n, "value", "true"))); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("calcconflictwarning")) { settings.setCalcConflictWarning(Boolean.parseBoolean(unmarshallAttribute(n, "value", "true"))); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("userlevel")) { settings.setUserLevel(unmarshallAttribute(n, "value", 1)); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("tableclickcount")) { settings.setTableClickCount(unmarshallAttribute(n, "value", 2)); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("tableclickbehavior")) { settings.setTableClickBehavior(unmarshallAttribute(n, "value", 0)); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("version")) { settings.setRecentVersion(unmarshallAttribute(n, "value", "")); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("savedebugtables")) { settings.setSaveDebugTables(Boolean.parseBoolean(unmarshallAttribute(n, "value", "false"))); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("displayhightables")) { settings.setDisplayHighTables(Boolean.parseBoolean(unmarshallAttribute(n, "value", "false"))); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("valuelimitwarning")) { settings.setValueLimitWarning(Boolean.parseBoolean(unmarshallAttribute(n, "value", "true"))); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("coloraxis")) { settings.setColorAxis(Boolean.parseBoolean(unmarshallAttribute(n, "value", "false"))); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("showtabletoolbarborder")) { settings.setShowTableToolbarBorder(Boolean.parseBoolean(unmarshallAttribute(n, "value", "false"))); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("openromexpanded")) { settings.setOpenExpanded(Boolean.parseBoolean(unmarshallAttribute(n, "value", "true"))); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("alwaysopentableatzero")) { settings.setAlwaysOpenTableAtZero(Boolean.parseBoolean(unmarshallAttribute(n, "value", "false"))); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("defaultscale")) { settings.setDefaultScale(unmarshallAttribute(n, "value", "Metric")); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("scaleHeadersAndData")) { settings.setScaleHeadersAndData(Boolean.parseBoolean(unmarshallAttribute(n, "value", "true"))); } } return settings; } private Settings unmarshallTableDisplay(Node tableDisplayNode, Settings settings) { Node n; NodeList nodes = tableDisplayNode.getChildNodes(); for (int i = 0; i < nodes.getLength(); i++) { n = nodes.item(i); if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("font")) { settings.setTableFont(new Font(unmarshallAttribute(n, "face", "Arial"), unmarshallAttribute(n, "decoration", BOLD), unmarshallAttribute(n, "size", 12))); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("cellsize")) { settings.setCellSize(new Dimension(unmarshallAttribute(n, "width", 42), unmarshallAttribute(n, "height", 18))); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("colors")) { settings = unmarshallColors(n, settings); } } return settings; } private Settings unmarshallColors(Node colorNode, Settings settings) { Node n; NodeList nodes = colorNode.getChildNodes(); for (int i = 0; i < nodes.getLength(); i++) { n = nodes.item(i); if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("max")) { settings.setMaxColor(unmarshallColor(n)); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("min")) { settings.setMinColor(unmarshallColor(n)); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("highlight")) { settings.setHighlightColor(unmarshallColor(n)); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("select")) { settings.setSelectColor(unmarshallColor(n)); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("increaseborder")) { settings.setIncreaseBorder(unmarshallColor(n)); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("decreaseborder")) { settings.setDecreaseBorder(unmarshallColor(n)); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("axis")) { settings.setAxisColor(unmarshallColor(n)); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("warning")) { settings.setWarningColor(unmarshallColor(n)); } } return settings; } private Settings unmarshallLogger(Node loggerNode, Settings settings) { NodeList nodes = loggerNode.getChildNodes(); if (loggerNode.getNodeType() == ELEMENT_NODE && loggerNode.getNodeName().equalsIgnoreCase("logger")) { settings.setLocale(unmarshallAttribute(loggerNode, "locale", "system")); } for (int i = 0; i < nodes.getLength(); i++) { Node n = nodes.item(i); if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("serial")) { settings.setLoggerPortDefault(unmarshallAttribute(n, "port", "")); settings.setRefreshMode(unmarshallAttribute(n, "refresh", false)); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("protocol")) { settings.setLoggerProtocol(unmarshallAttribute(n, "name", "SSM")); settings.setTransportProtocol(unmarshallAttribute(n, "transport", "ISO9141")); settings.setTargetModule(unmarshallAttribute(n, "module", "ecu")); settings.setFastPoll(unmarshallAttribute(n, "fastpoll", true)); settings.setJ2534Device(unmarshallAttribute(n, "library", null)); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("maximized")) { settings.setLoggerWindowMaximized(unmarshallAttribute(n, "value", false)); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("size")) { settings.setLoggerWindowSize(new Dimension(unmarshallAttribute(n, "y", 600), unmarshallAttribute(n, "x", 1000))); settings.setLoggerDividerLocation(unmarshallAttribute(n, "divider", 500)); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("location")) { settings.setLoggerWindowLocation(new Point(unmarshallAttribute(n, "x", 150), unmarshallAttribute(n, "y", 150))); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("tabs")) { settings.setLoggerSelectedTabIndex(unmarshallAttribute(n, "selected", 0)); settings.setLoggerParameterListState(unmarshallAttribute(n, "showlist", true)); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("definition")) { settings.setLoggerDefinitionFilePath(unmarshallAttribute(n, "path", settings.getLoggerDefinitionFilePath())); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("profile")) { settings.setLoggerProfileFilePath(unmarshallAttribute(n, "path", "")); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("filelogging")) { settings.setLoggerOutputDirPath(unmarshallAttribute(n, "path", "")); settings.setFileLoggingControllerSwitchId(unmarshallAttribute(n, "switchid", settings.getFileLoggingControllerSwitchId())); settings.setFileLoggingControllerSwitchActive(unmarshallAttribute(n, "active", true)); settings.setFileLoggingAbsoluteTimestamp(unmarshallAttribute(n, "absolutetimestamp", false)); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("debug")) { settings.setLoggerDebuggingLevel(unmarshallAttribute(n, "level", "info")); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("gauge")) { settings.setLoggerSelectedGaugeIndex(unmarshallAttribute(n, "index", 0)); } else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("plugins")) { Map<String, String> pluginPorts = new HashMap<String, String>(); NodeList pluginNodes = n.getChildNodes(); for (int j = 0; j < pluginNodes.getLength(); j++) { Node pluginNode = pluginNodes.item(j); if (pluginNode.getNodeType() == ELEMENT_NODE && pluginNode.getNodeName().equalsIgnoreCase("plugin")) { String id = unmarshallAttribute(pluginNode, "id", null); if (id == null || id.trim().length() == 0) continue; String port = unmarshallAttribute(pluginNode, "port", null); if (port == null || port.trim().length() == 0) continue; pluginPorts.put(id.trim(), port.trim()); } else if (pluginNode.getNodeType() == ELEMENT_NODE && pluginNode.getNodeName().equalsIgnoreCase("phidgets")) { final Map<String, IntfKitSensor> phidgets = new HashMap<String, IntfKitSensor>(); NodeList sensorNodes = pluginNode.getChildNodes(); for (int k = 0; k < sensorNodes.getLength(); k++) { Node sensorNode = sensorNodes.item(k); if (sensorNode.getNodeType() == ELEMENT_NODE && sensorNode.getNodeName().equalsIgnoreCase("phidget")) { final String name = unmarshallAttribute(sensorNode, "name", null); final int number = unmarshallAttribute(sensorNode, "number", -1); final String units = unmarshallAttribute(sensorNode, "units", null); final String expression = unmarshallAttribute(sensorNode, "expression", null); final String format = unmarshallAttribute(sensorNode, "format", null); final float min = Float.parseFloat(unmarshallAttribute(sensorNode, "min", "-1.0")); final float max = Float.parseFloat(unmarshallAttribute(sensorNode, "max", "-1.0")); final float step = Float.parseFloat(unmarshallAttribute(sensorNode, "step", "-1.0")); if (name != null && number != -1) { final String inputName = name.replaceAll("Phidget IK Sensor ", ""); final IntfKitSensor sensor = new IntfKitSensor(); sensor.setInputNumber(number); sensor.setInputName(name); sensor.setUnits(units); sensor.setExpression(expression); sensor.setFormat(format); sensor.setMinValue(min); sensor.setMaxValue(max); sensor.setStepValue(step); phidgets.put(inputName, sensor); } } } settings.setPhidgetSensors(phidgets); } } settings.setLoggerPluginPorts(pluginPorts); } } return settings; } private Color unmarshallColor(Node colorNode) { return new Color(unmarshallAttribute(colorNode, "r", 155), unmarshallAttribute(colorNode, "g", 155), unmarshallAttribute(colorNode, "b", 155)); } private Settings unmarshallClipboardFormat(Node formatNode, Settings settings) { String tableClipboardFormat = unmarshallAttribute(formatNode, Settings.TABLE_CLIPBOARD_FORMAT_ATTRIBUTE, Settings.DEFAULT_CLIPBOARD_FORMAT); if(tableClipboardFormat.equalsIgnoreCase(Settings.CUSTOM_CLIPBOARD_FORMAT)) { settings.setTableClipboardFormat(Settings.CUSTOM_CLIPBOARD_FORMAT); } else if (tableClipboardFormat.equalsIgnoreCase(Settings.AIRBOYS_CLIPBOARD_FORMAT)) { settings.setAirboysFormat(); return settings; } else { settings.setDefaultFormat(); return settings; } NodeList tableFormats = formatNode.getChildNodes(); for( int i = 0; i < tableFormats.getLength(); i++) { Node tableNode = tableFormats.item(i); if(tableNode.getNodeType() == ELEMENT_NODE) { if(tableNode.getNodeName().equalsIgnoreCase(Settings.TABLE_ELEMENT)) { settings.setTableHeader(unmarshallAttribute(tableNode, Settings.TABLE_HEADER_ATTRIBUTE, Settings.DEFAULT_TABLE_HEADER)); } else if(tableNode.getNodeName().equalsIgnoreCase(Settings.TABLE1D_ELEMENT)) { settings.setTable1DHeader(unmarshallAttribute(tableNode, Settings.TABLE_HEADER_ATTRIBUTE, Settings.DEFAULT_TABLE1D_HEADER)); } else if(tableNode.getNodeName().equalsIgnoreCase(Settings.TABLE2D_ELEMENT)) { settings.setTable2DHeader(unmarshallAttribute(tableNode, Settings.TABLE_HEADER_ATTRIBUTE, Settings.DEFAULT_TABLE2D_HEADER)); } else if(tableNode.getNodeName().equalsIgnoreCase(Settings.TABLE3D_ELEMENT)) { settings.setTable3DHeader(unmarshallAttribute(tableNode, Settings.TABLE_HEADER_ATTRIBUTE, Settings.DEFAULT_TABLE3D_HEADER)); } } } return settings; } private Settings unmarshallIcons(Node iconsNode, Settings settings) { NodeList iconScales = iconsNode.getChildNodes(); for(int i = 0; i < iconScales.getLength(); i++) { Node scaleNode = iconScales.item(i); if(scaleNode.getNodeType() == ELEMENT_NODE) { if(scaleNode.getNodeName().equalsIgnoreCase(Settings.EDITOR_ICONS_ELEMENT_NAME)) { try{ settings.setEditorIconScale(unmarshallAttribute(scaleNode, Settings.EDITOR_ICONS_SCALE_ATTRIBUTE_NAME, Settings.DEFAULT_EDITOR_ICON_SCALE)); } catch(NumberFormatException ex) { settings.setEditorIconScale(Settings.DEFAULT_EDITOR_ICON_SCALE); } } else if(scaleNode.getNodeName().equalsIgnoreCase(Settings.TABLE_ICONS_ELEMENT_NAME)) { try{ settings.setTableIconScale(unmarshallAttribute(scaleNode, Settings.TABLE_ICONS_SCALE_ATTRIBUTE_NAME, Settings.DEFAULT_TABLE_ICON_SCALE)); } catch(NumberFormatException ex) { settings.setTableIconScale(Settings.DEFAULT_TABLE_ICON_SCALE); } } } } return settings; } }