1 #include <Elementary.h>
4 /* what are moodules in elementary for? for modularising behavior and features
5 * so they can be plugged in and out where you dont want the core source to
6 * always behave like that or do it that way. plug it at runtime!
8 * they have module names (in config) and "slots" to plug that module into
9 * to server a purpose. eg you plug plugin "xx" into the "entry-copy-paste"
10 * slot so it would provide replacement copy & paste ui functionality and
13 * config is something like:
15 * export ELM_MODULES="xx>slot1:yy>slot2"
17 * where a module named xx is plugged into slot1 & yy is plugged into slot2
21 * export ELM_MODULES="my_module>entry/api"
23 * this loads the module called "my_module" into the slot "entry/api" which
24 * is an api slot for entry modules to modify behavior and hook to
25 * creation/deletion of the entry as well as replace the longpress behavior.
29 # include "elementary_config.h"
32 static Eina_Hash *modules = NULL;
33 static Eina_Hash *modules_as = NULL;
36 _elm_module_init(void)
38 modules = eina_hash_string_small_new(NULL);
39 modules_as = eina_hash_string_small_new(NULL);
43 _elm_module_shutdown(void)
52 it = eina_hash_iterator_data_new(modules);
54 EINA_ITERATOR_FOREACH(it, m) tl = eina_list_append(tl, m);
55 eina_iterator_free(it);
57 EINA_LIST_FREE(tl, m) _elm_module_del(m);
59 eina_hash_free(modules);
63 if (modules_as) eina_hash_free(modules_as);
68 _elm_module_parse(const char *s)
76 if ((*pe == ':') || (!*pe))
77 { // p -> pe == 'name:'
80 char *n = malloc(pe - p + 1);
85 strncpy(n, p, pe - p);
92 _elm_module_add(n, nn);
107 _elm_module_find_as(const char *as)
111 m = eina_hash_find(modules_as, as);
114 if (!_elm_module_load(m))
123 _elm_module_load(Elm_Module *m)
128 if (m->module) return EINA_TRUE;
130 home = getenv("HOME");
133 snprintf(buf, sizeof(buf), "%s/"ELEMENTARY_BASE_DIR"/modules/%s/%s/module" EFL_SHARED_EXTENSION, home, m->name, MODULE_ARCH);
134 m->module = eina_module_new(buf);
135 if (m->module && eina_module_load (m->module) == EINA_TRUE)
137 m->init_func = eina_module_symbol_get(m->module, "elm_modapi_init");
140 m->shutdown_func = eina_module_symbol_get(m->module, "elm_modapi_shutdown");
141 m->so_path = eina_stringshare_add(buf);
142 snprintf(buf, sizeof(buf), "%s/"ELEMENTARY_BASE_DIR"/modules/%s/%s", home, m->name, MODULE_ARCH);
143 m->bin_dir = eina_stringshare_add(buf);
144 snprintf(buf, sizeof(buf), "%s/"ELEMENTARY_BASE_DIR"/modules/%s", home, m->name);
145 m->data_dir = eina_stringshare_add(buf);
151 eina_module_unload(m->module);
152 eina_module_free(m->module);
160 eina_module_free(m->module);
167 snprintf(buf, sizeof(buf), "%s/elementary/modules/%s/%s/module" EFL_SHARED_EXTENSION, _elm_lib_dir, m->name, MODULE_ARCH);
168 m->module = eina_module_new(buf);
169 if (m->module && eina_module_load (m->module) == EINA_TRUE)
171 m->init_func = eina_module_symbol_get(m->module, "elm_modapi_init");
174 m->shutdown_func = eina_module_symbol_get(m->module, "elm_modapi_shutdown");
175 m->so_path = eina_stringshare_add(buf);
176 snprintf(buf, sizeof(buf), "%s/elementary/modules/%s/%s", _elm_lib_dir, m->name, MODULE_ARCH);
177 m->bin_dir = eina_stringshare_add(buf);
178 snprintf(buf, sizeof(buf), "%s/elementary/modules/%s", _elm_lib_dir, m->name);
179 m->data_dir = eina_stringshare_add(buf);
185 eina_module_unload(m->module);
186 eina_module_free(m->module);
195 eina_module_free(m->module);
199 if (!m->module) return EINA_FALSE;
204 _elm_module_unload(Elm_Module *m)
206 eina_stringshare_del(m->so_path);
207 eina_stringshare_del(m->data_dir);
208 eina_stringshare_del(m->bin_dir);
216 if (m->shutdown_func) m->shutdown_func(m);
217 eina_module_unload(m->module);
218 eina_module_free(m->module);
221 m->shutdown_func = NULL;
226 _elm_module_add(const char *name, const char *as)
230 if (name[0] == '/') return NULL;
232 m = eina_hash_find(modules, name);
238 m = calloc(1, sizeof(Elm_Module));
241 m->name = eina_stringshare_add(name);
243 eina_hash_direct_add(modules, m->name, m);
244 m->as = eina_stringshare_add(as);
245 eina_hash_direct_add(modules_as, m->as, m);
250 _elm_module_del(Elm_Module *m)
253 if (m->references > 0) return;
254 _elm_module_unload(m);
255 eina_hash_del(modules, m->name, m);
256 eina_hash_del(modules_as, m->as, m);
257 eina_stringshare_del(m->name);
258 eina_stringshare_del(m->as);
263 _elm_module_symbol_get(Elm_Module *m, const char *name)
265 return eina_module_symbol_get(m->module, name);