mirror of
https://github.com/wichtounet/thor-os.git
synced 2025-09-08 20:10:04 -04:00
Improve dynamic values support
This commit is contained in:
parent
6896716b23
commit
90e1e89f80
@ -38,9 +38,11 @@ public:
|
||||
};
|
||||
|
||||
typedef std::string (*dynamic_fun_t)();
|
||||
typedef std::string (*dynamic_fun_data_t)(void* data);
|
||||
|
||||
void set_constant_value(const path& mount_point, const path& file_path, const std::string& value);
|
||||
void set_dynamic_value(const path& mount_point, const path& file_path, dynamic_fun_t fun);
|
||||
void set_dynamic_value_data(const path& mount_point, const path& file_path, dynamic_fun_data_t fun, void* data);
|
||||
|
||||
void delete_value(const path& mount_point, const path& file_path);
|
||||
void delete_folder(const path& mount_point, const path& file_path);
|
||||
|
@ -21,7 +21,9 @@ namespace {
|
||||
struct sys_value {
|
||||
std::string name;
|
||||
std::string _value;
|
||||
sysfs::dynamic_fun_t fun = nullptr;
|
||||
sysfs::dynamic_fun_t fun = nullptr;
|
||||
sysfs::dynamic_fun_data_t fun_data = nullptr;
|
||||
void* data = nullptr;
|
||||
|
||||
sys_value() {}
|
||||
sys_value(std::string name, std::string value)
|
||||
@ -34,8 +36,15 @@ struct sys_value {
|
||||
//Nothing else to init
|
||||
}
|
||||
|
||||
sys_value(std::string name, sysfs::dynamic_fun_data_t fun_data, void* data)
|
||||
: name(name), fun_data(fun_data), data(data) {
|
||||
//Nothing else to init
|
||||
}
|
||||
|
||||
std::string value() const {
|
||||
if (fun) {
|
||||
if (fun_data){
|
||||
return fun_data(data);
|
||||
} else if (fun) {
|
||||
return fun();
|
||||
} else {
|
||||
return _value;
|
||||
@ -195,6 +204,18 @@ void set_value(sys_folder& folder, const std::string& name, sysfs::dynamic_fun_t
|
||||
folder.values.emplace_back(name, fun);
|
||||
}
|
||||
|
||||
void set_value(sys_folder& folder, const std::string& name, sysfs::dynamic_fun_data_t fun, void* data) {
|
||||
for (auto& v : folder.values) {
|
||||
if (v.name == name) {
|
||||
v.fun_data = fun;
|
||||
v.data = data;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
folder.values.emplace_back(name, fun, data);
|
||||
}
|
||||
|
||||
void delete_value(sys_folder& folder, const std::string& name) {
|
||||
folder.values.erase(std::remove_if(folder.values.begin(), folder.values.end(), [&name](const sys_value& value){
|
||||
return value.name == name;
|
||||
@ -333,6 +354,17 @@ void sysfs::set_dynamic_value(const path& mount_point, const path& file_path, dy
|
||||
}
|
||||
}
|
||||
|
||||
void sysfs::set_dynamic_value_data(const path& mount_point, const path& file_path, dynamic_fun_data_t fun, void* data) {
|
||||
auto& root_folder = find_root_folder(mount_point);
|
||||
|
||||
if (file_path.size() == 2) {
|
||||
::set_value(root_folder, file_path.base_name(), fun, data);
|
||||
} else {
|
||||
auto& folder = find_folder(root_folder, file_path, 1, file_path.size() - 1);
|
||||
::set_value(folder, file_path.base_name(), fun, data);
|
||||
}
|
||||
}
|
||||
|
||||
void sysfs::delete_value(const path& mount_point, const path& file_path) {
|
||||
auto& root_folder = find_root_folder(mount_point);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user