static void test_Local_Open_In(TestBatchRunner *runner) { Folder *real_folder = S_folder_with_contents(); CompoundFileReader *cf_reader = CFReader_open(real_folder); InStream *instream; instream = CFReader_Local_Open_In(cf_reader, foo); TEST_TRUE(runner, instream != NULL, "Local_Open_In for virtual file"); TEST_TRUE(runner, Str_Starts_With(InStream_Get_Filename(instream), CFReader_Get_Path(cf_reader)), "InStream's path includes directory"); DECREF(instream); OutStream *outstream = CFReader_Open_Out(cf_reader, baz); OutStream_Write_Bytes(outstream, "baz", 3); OutStream_Close(outstream); DECREF(outstream); instream = CFReader_Local_Open_In(cf_reader, baz); TEST_TRUE(runner, instream != NULL, "Local_Open_In pass-through for real file"); DECREF(instream); Err_set_error(NULL); instream = CFReader_Local_Open_In(cf_reader, stuff); TEST_TRUE(runner, instream == NULL, "Local_Open_In for non-existent file returns NULL"); TEST_TRUE(runner, Err_get_error() != NULL, "Local_Open_In for non-existent file sets global error"); DECREF(cf_reader); DECREF(real_folder); }
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; }
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; }