#include "../../codec/codec.h" #include "../backings/file.h" #include "file.h" static bool handler_file_can_seek(struct cch_handler *handler) { (void)handler; return true; } static void handler_file_maybe_spawn_worker(struct cch_handler *handler, size_t index) { struct cch_handler_file *file = (struct cch_handler_file *)handler; (void)file; (void)index; } static bool handler_file_wait_for_range(struct cch_handler *handler, struct cch_wait *wait) { (void)handler; (void)wait; return true; } static s32 handler_file_guess_format(struct cch_handler *handler) { struct cch_handler_file *file = (struct cch_handler_file *)handler; struct cch_backing_file *backing = (struct cch_backing_file *)file->backing; str *path = &backing->file.path; u32 dot = al_str_rfind(path, '.'); if (dot != AL_STR_NO_POS) { str ext = al_str_substr(path, dot, path->length); return camu_guess_format(NULL, &ext, NULL); } return -1; } static void handler_file_free(struct cch_handler **handler) { struct cch_handler_file *file = (struct cch_handler_file *)*handler; al_str_free(&file->handler.handler); al_free(file); *handler = NULL; } struct cch_entry *cch_handler_file_create(str *path, str *handler) { struct cch_backing *backing = cch_backing_file_create(path, 0); if (!backing) return NULL; struct cch_handler_file *file = al_alloc_object(struct cch_handler_file); file->backing = backing; struct cch_entry *entry = al_alloc_object(struct cch_entry); entry->backing = backing; entry->handler = (struct cch_handler *)file; entry->handler->can_seek = handler_file_can_seek; entry->handler->maybe_spawn_worker = handler_file_maybe_spawn_worker; entry->handler->wait_for_range = handler_file_wait_for_range; entry->handler->guess_format = handler_file_guess_format; entry->handler->free = handler_file_free; entry->handler->entry = entry; al_str_clone(&entry->handler->handler, handler); return entry; }