1 #include "opener_server.h" 2 #include "opener_resource.h" 3 #include "resource_server.h" 4 5 /* Support for providing access to files. */ 6 7 OpenerResource::OpenerResource(Paging *paging, Pages *pages) 8 : _paging(paging), _pages(pages) 9 { 10 } 11 12 int OpenerResource::expected_items() 13 { 14 return Opener_expected_items; 15 } 16 17 ipc_server_handler_type OpenerResource::handler() 18 { 19 return (ipc_server_handler_type) handle_Opener; 20 } 21 22 23 24 /* Return a pager object for the given path and flags. */ 25 26 FilePager *OpenerResource::open(const char *path, flags_t flags) 27 { 28 fileid_t fileid = get_fileid(path); 29 30 if (fileid == FILEID_INVALID) 31 return NULL; 32 33 PageMapper *mapper = get_mapper(fileid); 34 return new FilePager(fileid, mapper, flags); 35 } 36 37 /* Obtain a page mapper for the 'fileid' or register a new one in the 38 paging object. */ 39 40 PageMapper *OpenerResource::get_mapper(fileid_t fileid) 41 { 42 PageMapper *mapper; 43 44 if (_paging->reserve(fileid)) 45 mapper = _paging->get(fileid); 46 else 47 { 48 Accessor *accessor = make_accessor(fileid); 49 mapper = new PageMapper(accessor, _pages); 50 _paging->set(fileid, mapper); 51 } 52 53 return mapper; 54 } 55 56 57 58 /* Opener interface methods. */ 59 60 long OpenerResource::context(l4_cap_idx_t *context) 61 { 62 OpenerContextResource *resource = new OpenerContextResource(this); 63 64 /* Complete the initialisation and start a server in a new thread. 65 If the thread does not start, the resource should be finalised. */ 66 67 ResourceServer server(resource); 68 long err = server.start_thread(); 69 70 /* Return the server capability to the caller. */ 71 72 if (!err) 73 *context = server.config()->server; 74 75 return err; 76 } 77 78 // vim: tabstop=4 expandtab shiftwidth=4