2023-01-05 13:25:55 +01:00
/**************************************************************************/
/* webrtc_peer_connection.cpp */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/**************************************************************************/
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
/* */
/* 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-11-20 10:54:15 +01:00
2019-05-11 01:46:27 +02:00
# include "webrtc_peer_connection.h"
2018-11-20 10:54:15 +01:00
2022-08-28 20:27:45 +02:00
# ifdef WEB_ENABLED
2021-09-08 01:00:47 +02:00
# include "webrtc_peer_connection_js.h"
# endif
2018-11-20 10:54:15 +01:00
2022-06-09 06:56:06 +02:00
# include "webrtc_peer_connection_extension.h"
2021-09-08 01:00:47 +02:00
StringName WebRTCPeerConnection : : default_extension ;
void WebRTCPeerConnection : : set_default_extension ( const StringName & p_extension ) {
2022-06-09 06:56:06 +02:00
ERR_FAIL_COND_MSG ( ! ClassDB : : is_parent_class ( p_extension , WebRTCPeerConnectionExtension : : get_class_static ( ) ) , vformat ( " Can't make %s the default WebRTC extension since it does not extend WebRTCPeerConnectionExtension. " , p_extension ) ) ;
2023-10-19 17:11:42 +02:00
default_extension = StringName ( p_extension , true ) ;
2018-11-20 10:54:15 +01:00
}
2024-04-22 16:34:44 +02:00
WebRTCPeerConnection * WebRTCPeerConnection : : create ( bool p_notify_postinitialize ) {
2022-08-28 20:27:45 +02:00
# ifdef WEB_ENABLED
2024-04-22 16:34:44 +02:00
return static_cast < WebRTCPeerConnection * > ( ClassDB : : creator < WebRTCPeerConnectionJS > ( p_notify_postinitialize ) ) ;
2021-09-08 01:00:47 +02:00
# else
2023-10-19 17:11:42 +02:00
if ( default_extension = = StringName ( ) ) {
2021-09-08 01:00:47 +02:00
WARN_PRINT_ONCE ( " No default WebRTC extension configured. " ) ;
2024-04-22 16:34:44 +02:00
return static_cast < WebRTCPeerConnection * > ( ClassDB : : creator < WebRTCPeerConnectionExtension > ( p_notify_postinitialize ) ) ;
}
Object * obj = nullptr ;
if ( p_notify_postinitialize ) {
obj = ClassDB : : instantiate ( default_extension ) ;
} else {
obj = ClassDB : : instantiate_without_postinitialization ( default_extension ) ;
2020-05-14 16:41:43 +02:00
}
2021-09-08 01:00:47 +02:00
return Object : : cast_to < WebRTCPeerConnectionExtension > ( obj ) ;
# endif
2018-11-20 10:54:15 +01:00
}
2019-05-11 01:46:27 +02:00
void WebRTCPeerConnection : : _bind_methods ( ) {
2022-06-09 06:56:06 +02:00
ClassDB : : bind_static_method ( get_class_static ( ) , D_METHOD ( " set_default_extension " , " extension_class " ) , & WebRTCPeerConnectionExtension : : set_default_extension ) ;
2019-05-11 01:46:27 +02:00
ClassDB : : bind_method ( D_METHOD ( " initialize " , " configuration " ) , & WebRTCPeerConnection : : initialize , DEFVAL ( Dictionary ( ) ) ) ;
ClassDB : : bind_method ( D_METHOD ( " create_data_channel " , " label " , " options " ) , & WebRTCPeerConnection : : create_data_channel , DEFVAL ( Dictionary ( ) ) ) ;
ClassDB : : bind_method ( D_METHOD ( " create_offer " ) , & WebRTCPeerConnection : : create_offer ) ;
ClassDB : : bind_method ( D_METHOD ( " set_local_description " , " type " , " sdp " ) , & WebRTCPeerConnection : : set_local_description ) ;
ClassDB : : bind_method ( D_METHOD ( " set_remote_description " , " type " , " sdp " ) , & WebRTCPeerConnection : : set_remote_description ) ;
ClassDB : : bind_method ( D_METHOD ( " add_ice_candidate " , " media " , " index " , " name " ) , & WebRTCPeerConnection : : add_ice_candidate ) ;
ClassDB : : bind_method ( D_METHOD ( " poll " ) , & WebRTCPeerConnection : : poll ) ;
ClassDB : : bind_method ( D_METHOD ( " close " ) , & WebRTCPeerConnection : : close ) ;
2018-11-20 10:54:15 +01:00
2019-05-11 01:46:27 +02:00
ClassDB : : bind_method ( D_METHOD ( " get_connection_state " ) , & WebRTCPeerConnection : : get_connection_state ) ;
2022-09-08 04:39:32 +02:00
ClassDB : : bind_method ( D_METHOD ( " get_gathering_state " ) , & WebRTCPeerConnection : : get_gathering_state ) ;
ClassDB : : bind_method ( D_METHOD ( " get_signaling_state " ) , & WebRTCPeerConnection : : get_signaling_state ) ;
2018-11-20 10:54:15 +01:00
2019-05-11 01:46:27 +02:00
ADD_SIGNAL ( MethodInfo ( " session_description_created " , PropertyInfo ( Variant : : STRING , " type " ) , PropertyInfo ( Variant : : STRING , " sdp " ) ) ) ;
ADD_SIGNAL ( MethodInfo ( " ice_candidate_created " , PropertyInfo ( Variant : : STRING , " media " ) , PropertyInfo ( Variant : : INT , " index " ) , PropertyInfo ( Variant : : STRING , " name " ) ) ) ;
2022-01-28 15:35:25 +01:00
ADD_SIGNAL ( MethodInfo ( " data_channel_received " , PropertyInfo ( Variant : : OBJECT , " channel " , PROPERTY_HINT_RESOURCE_TYPE , " WebRTCDataChannel " ) ) ) ;
2018-11-20 10:54:15 +01:00
BIND_ENUM_CONSTANT ( STATE_NEW ) ;
BIND_ENUM_CONSTANT ( STATE_CONNECTING ) ;
BIND_ENUM_CONSTANT ( STATE_CONNECTED ) ;
BIND_ENUM_CONSTANT ( STATE_DISCONNECTED ) ;
BIND_ENUM_CONSTANT ( STATE_FAILED ) ;
BIND_ENUM_CONSTANT ( STATE_CLOSED ) ;
2022-09-08 04:39:32 +02:00
BIND_ENUM_CONSTANT ( GATHERING_STATE_NEW ) ;
BIND_ENUM_CONSTANT ( GATHERING_STATE_GATHERING ) ;
BIND_ENUM_CONSTANT ( GATHERING_STATE_COMPLETE ) ;
BIND_ENUM_CONSTANT ( SIGNALING_STATE_STABLE ) ;
BIND_ENUM_CONSTANT ( SIGNALING_STATE_HAVE_LOCAL_OFFER ) ;
BIND_ENUM_CONSTANT ( SIGNALING_STATE_HAVE_REMOTE_OFFER ) ;
BIND_ENUM_CONSTANT ( SIGNALING_STATE_HAVE_LOCAL_PRANSWER ) ;
BIND_ENUM_CONSTANT ( SIGNALING_STATE_HAVE_REMOTE_PRANSWER ) ;
BIND_ENUM_CONSTANT ( SIGNALING_STATE_CLOSED ) ;
2018-11-20 10:54:15 +01:00
}
2019-05-11 01:46:27 +02:00
WebRTCPeerConnection : : WebRTCPeerConnection ( ) {
2018-11-20 10:54:15 +01:00
}
2019-05-11 01:46:27 +02:00
WebRTCPeerConnection : : ~ WebRTCPeerConnection ( ) {
2018-11-20 10:54:15 +01:00
}