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