/* This method exists as a hook for CompoundFileReader to override; it is * necessary because calling CFReader_Local_Open_FileHandle() won't find * virtual files. No other class should need to override it. */ InStream* Folder_local_open_in(Folder *self, const CharBuf *name) { FileHandle *fh = Folder_Local_Open_FileHandle(self, name, FH_READ_ONLY); InStream *instream = NULL; if (fh) { instream = InStream_open((Obj*)fh); DECREF(fh); if (!instream) { ERR_ADD_FRAME(Err_get_error()); } } else { ERR_ADD_FRAME(Err_get_error()); } return instream; }
FileHandle* Folder_open_filehandle(Folder *self, const CharBuf *path, uint32_t flags) { Folder *enclosing_folder = Folder_Enclosing_Folder(self, path); FileHandle *fh = NULL; if (enclosing_folder) { ZombieCharBuf *name = IxFileNames_local_part(path, ZCB_BLANK()); fh = Folder_Local_Open_FileHandle(enclosing_folder, (CharBuf*)name, flags); if (!fh) { ERR_ADD_FRAME(Err_get_error()); } } else { Err_set_error(Err_new(CB_newf("Invalid path: '%o'", path))); } return fh; }
FileHandle* CFReader_local_open_filehandle(CompoundFileReader *self, const CharBuf *name, uint32_t flags) { Hash *entry = (Hash*)Hash_Fetch(self->records, (Obj*)name); FileHandle *fh = NULL; if (entry) { Err_set_error(Err_new(CB_newf("Can't open FileHandle for virtual file %o in '%o'", name, self->path))); } else { fh = Folder_Local_Open_FileHandle(self->real_folder, name, flags); if (!fh) { ERR_ADD_FRAME(Err_get_error()); } } return fh; }
FileHandle* CFReader_Local_Open_FileHandle_IMP(CompoundFileReader *self, String *name, uint32_t flags) { CompoundFileReaderIVARS *const ivars = CFReader_IVARS(self); Hash *entry = (Hash*)Hash_Fetch(ivars->records, name); FileHandle *fh = NULL; if (entry) { Err_set_error(Err_new(Str_newf("Can't open FileHandle for virtual file %o in '%o'", name, ivars->path))); } else { fh = Folder_Local_Open_FileHandle(ivars->real_folder, name, flags); if (!fh) { ERR_ADD_FRAME(Err_get_error()); } } return fh; }