2011-12-22 16:19:25 +01:00
|
|
|
/*
|
|
|
|
* \brief Block interface for HTTP block driver
|
|
|
|
* \author Sebastian Sumpf <sebastian.sumpf@genode-labs.com>
|
2013-11-28 15:13:20 +01:00
|
|
|
* \author Stefan Kalkowski <stefan.kalkowski@genode-labs.com>
|
2011-12-22 16:19:25 +01:00
|
|
|
* \date 2010-08-24
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
2017-01-16 15:33:56 +01:00
|
|
|
* Copyright (C) 2010-2017 Genode Labs GmbH
|
2011-12-22 16:19:25 +01:00
|
|
|
*
|
|
|
|
* This file is part of the Genode OS framework, which is distributed
|
2017-02-20 13:23:52 +01:00
|
|
|
* under the terms of the GNU Affero General Public License version 3.
|
2011-12-22 16:19:25 +01:00
|
|
|
*/
|
|
|
|
|
|
|
|
/* Genode includes */
|
2016-08-12 15:10:50 +02:00
|
|
|
#include <base/attached_rom_dataspace.h>
|
|
|
|
#include <base/log.h>
|
2013-11-28 15:13:20 +01:00
|
|
|
#include <block/component.h>
|
2016-12-22 15:01:19 +01:00
|
|
|
#include <libc/component.h>
|
2011-12-22 16:19:25 +01:00
|
|
|
|
|
|
|
/* local includes */
|
|
|
|
#include "http.h"
|
|
|
|
|
|
|
|
using namespace Genode;
|
|
|
|
|
2013-11-28 15:13:20 +01:00
|
|
|
class Driver : public Block::Driver
|
|
|
|
{
|
|
|
|
private:
|
2011-12-22 16:19:25 +01:00
|
|
|
|
2013-11-28 15:13:20 +01:00
|
|
|
size_t _block_size;
|
|
|
|
Http _http;
|
2013-11-22 13:55:05 +01:00
|
|
|
|
2013-11-28 15:13:20 +01:00
|
|
|
public:
|
2011-12-22 16:19:25 +01:00
|
|
|
|
2019-01-21 15:46:48 +01:00
|
|
|
Driver(Heap &heap, Ram_allocator &ram,
|
|
|
|
size_t block_size, ::String const &uri)
|
2017-01-16 15:33:56 +01:00
|
|
|
: Block::Driver(ram),
|
|
|
|
_block_size(block_size), _http(heap, uri) {}
|
2011-12-22 16:19:25 +01:00
|
|
|
|
|
|
|
|
2013-11-28 15:13:20 +01:00
|
|
|
/*******************************
|
|
|
|
** Block::Driver interface **
|
|
|
|
*******************************/
|
2011-12-22 16:19:25 +01:00
|
|
|
|
2019-04-03 16:05:10 +02:00
|
|
|
Block::Session::Info info() const override
|
2013-11-28 15:13:20 +01:00
|
|
|
{
|
2019-04-03 16:05:10 +02:00
|
|
|
return { .block_size = _block_size,
|
|
|
|
.block_count = _http.file_size() / _block_size,
|
2019-04-04 18:25:54 +02:00
|
|
|
.align_log2 = log2(_block_size),
|
2019-04-03 16:05:10 +02:00
|
|
|
.writeable = false };
|
2013-11-28 15:13:20 +01:00
|
|
|
}
|
2011-12-22 16:19:25 +01:00
|
|
|
|
2013-12-04 14:34:53 +01:00
|
|
|
void read(Block::sector_t block_nr,
|
2013-12-03 15:41:14 +01:00
|
|
|
Genode::size_t block_count,
|
|
|
|
char *buffer,
|
|
|
|
Block::Packet_descriptor &packet)
|
|
|
|
{
|
2013-11-28 15:13:20 +01:00
|
|
|
_http.cmd_get(block_nr * _block_size, block_count * _block_size,
|
2013-12-03 15:41:14 +01:00
|
|
|
(addr_t)buffer);
|
2014-02-06 15:23:17 +01:00
|
|
|
ack_packet(packet);
|
2013-12-03 15:41:14 +01:00
|
|
|
}
|
2011-12-22 16:19:25 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2013-11-28 15:13:20 +01:00
|
|
|
class Factory : public Block::Driver_factory
|
2011-12-22 16:19:25 +01:00
|
|
|
{
|
2013-11-28 15:13:20 +01:00
|
|
|
private:
|
2011-12-22 16:19:25 +01:00
|
|
|
|
2016-08-12 15:10:50 +02:00
|
|
|
Env &_env;
|
|
|
|
Heap &_heap;
|
|
|
|
Attached_rom_dataspace _config { _env, "config" };
|
2019-01-21 15:46:48 +01:00
|
|
|
::String const _uri;
|
|
|
|
size_t const _blk_sz;
|
2011-12-22 16:19:25 +01:00
|
|
|
|
2013-11-28 15:13:20 +01:00
|
|
|
public:
|
2011-12-22 16:19:25 +01:00
|
|
|
|
2016-08-12 15:10:50 +02:00
|
|
|
Factory(Env &env, Heap &heap)
|
2019-01-21 15:46:48 +01:00
|
|
|
:
|
|
|
|
_env(env), _heap(heap),
|
|
|
|
_uri (_config.xml().attribute_value("uri", ::String())),
|
|
|
|
_blk_sz(_config.xml().attribute_value("block_size", 512U))
|
2013-11-28 15:13:20 +01:00
|
|
|
{
|
2016-08-12 15:10:50 +02:00
|
|
|
log("Using file=", _uri, " as device with block size ",
|
|
|
|
Hex(_blk_sz, Hex::OMIT_PREFIX), ".");
|
2011-12-22 16:19:25 +01:00
|
|
|
}
|
|
|
|
|
2013-12-03 15:41:14 +01:00
|
|
|
Block::Driver *create() {
|
2017-01-16 15:33:56 +01:00
|
|
|
return new (&_heap) Driver(_heap, _env.ram(), _blk_sz, _uri); }
|
2011-12-22 16:19:25 +01:00
|
|
|
|
2013-11-28 15:13:20 +01:00
|
|
|
void destroy(Block::Driver *driver) {
|
2016-08-12 15:10:50 +02:00
|
|
|
Genode::destroy(&_heap, driver); }
|
2013-11-28 15:13:20 +01:00
|
|
|
};
|
2011-12-22 16:19:25 +01:00
|
|
|
|
|
|
|
|
2014-01-13 13:44:33 +01:00
|
|
|
struct Main
|
2011-12-22 16:19:25 +01:00
|
|
|
{
|
2016-08-12 15:10:50 +02:00
|
|
|
Env &env;
|
|
|
|
Heap heap { env.ram(), env.rm() };
|
|
|
|
Factory factory { env, heap };
|
2017-07-31 19:53:34 +02:00
|
|
|
Block::Root root { env.ep(), heap, env.rm(), factory, true };
|
2011-12-22 16:19:25 +01:00
|
|
|
|
2016-08-12 15:10:50 +02:00
|
|
|
Main(Env &env) : env(env) {
|
|
|
|
env.parent().announce(env.ep().manage(root)); }
|
2014-01-13 13:44:33 +01:00
|
|
|
};
|
2011-12-22 16:19:25 +01:00
|
|
|
|
2013-11-28 15:13:20 +01:00
|
|
|
|
2017-01-03 14:33:55 +01:00
|
|
|
void Libc::Component::construct(Libc::Env &env) { static Main m(env); }
|