feat: support set application's working directory
Signed-off-by: ComixHe <heyuming@deepin.org>
This commit is contained in:
		@ -96,6 +96,9 @@
 | 
			
		||||
                       2. `env` (type s):
 | 
			
		||||
                          passing some specific environment variables to Launch
 | 
			
		||||
                          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:
 | 
			
		||||
                       When application launched with `uid` option,
 | 
			
		||||
                       `env` option will not take effect at all."
 | 
			
		||||
 | 
			
		||||
@ -141,13 +141,14 @@ int processExecStart(msg_ptr &msg, const std::deque<std::string_view> &execArgs)
 | 
			
		||||
 | 
			
		||||
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()) {
 | 
			
		||||
        return it->second;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return DBusValueType::Default;
 | 
			
		||||
    return DBusValueType::String;  // fallback to string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int appendPropValue(msg_ptr &msg, DBusValueType type, std::string_view value)
 | 
			
		||||
 | 
			
		||||
@ -12,7 +12,7 @@
 | 
			
		||||
 | 
			
		||||
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 bus_ptr = sd_bus *;
 | 
			
		||||
 | 
			
		||||
@ -8,7 +8,7 @@
 | 
			
		||||
std::unique_ptr<VariantValue> creatValueHandler(msg_ptr &msg, DBusValueType type)
 | 
			
		||||
{
 | 
			
		||||
    switch (type) {
 | 
			
		||||
    case DBusValueType::Default:
 | 
			
		||||
    case DBusValueType::String:
 | 
			
		||||
        return std::make_unique<StringValue>(msg);
 | 
			
		||||
    case DBusValueType::ArrayOfString:
 | 
			
		||||
        return std::make_unique<ASValue>(msg);
 | 
			
		||||
 | 
			
		||||
@ -19,6 +19,8 @@ QStringList generateCommand(const QVariantMap &props) noexcept
 | 
			
		||||
            options.emplace_back(std::make_unique<setEnvLaunchOption>(value));
 | 
			
		||||
        } else if (key == hookLaunchOption::key()) {
 | 
			
		||||
            options.emplace_back(std::make_unique<hookLaunchOption>(value));
 | 
			
		||||
        } else if (key == setPathLaunchOption::key()) {
 | 
			
		||||
            options.emplace_back(std::make_unique<setPathLaunchOption>(value));
 | 
			
		||||
        } else {
 | 
			
		||||
            qWarning() << "unsupported options" << key;
 | 
			
		||||
        }
 | 
			
		||||
@ -106,3 +108,13 @@ QStringList setEnvLaunchOption::generateCommandLine() const noexcept
 | 
			
		||||
 | 
			
		||||
    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)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -94,4 +94,20 @@ struct hookLaunchOption : public LaunchOption
 | 
			
		||||
    [[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;
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user