Subversion Repositories freemyipod

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
770 user890104 1
//
2
//
3
//    Copyright 2011 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
 
24
#include "global.h"
25
 
26
#include "cache.h"
27
#include "emcore.h"
28
#include "util.h"
29
 
30
 
31
struct emcore_dir_entry* emcore_dir_entry_cache = NULL;
32
size_t emcore_dir_cache_length = 0;
33
 
34
void cache_init(void)
35
{
36
    int32_t datetime = unix_ts_to_fat_time(time(NULL));
37
#ifdef DEBUG
38
    fprintf(stderr, "Init cache...\n");
39
#endif
40
    emcore_dir_entry_cache = calloc(sizeof(*emcore_dir_entry_cache), 1);
41
 
42
    emcore_dir_entry_cache->name = strdup("/");
43
    emcore_dir_entry_cache->attributes = 0x10;
44
    emcore_dir_entry_cache->size = 0x1000;
45
    emcore_dir_entry_cache->wrtdate = datetime >> 0x10;
46
    emcore_dir_entry_cache->wrttime = datetime & 0xffff;
47
 
48
    emcore_dir_cache_length = 1;
49
#ifdef DEBUG
50
    fprintf(stderr, "Cache init done!\n");
51
#endif
52
}
53
 
54
struct emcore_dir_entry* cache_get(const char* name)
55
{
56
    size_t i;
57
 
58
    if (!emcore_dir_cache_length)
59
    {
60
        return NULL;
61
    }
62
 
63
    for (i = 0; i < emcore_dir_cache_length; ++i)
64
    {
65
#ifdef DEBUG2
782 user890104 66
        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 67
#endif
68
        if (0 == strcmp(name, emcore_dir_entry_cache[i].name))
69
        {
70
            return &emcore_dir_entry_cache[i];
71
        }
72
    }
73
 
74
    return NULL;
75
}
76
 
77
void cache_insert(const char* dir_name, const struct emcore_dir_entry* entry)
78
{
79
#ifdef DEBUG2
80
    fprintf(stderr, "CACHE INSERT: dir=[%s], entry=[%s]\n", dir_name, entry->name);
81
#endif
82
    void* new_ptr;
83
    struct emcore_dir_entry* cache_entry;
84
    char* new_name;
85
    size_t new_name_len = 1;
784 user890104 86
 
87
    if (0 == strcmp(entry->name, ".") || 0 == strcmp(entry->name, ".."))
88
    {
89
        return;
90
    }
91
 
770 user890104 92
    new_name_len += strlen(dir_name) + strlen(entry->name);
93
 
94
    if (strcmp(dir_name, "/") != 0)
95
    {
96
        ++new_name_len;
97
    }
98
 
99
    new_name = calloc(sizeof(char), new_name_len);
100
    strcat(new_name, dir_name);
101
 
102
    if (strcmp(dir_name, "/") != 0)
103
    {
104
        strcat(new_name, "/");
105
    }
106
 
107
    strcat(new_name, entry->name);
108
 
109
    if (cache_get(new_name))
110
    {
111
        free(new_name);
112
        return;
113
    }
114
 
115
    new_ptr = realloc(emcore_dir_entry_cache,
116
        sizeof(*emcore_dir_entry_cache) * (emcore_dir_cache_length + 1));
117
 
118
    if (!new_ptr)
119
    {
120
        free(new_name);
121
        return;
122
    }
123
 
124
    emcore_dir_entry_cache = new_ptr;
125
 
126
    cache_entry = malloc(sizeof(*cache_entry));
127
 
128
    if (!cache_entry)
129
    {
130
        free(new_name);
131
        return;
132
    }
133
 
134
    memcpy(cache_entry, entry, sizeof(*entry));
135
 
136
    cache_entry->name = new_name;
137
 
138
    memcpy(emcore_dir_entry_cache + emcore_dir_cache_length, cache_entry, sizeof(*cache_entry));
783 user890104 139
    free(cache_entry);
770 user890104 140
 
141
#ifdef DEBUG
142
    fprintf(stderr, "Inserting [%s] to cache\n", emcore_dir_entry_cache[emcore_dir_cache_length].name);
143
#endif
144
    ++emcore_dir_cache_length;
145
}
146
 
782 user890104 147
void cache_remove(const char* name)
148
{
149
    size_t i;
150
    void* new_ptr;
151
 
152
    for (i = 0; i < emcore_dir_cache_length; ++i)
153
    {
154
#ifdef DEBUG2
155
        fprintf(stderr, "cache_remove: strcmp([%s], [%s]) == %d\n", name, emcore_dir_entry_cache[i].name, strcmp(name, emcore_dir_entry_cache[i].name));
156
#endif
157
        if (0 == strcmp(name, emcore_dir_entry_cache[i].name))
158
        {
159
#ifdef DEBUG2
160
            fprintf(stderr, "CACHE REMOVE: [%s]\n", name);
161
#endif
162
            free(emcore_dir_entry_cache[i].name);
163
 
164
            if (emcore_dir_cache_length > i + 1) {
165
                memcpy(emcore_dir_entry_cache + i, emcore_dir_entry_cache + i + 1, (emcore_dir_cache_length - i - 1) * sizeof(*emcore_dir_entry_cache));
166
            }
167
 
168
            --emcore_dir_cache_length;
169
 
170
            new_ptr = realloc(emcore_dir_entry_cache,
171
                sizeof(*emcore_dir_entry_cache) * (emcore_dir_cache_length));
172
 
173
            if (!new_ptr)
174
            {
175
                return;
176
            }
177
 
178
            emcore_dir_entry_cache = new_ptr;
179
        }
180
    }
181
 
182
}
183
 
770 user890104 184
void cache_destroy(void)
185
{
186
#ifdef DEBUG
187
    fprintf(stderr, "Destroying cache...\n");
188
#endif
189
    while (emcore_dir_cache_length)
190
    {
191
        free(emcore_dir_entry_cache[--emcore_dir_cache_length].name);
192
    }
193
 
194
    free(emcore_dir_entry_cache);
195
#ifdef DEBUG
196
    fprintf(stderr, "Cache destroyed!\n");
197
#endif
198
}
782 user890104 199
 
200
#ifdef DEBUG2
201
void cache_dump(void)
202
{
203
    size_t i;
204
 
205
    if (!emcore_dir_cache_length)
206
    {
207
        return;
208
    }
209
 
210
    for (i = 0; i < emcore_dir_cache_length; ++i)
211
    {
784 user890104 212
        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 213
    }
214
}
215
#endif