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;
     }