Mercurial > hg > dmlib
changeset 29:e9f562f07cb0
Modularize some more and fix a nasty bug when raw data is not preloaded but
resource data needs to be preloaded.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sat, 29 Sep 2012 07:19:53 +0300 |
parents | 920fb22cffcf |
children | ca0e00facb7b |
files | dmres.c |
diffstat | 1 files changed, 61 insertions(+), 54 deletions(-) [+] |
line wrap: on
line diff
--- a/dmres.c Sat Sep 29 06:52:59 2012 +0300 +++ b/dmres.c Sat Sep 29 07:19:53 2012 +0300 @@ -533,6 +533,59 @@ } +int dmf_preload(DMResource *handle) +{ + int ret = DMERR_INIT_FAIL; + + // Check if we want to preload raw data? + if (((handle->flags & DMF_PRELOAD_RAW) || + (dfResFlags & DRF_PRELOAD_ALL)) && + (handle->flags & DMF_LOADED_RAW) == 0 && + handle->fops->preload != NULL) + { + ret = handle->fops->preload(handle); + if (ret == DMERR_OK) + { + handle->flags |= DMF_LOADED_RAW; + } + } + else + { + if (handle->fops->fopen != NULL) + ret = handle->fops->fopen(handle); + else + if (handle->fops->preload != NULL) + { + ret = handle->fops->preload(handle); + if (ret == DMERR_OK) + { + handle->flags |= DMF_LOADED_RAW; + } + } + } + + // Check if resource data is to be preloaded + if (((handle->flags & DMF_PRELOAD_RES) || (dfResFlags & DRF_PRELOAD_RES)) && + (handle->flags & DMF_LOADED_RES) == 0 && + handle->rops != NULL && + handle->rops->load != NULL) + { + ret = handle->rops->load(handle); + if (ret == DMERR_OK) + { + // Okay, mark as loaded + handle->flags |= DMF_LOADED_RES; + + // Check if we can purge the raw data now + if ((handle->flags & DMF_PERSIST) == 0) + dmres_purge_raw_data(handle); + } + } + + return ret; +} + + DMResource *dmf_open(const char *filename) { int ret; @@ -555,6 +608,7 @@ #endif } + // Initialize file ops dmf_init_fops(handle); // Check if the data is preloaded @@ -564,27 +618,8 @@ return handle; } - // Check if we want to preload .. - ret = DMERR_INIT_FAIL; - if (((handle->flags & DMF_PRELOAD_RAW) || (dfResFlags & DRF_PRELOAD_ALL)) && - (handle->flags & DMF_LOADED_RAW) == 0 && - handle->fops->preload != NULL) - ret = handle->fops->preload(handle); - else - { - if (handle->fops->fopen != NULL) - ret = handle->fops->fopen(handle); - else - if (handle->fops->preload != NULL) - ret = handle->fops->preload(handle); - } - - if (((handle->flags & DMF_PRELOAD_RES) || (dfResFlags & DRF_PRELOAD_RES)) && - (handle->flags & DMF_LOADED_RES) == 0 && - handle->rops != NULL && - handle->rops->load != NULL) - ret = handle->rops->load(handle); - + // Try preloading + ret = dmf_preload(handle); if (ret == DMERR_OK) { @@ -943,40 +978,12 @@ else if (dfPreload != NULL) { - // Check if the raw resource wants to be preloaded - if (((dfPreload->flags & DMF_PRELOAD_RAW) || - (dfResFlags & DRF_PRELOAD_ALL)) && - (dfPreload->flags & DMF_LOADED_RAW) == 0) - { - dmf_init_fops(dfPreload); - if (dfPreload->fops->preload != NULL) - { - ret = dfPreload->fops->preload(dfPreload); - if (ret == DMERR_OK) - { - dfPreload->flags |= DMF_LOADED_RAW; - (*loaded)++; - } - else - goto error; - } - } + // Initialize fops and preload + dmf_init_fops(dfPreload); + if ((ret = dmf_preload(dfPreload)) != DMERR_OK) + goto error; - // Preload actual resource, if requested - if (((dfPreload->flags & DMF_PRELOAD_RES) || - (dfResFlags & DRF_PRELOAD_RES)) && - (dfPreload->flags & DMF_LOADED_RES) == 0 && - dfPreload->rops != NULL && - dfPreload->rops->load != NULL) - { - dmf_init_fops(dfPreload); - ret = dfPreload->rops->load(dfPreload); - if (ret != DMERR_OK) - goto error; - - dfPreload->flags |= DMF_LOADED_RES; - } - + (*loaded)++; dfPreload = dfPreload->next; }