/* * Copyright (C) 2015-2017 PÂRIS Quentin * * 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 org.phoenicis.win32.registry; public class RegistryValue<T extends AbstractValueType> extends AbstractRegistryNode { private final T content; public RegistryValue(String name, T content) { super(name); this.content = content; } public static RegistryValue<AbstractValueType> fromString(String name, String inputString) { RegistryValue<AbstractValueType> parsedValue; if (inputString.startsWith("\"") && inputString.endsWith("\"")) { String valueContentString = inputString.substring(1, inputString.length() - 1); valueContentString = valueContentString.replaceAll("\\\\\\\"", "\""); valueContentString = valueContentString.replaceAll("\\\\\\\\", "\\\\"); if (valueContentString.endsWith("\\0")) { valueContentString = valueContentString.substring(0, valueContentString.length() - 2); } parsedValue = new RegistryValue<>(name, new StringValueType(valueContentString)); } else if (inputString.contains(":")) { int colPosition = inputString.indexOf(':'); final String valueTypeString = inputString.substring(0, colPosition); String valueContentString = inputString.substring(colPosition + 1, inputString.length()); if (valueContentString.endsWith("\\0")) { valueContentString = valueContentString.substring(0, valueContentString.length() - 2); } switch (valueTypeString) { case "str(7)": // Multi String parsedValue = new RegistryValue<>(name, new MultiStringValueType(valueContentString)); break; case "str(2)": // Expandable String parsedValue = new RegistryValue<>(name, new ExpandableValueType(valueContentString)); break; case "dword": // DWORD long dwordValue = Long.valueOf(valueContentString, 16); parsedValue = new RegistryValue<>(name, new DwordValueType(dwordValue)); break; case "hex": // Binary case "hex(6)": // FIXME case "hex(2)": case "hex(7)": String[] binariesString = valueContentString.split(","); byte[] binaries = new byte[binariesString.length]; for (int i = 0; i < binariesString.length; i++) { binaries[i] = (byte) (Integer.valueOf(binariesString[i], 16) - 128); } parsedValue = new RegistryValue<>(name, new BinaryValueType(binaries)); break; default: parsedValue = new RegistryValue<>(name, new StringValueType("")); // FIXME break; } } else { throw new IllegalArgumentException(String.format("Unable to format registry line: %s", inputString)); } return parsedValue; } public String getText() { return content.getText(); } @Override public String toString() { return String.format("- (%s) %s -> %s", content.getClass().getSimpleName(), this.getName(), content.getText()); } @Override public String toRegString() { return String.format("\"%s\"=%s", this.getName(), content.toRegString()); } }