static int dt_imageio_load_modules_storage(dt_imageio_t *iio) { iio->plugins_storage = NULL; dt_imageio_module_storage_t *module; char plugindir[PATH_MAX] = { 0 }, plugin_name[256]; const gchar *d_name; dt_loc_get_plugindir(plugindir, sizeof(plugindir)); g_strlcat(plugindir, "/plugins/imageio/storage", sizeof(plugindir)); GDir *dir = g_dir_open(plugindir, 0, NULL); if(!dir) return 1; const int name_offset = strlen(SHARED_MODULE_PREFIX), name_end = strlen(SHARED_MODULE_PREFIX) + strlen(SHARED_MODULE_SUFFIX); while((d_name = g_dir_read_name(dir))) { // get lib*.so if(!g_str_has_prefix(d_name, SHARED_MODULE_PREFIX)) continue; if(!g_str_has_suffix(d_name, SHARED_MODULE_SUFFIX)) continue; strncpy(plugin_name, d_name + name_offset, strlen(d_name) - name_end); plugin_name[strlen(d_name) - name_end] = '\0'; module = (dt_imageio_module_storage_t *)malloc(sizeof(dt_imageio_module_storage_t)); gchar *libname = g_module_build_path(plugindir, (const gchar *)plugin_name); if(dt_imageio_load_module_storage(module, libname, plugin_name)) { free(module); continue; } module->gui_data = NULL; module->gui_init(module); if(module->widget) g_object_ref(module->widget); g_free(libname); dt_imageio_insert_storage(module); } g_dir_close(dir); return 0; }
static int register_storage(lua_State *L) { lua_settop(L,5); lua_getfield(L,LUA_REGISTRYINDEX,"dt_lua_storages"); lua_newtable(L); dt_imageio_module_storage_t * storage = malloc(sizeof(dt_imageio_module_storage_t)); memcpy(storage,&ref_storage,sizeof(dt_imageio_module_storage_t)); const char * plugin_name = luaL_checkstring(L,1); lua_pushvalue(L,1); lua_setfield(L,-2,"plugin_name"); strncpy(storage->plugin_name,plugin_name,127); luaL_checkstring(L,2); lua_pushvalue(L,2); lua_setfield(L,-2,"name"); if(!lua_isnoneornil(L,3)) { luaL_checktype(L,3,LUA_TFUNCTION); lua_pushvalue(L,3); lua_setfield(L,-2,"store"); } if(lua_isnil(L,4) ) { storage->finalize_store = NULL; } else { luaL_checktype(L,4,LUA_TFUNCTION); lua_pushvalue(L,4); lua_setfield(L,-2,"finalize_store"); } if(!lua_isnoneornil(L,5)) { luaL_checktype(L,5,LUA_TFUNCTION); lua_pushvalue(L,5); lua_setfield(L,-2,"supported"); } lua_setfield(L,-2,plugin_name); char tmp[1024]; snprintf(tmp,1024,"dt_imageio_module_data_pseudo_%s",storage->plugin_name); luaA_Type type_id = luaA_type_add(tmp,storage->params_size(storage)); storage->parameter_lua_type = dt_lua_init_type_typeid(darktable.lua_state,type_id); luaA_struct_typeid(darktable.lua_state,type_id); //dt_lua_register_type_callback_default_typeid(L,tmp,extra_data_index,extra_data_newindex,extra_data_next); //dt_lua_register_type_callback_number_typeid(L,tmp,extra_data_index,extra_data_newindex,extra_data_length); dt_lua_register_storage_typeid(darktable.lua_state,storage,type_id); dt_imageio_insert_storage(storage); return 0; }
static int register_storage(lua_State *L) { lua_settop(L, 7); lua_getfield(L, LUA_REGISTRYINDEX, "dt_lua_storages"); lua_newtable(L); dt_imageio_module_storage_t *storage = malloc(sizeof(dt_imageio_module_storage_t)); memcpy(storage, &ref_storage, sizeof(dt_imageio_module_storage_t)); storage->gui_data = malloc(sizeof(lua_storage_gui_t)); lua_storage_gui_t *data = storage->gui_data; const char *plugin_name = luaL_checkstring(L, 1); lua_pushvalue(L, 1); lua_setfield(L, -2, "plugin_name"); g_strlcpy(storage->plugin_name, plugin_name, sizeof(storage->plugin_name)); const char *name = luaL_checkstring(L, 2); lua_pushvalue(L, 2); lua_setfield(L, -2, "name"); data->name = strdup(name); data->supported_formats = NULL; data->widget = NULL; if(!lua_isnoneornil(L, 3)) { luaL_checktype(L, 3, LUA_TFUNCTION); lua_pushvalue(L, 3); lua_setfield(L, -2, "store"); } if(lua_isnil(L, 4)) { storage->finalize_store = NULL; } else { luaL_checktype(L, 4, LUA_TFUNCTION); lua_pushvalue(L, 4); lua_setfield(L, -2, "finalize_store"); } if(!lua_isnoneornil(L, 5)) { luaL_checktype(L, 5, LUA_TFUNCTION); lua_pushvalue(L, 5); lua_setfield(L, -2, "supported"); } if(lua_isnil(L, 6)) { storage->initialize_store = NULL; } else { luaL_checktype(L, 6, LUA_TFUNCTION); lua_pushvalue(L, 6); lua_setfield(L, -2, "initialize_store"); } if(lua_isnil(L, 7)) { storage->gui_init = empty_wrapper; storage->gui_reset = empty_wrapper; storage->gui_cleanup = empty_wrapper; } else { lua_widget widget; luaA_to(L,lua_widget,&widget,7); dt_lua_widget_bind(L,widget); data->widget = widget; } lua_setfield(L, -2, plugin_name); char tmp[1024]; snprintf(tmp, sizeof(tmp), "dt_imageio_module_data_pseudo_%s", storage->plugin_name); luaA_Type type_id = luaA_type_add(L, tmp, storage->params_size(storage)); storage->parameter_lua_type = dt_lua_init_type_type(darktable.lua_state.state, type_id); luaA_struct_type(darktable.lua_state.state, type_id); dt_lua_register_storage_type(darktable.lua_state.state, storage, type_id); GList *it = darktable.imageio->plugins_format; if(!lua_isnoneornil(L, 5)) { while(it) { lua_pushvalue(L, 5); dt_imageio_module_format_t *format = (dt_imageio_module_format_t *)it->data; dt_imageio_module_data_t *sdata = storage->get_params(storage); dt_imageio_module_data_t *fdata = format->get_params(format); luaA_push_type(L, storage->parameter_lua_type, sdata); luaA_push_type(L, format->parameter_lua_type, fdata); format->free_params(format, fdata); storage->free_params(storage, sdata); dt_lua_treated_pcall(L,2,1); int result = lua_toboolean(L, -1); lua_pop(L, 1); if(result) { data->supported_formats = g_list_prepend(data->supported_formats, format); } it = g_list_next(it); } } else { // all formats are supported while(it) { dt_imageio_module_format_t *format = (dt_imageio_module_format_t *)it->data; data->supported_formats = g_list_prepend(data->supported_formats, format); it = g_list_next(it); } } storage->gui_init(storage); if(storage->widget) g_object_ref(storage->widget); dt_imageio_insert_storage(storage); return 0; }