feat: support set application's working directory

Signed-off-by: ComixHe <heyuming@deepin.org>
This commit is contained in:
ComixHe 2023-10-07 18:11:22 +08:00 committed by Comix
parent fb0fc0a8ee
commit 8970298ad0
6 changed files with 36 additions and 4 deletions

View File

@ -96,6 +96,9 @@
2. `env` (type s): 2. `env` (type s):
passing some specific environment variables to Launch passing some specific environment variables to Launch
this application, eg. 'LANG=en_US;PATH=xxx:yyy;' this application, eg. 'LANG=en_US;PATH=xxx:yyy;'
3. `path` (type s):
set this application's working directory, please pass
absoult directory path.
NOTE: NOTE:
When application launched with `uid` option, When application launched with `uid` option,
`env` option will not take effect at all." `env` option will not take effect at all."

View File

@ -141,13 +141,14 @@ int processExecStart(msg_ptr &msg, const std::deque<std::string_view> &execArgs)
DBusValueType getPropType(std::string_view key) DBusValueType getPropType(std::string_view key)
{ {
static std::unordered_map<std::string_view, DBusValueType> map{{"Environment", DBusValueType::ArrayOfString}}; static std::unordered_map<std::string_view, DBusValueType> map{{"Environment", DBusValueType::ArrayOfString},
{"WorkingDirectory", DBusValueType::String}};
if (auto it = map.find(key); it != map.cend()) { if (auto it = map.find(key); it != map.cend()) {
return it->second; return it->second;
} }
return DBusValueType::Default; return DBusValueType::String; // fallback to string
} }
int appendPropValue(msg_ptr &msg, DBusValueType type, std::string_view value) int appendPropValue(msg_ptr &msg, DBusValueType type, std::string_view value)

View File

@ -12,7 +12,7 @@
enum class ExitCode { SystemdError = -3, InvalidInput = -2, InternalError = -1, Done = 0, Waiting = 1 }; enum class ExitCode { SystemdError = -3, InvalidInput = -2, InternalError = -1, Done = 0, Waiting = 1 };
enum class DBusValueType { Default, ArrayOfString }; enum class DBusValueType { String, ArrayOfString };
using msg_ptr = sd_bus_message *; using msg_ptr = sd_bus_message *;
using bus_ptr = sd_bus *; using bus_ptr = sd_bus *;

View File

@ -8,7 +8,7 @@
std::unique_ptr<VariantValue> creatValueHandler(msg_ptr &msg, DBusValueType type) std::unique_ptr<VariantValue> creatValueHandler(msg_ptr &msg, DBusValueType type)
{ {
switch (type) { switch (type) {
case DBusValueType::Default: case DBusValueType::String:
return std::make_unique<StringValue>(msg); return std::make_unique<StringValue>(msg);
case DBusValueType::ArrayOfString: case DBusValueType::ArrayOfString:
return std::make_unique<ASValue>(msg); return std::make_unique<ASValue>(msg);

View File

@ -19,6 +19,8 @@ QStringList generateCommand(const QVariantMap &props) noexcept
options.emplace_back(std::make_unique<setEnvLaunchOption>(value)); options.emplace_back(std::make_unique<setEnvLaunchOption>(value));
} else if (key == hookLaunchOption::key()) { } else if (key == hookLaunchOption::key()) {
options.emplace_back(std::make_unique<hookLaunchOption>(value)); options.emplace_back(std::make_unique<hookLaunchOption>(value));
} else if (key == setPathLaunchOption::key()) {
options.emplace_back(std::make_unique<setPathLaunchOption>(value));
} else { } else {
qWarning() << "unsupported options" << key; qWarning() << "unsupported options" << key;
} }
@ -106,3 +108,13 @@ QStringList setEnvLaunchOption::generateCommandLine() const noexcept
return QStringList{QString{"--Environment=%1"}.arg(str)}; return QStringList{QString{"--Environment=%1"}.arg(str)};
} }
QStringList setPathLaunchOption::generateCommandLine() const noexcept
{
auto str = m_val.toString();
if (str.isEmpty()) {
return {};
}
return QStringList{QString{"--WorkingDirectory=%1"}.arg(str)};
}

View File

@ -94,4 +94,20 @@ struct hookLaunchOption : public LaunchOption
[[nodiscard]] QStringList generateCommandLine() const noexcept override { return m_val.toStringList(); }; [[nodiscard]] QStringList generateCommandLine() const noexcept override { return m_val.toStringList(); };
}; };
struct setPathLaunchOption : public LaunchOption
{
using LaunchOption::LaunchOption;
[[nodiscard]] const QString &type() const noexcept override
{
static QString tp{systemdOption};
return tp;
}
[[nodiscard]] static const QString &key() noexcept
{
static QString path{"path"};
return path;
}
[[nodiscard]] QStringList generateCommandLine() const noexcept override;
};
QStringList generateCommand(const QVariantMap &props) noexcept; QStringList generateCommand(const QVariantMap &props) noexcept;