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