summaryrefslogtreecommitdiff
path: root/src/init_gdnative.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/init_gdnative.cpp')
-rw-r--r--src/init_gdnative.cpp135
1 files changed, 135 insertions, 0 deletions
diff --git a/src/init_gdnative.cpp b/src/init_gdnative.cpp
new file mode 100644
index 0000000..77669af
--- /dev/null
+++ b/src/init_gdnative.cpp
@@ -0,0 +1,135 @@
+/*************************************************************************/
+/* init_gdnative.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* 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. */
+/*************************************************************************/
+
+#include "WebRTCLibDataChannel.hpp"
+#include "WebRTCLibPeerConnection.hpp"
+#include "net/WebRTCPeerConnectionNative.hpp"
+#include <gdnative_api_struct.gen.h>
+#include <net/godot_net.h>
+
+/* Singleton */
+static bool _singleton = false;
+static const godot_object *_singleton_lib = NULL;
+static const godot_gdnative_core_api_struct *_singleton_api = NULL;
+static godot_class_constructor _create_ns_cb = NULL;
+static godot_method_bind *_set_script_mb = NULL;
+static godot_method_bind *_set_class_name_mb = NULL;
+static godot_method_bind *_set_library_mb = NULL;
+
+void unregistered() {
+ _singleton = false; // We are no longer the active singleton
+}
+
+godot_error create_peer_connection_wp(godot_object *out) {
+ ERR_FAIL_COND_V(!_singleton, GODOT_FAILED);
+ // Create Script
+ godot_object *script = _create_ns_cb();
+ ERR_FAIL_COND_V(!script, GODOT_FAILED);
+
+ const void *args[] = { (void *)_singleton_lib };
+ _singleton_api->godot_method_bind_ptrcall(_set_library_mb, script, args, nullptr);
+
+ godot_string s;
+ _singleton_api->godot_string_new(&s);
+ _singleton_api->godot_string_parse_utf8(&s, "WebRTCLibPeerConnection");
+ const void *args2[] = { (void *)&s };
+ _singleton_api->godot_method_bind_ptrcall(_set_class_name_mb, script, args2, nullptr);
+ _singleton_api->godot_string_destroy(&s);
+
+ // Bind script to Object
+ const void *args3[] = { (void *)script };
+ _singleton_api->godot_method_bind_ptrcall(_set_script_mb, out, args3, nullptr);
+
+ return GODOT_OK;
+}
+
+godot_net_webrtc_library library = {
+ { 3, 2 },
+ &unregistered,
+ &create_peer_connection_wp,
+ NULL,
+};
+
+extern "C" void GDN_EXPORT godot_gdnative_singleton() {
+ if (godot::WebRTCPeerConnectionNative::_net_api) {
+ ERR_FAIL_COND(!godot::gdnlib);
+ _singleton_lib = godot::gdnlib;
+ ERR_FAIL_COND(!godot::api);
+ _singleton_api = godot::api;
+ _create_ns_cb = godot::api->godot_get_class_constructor("NativeScript");
+ ERR_FAIL_COND(!_create_ns_cb);
+ _set_script_mb = godot::api->godot_method_bind_get_method("Object", "set_script");
+ ERR_FAIL_COND(!_set_script_mb);
+ _set_class_name_mb = godot::api->godot_method_bind_get_method("NativeScript", "set_class_name");
+ ERR_FAIL_COND(!_set_class_name_mb);
+ _set_library_mb = godot::api->godot_method_bind_get_method("NativeScript", "set_library");
+ ERR_FAIL_COND(!_set_library_mb);
+ // If registration is successful _singleton will be set to true
+ _singleton = godot::WebRTCPeerConnectionNative::_net_api->godot_net_set_webrtc_library(&library) == GODOT_OK;
+ if (!_singleton)
+ ERR_PRINT("Failed initializing webrtc singleton library");
+ }
+}
+
+/* Godot export stuff */
+extern "C" void GDN_EXPORT godot_gdnative_init(godot_gdnative_init_options *o) {
+ const godot_gdnative_core_api_struct *api = o->api_struct;
+ for (int i = 0; i < api->num_extensions; i++) {
+ if (api->extensions[i]->type != GDNATIVE_EXT_NET)
+ continue;
+
+ const godot_gdnative_ext_net_api_struct *net_api = (godot_gdnative_ext_net_api_struct *)api->extensions[i];
+
+ if (!net_api->next)
+ break;
+
+ if (net_api->next->version.major == 3 && net_api->next->version.minor == 2) {
+ godot::WebRTCPeerConnectionNative::_net_api = (const godot_gdnative_ext_net_3_2_api_struct *)net_api->next;
+ }
+ }
+
+ godot_webrtc::WebRTCLibPeerConnection::initialize_signaling();
+ godot::Godot::gdnative_init(o);
+}
+
+extern "C" void GDN_EXPORT godot_gdnative_terminate(godot_gdnative_terminate_options *o) {
+ if (_singleton) { // If we are the active singleton, unregister
+ godot::WebRTCPeerConnectionNative::_net_api->godot_net_set_webrtc_library(NULL);
+ }
+ godot_webrtc::WebRTCLibPeerConnection::deinitialize_signaling();
+ godot::Godot::gdnative_terminate(o);
+}
+
+extern "C" void GDN_EXPORT godot_nativescript_init(void *handle) {
+ godot::Godot::nativescript_init(handle);
+
+ godot::register_class<godot_webrtc::WebRTCLibPeerConnection>();
+ godot::register_class<godot_webrtc::WebRTCLibDataChannel>();
+}