Mercurial > hg > dmlib
diff dmres.c @ 730:3d813c81f33c
More work on resources API.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sun, 21 Apr 2013 19:29:00 +0300 |
parents | 867fc7f205a8 |
children | 0e164aaa7409 |
line wrap: on
line diff
--- a/dmres.c Sun Apr 21 18:34:13 2013 +0300 +++ b/dmres.c Sun Apr 21 19:29:00 2013 +0300 @@ -578,7 +578,7 @@ dm_mem_fwrite, NULL, - NULL, + dmResourceFree, NULL }; @@ -586,7 +586,7 @@ /* FS file handling functions. These functions call the actual * functions depending on where the file is located. */ -static void dmf_reset(DMResource *handle) +static void dmResourceReset(DMResource *handle) { if (handle != NULL && handle->fops != NULL) dmfseek(handle, 0, SEEK_SET); @@ -597,9 +597,6 @@ { 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) { @@ -613,7 +610,7 @@ handle->flags |= DMF_LOADED_RAW | DMF_PERSIST; } - dmf_reset(handle); + dmResourceReset(handle); } // Check if resource data is to be preloaded @@ -635,56 +632,70 @@ handle->flags |= DMF_LOADED_RES; } - dmf_reset(handle); + dmResourceReset(handle); } return ret; } -int dmf_open(DMResourceLib *lib, const char *filename, DMResource **handle) +int dmf_open(DMResourceLib *lib, const char *filename, DMResource **phandle) { + DMResource *handle; int res; // Check master directory for resource - if ((*handle = dmResourceFind(lib, filename)) == NULL) + if ((*phandle = 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) - return NULL; + *phandle = handle = dmResourceNew(lib, filename, 0); + if (handle == NULL) + return DMERR_MALLOC; - (*handle)->fops = &dfStdioFileOps; + handle->fops = &dfStdioFileOps; } else - return NULL; + return DMERR_INIT_FAIL; #else // Stdio not enabled, fail - return NULL; + return DMERR_INIT_FAIL; #endif } // Check if the data is preloaded if ((res = handle->fops->fopen(handle)) == DMERR_OK) + { dmResourceRef(handle); + if (handle->flags & DMF_TEMPORARY) + { + handle->flags &= ~DMF_TEMPORARY; + dmResourceInsert(lib, handle); + } + } + else + if (handle->flags & DMF_TEMPORARY) + { + dmResourceFree(handle); + *phandle = handle = NULL; + } return res; } -DMResource * dmf_create_memio(DMResourceLib *lib, const char *filename, Uint8 *buf, const size_t size) +int dmf_create_memio(DMResourceLib *lib, const char *filename, + Uint8 *buf, const size_t size, DMResource **phandle) { DMResource *handle; // Check master directory for resource - if ((handle = dmResourceFind(lib, filename)) == NULL) + if ((*phandle = handle = dmResourceFind(lib, filename)) == NULL) { - handle = dmResourceNew(lib, filename, size); - if (handle == NULL) - return NULL; + if ((*phandle = handle = dmResourceNew(lib, filename, size)) == NULL) + return DMERR_MALLOC; handle->flags = DMF_LOADED_RAW; handle->fops = &dfMemIOFileOps; @@ -694,46 +705,43 @@ // Increase refcount dmResourceRef(handle); - - dmf_reset(handle); - return handle; + dmResourceReset(handle); + return DMERR_OK; } #ifdef DM_USE_STDIO -DMResource * dmf_create_stdio(const char *filename, const char *mode) +int dmf_create_stdio(const char *filename, const char *mode, DMResource **phandle) { - DMResource *handle = dmResourceNew(NULL, filename, 0); - if (handle == NULL) - return NULL; + DMResource *handle; + if ((*phandle = handle = dmResourceNew(NULL, filename, 0)) == NULL) + return DMERR_MALLOC; handle->fops = &dfStdioFileOps; handle->fh = fopen(filename, mode); handle->error = dmGetErrno(); - if (handle->fh != NULL) - { - dmResourceRef(handle); - return handle; - } - else + if (handle->fh == NULL) { dmResourceFree(handle); - return NULL; + return handle->error; } + + dmResourceRef(handle); + return DMERR_OK; } -DMResource * dmf_create_stdio_stream(FILE *fh) +int dmf_create_stdio_stream(FILE *fh, DMResource **phandle) { - DMResource *handle = dmResourceNew(NULL, "", 0); - if (handle == NULL) - return NULL; + DMResource *handle; + if ((*phandle = handle = dmResourceNew(NULL, "", 0)) == NULL) + return DMERR_MALLOC; handle->fops = &dfStdioFHOps; handle->fh = fh; dmResourceRef(handle); - return handle; + return DMERR_OK; } #endif