package hextostring;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.nio.charset.Charset;
import hextostring.debug.DebuggingFlags;
import hextostring.replacement.Replacements;
import hextostring.utils.Charsets;
import main.options.Options;
import main.options.ValueClass;
import main.options.annotations.CommandLineArgument;
import main.options.domain.Bounds;
import main.options.domain.Values;
import main.options.parser.ArgumentParser;
import main.options.parser.ReplacementsParser;
/**
* Options for string conversion.
*
* @author Maxime PIA
*/
public class ConvertOptions extends Options implements Serializable {
/**
* Backward-compatible with 0.7.0
*/
private static final long serialVersionUID = 00000000007000001L;
public static final int DEFAULT_STRICTNESS = 35;
public static final Charset DEFAULT_CHARSET = Charsets.DETECT;
public static final boolean DEFAULT_AUTOCOPY = true;
public static final Replacements DEFAULT_REPLACEMENTS = new Replacements();
public static final long DEFAULT_DEBUGGING_FLAGS = 0;
@CommandLineArgument(
command = "strictness",
description = "The strictness of the conversion.\nThe strictness is a "
+ "value determining at what point a string is considered garbage "
+ "and should not be displayed. The lower the value, the higher "
+ "the chance of having garbage in the result. The higher the "
+ "value, the higher the chance of mistakenly excluding a valid "
+ "string."
)
private Integer strictness = DEFAULT_STRICTNESS;
public static final Bounds<Integer> STRICTNESS_DOMAIN =
new Bounds<>(-500, 500);
@CommandLineArgument(
command = "encoding",
description = "Defines the encoding used to decode the input"
)
private transient Charset charset = DEFAULT_CHARSET;
public static final Values<Charset> CHARSET_DOMAIN =
new Values<>(Charsets.ALL_CHARSETS);
public static final Class<? extends ValueClass> CHARSET_VALUE_CLASS =
Charsets.class;
@CommandLineArgument(
command = "autocopy",
description = "Defines whether or not to automatically copy newly "
+ "converted strings in the clipboard."
)
private Boolean autocopy = DEFAULT_AUTOCOPY;
@CommandLineArgument(
command = "debug",
description = "Aimed at developers. Sets debugging flags.",
usageExample = "--debug=i6n",
flags = true
)
private Long debuggingFlags = DEFAULT_DEBUGGING_FLAGS;
public static final
Class<? extends ValueClass> DEBUGGING_FLAGS_VALUE_CLASS =
DebuggingFlags.class;
@CommandLineArgument(
command = "replacements",
description = "Replacements of sequences and patterns at different "
+ "steps of the convertion process.",
usage = "{[0x]\"<string>\">[0x]\"<string>\"[e][r]} "
+ "(values are commas separated) where: \n"
+ " - <string> represent respectively either a sequence of "
+ "hexadecimal numbers or a string.\n"
+ " Replacements of strings to hexadecimal is forbidden.\n"
+ " - 0x is optional and indicates that the following string is "
+ "interpreted as hexadecimal or a pattern of hexadecimal.\n"
+ " - e is optional and indicates that antislashes must be "
+ "interpreted as an escaping character.\n"
+ " - r is optional and indicates that X is a regular expression "
+ "and Y its replacement, possibly containg backward references to "
+ "groups in X.",
usageExample = "--replacements=\"#RUBS(.*?)#RUBE\">\"[$1]\"r,"
+ "0x\"8745\">\"\\u2049\"e"
)
private Replacements replacements = DEFAULT_REPLACEMENTS;
public static final
Class<? extends ArgumentParser<Replacements>> REPLACEMENTS_PARSER =
ReplacementsParser.class;
public ConvertOptions() {
super();
}
/**
* Getter on the strictness of the conversion process.
*
* @return The strictness of the program.
*/
public synchronized int getStrictness() {
return strictness;
}
/**
* Setter on the strictness of the conversion process.
*
* @param strictness
* The new strictness of the program.
*/
public synchronized void setStrictness(int strictness) {
this.strictness = strictness;
}
/**
* Getter on the debugging flags currently activated.
*
* @return The debug level of the program.
*/
public synchronized long getDebuggingFlags() {
return debuggingFlags;
}
/**
* Setter on the debugging flags currently activated.
*
* @param flags
* The flags affecting the current value.
* @param add
* True to add the value to the current flags, false to remove it.
*/
public synchronized void setDebuggingFlags(long flags, boolean add) {
debuggingFlags = add
? (debuggingFlags | flags)
: (debuggingFlags & ~flags);
}
/**
* Getter on the charset to work with.
*
* @return The charset in which to convert hex input strings.
*/
public synchronized Charset getCharset() {
return charset;
}
/**
* Setter on the charset to work with.
*
* @param charset
* The new charset in which to convert hex input strings.
*/
public synchronized void setCharset(Charset charset) {
this.charset = charset;
}
/**
* Getter on whether or not the conversion result is set to the clipboard.
*
* @return Whether or not the conversion result is set to the clipboard.
*/
public synchronized boolean isAutocopy() {
return autocopy;
}
/**
* Setter on whether or not the conversion result is set to the clipboard.
*
* @param autocopy
* True if the conversion result is set to the clipboard.
*/
public synchronized void setAutocopy(boolean autocopy) {
this.autocopy = autocopy;
}
/**
* Getter on the replacements.
*
* @return The replacements.
*/
public synchronized Replacements getReplacements() {
return replacements;
}
private void writeObject(ObjectOutputStream out) throws IOException {
serialize(out);
}
private void readObject(ObjectInputStream in) throws IOException,
ClassNotFoundException {
deserialize(in);
}
}