Subversion Repositories freemyipod

Rev

Rev 898 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
770 user890104 1
//
2
//
898 user890104 3
//    Copyright 2013 user890104
770 user890104 4
//
5
//
6
//    This file is part of emCORE.
7
//
8
//    emCORE is free software: you can redistribute it and/or
9
//    modify it under the terms of the GNU General Public License as
10
//    published by the Free Software Foundation, either version 2 of the
11
//    License, or (at your option) any later version.
12
//
13
//    emCORE is distributed in the hope that it will be useful,
14
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
15
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16
//    See the GNU General Public License for more details.
17
//
18
//    You should have received a copy of the GNU General Public License along
19
//    with emCORE.  If not, see <http://www.gnu.org/licenses/>.
20
//
21
//
22
 
23
#include "global.h"
24
 
25
#include "cache.h"
26
#include "emcore.h"
27
#include "util.h"
28
 
898 user890104 29
struct emcore_dir_entry *emcore_dir_entry_cache = NULL;
770 user890104 30
size_t emcore_dir_cache_length = 0;
31
 
898 user890104 32
void cache_init(void) {
770 user890104 33
    int32_t datetime = unix_ts_to_fat_time(time(NULL));
34
#ifdef DEBUG
35
    fprintf(stderr, "Init cache...\n");
36
#endif
37
    emcore_dir_entry_cache = calloc(sizeof(*emcore_dir_entry_cache), 1);
38
 
39
    emcore_dir_entry_cache->name = strdup("/");
40
    emcore_dir_entry_cache->attributes = 0x10;
41
    emcore_dir_entry_cache->size = 0x1000;
42
    emcore_dir_entry_cache->wrtdate = datetime >> 0x10;
43
    emcore_dir_entry_cache->wrttime = datetime & 0xffff;
44
 
45
    emcore_dir_cache_length = 1;
46
#ifdef DEBUG
47
    fprintf(stderr, "Cache init done!\n");
48
#endif
49
}
50
 
898 user890104 51
struct emcore_dir_entry *cache_get(const char *name) {
770 user890104 52
    size_t i;
53
 
898 user890104 54
    for (i = 0; i < emcore_dir_cache_length; ++i) {
770 user890104 55
#ifdef DEBUG2
782 user890104 56
        fprintf(stderr, "cache_get: strcmp([%s], [%s]) == %d\n", name, emcore_dir_entry_cache[i].name, strcmp(name, emcore_dir_entry_cache[i].name));
770 user890104 57
#endif
898 user890104 58
        if (strcmp(name, emcore_dir_entry_cache[i].name) == 0) {
770 user890104 59
            return &emcore_dir_entry_cache[i];
60
        }
61
    }
62
 
63
    return NULL;
64
}
65
 
898 user890104 66
void cache_insert(const char *dir_name, const struct emcore_dir_entry *entry) {
770 user890104 67
#ifdef DEBUG2
68
    fprintf(stderr, "CACHE INSERT: dir=[%s], entry=[%s]\n", dir_name, entry->name);
69
#endif
898 user890104 70
    void *new_ptr;
71
    struct emcore_dir_entry *cache_entry;
72
    char *new_name;
770 user890104 73
    size_t new_name_len = 1;
784 user890104 74
 
898 user890104 75
    if (strcmp(entry->name, ".") == 0 || strcmp(entry->name, "..") == 0) {
784 user890104 76
        return;
77
    }
78
 
770 user890104 79
    new_name_len += strlen(dir_name) + strlen(entry->name);
80
 
898 user890104 81
    if (strcmp(dir_name, "/") != 0) {
770 user890104 82
        ++new_name_len;
83
    }
84
 
85
    new_name = calloc(sizeof(char), new_name_len);
86
    strcat(new_name, dir_name);
87
 
898 user890104 88
    if (strcmp(dir_name, "/") != 0) {
770 user890104 89
        strcat(new_name, "/");
90
    }
91
 
92
    strcat(new_name, entry->name);
93
 
898 user890104 94
    if (cache_get(new_name)) {
770 user890104 95
        free(new_name);
96
        return;
97
    }
98
 
99
    new_ptr = realloc(emcore_dir_entry_cache,
100
        sizeof(*emcore_dir_entry_cache) * (emcore_dir_cache_length + 1));
101
 
898 user890104 102
    if (!new_ptr) {
770 user890104 103
        free(new_name);
104
        return;
105
    }
106
 
107
    emcore_dir_entry_cache = new_ptr;
108
 
109
    cache_entry = malloc(sizeof(*cache_entry));
110
 
898 user890104 111
    if (!cache_entry) {
770 user890104 112
        free(new_name);
113
        return;
114
    }
115
 
116
    memcpy(cache_entry, entry, sizeof(*entry));
117
 
118
    cache_entry->name = new_name;
119
 
120
    memcpy(emcore_dir_entry_cache + emcore_dir_cache_length, cache_entry, sizeof(*cache_entry));
783 user890104 121
    free(cache_entry);
770 user890104 122
 
123
#ifdef DEBUG
124
    fprintf(stderr, "Inserting [%s] to cache\n", emcore_dir_entry_cache[emcore_dir_cache_length].name);
125
#endif
126
    ++emcore_dir_cache_length;
127
}
128
 
