| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2017-04-09 21:07:53 +02:00
										 |  |  | /*  gdnative.h                                                           */ | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*                       This file is part of:                           */ | 
					
						
							|  |  |  | /*                           GODOT ENGINE                                */ | 
					
						
							| 
									
										
										
										
											2017-08-27 14:16:55 +02:00
										 |  |  | /*                      https://godotengine.org                          */ | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2018-01-01 14:40:08 +01:00
										 |  |  | /* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.                 */ | 
					
						
							|  |  |  | /* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)    */ | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* Permission is hereby granted, free of charge, to any person obtaining */ | 
					
						
							|  |  |  | /* a copy of this software and associated documentation files (the       */ | 
					
						
							|  |  |  | /* "Software"), to deal in the Software without restriction, including   */ | 
					
						
							|  |  |  | /* without limitation the rights to use, copy, modify, merge, publish,   */ | 
					
						
							|  |  |  | /* distribute, sublicense, and/or sell copies of the Software, and to    */ | 
					
						
							|  |  |  | /* permit persons to whom the Software is furnished to do so, subject to */ | 
					
						
							|  |  |  | /* the following conditions:                                             */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* The above copyright notice and this permission notice shall be        */ | 
					
						
							|  |  |  | /* included in all copies or substantial portions of the Software.       */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */ | 
					
						
							|  |  |  | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */ | 
					
						
							|  |  |  | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ | 
					
						
							|  |  |  | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */ | 
					
						
							|  |  |  | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */ | 
					
						
							|  |  |  | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */ | 
					
						
							|  |  |  | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2018-01-05 00:50:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-09 21:07:53 +02:00
										 |  |  | #ifndef GDNATIVE_H
 | 
					
						
							|  |  |  | #define GDNATIVE_H
 | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "io/resource_loader.h"
 | 
					
						
							|  |  |  | #include "io/resource_saver.h"
 | 
					
						
							|  |  |  | #include "os/thread_safe.h"
 | 
					
						
							|  |  |  | #include "resource.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-03 12:40:41 +02:00
										 |  |  | #include "gdnative/gdnative.h"
 | 
					
						
							| 
									
										
										
										
											2017-10-03 05:23:05 +02:00
										 |  |  | #include "gdnative_api_struct.gen.h"
 | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-02 17:14:37 +01:00
										 |  |  | #include "io/config_file.h"
 | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-02 17:14:37 +01:00
										 |  |  | class GDNativeLibraryResourceLoader; | 
					
						
							|  |  |  | class GDNative; | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-02 17:14:37 +01:00
										 |  |  | class GDNativeLibrary : public Resource { | 
					
						
							|  |  |  | 	GDCLASS(GDNativeLibrary, Resource) | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-02 17:14:37 +01:00
										 |  |  | 	static Map<String, Vector<Ref<GDNative> > > *loaded_libraries; | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-02 17:14:37 +01:00
										 |  |  | 	friend class GDNativeLibraryResourceLoader; | 
					
						
							|  |  |  | 	friend class GDNative; | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-02 17:14:37 +01:00
										 |  |  | 	Ref<ConfigFile> config_file; | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-02 17:14:37 +01:00
										 |  |  | 	String current_library_path; | 
					
						
							|  |  |  | 	Vector<String> current_dependencies; | 
					
						
							| 
									
										
										
										
											2017-09-03 14:50:33 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-02 17:14:37 +01:00
										 |  |  | 	bool singleton; | 
					
						
							|  |  |  | 	bool load_once; | 
					
						
							|  |  |  | 	String symbol_prefix; | 
					
						
							| 
									
										
										
										
											2018-01-06 12:31:30 +01:00
										 |  |  | 	bool reloadable; | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2017-04-09 21:07:53 +02:00
										 |  |  | 	GDNativeLibrary(); | 
					
						
							|  |  |  | 	~GDNativeLibrary(); | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-02 17:14:37 +01:00
										 |  |  | 	_FORCE_INLINE_ Ref<ConfigFile> get_config_file() { return config_file; } | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 20:53:30 +01:00
										 |  |  | 	void set_config_file(Ref<ConfigFile> p_config_file); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-02 17:14:37 +01:00
										 |  |  | 	// things that change per-platform
 | 
					
						
							|  |  |  | 	// so there are no setters for this
 | 
					
						
							|  |  |  | 	_FORCE_INLINE_ String get_current_library_path() const { | 
					
						
							|  |  |  | 		return current_library_path; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	_FORCE_INLINE_ Vector<String> get_current_dependencies() const { | 
					
						
							|  |  |  | 		return current_dependencies; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-02 17:14:37 +01:00
										 |  |  | 	// things that are a property of the library itself, not platform specific
 | 
					
						
							|  |  |  | 	_FORCE_INLINE_ bool should_load_once() const { | 
					
						
							|  |  |  | 		return load_once; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	_FORCE_INLINE_ bool is_singleton() const { | 
					
						
							|  |  |  | 		return singleton; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	_FORCE_INLINE_ String get_symbol_prefix() const { | 
					
						
							|  |  |  | 		return symbol_prefix; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-09-03 14:50:33 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-06 12:31:30 +01:00
										 |  |  | 	_FORCE_INLINE_ bool is_reloadable() const { | 
					
						
							|  |  |  | 		return reloadable; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-02 17:14:37 +01:00
										 |  |  | 	_FORCE_INLINE_ void set_load_once(bool p_load_once) { | 
					
						
							|  |  |  | 		load_once = p_load_once; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	_FORCE_INLINE_ void set_singleton(bool p_singleton) { | 
					
						
							|  |  |  | 		singleton = p_singleton; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	_FORCE_INLINE_ void set_symbol_prefix(String p_symbol_prefix) { | 
					
						
							|  |  |  | 		symbol_prefix = p_symbol_prefix; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-06 12:31:30 +01:00
										 |  |  | 	_FORCE_INLINE_ void set_reloadable(bool p_reloadable) { | 
					
						
							|  |  |  | 		reloadable = p_reloadable; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-02 17:14:37 +01:00
										 |  |  | 	static void _bind_methods(); | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-14 01:44:14 +02:00
										 |  |  | struct GDNativeCallRegistry { | 
					
						
							|  |  |  | 	static GDNativeCallRegistry *singleton; | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-20 14:49:22 +01:00
										 |  |  | 	inline static GDNativeCallRegistry *get_singleton() { | 
					
						
							| 
									
										
										
										
											2017-07-14 01:44:14 +02:00
										 |  |  | 		return singleton; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-06 21:36:34 +01:00
										 |  |  | 	inline GDNativeCallRegistry() : | 
					
						
							|  |  |  | 			native_calls() {} | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-14 01:44:14 +02:00
										 |  |  | 	Map<StringName, native_call_cb> native_calls; | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-14 01:44:14 +02:00
										 |  |  | 	void register_native_call_type(StringName p_call_type, native_call_cb p_callback); | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-14 01:44:14 +02:00
										 |  |  | 	Vector<StringName> get_native_call_types(); | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-14 01:44:14 +02:00
										 |  |  | class GDNative : public Reference { | 
					
						
							|  |  |  | 	GDCLASS(GDNative, Reference) | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-14 01:44:14 +02:00
										 |  |  | 	Ref<GDNativeLibrary> library; | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-14 01:44:14 +02:00
										 |  |  | 	void *native_handle; | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-02 17:14:37 +01:00
										 |  |  | 	bool initialized; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2017-07-14 01:44:14 +02:00
										 |  |  | 	GDNative(); | 
					
						
							|  |  |  | 	~GDNative(); | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-14 01:44:14 +02:00
										 |  |  | 	static void _bind_methods(); | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-14 01:44:14 +02:00
										 |  |  | 	void set_library(Ref<GDNativeLibrary> p_library); | 
					
						
							|  |  |  | 	Ref<GDNativeLibrary> get_library(); | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-14 01:44:14 +02:00
										 |  |  | 	bool is_initialized(); | 
					
						
							| 
									
										
										
										
											2017-04-08 01:28:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-14 01:44:14 +02:00
										 |  |  | 	bool initialize(); | 
					
						
							|  |  |  | 	bool terminate(); | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-12 12:52:50 -04:00
										 |  |  | 	Variant call_native(StringName p_native_call_type, StringName p_procedure_name, Array p_arguments = Array()); | 
					
						
							| 
									
										
										
										
											2017-10-14 15:42:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-02 22:01:43 +07:00
										 |  |  | 	Error get_symbol(StringName p_procedure_name, void *&r_handle, bool p_optional = true); | 
					
						
							| 
									
										
										
										
											2017-04-03 16:11:38 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-02 17:14:37 +01:00
										 |  |  | class GDNativeLibraryResourceLoader : public ResourceFormatLoader { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	virtual RES load(const String &p_path, const String &p_original_path, Error *r_error); | 
					
						
							|  |  |  | 	virtual void get_recognized_extensions(List<String> *p_extensions) const; | 
					
						
							|  |  |  | 	virtual bool handles_type(const String &p_type) const; | 
					
						
							|  |  |  | 	virtual String get_resource_type(const String &p_path) const; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class GDNativeLibraryResourceSaver : public ResourceFormatSaver { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	virtual Error save(const String &p_path, const RES &p_resource, uint32_t p_flags); | 
					
						
							|  |  |  | 	virtual bool recognize(const RES &p_resource) const; | 
					
						
							|  |  |  | 	virtual void get_recognized_extensions(const RES &p_resource, List<String> *p_extensions) const; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-09 21:07:53 +02:00
										 |  |  | #endif // GDNATIVE_H
 |