From 7d143087c90c52ad2fe8dbc91b210b83c6c2dac7 Mon Sep 17 00:00:00 2001 From: Johannes Schlatow Date: Thu, 8 Sep 2022 10:17:26 +0200 Subject: [PATCH] xml_node: change `with_sub_node` signature The `with_sub_node` method is renamed to `with_optional_sub_node` to better reflect that the non-existence of a sub node with the desired type is ignored. At the same time, the new `with_sub_node` now takes a second functor that is called when no sub node of the desired type exists. genodelabs/genode#4600 --- repos/base/include/base/affinity.h | 6 +- repos/base/include/util/xml_node.h | 17 +- repos/base/src/lib/ldso/include/config.h | 2 +- repos/dde_ipxe/src/drivers/nic/main.cc | 2 +- repos/gems/include/cbe/init/configuration.h | 4 +- repos/gems/src/app/cbe_tester/verbose_node.h | 2 +- repos/gems/src/app/depot_deploy/child.h | 4 +- repos/gems/src/app/depot_deploy/main.cc | 4 +- .../src/app/depot_download_manager/main.cc | 4 +- repos/gems/src/app/file_vault/main.cc | 230 +++++++++--------- repos/gems/src/app/gpt_write/main.cc | 2 +- repos/gems/src/app/menu_view/main.cc | 2 +- repos/gems/src/app/sculpt_manager/main.cc | 2 +- .../gems/src/app/sculpt_manager/menu_view.cc | 2 +- .../src/app/sculpt_manager/model/component.h | 4 +- .../sculpt_manager/model/file_browser_state.h | 2 +- .../app/sculpt_manager/model/runtime_config.h | 12 +- .../gems/src/app/sculpt_manager/view/dialog.h | 2 +- .../sculpt_manager/view/file_browser_dialog.h | 2 +- repos/gems/src/app/text_area/dialog.cc | 14 +- repos/gems/src/app/text_area/main.cc | 6 +- repos/gems/src/app/touch_keyboard/main.cc | 2 +- .../touch_keyboard/touch_keyboard_dialog.cc | 8 +- repos/gems/src/server/terminal/main.cc | 2 +- .../libports/src/lib/libc/file_operations.cc | 4 +- repos/libports/src/lib/libc/fork.cc | 2 +- .../src/lib/libc/internal/vfs_plugin.h | 2 +- repos/libports/src/lib/libc/kernel.cc | 2 +- repos/libports/src/lib/qemu-usb/qemu_emul.cc | 2 +- repos/os/include/os/session_policy.h | 2 +- repos/os/src/app/pci_decode/main.cc | 2 +- repos/os/src/drivers/framebuffer/boot/main.cc | 4 +- repos/os/src/drivers/nic/spec/linux/main.cc | 2 +- .../src/drivers/platform/legacy/x86/main.cc | 4 +- repos/os/src/init/main.cc | 2 +- repos/os/src/lib/genode_c_api/usb.cc | 2 +- repos/os/src/lib/sandbox/child.cc | 4 +- repos/os/src/lib/sandbox/child.h | 12 +- repos/os/src/lib/sandbox/utils.h | 2 +- repos/os/src/server/nic_perf/interface.h | 18 +- .../os/src/server/nic_perf/packet_generator.h | 2 +- repos/os/src/server/nic_router/dhcp_server.cc | 2 +- .../src/test/nic_router_dhcp/manager/main.cc | 2 +- repos/os/src/test/resource_request/main.cc | 4 +- .../ports/src/virtualbox5/generic/sup_vmm.cc | 2 +- repos/ports/src/virtualbox5/spec/nova/sup.cc | 2 +- repos/ports/src/virtualbox6/sup_drv.cc | 8 +- 47 files changed, 220 insertions(+), 205 deletions(-) diff --git a/repos/base/include/base/affinity.h b/repos/base/include/base/affinity.h index 81d56f2f40..a41bcc4a24 100644 --- a/repos/base/include/base/affinity.h +++ b/repos/base/include/base/affinity.h @@ -189,10 +189,10 @@ class Genode::Affinity Affinity::Space space { }; Affinity::Location location { }; - node.with_sub_node("affinity", [&] (Xml_node const &node) { - node.with_sub_node("space", [&] (Xml_node const &node) { + node.with_optional_sub_node("affinity", [&] (Xml_node const &node) { + node.with_optional_sub_node("space", [&] (Xml_node const &node) { space = Space::from_xml(node); }); - node.with_sub_node("location", [&] (Xml_node const &node) { + node.with_optional_sub_node("location", [&] (Xml_node const &node) { location = Location::from_xml(space, node); }); }); diff --git a/repos/base/include/util/xml_node.h b/repos/base/include/util/xml_node.h index fede99d2b9..12b761c742 100644 --- a/repos/base/include/util/xml_node.h +++ b/repos/base/include/util/xml_node.h @@ -846,12 +846,27 @@ class Genode::Xml_node * If no matching sub node exists, the functor is not called. */ template - void with_sub_node(char const *type, FN const &fn) const + void with_optional_sub_node(char const *type, FN const &fn) const { if (has_sub_node(type)) fn(sub_node(type)); } + /** + * Apply functor 'fn' to first sub node of specified type + * + * The functor is called with the sub node as argument. + * If no matching sub node exists, the functor 'fn_nexists' is called. + */ + template + void with_sub_node(char const *type, FN const &fn, FN_NEXISTS const &fn_nexists) const + { + if (has_sub_node(type)) + fn(sub_node(type)); + else + fn_nexists(); + } + /** * Execute functor 'fn' for each sub node of specified type */ diff --git a/repos/base/src/lib/ldso/include/config.h b/repos/base/src/lib/ldso/include/config.h index 5708df0930..2ad11c87a2 100644 --- a/repos/base/src/lib/ldso/include/config.h +++ b/repos/base/src/lib/ldso/include/config.h @@ -68,7 +68,7 @@ class Linker::Config : Noncopyable template void for_each_library(FN const &fn) const { - _config.with_sub_node("ld", [&] (Xml_node ld) { + _config.with_optional_sub_node("ld", [&] (Xml_node ld) { ld.for_each_sub_node("library", [&] (Xml_node lib) { diff --git a/repos/dde_ipxe/src/drivers/nic/main.cc b/repos/dde_ipxe/src/drivers/nic/main.cc index 42c5a4f4d3..907a461853 100644 --- a/repos/dde_ipxe/src/drivers/nic/main.cc +++ b/repos/dde_ipxe/src/drivers/nic/main.cc @@ -133,7 +133,7 @@ struct Main _uplink.construct(_env, _heap); - _config_rom.xml().with_sub_node("report", [&] (Xml_node const &xml) { + _config_rom.xml().with_optional_sub_node("report", [&] (Xml_node const &xml) { bool const report_mac_address = xml.attribute_value("mac_address", false); diff --git a/repos/gems/include/cbe/init/configuration.h b/repos/gems/include/cbe/init/configuration.h index 3b7e0fa363..5a5428d6b5 100644 --- a/repos/gems/include/cbe/init/configuration.h +++ b/repos/gems/include/cbe/init/configuration.h @@ -37,7 +37,7 @@ class Cbe_init::Configuration Configuration (Genode::Xml_node const &node) { - node.with_sub_node("virtual-block-device", + node.with_optional_sub_node("virtual-block-device", [&] (Genode::Xml_node const &vbd) { _vbd_nr_of_lvls = @@ -47,7 +47,7 @@ class Cbe_init::Configuration _vbd_nr_of_leafs = vbd.attribute_value("nr_of_leafs", (Genode::uint64_t)0); }); - node.with_sub_node("free-tree", + node.with_optional_sub_node("free-tree", [&] (Genode::Xml_node const &ft) { _ft_nr_of_lvls = diff --git a/repos/gems/src/app/cbe_tester/verbose_node.h b/repos/gems/src/app/cbe_tester/verbose_node.h index 3b94a30a98..9aa0f1131f 100644 --- a/repos/gems/src/app/cbe_tester/verbose_node.h +++ b/repos/gems/src/app/cbe_tester/verbose_node.h @@ -37,7 +37,7 @@ class Verbose_node Verbose_node(Genode::Xml_node const &config) { - config.with_sub_node("verbose", [&] (Genode::Xml_node const &verbose) + config.with_optional_sub_node("verbose", [&] (Genode::Xml_node const &verbose) { _cmd_pool_cmd_pending = verbose.attribute_value("cmd_pool_cmd_pending" , false); _cmd_pool_cmd_in_progress = verbose.attribute_value("cmd_pool_cmd_in_progress", false); diff --git a/repos/gems/src/app/depot_deploy/child.h b/repos/gems/src/app/depot_deploy/child.h index 0d7935b98d..cd55356324 100644 --- a/repos/gems/src/app/depot_deploy/child.h +++ b/repos/gems/src/app/depot_deploy/child.h @@ -428,11 +428,11 @@ void Depot_deploy::Child::gen_start_node(Xml_generator &xml, Affinity::Location location { }; if (affinity_from_launcher) - launcher_xml.with_sub_node("affinity", [&] (Xml_node node) { + launcher_xml.with_optional_sub_node("affinity", [&] (Xml_node node) { location = Affinity::Location::from_xml(affinity_space, node); }); if (affinity_from_start) - start_xml.with_sub_node("affinity", [&] (Xml_node node) { + start_xml.with_optional_sub_node("affinity", [&] (Xml_node node) { location = Affinity::Location::from_xml(affinity_space, node); }); xml.node("affinity", [&] () { diff --git a/repos/gems/src/app/depot_deploy/main.cc b/repos/gems/src/app/depot_deploy/main.cc index 65f51aa970..186c058b0c 100644 --- a/repos/gems/src/app/depot_deploy/main.cc +++ b/repos/gems/src/app/depot_deploy/main.cc @@ -85,7 +85,7 @@ struct Depot_deploy::Main static_config.with_raw_content([&] (char const *start, size_t length) { xml.append(start, length); }); - config.with_sub_node("report", [&] (Xml_node const &report) { + config.with_optional_sub_node("report", [&] (Xml_node const &report) { auto copy_bool_attribute = [&] (char const* name) { if (report.has_attribute(name)) { @@ -120,7 +120,7 @@ struct Depot_deploy::Main }); }); - config.with_sub_node("heartbeat", [&] (Xml_node const &heartbeat) { + config.with_optional_sub_node("heartbeat", [&] (Xml_node const &heartbeat) { size_t const rate_ms = heartbeat.attribute_value("rate_ms", 2000UL); xml.node("heartbeat", [&] () { xml.attribute("rate_ms", rate_ms); diff --git a/repos/gems/src/app/depot_download_manager/main.cc b/repos/gems/src/app/depot_download_manager/main.cc index 2b29f57d0d..6c6b1a16ba 100644 --- a/repos/gems/src/app/depot_download_manager/main.cc +++ b/repos/gems/src/app/depot_download_manager/main.cc @@ -409,13 +409,13 @@ void Depot_download_manager::Main::_handle_query_result() Archive::User user { }; if (missing_index_files) - index.with_sub_node("missing", [&] (Xml_node missing) { + index.with_optional_sub_node("missing", [&] (Xml_node missing) { user = missing.attribute_value("user", Archive::User()); }); if (user.valid()) return user; - dependencies.with_sub_node("missing", [&] (Xml_node missing) { + dependencies.with_optional_sub_node("missing", [&] (Xml_node missing) { user = Archive::user(missing.attribute_value("path", Archive::Path())); }); if (!user.valid()) diff --git a/repos/gems/src/app/file_vault/main.cc b/repos/gems/src/app/file_vault/main.cc index e944481640..e20ebd6bda 100644 --- a/repos/gems/src/app/file_vault/main.cc +++ b/repos/gems/src/app/file_vault/main.cc @@ -541,7 +541,7 @@ bool Main::cbe_control_file_yields_state_idle(Xml_node const &fs_query_listing, { bool result { false }; bool done { false }; - fs_query_listing.with_sub_node("dir", [&] (Xml_node const &node_0) { + fs_query_listing.with_optional_sub_node("dir", [&] (Xml_node const &node_0) { node_0.for_each_sub_node("file", [&] (Xml_node const &node_1) { if (done) { return; @@ -631,8 +631,8 @@ Main::State_string Main::_state_to_string(State state) Main::State Main::_state_from_fs_query_listing(Xml_node const &node) { State state { State::INVALID }; - node.with_sub_node("dir", [&] (Xml_node const &node_0) { - node_0.with_sub_node("file", [&] (Xml_node const &node_1) { + node.with_optional_sub_node("dir", [&] (Xml_node const &node_0) { + node_0.with_optional_sub_node("file", [&] (Xml_node const &node_1) { if (_has_name(node_1, "state")) { state = _state_from_string( node_1.decoded_content()); @@ -817,7 +817,7 @@ void Main::_handle_snapshots_fs_query_listing(Xml_node const &node) case State::CONTROLS_SECURITY_USER_PASSPHRASE: { bool update_dialog { false }; - node.with_sub_node("dir", [&] (Xml_node const &node_0) { + node.with_optional_sub_node("dir", [&] (Xml_node const &node_0) { _snapshots.for_each([&] (Snapshot const &snap) { @@ -931,8 +931,8 @@ void Main::_handle_client_fs_fs_query_listing(Xml_node const &node) switch (_state) { case State::STARTUP_DETERMINE_CLIENT_FS_SIZE: - node.with_sub_node("dir", [&] (Xml_node const &node_0) { - node_0.with_sub_node("file", [&] (Xml_node const &node_1) { + node.with_optional_sub_node("dir", [&] (Xml_node const &node_0) { + node_0.with_optional_sub_node("file", [&] (Xml_node const &node_1) { if (_has_name(node_1, "data")) { @@ -957,8 +957,8 @@ void Main::_handle_client_fs_fs_query_listing(Xml_node const &node) switch (_resizing_state) { case Resizing_state::DETERMINE_CLIENT_FS_SIZE: - node.with_sub_node("dir", [&] (Xml_node const &node_0) { - node_0.with_sub_node("file", [&] (Xml_node const &node_1) { + node.with_optional_sub_node("dir", [&] (Xml_node const &node_0) { + node_0.with_optional_sub_node("file", [&] (Xml_node const &node_1) { if (_has_name(node_1, "data")) { @@ -1010,8 +1010,8 @@ void Main::_handle_image_fs_query_listing(Xml_node const &node) case State::CONTROLS_SECURITY_USER_PASSPHRASE: { size_t size { 0 }; - node.with_sub_node("dir", [&] (Xml_node const &node_0) { - node_0.with_sub_node("file", [&] (Xml_node const &node_1) { + node.with_optional_sub_node("dir", [&] (Xml_node const &node_0) { + node_0.with_optional_sub_node("file", [&] (Xml_node const &node_1) { if (_has_name(node_1, "cbe.img")) { size = node_1.attribute_value("size", (size_t)0); } @@ -1063,7 +1063,7 @@ _child_nr_of_provided_sessions(Xml_node const &sandbox_state, if (child.attribute_value("name", String<128> { }) == child_state.start_name()) { - child.with_sub_node("provided", [&] (Xml_node const &provided) { + child.with_optional_sub_node("provided", [&] (Xml_node const &provided) { provided.for_each_sub_node("session", [&] (Xml_node const &session) { if (session.attribute_value("service", String<64> { }) == service_name) { @@ -3507,24 +3507,24 @@ void File_vault::Main::_handle_hover(Xml_node const &node) Setup_obtain_params_hover const prev_hover { _setup_obtain_params_hover }; Setup_obtain_params_hover next_hover { Setup_obtain_params_hover::NONE }; - node.with_sub_node("dialog", [&] (Xml_node const &node_0) { - node_0.with_sub_node("frame", [&] (Xml_node const &node_1) { - node_1.with_sub_node("vbox", [&] (Xml_node const &node_2) { + node.with_optional_sub_node("dialog", [&] (Xml_node const &node_0) { + node_0.with_optional_sub_node("frame", [&] (Xml_node const &node_1) { + node_1.with_optional_sub_node("vbox", [&] (Xml_node const &node_2) { - node_2.with_sub_node("float", [&] (Xml_node const &node_3) { + node_2.with_optional_sub_node("float", [&] (Xml_node const &node_3) { if (_has_name(node_3, "ok")) { next_hover = Setup_obtain_params_hover::START_BUTTON; } }); - node_2.with_sub_node("hbox", [&] (Xml_node const &node_3) { - node_3.with_sub_node("frame", [&] (Xml_node const &node_4) { + node_2.with_optional_sub_node("hbox", [&] (Xml_node const &node_3) { + node_3.with_optional_sub_node("frame", [&] (Xml_node const &node_4) { if (_has_name(node_4, "Passphrase")) { next_hover = Setup_obtain_params_hover::PASSPHRASE_INPUT; } }); - node_3.with_sub_node("float", [&] (Xml_node const &node_4) { - node_4.with_sub_node("button", [&] (Xml_node const &node_5) { + node_3.with_optional_sub_node("float", [&] (Xml_node const &node_4) { + node_4.with_optional_sub_node("button", [&] (Xml_node const &node_5) { if (_has_name(node_5, "Show Hide")) { next_hover = Setup_obtain_params_hover::PASSPHRASE_SHOW_HIDE_BUTTON; @@ -3532,7 +3532,7 @@ void File_vault::Main::_handle_hover(Xml_node const &node) }); }); }); - node_2.with_sub_node("frame", [&] (Xml_node const &node_3) { + node_2.with_optional_sub_node("frame", [&] (Xml_node const &node_3) { if (_has_name(node_3, "Client FS Size")) { next_hover = Setup_obtain_params_hover::CLIENT_FS_SIZE_INPUT; @@ -3556,24 +3556,24 @@ void File_vault::Main::_handle_hover(Xml_node const &node) Setup_obtain_params_hover const prev_hover { _setup_obtain_params_hover }; Setup_obtain_params_hover next_hover { Setup_obtain_params_hover::NONE }; - node.with_sub_node("dialog", [&] (Xml_node const &node_0) { - node_0.with_sub_node("frame", [&] (Xml_node const &node_1) { - node_1.with_sub_node("vbox", [&] (Xml_node const &node_2) { + node.with_optional_sub_node("dialog", [&] (Xml_node const &node_0) { + node_0.with_optional_sub_node("frame", [&] (Xml_node const &node_1) { + node_1.with_optional_sub_node("vbox", [&] (Xml_node const &node_2) { - node_2.with_sub_node("float", [&] (Xml_node const &node_3) { + node_2.with_optional_sub_node("float", [&] (Xml_node const &node_3) { if (_has_name(node_3, "ok")) { next_hover = Setup_obtain_params_hover::START_BUTTON; } }); - node_2.with_sub_node("hbox", [&] (Xml_node const &node_3) { - node_3.with_sub_node("frame", [&] (Xml_node const &node_4) { + node_2.with_optional_sub_node("hbox", [&] (Xml_node const &node_3) { + node_3.with_optional_sub_node("frame", [&] (Xml_node const &node_4) { if (_has_name(node_4, "Passphrase")) { next_hover = Setup_obtain_params_hover::PASSPHRASE_INPUT; } }); - node_3.with_sub_node("float", [&] (Xml_node const &node_4) { - node_4.with_sub_node("button", [&] (Xml_node const &node_5) { + node_3.with_optional_sub_node("float", [&] (Xml_node const &node_4) { + node_4.with_optional_sub_node("button", [&] (Xml_node const &node_5) { if (_has_name(node_5, "Show Hide")) { next_hover = Setup_obtain_params_hover::PASSPHRASE_SHOW_HIDE_BUTTON; @@ -3596,11 +3596,11 @@ void File_vault::Main::_handle_hover(Xml_node const &node) Controls_root_hover const prev_hover { _controls_root_hover }; Controls_root_hover next_hover { Controls_root_hover::NONE }; - node.with_sub_node("dialog", [&] (Xml_node const &node_0) { - node_0.with_sub_node("frame", [&] (Xml_node const &node_1) { - node_1.with_sub_node("vbox", [&] (Xml_node const &node_2) { - node_2.with_sub_node("hbox", [&] (Xml_node const &node_3) { - node_3.with_sub_node("button", [&] (Xml_node const &node_4) { + node.with_optional_sub_node("dialog", [&] (Xml_node const &node_0) { + node_0.with_optional_sub_node("frame", [&] (Xml_node const &node_1) { + node_1.with_optional_sub_node("vbox", [&] (Xml_node const &node_2) { + node_2.with_optional_sub_node("hbox", [&] (Xml_node const &node_3) { + node_3.with_optional_sub_node("button", [&] (Xml_node const &node_4) { if (_has_name(node_4, "Shut down")) { @@ -3609,9 +3609,9 @@ void File_vault::Main::_handle_hover(Xml_node const &node) } }); }); - node_2.with_sub_node("frame", [&] (Xml_node const &node_3) { - node_3.with_sub_node("vbox", [&] (Xml_node const &node_4) { - node_4.with_sub_node("vbox", [&] (Xml_node const &node_5) { + node_2.with_optional_sub_node("frame", [&] (Xml_node const &node_3) { + node_3.with_optional_sub_node("vbox", [&] (Xml_node const &node_4) { + node_4.with_optional_sub_node("vbox", [&] (Xml_node const &node_5) { if (_has_name(node_5, "Snapshots")) { @@ -3646,11 +3646,11 @@ void File_vault::Main::_handle_hover(Xml_node const &node) Snapshot_pointer const prev_snapshots_hover { _snapshots_hover }; Snapshot_pointer next_snapshots_hover { }; - node.with_sub_node("dialog", [&] (Xml_node const &node_0) { - node_0.with_sub_node("frame", [&] (Xml_node const &node_1) { - node_1.with_sub_node("vbox", [&] (Xml_node const &node_2) { - node_2.with_sub_node("hbox", [&] (Xml_node const &node_3) { - node_3.with_sub_node("button", [&] (Xml_node const &node_4) { + node.with_optional_sub_node("dialog", [&] (Xml_node const &node_0) { + node_0.with_optional_sub_node("frame", [&] (Xml_node const &node_1) { + node_1.with_optional_sub_node("vbox", [&] (Xml_node const &node_2) { + node_2.with_optional_sub_node("hbox", [&] (Xml_node const &node_3) { + node_3.with_optional_sub_node("button", [&] (Xml_node const &node_4) { if (_has_name(node_4, "Shut down")) { @@ -3658,20 +3658,20 @@ void File_vault::Main::_handle_hover(Xml_node const &node) } }); }); - node_2.with_sub_node("frame", [&] (Xml_node const &node_3) { - node_3.with_sub_node("vbox", [&] (Xml_node const &node_4) { - node_4.with_sub_node("vbox", [&] (Xml_node const &node_5) { + node_2.with_optional_sub_node("frame", [&] (Xml_node const &node_3) { + node_3.with_optional_sub_node("vbox", [&] (Xml_node const &node_4) { + node_4.with_optional_sub_node("vbox", [&] (Xml_node const &node_5) { if (_snapshots_select.valid()) { - node_5.with_sub_node("hbox", [&] (Xml_node const &node_6) { + node_5.with_optional_sub_node("hbox", [&] (Xml_node const &node_6) { if (_has_name(node_6, "Leave")) { next_hover = Controls_snapshots_hover::GENERATION_LEAVE_BUTTON; } }); - node_5.with_sub_node("button", [&] (Xml_node const &node_6) { + node_5.with_optional_sub_node("button", [&] (Xml_node const &node_6) { if (_has_name(node_6, "Discard")) { @@ -3681,18 +3681,18 @@ void File_vault::Main::_handle_hover(Xml_node const &node) } else { - node_5.with_sub_node("hbox", [&] (Xml_node const &node_6) { + node_5.with_optional_sub_node("hbox", [&] (Xml_node const &node_6) { if (_has_name(node_6, "Leave")) { next_hover = Controls_snapshots_hover::LEAVE_BUTTON; } }); - node_5.with_sub_node("vbox", [&] (Xml_node const &node_6) { + node_5.with_optional_sub_node("vbox", [&] (Xml_node const &node_6) { if (_has_name(node_6, "Generations")) { - node_6.with_sub_node("float", [&] (Xml_node const &node_7) { + node_6.with_optional_sub_node("float", [&] (Xml_node const &node_7) { Generation const generation { node_7.attribute_value( @@ -3710,7 +3710,7 @@ void File_vault::Main::_handle_hover(Xml_node const &node) }); } }); - node_5.with_sub_node("button", [&] (Xml_node const &node_6) { + node_5.with_optional_sub_node("button", [&] (Xml_node const &node_6) { if (_has_name(node_6, "Create")) { @@ -3741,11 +3741,11 @@ void File_vault::Main::_handle_hover(Xml_node const &node) Dimensions_hover const prev_hover { _dimensions_hover }; Dimensions_hover next_hover { Dimensions_hover::NONE }; - node.with_sub_node("dialog", [&] (Xml_node const &node_0) { - node_0.with_sub_node("frame", [&] (Xml_node const &node_1) { - node_1.with_sub_node("vbox", [&] (Xml_node const &node_2) { - node_2.with_sub_node("hbox", [&] (Xml_node const &node_3) { - node_3.with_sub_node("button", [&] (Xml_node const &node_4) { + node.with_optional_sub_node("dialog", [&] (Xml_node const &node_0) { + node_0.with_optional_sub_node("frame", [&] (Xml_node const &node_1) { + node_1.with_optional_sub_node("vbox", [&] (Xml_node const &node_2) { + node_2.with_optional_sub_node("hbox", [&] (Xml_node const &node_3) { + node_3.with_optional_sub_node("button", [&] (Xml_node const &node_4) { if (_has_name(node_4, "Shut down")) { @@ -3753,16 +3753,16 @@ void File_vault::Main::_handle_hover(Xml_node const &node) } }); }); - node_2.with_sub_node("frame", [&] (Xml_node const &node_3) { - node_3.with_sub_node("vbox", [&] (Xml_node const &node_4) { - node_4.with_sub_node("hbox", [&] (Xml_node const &node_5) { + node_2.with_optional_sub_node("frame", [&] (Xml_node const &node_3) { + node_3.with_optional_sub_node("vbox", [&] (Xml_node const &node_4) { + node_4.with_optional_sub_node("hbox", [&] (Xml_node const &node_5) { if (_has_name(node_5, "Leave")) { next_hover = Dimensions_hover::LEAVE_BUTTON; } }); - node_4.with_sub_node("vbox", [&] (Xml_node const &node_5) { + node_4.with_optional_sub_node("vbox", [&] (Xml_node const &node_5) { if (_has_name(node_5, "Expand Client FS")) { @@ -3793,11 +3793,11 @@ void File_vault::Main::_handle_hover(Xml_node const &node) Expand_client_fs_hover const prev_hover { _expand_client_fs_hover }; Expand_client_fs_hover next_hover { Expand_client_fs_hover::NONE }; - node.with_sub_node("dialog", [&] (Xml_node const &node_0) { - node_0.with_sub_node("frame", [&] (Xml_node const &node_1) { - node_1.with_sub_node("vbox", [&] (Xml_node const &node_2) { - node_2.with_sub_node("hbox", [&] (Xml_node const &node_3) { - node_3.with_sub_node("button", [&] (Xml_node const &node_4) { + node.with_optional_sub_node("dialog", [&] (Xml_node const &node_0) { + node_0.with_optional_sub_node("frame", [&] (Xml_node const &node_1) { + node_1.with_optional_sub_node("vbox", [&] (Xml_node const &node_2) { + node_2.with_optional_sub_node("hbox", [&] (Xml_node const &node_3) { + node_3.with_optional_sub_node("button", [&] (Xml_node const &node_4) { if (_has_name(node_4, "Shut down")) { @@ -3806,24 +3806,24 @@ void File_vault::Main::_handle_hover(Xml_node const &node) } }); }); - node_2.with_sub_node("frame", [&] (Xml_node const &node_3) { - node_3.with_sub_node("vbox", [&] (Xml_node const &node_4) { - node_4.with_sub_node("vbox", [&] (Xml_node const &node_5) { - node_5.with_sub_node("hbox", [&] (Xml_node const &node_6) { + node_2.with_optional_sub_node("frame", [&] (Xml_node const &node_3) { + node_3.with_optional_sub_node("vbox", [&] (Xml_node const &node_4) { + node_4.with_optional_sub_node("vbox", [&] (Xml_node const &node_5) { + node_5.with_optional_sub_node("hbox", [&] (Xml_node const &node_6) { if (_has_name(node_6, "Leave")) { next_hover = Expand_client_fs_hover::LEAVE_BUTTON; } }); - node_5.with_sub_node("float", [&] (Xml_node const &node_6) { + node_5.with_optional_sub_node("float", [&] (Xml_node const &node_6) { if (_has_name(node_6, "Start")) { next_hover = Expand_client_fs_hover::START_BUTTON; } }); - node_5.with_sub_node("frame", [&] (Xml_node const &node_6) { + node_5.with_optional_sub_node("frame", [&] (Xml_node const &node_6) { if (_has_name(node_6, "Contingent")) { @@ -3848,12 +3848,12 @@ void File_vault::Main::_handle_hover(Xml_node const &node) Expand_snapshot_buf_hover const prev_hover { _expand_snapshot_buf_hover }; Expand_snapshot_buf_hover next_hover { Expand_snapshot_buf_hover::NONE }; - node.with_sub_node("dialog", [&] (Xml_node const &node_0) { - node_0.with_sub_node("frame", [&] (Xml_node const &node_1) { - node_1.with_sub_node("vbox", [&] (Xml_node const &node_2) { - node_2.with_sub_node("hbox", [&] (Xml_node const &node_3) { + node.with_optional_sub_node("dialog", [&] (Xml_node const &node_0) { + node_0.with_optional_sub_node("frame", [&] (Xml_node const &node_1) { + node_1.with_optional_sub_node("vbox", [&] (Xml_node const &node_2) { + node_2.with_optional_sub_node("hbox", [&] (Xml_node const &node_3) { - node_3.with_sub_node("button", [&] (Xml_node const &node_4) { + node_3.with_optional_sub_node("button", [&] (Xml_node const &node_4) { if (_has_name(node_4, "Shut down")) { @@ -3862,25 +3862,25 @@ void File_vault::Main::_handle_hover(Xml_node const &node) } }); }); - node_2.with_sub_node("frame", [&] (Xml_node const &node_3) { - node_3.with_sub_node("vbox", [&] (Xml_node const &node_4) { - node_4.with_sub_node("vbox", [&] (Xml_node const &node_5) { + node_2.with_optional_sub_node("frame", [&] (Xml_node const &node_3) { + node_3.with_optional_sub_node("vbox", [&] (Xml_node const &node_4) { + node_4.with_optional_sub_node("vbox", [&] (Xml_node const &node_5) { - node_5.with_sub_node("hbox", [&] (Xml_node const &node_6) { + node_5.with_optional_sub_node("hbox", [&] (Xml_node const &node_6) { if (_has_name(node_6, "Leave")) { next_hover = Expand_snapshot_buf_hover::LEAVE_BUTTON; } }); - node_5.with_sub_node("float", [&] (Xml_node const &node_6) { + node_5.with_optional_sub_node("float", [&] (Xml_node const &node_6) { if (_has_name(node_6, "Start")) { next_hover = Expand_snapshot_buf_hover::START_BUTTON; } }); - node_5.with_sub_node("frame", [&] (Xml_node const &node_6) { + node_5.with_optional_sub_node("frame", [&] (Xml_node const &node_6) { if (_has_name(node_6, "Contingent")) { @@ -3905,11 +3905,11 @@ void File_vault::Main::_handle_hover(Xml_node const &node) Controls_security_hover const prev_hover { _controls_security_hover }; Controls_security_hover next_hover { Controls_security_hover::NONE }; - node.with_sub_node("dialog", [&] (Xml_node const &node_0) { - node_0.with_sub_node("frame", [&] (Xml_node const &node_1) { - node_1.with_sub_node("vbox", [&] (Xml_node const &node_2) { - node_2.with_sub_node("hbox", [&] (Xml_node const &node_3) { - node_3.with_sub_node("button", [&] (Xml_node const &node_4) { + node.with_optional_sub_node("dialog", [&] (Xml_node const &node_0) { + node_0.with_optional_sub_node("frame", [&] (Xml_node const &node_1) { + node_1.with_optional_sub_node("vbox", [&] (Xml_node const &node_2) { + node_2.with_optional_sub_node("hbox", [&] (Xml_node const &node_3) { + node_3.with_optional_sub_node("button", [&] (Xml_node const &node_4) { if (_has_name(node_4, "Shut down")) { @@ -3918,16 +3918,16 @@ void File_vault::Main::_handle_hover(Xml_node const &node) } }); }); - node_2.with_sub_node("frame", [&] (Xml_node const &node_3) { - node_3.with_sub_node("vbox", [&] (Xml_node const &node_4) { - node_4.with_sub_node("hbox", [&] (Xml_node const &node_5) { + node_2.with_optional_sub_node("frame", [&] (Xml_node const &node_3) { + node_3.with_optional_sub_node("vbox", [&] (Xml_node const &node_4) { + node_4.with_optional_sub_node("hbox", [&] (Xml_node const &node_5) { if (_has_name(node_5, "Leave")) { next_hover = Controls_security_hover::SECURITY_EXPAND_BUTTON; } }); - node_4.with_sub_node("vbox", [&] (Xml_node const &node_5) { + node_4.with_optional_sub_node("vbox", [&] (Xml_node const &node_5) { if (_has_name(node_5, "Block Encryption Key")) { @@ -3959,11 +3959,11 @@ void File_vault::Main::_handle_hover(Xml_node const &node) Controls_security_block_encryption_key_hover const prev_hover { _controls_security_block_encryption_key_hover }; Controls_security_block_encryption_key_hover next_hover { Controls_security_block_encryption_key_hover::NONE }; - node.with_sub_node("dialog", [&] (Xml_node const &node_0) { - node_0.with_sub_node("frame", [&] (Xml_node const &node_1) { - node_1.with_sub_node("vbox", [&] (Xml_node const &node_2) { - node_2.with_sub_node("hbox", [&] (Xml_node const &node_3) { - node_3.with_sub_node("button", [&] (Xml_node const &node_4) { + node.with_optional_sub_node("dialog", [&] (Xml_node const &node_0) { + node_0.with_optional_sub_node("frame", [&] (Xml_node const &node_1) { + node_1.with_optional_sub_node("vbox", [&] (Xml_node const &node_2) { + node_2.with_optional_sub_node("hbox", [&] (Xml_node const &node_3) { + node_3.with_optional_sub_node("button", [&] (Xml_node const &node_4) { if (_has_name(node_4, "Shut down")) { @@ -3972,16 +3972,16 @@ void File_vault::Main::_handle_hover(Xml_node const &node) } }); }); - node_2.with_sub_node("frame", [&] (Xml_node const &node_3) { - node_3.with_sub_node("vbox", [&] (Xml_node const &node_4) { - node_4.with_sub_node("button", [&] (Xml_node const &node_5) { + node_2.with_optional_sub_node("frame", [&] (Xml_node const &node_3) { + node_3.with_optional_sub_node("vbox", [&] (Xml_node const &node_4) { + node_4.with_optional_sub_node("button", [&] (Xml_node const &node_5) { if (_has_name(node_5, "Rekey")) { next_hover = Controls_security_block_encryption_key_hover::REPLACE_BUTTON; } }); - node_4.with_sub_node("hbox", [&] (Xml_node const &node_5) { + node_4.with_optional_sub_node("hbox", [&] (Xml_node const &node_5) { if (_has_name(node_5, "Leave")) { @@ -4005,11 +4005,11 @@ void File_vault::Main::_handle_hover(Xml_node const &node) Controls_security_master_key_hover const prev_hover { _controls_security_master_key_hover }; Controls_security_master_key_hover next_hover { Controls_security_master_key_hover::NONE }; - node.with_sub_node("dialog", [&] (Xml_node const &node_0) { - node_0.with_sub_node("frame", [&] (Xml_node const &node_1) { - node_1.with_sub_node("vbox", [&] (Xml_node const &node_2) { - node_2.with_sub_node("hbox", [&] (Xml_node const &node_3) { - node_3.with_sub_node("button", [&] (Xml_node const &node_4) { + node.with_optional_sub_node("dialog", [&] (Xml_node const &node_0) { + node_0.with_optional_sub_node("frame", [&] (Xml_node const &node_1) { + node_1.with_optional_sub_node("vbox", [&] (Xml_node const &node_2) { + node_2.with_optional_sub_node("hbox", [&] (Xml_node const &node_3) { + node_3.with_optional_sub_node("button", [&] (Xml_node const &node_4) { if (_has_name(node_4, "Shut down")) { @@ -4018,9 +4018,9 @@ void File_vault::Main::_handle_hover(Xml_node const &node) } }); }); - node_2.with_sub_node("frame", [&] (Xml_node const &node_3) { - node_3.with_sub_node("vbox", [&] (Xml_node const &node_4) { - node_4.with_sub_node("hbox", [&] (Xml_node const &node_5) { + node_2.with_optional_sub_node("frame", [&] (Xml_node const &node_3) { + node_3.with_optional_sub_node("vbox", [&] (Xml_node const &node_4) { + node_4.with_optional_sub_node("hbox", [&] (Xml_node const &node_5) { if (_has_name(node_5, "Leave")) { @@ -4044,11 +4044,11 @@ void File_vault::Main::_handle_hover(Xml_node const &node) Controls_security_user_passphrase_hover const prev_hover { _controls_security_user_passphrase_hover }; Controls_security_user_passphrase_hover next_hover { Controls_security_user_passphrase_hover::NONE }; - node.with_sub_node("dialog", [&] (Xml_node const &node_0) { - node_0.with_sub_node("frame", [&] (Xml_node const &node_1) { - node_1.with_sub_node("vbox", [&] (Xml_node const &node_2) { - node_2.with_sub_node("hbox", [&] (Xml_node const &node_3) { - node_3.with_sub_node("button", [&] (Xml_node const &node_4) { + node.with_optional_sub_node("dialog", [&] (Xml_node const &node_0) { + node_0.with_optional_sub_node("frame", [&] (Xml_node const &node_1) { + node_1.with_optional_sub_node("vbox", [&] (Xml_node const &node_2) { + node_2.with_optional_sub_node("hbox", [&] (Xml_node const &node_3) { + node_3.with_optional_sub_node("button", [&] (Xml_node const &node_4) { if (_has_name(node_4, "Shut down")) { @@ -4057,9 +4057,9 @@ void File_vault::Main::_handle_hover(Xml_node const &node) } }); }); - node_2.with_sub_node("frame", [&] (Xml_node const &node_3) { - node_3.with_sub_node("vbox", [&] (Xml_node const &node_4) { - node_4.with_sub_node("hbox", [&] (Xml_node const &node_5) { + node_2.with_optional_sub_node("frame", [&] (Xml_node const &node_3) { + node_3.with_optional_sub_node("vbox", [&] (Xml_node const &node_4) { + node_4.with_optional_sub_node("hbox", [&] (Xml_node const &node_5) { if (_has_name(node_5, "Leave")) { diff --git a/repos/gems/src/app/gpt_write/main.cc b/repos/gems/src/app/gpt_write/main.cc index 06cc00061b..11ca60f12f 100644 --- a/repos/gems/src/app/gpt_write/main.cc +++ b/repos/gems/src/app/gpt_write/main.cc @@ -762,7 +762,7 @@ struct Main } bool success = false; - config.with_sub_node("actions", [&] (Genode::Xml_node actions) { + config.with_optional_sub_node("actions", [&] (Genode::Xml_node actions) { success = _writer->execute_actions(actions); }); _env.parent().exit(success ? 0 : 1); diff --git a/repos/gems/src/app/menu_view/main.cc b/repos/gems/src/app/menu_view/main.cc index a99da574d1..afc4804d4e 100644 --- a/repos/gems/src/app/menu_view/main.cc +++ b/repos/gems/src/app/menu_view/main.cc @@ -318,7 +318,7 @@ void Menu_view::Main::_handle_config() _background_color = config.attribute_value("background", Color(127, 127, 127, 255)); - config.with_sub_node("vfs", [&] (Xml_node const &vfs_node) { + config.with_optional_sub_node("vfs", [&] (Xml_node const &vfs_node) { _vfs_env.root_dir().apply_config(vfs_node); }); _handle_dialog_update(); diff --git a/repos/gems/src/app/sculpt_manager/main.cc b/repos/gems/src/app/sculpt_manager/main.cc index 0fb89b8298..8b8940e40f 100644 --- a/repos/gems/src/app/sculpt_manager/main.cc +++ b/repos/gems/src/app/sculpt_manager/main.cc @@ -1247,7 +1247,7 @@ struct Sculpt::Main : Input_event_handler, /* * Read static platform information */ - _platform.xml().with_sub_node("affinity-space", [&] (Xml_node const &node) { + _platform.xml().with_optional_sub_node("affinity-space", [&] (Xml_node const &node) { _affinity_space = Affinity::Space(node.attribute_value("width", 1U), node.attribute_value("height", 1U)); }); diff --git a/repos/gems/src/app/sculpt_manager/menu_view.cc b/repos/gems/src/app/sculpt_manager/menu_view.cc index b13bd243fb..b6b01c8c89 100644 --- a/repos/gems/src/app/sculpt_manager/menu_view.cc +++ b/repos/gems/src/app/sculpt_manager/menu_view.cc @@ -35,7 +35,7 @@ void Menu_view::_handle_hover() _seq_number.construct(seq); } - hover.with_sub_node("dialog", [&] (Xml_node hover) { + hover.with_optional_sub_node("dialog", [&] (Xml_node hover) { _hovered = true; hover_result = _dialog.hover(hover); }); diff --git a/repos/gems/src/app/sculpt_manager/model/component.h b/repos/gems/src/app/sculpt_manager/model/component.h index 1010df658e..dc3eaf0e6b 100644 --- a/repos/gems/src/app/sculpt_manager/model/component.h +++ b/repos/gems/src/app/sculpt_manager/model/component.h @@ -67,12 +67,12 @@ struct Sculpt::Component : Noncopyable if (path != pkg.attribute_value("path", Path())) return; - pkg.with_sub_node("runtime", [&] (Xml_node runtime) { + pkg.with_optional_sub_node("runtime", [&] (Xml_node runtime) { ram = runtime.attribute_value("ram", Number_of_bytes()); caps = runtime.attribute_value("caps", 0UL); - runtime.with_sub_node("requires", [&] (Xml_node requires) { + runtime.with_optional_sub_node("requires", [&] (Xml_node requires) { routes.update_from_xml(_route_update_policy, requires); }); }); diff --git a/repos/gems/src/app/sculpt_manager/model/file_browser_state.h b/repos/gems/src/app/sculpt_manager/model/file_browser_state.h index 3eee4050bf..fc620b6c87 100644 --- a/repos/gems/src/app/sculpt_manager/model/file_browser_state.h +++ b/repos/gems/src/app/sculpt_manager/model/file_browser_state.h @@ -68,7 +68,7 @@ struct Sculpt::File_browser_state : Noncopyable { unsigned cnt = 0; with_query_result([&] (Xml_node node) { - node.with_sub_node("dir", [&] (Xml_node listing) { + node.with_optional_sub_node("dir", [&] (Xml_node listing) { listing.for_each_sub_node([&] (Xml_node entry) { if (Index(cnt++) == index) fn(entry); }); }); }); diff --git a/repos/gems/src/app/sculpt_manager/model/runtime_config.h b/repos/gems/src/app/sculpt_manager/model/runtime_config.h index a4fb9b56d3..419758de23 100644 --- a/repos/gems/src/app/sculpt_manager/model/runtime_config.h +++ b/repos/gems/src/app/sculpt_manager/model/runtime_config.h @@ -47,13 +47,13 @@ class Sculpt::Runtime_config static Start_name _to_name(Xml_node node) { Start_name result { }; - node.with_sub_node("child", [&] (Xml_node child) { + node.with_optional_sub_node("child", [&] (Xml_node child) { result = child.attribute_value("name", Start_name()); }); if (result.valid()) return result; - node.with_sub_node("parent", [&] (Xml_node parent) { + node.with_optional_sub_node("parent", [&] (Xml_node parent) { Service::Type_name const service = node.attribute_value("name", Service::Type_name()); @@ -143,8 +143,8 @@ class Sculpt::Runtime_config static Start_name _primary_dependency(Xml_node const start) { Start_name result { }; - start.with_sub_node("route", [&] (Xml_node route) { - route.with_sub_node("service", [&] (Xml_node service) { + start.with_optional_sub_node("route", [&] (Xml_node route) { + route.with_optional_sub_node("service", [&] (Xml_node service) { result = _to_name(service); }); }); return result; @@ -291,14 +291,14 @@ class Sculpt::Runtime_config { Dep::Update_policy policy { _alloc }; - node.with_sub_node("route", [&] (Xml_node route) { + node.with_optional_sub_node("route", [&] (Xml_node route) { elem.deps.update_from_xml(policy, route); }); } { Child_service::Update_policy policy { elem.name, _alloc }; - node.with_sub_node("provides", [&] (Xml_node provides) { + node.with_optional_sub_node("provides", [&] (Xml_node provides) { elem._child_services.update_from_xml(policy, provides); }); } diff --git a/repos/gems/src/app/sculpt_manager/view/dialog.h b/repos/gems/src/app/sculpt_manager/view/dialog.h index 57ce424c72..540d8e9f58 100644 --- a/repos/gems/src/app/sculpt_manager/view/dialog.h +++ b/repos/gems/src/app/sculpt_manager/view/dialog.h @@ -74,7 +74,7 @@ struct Sculpt::Dialog : Interface { Hover_result result = Hover_result::UNMODIFIED; - hover.with_sub_node(sub_node, [&] (Xml_node sub_hover) { + hover.with_optional_sub_node(sub_node, [&] (Xml_node sub_hover) { if (_match_sub_dialog(sub_hover, tail...) == Hover_result::CHANGED) result = Hover_result::CHANGED; }); diff --git a/repos/gems/src/app/sculpt_manager/view/file_browser_dialog.h b/repos/gems/src/app/sculpt_manager/view/file_browser_dialog.h index 084fe1dac3..4c972ee154 100644 --- a/repos/gems/src/app/sculpt_manager/view/file_browser_dialog.h +++ b/repos/gems/src/app/sculpt_manager/view/file_browser_dialog.h @@ -281,7 +281,7 @@ struct Sculpt::File_browser_dialog : Noncopyable, Dialog unsigned cnt = 0; _state.with_query_result([&] (Xml_node node) { - node.with_sub_node("dir", [&] (Xml_node listing) { + node.with_optional_sub_node("dir", [&] (Xml_node listing) { if (_state.path != "/") _gen_back_entry(xml); diff --git a/repos/gems/src/app/text_area/dialog.cc b/repos/gems/src/app/text_area/dialog.cc index 285b4a50a2..88721e1eb1 100644 --- a/repos/gems/src/app/text_area/dialog.cc +++ b/repos/gems/src/app/text_area/dialog.cc @@ -631,8 +631,8 @@ void Dialog::handle_hover(Xml_node const &hover) _hovered_position.construct(max_x, y); - node.with_sub_node("float", [&] (Xml_node node) { - node.with_sub_node("label", [&] (Xml_node node) { + node.with_optional_sub_node("float", [&] (Xml_node node) { + node.with_optional_sub_node("label", [&] (Xml_node node) { Line::Index const x { node.attribute_value("at", max_x.value) }; @@ -654,14 +654,14 @@ void Dialog::handle_hover(Xml_node const &hover) _text_hovered = false; - hover.with_sub_node("frame", [&] (Xml_node node) { - node.with_sub_node("button", [&] (Xml_node node) { + hover.with_optional_sub_node("frame", [&] (Xml_node node) { + node.with_optional_sub_node("button", [&] (Xml_node node) { _text_hovered = true; - node.with_sub_node("float", [&] (Xml_node node) { - node.with_sub_node("vbox", [&] (Xml_node node) { - node.with_sub_node("hbox", [&] (Xml_node node) { + node.with_optional_sub_node("float", [&] (Xml_node node) { + node.with_optional_sub_node("vbox", [&] (Xml_node node) { + node.with_optional_sub_node("hbox", [&] (Xml_node node) { with_hovered_line(node); }); }); }); }); }); if (hover_changed || position_changed || (_text_hovered != orig_text_hovered)) diff --git a/repos/gems/src/app/text_area/main.cc b/repos/gems/src/app/text_area/main.cc index 5523784dd1..b6c2112ab9 100644 --- a/repos/gems/src/app/text_area/main.cc +++ b/repos/gems/src/app/text_area/main.cc @@ -92,7 +92,7 @@ struct Text_area::Main : Sandbox::Local_service_base::Wakeup, if (!node.has_sub_node("dialog")) _dialog.handle_hover(Xml_node("")); - node.with_sub_node("dialog", [&] (Xml_node const &dialog) { + node.with_optional_sub_node("dialog", [&] (Xml_node const &dialog) { _dialog.handle_hover(dialog); }); } @@ -462,7 +462,7 @@ struct Text_area::Main : Sandbox::Local_service_base::Wakeup, if (_editable()) { bool const orig_saved_reporter_enabled = _saved_reporter.constructed(); - config.with_sub_node("report", [&] (Xml_node const &node) { + config.with_optional_sub_node("report", [&] (Xml_node const &node) { _saved_reporter.conditional(node.attribute_value("saved", false), _env, "saved", "saved"); }); @@ -471,7 +471,7 @@ struct Text_area::Main : Sandbox::Local_service_base::Wakeup, Saved_version const orig_saved_version = _saved_version; - config.with_sub_node("save", [&] (Xml_node const &node) { + config.with_optional_sub_node("save", [&] (Xml_node const &node) { _saved_version.value = node.attribute_value("version", _saved_version.value); }); diff --git a/repos/gems/src/app/touch_keyboard/main.cc b/repos/gems/src/app/touch_keyboard/main.cc index 32a02bbffc..8694744466 100644 --- a/repos/gems/src/app/touch_keyboard/main.cc +++ b/repos/gems/src/app/touch_keyboard/main.cc @@ -90,7 +90,7 @@ struct Touch_keyboard::Main : Sandbox::Local_service_base::Wakeup, { Input::Seq_number hover_seq { node.attribute_value("seq_number", 0U) }; - node.with_sub_node("dialog", [&] (Xml_node const &dialog) { + node.with_optional_sub_node("dialog", [&] (Xml_node const &dialog) { _dialog.handle_hover(hover_seq, dialog); }); } diff --git a/repos/gems/src/app/touch_keyboard/touch_keyboard_dialog.cc b/repos/gems/src/app/touch_keyboard/touch_keyboard_dialog.cc index 0940dddc47..5e772e7f02 100644 --- a/repos/gems/src/app/touch_keyboard/touch_keyboard_dialog.cc +++ b/repos/gems/src/app/touch_keyboard/touch_keyboard_dialog.cc @@ -105,10 +105,10 @@ void Dialog::handle_hover(Input::Seq_number seq, Xml_node const &dialog) Row::Id hovered_row_id { }; Key::Id hovered_key_id { }; - dialog.with_sub_node("frame", [&] (Xml_node const &frame) { - frame.with_sub_node("vbox", [&] (Xml_node const &vbox) { - vbox.with_sub_node("hbox", [&] (Xml_node const &hbox) { - hbox.with_sub_node("vbox", [&] (Xml_node const &button) { + dialog.with_optional_sub_node("frame", [&] (Xml_node const &frame) { + frame.with_optional_sub_node("vbox", [&] (Xml_node const &vbox) { + vbox.with_optional_sub_node("hbox", [&] (Xml_node const &hbox) { + hbox.with_optional_sub_node("vbox", [&] (Xml_node const &button) { hovered_row_id = hbox .attribute_value("name", Row::Id()); hovered_key_id = button.attribute_value("name", Key::Id()); }); diff --git a/repos/gems/src/server/terminal/main.cc b/repos/gems/src/server/terminal/main.cc index 4b6d3a2dc7..a77da2c8a5 100644 --- a/repos/gems/src/server/terminal/main.cc +++ b/repos/gems/src/server/terminal/main.cc @@ -211,7 +211,7 @@ struct Terminal::Main : Character_consumer _fb_mode = _gui.mode(); /* apply initial size from config, if provided */ - _config.xml().with_sub_node("initial", [&] (Xml_node const &initial) { + _config.xml().with_optional_sub_node("initial", [&] (Xml_node const &initial) { _fb_mode.area = Area(initial.attribute_value("width", _fb_mode.area.w()), initial.attribute_value("height", _fb_mode.area.h())); }); diff --git a/repos/libports/src/lib/libc/file_operations.cc b/repos/libports/src/lib/libc/file_operations.cc index 5cf4e7351b..b0da2ce4f0 100644 --- a/repos/libports/src/lib/libc/file_operations.cc +++ b/repos/libports/src/lib/libc/file_operations.cc @@ -71,8 +71,8 @@ void Libc::init_file_operations(Cwd &cwd, { _cwd_ptr = &cwd; - config_accessor.config().with_sub_node("libc", [&] (Xml_node libc) { - libc.with_sub_node("mmap", [&] (Xml_node mmap) { + config_accessor.config().with_optional_sub_node("libc", [&] (Xml_node libc) { + libc.with_optional_sub_node("mmap", [&] (Xml_node mmap) { _mmap_align_log2 = mmap.attribute_value("align_log2", (unsigned int)PAGE_SHIFT); }); diff --git a/repos/libports/src/lib/libc/fork.cc b/repos/libports/src/lib/libc/fork.cc index 4a2f6d54a1..c2b8e505d6 100644 --- a/repos/libports/src/lib/libc/fork.cc +++ b/repos/libports/src/lib/libc/fork.cc @@ -140,7 +140,7 @@ void Libc::Child_config::_generate(Xml_generator &xml, Xml_node config) xml.attribute("pid", _pid); typedef String Path; - config.with_sub_node("libc", [&] (Xml_node node) { + config.with_optional_sub_node("libc", [&] (Xml_node node) { if (node.has_attribute("rtc")) xml.attribute("rtc", node.attribute_value("rtc", Path())); if (node.has_attribute("pipe")) diff --git a/repos/libports/src/lib/libc/internal/vfs_plugin.h b/repos/libports/src/lib/libc/internal/vfs_plugin.h index d88a8bae0c..b3d7fc5847 100644 --- a/repos/libports/src/lib/libc/internal/vfs_plugin.h +++ b/repos/libports/src/lib/libc/internal/vfs_plugin.h @@ -145,7 +145,7 @@ class Libc::Vfs_plugin final : public Plugin static bool _init_pipe_configured(Xml_node config) { bool result = false; - config.with_sub_node("libc", [&] (Xml_node libc_node) { + config.with_optional_sub_node("libc", [&] (Xml_node libc_node) { result = libc_node.has_attribute("pipe"); }); return result; } diff --git a/repos/libports/src/lib/libc/kernel.cc b/repos/libports/src/lib/libc/kernel.cc index a5f3e53ee5..20e370c026 100644 --- a/repos/libports/src/lib/libc/kernel.cc +++ b/repos/libports/src/lib/libc/kernel.cc @@ -47,7 +47,7 @@ size_t Libc::Kernel::_user_stack_size() { size_t size = Component::stack_size(); - _libc_env.libc_config().with_sub_node("stack", [&] (Xml_node stack) { + _libc_env.libc_config().with_optional_sub_node("stack", [&] (Xml_node stack) { size = stack.attribute_value("size", Number_of_bytes(0)); }); return size; diff --git a/repos/libports/src/lib/qemu-usb/qemu_emul.cc b/repos/libports/src/lib/qemu-usb/qemu_emul.cc index 9c923c59d0..748ac2727e 100644 --- a/repos/libports/src/lib/qemu-usb/qemu_emul.cc +++ b/repos/libports/src/lib/qemu-usb/qemu_emul.cc @@ -104,7 +104,7 @@ Qemu::Controller *Qemu::usb_init(Timer_queue &tq, Pci_device &pci, _type_init_xhci_pci_register_types(); _type_init_usb_host_register_types(&ep, &alloc, &env); - config.with_sub_node("webcam", [&] (Genode::Xml_node const &node) { + config.with_optional_sub_node("webcam", [&] (Genode::Xml_node const &node) { _type_init_host_webcam_register_types(env, node); }); diff --git a/repos/os/include/os/session_policy.h b/repos/os/include/os/session_policy.h index 7e0b58c6c8..9d800ad481 100644 --- a/repos/os/include/os/session_policy.h +++ b/repos/os/include/os/session_policy.h @@ -193,7 +193,7 @@ void Genode::with_matching_policy(String const &label, /* fall back to default policy if no match exists */ if (best_match.has_type("none")) - policies.with_sub_node("default-policy", [&] (Xml_node const &policy) { + policies.with_optional_sub_node("default-policy", [&] (Xml_node const &policy) { best_match = policy; }); if (best_match.has_type("none")) diff --git a/repos/os/src/app/pci_decode/main.cc b/repos/os/src/app/pci_decode/main.cc index 1cabfd02c6..c97853ef39 100644 --- a/repos/os/src/app/pci_decode/main.cc +++ b/repos/os/src/app/pci_decode/main.cc @@ -266,7 +266,7 @@ void Main::sys_rom_update() Main::Main(Env & env) : env(env) { sys_rom.sigh(sys_rom_handler); - platform_info.xml().with_sub_node("kernel", [&] (Xml_node xml) + platform_info.xml().with_optional_sub_node("kernel", [&] (Xml_node xml) { apic_capable = xml.attribute_value("acpi", false); msi_capable = xml.attribute_value("msi", false); diff --git a/repos/os/src/drivers/framebuffer/boot/main.cc b/repos/os/src/drivers/framebuffer/boot/main.cc index 4551ba1e98..77d15dd28a 100644 --- a/repos/os/src/drivers/framebuffer/boot/main.cc +++ b/repos/os/src/drivers/framebuffer/boot/main.cc @@ -45,8 +45,8 @@ struct Framebuffer::Main static Info from_platform_info(Xml_node const &node) { Info result { }; - node.with_sub_node("boot", [&] (Xml_node const &boot) { - boot.with_sub_node("framebuffer", [&] (Xml_node const &fb) { + node.with_optional_sub_node("boot", [&] (Xml_node const &boot) { + boot.with_optional_sub_node("framebuffer", [&] (Xml_node const &fb) { result = { .addr = fb.attribute_value("phys", 0UL), .size = { fb.attribute_value("width", 0U), diff --git a/repos/os/src/drivers/nic/spec/linux/main.cc b/repos/os/src/drivers/nic/spec/linux/main.cc index 4b7d7296bf..db85a3db08 100644 --- a/repos/os/src/drivers/nic/spec/linux/main.cc +++ b/repos/os/src/drivers/nic/spec/linux/main.cc @@ -212,7 +212,7 @@ struct Main Main(Env &env) : _env(env) { - _config_rom.xml().with_sub_node("report", [&] (Xml_node const &xml) { + _config_rom.xml().with_optional_sub_node("report", [&] (Xml_node const &xml) { bool const report_mac_address = xml.attribute_value("mac_address", false); diff --git a/repos/os/src/drivers/platform/legacy/x86/main.cc b/repos/os/src/drivers/platform/legacy/x86/main.cc index 3c01f8c286..58c3e5e777 100644 --- a/repos/os/src/drivers/platform/legacy/x86/main.cc +++ b/repos/os/src/drivers/platform/legacy/x86/main.cc @@ -77,7 +77,7 @@ struct Platform::Main try { Attached_rom_dataspace info { _env, "platform_info" }; - info.xml().with_sub_node("kernel", [&] (Xml_node const &node) { + info.xml().with_optional_sub_node("kernel", [&] (Xml_node const &node) { acpi_platform = node.attribute_value("acpi", acpi_platform); msi_platform = node.attribute_value("msi" , msi_platform); }); @@ -188,7 +188,7 @@ void Platform::Main::_attempt_acpi_reset() if (!acpi_rom.constructed()) return; - acpi_rom->xml().with_sub_node("reset", [&] (Xml_node reset) { + acpi_rom->xml().with_optional_sub_node("reset", [&] (Xml_node reset) { uint16_t const io_port = reset.attribute_value("io_port", (uint16_t)0); uint8_t const value = reset.attribute_value("value", (uint8_t)0); diff --git a/repos/os/src/init/main.cc b/repos/os/src/init/main.cc index a3fa95de0a..4f13681880 100644 --- a/repos/os/src/init/main.cc +++ b/repos/os/src/init/main.cc @@ -49,7 +49,7 @@ struct Init::Main : Sandbox::State_handler Xml_node const config = _config.xml(); bool reporter_enabled = false; - config.with_sub_node("report", [&] (Xml_node report) { + config.with_optional_sub_node("report", [&] (Xml_node report) { reporter_enabled = true; diff --git a/repos/os/src/lib/genode_c_api/usb.cc b/repos/os/src/lib/genode_c_api/usb.cc index e66eeb57a6..a31fd05d27 100644 --- a/repos/os/src/lib/genode_c_api/usb.cc +++ b/repos/os/src/lib/genode_c_api/usb.cc @@ -702,7 +702,7 @@ void ::Root::_announce_service() /* * Check for report policy, and resp. con-/destruct device reporter */ - _config.xml().with_sub_node("report", [&] (Xml_node node) { + _config.xml().with_optional_sub_node("report", [&] (Xml_node node) { _device_reporter.conditional(node.attribute_value("devices", false), _env, "devices", "devices" ); diff --git a/repos/os/src/lib/sandbox/child.cc b/repos/os/src/lib/sandbox/child.cc index 7096516fe1..b6d5cfb62c 100644 --- a/repos/os/src/lib/sandbox/child.cc +++ b/repos/os/src/lib/sandbox/child.cc @@ -66,8 +66,8 @@ Sandbox::Child::apply_config(Xml_node start_node) * The node may affect the availability or unavailability * of dependencies. */ - start_node.with_sub_node("route", [&] (Xml_node const &route) { - _start_node->xml().with_sub_node("route", [&] (Xml_node const &orig) { + start_node.with_optional_sub_node("route", [&] (Xml_node const &route) { + _start_node->xml().with_optional_sub_node("route", [&] (Xml_node const &orig) { if (route.differs_from(orig)) { _construct_route_model_from_start_node(start_node); _uncertain_dependencies = true; } }); }); diff --git a/repos/os/src/lib/sandbox/child.h b/repos/os/src/lib/sandbox/child.h index e192d9126f..b4a612624a 100644 --- a/repos/os/src/lib/sandbox/child.h +++ b/repos/os/src/lib/sandbox/child.h @@ -126,13 +126,11 @@ class Sandbox::Child : Child_policy, Routed_service::Wakeup { _route_model.destruct(); - start.with_sub_node("route", [&] (Xml_node const &route) { - _route_model.construct(_alloc, route); }); - - if (_route_model.constructed()) - return; - - _route_model.construct(_alloc, _default_route_accessor.default_route()); + start.with_sub_node("route", + [&] (Xml_node const &route) { + _route_model.construct(_alloc, route); }, + [&] () { + _route_model.construct(_alloc, _default_route_accessor.default_route()); }); } /* diff --git a/repos/os/src/lib/sandbox/utils.h b/repos/os/src/lib/sandbox/utils.h index 90bb177a4d..cba9ca5d2c 100644 --- a/repos/os/src/lib/sandbox/utils.h +++ b/repos/os/src/lib/sandbox/utils.h @@ -213,7 +213,7 @@ namespace Sandbox { Location result = Location(0, 0, space.width(), space.height()); - start_node.with_sub_node("affinity", [&] (Xml_node node) { + start_node.with_optional_sub_node("affinity", [&] (Xml_node node) { Location const location = Location::from_xml(space, node); diff --git a/repos/os/src/server/nic_perf/interface.h b/repos/os/src/server/nic_perf/interface.h index 4e2fab2ed0..63032b09d9 100644 --- a/repos/os/src/server/nic_perf/interface.h +++ b/repos/os/src/server/nic_perf/interface.h @@ -107,16 +107,18 @@ class Nic_perf::Interface _dhcp_client.destruct(); - config.with_sub_node("interface", [&] (Xml_node node) { - _ip = node.attribute_value("ip", _ip); - _dhcp_client_ip = node.attribute_value("dhcp_client_ip", _dhcp_client_ip); + config.with_sub_node("interface", + [&] (Xml_node node) { + _ip = node.attribute_value("ip", _ip); + _dhcp_client_ip = node.attribute_value("dhcp_client_ip", _dhcp_client_ip); - if (_mac_from_policy) - _mac = node.attribute_value("mac", _mac); - }); + if (_mac_from_policy) + _mac = node.attribute_value("mac", _mac); + }, - if (_ip == Ipv4_address()) - _dhcp_client.construct(_timer, *this); + /* node does not exist */ + [&] () { _dhcp_client.construct(_timer, *this); } + ); } Session_label const &label() const { return _label; } diff --git a/repos/os/src/server/nic_perf/packet_generator.h b/repos/os/src/server/nic_perf/packet_generator.h index ffb73fe1d2..e70a761c60 100644 --- a/repos/os/src/server/nic_perf/packet_generator.h +++ b/repos/os/src/server/nic_perf/packet_generator.h @@ -74,7 +74,7 @@ class Nic_perf::Packet_generator _enable = false; _state = MUTED; - config.with_sub_node("tx", [&] (Xml_node node) { + config.with_optional_sub_node("tx", [&] (Xml_node node) { _mtu = node.attribute_value("mtu", _mtu); _dst_ip = node.attribute_value("to", _dst_ip); _dst_port = node.attribute_value("udp_port", _dst_port); diff --git a/repos/os/src/server/nic_router/dhcp_server.cc b/repos/os/src/server/nic_router/dhcp_server.cc index f46c27e20a..063e513613 100644 --- a/repos/os/src/server/nic_router/dhcp_server.cc +++ b/repos/os/src/server/nic_router/dhcp_server.cc @@ -43,7 +43,7 @@ Dhcp_server_base::Dhcp_server_base(Xml_node const &node, _invalid(domain, "invalid DNS server entry"); } }); - node.with_sub_node("dns-domain", [&] (Xml_node const &sub_node) { + node.with_optional_sub_node("dns-domain", [&] (Xml_node const &sub_node) { xml_node_with_attribute(sub_node, "name", [&] (Xml_attribute const &attr) { _dns_domain_name.set_to(attr); diff --git a/repos/os/src/test/nic_router_dhcp/manager/main.cc b/repos/os/src/test/nic_router_dhcp/manager/main.cc index 5ddbb3434f..d208f0d9b2 100644 --- a/repos/os/src/test/nic_router_dhcp/manager/main.cc +++ b/repos/os/src/test/nic_router_dhcp/manager/main.cc @@ -131,7 +131,7 @@ void Local::Main::_handle_router_state() /* read out new DNS domain name */ Dns_domain_name dns_domain_name { _heap }; - domain_node.with_sub_node("dns-domain", [&] (Xml_node const &sub_node) { + domain_node.with_optional_sub_node("dns-domain", [&] (Xml_node const &sub_node) { xml_node_with_attribute(sub_node, "name", [&] (Xml_attribute const &attr) { dns_domain_name.set_to(attr); }); diff --git a/repos/os/src/test/resource_request/main.cc b/repos/os/src/test/resource_request/main.cc index 7c69f7c885..979ce86f75 100644 --- a/repos/os/src/test/resource_request/main.cc +++ b/repos/os/src/test/resource_request/main.cc @@ -87,8 +87,8 @@ struct Test::Monitor { size_t result = 0; - _init_state.xml().with_sub_node("child", [&] (Xml_node const &child) { - child.with_sub_node("ram", [&] (Xml_node const &ram) { + _init_state.xml().with_optional_sub_node("child", [&] (Xml_node const &child) { + child.with_optional_sub_node("ram", [&] (Xml_node const &ram) { result = ram.attribute_value(attr, Number_of_bytes(0)); }); }); return result; diff --git a/repos/ports/src/virtualbox5/generic/sup_vmm.cc b/repos/ports/src/virtualbox5/generic/sup_vmm.cc index d394bd7903..d7033318a9 100644 --- a/repos/ports/src/virtualbox5/generic/sup_vmm.cc +++ b/repos/ports/src/virtualbox5/generic/sup_vmm.cc @@ -722,7 +722,7 @@ uint64_t genode_cpu_hz() if (!cpu_freq) { try { - platform_rom().with_sub_node("tsc", [&] (Genode::Xml_node const &tsc) { + platform_rom().with_optional_sub_node("tsc", [&] (Genode::Xml_node const &tsc) { cpu_freq = tsc.attribute_value("freq_khz", cpu_freq); }); cpu_freq *= 1000ULL; } catch (...) { } diff --git a/repos/ports/src/virtualbox5/spec/nova/sup.cc b/repos/ports/src/virtualbox5/spec/nova/sup.cc index 79ea8be036..0d68c3af52 100644 --- a/repos/ports/src/virtualbox5/spec/nova/sup.cc +++ b/repos/ports/src/virtualbox5/spec/nova/sup.cc @@ -690,7 +690,7 @@ uint64_t genode_cpu_hz() if (!cpu_freq) { try { - platform_rom().with_sub_node("tsc", [&] (Genode::Xml_node const &tsc) { + platform_rom().with_optional_sub_node("tsc", [&] (Genode::Xml_node const &tsc) { cpu_freq = tsc.attribute_value("freq_khz", cpu_freq); }); cpu_freq *= 1000ULL; } catch (...) { } diff --git a/repos/ports/src/virtualbox6/sup_drv.cc b/repos/ports/src/virtualbox6/sup_drv.cc index 8f509d0bd6..60fc557133 100644 --- a/repos/ports/src/virtualbox6/sup_drv.cc +++ b/repos/ports/src/virtualbox6/sup_drv.cc @@ -24,8 +24,8 @@ Sup::Cpu_freq_khz Sup::Drv::_cpu_freq_khz_from_rom() { unsigned khz = 0; - _platform_info_rom.xml().with_sub_node("hardware", [&] (Xml_node const &node) { - node.with_sub_node("tsc", [&] (Xml_node const &node) { + _platform_info_rom.xml().with_optional_sub_node("hardware", [&] (Xml_node const &node) { + node.with_optional_sub_node("tsc", [&] (Xml_node const &node) { khz = node.attribute_value("freq_khz", khz); }); }); @@ -42,8 +42,8 @@ Sup::Drv::Cpu_virt Sup::Drv::_cpu_virt_from_rom() { Cpu_virt virt = Cpu_virt::NONE; - _platform_info_rom.xml().with_sub_node("hardware", [&] (Xml_node const &node) { - node.with_sub_node("features", [&] (Xml_node const &node) { + _platform_info_rom.xml().with_optional_sub_node("hardware", [&] (Xml_node const &node) { + node.with_optional_sub_node("features", [&] (Xml_node const &node) { if (node.attribute_value("vmx", false)) virt = Cpu_virt::VMX; else if (node.attribute_value("svm", false))