1 #include "opener.h" 2 3 /* Support for providing access to files. */ 4 5 Opener::Opener(Accessing *accessing, Paging *paging, Pages *pages) 6 : _accessing(accessing), _paging(paging), _pages(pages) 7 { 8 } 9 10 OpenerContext *Opener::context() 11 { 12 return new OpenerContext(this); 13 } 14 15 FilePager *Opener::open(const char *path) 16 { 17 fileid_t fileid = get_fileid(path); 18 19 if (fileid == FILEID_INVALID) 20 return NULL; 21 22 Accessor *accessor = get_accessor(fileid); 23 PageMapper *mapper = get_mapper(accessor); 24 return new FilePager(fileid, mapper); 25 } 26 27 /* Obtain an accessor for the 'fileid' or register a new one in the accessing 28 object. */ 29 30 Accessor *Opener::get_accessor(fileid_t fileid) 31 { 32 Accessor *accessor; 33 34 if (_accessing->reserve(fileid)) 35 accessor = _accessing->get(fileid); 36 else 37 { 38 accessor = make_accessor(fileid); 39 _accessing->set(fileid, accessor); 40 } 41 42 return accessor; 43 } 44 45 /* Obtain a page mapper for the 'accessor' or register a new one in the 46 paging object. */ 47 48 PageMapper *Opener::get_mapper(Accessor *accessor) 49 { 50 PageMapper *mapper; 51 52 if (_paging->reserve(accessor)) 53 mapper = _paging->get(accessor); 54 else 55 { 56 mapper = new PageMapper(accessor, _pages); 57 _paging->set(accessor, mapper); 58 } 59 60 return mapper; 61 } 62 63 // vim: tabstop=4 expandtab shiftwidth=4