Mercurial > hg > dmlib
comparison dmres.c @ 27:21c14afbf63d
Modularize the resource system a bit.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sat, 29 Sep 2012 06:00:26 +0300 |
parents | 2f463a59d732 |
children | e9f562f07cb0 |
comparison
equal
deleted
inserted
replaced
26:2f463a59d732 | 27:21c14afbf63d |
---|---|
30 #endif | 30 #endif |
31 | 31 |
32 | 32 |
33 DMResource *dmres_new(const char *filename, int flags, size_t size) | 33 DMResource *dmres_new(const char *filename, int flags, size_t size) |
34 { | 34 { |
35 DMResource *res = dmMalloc0(sizeof(DMResource)); | 35 DMResource *node = dmMalloc0(sizeof(DMResource)); |
36 if (res == NULL) | 36 if (node == NULL) |
37 return NULL; | 37 return NULL; |
38 | 38 |
39 res->filename = dm_strdup(filename); | 39 node->filename = dm_strdup(filename); |
40 res->flags = flags; | 40 node->flags = flags; |
41 res->dataSize = size; | 41 node->dataSize = size; |
42 | 42 |
43 return res; | 43 return node; |
44 } | 44 } |
45 | 45 |
46 | 46 |
47 void dmres_free(DMResource *res) | 47 void dmres_free_res_data(DMResource *node) |
48 { | 48 { |
49 if (res != NULL) | 49 if (node->rdata != NULL && |
50 { | 50 node->rops != NULL && |
51 if (res->rdata != NULL && | 51 node->rops->free != NULL) |
52 res->rops != NULL && | 52 { |
53 res->rops->free != NULL) | 53 node->rops->free(node); |
54 { | 54 } |
55 res->rops->free(res); | 55 |
56 res->rdata = NULL; | 56 node->rdata = NULL; |
57 } | 57 node->flags &= !DMF_LOADED_RES; |
58 | 58 } |
59 dmFree(res->filename); | 59 |
60 dmFree(res->data); | 60 |
61 dmFree(res); | 61 void dmres_free_raw_data(DMResource *node) |
62 { | |
63 dmFree(node->data); | |
64 node->data = NULL; | |
65 node->flags &= !DMF_LOADED_RAW; | |
66 } | |
67 | |
68 | |
69 void dmres_purge_raw_data(DMResource *node) | |
70 { | |
71 if ((node->flags & DMF_PRELOAD_RAW) == 0 && | |
72 (node->flags & DMF_LOADED_RAW) && | |
73 node->data != NULL) | |
74 dmres_free_raw_data(node); | |
75 } | |
76 | |
77 | |
78 void dmres_free(DMResource *node) | |
79 { | |
80 if (node != NULL) | |
81 { | |
82 dmres_free_res_data(node); | |
83 dmres_free_raw_data(node); | |
84 dmFree(node->filename); | |
85 dmFree(node); | |
62 } | 86 } |
63 } | 87 } |
64 | 88 |
65 | 89 |
66 void dmres_insert(DMResource * node) | 90 void dmres_insert(DMResource * node) |
688 f->atime = time(NULL); | 712 f->atime = time(NULL); |
689 return f->fops->fread(ptr, size, nmemb, f); | 713 return f->fops->fread(ptr, size, nmemb, f); |
690 } | 714 } |
691 | 715 |
692 | 716 |
693 int dmres_ref(DMResource *res) | 717 int dmres_ref(DMResource *node) |
694 { | 718 { |
695 DMRES_LOCK(); | 719 DMRES_LOCK(); |
696 res->atime = time(NULL); | 720 node->atime = time(NULL); |
697 res->refcount++; | 721 node->refcount++; |
698 DMRES_UNLOCK(); | 722 DMRES_UNLOCK(); |
699 | 723 |
700 return res->refcount; | 724 return node->refcount; |
701 } | 725 } |
702 | 726 |
703 | 727 |
704 int dmres_unref(DMResource *res) | 728 int dmres_unref(DMResource *node) |
705 { | 729 { |
706 DMRES_LOCK(); | 730 DMRES_LOCK(); |
707 res->refcount--; | 731 node->refcount--; |
708 DMRES_UNLOCK(); | 732 DMRES_UNLOCK(); |
709 | 733 |
710 return res->refcount; | 734 return node->refcount; |
711 } | 735 } |
712 | 736 |
713 | 737 |
714 int dmres_load_resfile(const char *filename) | 738 int dmres_load_resfile(const char *filename) |
715 { | 739 { |
918 } | 942 } |
919 else | 943 else |
920 if (dfPreload != NULL) | 944 if (dfPreload != NULL) |
921 { | 945 { |
922 // Check if the raw resource wants to be preloaded | 946 // Check if the raw resource wants to be preloaded |
923 if (((dfPreload->flags & DMF_PRELOAD_RAW) || (dfResFlags & DRF_PRELOAD_ALL)) && | 947 if (((dfPreload->flags & DMF_PRELOAD_RAW) || |
948 (dfResFlags & DRF_PRELOAD_ALL)) && | |
924 (dfPreload->flags & DMF_LOADED_RAW) == 0) | 949 (dfPreload->flags & DMF_LOADED_RAW) == 0) |
925 { | 950 { |
926 dmf_init_fops(dfPreload); | 951 dmf_init_fops(dfPreload); |
927 if (dfPreload->fops->preload != NULL) | 952 if (dfPreload->fops->preload != NULL) |
928 { | 953 { |
936 goto error; | 961 goto error; |
937 } | 962 } |
938 } | 963 } |
939 | 964 |
940 // Preload actual resource, if requested | 965 // Preload actual resource, if requested |
941 if (((dfPreload->flags & DMF_PRELOAD_RES) || (dfResFlags & DRF_PRELOAD_RES)) && | 966 if (((dfPreload->flags & DMF_PRELOAD_RES) || |
967 (dfResFlags & DRF_PRELOAD_RES)) && | |
942 (dfPreload->flags & DMF_LOADED_RES) == 0 && | 968 (dfPreload->flags & DMF_LOADED_RES) == 0 && |
943 dfPreload->rops != NULL && | 969 dfPreload->rops != NULL && |
944 dfPreload->rops->load != NULL) | 970 dfPreload->rops->load != NULL) |
945 { | 971 { |
946 dmf_init_fops(dfPreload); | 972 dmf_init_fops(dfPreload); |
981 if (((flags & DMPRUNE_ATIME) && | 1007 if (((flags & DMPRUNE_ATIME) && |
982 currtime - node->atime >= agems) || | 1008 currtime - node->atime >= agems) || |
983 ((flags & DMPRUNE_MTIME) && | 1009 ((flags & DMPRUNE_MTIME) && |
984 currtime - node->mtime >= agems)) | 1010 currtime - node->mtime >= agems)) |
985 { | 1011 { |
986 // Check if resource data is loaded | 1012 dmres_free_res_data(node); |
987 if (node->rdata != NULL && | 1013 dmres_free_raw_data(node); |
988 node->rops != NULL && | |
989 node->rops->free != NULL) | |
990 { | |
991 node->rops->free(node); | |
992 node->flags &= !DMF_LOADED_RES; | |
993 } | |
994 | |
995 // Check if raw data is loaded | |
996 if (node->flags & DMF_LOADED_RAW) | |
997 { | |
998 dmFree(node->data); | |
999 node->data = NULL; | |
1000 node->flags &= !DMF_LOADED_RAW; | |
1001 } | |
1002 } | 1014 } |
1003 } | 1015 } |
1004 } | 1016 } |
1005 | 1017 |
1006 DMRES_UNLOCK(); | 1018 DMRES_UNLOCK(); |