898 user890104 129
void cache_remove(const char *name) {
782 user890104 130
    size_t i;
898 user890104 131
    void *new_ptr;
782 user890104 132
 
898 user890104 133
    for (i = 0; i < emcore_dir_cache_length; ++i) {
782 user890104 134
#ifdef DEBUG2
135
        fprintf(stderr, "cache_remove: strcmp([%s], [%s]) == %d\n", name, emcore_dir_entry_cache[i].name, strcmp(name, emcore_dir_entry_cache[i].name));
136
#endif
898 user890104 137
        if (strcmp(name, emcore_dir_entry_cache[i].name) == 0) {
782 user890104 138
#ifdef DEBUG2
139
            fprintf(stderr, "CACHE REMOVE: [%s]\n", name);
140
#endif
141
            free(emcore_dir_entry_cache[i].name);
142
 
898 user890104 143
            if (i < emcore_dir_cache_length - 1) {
782 user890104 144
                memcpy(emcore_dir_entry_cache + i, emcore_dir_entry_cache + i + 1, (emcore_dir_cache_length - i - 1) * sizeof(*emcore_dir_entry_cache));
145
            }
146
 
147
            --emcore_dir_cache_length;
148
 
149
            new_ptr = realloc(emcore_dir_entry_cache,
150
                sizeof(*emcore_dir_entry_cache) * (emcore_dir_cache_length));
151
 
898 user890104 152
            if (!new_ptr) {
782 user890104 153
                return;
154
            }
155
 
156
            emcore_dir_entry_cache = new_ptr;
157
        }
158
    }
159
}
160
 
898 user890104 161
void cache_destroy(void) {
770 user890104 162
#ifdef DEBUG
163
    fprintf(stderr, "Destroying cache...\n");
164
#endif
898 user890104 165
    while (emcore_dir_cache_length) {
770 user890104 166
        free(emcore_dir_entry_cache[--emcore_dir_cache_length].name);
167
    }
168
 
169
    free(emcore_dir_entry_cache);
170
#ifdef DEBUG
171
    fprintf(stderr, "Cache destroyed!\n");
172
#endif
173
}
782 user890104 174
 
175
#ifdef DEBUG2
898 user890104 176
void cache_dump(void) {
782 user890104 177
    size_t i;
178
 
898 user890104 179
    for (i = 0; i < emcore_dir_cache_length; ++i) {
784 user890104 180
        fprintf(stderr, "cache_dump: [%s] / attr: 0x%08x / size: %d / startcluster: %d / ts: %lu\n", emcore_dir_entry_cache[i].name, emcore_dir_entry_cache[i].attributes, emcore_dir_entry_cache[i].size, emcore_dir_entry_cache[i].startcluster, fat_time_to_unix_ts(emcore_dir_entry_cache[i].wrttime, emcore_dir_entry_cache[i].wrtdate));
782 user890104 181
    }
182
}
183
#endif