diff --git a/repos/gems/src/app/phone_manager/main.cc b/repos/gems/src/app/phone_manager/main.cc index 11304c922d..edad695579 100644 --- a/repos/gems/src/app/phone_manager/main.cc +++ b/repos/gems/src/app/phone_manager/main.cc @@ -182,7 +182,7 @@ struct Sculpt::Main : Input_event_handler, _system_config.generate([&] (Xml_generator &xml) { _system.generate(xml, _screensaver); }); } - void _handle_system_config(Xml_node node) + void _handle_system_config(Xml_node const &node) { _system = System::from_xml(node); _update_managed_system_config(); @@ -251,17 +251,10 @@ struct Sculpt::Main : Input_event_handler, bool _verbose_modem = false; - Attached_rom_dataspace _config { _env, "config" }; + Rom_handler
_config { _env, "config", *this, &Main::_handle_config }; - Signal_handler
_config_handler { - _env.ep(), *this, &Main::_handle_config }; - - void _handle_config() + void _handle_config(Xml_node const &config) { - _config.update(); - - Xml_node const config = _config.xml(); - _verbose_modem = config.attribute_value("verbose_modem", false); } @@ -277,21 +270,17 @@ struct Sculpt::Main : Input_event_handler, generate_runtime_config(); } - Attached_rom_dataspace _leitzentrale_rom { _env, "leitzentrale" }; + Rom_handler
_leitzentrale_rom { + _env, "leitzentrale", *this, &Main::_handle_leitzentrale }; - Signal_handler
_leitzentrale_handler { - _env.ep(), *this, &Main::_handle_leitzentrale }; - - void _handle_leitzentrale() + void _handle_leitzentrale(Xml_node const &leitzentrale) { - _leitzentrale_rom.update(); - - _leitzentrale_visible = _leitzentrale_rom.xml().attribute_value("enabled", false); + _leitzentrale_visible = leitzentrale.attribute_value("enabled", false); /* disable automatic blanking while the application runtime is visible */ _screensaver.blank_after_some_time(_leitzentrale_visible); - _handle_window_layout(); + _update_window_layout(); } @@ -411,13 +400,10 @@ struct Sculpt::Main : Input_event_handler, ** Update ** ************/ - Attached_rom_dataspace _update_state_rom { - _env, "report -> runtime/update/state" }; + Rom_handler
_update_state_rom { + _env, "report -> runtime/update/state", *this, &Main::_handle_update_state }; - void _handle_update_state(); - - Signal_handler
_update_state_handler { - _env.ep(), *this, &Main::_handle_update_state }; + void _handle_update_state(Xml_node const &); /** * Condition for spawning the update subsystem @@ -482,18 +468,18 @@ struct Sculpt::Main : Input_event_handler, xml.attribute("arch", _deploy._arch); xml.attribute("version", _query_version.value); - if (_software_tab_watches_depot() || _scan_rom.xml().has_type("empty")) + if (_software_tab_watches_depot() || !_scan_rom.valid()) xml.node("scan", [&] { xml.attribute("users", "yes"); }); - if (_software_tab_watches_depot() || _image_index_rom.xml().has_type("empty")) + if (_software_tab_watches_depot() || !_image_index_rom.valid()) xml.node("index", [&] { xml.attribute("user", _index_user); xml.attribute("version", _sculpt_version); xml.attribute("content", "yes"); }); - if (_software_tab_watches_depot() || _image_index_rom.xml().has_type("empty")) + if (_software_tab_watches_depot() || !_image_index_rom.valid()) xml.node("image_index", [&] { xml.attribute("os", "sculpt"); xml.attribute("board", _build_info.board); @@ -530,15 +516,11 @@ struct Sculpt::Main : Input_event_handler, ** Browse index ** ******************/ - Attached_rom_dataspace _index_rom { _env, "report -> runtime/depot_query/index" }; + Rom_handler
_index_rom { + _env, "report -> runtime/depot_query/index", *this, &Main::_handle_index }; - Signal_handler
_index_handler { - _env.ep(), *this, &Main::_handle_index }; - - void _handle_index() + void _handle_index(Xml_node const &) { - _index_rom.update(); - bool const software_add_widget_shown = _software_title_bar.selected() && _software_tabs_widget.hosted.add_selected(); if (software_add_widget_shown) @@ -559,17 +541,11 @@ struct Sculpt::Main : Input_event_handler, ** Blueprint query ** *********************/ - Attached_rom_dataspace _blueprint_rom { _env, "report -> runtime/depot_query/blueprint" }; + Rom_handler
_blueprint_rom { + _env, "report -> runtime/depot_query/blueprint", *this, &Main::_handle_blueprint }; - Signal_handler
_blueprint_handler { - _env.ep(), *this, &Main::_handle_blueprint }; - - void _handle_blueprint() + void _handle_blueprint(Xml_node const &blueprint) { - _blueprint_rom.update(); - - Xml_node const blueprint = _blueprint_rom.xml(); - /* * Drop intermediate results that will be superseded by a newer query. * This is important because an outdated blueprint would be disregarded @@ -594,42 +570,30 @@ struct Sculpt::Main : Input_event_handler, Deploy::Prio_levels const _prio_levels { 4 }; - Attached_rom_dataspace _scan_rom { _env, "report -> runtime/depot_query/scan" }; + Rom_handler
_scan_rom { + _env, "report -> runtime/depot_query/scan", *this, &Main::_handle_scan }; - Signal_handler
_scan_handler { _env.ep(), *this, &Main::_handle_scan }; - - void _handle_scan() + void _handle_scan(Xml_node const &) { - _scan_rom.update(); _generate_dialog(); _software_update_widget.hosted.sanitize_user_selection(); _software_add_widget.hosted.sanitize_user_selection(); } - Attached_rom_dataspace _image_index_rom { _env, "report -> runtime/depot_query/image_index" }; + Rom_handler
_image_index_rom { + _env, "report -> runtime/depot_query/image_index", *this, &Main::_handle_image_index }; - Signal_handler
_image_index_handler { _env.ep(), *this, &Main::_handle_image_index }; - - void _handle_image_index() - { - _image_index_rom.update(); - _generate_dialog(); - } - - Attached_rom_dataspace _launcher_listing_rom { - _env, "report -> /runtime/launcher_query/listing" }; + void _handle_image_index(Xml_node const &) { _generate_dialog(); } Launchers _launchers { _heap }; Presets _presets { _heap }; - Signal_handler
_launcher_and_preset_listing_handler { - _env.ep(), *this, &Main::_handle_launcher_and_preset_listing }; + Rom_handler
_launcher_listing_rom { + _env, "report -> /runtime/launcher_query/listing", *this, + &Main::_handle_launcher_and_preset_listing }; - void _handle_launcher_and_preset_listing() + void _handle_launcher_and_preset_listing(Xml_node const &listing) { - _launcher_listing_rom.update(); - - Xml_node const listing = _launcher_listing_rom.xml(); listing.for_each_sub_node("dir", [&] (Xml_node const &dir) { Path const dir_path = dir.attribute_value("path", Path()); @@ -642,7 +606,7 @@ struct Sculpt::Main : Input_event_handler, }); _generate_dialog(); - _deploy._handle_managed_deploy(); + _deploy.handle_deploy(); } Deploy _deploy { _env, _heap, _child_states, _runtime_state, *this, *this, *this, @@ -653,19 +617,16 @@ struct Sculpt::Main : Input_event_handler, */ void refresh_deploy_dialog() override { _generate_dialog(); } - Attached_rom_dataspace _manual_deploy_rom { _env, "config -> deploy" }; + Rom_handler
_manual_deploy_rom { + _env, "config -> deploy", *this, &Main::_handle_manual_deploy }; - void _handle_manual_deploy() + void _handle_manual_deploy(Xml_node const &manual_deploy) { _runtime_state.reset_abandoned_and_launched_children(); - _manual_deploy_rom.update(); - _deploy.use_as_deploy_template(_manual_deploy_rom.xml()); + _deploy.use_as_deploy_template(manual_deploy); _deploy.update_managed_deploy_config(); } - Signal_handler
_manual_deploy_handler { - _env.ep(), *this, &Main::_handle_manual_deploy }; - /************ ** Global ** @@ -716,15 +677,16 @@ struct Sculpt::Main : Input_event_handler, }); } - Xml_node const state = main._update_state_rom.xml(); + main._update_state_rom.with_xml([&] (Xml_node const &state) { - bool const download_in_progress = - main._update_running() && state.attribute_value("progress", false); + bool const download_in_progress = + main._update_running() && state.attribute_value("progress", false); - if (download_in_progress || main._download_queue.any_failed_download()) { - Hosted download_status { Id { "Download" } }; - s.widget(download_status, state, main._download_queue); - } + if (download_in_progress || main._download_queue.any_failed_download()) { + Hosted download_status { Id { "Download" } }; + s.widget(download_status, state, main._download_queue); + } + }); }); } }; @@ -824,7 +786,7 @@ struct Sculpt::Main : Input_event_handler, _software_update_widget { Id { "software_update" }, _build_info, _network._nic_state, _download_queue, _index_update_queue, _file_operation_queue, - _scan_rom, _image_index_rom }; + _scan_rom }; Conditional_widget _software_version_widget { Id { "software_version" } }; @@ -953,10 +915,12 @@ struct Sculpt::Main : Input_event_handler, && _software_tabs_widget.hosted.add_selected() && _storage._sculpt_partition.valid()); - s.widget(_software_update_widget, _software_title_bar.selected() - && _software_tabs_widget.hosted.update_selected() - && _storage._sculpt_partition.valid(), - _image_index_rom.xml()); + _image_index_rom.with_xml([&] (Xml_node const &image_index) { + s.widget(_software_update_widget, _software_title_bar.selected() + && _software_tabs_widget.hosted.update_selected() + && _storage._sculpt_partition.valid(), + image_index); + }); s.widget(_software_version_widget, _software_title_bar.selected() && _software_tabs_widget.hosted.update_selected() @@ -987,7 +951,7 @@ struct Sculpt::Main : Input_event_handler, _touch_keyboard.visible = touch_keyboard_needed(); if (orig_touch_keyboard_visible != _touch_keyboard.visible) - _handle_window_layout(); + _update_window_layout(); } void _generate_dialog() @@ -997,7 +961,10 @@ struct Sculpt::Main : Input_event_handler, _main_view.refresh(); } - Attached_rom_dataspace _runtime_state_rom { _env, "report -> runtime/state" }; + Rom_handler
_runtime_state_rom { + _env, "report -> runtime/state", *this, &Main::_handle_runtime_state }; + + void _handle_runtime_state(Xml_node const &); Runtime_state _runtime_state { _heap, _storage._sculpt_partition }; @@ -1059,7 +1026,7 @@ struct Sculpt::Main : Input_event_handler, bool _manually_managed_runtime = false; - void _handle_runtime(Xml_node config) + void _handle_runtime(Xml_node const &config) { _manually_managed_runtime = !config.has_type("empty"); generate_runtime_config(); @@ -1078,11 +1045,6 @@ struct Sculpt::Main : Input_event_handler, _generate_runtime_config(xml); }); } - Signal_handler
_runtime_state_handler { - _env.ep(), *this, &Main::_handle_runtime_state }; - - void _handle_runtime_state(); - /******************** ** Touch keyboard ** @@ -1167,17 +1129,14 @@ struct Sculpt::Main : Input_event_handler, * manager, we still obtain it as a separate ROM session to keep the GUI * part decoupled from the lower-level runtime configuration generator. */ - Attached_rom_dataspace _runtime_config_rom { _env, "config -> managed/runtime" }; - - Signal_handler
_runtime_config_handler { - _env.ep(), *this, &Main::_handle_runtime_config }; + Rom_handler
_runtime_config_rom { + _env, "config -> managed/runtime", *this, &Main::_handle_runtime_config }; Runtime_config _cached_runtime_config { _heap }; - void _handle_runtime_config() + void _handle_runtime_config(Xml_node const &runtime_config) { - _runtime_config_rom.update(); - _cached_runtime_config.update_from_xml(_runtime_config_rom.xml()); + _cached_runtime_config.update_from_xml(runtime_config); _generate_dialog(); /* update graph */ } @@ -1311,7 +1270,25 @@ struct Sculpt::Main : Input_event_handler, _generate_dialog(); } - void _handle_window_layout(); + void _update_window_layout(Xml_node const &, Xml_node const &); + + void _update_window_layout() + { + _decorator_margins.with_xml([&] (Xml_node const &decorator_margins) { + _window_list.with_xml([&] (Xml_node const &window_list) { + _update_window_layout(decorator_margins, window_list); }); }); + } + + void _handle_window_layout_or_decorator_margins(Xml_node const &) + { + _update_window_layout(); + } + + Rom_handler
_window_list { + _env, "window_list", *this, &Main::_handle_window_layout_or_decorator_margins }; + + Rom_handler
_decorator_margins { + _env, "decorator_margins", *this, &Main::_handle_window_layout_or_decorator_margins }; template void _with_window(Xml_node window_list, String const &match, auto const &fn) @@ -1321,18 +1298,7 @@ struct Sculpt::Main : Input_event_handler, fn(win); }); } - Attached_rom_dataspace _window_list { _env, "window_list" }; - - Signal_handler
_window_list_handler { - _env.ep(), *this, &Main::_handle_window_layout }; - - Expanding_reporter _wm_focus { _env, "focus", "wm_focus" }; - - Attached_rom_dataspace _decorator_margins { _env, "decorator_margins" }; - - Signal_handler
_decorator_margins_handler { - _env.ep(), *this, &Main::_handle_window_layout }; - + Expanding_reporter _wm_focus { _env, "focus", "wm_focus" }; Expanding_reporter _window_layout { _env, "window_layout", "window_layout" }; void _reset_storage_widget_operation() @@ -1470,16 +1436,17 @@ struct Sculpt::Main : Input_event_handler, */ void load_deploy_preset(Presets::Info::Name const &name) override { - Xml_node const listing = _launcher_listing_rom.xml(); + _download_queue.remove_inactive_downloads(); - listing.for_each_sub_node("dir", [&] (Xml_node const &dir) { - if (dir.attribute_value("path", Path()) == "/presets") { - dir.for_each_sub_node("file", [&] (Xml_node const &file) { - if (file.attribute_value("name", Presets::Info::Name()) == name) { - file.with_optional_sub_node("config", [&] (Xml_node const &config) { - _runtime_state.reset_abandoned_and_launched_children(); - _deploy.use_as_deploy_template(config); - _deploy.update_managed_deploy_config(); }); } }); } }); + _launcher_listing_rom.with_xml([&] (Xml_node const &listing) { + listing.for_each_sub_node("dir", [&] (Xml_node const &dir) { + if (dir.attribute_value("path", Path()) == "/presets") { + dir.for_each_sub_node("file", [&] (Xml_node const &file) { + if (file.attribute_value("name", Presets::Info::Name()) == name) { + file.with_optional_sub_node("config", [&] (Xml_node const &config) { + _runtime_state.reset_abandoned_and_launched_children(); + _deploy.use_as_deploy_template(config); + _deploy.update_managed_deploy_config(); }); } }); } }); }); } /** @@ -1678,10 +1645,8 @@ struct Sculpt::Main : Input_event_handler, ** Device functions ** **********************/ - Attached_rom_dataspace _power_rom { _env, "report -> drivers/power" }; - - Signal_handler
_power_handler { - _env.ep(), *this, &Main::_handle_power }; + Rom_handler
_power_rom { + _env, "report -> drivers/power", *this, &Main::_handle_power }; bool _update_soc_feature_selection() { @@ -1702,12 +1667,10 @@ struct Sculpt::Main : Input_event_handler, return changed; } - void _handle_power() + void _handle_power(Xml_node const &power) { - _power_rom.update(); - Power_state const orig_power_state = _power_state; - _power_state = Power_state::from_xml(_power_rom.xml()); + _power_state = Power_state::from_xml(power); bool regenerate_dialog = false; @@ -1822,23 +1785,19 @@ struct Sculpt::Main : Input_event_handler, Modem_config _curr_modem_config { }; - Attached_rom_dataspace _modem_state_rom { _env, "report -> drivers/modem/state" }; + Rom_handler
_modem_state_rom { + _env, "report -> drivers/modem/state", *this, &Main::_handle_modem_state }; - Signal_handler
_modem_state_handler { - _env.ep(), *this, &Main::_handle_modem_state }; - - void _handle_modem_state() + void _handle_modem_state(Xml_node const &modem_state) { - _modem_state_rom.update(); - if (_verbose_modem) - log("modem state: ", _modem_state_rom.xml()); + log("modem state: ", modem_state); Modem_state const orig_modem_state = _modem_state; bool regenerate_dialog = false; - _modem_state = Modem_state::from_xml(_modem_state_rom.xml()); + _modem_state = Modem_state::from_xml(modem_state); /* update condition of "Mobile data" network option */ if (orig_modem_state.ready() != _modem_state.ready()) @@ -2023,36 +1982,9 @@ struct Sculpt::Main : Input_event_handler, _drivers.update_options(_driver_options); _drivers.update_soc(_soc); - _config.sigh(_config_handler); - _leitzentrale_rom.sigh(_leitzentrale_handler); - _manual_deploy_rom.sigh(_manual_deploy_handler); - _runtime_state_rom.sigh(_runtime_state_handler); - _runtime_config_rom.sigh(_runtime_config_handler); _gui.input()->sigh(_input_handler); _gui.mode_sigh(_gui_mode_handler); - - /* - * Subscribe to reports - */ - _update_state_rom .sigh(_update_state_handler); - _window_list .sigh(_window_list_handler); - _decorator_margins .sigh(_decorator_margins_handler); - _scan_rom .sigh(_scan_handler); - _launcher_listing_rom.sigh(_launcher_and_preset_listing_handler); - _blueprint_rom .sigh(_blueprint_handler); - _image_index_rom .sigh(_image_index_handler); - _power_rom .sigh(_power_handler); - _modem_state_rom .sigh(_modem_state_handler); - _index_rom .sigh(_index_handler); - - /* - * Import initial report content - */ - _handle_config(); - _handle_leitzentrale(); _handle_gui_mode(); - _handle_runtime_config(); - _handle_modem_state(); _system_config.with_manual_config([&] (Xml_node const &system) { _system = System::from_xml(system); }); @@ -2070,8 +2002,6 @@ struct Sculpt::Main : Input_event_handler, /* * Generate initial config/managed/deploy configuration */ - _handle_manual_deploy(); - _generate_modem_config(); generate_runtime_config(); _generate_dialog(); @@ -2079,7 +2009,8 @@ struct Sculpt::Main : Input_event_handler, }; -void Sculpt::Main::_handle_window_layout() +void Sculpt::Main::_update_window_layout(Xml_node const &decorator_margins, + Xml_node const &window_list) { /* skip window-layout handling (and decorator activity) while booting */ if (!_gui_mode_ready) @@ -2089,31 +2020,23 @@ void Sculpt::Main::_handle_window_layout() { unsigned top = 0, bottom = 0, left = 0, right = 0; - Decorator_margins(Xml_node node) + Decorator_margins(Xml_node const &node) { - if (!node.has_sub_node("floating")) - return; - - Xml_node const floating = node.sub_node("floating"); - - top = floating.attribute_value("top", 0U); - bottom = floating.attribute_value("bottom", 0U); - left = floating.attribute_value("left", 0U); - right = floating.attribute_value("right", 0U); + node.with_optional_sub_node("floating", [&] (Xml_node const &floating) { + top = floating.attribute_value("top", 0U); + bottom = floating.attribute_value("bottom", 0U); + left = floating.attribute_value("left", 0U); + right = floating.attribute_value("right", 0U); + }); } }; - /* read decorator margins from the decorator's report */ - _decorator_margins.update(); - Decorator_margins const margins(_decorator_margins.xml()); + Decorator_margins const margins { decorator_margins }; - typedef String<128> Label; + using Label = String<128>; Label const main_view_label ("runtime -> leitzentrale -> main_view"); Label const touch_keyboard_label("runtime -> leitzentrale -> touch_keyboard"); - _window_list.update(); - Xml_node const window_list = _window_list.xml(); - /* * Take presence of main view as trigger for second driver stage. * @@ -2182,7 +2105,7 @@ void Sculpt::Main::_handle_gui_mode() if (mode.area.count() > 1) _gui_mode_ready = true; - _handle_window_layout(); + _update_window_layout(); _screen_size = mode.area; _main_view.min_width = _screen_size.w(); @@ -2192,12 +2115,8 @@ void Sculpt::Main::_handle_gui_mode() } -void Sculpt::Main::_handle_update_state() +void Sculpt::Main::_handle_update_state(Xml_node const &update_state) { - _update_state_rom.update(); - - Xml_node const update_state = _update_state_rom.xml(); - _download_queue.apply_update_state(update_state); bool const any_completed_download = _download_queue.any_completed_download(); _download_queue.remove_completed_downloads(); @@ -2209,12 +2128,13 @@ void Sculpt::Main::_handle_update_state() if (installation_complete) { - Xml_node const blueprint = _blueprint_rom.xml(); - bool const new_depot_query_needed = blueprint_any_missing(blueprint) - || blueprint_any_rom_missing(blueprint) - || any_completed_download; - if (new_depot_query_needed) - trigger_depot_query(); + _blueprint_rom.with_xml([&] (Xml_node const &blueprint) { + bool const new_depot_query_needed = blueprint_any_missing(blueprint) + || blueprint_any_rom_missing(blueprint) + || any_completed_download; + if (new_depot_query_needed) + trigger_depot_query(); + }); _deploy.reattempt_after_installation(); } @@ -2223,12 +2143,8 @@ void Sculpt::Main::_handle_update_state() } -void Sculpt::Main::_handle_runtime_state() +void Sculpt::Main::_handle_runtime_state(Xml_node const &state) { - _runtime_state_rom.update(); - - Xml_node state = _runtime_state_rom.xml(); - _runtime_state.update_from_state_report(state); bool reconfigure_runtime = false; diff --git a/repos/gems/src/app/phone_manager/view/index_menu_widget.h b/repos/gems/src/app/phone_manager/view/index_menu_widget.h index bedc173696..c98f8b33b9 100644 --- a/repos/gems/src/app/phone_manager/view/index_menu_widget.h +++ b/repos/gems/src/app/phone_manager/view/index_menu_widget.h @@ -25,7 +25,7 @@ struct Sculpt::Index_menu_widget : Widget public: using User = Depot::Archive::User; - using Index = Attached_rom_dataspace; + using Index = Rom_data; using Name = Start_name; struct Sub_menu_title : Widget @@ -61,6 +61,12 @@ struct Sculpt::Index_menu_widget : Widget void _reset_selection() { _pkg_selected = false; } + void _for_each_menu_item(User const &user, auto const &fn) const + { + _index.with_xml([&] (Xml_node const &index) { + _menu.for_each_item(index, user, fn); }); + } + public: Index_menu_widget(Index const &index) : _index(index) { } @@ -71,7 +77,7 @@ struct Sculpt::Index_menu_widget : Widget s.widget(_back, Name { _menu }); unsigned count = 0; - _menu.for_each_item(_index.xml(), user, [&] (Xml_node const &item) { + _for_each_menu_item(user, [&] (Xml_node const &item) { Id const id { { count } }; @@ -110,7 +116,7 @@ struct Sculpt::Index_menu_widget : Widget Id const clicked = at.matching_id(); unsigned count = 0; - _menu.for_each_item(_index.xml(), user, [&] (Xml_node const &item) { + _for_each_menu_item(user, [&] (Xml_node const &item) { if (clicked == Id { { count } }) { @@ -168,7 +174,7 @@ struct Sculpt::Index_menu_widget : Widget return true; bool at_least_one_item_exists = false; - _menu.for_each_item(_index.xml(), user, [&] (Xml_node const &) { + _for_each_menu_item(user, [&] (Xml_node const &) { at_least_one_item_exists = true; }); return at_least_one_item_exists; diff --git a/repos/gems/src/app/sculpt_manager/deploy.cc b/repos/gems/src/app/sculpt_manager/deploy.cc index 17bc204beb..28efe6570f 100644 --- a/repos/gems/src/app/sculpt_manager/deploy.cc +++ b/repos/gems/src/app/sculpt_manager/deploy.cc @@ -74,10 +74,8 @@ void Sculpt::Deploy::view_diag(Scope<> &s) const } -void Sculpt::Deploy::handle_deploy() +void Sculpt::Deploy::_handle_managed_deploy(Xml_node const &managed_deploy) { - Xml_node const managed_deploy = _managed_deploy_rom.xml(); - /* determine CPU architecture of deployment */ Arch const orig_arch = _arch; _arch = managed_deploy.attribute_value("arch", Arch()); @@ -100,26 +98,27 @@ void Sculpt::Deploy::handle_deploy() { bool any_child_affected = false; - Xml_node const launcher_listing = _launcher_listing_rom.xml(); - launcher_listing.for_each_sub_node("dir", [&] (Xml_node dir) { + _launcher_listing_rom.with_xml([&] (Xml_node const &listing) { + listing.for_each_sub_node("dir", [&] (Xml_node const &dir) { - typedef String<20> Path; - Path const path = dir.attribute_value("path", Path()); + using Path = String<20>; + Path const path = dir.attribute_value("path", Path()); - if (path != "/launcher") - return; - - dir.for_each_sub_node("file", [&] (Xml_node file) { - - if (file.attribute_value("xml", false) == false) + if (path != "/launcher") return; - typedef Depot_deploy::Child::Launcher_name Name; - Name const name = file.attribute_value("name", Name()); + dir.for_each_sub_node("file", [&] (Xml_node const &file) { - file.for_each_sub_node("launcher", [&] (Xml_node launcher) { - if (_children.apply_launcher(name, launcher)) - any_child_affected = true; }); + if (file.attribute_value("xml", false) == false) + return; + + typedef Depot_deploy::Child::Launcher_name Name; + Name const name = file.attribute_value("name", Name()); + + file.for_each_sub_node("launcher", [&] (Xml_node const &launcher) { + if (_children.apply_launcher(name, launcher)) + any_child_affected = true; }); + }); }); }); return any_child_affected; @@ -129,18 +128,20 @@ void Sculpt::Deploy::handle_deploy() auto apply_blueprint = [&] { + bool progress = false; try { - Xml_node const blueprint = _blueprint_rom.xml(); + _blueprint_rom.with_xml([&] (Xml_node const &blueprint) { /* apply blueprint, except when stale */ - typedef String<32> Version; - Version const version = blueprint.attribute_value("version", Version()); - if (version == Version(_depot_query.depot_query_version().value)) - return _children.apply_blueprint(_blueprint_rom.xml()); + using Version = String<32>; + Version const version = blueprint.attribute_value("version", Version()); + if (version == Version(_depot_query.depot_query_version().value)) + progress = _children.apply_blueprint(blueprint); + }); } catch (...) { error("spurious exception during deploy update (apply_blueprint)"); } - return false; + return progress; }; bool const blueprint_affected_child = apply_blueprint(); @@ -184,21 +185,22 @@ void Sculpt::Deploy::gen_runtime_start_nodes(Xml_generator &xml, xml.node("start", [&] { gen_depot_query_start_content(xml); }); - Xml_node const managed_deploy = _managed_deploy_rom.xml(); + _managed_deploy_rom.with_xml([&] (Xml_node const &managed_deploy) { - /* insert content of '' node as is */ - if (managed_deploy.has_sub_node("static")) { - Xml_node static_config = managed_deploy.sub_node("static"); - static_config.with_raw_content([&] (char const *start, size_t length) { - xml.append(start, length); }); - } + /* insert content of '' node as is */ + if (managed_deploy.has_sub_node("static")) { + Xml_node static_config = managed_deploy.sub_node("static"); + static_config.with_raw_content([&] (char const *start, size_t length) { + xml.append(start, length); }); + } - /* generate start nodes for deployed packages */ - if (managed_deploy.has_sub_node("common_routes")) { - _children.gen_start_nodes(xml, managed_deploy.sub_node("common_routes"), - prio_levels, affinity_space, - "depot_rom", "dynamic_depot_rom"); - xml.node("monitor", [&] { - _children.gen_monitor_policy_nodes(xml);}); - } + /* generate start nodes for deployed packages */ + if (managed_deploy.has_sub_node("common_routes")) { + _children.gen_start_nodes(xml, managed_deploy.sub_node("common_routes"), + prio_levels, affinity_space, + "depot_rom", "dynamic_depot_rom"); + xml.node("monitor", [&] { + _children.gen_monitor_policy_nodes(xml);}); + } + }); } diff --git a/repos/gems/src/app/sculpt_manager/deploy.h b/repos/gems/src/app/sculpt_manager/deploy.h index 8537d3c651..3bf5297ed7 100644 --- a/repos/gems/src/app/sculpt_manager/deploy.h +++ b/repos/gems/src/app/sculpt_manager/deploy.h @@ -53,8 +53,8 @@ struct Sculpt::Deploy Depot_query &_depot_query; - Attached_rom_dataspace const &_launcher_listing_rom; - Attached_rom_dataspace const &_blueprint_rom; + Rom_data const &_launcher_listing_rom; + Rom_data const &_blueprint_rom; Download_queue &_download_queue; @@ -78,7 +78,8 @@ struct Sculpt::Deploy Expanding_reporter _managed_deploy_config { _env, "config", "deploy_config" }; /* config obtained from '/config/managed/deploy' */ - Attached_rom_dataspace _managed_deploy_rom { _env, "config -> managed/deploy" }; + Rom_handler _managed_deploy_rom { + _env, "config -> managed/deploy", *this, &Deploy::_handle_managed_deploy }; Constructible _template { }; @@ -187,7 +188,7 @@ struct Sculpt::Deploy Managed_config _installation { _env, "installation", "installation", *this, &Deploy::_handle_installation }; - void _handle_installation(Xml_node manual_config) + void _handle_installation(Xml_node const &manual_config) { _manual_installation_scheduled = manual_config.has_sub_node("archive"); handle_deploy(); @@ -201,12 +202,12 @@ struct Sculpt::Deploy || _download_queue.any_active_download(); } - void handle_deploy(); + void _handle_managed_deploy(Xml_node const &); - void _handle_managed_deploy() + void handle_deploy() { - _managed_deploy_rom.update(); - handle_deploy(); + _managed_deploy_rom.with_xml([&] (Xml_node const &managed_deploy) { + _handle_managed_deploy(managed_deploy); }); } /** @@ -254,9 +255,6 @@ struct Sculpt::Deploy void gen_runtime_start_nodes(Xml_generator &, Prio_levels, Affinity::Space) const; - Signal_handler _managed_deploy_handler { - _env.ep(), *this, &Deploy::_handle_managed_deploy }; - void restart() { /* ignore stale query results */ @@ -296,8 +294,8 @@ struct Sculpt::Deploy Action &action, Runtime_config_generator &runtime_config_generator, Depot_query &depot_query, - Attached_rom_dataspace const &launcher_listing_rom, - Attached_rom_dataspace const &blueprint_rom, + Rom_data const &launcher_listing_rom, + Rom_data const &blueprint_rom, Download_queue &download_queue) : _env(env), _alloc(alloc), _child_states(child_states), @@ -308,9 +306,7 @@ struct Sculpt::Deploy _launcher_listing_rom(launcher_listing_rom), _blueprint_rom(blueprint_rom), _download_queue(download_queue) - { - _managed_deploy_rom.sigh(_managed_deploy_handler); - } + { } }; #endif /* _DEPLOY_H_ */ diff --git a/repos/gems/src/app/sculpt_manager/dialog/distant_runtime.h b/repos/gems/src/app/sculpt_manager/dialog/distant_runtime.h index 9c211e6e74..dc7e0181e9 100644 --- a/repos/gems/src/app/sculpt_manager/dialog/distant_runtime.h +++ b/repos/gems/src/app/sculpt_manager/dialog/distant_runtime.h @@ -20,6 +20,9 @@ #include #include +/* local includes */ +#include + namespace Dialog { struct Distant_runtime; } @@ -116,10 +119,9 @@ class Dialog::Distant_runtime::View : private Views::Element Expanding_reporter _dialog_reporter { _env, "dialog", { _dialog.name, "_dialog" } }; - Attached_rom_dataspace _hover_rom { - _env, Session_label::String(_dialog.name, "_view_hover").string() }; - - Signal_handler _hover_handler { _env.ep(), *this, &View::_handle_hover }; + Sculpt::Rom_handler _hover_rom { + _env, Session_label::String(_dialog.name, "_view_hover").string(), + *this, &View::_handle_hover }; bool _dialog_hovered = false; /* used to cut hover feedback loop */ @@ -129,20 +131,17 @@ class Dialog::Distant_runtime::View : private Views::Element { bool done = false; - _hover_rom.xml().with_optional_sub_node("dialog", [&] (Xml_node const &dialog) { - fn(dialog); - done = true; }); + _hover_rom.with_xml([&] (Xml_node const &hover) { + hover.with_optional_sub_node("dialog", [&] (Xml_node const &dialog) { + fn(dialog); + done = true; }); }); if (!done) fn(Xml_node("")); } - void _handle_hover() + void _handle_hover(Xml_node const &hover) { - _hover_rom.update(); - - Xml_node const hover = _hover_rom.xml(); - bool const orig_dialog_hovered = _dialog_hovered; _hover_seq_number = { hover.attribute_value("seq_number", 0U) }; @@ -241,7 +240,6 @@ class Dialog::Distant_runtime::View : private Views::Element _initial_ram(attr.initial_ram), _opaque(attr.opaque), _background(attr.background) { - _hover_rom.sigh(_hover_handler); _refresh_handler.local_submit(); } diff --git a/repos/gems/src/app/sculpt_manager/driver/ahci.h b/repos/gems/src/app/sculpt_manager/driver/ahci.h index 1f64929744..47859a5e4a 100644 --- a/repos/gems/src/app/sculpt_manager/driver/ahci.h +++ b/repos/gems/src/app/sculpt_manager/driver/ahci.h @@ -29,22 +29,12 @@ struct Sculpt::Ahci_driver : private Noncopyable Constructible _ahci { }; - Attached_rom_dataspace _ports { _env, "report -> runtime/ahci/ports" }; + Rom_handler _ports { + _env, "report -> runtime/ahci/ports", *this, &Ahci_driver::_handle_ports }; - Signal_handler _ports_handler { - _env.ep(), *this, &Ahci_driver::_handle_ports }; + void _handle_ports(Xml_node const &) { _action.handle_ahci_discovered(); } - void _handle_ports() - { - _ports.update(); - _action.handle_ahci_discovered(); - } - - Ahci_driver(Env &env, Action &action) : _env(env), _action(action) - { - _ports.sigh(_ports_handler); - _ports_handler.local_submit(); - } + Ahci_driver(Env &env, Action &action) : _env(env), _action(action) { } void gen_start_node(Xml_generator &xml) const { @@ -81,7 +71,8 @@ struct Sculpt::Ahci_driver : private Noncopyable void with_ports(auto const &fn) const { - fn(_ahci.constructed() ? _ports.xml() : Xml_node("")); + _ports.with_xml([&] (Xml_node const &ports) { + fn(_ahci.constructed() ? ports : Xml_node("")); }); } }; diff --git a/repos/gems/src/app/sculpt_manager/driver/mmc.h b/repos/gems/src/app/sculpt_manager/driver/mmc.h index 927e13f10f..363cd5c96b 100644 --- a/repos/gems/src/app/sculpt_manager/driver/mmc.h +++ b/repos/gems/src/app/sculpt_manager/driver/mmc.h @@ -29,22 +29,12 @@ struct Sculpt::Mmc_driver : private Noncopyable Constructible _mmc { }; - Attached_rom_dataspace _devices { _env, "report -> runtime/mmc/block_devices" }; + Rom_handler _devices { + _env, "report -> runtime/mmc/block_devices", *this, &Mmc_driver::_handle_devices }; - Signal_handler _devices_handler { - _env.ep(), *this, &Mmc_driver::_handle_devices }; + void _handle_devices(Xml_node const &) { _action.handle_mmc_discovered(); } - void _handle_devices() - { - _devices.update(); - _action.handle_mmc_discovered(); - } - - Mmc_driver(Env &env, Action &action) : _env(env), _action(action) - { - _devices.sigh(_devices_handler); - _devices_handler.local_submit(); - } + Mmc_driver(Env &env, Action &action) : _env(env), _action(action) { } void gen_start_node(Xml_generator &xml) const { @@ -79,7 +69,8 @@ struct Sculpt::Mmc_driver : private Noncopyable void with_devices(auto const &fn) const { - fn(_mmc.constructed() ? _devices.xml() : Xml_node("")); + _devices.with_xml([&] (Xml_node const &devices) { + fn(_mmc.constructed() ? devices : Xml_node("")); }); } }; diff --git a/repos/gems/src/app/sculpt_manager/driver/nvme.h b/repos/gems/src/app/sculpt_manager/driver/nvme.h index 6afb501d59..e83b67564b 100644 --- a/repos/gems/src/app/sculpt_manager/driver/nvme.h +++ b/repos/gems/src/app/sculpt_manager/driver/nvme.h @@ -29,22 +29,12 @@ struct Sculpt::Nvme_driver : private Noncopyable Constructible _nvme { }; - Attached_rom_dataspace _namespaces { _env, "report -> runtime/nvme/controller" }; + Rom_handler _namespaces { + _env, "report -> runtime/nvme/controller", *this, &Nvme_driver::_handle_namespaces }; - Signal_handler _namespaces_handler { - _env.ep(), *this, &Nvme_driver::_handle_namespaces }; + void _handle_namespaces(Xml_node const &) { _action.handle_nvme_discovered(); } - void _handle_namespaces() - { - _namespaces.update(); - _action.handle_nvme_discovered(); - } - - Nvme_driver(Env &env, Action &action) : _env(env), _action(action) - { - _namespaces.sigh(_namespaces_handler); - _namespaces_handler.local_submit(); - } + Nvme_driver(Env &env, Action &action) : _env(env), _action(action) { } void gen_start_node(Xml_generator &xml) const { @@ -80,7 +70,8 @@ struct Sculpt::Nvme_driver : private Noncopyable void with_namespaces(auto const &fn) const { - fn(_nvme.constructed() ? _namespaces.xml() : Xml_node("")); + _namespaces.with_xml([&] (Xml_node const &namespaces) { + fn(_nvme.constructed() ? namespaces : Xml_node("")); }); } }; diff --git a/repos/gems/src/app/sculpt_manager/driver/usb.h b/repos/gems/src/app/sculpt_manager/driver/usb.h index b9f40247a3..d18c261227 100644 --- a/repos/gems/src/app/sculpt_manager/driver/usb.h +++ b/repos/gems/src/app/sculpt_manager/driver/usb.h @@ -57,22 +57,19 @@ struct Sculpt::Usb_driver : private Noncopyable } _detected { }; - Attached_rom_dataspace _devices { _env, "report -> runtime/usb/devices" }; + Rom_handler _devices { + _env, "report -> runtime/usb/devices", *this, &Usb_driver::_handle_devices }; - Signal_handler _devices_handler { - _env.ep(), *this, &Usb_driver::_handle_devices }; - - void _handle_devices() + void _handle_devices(Xml_node const &devices) { - _devices.update(); - _detected = Detected::from_xml(_devices.xml()); + _detected = Detected::from_xml(devices); _action.handle_usb_plug_unplug(); } Managed_config _usb_config { _env, "config", "usb", *this, &Usb_driver::_handle_usb_config }; - void _handle_usb_config(Xml_node config) + void _handle_usb_config(Xml_node const &config) { _usb_config.generate([&] (Xml_generator &xml) { copy_attributes(xml, config); @@ -97,9 +94,7 @@ struct Sculpt::Usb_driver : private Noncopyable : _env(env), _info(info), _action(action) { - _devices.sigh(_devices_handler); _usb_config.trigger_update(); - _devices_handler.local_submit(); } void gen_start_nodes(Xml_generator &xml) const @@ -180,7 +175,8 @@ struct Sculpt::Usb_driver : private Noncopyable void with_devices(auto const &fn) const { - fn(_hcd.constructed() ? _devices.xml() : Xml_node("")); + _devices.with_xml([&] (Xml_node const &devices) { + fn(_hcd.constructed() ? devices : Xml_node("")); }); } }; diff --git a/repos/gems/src/app/sculpt_manager/drivers.cc b/repos/gems/src/app/sculpt_manager/drivers.cc index b780bd436d..d8bfd808ba 100644 --- a/repos/gems/src/app/sculpt_manager/drivers.cc +++ b/repos/gems/src/app/sculpt_manager/drivers.cc @@ -55,16 +55,12 @@ class Sculpt::Drivers::Instance : Noncopyable, Attached_rom_dataspace const _platform { _env, "platform_info" }; - Attached_rom_dataspace _devices { _env, "report -> drivers/devices" }; + Rom_handler _devices { + _env, "report -> drivers/devices", *this, &Instance::_handle_devices }; - Signal_handler _devices_handler { - _env.ep(), *this, &Instance::_handle_devices }; - - void _handle_devices() + void _handle_devices(Xml_node const &devices) { - _devices.update(); - - _board_info.detected = Board_info::Detected::from_xml(_devices.xml(), + _board_info.detected = Board_info::Detected::from_xml(devices, _platform.xml()); _fb_driver .update(_children, _board_info, _platform.xml()); @@ -79,6 +75,12 @@ class Sculpt::Drivers::Instance : Noncopyable, _action.handle_device_plug_unplug(); } + void _handle_devices() + { + _devices.with_xml([&] (Xml_node const &devices) { + _handle_devices(devices); }); + } + Ps2_driver _ps2_driver { }; Touch_driver _touch_driver { }; Fb_driver _fb_driver { }; @@ -104,10 +106,7 @@ class Sculpt::Drivers::Instance : Noncopyable, Instance(Env &env, Children &children, Info const &info, Action &action) : _env(env), _children(children), _info(info), _action(action) - { - _devices.sigh(_devices_handler); - _devices_handler.local_submit(); - } + { } void update_usb() { _usb_driver.update(_children, _board_info); } diff --git a/repos/gems/src/app/sculpt_manager/main.cc b/repos/gems/src/app/sculpt_manager/main.cc index 7de7253718..3a9008c01d 100644 --- a/repos/gems/src/app/sculpt_manager/main.cc +++ b/repos/gems/src/app/sculpt_manager/main.cc @@ -109,7 +109,7 @@ struct Sculpt::Main : Input_event_handler, Managed_config
_system_config { _env, "system", "system", *this, &Main::_handle_system_config }; - void _handle_system_config(Xml_node) + void _handle_system_config(Xml_node const &) { _system_config.try_generate_manually_managed(); } @@ -132,7 +132,7 @@ struct Sculpt::Main : Input_event_handler, Managed_config
_fonts_config { _env, "config", "fonts", *this, &Main::_handle_fonts_config }; - void _handle_fonts_config(Xml_node config) + void _handle_fonts_config(Xml_node const &config) { /* * Obtain font size from manually maintained fonts configuration @@ -164,7 +164,7 @@ struct Sculpt::Main : Input_event_handler, void _generate_event_filter_config(Xml_generator &); - void _handle_event_filter_config(Xml_node) + void _handle_event_filter_config(Xml_node const &) { _update_event_filter_config(); } @@ -371,13 +371,10 @@ struct Sculpt::Main : Input_event_handler, ** Update ** ************/ - Attached_rom_dataspace _update_state_rom { - _env, "report -> runtime/update/state" }; + Rom_handler
_update_state_rom { + _env, "report -> runtime/update/state", *this, &Main::_handle_update_state }; - void _handle_update_state(); - - Signal_handler
_update_state_handler { - _env.ep(), *this, &Main::_handle_update_state }; + void _handle_update_state(Xml_node const &); /** * Condition for spawning the update subsystem @@ -440,18 +437,19 @@ struct Sculpt::Main : Input_event_handler, xml.node("scan", [&] { xml.attribute("users", "yes"); }); - if (_system_dialog_watches_depot() || _scan_rom.xml().has_type("empty")) + if (_system_dialog_watches_depot() || !_scan_rom.valid()) xml.node("scan", [&] { xml.attribute("users", "yes"); }); - if (_system_dialog_watches_depot() || _image_index_rom.xml().has_type("empty")) + if (_system_dialog_watches_depot() || !_image_index_rom.valid()) xml.node("image_index", [&] { xml.attribute("os", "sculpt"); xml.attribute("board", _build_info.board); xml.attribute("user", _image_index_user); }); - _popup_dialog.gen_depot_query(xml, _scan_rom.xml()); + _scan_rom.with_xml([&] (Xml_node const &scan) { + _popup_dialog.gen_depot_query(xml, scan); }); /* update query for blueprints of all unconfigured start nodes */ _deploy.gen_depot_query(xml); @@ -479,17 +477,11 @@ struct Sculpt::Main : Input_event_handler, ** Blueprint query ** *********************/ - Attached_rom_dataspace _blueprint_rom { _env, "report -> runtime/depot_query/blueprint" }; + Rom_handler
_blueprint_rom { + _env, "report -> runtime/depot_query/blueprint", *this, &Main::_handle_blueprint }; - Signal_handler
_blueprint_handler { - _env.ep(), *this, &Main::_handle_blueprint }; - - void _handle_blueprint() + void _handle_blueprint(Xml_node const &blueprint) { - _blueprint_rom.update(); - - Xml_node const blueprint = _blueprint_rom.xml(); - /* * Drop intermediate results that will be superseded by a newer query. * This is important because an outdated blueprint would be disregarded @@ -513,41 +505,29 @@ struct Sculpt::Main : Input_event_handler, Deploy::Prio_levels const _prio_levels { 4 }; - Attached_rom_dataspace _scan_rom { _env, "report -> runtime/depot_query/scan" }; + Rom_handler
_scan_rom { + _env, "report -> runtime/depot_query/scan", *this, &Main::_handle_scan }; - Signal_handler
_scan_handler { _env.ep(), *this, &Main::_handle_scan }; - - void _handle_scan() + void _handle_scan(Xml_node const &) { - _scan_rom.update(); _popup_dialog.depot_users_scan_updated(); _system_dialog.sanitize_user_selection(); } - Attached_rom_dataspace _image_index_rom { _env, "report -> runtime/depot_query/image_index" }; + Rom_handler
_image_index_rom { + _env, "report -> runtime/depot_query/image_index", *this, &Main::_handle_image_index }; - Signal_handler
_image_index_handler { _env.ep(), *this, &Main::_handle_image_index }; - - void _handle_image_index() - { - _image_index_rom.update(); - _system_dialog.refresh(); - } - - Attached_rom_dataspace _launcher_listing_rom { - _env, "report -> /runtime/launcher_query/listing" }; + void _handle_image_index(Xml_node const &) { _system_dialog.refresh(); } Launchers _launchers { _heap }; Presets _presets { _heap }; - Signal_handler
_launcher_and_preset_listing_handler { - _env.ep(), *this, &Main::_handle_launcher_and_preset_listing }; + Rom_handler
_launcher_listing_rom { + _env, "report -> /runtime/launcher_query/listing", *this, + &Main::_handle_launcher_and_preset_listing }; - void _handle_launcher_and_preset_listing() + void _handle_launcher_and_preset_listing(Xml_node const &listing) { - _launcher_listing_rom.update(); - - Xml_node const listing = _launcher_listing_rom.xml(); listing.for_each_sub_node("dir", [&] (Xml_node const &dir) { Path const dir_path = dir.attribute_value("path", Path()); @@ -560,7 +540,7 @@ struct Sculpt::Main : Input_event_handler, }); _popup_dialog.refresh(); - _deploy._handle_managed_deploy(); + _deploy.handle_deploy(); } Deploy _deploy { _env, _heap, _child_states, _runtime_state, *this, *this, *this, @@ -571,19 +551,16 @@ struct Sculpt::Main : Input_event_handler, */ void refresh_deploy_dialog() override { _generate_dialog(); } - Attached_rom_dataspace _manual_deploy_rom { _env, "config -> deploy" }; + Rom_handler
_manual_deploy_rom { + _env, "config -> deploy", *this, &Main::_handle_manual_deploy }; - void _handle_manual_deploy() + void _handle_manual_deploy(Xml_node const &manual_deploy) { _runtime_state.reset_abandoned_and_launched_children(); - _manual_deploy_rom.update(); - _deploy.use_as_deploy_template(_manual_deploy_rom.xml()); + _deploy.use_as_deploy_template(manual_deploy); _deploy.update_managed_deploy_config(); } - Signal_handler
_manual_deploy_handler { - _env.ep(), *this, &Main::_handle_manual_deploy }; - /************ ** Global ** @@ -606,7 +583,8 @@ struct Sculpt::Main : Input_event_handler, File_browser_state _file_browser_state { }; - Attached_rom_dataspace _editor_saved_rom { _env, "report -> runtime/editor/saved" }; + Rom_handler
_editor_saved_rom { + _env, "report -> runtime/editor/saved", *this, &Main::_handle_editor_saved }; Affinity::Space _affinity_space { 1, 1 }; @@ -661,17 +639,18 @@ struct Sculpt::Main : Input_event_handler, }); } - Xml_node const state = _main._update_state_rom.xml(); + _main._update_state_rom.with_xml([&] (Xml_node const &state) { - bool const download_in_progress = - _main._update_running() && state.attribute_value("progress", false); + bool const download_in_progress = + _main._update_running() && state.attribute_value("progress", false); - if (download_in_progress || _main._download_queue.any_failed_download()) { + if (download_in_progress || _main._download_queue.any_failed_download()) { - Hosted download_status { Id { "Download" } }; + Hosted download_status { Id { "Download" } }; - s.widget(download_status, state, _main._download_queue); - } + s.widget(download_status, state, _main._download_queue); + } + }); }); } }; @@ -685,7 +664,10 @@ struct Sculpt::Main : Input_event_handler, _system_dialog.refresh(); } - Attached_rom_dataspace _runtime_state_rom { _env, "report -> runtime/state" }; + Rom_handler
_runtime_state_rom { + _env, "report -> runtime/state", *this, &Main::_handle_runtime_state }; + + void _handle_runtime_state(Xml_node const &); Runtime_state _runtime_state { _heap, _storage._sculpt_partition }; @@ -694,7 +676,7 @@ struct Sculpt::Main : Input_event_handler, bool _manually_managed_runtime = false; - void _handle_runtime(Xml_node config) + void _handle_runtime(Xml_node const &config) { _manually_managed_runtime = !config.has_type("empty"); generate_runtime_config(); @@ -713,11 +695,6 @@ struct Sculpt::Main : Input_event_handler, _generate_runtime_config(xml); }); } - Signal_handler
_runtime_state_handler { - _env.ep(), *this, &Main::_handle_runtime_state }; - - void _handle_runtime_state(); - /**************************************** ** Cached model of the runtime config ** @@ -728,17 +705,14 @@ struct Sculpt::Main : Input_event_handler, * manager, we still obtain it as a separate ROM session to keep the GUI * part decoupled from the lower-level runtime configuration generator. */ - Attached_rom_dataspace _runtime_config_rom { _env, "config -> managed/runtime" }; - - Signal_handler
_runtime_config_handler { - _env.ep(), *this, &Main::_handle_runtime_config }; + Rom_handler
_runtime_config_rom { + _env, "config -> managed/runtime", *this, &Main::_handle_runtime_config }; Runtime_config _cached_runtime_config { _heap }; - void _handle_runtime_config() + void _handle_runtime_config(Xml_node const &runtime_config) { - _runtime_config_rom.update(); - _cached_runtime_config.update_from_xml(_runtime_config_rom.xml()); + _cached_runtime_config.update_from_xml(runtime_config); _graph_view.refresh(); if (_selected_tab == Panel_dialog::Tab::FILES) @@ -834,7 +808,7 @@ struct Sculpt::Main : Input_event_handler, /* hide system panel button and system dialog when "un-using" */ _panel_dialog.refresh(); _system_dialog.refresh(); - _handle_window_layout(); + _update_window_layout(); generate_runtime_config(); } @@ -939,13 +913,13 @@ struct Sculpt::Main : Input_event_handler, _popup.anchor = anchor; _popup.state = Popup::VISIBLE; _graph_view.refresh(); - _handle_window_layout(); + _update_window_layout(); } void _refresh_panel_and_window_layout() { _panel_dialog.refresh(); - _handle_window_layout(); + _update_window_layout(); } /** @@ -1062,18 +1036,17 @@ struct Sculpt::Main : Input_event_handler, */ void load_deploy_preset(Presets::Info::Name const &name) override { - Xml_node const listing = _launcher_listing_rom.xml(); - _download_queue.remove_inactive_downloads(); - listing.for_each_sub_node("dir", [&] (Xml_node const &dir) { - if (dir.attribute_value("path", Path()) == "/presets") { - dir.for_each_sub_node("file", [&] (Xml_node const &file) { - if (file.attribute_value("name", Presets::Info::Name()) == name) { - file.with_optional_sub_node("config", [&] (Xml_node const &config) { - _runtime_state.reset_abandoned_and_launched_children(); - _deploy.use_as_deploy_template(config); - _deploy.update_managed_deploy_config(); }); } }); } }); + _launcher_listing_rom.with_xml([&] (Xml_node const &listing) { + listing.for_each_sub_node("dir", [&] (Xml_node const &dir) { + if (dir.attribute_value("path", Path()) == "/presets") { + dir.for_each_sub_node("file", [&] (Xml_node const &file) { + if (file.attribute_value("name", Presets::Info::Name()) == name) { + file.with_optional_sub_node("config", [&] (Xml_node const &config) { + _runtime_state.reset_abandoned_and_launched_children(); + _deploy.use_as_deploy_template(config); + _deploy.update_managed_deploy_config(); }); } }); } }); }); } struct Settings_top_level_dialog : Top_level_dialog @@ -1131,15 +1104,8 @@ struct Sculpt::Main : Input_event_handler, _file_browser_dialog.refresh(); } - Signal_handler
_editor_saved_handler { - _env.ep(), *this, &Main::_handle_editor_saved }; - - void _handle_editor_saved() + void _handle_editor_saved(Xml_node const &saved) { - _editor_saved_rom.update(); - - Xml_node const saved = _editor_saved_rom.xml(); - bool const orig_modified = _file_browser_state.modified; _file_browser_state.modified = saved.attribute_value("modified", false); @@ -1278,7 +1244,7 @@ struct Sculpt::Main : Input_event_handler, _popup_dialog.refresh(); /* remove popup window from window layout */ - _handle_window_layout(); + _update_window_layout(); /* reset state of the '+' button */ _graph_view.refresh(); @@ -1384,12 +1350,33 @@ struct Sculpt::Main : Input_event_handler, Managed_config
_fb_drv_config { _env, "config", "fb_drv", *this, &Main::_handle_fb_drv_config }; - void _handle_fb_drv_config(Xml_node) + void _handle_fb_drv_config(Xml_node const &) { _fb_drv_config.try_generate_manually_managed(); } - void _handle_window_layout(); + void _update_window_layout(Xml_node const &, Xml_node const &); + + void _update_window_layout() + { + _decorator_margins.with_xml([&] (Xml_node const &decorator_margins) { + _window_list.with_xml([&] (Xml_node const &window_list) { + _update_window_layout(decorator_margins, window_list); }); }); + } + + void _handle_window_layout_or_decorator_margins(Xml_node const &) + { + _update_window_layout(); + } + + Rom_handler
_window_list { + _env, "window_list", *this, &Main::_handle_window_layout_or_decorator_margins }; + + Rom_handler
_decorator_margins { + _env, "decorator_margins", *this, &Main::_handle_window_layout_or_decorator_margins }; + + Expanding_reporter _wm_focus { _env, "focus", "wm_focus" }; + Expanding_reporter _window_layout { _env, "window_layout", "window_layout" }; template void _with_window(Xml_node window_list, String const &match, auto const &fn) @@ -1399,20 +1386,6 @@ struct Sculpt::Main : Input_event_handler, fn(win); }); } - Attached_rom_dataspace _window_list { _env, "window_list" }; - - Signal_handler
_window_list_handler { - _env.ep(), *this, &Main::_handle_window_layout }; - - Expanding_reporter _wm_focus { _env, "focus", "wm_focus" }; - - Attached_rom_dataspace _decorator_margins { _env, "decorator_margins" }; - - Signal_handler
_decorator_margins_handler { - _env.ep(), *this, &Main::_handle_window_layout }; - - Expanding_reporter _window_layout { _env, "window_layout", "window_layout" }; - /******************* ** Runtime graph ** @@ -1450,23 +1423,9 @@ struct Sculpt::Main : Input_event_handler, Main(Env &env) : _env(env) { - _manual_deploy_rom.sigh(_manual_deploy_handler); - _runtime_state_rom.sigh(_runtime_state_handler); - _runtime_config_rom.sigh(_runtime_config_handler); _gui.input()->sigh(_input_handler); _gui.mode_sigh(_gui_mode_handler); - - /* - * Subscribe to reports - */ - _update_state_rom .sigh(_update_state_handler); - _window_list .sigh(_window_list_handler); - _decorator_margins .sigh(_decorator_margins_handler); - _scan_rom .sigh(_scan_handler); - _launcher_listing_rom.sigh(_launcher_and_preset_listing_handler); - _blueprint_rom .sigh(_blueprint_handler); - _image_index_rom .sigh(_image_index_handler); - _editor_saved_rom .sigh(_editor_saved_handler); + _handle_gui_mode(); /* * Generate initial configurations @@ -1474,12 +1433,7 @@ struct Sculpt::Main : Input_event_handler, _network.wifi_disconnect(); _update_event_filter_config(); - /* - * Import initial report content - */ - _handle_gui_mode(); _handle_storage_devices(); - _handle_runtime_config(); /* * Read static platform information @@ -1492,15 +1446,14 @@ struct Sculpt::Main : Input_event_handler, /* * Generate initial config/managed/deploy configuration */ - _handle_manual_deploy(); - generate_runtime_config(); _generate_dialog(); } }; -void Sculpt::Main::_handle_window_layout() +void Sculpt::Main::_update_window_layout(Xml_node const &decorator_margins, + Xml_node const &window_list) { /* skip window-layout handling (and decorator activity) while booting */ if (!_gui_mode_ready) @@ -1510,23 +1463,18 @@ void Sculpt::Main::_handle_window_layout() { unsigned top = 0, bottom = 0, left = 0, right = 0; - Decorator_margins(Xml_node node) + Decorator_margins(Xml_node const &node) { - if (!node.has_sub_node("floating")) - return; - - Xml_node const floating = node.sub_node("floating"); - - top = floating.attribute_value("top", 0U); - bottom = floating.attribute_value("bottom", 0U); - left = floating.attribute_value("left", 0U); - right = floating.attribute_value("right", 0U); + node.with_optional_sub_node("floating", [&] (Xml_node const &floating) { + top = floating.attribute_value("top", 0U); + bottom = floating.attribute_value("bottom", 0U); + left = floating.attribute_value("left", 0U); + right = floating.attribute_value("right", 0U); + }); } }; - /* read decorator margins from the decorator's report */ - _decorator_margins.update(); - Decorator_margins const margins(_decorator_margins.xml()); + Decorator_margins const margins { decorator_margins }; unsigned const log_min_w = 400; @@ -1544,9 +1492,6 @@ void Sculpt::Main::_handle_window_layout() editor_view_label ("runtime -> leitzentrale -> editor"), logo_label ("logo"); - _window_list.update(); - Xml_node const window_list = _window_list.xml(); - auto win_size = [&] (Xml_node win) { return Area::from_xml(win); }; unsigned panel_height = 0; @@ -1586,7 +1531,7 @@ void Sculpt::Main::_handle_window_layout() _window_layout.generate([&] (Xml_generator &xml) { - auto gen_window = [&] (Xml_node win, Rect rect) { + auto gen_window = [&] (Xml_node const &win, Rect rect) { if (rect.valid()) { xml.node("window", [&] { xml.attribute("id", win.attribute_value("id", 0UL)); @@ -1600,7 +1545,7 @@ void Sculpt::Main::_handle_window_layout() }; /* window size limited to space unobstructed by the menu and log */ - auto constrained_win_size = [&] (Xml_node win) { + auto constrained_win_size = [&] (Xml_node const &win) { unsigned const inspect_w = inspect_p2.x() - inspect_p1.x(), inspect_h = inspect_p2.y() - inspect_p1.y(); @@ -1609,15 +1554,15 @@ void Sculpt::Main::_handle_window_layout() return Area(min(inspect_w, size.w()), min(inspect_h, size.h())); }; - _with_window(window_list, panel_view_label, [&] (Xml_node win) { + _with_window(window_list, panel_view_label, [&] (Xml_node const &win) { gen_window(win, panel); }); - _with_window(window_list, Label("log"), [&] (Xml_node win) { + _with_window(window_list, Label("log"), [&] (Xml_node const &win) { gen_window(win, Rect(log_p1, log_p2)); }); int system_right_xpos = 0; if (system_available()) { - _with_window(window_list, system_view_label, [&] (Xml_node win) { + _with_window(window_list, system_view_label, [&] (Xml_node const &win) { Area const size = win_size(win); Point const pos = _system_visible ? Point(0, avail.y1()) @@ -1629,7 +1574,7 @@ void Sculpt::Main::_handle_window_layout() }); } - _with_window(window_list, settings_view_label, [&] (Xml_node win) { + _with_window(window_list, settings_view_label, [&] (Xml_node const &win) { Area const size = win_size(win); Point const pos = _settings_visible ? Point(system_right_xpos, avail.y1()) @@ -1639,7 +1584,7 @@ void Sculpt::Main::_handle_window_layout() gen_window(win, Rect(pos, size)); }); - _with_window(window_list, network_view_label, [&] (Xml_node win) { + _with_window(window_list, network_view_label, [&] (Xml_node const &win) { Area const size = win_size(win); Point const pos = _network_visible ? Point(log_p1.x() - size.w(), avail.y1()) @@ -1647,7 +1592,7 @@ void Sculpt::Main::_handle_window_layout() gen_window(win, Rect(pos, size)); }); - _with_window(window_list, file_browser_view_label, [&] (Xml_node win) { + _with_window(window_list, file_browser_view_label, [&] (Xml_node const &win) { if (_selected_tab == Panel_dialog::Tab::FILES) { Area const size = constrained_win_size(win); @@ -1661,7 +1606,7 @@ void Sculpt::Main::_handle_window_layout() } }); - _with_window(window_list, editor_view_label, [&] (Xml_node win) { + _with_window(window_list, editor_view_label, [&] (Xml_node const &win) { if (_selected_tab == Panel_dialog::Tab::FILES) { Area const size = constrained_win_size(win); Point const pos = Rect(inspect_p1 + Point(400, 0), inspect_p2).center(size); @@ -1674,7 +1619,7 @@ void Sculpt::Main::_handle_window_layout() } }); - _with_window(window_list, diag_view_label, [&] (Xml_node win) { + _with_window(window_list, diag_view_label, [&] (Xml_node const &win) { if (_selected_tab == Panel_dialog::Tab::COMPONENTS) { Area const size = win_size(win); Point const pos(0, avail.y2() - size.h()); @@ -1687,13 +1632,13 @@ void Sculpt::Main::_handle_window_layout() * area. */ Point runtime_view_pos { }; - _with_window(window_list, runtime_view_label, [&] (Xml_node win) { + _with_window(window_list, runtime_view_label, [&] (Xml_node const &win) { Area const size = constrained_win_size(win); runtime_view_pos = Rect(inspect_p1, inspect_p2).center(size); }); if (_popup.state == Popup::VISIBLE) { - _with_window(window_list, popup_view_label, [&] (Xml_node win) { + _with_window(window_list, popup_view_label, [&] (Xml_node const &win) { Area const size = win_size(win); int const anchor_y_center = (_popup.anchor.y1() + _popup.anchor.y2())/2; @@ -1705,7 +1650,7 @@ void Sculpt::Main::_handle_window_layout() }); } - _with_window(window_list, inspect_label, [&] (Xml_node win) { + _with_window(window_list, inspect_label, [&] (Xml_node const &win) { if (_selected_tab == Panel_dialog::Tab::INSPECT) gen_window(win, Rect(inspect_p1, inspect_p2)); }); @@ -1713,11 +1658,11 @@ void Sculpt::Main::_handle_window_layout() * Position runtime view centered within the inspect area, but allow * the overlapping of the log area. (use the menu view's 'win_size'). */ - _with_window(window_list, runtime_view_label, [&] (Xml_node win) { + _with_window(window_list, runtime_view_label, [&] (Xml_node const &win) { if (_selected_tab == Panel_dialog::Tab::COMPONENTS) gen_window(win, Rect(runtime_view_pos, win_size(win))); }); - _with_window(window_list, logo_label, [&] (Xml_node win) { + _with_window(window_list, logo_label, [&] (Xml_node const &win) { Area const size = win_size(win); Point const pos(mode.area.w() - size.w(), mode.area.h() - size.h()); gen_window(win, Rect(pos, size)); @@ -1727,16 +1672,18 @@ void Sculpt::Main::_handle_window_layout() /* define window-manager focus */ _wm_focus.generate([&] (Xml_generator &xml) { - _window_list.xml().for_each_sub_node("window", [&] (Xml_node win) { - Label const label = win.attribute_value("label", Label()); + _window_list.with_xml([&] (Xml_node const &list) { + list.for_each_sub_node("window", [&] (Xml_node const &win) { + Label const label = win.attribute_value("label", Label()); - if (label == inspect_label && _selected_tab == Panel_dialog::Tab::INSPECT) - xml.node("window", [&] { - xml.attribute("id", win.attribute_value("id", 0UL)); }); + if (label == inspect_label && _selected_tab == Panel_dialog::Tab::INSPECT) + xml.node("window", [&] { + xml.attribute("id", win.attribute_value("id", 0UL)); }); - if (label == editor_view_label && _selected_tab == Panel_dialog::Tab::FILES) - xml.node("window", [&] { - xml.attribute("id", win.attribute_value("id", 0UL)); }); + if (label == editor_view_label && _selected_tab == Panel_dialog::Tab::FILES) + xml.node("window", [&] { + xml.attribute("id", win.attribute_value("id", 0UL)); }); + }); }); }); } @@ -1749,7 +1696,7 @@ void Sculpt::Main::_handle_gui_mode() if (mode.area.count() > 1) _gui_mode_ready = true; - _handle_window_layout(); + _update_window_layout(); _settings.manual_fonts_config = _fonts_config.try_generate_manually_managed(); @@ -1821,13 +1768,8 @@ void Sculpt::Main::_handle_gui_mode() } -void Sculpt::Main::_handle_update_state() +void Sculpt::Main::_handle_update_state(Xml_node const &update_state) { - _update_state_rom.update(); - _generate_dialog(); - - Xml_node const update_state = _update_state_rom.xml(); - _download_queue.apply_update_state(update_state); bool const any_completed_download = _download_queue.any_completed_download(); _download_queue.remove_completed_downloads(); @@ -1839,12 +1781,13 @@ void Sculpt::Main::_handle_update_state() if (installation_complete) { - Xml_node const blueprint = _blueprint_rom.xml(); - bool const new_depot_query_needed = blueprint_any_missing(blueprint) - || blueprint_any_rom_missing(blueprint) - || any_completed_download; - if (new_depot_query_needed) - trigger_depot_query(); + _blueprint_rom.with_xml([&] (Xml_node const &blueprint) { + bool const new_depot_query_needed = blueprint_any_missing(blueprint) + || blueprint_any_rom_missing(blueprint) + || any_completed_download; + if (new_depot_query_needed) + trigger_depot_query(); + }); _deploy.reattempt_after_installation(); } @@ -1853,12 +1796,8 @@ void Sculpt::Main::_handle_update_state() } -void Sculpt::Main::_handle_runtime_state() +void Sculpt::Main::_handle_runtime_state(Xml_node const &state) { - _runtime_state_rom.update(); - - Xml_node state = _runtime_state_rom.xml(); - _runtime_state.update_from_state_report(state); bool reconfigure_runtime = false; diff --git a/repos/gems/src/app/sculpt_manager/managed_config.h b/repos/gems/src/app/sculpt_manager/managed_config.h index 5b6e569946..6e9085f4e9 100644 --- a/repos/gems/src/app/sculpt_manager/managed_config.h +++ b/repos/gems/src/app/sculpt_manager/managed_config.h @@ -37,7 +37,7 @@ struct Sculpt::Managed_config HANDLER &_obj; - void (HANDLER::*_handle) (Xml_node); + void (HANDLER::*_handle) (Xml_node const &); /* * Configuration supplied by the user @@ -97,7 +97,7 @@ struct Sculpt::Managed_config Managed_config(Env &env, Xml_node_name const &xml_node_name, Rom_name const &rom_name, - HANDLER &obj, void (HANDLER::*handle) (Xml_node)) + HANDLER &obj, void (HANDLER::*handle) (Xml_node const &)) : _env(env), _obj(obj), _handle(handle), _manual_config_rom(_env, Label("config -> ", rom_name).string()), diff --git a/repos/gems/src/app/sculpt_manager/model/storage_device.h b/repos/gems/src/app/sculpt_manager/model/storage_device.h index 95bb701668..85c2f416ee 100644 --- a/repos/gems/src/app/sculpt_manager/model/storage_device.h +++ b/repos/gems/src/app/sculpt_manager/model/storage_device.h @@ -66,11 +66,9 @@ struct Sculpt::Storage_device Partitions partitions { }; - Attached_rom_dataspace _partitions { - _env, String<80>("report -> runtime/", part_block_start_name(), "/partitions").string() }; - - Signal_handler _partitions_handler { - _env.ep(), *this, &Storage_device::_handle_partitions }; + Rom_handler _partitions { + _env, String<80>("report -> runtime/", part_block_start_name(), "/partitions").string(), + *this, &Storage_device::_handle_partitions }; unsigned _part_block_version = 0; @@ -102,39 +100,37 @@ struct Sculpt::Storage_device _update_partitions_from_xml(Xml_node("")); } - void _handle_partitions() - { - _partitions.update(); - _action.storage_device_discovered(); - } + void _handle_partitions(Xml_node const &) { _action.storage_device_discovered(); } void process_partitions() { - Xml_node const report = _partitions.xml(); - if (!report.has_type("partitions")) - return; + _partitions.with_xml([&] (Xml_node const &report) { - whole_device = (report.attribute_value("type", String<16>()) == "disk"); + if (!report.has_type("partitions")) + return; - _update_partitions_from_xml(report); + whole_device = (report.attribute_value("type", String<16>()) == "disk"); - /* - * Import whole-device partition information. - * - * Ignore reports that come in while the device is in use. Otherwise, - * the reconstruction of 'whole_device_partition' would wrongly reset - * the partition state such as the 'file_system.inspected' flag. - */ - if (!whole_device_partition.constructed() || whole_device_partition->idle()) { - whole_device_partition.construct(Partition::Args::whole_device(capacity)); - report.for_each_sub_node("partition", [&] (Xml_node partition) { - if (partition.attribute_value("number", Partition::Number()) == "0") - whole_device_partition.construct(Partition::Args::from_xml(partition)); }); - } + _update_partitions_from_xml(report); - /* finish initial discovery phase */ - if (state == UNKNOWN) - state = RELEASED; + /* + * Import whole-device partition information. + * + * Ignore reports that come in while the device is in use. Otherwise, + * the reconstruction of 'whole_device_partition' would wrongly reset + * the partition state such as the 'file_system.inspected' flag. + */ + if (!whole_device_partition.constructed() || whole_device_partition->idle()) { + whole_device_partition.construct(Partition::Args::whole_device(capacity)); + report.for_each_sub_node("partition", [&] (Xml_node partition) { + if (partition.attribute_value("number", Partition::Number()) == "0") + whole_device_partition.construct(Partition::Args::from_xml(partition)); }); + } + + /* finish initial discovery phase */ + if (state == UNKNOWN) + state = RELEASED; + }); } Storage_device(Env &env, Allocator &alloc, Driver const &driver, @@ -142,10 +138,7 @@ struct Sculpt::Storage_device : _env(env), _alloc(alloc), _action(action), driver(driver), port(port), capacity(capacity) - { - _partitions.sigh(_partitions_handler); - _partitions_handler.local_submit(); - } + { } ~Storage_device() { diff --git a/repos/gems/src/app/sculpt_manager/model/usb_storage_device.h b/repos/gems/src/app/sculpt_manager/model/usb_storage_device.h index 4a8d53f730..41562e5b44 100644 --- a/repos/gems/src/app/sculpt_manager/model/usb_storage_device.h +++ b/repos/gems/src/app/sculpt_manager/model/usb_storage_device.h @@ -51,31 +51,23 @@ struct Sculpt::Usb_storage_device : List_model::Element, /* information provided asynchronously by usb_block_drv */ Constructible driver_info { }; - Attached_rom_dataspace _report { - _env, String<80>("report -> runtime/", driver, "/devices").string() }; + Rom_handler _report { + _env, String<80>("report -> runtime/", driver, "/devices").string(), + *this, &Usb_storage_device::_handle_report }; - Signal_handler _report_handler { - _env.ep(), *this, &Usb_storage_device::_handle_report }; - - void _handle_report() - { - _report.update(); - _action.storage_device_discovered(); - } + void _handle_report(Xml_node const &) { _action.storage_device_discovered(); } void process_report() { - Xml_node report = _report.xml(); + _report.with_xml([&] (Xml_node const &report) { + report.with_optional_sub_node("device", [&] (Xml_node const &device) { - if (!report.has_sub_node("device")) - return; + capacity = Capacity { device.attribute_value("block_count", 0ULL) + * device.attribute_value("block_size", 0ULL) }; - Xml_node const device = report.sub_node("device"); - - capacity = Capacity { device.attribute_value("block_count", 0ULL) - * device.attribute_value("block_size", 0ULL) }; - - driver_info.construct(device); + driver_info.construct(device); + }); + }); } bool usb_block_drv_needed() const @@ -122,10 +114,7 @@ struct Sculpt::Usb_storage_device : List_model::Element, : Storage_device(env, alloc, _driver(node), Port { }, Capacity{0}, action), _env(env) - { - _report.sigh(_report_handler); - _report_handler.local_submit(); - } + { } inline void gen_usb_block_drv_start_content(Xml_generator &xml) const; diff --git a/repos/gems/src/app/sculpt_manager/network.cc b/repos/gems/src/app/sculpt_manager/network.cc index 0b79193e25..1e481831e4 100644 --- a/repos/gems/src/app/sculpt_manager/network.cc +++ b/repos/gems/src/app/sculpt_manager/network.cc @@ -152,17 +152,15 @@ void Sculpt::Network::_generate_nic_router_config() } -void Sculpt::Network::_handle_wlan_accesspoints() +void Sculpt::Network::_handle_wlan_accesspoints(Xml_node const &accesspoints) { - bool const initial_scan = !_wlan_accesspoints_rom.xml().has_sub_node("accesspoint"); - - _wlan_accesspoints_rom.update(); + bool const initial_scan = !accesspoints.has_sub_node("accesspoint"); /* suppress updating the list while the access-point list is hovered */ if (!initial_scan && _info.ap_list_hovered()) return; - _access_points.update_from_xml(_wlan_accesspoints_rom.xml(), + _access_points.update_from_xml(accesspoints, /* create */ [&] (Xml_node const &node) -> Access_point & @@ -193,20 +191,17 @@ void Sculpt::Network::_handle_wlan_accesspoints() } -void Sculpt::Network::_handle_wlan_state() +void Sculpt::Network::_handle_wlan_state(Xml_node const &state) { - _wlan_state_rom.update(); - _wifi_connection = Wifi_connection::from_xml(_wlan_state_rom.xml()); + _wifi_connection = Wifi_connection::from_xml(state); _action.network_config_changed(); } -void Sculpt::Network::_handle_nic_router_state() +void Sculpt::Network::_handle_nic_router_state(Xml_node const &state) { - _nic_router_state_rom.update(); - Nic_state const old_nic_state = _nic_state; - _nic_state = Nic_state::from_xml(_nic_router_state_rom.xml()); + _nic_state = Nic_state::from_xml(state); if (_nic_state.ipv4 != old_nic_state.ipv4) _action.network_config_changed(); @@ -254,7 +249,7 @@ void Sculpt::Network::_update_nic_target_from_config(Xml_node const &config) -void Sculpt::Network::_handle_nic_router_config(Xml_node config) +void Sculpt::Network::_handle_nic_router_config(Xml_node const &config) { _update_nic_target_from_config(config); _generate_nic_router_config(); diff --git a/repos/gems/src/app/sculpt_manager/network.h b/repos/gems/src/app/sculpt_manager/network.h index af8c8350a1..db6ed466e3 100644 --- a/repos/gems/src/app/sculpt_manager/network.h +++ b/repos/gems/src/app/sculpt_manager/network.h @@ -64,14 +64,14 @@ struct Sculpt::Network : Noncopyable unsigned _nic_drv_version = 0; unsigned _wifi_drv_version = 0; - Attached_rom_dataspace _wlan_accesspoints_rom { - _env, "report -> runtime/wifi/accesspoints" }; + Rom_handler _wlan_accesspoints_rom { + _env, "report -> runtime/wifi/accesspoints", *this, &Network::_handle_wlan_accesspoints }; - Attached_rom_dataspace _wlan_state_rom { - _env, "report -> runtime/wifi/state" }; + Rom_handler _wlan_state_rom { + _env, "report -> runtime/wifi/state", *this, &Network::_handle_wlan_state }; - Attached_rom_dataspace _nic_router_state_rom { - _env, "report -> runtime/nic_router/state" }; + Rom_handler _nic_router_state_rom { + _env, "report -> runtime/nic_router/state", *this, &Network::_handle_nic_router_state }; void _generate_nic_router_config(); @@ -87,23 +87,14 @@ struct Sculpt::Network : Noncopyable void handle_key_press(Codepoint); - void _handle_wlan_accesspoints(); - void _handle_wlan_state(); - void _handle_nic_router_state(); - void _handle_nic_router_config(Xml_node); + void _handle_wlan_accesspoints(Xml_node const &); + void _handle_wlan_state(Xml_node const &); + void _handle_nic_router_state(Xml_node const &); + void _handle_nic_router_config(Xml_node const &); Managed_config _nic_router_config { _env, "config", "nic_router", *this, &Network::_handle_nic_router_config }; - Signal_handler _wlan_accesspoints_handler { - _env.ep(), *this, &Network::_handle_wlan_accesspoints }; - - Signal_handler _wlan_state_handler { - _env.ep(), *this, &Network::_handle_wlan_state }; - - Signal_handler _nic_router_state_handler { - _env.ep(), *this, &Network::_handle_nic_router_state }; - Wlan_config_policy _wlan_config_policy = Wlan_config_policy::MANAGED; Network_widget dialog { @@ -113,7 +104,7 @@ struct Sculpt::Network : Noncopyable Managed_config _wlan_config { _env, "config", "wifi", *this, &Network::_handle_wlan_config }; - void _handle_wlan_config(Xml_node) + void _handle_wlan_config(Xml_node const &) { if (_wlan_config.try_generate_manually_managed()) { _wlan_config_policy = Wlan_config_policy::MANUAL; @@ -213,13 +204,6 @@ struct Sculpt::Network : Noncopyable _child_states(child_states), _runtime_config_generator(runtime_config_generator) { - /* - * Subscribe to reports - */ - _wlan_accesspoints_rom.sigh(_wlan_accesspoints_handler); - _wlan_state_rom .sigh(_wlan_state_handler); - _nic_router_state_rom .sigh(_nic_router_state_handler); - /* * Evaluate and forward initial manually managed config */ diff --git a/repos/gems/src/app/sculpt_manager/view/depot_users_widget.h b/repos/gems/src/app/sculpt_manager/view/depot_users_widget.h index 8b02ef8754..654e73ebaf 100644 --- a/repos/gems/src/app/sculpt_manager/view/depot_users_widget.h +++ b/repos/gems/src/app/sculpt_manager/view/depot_users_widget.h @@ -25,7 +25,7 @@ struct Sculpt::Depot_users_widget : Widget { public: - using Depot_users = Attached_rom_dataspace; + using Depot_users = Rom_data; using User = Depot::Archive::User; using Url = Depot_url::Url; @@ -215,10 +215,8 @@ struct Sculpt::Depot_users_widget : Widget return (_selected == _add_id()) ? User() : _selected; } - void view(Scope &s) const + void _view(Scope &s, Xml_node const &depot_users) const { - Xml_node const depot_users = _depot_users.xml(); - bool known_pubkey = false; s.sub_scope([&] (Scope &s) { @@ -255,6 +253,12 @@ struct Sculpt::Depot_users_widget : Widget } } + void view(Scope &s) const + { + _depot_users.with_xml([&] (Xml_node const &depot_users) { + _view(s, depot_users); }); + } + bool unfolded() const { return _unfolded || !_selected_user_exists; } struct User_properties @@ -267,14 +271,16 @@ struct Sculpt::Depot_users_widget : Widget User_properties selected_user_properties() const { User_properties result { }; - _depot_users.xml().for_each_sub_node([&] (Xml_node const &user) { - if (_selected == user.attribute_value("name", User())) { - result = { - .exists = true, - .download_url = Depot_url::from_string(_url(user)).valid(), - .public_key = user.attribute_value("known_pubkey", false) - }; - } + _depot_users.with_xml([&] (Xml_node const &users) { + users.for_each_sub_node([&] (Xml_node const &user) { + if (_selected == user.attribute_value("name", User())) { + result = { + .exists = true, + .download_url = Depot_url::from_string(_url(user)).valid(), + .public_key = user.attribute_value("known_pubkey", false) + }; + } + }); }); return result; } @@ -289,11 +295,13 @@ struct Sculpt::Depot_users_widget : Widget void _add_and_select_new_depot_user(Action &action) { - Depot_url const depot_url = _edit_item.depot_url(_depot_users.xml()); - if (depot_url.valid()) { - action.add_depot_url(depot_url); - _select_depot_user(depot_url.user); - } + _depot_users.with_xml([&] (Xml_node const &users) { + Depot_url const depot_url = _edit_item.depot_url(users); + if (depot_url.valid()) { + action.add_depot_url(depot_url); + _select_depot_user(depot_url.user); + } + }); } void click(Clicked_at const &at, Action &action, auto const &select_fn) @@ -314,8 +322,9 @@ struct Sculpt::Depot_users_widget : Widget } } - _edit_item.propagate(at, _depot_users.xml(), [&] { - _add_and_select_new_depot_user(action); }); + _depot_users.with_xml([&] (Xml_node const &users) { + _edit_item.propagate(at, users, [&] { + _add_and_select_new_depot_user(action); }); }); } bool keyboard_needed() const { return _selected == _add_id(); } @@ -337,9 +346,10 @@ struct Sculpt::Depot_users_widget : Widget */ _selected_user_exists = false; - _depot_users.xml().for_each_sub_node([&] (Xml_node const &user) { - if (_selected == user.attribute_value("name", User())) - _selected_user_exists = true; }); + _depot_users.with_xml([&] (Xml_node const &users) { + users.for_each_sub_node([&] (Xml_node const &user) { + if (_selected == user.attribute_value("name", User())) + _selected_user_exists = true; }); }); } }; diff --git a/repos/gems/src/app/sculpt_manager/view/popup_dialog.cc b/repos/gems/src/app/sculpt_manager/view/popup_dialog.cc index 7943e2334b..b39607eb05 100644 --- a/repos/gems/src/app/sculpt_manager/view/popup_dialog.cc +++ b/repos/gems/src/app/sculpt_manager/view/popup_dialog.cc @@ -357,9 +357,10 @@ void Popup_dialog::click(Clicked_at const &at) auto with_matching_user = [&] (Id const &id, auto const &fn) { unsigned count = 0; - _depot_users.xml().for_each_sub_node("user", [&] (Xml_node const &user) { - if (id == user_id(count++)) - fn(user.attribute_value("name", User())); }); + _depot_users.with_xml([&] (Xml_node const &users) { + users.for_each_sub_node("user", [&] (Xml_node const &user) { + if (id == user_id(count++)) + fn(user.attribute_value("name", User())); }); }); }; State const orig_state = _state; diff --git a/repos/gems/src/app/sculpt_manager/view/popup_dialog.h b/repos/gems/src/app/sculpt_manager/view/popup_dialog.h index 37e200ec22..07a8f4dd3e 100644 --- a/repos/gems/src/app/sculpt_manager/view/popup_dialog.h +++ b/repos/gems/src/app/sculpt_manager/view/popup_dialog.h @@ -34,7 +34,7 @@ namespace Sculpt { struct Popup_dialog; } struct Sculpt::Popup_dialog : Dialog::Top_level_dialog { - using Depot_users = Attached_rom_dataspace; + using Depot_users = Rom_data; using Blueprint_info = Component::Blueprint_info; Env &_env; @@ -234,7 +234,8 @@ struct Sculpt::Popup_dialog : Dialog::Top_level_dialog { s.sub_scope([&] (Scope &s) { s.sub_scope([&] (Scope &s) { - _view_menu_elements(s, _depot_users.xml()); }); }); + _depot_users.with_xml([&] (Xml_node const &users) { + _view_menu_elements(s, users); }); }); }); } void click(Clicked_at const &) override; diff --git a/repos/gems/src/app/sculpt_manager/view/software_update_widget.h b/repos/gems/src/app/sculpt_manager/view/software_update_widget.h index 266b1f67bb..8248b2643b 100644 --- a/repos/gems/src/app/sculpt_manager/view/software_update_widget.h +++ b/repos/gems/src/app/sculpt_manager/view/software_update_widget.h @@ -27,7 +27,6 @@ struct Sculpt::Software_update_widget : Widget { using Depot_users = Depot_users_widget::Depot_users; using User = Depot_users_widget::User; - using Image_index = Attached_rom_dataspace; using Version = String<16>; Build_info const _build_info; @@ -36,7 +35,6 @@ struct Sculpt::Software_update_widget : Widget Download_queue const &_download_queue; Index_update_queue const &_index_update_queue; File_operation_queue const &_file_operation_queue; - Image_index const &_image_index; Path _last_installed { }; Path _last_selected { }; @@ -209,14 +207,12 @@ struct Sculpt::Software_update_widget : Widget Download_queue const &download_queue, Index_update_queue const &index_update_queue, File_operation_queue const &file_operation_queue, - Depot_users const &depot_users, - Image_index const &image_index) + Depot_users const &depot_users) : _build_info(build_info), _nic_state(nic_state), _download_queue(download_queue), _index_update_queue(index_update_queue), _file_operation_queue(file_operation_queue), - _image_index(image_index), _users(Id { "users" }, depot_users, _build_info.depot_user) { } diff --git a/repos/gems/src/app/sculpt_manager/view/system_dialog.h b/repos/gems/src/app/sculpt_manager/view/system_dialog.h index 967a7d0b2c..d8874122b4 100644 --- a/repos/gems/src/app/sculpt_manager/view/system_dialog.h +++ b/repos/gems/src/app/sculpt_manager/view/system_dialog.h @@ -26,7 +26,7 @@ namespace Sculpt { struct System_dialog; } struct Sculpt::System_dialog : Top_level_dialog { using Depot_users = Depot_users_widget::Depot_users; - using Image_index = Attached_rom_dataspace; + using Image_index = Rom_data; Presets const &_presets; Image_index const &_image_index; @@ -65,7 +65,8 @@ struct Sculpt::System_dialog : Top_level_dialog s.widget(_presets_widget, _presets); break; case Tab::UPDATE: - s.widget(_update_widget, _image_index.xml()); + _image_index.with_xml([&] (Xml_node const &index) { + s.widget(_update_widget, index); }); s.widget(_version_widget, _build_info); break; }; @@ -107,8 +108,7 @@ struct Sculpt::System_dialog : Top_level_dialog _presets_action(presets_action), _update_action(update_action), _update_widget(Id { "update" }, build_info, nic_state, download_queue, - index_update_queue, file_operation_queue, depot_users, - image_index) + index_update_queue, file_operation_queue, depot_users) { } bool update_tab_selected() const { return _selected_tab == Tab::UPDATE; } diff --git a/repos/gems/src/app/sculpt_manager/xml.h b/repos/gems/src/app/sculpt_manager/xml.h index cc96c8af53..3b41b669af 100644 --- a/repos/gems/src/app/sculpt_manager/xml.h +++ b/repos/gems/src/app/sculpt_manager/xml.h @@ -16,6 +16,7 @@ /* Genode includes */ #include +#include #include /* local includes */ @@ -162,6 +163,52 @@ namespace Sculpt { from.for_each_sub_node([&] (Xml_node const &sub_node) { copy_node(xml, sub_node, { max_depth.value - 1 }); }); }); } + + struct Rom_data : Noncopyable + { + protected: + + Xml_node _node { "" }; + + public: + + void with_xml(auto const &fn) const { fn(_node); } + + bool valid() const { return !_node.has_type("empty"); } + }; + + template + class Rom_handler : public Rom_data + { + private: + + Attached_rom_dataspace _rom; + + T &_obj; + + void (T::*_member) (Xml_node const &); + + Signal_handler _handler; + + void _handle() + { + _rom.update(); + _node = _rom.xml(); + (_obj.*_member)(_node); + } + + public: + + Rom_handler(Env &env, Session_label const &label, + T &obj, void (T::*member)(Xml_node const &)) + : + _rom(env, label.string()), _obj(obj), _member(member), + _handler(env.ep(), *this, &Rom_handler::_handle) + { + _rom.sigh(_handler); + _handler.local_submit(); + } + }; } #endif /* _XML_H_ */