1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/opener.cc Sun Jan 24 19:29:07 2021 +0100
1.3 @@ -0,0 +1,63 @@
1.4 +#include "opener.h"
1.5 +
1.6 +/* Support for providing access to files. */
1.7 +
1.8 +Opener::Opener(Accessing *accessing, Paging *paging, Pages *pages)
1.9 +: _accessing(accessing), _paging(paging), _pages(pages)
1.10 +{
1.11 +}
1.12 +
1.13 +OpenerContext *Opener::context()
1.14 +{
1.15 + return new OpenerContext(this);
1.16 +}
1.17 +
1.18 +FilePager *Opener::open(const char *path)
1.19 +{
1.20 + fileid_t fileid = get_fileid(path);
1.21 +
1.22 + if (fileid == FILEID_INVALID)
1.23 + return NULL;
1.24 +
1.25 + Accessor *accessor = get_accessor(fileid);
1.26 + PageMapper *mapper = get_mapper(accessor);
1.27 + return new FilePager(fileid, mapper);
1.28 +}
1.29 +
1.30 +/* Obtain an accessor for the 'fileid' or register a new one in the accessing
1.31 + object. */
1.32 +
1.33 +Accessor *Opener::get_accessor(fileid_t fileid)
1.34 +{
1.35 + Accessor *accessor;
1.36 +
1.37 + if (_accessing->reserve(fileid))
1.38 + accessor = _accessing->get(fileid);
1.39 + else
1.40 + {
1.41 + accessor = make_accessor(fileid);
1.42 + _accessing->set(fileid, accessor);
1.43 + }
1.44 +
1.45 + return accessor;
1.46 +}
1.47 +
1.48 +/* Obtain a page mapper for the 'accessor' or register a new one in the
1.49 + paging object. */
1.50 +
1.51 +PageMapper *Opener::get_mapper(Accessor *accessor)
1.52 +{
1.53 + PageMapper *mapper;
1.54 +
1.55 + if (_paging->reserve(accessor))
1.56 + mapper = _paging->get(accessor);
1.57 + else
1.58 + {
1.59 + mapper = new PageMapper(accessor, _pages);
1.60 + _paging->set(accessor, mapper);
1.61 + }
1.62 +
1.63 + return mapper;
1.64 +}
1.65 +
1.66 +// vim: tabstop=4 expandtab shiftwidth=4