int build_download_list(list_t *download, list_t *src) { int count = 0; char *cache_path; package_t *pkg, *tmp; fileinfo_t info; list_for_each_entry(tmp, src, list) { cache_path = make_cache_path(tmp->filename); if( get_fileinfo(cache_path, &info) != 0) { pkg = (package_t*)malloc(sizeof(package_t)); INIT_LIST_HEAD(&pkg->file_list); pkg->id = tmp->id; pkg->name = strdup(tmp->name); pkg->version = strdup(tmp->version); pkg->group = strdup(tmp->group); pkg->filename = strdup(tmp->filename); pkg->description = strdup(tmp->description); list_add_tail(&pkg->list, download); count++; }; }
void FileCache::cancel(const TCHAR *name, FILE *file) { fclose(file); TCHAR path[path_buffer_size(name)]; File::Delete(make_cache_path(path, name)); }
bool FileCache::commit(const TCHAR *name, FILE *file) { if (fclose(file) != 0) { TCHAR path[path_buffer_size(name)]; File::Delete(make_cache_path(path, name)); return false; } return true; }
FILE * FileCache::save(const TCHAR *name, const TCHAR *original_path) { struct file_info original_info; if (!get_regular_file_info(original_path, &original_info)) return NULL; TCHAR path[path_buffer_size(name)]; make_cache_path(path, name); File::Delete(path); FILE *file = _tfopen(path, _T("wb")); if (file == NULL) return NULL; if (fwrite(&file_cache_magic, sizeof(file_cache_magic), 1, file) != 1 || fwrite(&original_info, sizeof(original_info), 1, file) != 1) { fclose(file); File::Delete(path); return NULL; } return file; }
FILE * FileCache::load(const TCHAR *name, const TCHAR *original_path) { struct file_info original_info; if (!get_regular_file_info(original_path, &original_info)) return NULL; TCHAR path[path_buffer_size(name)]; make_cache_path(path, name); struct file_info cached_info; if (!get_regular_file_info(path, &cached_info)) return NULL; #ifndef _WIN32_WCE if (original_info.mtime > cached_info.mtime) { File::Delete(path); return NULL; } #endif FILE *file = _tfopen(path, _T("rb")); if (file == NULL) return NULL; unsigned magic; struct file_info old_info; if (fread(&magic, sizeof(magic), 1, file) != 1 || magic != file_cache_magic || fread(&old_info, sizeof(old_info), 1, file) != 1 || old_info != original_info) { fclose(file); File::Delete(path); return NULL; } return file; }
void FileCache::flush(const TCHAR *name) { TCHAR buffer[path_buffer_size(name)]; File::Delete(make_cache_path(buffer, name)); }