1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/files/opener_resource.cc Mon Mar 29 00:04:07 2021 +0200
1.3 @@ -0,0 +1,96 @@
1.4 +#include "opener_server.h"
1.5 +#include "opener_resource.h"
1.6 +#include "resource_server.h"
1.7 +
1.8 +/* Support for providing access to files. */
1.9 +
1.10 +OpenerResource::OpenerResource(Accessing *accessing, Paging *paging, Pages *pages)
1.11 +: _accessing(accessing), _paging(paging), _pages(pages)
1.12 +{
1.13 +}
1.14 +
1.15 +int OpenerResource::expected_items()
1.16 +{
1.17 + return Opener_expected_items;
1.18 +}
1.19 +
1.20 +ipc_server_handler_type OpenerResource::handler()
1.21 +{
1.22 + return (ipc_server_handler_type) handle_Opener;
1.23 +}
1.24 +
1.25 +
1.26 +
1.27 +/* Return a pager object for the given path and flags. */
1.28 +
1.29 +FilePager *OpenerResource::open(const char *path, flags_t flags)
1.30 +{
1.31 + fileid_t fileid = get_fileid(path);
1.32 +
1.33 + if (fileid == FILEID_INVALID)
1.34 + return NULL;
1.35 +
1.36 + Accessor *accessor = get_accessor(fileid);
1.37 + PageMapper *mapper = get_mapper(accessor);
1.38 + return new FilePager(fileid, mapper, flags);
1.39 +}
1.40 +
1.41 +/* Obtain an accessor for the 'fileid' or register a new one in the accessing
1.42 + object. */
1.43 +
1.44 +Accessor *OpenerResource::get_accessor(fileid_t fileid)
1.45 +{
1.46 + Accessor *accessor;
1.47 +
1.48 + if (_accessing->reserve(fileid))
1.49 + accessor = _accessing->get(fileid);
1.50 + else
1.51 + {
1.52 + accessor = make_accessor(fileid);
1.53 + _accessing->set(fileid, accessor);
1.54 + }
1.55 +
1.56 + return accessor;
1.57 +}
1.58 +
1.59 +/* Obtain a page mapper for the 'accessor' or register a new one in the
1.60 + paging object. */
1.61 +
1.62 +PageMapper *OpenerResource::get_mapper(Accessor *accessor)
1.63 +{
1.64 + PageMapper *mapper;
1.65 +
1.66 + if (_paging->reserve(accessor))
1.67 + mapper = _paging->get(accessor);
1.68 + else
1.69 + {
1.70 + mapper = new PageMapper(accessor, _pages);
1.71 + _paging->set(accessor, mapper);
1.72 + }
1.73 +
1.74 + return mapper;
1.75 +}
1.76 +
1.77 +
1.78 +
1.79 +/* Opener interface methods. */
1.80 +
1.81 +long OpenerResource::context(l4_cap_idx_t *context)
1.82 +{
1.83 + OpenerContextResource *resource = new OpenerContextResource(this);
1.84 +
1.85 + /* Complete the initialisation and start a server in a new thread.
1.86 + If the thread does not start, the resource should be finalised. */
1.87 +
1.88 + ResourceServer server(resource);
1.89 + long err = server.start_thread();
1.90 +
1.91 + /* Return the server capability to the caller. */
1.92 +
1.93 + if (!err)
1.94 + *context = server.config()->server;
1.95 +
1.96 + return err;
1.97 +}
1.98 +
1.99 +// vim: tabstop=4 expandtab shiftwidth=4