Improve dynamic values support

This commit is contained in:
Baptiste Wicht 2016-09-25 14:43:52 +02:00
parent 6896716b23
commit 90e1e89f80
2 changed files with 36 additions and 2 deletions

View File

@ -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);

View File

@ -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);