diff dmres.c @ 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 3d813c81f33c
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));