libaacs | branch: master | npzacs <[email protected]> | Fri May 4 10:10:14 2012 +0300| [9fe352aec1bcd838c260073f3c47e71ca4333350] | committer: npzacs
Added cache_get_or_update() and cache_remove() > http://git.videolan.org/gitweb.cgi/libaacs.git/?a=commit;h=9fe352aec1bcd838c260073f3c47e71ca4333350 --- src/file/keydbcfg.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++----- src/file/keydbcfg.h | 7 ++++- 2 files changed, 60 insertions(+), 8 deletions(-) diff --git a/src/file/keydbcfg.c b/src/file/keydbcfg.c index b3bdf92..bd40040 100644 --- a/src/file/keydbcfg.c +++ b/src/file/keydbcfg.c @@ -38,7 +38,6 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> - #include <sys/types.h> #include <sys/stat.h> @@ -413,7 +412,7 @@ static char *_cache_file(const char *name) return str_printf("%s/%s/%s", cache_dir, CFG_DIR, name); } -int cache_save(const char *name, uint32_t version, const uint8_t *data, uint32_t len) +int cache_save(const char *name, uint32_t version, const void *data, uint32_t len) { int result = 0; char *file = _cache_file(name); @@ -443,12 +442,15 @@ int cache_save(const char *name, uint32_t version, const uint8_t *data, uint32_t return result; } -int cache_get(const char *name, uint32_t *version, uint32_t *len, uint8_t *buf) +int cache_get(const char *name, uint32_t *version, uint32_t *len, void *buf) { int result = 0; char *file = _cache_file(name); - *version = *len = 0; + *version = 0; + if (len) { + *len = 0; + } if (file) { FILE *fp = fopen(file, "r"); @@ -457,10 +459,10 @@ int cache_get(const char *name, uint32_t *version, uint32_t *len, uint8_t *buf) DEBUG(DBG_FILE, "Reading %s\n", file); if (fread(version, 1, 4, fp) == 4 && - fread(len, 1, 4, fp) == 4 && + (!len || fread(len, 1, 4, fp) == 4) && (!buf || fread(buf, 1, *len, fp) == *len)) { - DEBUG(DBG_FILE, "Read %d bytes from %s, version %d\n", 8 + (buf ? *len : 0), file, *version); + DEBUG(DBG_FILE, "Read %d bytes from %s, version %d\n", 4 + (len ? 4 : 0) + (buf ? *len : 0), file, *version); result = 1; } else { @@ -479,6 +481,53 @@ int cache_get(const char *name, uint32_t *version, uint32_t *len, uint8_t *buf) return result; } +int cache_remove(const char *name) +{ + char *file = _cache_file(name); + int result = !remove(name); + if (!result) { + DEBUG(DBG_FILE, "Error removing %s\n", file); + } + X_FREE(file); + return result; +} + +void *cache_get_or_update(const char *type, const void *data, uint32_t *len, uint32_t version) +{ + uint32_t cache_len, cache_version; + uint8_t *cache_data = NULL; + + /* get cache version */ + cache_get(type, &cache_version, &cache_len, NULL); + + /* if cached data is later, use it */ + if (cache_len && cache_version > version) { + cache_data = malloc(cache_len); + + if (cache_get(type, &cache_version, &cache_len, cache_data)) { + DEBUG(DBG_AACS, "Using cached %s. Version: %d\n", type, cache_version); + *len = cache_len; + return cache_data; + } + + /* read failed, fall back to older version */ + X_FREE(cache_data); + } + + if (data) { + cache_data = malloc(*len); + memcpy(cache_data, data, *len); + + /* cached data is older, update cache */ + if (cache_version < version) { + cache_save(type, version, data, *len); + DEBUG(DBG_AACS, "Updated cached %s. Version: %d\n", type, version); + } + } + + return cache_data; +} + static char *_find_config_file(void) { static const char cfg_file_name[] = CFG_FILE_NAME; diff --git a/src/file/keydbcfg.h b/src/file/keydbcfg.h index 8c2cf83..5fd898d 100644 --- a/src/file/keydbcfg.h +++ b/src/file/keydbcfg.h @@ -125,7 +125,10 @@ AACS_PRIVATE int keycache_save(const char *type, const uint8_t *disc_id, AACS_PRIVATE int keycache_find(const char *type, const uint8_t *disc_id, uint8_t *key, unsigned int len); -AACS_PRIVATE int cache_get(const char *name, uint32_t *version, uint32_t *len, uint8_t *buf); /* use buf=NULL to get version and size */ -AACS_PRIVATE int cache_save(const char *name, uint32_t version, const uint8_t *data, uint32_t len); +AACS_PRIVATE int cache_get(const char *name, uint32_t *version, uint32_t *len, void *buf); /* use buf=NULL to get version and size */ +AACS_PRIVATE int cache_save(const char *name, uint32_t version, const void *data, uint32_t len); +AACS_PRIVATE int cache_remove(const char *name); + +AACS_PRIVATE void *cache_get_or_update(const char *type, const void *data, uint32_t *len, uint32_t version); #endif _______________________________________________ libaacs-devel mailing list [email protected] http://mailman.videolan.org/listinfo/libaacs-devel
