RAMDirHandle* RAMDH_init(RAMDirHandle *self, RAMFolder *folder) { DH_init((DirHandle*)self, RAMFolder_Get_Path(folder)); RAMDirHandleIVARS *const ivars = RAMDH_IVARS(self); ivars->folder = (RAMFolder*)INCREF(folder); ivars->elems = Hash_Keys(RAMFolder_IVARS(ivars->folder)->entries); ivars->tick = -1; return self; }
CFReaderDirHandle* CFReaderDH_init(CFReaderDirHandle *self, CompoundFileReader *cf_reader) { DH_init((DirHandle*)self, CFReader_Get_Path(cf_reader)); self->cf_reader = (CompoundFileReader*)INCREF(cf_reader); self->elems = Hash_Keys(self->cf_reader->records); self->tick = -1; // Accumulate entries from real Folder. DirHandle *dh = Folder_Local_Open_Dir(self->cf_reader->real_folder); CharBuf *entry = DH_Get_Entry(dh); while (DH_Next(dh)) { VA_Push(self->elems, (Obj*)CB_Clone(entry)); } DECREF(dh); return self; }
FSDirHandle* FSDH_do_open(FSDirHandle *self, const CharBuf *dir) { char *dir_path_ptr = (char*)CB_Get_Ptr8(dir); DH_init((DirHandle*)self, dir); FSDirHandleIVARS *const ivars = FSDH_IVARS(self); ivars->sys_dir_entry = NULL; ivars->fullpath = NULL; ivars->sys_dirhandle = opendir(dir_path_ptr); if (!ivars->sys_dirhandle) { Err_set_error(Err_new(CB_newf("Failed to opendir '%o'", dir))); DECREF(self); return NULL; } return self; }
FSDirHandle* FSDH_do_open(FSDirHandle *self, const CharBuf *dir) { size_t dir_path_size = CB_Get_Size(dir); char *dir_path_ptr = (char*)CB_Get_Ptr8(dir); char search_string[MAX_PATH + 1]; char *path_ptr = search_string; DH_init((DirHandle*)self, dir); FSDirHandleIVARS *const ivars = FSDH_IVARS(self); ivars->sys_dir_entry = MALLOCATE(sizeof(WIN32_FIND_DATA)); ivars->sys_dirhandle = INVALID_HANDLE_VALUE; ivars->saved_error = NULL; if (dir_path_size >= MAX_PATH - 2) { // Deal with Windows ceiling on file path lengths. Err_set_error(Err_new(CB_newf("Directory path is too long: %o", dir))); CFISH_DECREF(self); return NULL; } // Append trailing wildcard so Windows lists dir contents rather than just // the dir name itself. memcpy(path_ptr, dir_path_ptr, dir_path_size); memcpy(path_ptr + dir_path_size, "\\*\0", 3); ivars->sys_dirhandle = FindFirstFile(search_string, (WIN32_FIND_DATA*)ivars->sys_dir_entry); if (INVALID_HANDLE_VALUE == ivars->sys_dirhandle) { // Directory inaccessible or doesn't exist. Err_set_error(Err_new(CB_newf("Failed to open dir '%o'", dir))); CFISH_DECREF(self); return NULL; } else { // Compensate for the fact that FindFirstFile has already returned the // first entry but DirHandle's API requires that you call Next() to // start the iterator. ivars->delayed_iter = true; } return self; }
CFReaderDirHandle* CFReaderDH_init(CFReaderDirHandle *self, CompoundFileReader *cf_reader) { DH_init((DirHandle*)self, CFReader_Get_Path(cf_reader)); CFReaderDirHandleIVARS *const ivars = CFReaderDH_IVARS(self); ivars->cf_reader = (CompoundFileReader*)INCREF(cf_reader); Hash *cf_records = CFReader_IVARS(ivars->cf_reader)->records; ivars->elems = Hash_Keys(cf_records); ivars->tick = -1; // Accumulate entries from real Folder. Folder *real_folder = CFReader_Get_Real_Folder(ivars->cf_reader); DirHandle *dh = Folder_Local_Open_Dir(real_folder); while (DH_Next(dh)) { String *entry = DH_Get_Entry(dh); Vec_Push(ivars->elems, (Obj*)Str_Clone(entry)); DECREF(entry); } DECREF(dh); return self; }