summaryrefslogtreecommitdiff
path: root/src/cache/handlers/file.c
blob: 1a703505352baad96a18f285579103bb529027a4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#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;
}