os/dynamic_rom_session.h: support Xml_generator
This patch adds a special variant of a 'Content_producer' called 'Xml_producer', which allows the direct use of an 'Xml_generator' for generating the ROM-module content.
This commit is contained in:
parent
78c0e5f6b6
commit
c67a0d3dd8
|
@ -15,6 +15,7 @@
|
||||||
#define _INCLUDE__OS__DYNAMIC_ROM_SESSION_H_
|
#define _INCLUDE__OS__DYNAMIC_ROM_SESSION_H_
|
||||||
|
|
||||||
#include <util/reconstructible.h>
|
#include <util/reconstructible.h>
|
||||||
|
#include <util/xml_generator.h>
|
||||||
#include <base/rpc_server.h>
|
#include <base/rpc_server.h>
|
||||||
#include <base/session_label.h>
|
#include <base/session_label.h>
|
||||||
#include <base/attached_ram_dataspace.h>
|
#include <base/attached_ram_dataspace.h>
|
||||||
|
@ -29,7 +30,7 @@ class Genode::Dynamic_rom_session : public Rpc_object<Rom_session>
|
||||||
|
|
||||||
struct Content_producer : Interface
|
struct Content_producer : Interface
|
||||||
{
|
{
|
||||||
class Buffer_capacity_exceeded : Exception { };
|
using Buffer_capacity_exceeded = Xml_generator::Buffer_exceeded;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write content into the specified buffer
|
* Write content into the specified buffer
|
||||||
|
@ -39,6 +40,34 @@ class Genode::Dynamic_rom_session : public Rpc_object<Rom_session>
|
||||||
virtual void produce_content(char *dst, size_t dst_len) = 0;
|
virtual void produce_content(char *dst, size_t dst_len) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class Xml_producer : public Content_producer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
typedef String<64> Node_name;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
Node_name const _node_name;
|
||||||
|
|
||||||
|
void produce_content(char *dst, size_t dst_len) override
|
||||||
|
{
|
||||||
|
Xml_generator xml(dst, dst_len, _node_name.string(), [&] () {
|
||||||
|
produce_xml(xml); });
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
Xml_producer(Node_name node_name) : _node_name(node_name) { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate ROM content
|
||||||
|
*
|
||||||
|
* \throw Xml_generator::Buffer_exceeded
|
||||||
|
*/
|
||||||
|
virtual void produce_xml(Xml_generator &) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -131,6 +160,16 @@ class Genode::Dynamic_rom_session : public Rpc_object<Rom_session>
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
Dynamic_rom_session(Rpc_entrypoint &ep,
|
||||||
|
Ram_allocator &ram,
|
||||||
|
Region_map &rm,
|
||||||
|
Content_producer &content_producer)
|
||||||
|
:
|
||||||
|
_ep(ep), _ram(ram), _rm(rm), _content_producer(content_producer)
|
||||||
|
{
|
||||||
|
_ep.manage(this);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*
|
*
|
||||||
|
@ -146,15 +185,13 @@ class Genode::Dynamic_rom_session : public Rpc_object<Rom_session>
|
||||||
*
|
*
|
||||||
* The 'Dynamic_rom_session' associates/disassociates itself with 'ep'.
|
* The 'Dynamic_rom_session' associates/disassociates itself with 'ep'.
|
||||||
*/
|
*/
|
||||||
Dynamic_rom_session(Rpc_entrypoint &ep,
|
Dynamic_rom_session(Entrypoint &ep,
|
||||||
Ram_allocator &ram,
|
Ram_allocator &ram,
|
||||||
Region_map &rm,
|
Region_map &rm,
|
||||||
Content_producer &content_producer)
|
Content_producer &content_producer)
|
||||||
:
|
:
|
||||||
_ep(ep), _ram(ram), _rm(rm), _content_producer(content_producer)
|
Dynamic_rom_session(ep.rpc_ep(), ram, rm, content_producer)
|
||||||
{
|
{ }
|
||||||
_ep.manage(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
~Dynamic_rom_session() { _ep.dissolve(this); }
|
~Dynamic_rom_session() { _ep.dissolve(this); }
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue