package com.termux.shared.models; import android.app.PendingIntent; import androidx.annotation.NonNull; import com.termux.shared.logger.Logger; import com.termux.shared.markdown.MarkdownUtils; import java.util.Formatter; public class ResultConfig { /** Defines {@link PendingIntent} that should be sent with the result of the command. We cannot * implement {@link java.io.Serializable} because {@link PendingIntent} cannot be serialized. */ public PendingIntent resultPendingIntent; /** The key with which to send result {@link android.os.Bundle} in {@link #resultPendingIntent}. */ public String resultBundleKey; /** The key with which to send {@link ResultData#stdout} in {@link #resultPendingIntent}. */ public String resultStdoutKey; /** The key with which to send {@link ResultData#stderr} in {@link #resultPendingIntent}. */ public String resultStderrKey; /** The key with which to send {@link ResultData#exitCode} in {@link #resultPendingIntent}. */ public String resultExitCodeKey; /** The key with which to send {@link ResultData#errorsList} errCode in {@link #resultPendingIntent}. */ public String resultErrCodeKey; /** The key with which to send {@link ResultData#errorsList} errmsg in {@link #resultPendingIntent}. */ public String resultErrmsgKey; /** The key with which to send original length of {@link ResultData#stdout} in {@link #resultPendingIntent}. */ public String resultStdoutOriginalLengthKey; /** The key with which to send original length of {@link ResultData#stderr} in {@link #resultPendingIntent}. */ public String resultStderrOriginalLengthKey; /** Defines the directory path in which to write the result of the command. */ public String resultDirectoryPath; /** Defines the directory path under which {@link #resultDirectoryPath} can exist. */ public String resultDirectoryAllowedParentPath; /** Defines whether the result should be written to a single file or multiple files * (err, error, stdout, stderr, exit_code) in {@link #resultDirectoryPath}. */ public boolean resultSingleFile; /** Defines the basename of the result file that should be created in {@link #resultDirectoryPath} * if {@link #resultSingleFile} is {@code true}. */ public String resultFileBasename; /** Defines the output {@link Formatter} format of the {@link #resultFileBasename} result file. */ public String resultFileOutputFormat; /** Defines the error {@link Formatter} format of the {@link #resultFileBasename} result file. */ public String resultFileErrorFormat; /** Defines the suffix of the result files that should be created in {@link #resultDirectoryPath} * if {@link #resultSingleFile} is {@code true}. */ public String resultFilesSuffix; public ResultConfig() { } public boolean isCommandWithPendingResult() { return resultPendingIntent != null || resultDirectoryPath != null; } @NonNull @Override public String toString() { return getResultConfigLogString(this, true); } /** * Get a log friendly {@link String} for {@link ResultConfig} parameters. * * @param resultConfig The {@link ResultConfig} to convert. * @param ignoreNull Set to {@code true} if non-critical {@code null} values are to be ignored. * @return Returns the log friendly {@link String}. */ public static String getResultConfigLogString(final ResultConfig resultConfig, boolean ignoreNull) { if (resultConfig == null) return "null"; StringBuilder logString = new StringBuilder(); logString.append("Result Pending: `").append(resultConfig.isCommandWithPendingResult()).append("`\n"); if (resultConfig.resultPendingIntent != null) { logString.append(resultConfig.getResultPendingIntentVariablesLogString(ignoreNull)); if (resultConfig.resultDirectoryPath != null) logString.append("\n"); } if (resultConfig.resultDirectoryPath != null && !resultConfig.resultDirectoryPath.isEmpty()) logString.append(resultConfig.getResultDirectoryVariablesLogString(ignoreNull)); return logString.toString(); } public String getResultPendingIntentVariablesLogString(boolean ignoreNull) { if (resultPendingIntent == null) return "Result PendingIntent Creator: -"; StringBuilder resultPendingIntentVariablesString = new StringBuilder(); resultPendingIntentVariablesString.append("Result PendingIntent Creator: `").append(resultPendingIntent.getCreatorPackage()).append("`"); if (!ignoreNull || resultBundleKey != null) resultPendingIntentVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result Bundle Key", resultBundleKey, "-")); if (!ignoreNull || resultStdoutKey != null) resultPendingIntentVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result Stdout Key", resultStdoutKey, "-")); if (!ignoreNull || resultStderrKey != null) resultPendingIntentVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result Stderr Key", resultStderrKey, "-")); if (!ignoreNull || resultExitCodeKey != null) resultPendingIntentVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result Exit Code Key", resultExitCodeKey, "-")); if (!ignoreNull || resultErrCodeKey != null) resultPendingIntentVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result Err Code Key", resultErrCodeKey, "-")); if (!ignoreNull || resultErrmsgKey != null) resultPendingIntentVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result Error Key", resultErrmsgKey, "-")); if (!ignoreNull || resultStdoutOriginalLengthKey != null) resultPendingIntentVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result Stdout Original Length Key", resultStdoutOriginalLengthKey, "-")); if (!ignoreNull || resultStderrOriginalLengthKey != null) resultPendingIntentVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result Stderr Original Length Key", resultStderrOriginalLengthKey, "-")); return resultPendingIntentVariablesString.toString(); } public String getResultDirectoryVariablesLogString(boolean ignoreNull) { if (resultDirectoryPath == null) return "Result Directory Path: -"; StringBuilder resultDirectoryVariablesString = new StringBuilder(); resultDirectoryVariablesString.append(Logger.getSingleLineLogStringEntry("Result Directory Path", resultDirectoryPath, "-")); resultDirectoryVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result Single File", resultSingleFile, "-")); if (!ignoreNull || resultFileBasename != null) resultDirectoryVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result File Basename", resultFileBasename, "-")); if (!ignoreNull || resultFileOutputFormat != null) resultDirectoryVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result File Output Format", resultFileOutputFormat, "-")); if (!ignoreNull || resultFileErrorFormat != null) resultDirectoryVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result File Error Format", resultFileErrorFormat, "-")); if (!ignoreNull || resultFilesSuffix != null) resultDirectoryVariablesString.append("\n").append(Logger.getSingleLineLogStringEntry("Result Files Suffix", resultFilesSuffix, "-")); return resultDirectoryVariablesString.toString(); } /** * Get a markdown {@link String} for {@link ResultConfig}. * * @param resultConfig The {@link ResultConfig} to convert. * @return Returns the markdown {@link String}. */ public static String getResultConfigMarkdownString(final ResultConfig resultConfig) { if (resultConfig == null) return "null"; StringBuilder markdownString = new StringBuilder(); if (resultConfig.resultPendingIntent != null) markdownString.append(MarkdownUtils.getSingleLineMarkdownStringEntry("Result PendingIntent Creator", resultConfig.resultPendingIntent.getCreatorPackage(), "-")); else markdownString.append("**Result PendingIntent Creator:** - "); if (resultConfig.resultDirectoryPath != null) { markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("Result Directory Path", resultConfig.resultDirectoryPath, "-")); markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("Result Single File", resultConfig.resultSingleFile, "-")); markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("Result File Basename", resultConfig.resultFileBasename, "-")); markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("Result File Output Format", resultConfig.resultFileOutputFormat, "-")); markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("Result File Error Format", resultConfig.resultFileErrorFormat, "-")); markdownString.append("\n").append(MarkdownUtils.getSingleLineMarkdownStringEntry("Result Files Suffix", resultConfig.resultFilesSuffix, "-")); } return markdownString.toString(); } }