Qt launchpad: use XML configuration

With this patch, Qt launchpad entries are configured the same way as with
the Scout launchpad.

Fixes #1222.
This commit is contained in:
Christian Prochaska 2014-08-06 17:43:40 +02:00 committed by Norman Feske
parent 2e64a01ea5
commit e851b98806
5 changed files with 116 additions and 90 deletions

View File

@ -187,6 +187,10 @@ class Launchpad
virtual ~Launchpad() { }
/**
* Process launchpad XML configuration
*/
void process_config();
/*************************
** Configuring the GUI **

View File

@ -75,88 +75,6 @@ class Avail_quota_update : public Scout::Tick
};
/**
* Process launchpad XML configuration
*/
static void process_config(Launchpad *launchpad)
{
using namespace Genode;
Xml_node config_node = config()->xml_node();
/*
* Iterate through all entries of the config file and create
* launchpad entries as specified.
*/
int launcher_cnt = 0;
for (unsigned i = 0; i < config_node.num_sub_nodes(); i++) {
Xml_node node = config_node.sub_node(i);
if (node.has_type("launcher"))
/* catch XML syntax errors within launcher node */
try {
/* read file name and default quote from launcher node */
Xml_node::Attribute filename_attr = node.attribute("name");
enum { MAX_NAME_LEN = 128 };
char *filename = (char *)env()->heap()->alloc(MAX_NAME_LEN);
if (!filename) {
printf("Error: Out of memory while processing configuration\n");
return;
}
filename_attr.value(filename, MAX_NAME_LEN);
Xml_node::Attribute ram_quota_attr = node.attribute("ram_quota");
Number_of_bytes default_ram_quota = 0;
ram_quota_attr.value(&default_ram_quota);
/*
* Obtain configuration for the child
*/
Dataspace_capability config_ds;
if (node.has_sub_node("configfile")
&& node.sub_node("configfile").has_attribute("name")) {
char name[128];
node.sub_node("configfile").attribute("name").value(name, sizeof(name));
Rom_connection config_rom(name);
config_rom.on_destruction(Rom_connection::KEEP_OPEN);
config_ds = config_rom.dataspace();
}
if (node.has_sub_node("config")) {
Xml_node config_node = node.sub_node("config");
/* allocate dataspace for config */
size_t const config_size = config_node.size();
config_ds = env()->ram_session()->alloc(config_size);
/* copy configuration into new dataspace */
char * const ptr = env()->rm_session()->attach(config_ds);
Genode::memcpy(ptr, config_node.addr(), config_size);
env()->rm_session()->detach(ptr);
}
/* add launchpad entry */
launchpad->add_launcher(filename, default_ram_quota, config_ds);
launcher_cnt++;
} catch (...) {
printf("Warning: Launcher entry %d is malformed.\n",
launcher_cnt + 1);
}
else {
char buf[32];
node.type_name(buf, sizeof(buf));
printf("Warning: Ignoring unsupported tag <%s>.\n", buf);
}
}
}
static long read_int_attr_from_config(const char *attr, long default_value)
{
long result = default_value;
@ -204,7 +122,7 @@ int main(int argc, char **argv)
/* request config file from ROM service */
try {
process_config(&launchpad);
launchpad.process_config();
} catch (...) { }
Avail_quota_update avail_quota_update(&launchpad);

View File

@ -22,6 +22,7 @@
#include <rom_session/connection.h>
#include <ram_session/connection.h>
#include <cpu_session/connection.h>
#include <os/config.h>
#include <timer_session/connection.h>
#include <launchpad/launchpad.h>
@ -101,6 +102,88 @@ void Launchpad::_get_unique_child_name(const char *filename, char *dst, int dst_
}
/**
* Process launchpad XML configuration
*/
void Launchpad::process_config()
{
using namespace Genode;
Xml_node config_node = config()->xml_node();
/*
* Iterate through all entries of the config file and create
* launchpad entries as specified.
*/
int launcher_cnt = 0;
for (unsigned i = 0; i < config_node.num_sub_nodes(); i++) {
Xml_node node = config_node.sub_node(i);
if (node.has_type("launcher"))
/* catch XML syntax errors within launcher node */
try {
/* read file name and default quote from launcher node */
Xml_node::Attribute filename_attr = node.attribute("name");
enum { MAX_NAME_LEN = 128 };
char *filename = (char *)env()->heap()->alloc(MAX_NAME_LEN);
if (!filename) {
printf("Error: Out of memory while processing configuration\n");
return;
}
filename_attr.value(filename, MAX_NAME_LEN);
Xml_node::Attribute ram_quota_attr = node.attribute("ram_quota");
Number_of_bytes default_ram_quota = 0;
ram_quota_attr.value(&default_ram_quota);
/*
* Obtain configuration for the child
*/
Dataspace_capability config_ds;
if (node.has_sub_node("configfile")
&& node.sub_node("configfile").has_attribute("name")) {
char name[128];
node.sub_node("configfile").attribute("name").value(name, sizeof(name));
Rom_connection config_rom(name);
config_rom.on_destruction(Rom_connection::KEEP_OPEN);
config_ds = config_rom.dataspace();
}
if (node.has_sub_node("config")) {
Xml_node config_node = node.sub_node("config");
/* allocate dataspace for config */
size_t const config_size = config_node.size();
config_ds = env()->ram_session()->alloc(config_size);
/* copy configuration into new dataspace */
char * const ptr = env()->rm_session()->attach(config_ds);
Genode::memcpy(ptr, config_node.addr(), config_size);
env()->rm_session()->detach(ptr);
}
/* add launchpad entry */
add_launcher(filename, default_ram_quota, config_ds);
launcher_cnt++;
} catch (...) {
printf("Warning: Launcher entry %d is malformed.\n",
launcher_cnt + 1);
}
else {
char buf[32];
node.type_name(buf, sizeof(buf));
printf("Warning: Ignoring unsupported tag <%s>.\n", buf);
}
}
}
Launchpad_child *Launchpad::start_child(const char *filename,
unsigned long ram_quota,
Genode::Dataspace_capability config_ds)

View File

@ -35,6 +35,31 @@ append config [qt5_start_nodes feature]
append config {
<start name="qt_launchpad">
<resource name="RAM" quantum="80M"/>
<config>
<libc stdout="/dev/log" stderr="/dev/log">
<vfs>
<dir name="dev"> <log/> </dir>
</vfs>
</libc>
<launcher name="calculatorform" ram_quota="30M">
<config>
<libc stdout="/dev/log" stderr="/dev/log">
<vfs>
<dir name="dev"> <log/> </dir>
</vfs>
</libc>
</config>
</launcher>
<launcher name="tetrix" ram_quota="40M">
<config>
<libc stdout="/dev/log" stderr="/dev/log">
<vfs>
<dir name="dev"> <log/> </dir>
</vfs>
</libc>
</config>
</launcher>
</config>
</start>
</config>
}

View File

@ -29,13 +29,9 @@ int main(int argc, char *argv[])
static Qt_launchpad launchpad(Genode::env()->ram_session()->quota());
launchpad.add_launcher("calculatorform",
30*1024*1024,
Genode::Dataspace_capability());
launchpad.add_launcher("tetrix",
40*1024*1024,
Genode::Dataspace_capability());
try {
launchpad.process_config();
} catch (...) { }
launchpad.move(300,100);
launchpad.show();