Logging: Use CLOG for blenkernel
[blender.git] / source / blender / blenkernel / intern / addon.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor(s): Campbell Barton
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 /** \file blender/blenkernel/intern/addon.c
24  *  \ingroup bke
25  */
26
27 #include <stddef.h>
28 #include <stdlib.h>
29
30 #include "RNA_types.h"
31
32 #include "BLI_utildefines.h"
33 #include "BLI_ghash.h"
34 #include "BLI_string.h"
35 #include "BLI_listbase.h"
36
37 #include "BKE_addon.h"  /* own include */
38 #include "BKE_idprop.h"
39
40 #include "DNA_listBase.h"
41 #include "DNA_userdef_types.h"
42
43 #include "MEM_guardedalloc.h"
44
45 #include "CLG_log.h"
46
47 static CLG_LogRef LOG = {"bke.addon"};
48
49 /* -------------------------------------------------------------------- */
50 /** \name Add-on New/Free
51  * \{ */
52
53 bAddon *BKE_addon_new(void)
54 {
55         bAddon *addon = MEM_callocN(sizeof(bAddon), "bAddon");
56         return addon;
57 }
58
59 bAddon *BKE_addon_find(ListBase *addon_list, const char *module)
60 {
61         return BLI_findstring(addon_list, module, offsetof(bAddon, module));
62 }
63
64 bAddon *BKE_addon_ensure(ListBase *addon_list, const char *module)
65 {
66         bAddon *addon = BKE_addon_find(addon_list, module);
67         if (addon == NULL) {
68                 addon = BKE_addon_new();
69                 BLI_strncpy(addon->module, module, sizeof(addon->module));
70                 BLI_addtail(addon_list, addon);
71         }
72         return addon;
73 }
74
75 bool BKE_addon_remove_safe(ListBase *addon_list, const char *module)
76 {
77         bAddon *addon = BLI_findstring(addon_list, module, offsetof(bAddon, module));
78         if (addon) {
79                 BLI_remlink(addon_list, addon);
80                 BKE_addon_free(addon);
81                 return true;
82         }
83         return false;
84 }
85
86 void BKE_addon_free(bAddon *addon)
87 {
88         if (addon->prop) {
89                 IDP_FreeProperty(addon->prop);
90                 MEM_freeN(addon->prop);
91         }
92         MEM_freeN(addon);
93 }
94
95 /** \} */
96
97 /* -------------------------------------------------------------------- */
98 /** \name Add-on Preference API
99  * \{ */
100
101 static GHash *global_addonpreftype_hash = NULL;
102
103
104 bAddonPrefType *BKE_addon_pref_type_find(const char *idname, bool quiet)
105 {
106         if (idname[0]) {
107                 bAddonPrefType *apt;
108
109                 apt = BLI_ghash_lookup(global_addonpreftype_hash, idname);
110                 if (apt) {
111                         return apt;
112                 }
113
114                 if (!quiet) {
115                         CLOG_WARN(&LOG, "search for unknown addon-pref '%s'", idname);
116                 }
117         }
118         else {
119                 if (!quiet) {
120                         CLOG_WARN(&LOG, "search for empty addon-pref");
121                 }
122         }
123
124         return NULL;
125 }
126
127 void BKE_addon_pref_type_add(bAddonPrefType *apt)
128 {
129         BLI_ghash_insert(global_addonpreftype_hash, apt->idname, apt);
130 }
131
132 void BKE_addon_pref_type_remove(const bAddonPrefType *apt)
133 {
134         BLI_ghash_remove(global_addonpreftype_hash, apt->idname, NULL, MEM_freeN);
135 }
136
137 void BKE_addon_pref_type_init(void)
138 {
139         BLI_assert(global_addonpreftype_hash == NULL);
140         global_addonpreftype_hash = BLI_ghash_str_new(__func__);
141 }
142
143 void BKE_addon_pref_type_free(void)
144 {
145         BLI_ghash_free(global_addonpreftype_hash, NULL, MEM_freeN);
146         global_addonpreftype_hash = NULL;
147 }
148
149 /** \} */