@@ -210,8 +210,55 @@ void ResourceSaver::_bind_methods() {
210
210
BIND_BITFIELD_FLAG (FLAG_REPLACE_SUBRESOURCE_PATHS);
211
211
}
212
212
213
+ // //// LOGGER ///////
214
+
215
+ void Logger::_bind_methods () {
216
+ GDVIRTUAL_BIND (_log_error, " function" , " file" , " line" , " code" , " rationale" , " editor_notify" , " error_type" , " script_backtrace" );
217
+ GDVIRTUAL_BIND (_log_message, " message" , " error" );
218
+ BIND_ENUM_CONSTANT (ERROR_TYPE_ERROR);
219
+ BIND_ENUM_CONSTANT (ERROR_TYPE_WARNING);
220
+ BIND_ENUM_CONSTANT (ERROR_TYPE_SCRIPT);
221
+ BIND_ENUM_CONSTANT (ERROR_TYPE_SHADER);
222
+ }
223
+
224
+ void Logger::log_error (const char *p_function, const char *p_file, int p_line, const char *p_code, const char *p_rationale, bool p_editor_notify, ErrorType p_type, const char *p_script_backtrace) {
225
+ GDVIRTUAL_CALL (_log_error, p_function, p_file, p_line, p_code, p_rationale, p_editor_notify, p_type, p_script_backtrace);
226
+ }
227
+
228
+ void Logger::log_message (const String &p_text, bool p_error) {
229
+ GDVIRTUAL_CALL (_log_message, p_text, p_error);
230
+ }
231
+
213
232
// //// OS //////
214
233
234
+ void OS::LoggerBind::logv (const char *p_format, va_list p_list, bool p_err) {
235
+ if (!should_log (p_err)) {
236
+ return ;
237
+ }
238
+
239
+ const int static_buf_size = 1024 ;
240
+ char static_buf[static_buf_size];
241
+ char *buf = static_buf;
242
+ va_list list_copy;
243
+ va_copy (list_copy, p_list);
244
+ int len = vsnprintf (buf, static_buf_size, p_format, p_list);
245
+ if (len >= static_buf_size) {
246
+ buf = (char *)Memory::alloc_static (len + 1 );
247
+ vsnprintf (buf, len + 1 , p_format, list_copy);
248
+ }
249
+ va_end (list_copy);
250
+
251
+ String str;
252
+ str.parse_utf8 (buf, len);
253
+ for (uint32_t i = 0 ; i < loggers.size (); i++) {
254
+ loggers[i]->log_message (str, p_err);
255
+ }
256
+
257
+ if (len >= static_buf_size) {
258
+ Memory::free_static (buf);
259
+ }
260
+ }
261
+
215
262
PackedByteArray OS::get_entropy (int p_bytes) {
216
263
PackedByteArray pba;
217
264
pba.resize (p_bytes);
@@ -628,6 +675,22 @@ String OS::get_unique_id() const {
628
675
return ::OS::get_singleton ()->get_unique_id ();
629
676
}
630
677
678
+ void OS::add_logger (Ref<Logger> p_logger) {
679
+ ERR_FAIL_COND (p_logger.is_null ());
680
+ if (!logger_bind) {
681
+ logger_bind = memnew (LoggerBind);
682
+ ::OS::get_singleton ()->add_logger(logger_bind);
683
+ }
684
+
685
+ ERR_FAIL_COND (logger_bind->loggers .find (p_logger) != -1 );
686
+ logger_bind->loggers .push_back (p_logger);
687
+ }
688
+
689
+ void OS::remove_logger (Ref<Logger> p_logger) {
690
+ ERR_FAIL_COND (p_logger.is_null ());
691
+ logger_bind->loggers .erase (p_logger);
692
+ }
693
+
631
694
OS *OS::singleton = nullptr ;
632
695
633
696
void OS::_bind_methods () {
@@ -734,6 +797,9 @@ void OS::_bind_methods() {
734
797
ClassDB::bind_method (D_METHOD (" get_granted_permissions" ), &OS::get_granted_permissions);
735
798
ClassDB::bind_method (D_METHOD (" revoke_granted_permissions" ), &OS::revoke_granted_permissions);
736
799
800
+ ClassDB::bind_method (D_METHOD (" add_logger" , " logger" ), &OS::add_logger);
801
+ ClassDB::bind_method (D_METHOD (" remove_logger" , " logger" ), &OS::remove_logger);
802
+
737
803
ADD_PROPERTY (PropertyInfo (Variant::BOOL, " low_processor_usage_mode" ), " set_low_processor_usage_mode" , " is_in_low_processor_usage_mode" );
738
804
ADD_PROPERTY (PropertyInfo (Variant::INT, " low_processor_usage_mode_sleep_usec" ), " set_low_processor_usage_mode_sleep_usec" , " get_low_processor_usage_mode_sleep_usec" );
739
805
ADD_PROPERTY (PropertyInfo (Variant::BOOL, " delta_smoothing" ), " set_delta_smoothing" , " is_delta_smoothing_enabled" );
@@ -764,6 +830,16 @@ void OS::_bind_methods() {
764
830
BIND_ENUM_CONSTANT (STD_HANDLE_UNKNOWN);
765
831
}
766
832
833
+ OS::OS () {
834
+ singleton = this ;
835
+ }
836
+
837
+ OS::~OS () {
838
+ if (logger_bind) {
839
+ logger_bind->clear ();
840
+ }
841
+ }
842
+
767
843
// //// Geometry2D //////
768
844
769
845
Geometry2D *Geometry2D::singleton = nullptr ;
0 commit comments