Merge pull request #51928 from reduz/extension-loader
Implement Extension Loader
This commit is contained in:
commit
eb940ca2a0
11 changed files with 159 additions and 8 deletions
|
|
@ -35,6 +35,8 @@
|
|||
#include "core/object/method_bind.h"
|
||||
#include "core/os/os.h"
|
||||
|
||||
const char *NativeExtension::EXTENSION_LIST_CONFIG_FILE = "res://.godot/extension_list.cfg";
|
||||
|
||||
class NativeExtensionMethodBind : public MethodBind {
|
||||
GDNativeExtensionClassMethodCall call_func;
|
||||
GDNativeExtensionClassMethodPtrCall ptrcall_func;
|
||||
|
|
|
|||
|
|
@ -60,6 +60,8 @@ protected:
|
|||
static void _bind_methods();
|
||||
|
||||
public:
|
||||
static const char *EXTENSION_LIST_CONFIG_FILE;
|
||||
|
||||
Error open_library(const String &p_path, const String &p_entry_symbol);
|
||||
void close_library();
|
||||
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@
|
|||
/*************************************************************************/
|
||||
|
||||
#include "native_extension_manager.h"
|
||||
#include "core/io/file_access.h"
|
||||
|
||||
NativeExtensionManager::LoadStatus NativeExtensionManager::load_extension(const String &p_path) {
|
||||
if (native_extension_map.has(p_path)) {
|
||||
|
|
@ -76,6 +77,11 @@ NativeExtensionManager::LoadStatus NativeExtensionManager::unload_extension(cons
|
|||
native_extension_map.erase(p_path);
|
||||
return LOAD_STATUS_OK;
|
||||
}
|
||||
|
||||
bool NativeExtensionManager::is_extension_loaded(const String &p_path) const {
|
||||
return native_extension_map.has(p_path);
|
||||
}
|
||||
|
||||
Vector<String> NativeExtensionManager::get_loaded_extensions() const {
|
||||
Vector<String> ret;
|
||||
for (const Map<String, Ref<NativeExtension>>::Element *E = native_extension_map.front(); E; E = E->next()) {
|
||||
|
|
@ -105,6 +111,17 @@ void NativeExtensionManager::deinitialize_extensions(NativeExtension::Initializa
|
|||
level = int32_t(p_level) - 1;
|
||||
}
|
||||
|
||||
void NativeExtensionManager::load_extensions() {
|
||||
FileAccessRef f = FileAccess::open(NativeExtension::EXTENSION_LIST_CONFIG_FILE, FileAccess::READ);
|
||||
while (f && !f->eof_reached()) {
|
||||
String s = f->get_line().strip_edges();
|
||||
if (s != String()) {
|
||||
LoadStatus err = load_extension(s);
|
||||
ERR_CONTINUE_MSG(err == LOAD_STATUS_FAILED, "Error loading extension: " + s);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NativeExtensionManager *NativeExtensionManager::get_singleton() {
|
||||
return singleton;
|
||||
}
|
||||
|
|
@ -112,6 +129,8 @@ void NativeExtensionManager::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("load_extension", "path"), &NativeExtensionManager::load_extension);
|
||||
ClassDB::bind_method(D_METHOD("reload_extension", "path"), &NativeExtensionManager::reload_extension);
|
||||
ClassDB::bind_method(D_METHOD("unload_extension", "path"), &NativeExtensionManager::unload_extension);
|
||||
ClassDB::bind_method(D_METHOD("is_extension_loaded", "path"), &NativeExtensionManager::is_extension_loaded);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_loaded_extensions"), &NativeExtensionManager::get_loaded_extensions);
|
||||
ClassDB::bind_method(D_METHOD("get_extension", "path"), &NativeExtensionManager::get_extension);
|
||||
|
||||
|
|
|
|||
|
|
@ -55,6 +55,7 @@ public:
|
|||
LoadStatus load_extension(const String &p_path);
|
||||
LoadStatus reload_extension(const String &p_path);
|
||||
LoadStatus unload_extension(const String &p_path);
|
||||
bool is_extension_loaded(const String &p_path) const;
|
||||
Vector<String> get_loaded_extensions() const;
|
||||
Ref<NativeExtension> get_extension(const String &p_path);
|
||||
|
||||
|
|
@ -63,6 +64,8 @@ public:
|
|||
|
||||
static NativeExtensionManager *get_singleton();
|
||||
|
||||
void load_extensions();
|
||||
|
||||
NativeExtensionManager();
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -308,13 +308,7 @@ void register_core_singletons() {
|
|||
void register_core_extensions() {
|
||||
// Hardcoded for now.
|
||||
NativeExtension::initialize_native_extensions();
|
||||
if (ProjectSettings::get_singleton()->has_setting("native_extensions/paths")) {
|
||||
Vector<String> paths = ProjectSettings::get_singleton()->get("native_extensions/paths");
|
||||
for (int i = 0; i < paths.size(); i++) {
|
||||
NativeExtensionManager::LoadStatus status = native_extension_manager->load_extension(paths[i]);
|
||||
ERR_CONTINUE_MSG(status != NativeExtensionManager::LOAD_STATUS_OK, "Error loading extension: " + paths[i]);
|
||||
}
|
||||
}
|
||||
native_extension_manager->load_extensions();
|
||||
native_extension_manager->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_CORE);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue