Mercurial > hg > dmlib
changeset 728:867fc7f205a8
More work on resource handling cleanup.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sun, 21 Apr 2013 18:34:06 +0300 |
parents | 3d74dc794a0a |
children | e09b7fbedf8c |
files | dmres.c dmres.h |
diffstat | 2 files changed, 54 insertions(+), 89 deletions(-) [+] |
line wrap: on
line diff
--- a/dmres.c Sun Apr 21 17:01:38 2013 +0300 +++ b/dmres.c Sun Apr 21 18:34:06 2013 +0300 @@ -43,7 +43,7 @@ } node->resData = NULL; - node->flags &= !DMF_LOADED_RES; + node->flags &= ~DMF_LOADED_RES; } @@ -51,15 +51,7 @@ { dmFree(node->rawData); node->rawData = NULL; - node->flags &= !DMF_LOADED_RAW; -} - - -void dmResourcePurge_raw_data(DMResource *node) -{ - if ((node->flags & DMF_LOADED_RAW) && - node->rawData != NULL) - dmResourceFreeRawData(node); + node->flags &= ~DMF_LOADED_RAW; } @@ -272,6 +264,8 @@ DMResourceOps dfStdioFileOps = { + "Stdio", + dm_stdio_ferror, dm_stdio_fseek, dm_stdio_fsize, @@ -289,6 +283,8 @@ DMResourceOps dfStdioFHOps = { + "StdioFH", + dm_stdio_ferror, dm_stdio_fseek, dm_stdio_fsize, @@ -399,12 +395,25 @@ } +static int dm_pack_fopen(DMResource * f) +{ + if ((f->flags & DMF_LOADED_RAW) == 0) + { + int res = dm_pack_preload(f); + if (res == DMERR_OK) + f->flags |= DMF_LOADED_RAW; + + return res; + } + else + return DMERR_OK; +} + + static void dm_pack_fclose(DMResource * f) { - f->rawSize = 0; - f->rawOffset = 0; - dmFree(f->rawData); - f->rawData = NULL; + if ((f->flags & DMF_PERSIST) == 0) + dmResourceFreeRawData(f); } #endif @@ -535,6 +544,8 @@ #ifdef DM_USE_PACKFS DMResourceOps dfPackFileOps = { + "PackFS", + dm_mem_ferror, dm_mem_fseek, dm_mem_fsize, @@ -545,7 +556,7 @@ dm_mem_fread, NULL, - NULL, + dm_pack_fopen, dm_pack_fclose, dm_pack_preload }; @@ -554,6 +565,8 @@ DMResourceOps dfMemIOFileOps = { + "MemIO", + dm_mem_ferror, dm_mem_fseek, dm_mem_fsize, @@ -580,33 +593,13 @@ } -static void dmf_init_fops(DMResource *handle) -{ - // Check fops - if (handle->fops == NULL) - { -#ifdef DM_USE_PACKFS - if (handle->lib->flags & DRF_USE_PACK) - handle->fops = &dfPackFileOps; - -# ifdef DM_USE_STDIO - else - if (handle->lib->flags & DRF_USE_STDIO) - handle->fops = &dfStdioFileOps; -# else - handle->fops = &dfPackFileOps; -# endif -#endif - - dmf_reset(handle); - } -} - - -int dmf_preload(DMResource *handle) +static int dmResourcePreload(DMResource *handle) { int ret = DMERR_INIT_FAIL; + // Initialize file ops + dmf_init_fops(handle); + // Check if we want to preload raw data? if (handle->lib->flags & DRF_PRELOAD_RAW) { @@ -617,20 +610,11 @@ { ret = handle->fops->preload(handle); if (ret == DMERR_OK) - { - handle->flags |= DMF_LOADED_RAW; - } - dmf_reset(handle); + handle->flags |= DMF_LOADED_RAW | DMF_PERSIST; } + + dmf_reset(handle); } - else - { - if (handle->fops->fopen != NULL) - ret = handle->fops->fopen(handle); - else - return DMERR_FOPEN; - } - // Check if resource data is to be preloaded if (handle->lib->flags & DRF_PRELOAD_RES) @@ -641,42 +625,39 @@ if (handle->rops != NULL && handle->rops->load != NULL) { - ret = handle->rops->load(handle); - if (ret == DMERR_OK) + if ((ret = handle->fops->fopen(handle)) == DMERR_OK) { - // Okay, mark as loaded + ret = handle->rops->load(handle); + handle->fops->fclose(handle); + } + + if (ret == DMERR_OK) handle->flags |= DMF_LOADED_RES; + } - // Check if we can purge the raw data now - if ((handle->flags & DMF_PERSIST) == 0) - dmResourcePurge_raw_data(handle); - } - - dmf_reset(handle); - } + dmf_reset(handle); } return ret; } -DMResource *dmf_open(DMResourceLib *lib, const char *filename) +int dmf_open(DMResourceLib *lib, const char *filename, DMResource **handle) { - int ret; - DMResource *handle; + int res; // Check master directory for resource - if ((handle = dmResourceFind(lib, filename)) == NULL) + if ((*handle = dmResourceFind(lib, filename)) == NULL) { #ifdef DM_USE_STDIO if (lib->flags & DRF_USE_STDIO) { // Hmm.. does not exist? Fall back to a stdio file - handle = dmResourceNew(lib, filename, 0); - if (handle == NULL) + *handle = dmResourceNew(lib, filename, 0); + if (*handle == NULL) return NULL; - handle->fops = &dfStdioFileOps; + (*handle)->fops = &dfStdioFileOps; } else return NULL; @@ -686,26 +667,11 @@ #endif } - // Initialize file ops - dmf_init_fops(handle); - // Check if the data is preloaded - if (handle->flags & DMF_LOADED_RAW) - { + if ((res = handle->fops->fopen(handle)) == DMERR_OK) dmResourceRef(handle); - return handle; - } - // Try preloading - ret = dmf_preload(handle); - - if (ret == DMERR_OK) - { - dmResourceRef(handle); - return handle; - } - - return NULL; + return res; } @@ -1086,9 +1052,8 @@ else if (lib->preload != NULL) { - // Initialize fops and preload - dmf_init_fops(lib->preload); - if ((ret = dmf_preload(lib->preload)) != DMERR_OK) + // Attempt to preload the resource + if ((ret = dmResourcePreload(lib->preload)) != DMERR_OK) { dmError("Error preloading '%s', %d: %s\n", lib->preload->filename, ret, dmErrorStr(ret));
--- a/dmres.h Sun Apr 21 17:01:38 2013 +0300 +++ b/dmres.h Sun Apr 21 18:34:06 2013 +0300 @@ -106,6 +106,7 @@ typedef struct DMResourceOps { + char *name; int (*ferror)(DMResource *); int (*fseek)(DMResource *, const off_t, const int); off_t (*fsize)(DMResource *); @@ -147,7 +148,6 @@ DMResource * dmf_create_stdio_stream(FILE *); #endif void dmf_close(DMResource *); -int dmf_preload(DMResource *); // Basic resource access functions