2021-06-04 19:39:38 +01:00
/**************************************************************************/
/* debug_adapter_server.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. */
/**************************************************************************/
# include "debug_adapter_server.h"
# include "editor/editor_log.h"
# include "editor/editor_node.h"
2025-06-10 16:47:26 +02:00
# include "editor/settings/editor_settings.h"
2021-06-04 19:39:38 +01:00
2024-05-24 16:53:47 +02:00
int DebugAdapterServer : : port_override = - 1 ;
2021-06-04 19:39:38 +01:00
DebugAdapterServer : : DebugAdapterServer ( ) {
2024-06-21 12:47:17 +02:00
// TODO: Move to editor_settings.cpp
2021-06-04 19:39:38 +01:00
_EDITOR_DEF ( " network/debug_adapter/remote_port " , remote_port ) ;
2021-07-20 12:24:56 +01:00
_EDITOR_DEF ( " network/debug_adapter/request_timeout " , protocol . _request_timeout ) ;
_EDITOR_DEF ( " network/debug_adapter/sync_breakpoints " , protocol . _sync_breakpoints ) ;
2021-06-04 19:39:38 +01:00
}
void DebugAdapterServer : : _notification ( int p_what ) {
switch ( p_what ) {
2022-02-16 00:52:32 +01:00
case NOTIFICATION_ENTER_TREE : {
2021-06-04 19:39:38 +01:00
start ( ) ;
2022-02-16 00:52:32 +01:00
} break ;
case NOTIFICATION_EXIT_TREE : {
2021-06-04 19:39:38 +01:00
stop ( ) ;
2022-02-16 00:52:32 +01:00
} break ;
2021-06-04 19:39:38 +01:00
case NOTIFICATION_INTERNAL_PROCESS : {
// The main loop can be run again during request processing, which modifies internal state of the protocol.
// Thus, "polling" is needed to prevent it from parsing other requests while the current one isn't finished.
2021-07-20 12:24:56 +01:00
if ( started & & ! polling ) {
2021-06-04 19:39:38 +01:00
polling = true ;
protocol . poll ( ) ;
polling = false ;
}
} break ;
2022-02-16 00:52:32 +01:00
2021-06-04 19:39:38 +01:00
case EditorSettings : : NOTIFICATION_EDITOR_SETTINGS_CHANGED : {
2022-11-23 00:14:08 +01:00
if ( ! EditorSettings : : get_singleton ( ) - > check_changed_settings_in_group ( " network/debug_adapter " ) ) {
break ;
}
2022-10-18 16:43:37 +02:00
protocol . _request_timeout = EDITOR_GET ( " network/debug_adapter/request_timeout " ) ;
protocol . _sync_breakpoints = EDITOR_GET ( " network/debug_adapter/sync_breakpoints " ) ;
2024-05-24 16:53:47 +02:00
int port = ( DebugAdapterServer : : port_override > - 1 ) ? DebugAdapterServer : : port_override : ( int ) _EDITOR_GET ( " network/debug_adapter/remote_port " ) ;
2022-09-29 12:53:28 +03:00
if ( port ! = remote_port ) {
stop ( ) ;
start ( ) ;
2021-06-04 19:39:38 +01:00
}
} break ;
}
}
void DebugAdapterServer : : start ( ) {
2024-05-24 16:53:47 +02:00
remote_port = ( DebugAdapterServer : : port_override > - 1 ) ? DebugAdapterServer : : port_override : ( int ) _EDITOR_GET ( " network/debug_adapter/remote_port " ) ;
2026-02-03 21:33:52 +01:00
const Error status = protocol . start ( remote_port , IPAddress ( " 127.0.0.1 " ) ) ;
if ( status ! = OK ) {
EditorNode : : get_log ( ) - > add_message ( " --- Failed to start Debug adapter server on port " + itos ( remote_port ) + " : " + error_names [ status ] + " --- " , EditorLog : : MSG_TYPE_EDITOR ) ;
return ;
2021-06-04 19:39:38 +01:00
}
2026-02-03 21:33:52 +01:00
EditorNode : : get_log ( ) - > add_message ( " --- Debug adapter server started on port " + itos ( remote_port ) + " --- " , EditorLog : : MSG_TYPE_EDITOR ) ;
set_process_internal ( true ) ;
started = true ;
2021-06-04 19:39:38 +01:00
}
void DebugAdapterServer : : stop ( ) {
protocol . stop ( ) ;
started = false ;
EditorNode : : get_log ( ) - > add_message ( " --- Debug adapter server stopped --- " , EditorLog : : MSG_TYPE_EDITOR ) ;
}