summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Makefile11
-rw-r--r--lib/common_test/doc/src/notes.xml15
-rw-r--r--lib/common_test/doc/src/run_test_chapter.xml42
-rw-r--r--lib/common_test/src/ct_property_test.erl67
-rw-r--r--lib/compiler/doc/src/notes.xml33
-rw-r--r--lib/compiler/src/beam_a.erl7
-rw-r--r--lib/compiler/src/beam_ssa_recv.erl79
-rw-r--r--lib/compiler/src/beam_validator.erl162
-rw-r--r--lib/compiler/src/compile.erl16
-rw-r--r--lib/compiler/src/v3_kernel.erl109
-rw-r--r--lib/compiler/test/beam_validator_SUITE.erl17
-rw-r--r--lib/compiler/test/beam_validator_SUITE_data/receive_marker.S116
-rw-r--r--lib/compiler/test/core_SUITE_data/fun_letrec_effect.core2
-rw-r--r--lib/compiler/test/guard_SUITE.erl22
-rw-r--r--lib/compiler/test/misc_SUITE.erl33
-rw-r--r--lib/compiler/test/receive_SUITE.erl79
-rw-r--r--lib/compiler/test/receive_SUITE_data/ref_opt/no_6.erl26
-rw-r--r--lib/compiler/test/receive_SUITE_data/ref_opt/yes_15.erl19
-rw-r--r--lib/compiler/test/receive_SUITE_data/ref_opt/yes_16.erl17
-rw-r--r--lib/compiler/test/record_SUITE.erl49
-rw-r--r--lib/compiler/vsn.mk2
-rw-r--r--lib/crypto/c_src/aead.c21
-rw-r--r--lib/crypto/c_src/cipher.c12
-rw-r--r--lib/crypto/doc/src/notes.xml58
-rw-r--r--lib/crypto/test/Makefile2
-rw-r--r--lib/crypto/test/crypto_SUITE.erl317
-rw-r--r--lib/crypto/test/crypto_property_test_SUITE.erl50
-rw-r--r--lib/crypto/test/property_test/crypto_ng_api.erl134
-rw-r--r--lib/crypto/test/property_test/crypto_prop_generators.erl93
-rw-r--r--lib/crypto/test/property_test/crypto_prop_generators.hrl36
-rw-r--r--lib/crypto/vsn.mk2
-rw-r--r--lib/debugger/src/dbg_wx_mon_win.erl3
-rw-r--r--lib/debugger/src/dbg_wx_trace.erl6
-rw-r--r--lib/debugger/src/dbg_wx_trace_win.erl8
-rw-r--r--lib/debugger/test/debugger_SUITE.erl2
-rw-r--r--lib/dialyzer/src/dialyzer_contracts.erl36
-rw-r--r--lib/dialyzer/test/behaviour_SUITE_data/src/proper/compile_flags.hrl2
-rw-r--r--lib/dialyzer/test/behaviour_SUITE_data/src/proper/proper_common.hrl55
-rw-r--r--lib/dialyzer/test/behaviour_SUITE_data/src/proper/proper_gen.erl611
-rw-r--r--lib/dialyzer/test/behaviour_SUITE_data/src/proper/proper_internal.hrl98
-rw-r--r--lib/dialyzer/test/behaviour_SUITE_data/src/proper/proper_types.erl1353
-rw-r--r--lib/dialyzer/test/behaviour_SUITE_data/src/proper/proper_typeserver.erl2411
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/proper/proper_common.hrl55
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/proper/proper_gen.erl624
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/proper/proper_internal.hrl92
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/proper/proper_types.erl1349
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/proper/proper_typeserver.erl2402
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/rec_env.erl611
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/cerl_hipeify.erl684
-rw-r--r--lib/dialyzer/test/specdiffs_SUITE_data/results/overloaded6
-rw-r--r--lib/dialyzer/test/specdiffs_SUITE_data/src/overloaded.erl37
-rw-r--r--lib/erl_docgen/priv/js/highlight.js17
-rw-r--r--lib/erl_docgen/priv/js/highlight.pack.js4
-rw-r--r--lib/erl_docgen/priv/xsl/db_html.xsl44
-rw-r--r--lib/ftp/doc/src/notes.xml31
-rw-r--r--lib/ftp/src/ftp.erl19
-rw-r--r--lib/hipe/cerl/erl_bif_types.erl2
-rw-r--r--lib/inets/doc/src/notes.xml15
-rw-r--r--lib/inets/examples/httpd_load_test/hdlt_random_html.erl16
-rw-r--r--lib/inets/src/http_client/httpc.erl12
-rw-r--r--lib/inets/src/http_lib/http_request.erl9
-rw-r--r--lib/inets/src/http_server/httpd_example.erl13
-rw-r--r--lib/inets/src/http_server/httpd_request.erl2
-rw-r--r--lib/inets/test/httpc_SUITE.erl11
-rw-r--r--lib/inets/test/httpd_SUITE.erl20
-rw-r--r--lib/kernel/doc/src/Makefile28
-rw-r--r--lib/kernel/doc/src/logger.xml8
-rw-r--r--lib/kernel/doc/src/logger_cookbook.xml424
-rw-r--r--lib/kernel/doc/src/net.xml49
-rw-r--r--lib/kernel/doc/src/part.xml2
-rw-r--r--lib/kernel/doc/src/ref_man.xml (renamed from lib/kernel/doc/src/ref_man.xml.src)2
-rw-r--r--lib/kernel/doc/src/rpc.xml35
-rw-r--r--lib/kernel/doc/src/seq_trace.xml2
-rw-r--r--lib/kernel/doc/src/specs.xml (renamed from lib/kernel/doc/src/specs.xml.src)2
-rw-r--r--lib/kernel/src/erl_epmd.erl13
-rw-r--r--lib/kernel/src/inet.erl34
-rw-r--r--lib/kernel/src/logger_std_h.erl43
-rw-r--r--lib/kernel/src/net.erl146
-rw-r--r--lib/kernel/test/Makefile1
-rw-r--r--lib/kernel/test/disk_log_SUITE.erl3
-rw-r--r--lib/kernel/test/file_SUITE.erl26
-rw-r--r--lib/kernel/test/logger_std_h_SUITE.erl70
-rw-r--r--lib/kernel/test/net_SUITE.erl489
-rw-r--r--lib/kernel/test/seq_trace_SUITE.erl34
-rw-r--r--lib/kernel/test/wrap_log_reader_SUITE.erl64
-rw-r--r--lib/megaco/Makefile6
-rw-r--r--lib/megaco/examples/meas/megaco_codec_meas.erl4
-rw-r--r--lib/megaco/examples/meas/megaco_codec_mstone1.erl130
-rw-r--r--lib/megaco/examples/meas/megaco_codec_mstone2.erl10
-rw-r--r--lib/megaco/examples/meas/megaco_codec_mstone_lib.erl2
-rw-r--r--lib/megaco/examples/meas/megaco_codec_transform.erl8
-rw-r--r--lib/megaco/examples/meas/mstone1.sh.skel.src40
-rw-r--r--lib/megaco/src/flex/megaco_flex_scanner.erl4
-rw-r--r--lib/megaco/test/megaco_trans_test.erl358
-rw-r--r--lib/mnesia/src/mnesia_index.erl2
-rw-r--r--lib/mnesia/src/mnesia_tm.erl6
-rw-r--r--lib/mnesia/test/mnesia_dirty_access_test.erl2
-rw-r--r--lib/mnesia/test/mnesia_index_plugin_test.erl23
-rw-r--r--lib/observer/src/crashdump_viewer.erl5
-rw-r--r--lib/public_key/src/pubkey_crl.erl1
-rw-r--r--lib/reltool/examples/display_args2
-rw-r--r--lib/reltool/test/reltool_server_SUITE.erl2
-rw-r--r--lib/snmp/Makefile2
-rw-r--r--lib/snmp/doc/src/notes.xml65
-rw-r--r--lib/snmp/doc/src/notes_history.xml32
-rw-r--r--lib/snmp/doc/src/snmp_app.xml40
-rw-r--r--lib/snmp/doc/src/snmp_config.xml23
-rw-r--r--lib/snmp/doc/src/snmp_manager_netif.xml2
-rw-r--r--lib/snmp/doc/src/snmpa.xml6
-rw-r--r--lib/snmp/doc/src/snmpa_network_interface_filter.xml2
-rw-r--r--lib/snmp/doc/src/snmpm_user.xml2
-rw-r--r--lib/snmp/src/agent/Makefile27
-rw-r--r--lib/snmp/src/agent/modules.mk1
-rw-r--r--lib/snmp/src/agent/snmpa_mpd.erl2
-rw-r--r--lib/snmp/src/agent/snmpa_net_if.erl35
-rw-r--r--lib/snmp/src/agent/snmpa_trap.erl3
-rw-r--r--lib/snmp/src/manager/Makefile25
-rw-r--r--lib/snmp/src/manager/depend.mk6
-rw-r--r--lib/snmp/src/manager/modules.mk3
-rw-r--r--lib/snmp/src/manager/snmpm_config.erl35
-rw-r--r--lib/snmp/src/manager/snmpm_mpd.erl16
-rw-r--r--lib/snmp/src/manager/snmpm_server.erl422
-rw-r--r--lib/snmp/test/Makefile21
-rw-r--r--lib/snmp/test/modules.mk36
-rw-r--r--lib/snmp/test/snmp_SUITE.erl129
-rw-r--r--lib/snmp/test/snmp_agent_SUITE.erl (renamed from lib/snmp/test/snmp_agent_test.erl)172
-rw-r--r--lib/snmp/test/snmp_agent_conf_SUITE.erl (renamed from lib/snmp/test/snmp_agent_conf_test.erl)94
-rw-r--r--lib/snmp/test/snmp_agent_mibs_SUITE.erl (renamed from lib/snmp/test/snmp_agent_mibs_test.erl)253
-rw-r--r--lib/snmp/test/snmp_agent_nfilter_SUITE.erl (renamed from lib/snmp/test/snmp_agent_nfilter_test.erl)7
-rw-r--r--lib/snmp/test/snmp_app_SUITE.erl (renamed from lib/snmp/test/snmp_app_test.erl)60
-rw-r--r--lib/snmp/test/snmp_compiler_SUITE.erl (renamed from lib/snmp/test/snmp_compiler_test.erl)106
-rw-r--r--lib/snmp/test/snmp_conf_SUITE.erl (renamed from lib/snmp/test/snmp_conf_test.erl)84
-rw-r--r--lib/snmp/test/snmp_log_SUITE.erl (renamed from lib/snmp/test/snmp_log_test.erl)147
-rw-r--r--lib/snmp/test/snmp_manager_SUITE.erl (renamed from lib/snmp/test/snmp_manager_test.erl)824
-rw-r--r--lib/snmp/test/snmp_manager_config_SUITE.erl (renamed from lib/snmp/test/snmp_manager_config_test.erl)238
-rw-r--r--lib/snmp/test/snmp_manager_user_SUITE.erl (renamed from lib/snmp/test/snmp_manager_user_test.erl)189
-rw-r--r--lib/snmp/test/snmp_manager_user_test_lib.erl37
-rw-r--r--lib/snmp/test/snmp_note_store_SUITE.erl (renamed from lib/snmp/test/snmp_note_store_test.erl)63
-rw-r--r--lib/snmp/test/snmp_pdus_SUITE.erl (renamed from lib/snmp/test/snmp_pdus_test.erl)78
-rw-r--r--lib/snmp/test/snmp_test_global_sys_monitor.erl41
-rw-r--r--lib/snmp/test/snmp_test_lib.erl62
-rw-r--r--lib/snmp/test/snmp_test_lib.hrl102
-rw-r--r--lib/snmp/test/snmp_test_sys_monitor.erl12
-rw-r--r--lib/snmp/test/snmp_to_snmpnet_SUITE.erl205
-rw-r--r--lib/snmp/vsn.mk2
-rw-r--r--lib/ssh/doc/src/notes.xml34
-rw-r--r--lib/ssh/doc/src/ssh.xml96
-rw-r--r--lib/ssh/doc/src/ssh_app.xml9
-rw-r--r--lib/ssh/doc/src/ssh_connection.xml24
-rw-r--r--lib/ssh/doc/src/using_ssh.xml509
-rw-r--r--lib/ssh/src/ssh.erl59
-rw-r--r--lib/ssh/src/ssh.hrl10
-rw-r--r--lib/ssh/src/ssh_cli.erl177
-rw-r--r--lib/ssh/src/ssh_options.erl2
-rw-r--r--lib/ssh/src/ssh_sftp.erl41
-rw-r--r--lib/ssh/src/ssh_transport.erl19
-rw-r--r--lib/ssh/src/ssh_xfer.erl39
-rw-r--r--lib/ssh/src/ssh_xfer.hrl4
-rw-r--r--lib/ssh/test/ssh_algorithms_SUITE.erl15
-rw-r--r--lib/ssh/test/ssh_basic_SUITE.erl94
-rw-r--r--lib/ssh/test/ssh_compat_SUITE.erl6
-rw-r--r--lib/ssh/test/ssh_connection_SUITE.erl353
-rw-r--r--lib/ssh/test/ssh_options_SUITE.erl5
-rw-r--r--lib/ssh/test/ssh_property_test_SUITE.erl10
-rw-r--r--lib/ssh/test/ssh_sftpd_SUITE.erl6
-rw-r--r--lib/ssh/test/ssh_test_lib.erl136
-rw-r--r--lib/ssh/test/ssh_test_lib.hrl14
-rw-r--r--lib/ssh/test/ssh_to_openssh_SUITE.erl58
-rw-r--r--lib/ssl/doc/src/ssl.xml10
-rw-r--r--lib/ssl/doc/src/ssl_app.xml19
-rw-r--r--lib/ssl/doc/src/ssl_crl_cache_api.xml50
-rw-r--r--lib/ssl/src/Makefile7
-rw-r--r--lib/ssl/src/dtls_connection.erl45
-rw-r--r--lib/ssl/src/dtls_handshake.erl18
-rw-r--r--lib/ssl/src/dtls_listener_sup.erl31
-rw-r--r--lib/ssl/src/dtls_packet_demux.erl9
-rw-r--r--lib/ssl/src/dtls_socket.erl33
-rw-r--r--lib/ssl/src/dtls_sup.erl76
-rw-r--r--lib/ssl/src/ssl.app.src7
-rw-r--r--lib/ssl/src/ssl.erl829
-rw-r--r--lib/ssl/src/ssl_admin_sup.erl13
-rw-r--r--lib/ssl/src/ssl_alert.erl83
-rw-r--r--lib/ssl/src/ssl_alert.hrl7
-rw-r--r--lib/ssl/src/ssl_app.erl3
-rw-r--r--lib/ssl/src/ssl_certificate.erl2
-rw-r--r--lib/ssl/src/ssl_cipher.erl66
-rw-r--r--lib/ssl/src/ssl_cipher.hrl10
-rw-r--r--lib/ssl/src/ssl_connection.erl132
-rw-r--r--lib/ssl/src/ssl_connection.hrl7
-rw-r--r--lib/ssl/src/ssl_connection_sup.erl48
-rw-r--r--lib/ssl/src/ssl_crl_cache.erl6
-rw-r--r--lib/ssl/src/ssl_crl_cache_api.erl13
-rw-r--r--lib/ssl/src/ssl_crl_hash_dir.erl77
-rw-r--r--lib/ssl/src/ssl_handshake.erl219
-rw-r--r--lib/ssl/src/ssl_internal.hrl159
-rw-r--r--lib/ssl/src/ssl_logger.erl103
-rw-r--r--lib/ssl/src/ssl_manager.erl42
-rw-r--r--lib/ssl/src/ssl_pkix_db.erl5
-rw-r--r--lib/ssl/src/ssl_record.hrl1
-rw-r--r--lib/ssl/src/ssl_session.erl89
-rw-r--r--lib/ssl/src/tls_bloom_filter.erl113
-rw-r--r--lib/ssl/src/tls_client_ticket_store.erl355
-rw-r--r--lib/ssl/src/tls_connection.erl174
-rw-r--r--lib/ssl/src/tls_connection_1_3.erl4
-rw-r--r--lib/ssl/src/tls_handshake.erl18
-rw-r--r--lib/ssl/src/tls_handshake_1_3.erl587
-rw-r--r--lib/ssl/src/tls_handshake_1_3.hrl4
-rw-r--r--lib/ssl/src/tls_record.erl2
-rw-r--r--lib/ssl/src/tls_sender.erl25
-rw-r--r--lib/ssl/src/tls_server_session_ticket.erl391
-rw-r--r--lib/ssl/src/tls_server_session_ticket_sup.erl72
-rw-r--r--lib/ssl/src/tls_server_sup.erl77
-rw-r--r--lib/ssl/src/tls_socket.erl87
-rw-r--r--lib/ssl/src/tls_sup.erl76
-rw-r--r--lib/ssl/src/tls_v1.erl11
-rw-r--r--lib/ssl/test/Makefile4
-rw-r--r--lib/ssl/test/dtls_api_SUITE.erl131
-rw-r--r--lib/ssl/test/make_certs.erl84
-rw-r--r--lib/ssl/test/openssl_npn_SUITE.erl1
-rw-r--r--lib/ssl/test/openssl_session_SUITE.erl16
-rw-r--r--lib/ssl/test/openssl_tls_1_3_version_SUITE.erl12
-rw-r--r--lib/ssl/test/property_test/ssl_eqc_handshake.erl4
-rw-r--r--lib/ssl/test/ssl_alert_SUITE.erl24
-rw-r--r--lib/ssl/test/ssl_api_SUITE.erl144
-rw-r--r--lib/ssl/test/ssl_crl_SUITE.erl19
-rw-r--r--lib/ssl/test/ssl_dist_SUITE.erl1
-rw-r--r--lib/ssl/test/ssl_handshake_SUITE.erl7
-rw-r--r--lib/ssl/test/ssl_npn_SUITE.erl3
-rw-r--r--lib/ssl/test/ssl_npn_hello_SUITE.erl12
-rw-r--r--lib/ssl/test/ssl_packet_SUITE.erl71
-rw-r--r--lib/ssl/test/ssl_payload_SUITE.erl8
-rw-r--r--lib/ssl/test/ssl_session_cache_SUITE.erl28
-rw-r--r--lib/ssl/test/ssl_session_ticket_SUITE.erl722
-rw-r--r--lib/ssl/test/ssl_test_lib.erl105
-rw-r--r--lib/ssl/test/tls_1_3_record_SUITE.erl470
-rw-r--r--lib/ssl/test/tls_1_3_version_SUITE.erl71
-rw-r--r--lib/stdlib/doc/src/erl_tar.xml199
-rw-r--r--lib/stdlib/doc/src/proplists.xml4
-rw-r--r--lib/stdlib/src/binary.erl2
-rw-r--r--lib/stdlib/src/erl_lint.erl19
-rw-r--r--lib/stdlib/src/erl_tar.erl81
-rw-r--r--lib/stdlib/src/erl_tar.hrl29
-rw-r--r--lib/stdlib/src/pool.erl14
-rw-r--r--lib/stdlib/src/proplists.erl7
-rw-r--r--lib/stdlib/src/stdlib.app.src2
-rw-r--r--lib/stdlib/test/Makefile2
-rw-r--r--lib/stdlib/test/beam_lib_SUITE.erl2
-rw-r--r--lib/stdlib/test/erl_lint_SUITE.erl52
-rw-r--r--lib/stdlib/test/escript_SUITE.erl3
-rw-r--r--lib/stdlib/test/pool_SUITE.erl95
-rw-r--r--lib/stdlib/test/proplists_SUITE.erl80
-rw-r--r--lib/stdlib/test/stdlib_SUITE.erl9
-rw-r--r--lib/stdlib/test/unicode_SUITE.erl26
-rw-r--r--lib/syntax_tools/doc/src/notes.xml16
-rw-r--r--lib/tools/emacs/erlang-eunit.el4
-rw-r--r--lib/tools/emacs/erlang-flymake.el4
-rw-r--r--lib/tools/emacs/erlang.el340
-rw-r--r--lib/tools/test/emacs_SUITE_data/type_specs30
-rw-r--r--lib/wx/api_gen/wx_extra/added_func.h8
-rw-r--r--lib/wx/api_gen/wxapi.conf6
-rw-r--r--lib/wx/c_src/gen/wxe_funcs.cpp34
-rw-r--r--lib/wx/c_src/gen/wxe_macros.h6568
-rw-r--r--lib/wx/src/gen/wxAuiNotebook.erl45
-rw-r--r--lib/wx/src/gen/wxBitmapButton.erl46
-rw-r--r--lib/wx/src/gen/wxButton.erl29
-rw-r--r--lib/wx/src/gen/wxCalendarCtrl.erl27
-rw-r--r--lib/wx/src/gen/wxCheckBox.erl27
-rw-r--r--lib/wx/src/gen/wxCheckListBox.erl8
-rw-r--r--lib/wx/src/gen/wxChoice.erl8
-rw-r--r--lib/wx/src/gen/wxChoicebook.erl27
-rw-r--r--lib/wx/src/gen/wxColourDialog.erl30
-rw-r--r--lib/wx/src/gen/wxColourPickerCtrl.erl12
-rw-r--r--lib/wx/src/gen/wxComboBox.erl8
-rw-r--r--lib/wx/src/gen/wxControl.erl29
-rw-r--r--lib/wx/src/gen/wxControlWithItems.erl27
-rw-r--r--lib/wx/src/gen/wxDatePickerCtrl.erl12
-rw-r--r--lib/wx/src/gen/wxDialog.erl29
-rw-r--r--lib/wx/src/gen/wxDirDialog.erl30
-rw-r--r--lib/wx/src/gen/wxDirPickerCtrl.erl12
-rw-r--r--lib/wx/src/gen/wxFileDialog.erl30
-rw-r--r--lib/wx/src/gen/wxFilePickerCtrl.erl12
-rw-r--r--lib/wx/src/gen/wxFindReplaceDialog.erl30
-rw-r--r--lib/wx/src/gen/wxFontDialog.erl30
-rw-r--r--lib/wx/src/gen/wxFontPickerCtrl.erl12
-rw-r--r--lib/wx/src/gen/wxFrame.erl29
-rw-r--r--lib/wx/src/gen/wxGLCanvas.erl27
-rw-r--r--lib/wx/src/gen/wxGauge.erl27
-rw-r--r--lib/wx/src/gen/wxGenericDirCtrl.erl27
-rw-r--r--lib/wx/src/gen/wxGrid.erl41
-rw-r--r--lib/wx/src/gen/wxHtmlWindow.erl41
-rw-r--r--lib/wx/src/gen/wxListBox.erl8
-rw-r--r--lib/wx/src/gen/wxListCtrl.erl45
-rw-r--r--lib/wx/src/gen/wxListView.erl27
-rw-r--r--lib/wx/src/gen/wxListbook.erl27
-rw-r--r--lib/wx/src/gen/wxMDIChildFrame.erl53
-rw-r--r--lib/wx/src/gen/wxMDIClientWindow.erl27
-rw-r--r--lib/wx/src/gen/wxMDIParentFrame.erl10
-rw-r--r--lib/wx/src/gen/wxMenuBar.erl38
-rw-r--r--lib/wx/src/gen/wxMessageDialog.erl30
-rw-r--r--lib/wx/src/gen/wxMiniFrame.erl10
-rw-r--r--lib/wx/src/gen/wxMultiChoiceDialog.erl30
-rw-r--r--lib/wx/src/gen/wxNotebook.erl27
-rw-r--r--lib/wx/src/gen/wxPanel.erl22
-rw-r--r--lib/wx/src/gen/wxPasswordEntryDialog.erl49
-rw-r--r--lib/wx/src/gen/wxPickerBase.erl27
-rw-r--r--lib/wx/src/gen/wxPopupTransientWindow.erl46
-rw-r--r--lib/wx/src/gen/wxPopupWindow.erl27
-rw-r--r--lib/wx/src/gen/wxPreviewCanvas.erl41
-rw-r--r--lib/wx/src/gen/wxPreviewControlBar.erl46
-rw-r--r--lib/wx/src/gen/wxPreviewFrame.erl10
-rw-r--r--lib/wx/src/gen/wxPrintDialog.erl30
-rw-r--r--lib/wx/src/gen/wxProgressDialog.erl30
-rw-r--r--lib/wx/src/gen/wxRadioBox.erl27
-rw-r--r--lib/wx/src/gen/wxRadioButton.erl27
-rw-r--r--lib/wx/src/gen/wxSashLayoutWindow.erl26
-rw-r--r--lib/wx/src/gen/wxSashWindow.erl27
-rw-r--r--lib/wx/src/gen/wxScrollBar.erl27
-rw-r--r--lib/wx/src/gen/wxScrolledWindow.erl46
-rw-r--r--lib/wx/src/gen/wxSingleChoiceDialog.erl30
-rw-r--r--lib/wx/src/gen/wxSlider.erl27
-rw-r--r--lib/wx/src/gen/wxSpinButton.erl27
-rw-r--r--lib/wx/src/gen/wxSpinCtrl.erl27
-rw-r--r--lib/wx/src/gen/wxSplashScreen.erl10
-rw-r--r--lib/wx/src/gen/wxSplitterWindow.erl27
-rw-r--r--lib/wx/src/gen/wxStaticBitmap.erl27
-rw-r--r--lib/wx/src/gen/wxStaticBox.erl27
-rw-r--r--lib/wx/src/gen/wxStaticLine.erl27
-rw-r--r--lib/wx/src/gen/wxStaticText.erl29
-rw-r--r--lib/wx/src/gen/wxStatusBar.erl27
-rw-r--r--lib/wx/src/gen/wxStyledTextCtrl.erl26
-rw-r--r--lib/wx/src/gen/wxTextCtrl.erl27
-rw-r--r--lib/wx/src/gen/wxTextEntryDialog.erl30
-rw-r--r--lib/wx/src/gen/wxToggleButton.erl27
-rw-r--r--lib/wx/src/gen/wxToolBar.erl27
-rw-r--r--lib/wx/src/gen/wxToolbook.erl27
-rw-r--r--lib/wx/src/gen/wxTopLevelWindow.erl27
-rw-r--r--lib/wx/src/gen/wxTreeCtrl.erl27
-rw-r--r--lib/wx/src/gen/wxTreebook.erl27
-rw-r--r--lib/wx/src/gen/wxWindow.erl32
-rw-r--r--lib/wx/src/gen/wxe_debug.hrl6568
-rw-r--r--lib/wx/src/gen/wxe_funcs.hrl6568
341 files changed, 23752 insertions, 25105 deletions
diff --git a/lib/Makefile b/lib/Makefile
index ea2827bef0..a59532eed7 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -25,7 +25,11 @@ include $(ERL_TOP)/make/$(TARGET)/otp.mk
ERTS_APPLICATIONS = stdlib sasl kernel compiler
# Then these have to be build
+ifdef TINY_BUILD
+ERLANG_APPLICATIONS = parsetools
+else
ERLANG_APPLICATIONS = tools common_test runtime_tools inets parsetools
+endif
# These are only build if -a is given to otp_build or make is used directly
ALL_ERLANG_APPLICATIONS = xmerl edoc erl_docgen snmp erl_interface \
@@ -36,6 +40,7 @@ ALL_ERLANG_APPLICATIONS = xmerl edoc erl_docgen snmp erl_interface \
et megaco \
eunit ssh eldap dialyzer hipe ftp tftp
+
ifdef BUILD_ALL
ERLANG_APPLICATIONS += $(ALL_ERLANG_APPLICATIONS)
@@ -55,7 +60,11 @@ else
kernel stdlib compiler
else
ifdef SECONDARY_BOOTSTRAP
- SUB_DIRECTORIES = hipe parsetools asn1/src
+ ifdef TINY_BUILD
+ SUB_DIRECTORIES = parsetools sasl
+ else
+ SUB_DIRECTORIES = hipe parsetools asn1/src
+ endif
else
ifdef TERTIARY_BOOTSTRAP
SUB_DIRECTORIES = snmp sasl erl_interface jinterface syntax_tools wx
diff --git a/lib/common_test/doc/src/notes.xml b/lib/common_test/doc/src/notes.xml
index 39388fd5ed..068db6a8bf 100644
--- a/lib/common_test/doc/src/notes.xml
+++ b/lib/common_test/doc/src/notes.xml
@@ -328,6 +328,21 @@
</section>
+<section><title>Common_Test 1.15.4.4</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ The ct_property_test logging is improved.</p>
+ <p>
+ Own Id: OTP-16287</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Common_Test 1.15.4.3</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/common_test/doc/src/run_test_chapter.xml b/lib/common_test/doc/src/run_test_chapter.xml
index 2695e597cf..c57b95f1aa 100644
--- a/lib/common_test/doc/src/run_test_chapter.xml
+++ b/lib/common_test/doc/src/run_test_chapter.xml
@@ -168,9 +168,6 @@
<tag><c>-refresh_logs</c></tag>
<item><p>Refreshes the top-level HTML index files.</p></item>
- <tag><c>-vts</c></tag>
- <item><p>Starts web-based GUI (described later).</p></item>
-
<tag><c>-shell</c></tag>
<item><p>Starts interactive shell mode (described later).</p></item>
@@ -1143,45 +1140,6 @@
</section>
<section>
- <title>Running Tests from the Web-Based GUI</title>
-
- <p>The web-based GUI, Virtual Test Server (VTS), is started with the
- <seealso marker="run_test_chapter#ct_run"><c>ct_run</c></seealso>
- program. From the GUI, you can load configuration files and select
- directories, suites, and cases to run. You can also state the
- configuration files, directories, suites, and cases on the command line
- when starting the web-based GUI.
- </p>
- <p><em>Examples:</em></p>
- <list type="bulleted">
- <item><c>ct_run -vts</c></item>
- <item><c><![CDATA[ct_run -vts -config <configfilename>]]></c></item>
- <item><c><![CDATA[ct_run -vts -config <configfilename> -suite <suitewithfullpath>
- -case <casename>]]></c></item>
- </list>
-
- <p>From the GUI you can run tests and view the result and the logs.
- </p>
-
- <p><c>ct_run -vts</c> tries to open the <c>Common Test</c> start
- page in an existing web browser window, or start the browser if it is
- not running. Which browser to start can be specified with
- the browser start command option:</p>
- <p><c><![CDATA[ct_run -vts -browser <browser_start_cmd>]]></c></p>
- <p><em>Example:</em></p>
- <p><c><![CDATA[$ ct_run -vts -browser 'firefox&']]></c></p>
-
- <note><p>The browser must run as a separate OS process, otherwise VTS hangs.</p></note>
-
- <p>If no specific browser start command is specified, Firefox is
- the default browser on Unix platforms, and Internet Explorer on Windows.
- If <c>Common Test</c> fails to start a browser automatically, or <c>none</c> is
- specified as the value for <c>-browser</c> (that is, <c>-browser none</c>), start your
- favourite browser manually and type the URL that <c>Common Test</c>
- displays in the shell.</p>
- </section>
-
- <section>
<marker id="log_files"></marker>
<title>Log Files</title>
diff --git a/lib/common_test/src/ct_property_test.erl b/lib/common_test/src/ct_property_test.erl
index f51f454d08..93642a0970 100644
--- a/lib/common_test/src/ct_property_test.erl
+++ b/lib/common_test/src/ct_property_test.erl
@@ -39,16 +39,27 @@
init_per_suite(Config) ->
case which_module_exists([eqc,proper,triq]) of
{ok,ToolModule} ->
- ct:pal("Found property tester ~p",[ToolModule]),
- Path = property_tests_path("property_test", Config),
- case compile_tests(Path,ToolModule) of
- error ->
- {fail, "Property test compilation failed in "++Path};
- up_to_date ->
- add_code_pathz(Path),
- [{property_dir,Path},
- {property_test_tool,ToolModule} | Config]
- end;
+ case code:where_is_file(lists:concat([ToolModule,".beam"])) of
+ non_existing ->
+ ct:log("Found ~p, but ~tp is not found",
+ [ToolModule, lists:concat([ToolModule,".beam"])]),
+ {skip, "Strange Property testing tool installation"};
+ ToolPath ->
+ ct:pal("Found property tester ~p~n"
+ "at ~tp",
+ [ToolModule, ToolPath]),
+ Path = property_tests_path("property_test", Config),
+ case compile_tests(Path,ToolModule) of
+ error ->
+ {fail, "Property test compilation failed in "++Path};
+ {skip,Reason} ->
+ {skip,Reason};
+ up_to_date ->
+ add_code_pathz(Path),
+ [{property_dir,Path},
+ {property_test_tool,ToolModule} | Config]
+ end
+ end;
not_found ->
ct:pal("No property tester found",[]),
@@ -108,15 +119,33 @@ add_code_pathz(Dir) ->
compile_tests(Path, ToolModule) ->
MacroDefs = macro_def(ToolModule),
{ok,Cwd} = file:get_cwd(),
- ok = file:set_cwd(Path),
- {ok,FileNames} = file:list_dir("."),
- BeamFiles = [F || F<-FileNames,
- filename:extension(F) == ".beam"],
- _ = [file:delete(F) || F<-BeamFiles],
- ct:pal("Compiling in ~tp:~n Deleted ~p~n MacroDefs=~p",[Path,BeamFiles,MacroDefs]),
- Result = make:all([load|MacroDefs]),
- ok = file:set_cwd(Cwd),
- Result.
+ case file:set_cwd(Path) of
+ ok ->
+ case file:list_dir(".") of
+ {ok,[]} ->
+ ct:pal("No files found in ~tp", [Path]),
+ ok = file:set_cwd(Cwd),
+ {skip, "No files found"};
+ {ok,FileNames} ->
+ BeamFiles = [F || F<-FileNames,
+ filename:extension(F) == ".beam"],
+ ErlFiles = [F || F<-FileNames,
+ filename:extension(F) == ".erl"],
+ _ = [file:delete(F) || F<-BeamFiles],
+ ct:pal("Compiling in ~tp~n"
+ " Deleted: ~p~n"
+ " ErlFiles: ~tp~n"
+ " MacroDefs: ~p",
+ [Path,BeamFiles,ErlFiles,MacroDefs]),
+ Result = make:all([load|MacroDefs]),
+ ok = file:set_cwd(Cwd),
+ Result
+ end;
+
+ {error,Error} ->
+ ct:pal("file:set_cwd(~tp) returned ~p.~nCwd = ~tp", [Path, {error,Error}, Cwd]),
+ error
+ end.
macro_def(eqc) -> [{d, 'EQC'}];
diff --git a/lib/compiler/doc/src/notes.xml b/lib/compiler/doc/src/notes.xml
index 0fb21f06d6..cb4f77e0b5 100644
--- a/lib/compiler/doc/src/notes.xml
+++ b/lib/compiler/doc/src/notes.xml
@@ -32,6 +32,39 @@
<p>This document describes the changes made to the Compiler
application.</p>
+<section><title>Compiler 7.4.9</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>Fixed a performance bug that caused repeated matches
+ of large records to take a very long time to compile.</p>
+ <p>
+ Own Id: OTP-16259 Aux Id: ERIERL-436 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>Compiler 7.4.8</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>The compiler could do an unsafe optimization of
+ receives, which would cause a receive to only scan part
+ of the message queue.</p>
+ <p>This bug fix in the compiler fixes a bug in the socket
+ module.</p>
+ <p>
+ Own Id: OTP-16219 Aux Id: ERL-1076 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Compiler 7.4.7</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/compiler/src/beam_a.erl b/lib/compiler/src/beam_a.erl
index 0bccad1ecd..eadd858885 100644
--- a/lib/compiler/src/beam_a.erl
+++ b/lib/compiler/src/beam_a.erl
@@ -59,6 +59,13 @@ rename_instrs([{test,is_eq_exact,_,[Dst,Src]}=Test,
rename_instrs([{test,is_eq_exact,_,[Same,Same]}|Is]) ->
%% Same literal or same register. Will always succeed.
rename_instrs(Is);
+rename_instrs([{recv_set,_},
+ {label,Lbl},
+ {loop_rec,{f,Fail},{x,0}},
+ {loop_rec_end,_},{label,Fail}|Is]) ->
+ %% This instruction sequence does nothing. All we need to
+ %% keep is the first label.
+ [{label,Lbl}|rename_instrs(Is)];
rename_instrs([{loop_rec,{f,Fail},{x,0}},{loop_rec_end,_},{label,Fail}|Is]) ->
%% This instruction sequence does nothing.
rename_instrs(Is);
diff --git a/lib/compiler/src/beam_ssa_recv.erl b/lib/compiler/src/beam_ssa_recv.erl
index 1e0e1ecac2..31b8460525 100644
--- a/lib/compiler/src/beam_ssa_recv.erl
+++ b/lib/compiler/src/beam_ssa_recv.erl
@@ -112,7 +112,7 @@ opt([], Blocks, _) -> Blocks.
recv_opt([L|Ls], RecvLbl, Blocks) ->
#b_blk{is=Is0} = Blk0 = map_get(L, Blocks),
- case recv_opt_is(Is0, RecvLbl, Blocks, []) of
+ case recv_opt_is(L, {Is0,[]}, RecvLbl, Blocks) of
{yes,Is} ->
Blk = Blk0#b_blk{is=Is},
{yes,Blocks#{L:=Blk}};
@@ -121,22 +121,48 @@ recv_opt([L|Ls], RecvLbl, Blocks) ->
end;
recv_opt([], _, _Blocks) -> no.
-recv_opt_is([#b_set{op=call}=I0|Is], RecvLbl, Blocks0, Acc) ->
+recv_opt_is(L, {Is0,PreIs0}, RecvLbl, Blocks) ->
+ case recv_opt_makes_ref(Is0, RecvLbl, Blocks, PreIs0) of
+ {yes,Ref,[I0|Is],PreIs} ->
+ %% This instruction creates a reference. Search the
+ %% rest of the function to find whether it is always
+ %% matched out by a receive.
+ %%
+ %% Note: It is important that we don't search the entire
+ %% block that this instruction is part of, because the
+ %% block could contain a remove_message instruction part
+ %% of a previous receive. For an example, see
+ %% receive_SUITE_data/ref_opt/yes_16.erl.
+ TempBlk = (map_get(L, Blocks))#b_blk{is=Is},
+ TempBlocks = Blocks#{L:=TempBlk},
+ case opt_ref_used(L, Ref, TempBlocks) of
+ true ->
+ %% This reference will always be matched to
+ %% a part of any message received.
+ I = beam_ssa:add_anno(recv_mark, RecvLbl, I0),
+ {yes,reverse(PreIs, [I|Is])};
+ false ->
+ %% There could be more than one reference-creating
+ %% instruction in a block, so we will need to
+ %% continue the search. For an example, see
+ %% receive_SUITE_data/ref_opt/yes_15.erl.
+ recv_opt_is(L, {Is,[I0|PreIs]}, RecvLbl, Blocks)
+ end;
+ no ->
+ no
+ end.
+
+recv_opt_makes_ref([#b_set{op=call}=I0|Is], RecvLbl, Blocks0, Acc) ->
case makes_ref(I0, Blocks0) of
no ->
- recv_opt_is(Is, RecvLbl, Blocks0, [I0|Acc]);
+ recv_opt_makes_ref(Is, RecvLbl, Blocks0, [I0|Acc]);
{yes,Ref} ->
- case opt_ref_used(RecvLbl, Ref, Blocks0) of
- false ->
- recv_opt_is(Is, RecvLbl, Blocks0, [I0|Acc]);
- true ->
- I = beam_ssa:add_anno(recv_mark, RecvLbl, I0),
- {yes,reverse(Acc, [I|Is])}
- end
+ %% This call creates a reference.
+ {yes,Ref,[I0|Is],Acc}
end;
-recv_opt_is([I|Is], RecvLbl, Blocks, Acc) ->
- recv_opt_is(Is, RecvLbl, Blocks, [I|Acc]);
-recv_opt_is([], _, _, _) -> no.
+recv_opt_makes_ref([I|Is], RecvLbl, Blocks, Acc) ->
+ recv_opt_makes_ref(Is, RecvLbl, Blocks, [I|Acc]);
+recv_opt_makes_ref([], _, _, _) -> no.
makes_ref(#b_set{dst=Dst,args=[Func0|_]}, Blocks) ->
Func = case Func0 of
@@ -165,9 +191,9 @@ ref_in_tuple(Tuple, Blocks) ->
end,
beam_ssa:fold_instrs_rpo(F, [0], no, Blocks).
-opt_ref_used(RecvLbl, Ref, Blocks) ->
+opt_ref_used(L, Ref, Blocks) ->
Vs = #{Ref=>ref,ref=>Ref,ref_matched=>false},
- case opt_ref_used_1(RecvLbl, Vs, Blocks) of
+ case opt_ref_used_1(L, Vs, Blocks) of
used -> true;
not_used -> false;
done -> false
@@ -218,6 +244,21 @@ opt_ref_used_is([#b_set{op=wait_timeout}|_], _Vs) ->
done;
opt_ref_used_is([#b_set{op=wait}|_], _Vs) ->
done;
+opt_ref_used_is([#b_set{op=landingpad}|_], _Vs) ->
+ %% The receive marker will be cleared when an exception
+ %% is caught.
+ done;
+opt_ref_used_is([#b_set{op=call,
+ args=[#b_remote{mod=#b_literal{val=Mod},
+ name=#b_literal{val=Name}}|Args]}=I|Is],
+ Vs0) ->
+ case erl_bifs:is_exit_bif(Mod, Name, length(Args)) of
+ true ->
+ done;
+ false ->
+ Vs = update_vars(I, Vs0),
+ opt_ref_used_is(Is, Vs)
+ end;
opt_ref_used_is([#b_set{}=I|Is], Vs0) ->
Vs = update_vars(I, Vs0),
opt_ref_used_is(Is, Vs);
@@ -234,6 +275,8 @@ opt_ref_used_last(#b_blk{last=Last}=Blk, Vs, Blocks) ->
#{} ->
ref_used_in([{Succ,Vs},{Fail,Vs}], Blocks)
end;
+ #b_ret{} ->
+ not_used;
_ ->
SuccVs = [{Succ,Vs} || Succ <- beam_ssa:successors(Blk)],
ref_used_in(SuccVs, Blocks)
@@ -260,9 +303,9 @@ update_vars(#b_set{args=Args,dst=Dst}, Vs) ->
#{} -> false
end
end, Vars),
- case All of
- true -> Vs#{Dst=>message};
- false -> Vs
+ case {Vars,All} of
+ {[_|_],true} -> Vs#{Dst=>message};
+ {_,_} -> Vs
end.
%% is_ref_msg_comparison(Args, Variables) -> true|false.
diff --git a/lib/compiler/src/beam_validator.erl b/lib/compiler/src/beam_validator.erl
index 349d74eb58..e83c5f7762 100644
--- a/lib/compiler/src/beam_validator.erl
+++ b/lib/compiler/src/beam_validator.erl
@@ -209,7 +209,12 @@ validate_0(Module, [{function,Name,Ar,Entry,Code}|Fs], Ft) ->
%% Previous instruction was setelement/3.
setelem=false,
%% put/1 instructions left.
- puts_left=none
+ puts_left=none,
+ %% recv_mark/recv_set state.
+ %%
+ %% 'initialized' means we've saved a message position, and 'committed'
+ %% means the next loop_rec instruction will use it.
+ recv_marker=none :: none | undecided | initialized | committed
}).
-type label() :: integer().
@@ -461,11 +466,13 @@ valfun_1({put,Src}, Vst0) ->
end;
%% Instructions for optimization of selective receives.
valfun_1({recv_mark,{f,Fail}}, Vst) when is_integer(Fail) ->
- Vst;
+ set_receive_marker(initialized, Vst);
valfun_1({recv_set,{f,Fail}}, Vst) when is_integer(Fail) ->
- Vst;
+ set_receive_marker(committed, Vst);
%% Misc.
-valfun_1(remove_message, Vst) ->
+valfun_1(remove_message, Vst0) ->
+ Vst = set_receive_marker(none, Vst0),
+
%% The message term is no longer fragile. It can be used
%% without restrictions.
remove_fragility(Vst);
@@ -533,15 +540,23 @@ valfun_1({'try',Dst,{f,Fail}}, Vst) when Fail =/= none ->
valfun_1({catch_end,Reg}, #vst{current=#st{ct=[Fail|_]}}=Vst0) ->
case get_tag_type(Reg, Vst0) of
{catchtag,Fail} ->
+ %% Kill the catch tag and receive marker.
+ %%
+ %% The marker is only cleared when an exception is thrown, but it's
+ %% a bit too complicated to separate those cases at the moment.
+ Vst1 = kill_catch_tag(Reg, Vst0),
+ Vst = set_receive_marker(none, Vst1),
+
%% {x,0} contains the caught term, if any.
- create_term(term, catch_end, [], {x,0}, kill_catch_tag(Reg, Vst0));
+ create_term(term, catch_end, [], {x,0}, Vst);
Type ->
error({wrong_tag_type,Type})
end;
valfun_1({try_end,Reg}, #vst{current=#st{ct=[Fail|_]}}=Vst) ->
case get_tag_type(Reg, Vst) of
{trytag,Fail} ->
- %% Kill the catch tag, note that x registers are unaffected.
+ %% Kill the catch tag. Note that x registers and the receive marker
+ %% are unaffected.
kill_catch_tag(Reg, Vst);
Type ->
error({wrong_tag_type,Type})
@@ -549,12 +564,14 @@ valfun_1({try_end,Reg}, #vst{current=#st{ct=[Fail|_]}}=Vst) ->
valfun_1({try_case,Reg}, #vst{current=#st{ct=[Fail|_]}}=Vst0) ->
case get_tag_type(Reg, Vst0) of
{trytag,Fail} ->
- %% Kill the catch tag and all x registers.
- Vst1 = prune_x_regs(0, kill_catch_tag(Reg, Vst0)),
+ %% Kill the catch tag, all x registers, and the receive marker.
+ Vst1 = kill_catch_tag(Reg, Vst0),
+ Vst2 = prune_x_regs(0, Vst1),
+ Vst3 = set_receive_marker(none, Vst2),
%% Class:Error:Stacktrace
- Vst2 = create_term({atom,[]}, try_case, [], {x,0}, Vst1),
- Vst = create_term(term, try_case, [], {x,1}, Vst2),
+ Vst4 = create_term({atom,[]}, try_case, [], {x,0}, Vst3),
+ Vst = create_term(term, try_case, [], {x,1}, Vst4),
create_term(term, try_case, [], {x,2}, Vst);
Type ->
error({wrong_tag_type,Type})
@@ -594,9 +611,12 @@ init_try_catch_branch(Tag, Dst, Fail, Vst0) ->
Vst = Vst0#vst{current=St},
branch(Fail, Vst,
- fun(CatchVst) ->
- #vst{current=#st{ys=Ys}} = CatchVst,
- maps:fold(fun init_catch_handler_1/3, CatchVst, Ys)
+ fun(CatchVst0) ->
+ #vst{current=#st{ys=Ys}} = CatchVst0,
+ CatchVst = maps:fold(fun init_catch_handler_1/3,
+ CatchVst0, Ys),
+ %% The receive marker is cleared on exceptions.
+ set_receive_marker(none, CatchVst)
end,
fun(SuccVst) ->
%% All potentially-throwing instructions after this
@@ -762,11 +782,10 @@ valfun_4({gc_bif,Op,{f,Fail},Live,Ss,Dst}, #vst{current=St0}=Vst0) ->
%% registers were pruned before the branch.
extract_term(Type, {gc_bif,Op}, Ss, Dst, SuccVst, Vst0)
end);
-valfun_4(return, #vst{current=#st{numy=none}}=Vst) ->
+valfun_4(return, Vst) ->
assert_durable_term({x,0}, Vst),
+ verify_return(Vst),
kill_state(Vst);
-valfun_4(return, #vst{current=#st{numy=NumY}}) ->
- error({stack_frame,NumY});
valfun_4({loop_rec,{f,Fail},Dst}, Vst) ->
%% This term may not be part of the root set until remove_message/0 is
%% executed. If control transfers to the loop_rec_end/1 instruction, no
@@ -780,13 +799,17 @@ valfun_4({wait,_}, Vst) ->
verify_y_init(Vst),
kill_state(Vst);
valfun_4({wait_timeout,_,Src}, Vst) ->
+ %% Note that the receive marker is not cleared since we may re-enter the
+ %% loop while waiting. If we time out we'll be transferred to a timeout
+ %% instruction that clears the marker.
assert_term(Src, Vst),
verify_y_init(Vst),
prune_x_regs(0, Vst);
valfun_4({loop_rec_end,_}, Vst) ->
verify_y_init(Vst),
kill_state(Vst);
-valfun_4(timeout, Vst) ->
+valfun_4(timeout, Vst0) ->
+ Vst = set_receive_marker(none, Vst0),
prune_x_regs(0, Vst);
valfun_4(send, Vst) ->
call(send, 2, Vst);
@@ -1119,6 +1142,33 @@ verify_put_map(Op, Fail, Src, Dst, Live, List, Vst0) ->
create_term(map, Op, [Src], Dst, SuccVst, SuccVst0)
end).
+
+%%
+%% Common code for validating returns, whether naked or as part of a tail call.
+%%
+
+verify_return(#vst{current=#st{numy=NumY}}) when NumY =/= none ->
+ error({stack_frame,NumY});
+verify_return(#vst{current=#st{recv_marker=Mark}}) when Mark =/= none ->
+ %% If the receive marker has not been cleared upon function return it may
+ %% taint a completely unrelated receive. Note that the marker does not need
+ %% to be committed to cause problems. Consider the following:
+ %%
+ %% foo() ->
+ %% %% recv_mark
+ %% A = make_ref(),
+ %% bar(),
+ %% %% recv_set
+ %% receive A -> ok end.
+ %%
+ %% If bar/1 were to return with an initialized marker, the recv_set could
+ %% refer to a position *after* `A = make_ref()`, making the receive skip
+ %% the message.
+ error({return_with_receive_marker,Mark});
+verify_return(Vst) ->
+ verify_no_ct(Vst),
+ ok.
+
%%
%% Common code for validating bs_start_match* instructions.
%%
@@ -1232,7 +1282,10 @@ tail_call(Name, Live, Vst0) ->
verify_y_init(Vst0),
Vst = deallocate(Vst0),
verify_call_args(Name, Live, Vst),
- verify_no_ct(Vst),
+ case call_return_type(Name, Vst0) of
+ exception -> verify_no_ct(Vst);
+ _ -> verify_return(Vst)
+ end,
kill_state(Vst).
verify_call_args(_, 0, #vst{}) ->
@@ -2382,9 +2435,12 @@ merge_states(L, St, Branched, Counter) when L =/= 0 ->
merge_states_1(St, OtherSt, Counter)
end.
-merge_states_1(#st{xs=XsA,ys=YsA,vs=VsA,fragile=FragA,numy=NumYA,h=HA,ct=CtA},
- #st{xs=XsB,ys=YsB,vs=VsB,fragile=FragB,numy=NumYB,h=HB,ct=CtB},
- Counter0) ->
+merge_states_1(StA, StB, Counter0) ->
+ #st{xs=XsA,ys=YsA,vs=VsA,fragile=FragA,numy=NumYA,
+ h=HA,ct=CtA,recv_marker=MarkerA} = StA,
+ #st{xs=XsB,ys=YsB,vs=VsB,fragile=FragB,numy=NumYB,
+ h=HB,ct=CtB,recv_marker=MarkerB} = StB,
+
%% When merging registers we drop all registers that aren't defined in both
%% states, and resolve conflicts by creating new values (similar to phi
%% nodes in SSA).
@@ -2397,11 +2453,13 @@ merge_states_1(#st{xs=XsA,ys=YsA,vs=VsA,fragile=FragA,numy=NumYA,h=HA,ct=CtA},
{Ys, Merge, Counter} = merge_regs(YsA, YsB, Merge0, Counter1),
Vs = merge_values(Merge, VsA, VsB),
+ Marker = merge_receive_marker(MarkerA, MarkerB),
Fragile = merge_fragility(FragA, FragB),
NumY = merge_stk(NumYA, NumYB),
Ct = merge_ct(CtA, CtB),
- St = #st{xs=Xs,ys=Ys,vs=Vs,fragile=Fragile,numy=NumY,h=min(HA, HB),ct=Ct},
+ St = #st{xs=Xs,ys=Ys,vs=Vs,fragile=Fragile,numy=NumY,
+ h=min(HA, HB),ct=Ct,recv_marker=Marker},
{St, Counter}.
%% Merges the contents of two register maps, returning the updated "merge map"
@@ -2506,6 +2564,18 @@ mv_args([], _VsA, _VsB, Acc) ->
merge_fragility(FragileA, FragileB) ->
cerl_sets:union(FragileA, FragileB).
+merge_receive_marker(Same, Same) ->
+ Same;
+merge_receive_marker(none, initialized) ->
+ %% Committing a cleared receive marker is harmless, so it's okay to
+ %% recv_set if we're clear on one path (e.g. leaving a catch block) and
+ %% initialized on another (leaving the happy path).
+ initialized;
+merge_receive_marker(initialized, none) ->
+ initialized;
+merge_receive_marker(_, _) ->
+ undecided.
+
merge_stk(S, S) -> S;
merge_stk(_, _) -> undecided.
@@ -2598,15 +2668,49 @@ eat_heap_float(#vst{current=#st{hf=HeapFloats0}=St}=Vst) ->
Vst#vst{current=St#st{hf=HeapFloats}}
end.
-%%% FRAGILITY
%%%
-%%% The loop_rec/2 instruction may return a reference to a term that is not
-%%% part of the root set. That term or any part of it must not be included in a
-%%% garbage collection. Therefore, the term (or any part of it) must not be
-%%% passed to another function, placed in another term, or live in a Y register
-%%% over an instruction that may GC.
+%%% RECEIVE
%%%
-%%% Fragility is marked on a per-register (rather than per-value) basis.
+
+%% When the compiler knows that a message it's matching in a receive can't
+%% exist before a certain point (e.g. it matches a newly created ref), it can
+%% emit a recv_mark/recv_set pair to tell the next loop_rec where to start
+%% looking.
+%%
+%% Since this affects the next loop_rec instruction it's very important that we
+%% properly exit the receive loop the mark is intended for, either through
+%% timing out or matching a message. Should we return from the function or
+%% enter a different receive loop, we risk skipping messages that should have
+%% been matched.
+set_receive_marker(New, #vst{current=#st{recv_marker=Current}=St0}=Vst) ->
+ case {Current, New} of
+ {none, initialized} ->
+ %% ??? -> recv_mark
+ ok;
+ {initialized, committed} ->
+ %% recv_mark -> recv_set
+ ok;
+ {none, committed} ->
+ %% ??? -> recv_set
+ %%
+ %% The marker has likely been killed by a 'catch_end'. This could
+ %% be an error but we'll ignore it for now.
+ ok;
+ {_, none} ->
+ ok;
+ {_, _} ->
+ error({invalid_receive_marker_change, Current, New})
+ end,
+ St = St0#st{recv_marker=New},
+ Vst#vst{current=St}.
+
+%% The loop_rec/2 instruction may return a reference to a term that is not
+%% part of the root set. That term or any part of it must not be included in a
+%% garbage collection. Therefore, the term (or any part of it) must not be
+%% passed to another function, placed in another term, or live in a Y register
+%% over an instruction that may GC.
+%%
+%% Fragility is marked on a per-register (rather than per-value) basis.
%% Marks Reg as fragile.
mark_fragile(Reg, Vst) ->
diff --git a/lib/compiler/src/compile.erl b/lib/compiler/src/compile.erl
index 0325c714d0..fd5233d379 100644
--- a/lib/compiler/src/compile.erl
+++ b/lib/compiler/src/compile.erl
@@ -333,7 +333,7 @@ format_error({bad_return,Pass,Reason}) ->
format_error({module_name,Mod,Filename}) ->
io_lib:format("Module name '~s' does not match file name '~ts'", [Mod,Filename]);
format_error(reparsing_invalid_unicode) ->
- "Non-UTF-8 character(s) detected, but no encoding declared. Encode the file in UTF-8 or add \"%% coding: latin-1\" at the beginning of the file. Retrying with latin-1 encoding.".
+ "Non-UTF-8 character(s) detected, but no encoding declared. Encode the file in UTF-8 or add \"%% coding: latin-1\" at the beginning of the file. Note: The compiler will remove support for latin-1 encoded source files without the \"%% coding: latin-1\" string at the beginning of the file in Erlang/OTP 24! Retrying with latin-1 encoding.".
format_error_reason({Reason, Stack}) when is_list(Stack) ->
StackFun = fun
@@ -597,7 +597,7 @@ passes_1([]) ->
{".erl",[?pass(parse_module)|standard_passes()]}.
pass(from_core) ->
- {".core",[?pass(parse_core)|core_passes()]};
+ {".core",[?pass(parse_core)|core_passes(mandatory_core_lint)]};
pass(from_asm) ->
{".S",[?pass(beam_consult_asm)|asm_passes()]};
pass(from_beam) ->
@@ -795,11 +795,17 @@ standard_passes() ->
?pass(core),
{iff,'dcore',{listing,"core"}},
{iff,'to_core0',{done,"core"}}
- | core_passes()].
+ | core_passes(optional_core_lint)].
-core_passes() ->
+core_passes(LintOpt) ->
%% Optimization and transforms of Core Erlang code.
- [{iff,clint0,?pass(core_lint_module)},
+ CoreLint = case LintOpt of
+ mandatory_core_lint ->
+ ?pass(core_lint_module);
+ optional_core_lint ->
+ {iff,clint0,?pass(core_lint_module)}
+ end,
+ [CoreLint,
{delay,
[{unless,no_copt,
[{core_old_inliner,fun test_old_inliner/1,fun core_old_inliner/2},
diff --git a/lib/compiler/src/v3_kernel.erl b/lib/compiler/src/v3_kernel.erl
index e2b8787224..bcdc59699b 100644
--- a/lib/compiler/src/v3_kernel.erl
+++ b/lib/compiler/src/v3_kernel.erl
@@ -1301,51 +1301,82 @@ pattern_list(Ces, Isub, Osub, St) ->
%% set_vsub(Name, Sub, Subs) -> Subs.
%% subst_vsub(Name, Sub, Subs) -> Subs.
%% get_vsub(Name, Subs) -> SubName.
-%% Add/get substitute Sub for Name to VarSub. Use orddict so we know
-%% the format is a list {Name,Sub} pairs. When adding a new
-%% substitute we fold substitute chains so we never have to search
-%% more than once.
+%% Add/get substitute Sub for Name to VarSub.
+%%
+%% We're using a many-to-one bimap so we can rename all references to a
+%% variable without having to scan through all of them, which can cause
+%% compile times to explode (see record_SUITE:slow_compilation/1).
+
+new_sub() -> {#{}, #{}}.
+
+get_vsub(Key, Subs) ->
+ bimap_get(Key, Subs, Key).
+
+get_fsub(Name, Arity, Subs) ->
+ bimap_get({Name, Arity}, Subs, Name).
+
+set_vsub(Same, Same, Subs) ->
+ Subs;
+set_vsub(Key, Val, Subs) ->
+ bimap_set(Key, Val, Subs).
+
+set_fsub(Name, Arity, Val, Subs) ->
+ set_vsub({Name, Arity}, Val, Subs).
-new_sub() -> orddict:new().
+subst_vsub(Key, Val, Subs) ->
+ bimap_rename(Key, Val, Subs).
-get_vsub(V, Vsub) ->
- case orddict:find(V, Vsub) of
- {ok,Val} -> Val;
- error -> V
+bimap_get(Key, {Map, _InvMap}, Default) ->
+ case Map of
+ #{ Key := Val } -> Val;
+ _ -> Default
end.
-set_vsub(V, S, Vsub) ->
- orddict:store(V, S, Vsub).
-
-subst_vsub(Key, New, Vsub) ->
- orddict:from_list(subst_vsub_1(Key, New, Vsub)).
-
-subst_vsub_1(Key, New, [{K,Key}|Dict]) ->
- %% Fold chained substitution.
- [{K,New}|subst_vsub_1(Key, New, Dict)];
-subst_vsub_1(Key, New, [{K,_}|_]=Dict) when Key < K ->
- %% Insert the new substitution here, and continue
- %% look for chained substitutions.
- [{Key,New}|subst_vsub_2(Key, New, Dict)];
-subst_vsub_1(Key, New, [{K,_}=E|Dict]) when Key > K ->
- [E|subst_vsub_1(Key, New, Dict)];
-subst_vsub_1(Key, New, []) -> [{Key,New}].
-
-subst_vsub_2(V, S, [{K,V}|Dict]) ->
- %% Fold chained substitution.
- [{K,S}|subst_vsub_2(V, S, Dict)];
-subst_vsub_2(V, S, [E|Dict]) ->
- [E|subst_vsub_2(V, S, Dict)];
-subst_vsub_2(_, _, []) -> [].
-
-get_fsub(F, A, Fsub) ->
- case orddict:find({F,A}, Fsub) of
- {ok,Val} -> Val;
- error -> F
+%% Maps Key to Val without touching existing references to Key.
+bimap_set(Key, Val, {Map0, InvMap0}) ->
+ InvMap = bm_update_inv_lookup(Key, Val, Map0, InvMap0),
+ Map = Map0#{ Key => Val },
+ {Map, InvMap}.
+
+bm_update_inv_lookup(Key, Val, Map, InvMap0) ->
+ InvMap = bm_cleanup_inv_lookup(Key, Map, InvMap0),
+ case InvMap of
+ #{ Val := Keys } ->
+ %% Other keys map to the same value, add ours to the set.
+ InvMap#{ Val := ordsets:add_element(Key, Keys) };
+ #{} ->
+ InvMap#{ Val => [Key] }
end.
-set_fsub(F, A, S, Fsub) ->
- orddict:store({F,A}, S, Fsub).
+bm_cleanup_inv_lookup(Key, Map, InvMap) when is_map_key(Key, Map) ->
+ #{ Key := Old } = Map,
+ case InvMap of
+ #{ Old := [Key] } ->
+ maps:remove(Old, InvMap);
+ #{ Old := [_|_]=Keys } ->
+ InvMap#{ Old := ordsets:del_element(Key, Keys) }
+ end;
+bm_cleanup_inv_lookup(_Key, _Map, InvMap) ->
+ InvMap.
+
+%% Maps Key to Val, and replaces all existing references to Key with Val.
+bimap_rename(Key, Val, {Map0, InvMap0}) when is_map_key(Key, InvMap0) ->
+ Keys = map_get(Key, InvMap0),
+
+ Map1 = Map0#{ Key => Val },
+ Map = bimap_update_lookup(Keys, Val, Map1),
+
+ InvMap1 = maps:remove(Key, InvMap0),
+ InvMap = InvMap1#{ Val => ordsets:add_element(Key, Keys) },
+
+ {Map, InvMap};
+bimap_rename(Key, Val, Subs) ->
+ bimap_set(Key, Val, Subs).
+
+bimap_update_lookup([Key | Keys], Val, Map) ->
+ bimap_update_lookup(Keys, Val, Map#{ Key := Val });
+bimap_update_lookup([], _Val, Map) ->
+ Map.
new_fun_name(St) ->
new_fun_name("anonymous", St).
diff --git a/lib/compiler/test/beam_validator_SUITE.erl b/lib/compiler/test/beam_validator_SUITE.erl
index 20f6cb2691..fe20fad500 100644
--- a/lib/compiler/test/beam_validator_SUITE.erl
+++ b/lib/compiler/test/beam_validator_SUITE.erl
@@ -35,7 +35,8 @@
map_field_lists/1,cover_bin_opt/1,
val_dsetel/1,bad_tuples/1,bad_try_catch_nesting/1,
receive_stacked/1,aliased_types/1,type_conflict/1,
- infer_on_eq/1,infer_dead_value/1]).
+ infer_on_eq/1,infer_dead_value/1,
+ receive_marker/1]).
-include_lib("common_test/include/ct.hrl").
@@ -65,7 +66,7 @@ groups() ->
map_field_lists,cover_bin_opt,val_dsetel,
bad_tuples,bad_try_catch_nesting,
receive_stacked,aliased_types,type_conflict,
- infer_on_eq,infer_dead_value]}].
+ infer_on_eq,infer_dead_value,receive_marker]}].
init_per_suite(Config) ->
test_lib:recompile(?MODULE),
@@ -722,6 +723,18 @@ idv_2(State) ->
idv_called_once(_State) -> ok.
+receive_marker(Config) when is_list(Config) ->
+ Errors = do_val(receive_marker, Config),
+
+ [{{receive_marker,t1,1},
+ {return,_,
+ {return_with_receive_marker,committed}}},
+ {{receive_marker,t2,1},
+ {{call_last,1,{f,2},1},_,
+ {return_with_receive_marker,committed}}}] = Errors,
+
+ ok.
+
%%%-------------------------------------------------------------------------
transform_remove(Remove, Module) ->
diff --git a/lib/compiler/test/beam_validator_SUITE_data/receive_marker.S b/lib/compiler/test/beam_validator_SUITE_data/receive_marker.S
new file mode 100644
index 0000000000..2b7bf2c94f
--- /dev/null
+++ b/lib/compiler/test/beam_validator_SUITE_data/receive_marker.S
@@ -0,0 +1,116 @@
+{module, receive_marker}. %% version = 0
+
+{exports, [{t1,1},{t2,1},{t3,1}]}.
+
+{attributes, []}.
+
+{labels, 16}.
+
+{function, t1, 1, 2}.
+ {label,1}.
+ {line,[{location,"receive_marker.S",0}]}.
+ {func_info,{atom,receive_marker},{atom,t1},1}.
+ {label,2}.
+ {allocate,1,1}.
+ {move,{x,0},{y,0}}.
+ {recv_mark,{f,3}}.
+ {call_ext,0,{extfunc,erlang,make_ref,0}}.
+ {test_heap,3,1}.
+ {put_tuple2,{x,1},{list,[{atom,hello},{x,0}]}}.
+ {move,{y,0},{x,2}}.
+ {move,{x,0},{y,0}}.
+ {move,{x,2},{x,0}}.
+ {line,[{location,"receive_marker.S",0}]}.
+ send.
+ {recv_set,{f,3}}.
+ {label,3}.
+ {loop_rec,{f,5},{x,0}}.
+ {test,is_tagged_tuple,{f,4},[{x,0},3,{atom,reply}]}.
+ {get_tuple_element,{x,0},1,{x,1}}.
+ {test,is_eq_exact,{f,4},[{x,1},{y,0}]}.
+ {test_heap,3,1}.
+ {get_tuple_element,{x,0},2,{x,0}}.
+ remove_message.
+ {put_tuple2,{x,0},{list,[{atom,foo},{x,0}]}}.
+ {deallocate,1}.
+ return.
+ {label,4}.
+ {loop_rec_end,{f,3}}.
+ {label,5}.
+ %% timeout instruction missing on return.
+ {move,{atom,timeout},{x,0}}.
+ {deallocate,1}.
+ return.
+
+{function, t2, 1, 7}.
+ {label,6}.
+ {line,[{location,"receive_marker.S",0}]}.
+ {func_info,{atom,receive_marker},{atom,t2},1}.
+ {label,7}.
+ {allocate,1,1}.
+ {move,{x,0},{y,0}}.
+ {recv_mark,{f,8}}.
+ {call_ext,0,{extfunc,erlang,make_ref,0}}.
+ {test_heap,3,1}.
+ {put_tuple2,{x,1},{list,[{atom,hello},{x,0}]}}.
+ {move,{y,0},{x,2}}.
+ {move,{x,0},{y,0}}.
+ {move,{x,2},{x,0}}.
+ {line,[{location,"receive_marker.S",0}]}.
+ send.
+ {recv_set,{f,8}}.
+ {label,8}.
+ {loop_rec,{f,10},{x,0}}.
+ {test,is_tagged_tuple,{f,9},[{x,0},3,{atom,reply}]}.
+ {get_tuple_element,{x,0},1,{x,1}}.
+ {test,is_eq_exact,{f,9},[{x,1},{y,0}]}.
+ {test_heap,3,1}.
+ {get_tuple_element,{x,0},2,{x,0}}.
+ remove_message.
+ {put_tuple2,{x,0},{list,[{atom,foo},{x,0}]}}.
+ {deallocate,1}.
+ return.
+ {label,9}.
+ {loop_rec_end,{f,8}}.
+ {label,10}.
+ %% timeout instruction missing on tail call
+ {move,{atom,timeout},{x,0}}.
+ {call_last,1,{f,2},1}.
+
+{function, t3, 1, 12}.
+ {label,11}.
+ {line,[{location,"receive_marker.S",0}]}.
+ {func_info,{atom,receive_marker},{atom,t3},1}.
+ {label,12}.
+ {allocate,1,1}.
+ {move,{x,0},{y,0}}.
+ %% This recv_mark lacks a corresponding recv_set. This is *not* an error as
+ %% long as we pass through a remove_message or timeout instruction before
+ %% returning.
+ {recv_mark,{f,13}}.
+ {call_ext,0,{extfunc,erlang,make_ref,0}}.
+ {test_heap,3,1}.
+ {put_tuple2,{x,1},{list,[{atom,hello},{x,0}]}}.
+ {move,{y,0},{x,2}}.
+ {move,{x,0},{y,0}}.
+ {move,{x,2},{x,0}}.
+ {line,[{location,"receive_marker.S",0}]}.
+ send.
+ {label,13}.
+ {loop_rec,{f,15},{x,0}}.
+ {test,is_tagged_tuple,{f,14},[{x,0},3,{atom,reply}]}.
+ {get_tuple_element,{x,0},1,{x,1}}.
+ {test,is_eq_exact,{f,14},[{x,1},{y,0}]}.
+ {test_heap,3,1}.
+ {get_tuple_element,{x,0},2,{x,0}}.
+ remove_message.
+ {put_tuple2,{x,0},{list,[{atom,foo},{x,0}]}}.
+ {deallocate,1}.
+ return.
+ {label,14}.
+ {loop_rec_end,{f,13}}.
+ {label,15}.
+ timeout.
+ {move,{atom,timeout},{x,0}}.
+ {deallocate,1}.
+ return.
diff --git a/lib/compiler/test/core_SUITE_data/fun_letrec_effect.core b/lib/compiler/test/core_SUITE_data/fun_letrec_effect.core
index ab6f5b7940..b58077bf02 100644
--- a/lib/compiler/test/core_SUITE_data/fun_letrec_effect.core
+++ b/lib/compiler/test/core_SUITE_data/fun_letrec_effect.core
@@ -1,4 +1,4 @@
-module 'fun_letrec_effect' ['fun_letrec_effect'/0, 'ok'/0, 'wat'/0]
+module 'fun_letrec_effect' ['fun_letrec_effect'/0, 'wat'/0]
attributes []
'fun_letrec_effect'/0 =
diff --git a/lib/compiler/test/guard_SUITE.erl b/lib/compiler/test/guard_SUITE.erl
index cea7a374cd..a61c56e331 100644
--- a/lib/compiler/test/guard_SUITE.erl
+++ b/lib/compiler/test/guard_SUITE.erl
@@ -41,7 +41,7 @@
suite() -> [{ct_hooks,[ts_install_cth]}].
all() ->
- [{group,p}].
+ slow_group() ++ [{group,p}].
groups() ->
[{p,[parallel],
@@ -52,10 +52,11 @@ groups() ->
old_guard_tests,complex_guard,gbif,
t_is_boolean,is_function_2,tricky,
rel_ops,rel_op_combinations,
- literal_type_tests,basic_andalso_orelse,traverse_dcd,
+ basic_andalso_orelse,traverse_dcd,
check_qlc_hrl,andalso_semi,t_tuple_size,binary_part,
bad_constants,bad_guards,guard_in_catch,beam_bool_SUITE,
- repeated_type_tests]}].
+ repeated_type_tests]},
+ {slow,[],[literal_type_tests]}].
init_per_suite(Config) ->
test_lib:recompile(?MODULE),
@@ -70,6 +71,15 @@ init_per_group(_GroupName, Config) ->
end_per_group(_GroupName, Config) ->
Config.
+slow_group() ->
+ case ?MODULE of
+ guard_SUITE ->
+ %% Canononical module name. Run slow cases.
+ [{group,slow}];
+ _ ->
+ %% Cloned module. Don't run.
+ []
+ end.
misc(Config) when is_list(Config) ->
42 = case id(42) of
@@ -1581,12 +1591,6 @@ redundant_12(_) -> none.
%% Test type tests on literal values. (From emulator test suites.)
literal_type_tests(Config) when is_list(Config) ->
- case ?MODULE of
- guard_SUITE -> literal_type_tests_1(Config);
- _ -> {skip,"Enough to run this case once."}
- end.
-
-literal_type_tests_1(Config) ->
%% Generate an Erlang module with all different type of type tests.
Tests = make_test([{T,L} || T <- type_tests(), L <- literals()] ++
[{is_function,L1,L2} ||
diff --git a/lib/compiler/test/misc_SUITE.erl b/lib/compiler/test/misc_SUITE.erl
index a0b415ceaa..6e81bafd61 100644
--- a/lib/compiler/test/misc_SUITE.erl
+++ b/lib/compiler/test/misc_SUITE.erl
@@ -61,12 +61,13 @@ suite() ->
-spec all() -> misc_SUITE_test_cases().
all() ->
- [{group,p}].
+ slow_group() ++ [{group,p}].
groups() ->
- [{p,[],
- [tobias,empty_string,md5,silly_coverage,
- confused_literals,integer_encoding,override_bif]}].
+ [{p,[parallel],
+ [tobias,empty_string,silly_coverage,
+ confused_literals,override_bif]},
+ {slow,[parallel],[integer_encoding,md5]}].
init_per_suite(Config) ->
test_lib:recompile(?MODULE),
@@ -81,8 +82,16 @@ init_per_group(_GroupName, Config) ->
end_per_group(_GroupName, Config) ->
Config.
-
-
+slow_group() ->
+ case ?MODULE of
+ misc_SUITE ->
+ %% Canononical module name. Run slow cases.
+ [{group,slow}];
+ _ ->
+ %% Cloned module. Don't run.
+ []
+ end.
+
%%
%% Functions that override new and old bif's
%%
@@ -142,12 +151,6 @@ empty_string_1(T) ->
end.
md5(Config) when is_list(Config) ->
- case ?MODULE of
- misc_SUITE -> md5();
- _ -> {skip,"Enough to run this case once."}
- end.
-
-md5() ->
Dir = filename:dirname(code:which(?MODULE)),
Beams = filelib:wildcard(filename:join(Dir, "*.beam")),
io:format("Found ~w beam files", [length(Beams)]),
@@ -334,12 +337,6 @@ integer_encoding() ->
[{timetrap,{minutes,4}}].
integer_encoding(Config) when is_list(Config) ->
- case ?MODULE of
- misc_SUITE -> integer_encoding_1(Config);
- _ -> {skip,"Enough to run this case once."}
- end.
-
-integer_encoding_1(Config) ->
PrivDir = proplists:get_value(priv_dir, Config),
SrcFile = filename:join(PrivDir, "misc_SUITE_integer_encoding.erl"),
DataFile = filename:join(PrivDir, "integer_encoding.data"),
diff --git a/lib/compiler/test/receive_SUITE.erl b/lib/compiler/test/receive_SUITE.erl
index 8cd864c59e..db84d16b06 100644
--- a/lib/compiler/test/receive_SUITE.erl
+++ b/lib/compiler/test/receive_SUITE.erl
@@ -26,7 +26,8 @@
init_per_testcase/2,end_per_testcase/2,
export/1,recv/1,coverage/1,otp_7980/1,ref_opt/1,
wait/1,recv_in_try/1,double_recv/1,receive_var_zero/1,
- match_built_terms/1,elusive_common_exit/1]).
+ match_built_terms/1,elusive_common_exit/1,
+ return_before_receive/1,trapping/1]).
-include_lib("common_test/include/ct.hrl").
@@ -41,14 +42,15 @@ suite() ->
{timetrap,{minutes,2}}].
all() ->
- [{group,p}].
+ slow_group() ++ [{group,p}].
groups() ->
[{p,test_lib:parallel(),
- [recv,coverage,otp_7980,ref_opt,export,wait,
+ [recv,coverage,otp_7980,export,wait,
recv_in_try,double_recv,receive_var_zero,
- match_built_terms,elusive_common_exit]}].
-
+ match_built_terms,elusive_common_exit,
+ return_before_receive,trapping]},
+ {slow,[],[ref_opt]}].
init_per_suite(Config) ->
test_lib:recompile(?MODULE),
@@ -63,6 +65,16 @@ init_per_group(_GroupName, Config) ->
end_per_group(_GroupName, Config) ->
Config.
+slow_group() ->
+ case ?MODULE of
+ receive_SUITE ->
+ %% Canononical module name. Run slow cases.
+ [{group,slow}];
+ _ ->
+ %% Cloned module. Don't run.
+ []
+ end.
+
-record(state, {ena = true}).
recv(Config) when is_list(Config) ->
@@ -190,12 +202,6 @@ otp_7980_add_clients(Count) ->
end, Count, [1,2,3]).
ref_opt(Config) when is_list(Config) ->
- case ?MODULE of
- receive_SUITE -> ref_opt_1(Config);
- _ -> {skip,"Enough to run this case once."}
- end.
-
-ref_opt_1(Config) ->
DataDir = proplists:get_value(data_dir, Config),
PrivDir = proplists:get_value(priv_dir, Config),
Sources = filelib:wildcard(filename:join([DataDir,"ref_opt","*.{erl,S}"])),
@@ -484,4 +490,55 @@ elusive2(Acc) ->
%% Common code.
elusive2([Pid | Acc]).
+return_before_receive(_Config) ->
+ ref_received = do_return_before_receive(),
+ ok.
+
+do_return_before_receive() ->
+ Ref = make_ref(),
+ self() ! {ref,Ref},
+ maybe_receive(id(false)),
+ receive
+ {ref,Ref} ->
+ ref_received
+ after 1 ->
+ %% Can only be reached if maybe_receive/1 returned
+ %% with the receive marker set.
+ timeout
+ end.
+
+maybe_receive(Bool) ->
+ NewRef = make_ref(),
+ case Bool of
+ true ->
+ receive
+ NewRef ->
+ ok
+ end;
+ false ->
+ %% The receive marker must not be set when
+ %% leaving this function.
+ ok
+ end.
+
+trapping(_Config) ->
+ ok = do_trapping(0),
+ ok = do_trapping(1),
+ ok.
+
+%% Simplified from emulator's binary_SUITE:trapping/1.
+do_trapping(N) ->
+ Ref = make_ref(),
+ self() ! Ref,
+ case N rem 2 of
+ 0 ->
+ %% Would generate recv_set _, label _, wait_timeout _ _,
+ %% which the loader can't handle.
+ receive after 1 -> ok end;
+ 1 ->
+ void
+ end,
+ receive Ref -> ok end,
+ receive after 1 -> ok end.
+
id(I) -> I.
diff --git a/lib/compiler/test/receive_SUITE_data/ref_opt/no_6.erl b/lib/compiler/test/receive_SUITE_data/ref_opt/no_6.erl
new file mode 100644
index 0000000000..970ad132a4
--- /dev/null
+++ b/lib/compiler/test/receive_SUITE_data/ref_opt/no_6.erl
@@ -0,0 +1,26 @@
+-module(no_6).
+-export([?MODULE/0]).
+
+?MODULE() ->
+ ok = return_before_receive(ok),
+ ok = return_before_receive(ok),
+ {error, whatever} = return_before_receive(error),
+ ok.
+
+return_before_receive(Cmd) ->
+ RecvRef = make_ref(),
+ case value(Cmd, RecvRef) of
+ ok ->
+ ok;
+ {error, eagain} ->
+ receive
+ {abort, {RecvRef, Reason}} ->
+ {error, Reason}
+ end
+ end.
+
+value(error, Ref) ->
+ self() ! {abort, {Ref, whatever}},
+ {error, eagain};
+value(ok, _Ref) ->
+ ok.
diff --git a/lib/compiler/test/receive_SUITE_data/ref_opt/yes_15.erl b/lib/compiler/test/receive_SUITE_data/ref_opt/yes_15.erl
new file mode 100644
index 0000000000..99cee24bda
--- /dev/null
+++ b/lib/compiler/test/receive_SUITE_data/ref_opt/yes_15.erl
@@ -0,0 +1,19 @@
+-module(yes_15).
+-export([?MODULE/0,do_multi_call/0]).
+
+?MODULE() ->
+ ok.
+
+do_multi_call() ->
+ %% The calls to make_ref/0 and erlang:monitor/2 will be
+ %% in the same block.
+ Tag = make_ref(),
+ Receiver = spawn(fun() -> ok end),
+ Mref = erlang:monitor(process, Receiver),
+ Receiver ! {self(),Tag},
+ receive
+ {'DOWN',Mref,_,_,{_Receiver,Tag,Result}} ->
+ Result;
+ {'DOWN',Mref,_,_,Reason} ->
+ exit(Reason)
+ end.
diff --git a/lib/compiler/test/receive_SUITE_data/ref_opt/yes_16.erl b/lib/compiler/test/receive_SUITE_data/ref_opt/yes_16.erl
new file mode 100644
index 0000000000..0540eaed44
--- /dev/null
+++ b/lib/compiler/test/receive_SUITE_data/ref_opt/yes_16.erl
@@ -0,0 +1,17 @@
+-module(yes_16).
+-export([?MODULE/0,ttb_stop/1]).
+
+?MODULE() ->
+ ok.
+
+ttb_stop(MetaPid) ->
+ Delivered = erlang:trace_delivered(all),
+ receive
+ {trace_delivered,all,Delivered} -> ok
+ end,
+ %% The erlang:monitor/2 call will be in the same block
+ %% as the remove message instruction for the previous
+ %% receive.
+ Ref = erlang:monitor(process,MetaPid),
+ MetaPid ! stop,
+ receive {'DOWN', Ref, process, MetaPid, _Info} -> ok end.
diff --git a/lib/compiler/test/record_SUITE.erl b/lib/compiler/test/record_SUITE.erl
index 4ed7f39780..94804529b6 100644
--- a/lib/compiler/test/record_SUITE.erl
+++ b/lib/compiler/test/record_SUITE.erl
@@ -28,7 +28,7 @@
init_per_testcase/2,end_per_testcase/2,
errors/1,record_test_2/1,record_test_3/1,record_access_in_guards/1,
guard_opt/1,eval_once/1,foobar/1,missing_test_heap/1,
- nested_access/1,coverage/1,grab_bag/1]).
+ nested_access/1,coverage/1,grab_bag/1,slow_compilation/1]).
init_per_testcase(_Case, Config) ->
Config.
@@ -47,7 +47,8 @@ groups() ->
[{p,test_lib:parallel(),
[errors,record_test_2,record_test_3,
record_access_in_guards,guard_opt,eval_once,foobar,
- missing_test_heap,nested_access,coverage,grab_bag]}].
+ missing_test_heap,nested_access,coverage,grab_bag,
+ slow_compilation]}].
init_per_suite(Config) ->
@@ -655,6 +656,50 @@ grab_bag(_Config) ->
ok.
+%% ERIERL-436; the following code used to be very slow to compile.
+%%
+%% #slow_r{} should have about 4x as many fields for the test to be effective
+%% (all of them matched in slow_compilation/1), but unfortunately the memory
+%% use scales together with the speed so we'll run out of memory on many of
+%% our test machines before we reach noticeable levels (2+ minutes before the
+%% fix).
+%%
+%% We've therefore scaled it down to the current level, at least it it'll guard
+%% against excessive regressions.
+
+-record(slow_r,
+ {f0, f1, f2, f3, f4, f5, f6, f7, f8, f9,
+ f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,
+ f20,f21,f22,f23,f24,f25,f26,f27,f28,f29,
+ f30,f31,f32,f33,f34,f35,f36,f37,f38,f39,
+ f40,f41,f42,f43,f44,f45,f46,f47,f48,f49,
+ f50,f51,f52,f53,f54,f55,f56,f57,f58,f59}).
+
+slow_compilation(Config) when is_list(Config) ->
+ R = id(#slow_r{}),
+
+ [{f0,R#slow_r.f0},{f1,R#slow_r.f0},{f1,R#slow_r.f1},
+ {f2,R#slow_r.f2},{f3,R#slow_r.f3},{f4,R#slow_r.f4},
+ {f5,R#slow_r.f5},{f6,R#slow_r.f6},{f7,R#slow_r.f7},
+ {f8,R#slow_r.f8},{f9,R#slow_r.f9},{f10,R#slow_r.f10},
+ {f11,R#slow_r.f11},{f12,R#slow_r.f12},{f13,R#slow_r.f13},
+ {f14,R#slow_r.f14},{f15,R#slow_r.f15},{f16,R#slow_r.f16},
+ {f17,R#slow_r.f17},{f18,R#slow_r.f18},{f19,R#slow_r.f19},
+ {f20,R#slow_r.f20},{f21,R#slow_r.f21},{f22,R#slow_r.f22},
+ {f23,R#slow_r.f23},{f24,R#slow_r.f24},{f25,R#slow_r.f25},
+ {f26,R#slow_r.f26},{f27,R#slow_r.f27},{f28,R#slow_r.f28},
+ {f29,R#slow_r.f29},{f30,R#slow_r.f30},{f31,R#slow_r.f31},
+ {f32,R#slow_r.f32},{f33,R#slow_r.f33},{f34,R#slow_r.f34},
+ {f35,R#slow_r.f35},{f36,R#slow_r.f36},{f37,R#slow_r.f37},
+ {f38,R#slow_r.f38},{f39,R#slow_r.f39},{f40,R#slow_r.f40},
+ {f41,R#slow_r.f41},{f42,R#slow_r.f42},{f43,R#slow_r.f43},
+ {f44,R#slow_r.f44},{f45,R#slow_r.f45},{f46,R#slow_r.f46},
+ {f47,R#slow_r.f47},{f48,R#slow_r.f48},{f49,R#slow_r.f49},
+ {f40,R#slow_r.f50},{f51,R#slow_r.f51},{f52,R#slow_r.f52},
+ {f53,R#slow_r.f53},{f54,R#slow_r.f54},{f55,R#slow_r.f55},
+ {f56,R#slow_r.f56},{f57,R#slow_r.f57},{f58,R#slow_r.f58},
+ {f59,R#slow_r.f59}].
+
first_arg(First, _) -> First.
id(I) -> I.
diff --git a/lib/compiler/vsn.mk b/lib/compiler/vsn.mk
index 9661f4388e..a19cee1ae2 100644
--- a/lib/compiler/vsn.mk
+++ b/lib/compiler/vsn.mk
@@ -1 +1 @@
-COMPILER_VSN = 7.4.7
+COMPILER_VSN = 7.4.9
diff --git a/lib/crypto/c_src/aead.c b/lib/crypto/c_src/aead.c
index ab0e609130..6bb449a986 100644
--- a/lib/crypto/c_src/aead.c
+++ b/lib/crypto/c_src/aead.c
@@ -118,17 +118,19 @@ ERL_NIF_TERM aead_cipher(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{ret = EXCP_BADARG(env, "Can't set text size"); goto done;}
} else
#endif
- {
+ { /* GCM_MODE or CHACHA20_POLY1305 */
+ /* Set key and iv */
if (EVP_CipherInit_ex(ctx, NULL, NULL, key.data, iv.data, -1) != 1)
{ret = EXCP_BADARG(env, "Can't set key or iv"); goto done;}
}
+ /* Set the AAD */
if (EVP_CipherUpdate(ctx, NULL, &len, aad.data, (int)aad.size) != 1)
{ret = EXCP_BADARG(env, "Can't set AAD"); goto done;}
+ /* Set the plain text and get the crypto text (or vice versa :) ) */
if ((outp = enif_make_new_binary(env, in.size, &out)) == NULL)
{ret = EXCP_ERROR(env, "Can't make 'Out' binary"); goto done;}
-
if (EVP_CipherUpdate(ctx, outp, &len, in.data, (int)in.size) != 1)
{
if (encflg)
@@ -141,29 +143,34 @@ ERL_NIF_TERM aead_cipher(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
if (encflg)
{
- if (EVP_CipherFinal_ex(ctx, outp/*+len*/, &len) != 1)
+ /* Finalize the encrypted text */
+ if (EVP_CipherFinal_ex(ctx, outp, &len) != 1)
{ret = EXCP_ERROR(env, "Encrypt error"); goto done;}
+ /* Get the tag */
if ((tagp = enif_make_new_binary(env, tag_len, &out_tag)) == NULL)
{ret = EXCP_ERROR(env, "Can't make 'Out' binary"); goto done;}
-
if (EVP_CIPHER_CTX_ctrl(ctx, cipherp->extra.aead.ctx_ctrl_get_tag, (int)tag_len, tagp) != 1)
{ret = EXCP_ERROR(env, "Can't get Tag"); goto done;}
+ /* Make the return value (the tuple with binary crypto text and the tag) */
ret = enif_make_tuple2(env, out, out_tag);
}
- else
+ else /* Decrypting. The plain text is already pointed to by 'out' */
{
-#if defined(HAVE_GCM)
- if (cipherp->flags & GCM_MODE) {
+#if defined(HAVE_GCM) || defined(HAVE_CHACHA20_POLY1305)
+ /* Check the Tag before returning. CCM_MODE does this previously. */
+ if (!(cipherp->flags & CCM_MODE)) { /* That is, CHACHA20_POLY1305 or GCM_MODE */
if (EVP_CIPHER_CTX_ctrl(ctx, cipherp->extra.aead.ctx_ctrl_set_tag, (int)tag_len, tag.data) != 1)
/* Decrypt error */
{ret = atom_error; goto done;}
+ /* CCM dislikes EVP_DecryptFinal_ex on decrypting for pre 1.1.1, so we do it only here */
if (EVP_DecryptFinal_ex(ctx, outp+len, &len) != 1)
/* Decrypt error */
{ret = atom_error; goto done;}
}
#endif
+ /* Make the return value, that is, the plain text */
ret = out;
}
diff --git a/lib/crypto/c_src/cipher.c b/lib/crypto/c_src/cipher.c
index e144a891a6..5b8835f0a9 100644
--- a/lib/crypto/c_src/cipher.c
+++ b/lib/crypto/c_src/cipher.c
@@ -66,13 +66,13 @@ static struct cipher_type_t cipher_types[] =
{{"aes_192_cbc"}, {&EVP_aes_192_cbc}, 24, 0},
{{"aes_256_cbc"}, {&EVP_aes_256_cbc}, 32, 0},
- {{"aes_128_cfb8"}, {&EVP_aes_128_cfb8}, 16, NO_FIPS_CIPHER | AES_CFBx},
- {{"aes_192_cfb8"}, {&EVP_aes_192_cfb8}, 24, NO_FIPS_CIPHER | AES_CFBx},
- {{"aes_256_cfb8"}, {&EVP_aes_256_cfb8}, 32, NO_FIPS_CIPHER | AES_CFBx},
+ {{"aes_128_cfb8"}, {&EVP_aes_128_cfb8}, 16, AES_CFBx},
+ {{"aes_192_cfb8"}, {&EVP_aes_192_cfb8}, 24, AES_CFBx},
+ {{"aes_256_cfb8"}, {&EVP_aes_256_cfb8}, 32, AES_CFBx},
- {{"aes_128_cfb128"}, {&EVP_aes_128_cfb128}, 16, NO_FIPS_CIPHER | AES_CFBx},
- {{"aes_192_cfb128"}, {&EVP_aes_192_cfb128}, 24, NO_FIPS_CIPHER | AES_CFBx},
- {{"aes_256_cfb128"}, {&EVP_aes_256_cfb128}, 32, NO_FIPS_CIPHER | AES_CFBx},
+ {{"aes_128_cfb128"}, {&EVP_aes_128_cfb128}, 16, AES_CFBx},
+ {{"aes_192_cfb128"}, {&EVP_aes_192_cfb128}, 24, AES_CFBx},
+ {{"aes_256_cfb128"}, {&EVP_aes_256_cfb128}, 32, AES_CFBx},
{{"aes_128_ecb"}, {&EVP_aes_128_ecb}, 16, ECB_BUG_0_9_8L},
{{"aes_192_ecb"}, {&EVP_aes_192_ecb}, 24, ECB_BUG_0_9_8L},
diff --git a/lib/crypto/doc/src/notes.xml b/lib/crypto/doc/src/notes.xml
index e0bf845d52..e45a948a0c 100644
--- a/lib/crypto/doc/src/notes.xml
+++ b/lib/crypto/doc/src/notes.xml
@@ -31,6 +31,22 @@
</header>
<p>This document describes the changes made to the Crypto application.</p>
+<section><title>Crypto 4.6.2</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ The AEAD tag was not previously checked on decrypt with
+ chacha20_poly1305</p>
+ <p>
+ Own Id: OTP-16242 Aux Id: ERL-1078 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Crypto 4.6.1</title>
<section><title>Fixed Bugs and Malfunctions</title>
@@ -256,6 +272,30 @@
</section>
+<section><title>Crypto 4.4.2.1</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ The chipers aes_cfb8 and aes_cfb128 are now using the EVP
+ interface. The supported key lengths are 128, 192 and 256
+ bits.</p>
+ <p>
+ Own Id: OTP-16133 Aux Id: PR-2407 </p>
+ </item>
+ <item>
+ <p>
+ The chipers aes_cfb8 and aes_cfb128 are now available in
+ FIPS enabled mode.</p>
+ <p>
+ Own Id: OTP-16134 Aux Id: PR-2407 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Crypto 4.4.2</title>
<section><title>Fixed Bugs and Malfunctions</title>
@@ -546,6 +586,23 @@
</section>
+<section><title>Crypto 4.2.2.3</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ The chipers aes_cfb8 and aes_cfb128 are now using the EVP
+ interface. The supported key lengths are 128, 192 and 256
+ bits.</p>
+ <p>
+ Own Id: OTP-16133 Aux Id: PR-2407 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Crypto 4.2.2.1</title>
<section><title>Fixed Bugs and Malfunctions</title>
@@ -2216,4 +2273,3 @@ Aux Id: seq7864</p>
</p>
</section>
</chapter>
-
diff --git a/lib/crypto/test/Makefile b/lib/crypto/test/Makefile
index 988d95a8bc..bc3d25585a 100644
--- a/lib/crypto/test/Makefile
+++ b/lib/crypto/test/Makefile
@@ -8,6 +8,7 @@ include $(ERL_TOP)/make/$(TARGET)/otp.mk
MODULES = \
crypto_bench_SUITE \
crypto_SUITE \
+ crypto_property_test_SUITE \
engine_SUITE
ERL_FILES= $(MODULES:%=%.erl)
@@ -80,6 +81,7 @@ release_tests_spec: $(TEST_TARGET)
$(INSTALL_DATA) crypto.spec crypto_bench.spec crypto.cover $(RELTEST_FILES) "$(RELSYSDIR)"
@tar cfh - *_SUITE_data | (cd "$(RELSYSDIR)"; tar xf -)
chmod -R u+w "$(RELSYSDIR)"
+ @tar cf - *_SUITE_data property_test | (cd "$(RELSYSDIR)"; tar xf -)
release_docs_spec:
diff --git a/lib/crypto/test/crypto_SUITE.erl b/lib/crypto/test/crypto_SUITE.erl
index 0da70d5592..ce515a9ba0 100644
--- a/lib/crypto/test/crypto_SUITE.erl
+++ b/lib/crypto/test/crypto_SUITE.erl
@@ -64,7 +64,13 @@ all() ->
{group, aes_192_gcm},
{group, aes_256_gcm},
{group, des_ede3_cbc},
- {group, des_ede3_cfb}
+ {group, des_ede3_cfb},
+ {group, aes_128_cfb128},
+ {group, aes_192_cfb128},
+ {group, aes_256_cfb128},
+ {group, aes_128_cfb8},
+ {group, aes_192_cfb8},
+ {group, aes_256_cfb8}
).
-define(RETIRED_TYPE_ALIASES,
@@ -78,7 +84,9 @@ all() ->
{group, des3_cfb},
{group, des3_cbc},
{group, des3_cbf},
- {group, des_ede3}
+ {group, des_ede3},
+ {group, aes_cfb128},
+ {group, aes_cfb8}
).
groups() ->
@@ -123,15 +131,7 @@ groups() ->
{group, rc4},
?NEW_CIPHER_TYPE_SCHEMA,
- {group, aes_128_cfb128},
- {group, aes_192_cfb128},
- {group, aes_256_cfb128},
- {group, aes_128_cfb8},
- {group, aes_192_cfb8},
- {group, aes_256_cfb8},
- ?RETIRED_TYPE_ALIASES,
- {group, aes_cfb128},
- {group, aes_cfb8}
+ ?RETIRED_TYPE_ALIASES
]},
{fips, [], [
{group, no_blake2b},
@@ -163,8 +163,6 @@ groups() ->
{group, no_blowfish_ecb},
{group, no_blowfish_ofb64},
- {group, no_aes_cfb128},
- {group, no_aes_cfb8},
{group, no_aes_ige256},
{group, no_des_cbc},
{group, no_des_cfb},
@@ -234,7 +232,7 @@ groups() ->
{blowfish_ofb64, [], [block, api_ng, api_ng_one_shot, api_ng_tls]},
{rc4, [], [stream, api_ng, api_ng_one_shot, api_ng_tls]},
{aes_ctr, [], [stream]},
- {chacha20_poly1305, [], [aead]},
+ {chacha20_poly1305, [], [aead, aead_ng, aead_bad_tag]},
{chacha20, [], [stream, api_ng, api_ng_one_shot, api_ng_tls]},
{poly1305, [], [poly1305]},
{no_poly1305, [], [no_poly1305]},
@@ -256,11 +254,19 @@ groups() ->
{no_blowfish_cfb64, [], [no_support, no_block]},
{no_blowfish_ofb64, [], [no_support, no_block]},
{no_aes_ige256, [], [no_support, no_block]},
- {no_chacha20_poly1305, [], [no_support, no_aead]},
+ {no_chacha20_poly1305, [], [no_support, no_aead, no_aead_ng]},
{no_chacha20, [], [no_support, no_stream_ivec]},
{no_rc2_cbc, [], [no_support, no_block]},
{no_rc4, [], [no_support, no_stream]},
- {api_errors, [], [api_errors_ecdh]},
+ {api_errors, [], [api_errors_ecdh,
+ bad_cipher_name,
+ bad_generate_key_name,
+ bad_hash_name,
+ bad_hmac_name,
+ bad_mac_name,
+ bad_sign_name,
+ bad_verify_name
+ ]},
%% New cipher nameing schema
{des_ede3_cbc, [], [api_ng, api_ng_one_shot, api_ng_tls]},
@@ -271,15 +277,15 @@ groups() ->
{aes_128_ctr, [], [api_ng, api_ng_one_shot, api_ng_tls]},
{aes_192_ctr, [], [api_ng, api_ng_one_shot, api_ng_tls]},
{aes_256_ctr, [], [api_ng, api_ng_one_shot, api_ng_tls]},
- {aes_128_ccm, [], [aead]},
- {aes_192_ccm, [], [aead]},
- {aes_256_ccm, [], [aead]},
+ {aes_128_ccm, [], [aead, aead_ng, aead_bad_tag]},
+ {aes_192_ccm, [], [aead, aead_ng, aead_bad_tag]},
+ {aes_256_ccm, [], [aead, aead_ng, aead_bad_tag]},
{aes_128_ecb, [], [api_ng, api_ng_one_shot]},
{aes_192_ecb, [], [api_ng, api_ng_one_shot]},
{aes_256_ecb, [], [api_ng, api_ng_one_shot]},
- {aes_128_gcm, [], [aead]},
- {aes_192_gcm, [], [aead]},
- {aes_256_gcm, [], [aead]},
+ {aes_128_gcm, [], [aead, aead_ng, aead_bad_tag]},
+ {aes_192_gcm, [], [aead, aead_ng, aead_bad_tag]},
+ {aes_256_gcm, [], [aead, aead_ng, aead_bad_tag]},
%% Retired aliases
{aes_cbc, [], [block]},
@@ -334,21 +340,7 @@ end_per_suite(_Config) ->
%%-------------------------------------------------------------------
init_per_group(fips, Config) ->
- FIPSConfig = [{fips, true} | Config],
- case crypto:info_fips() of
- enabled ->
- FIPSConfig;
- not_enabled ->
- case crypto:enable_fips_mode(true) of
- true ->
- enabled = crypto:info_fips(),
- FIPSConfig;
- false ->
- {fail, "Failed to enable FIPS mode"}
- end;
- not_supported ->
- {skip, "FIPS mode not supported"}
- end;
+ try_enable_fips_mode(Config);
init_per_group(non_fips, Config) ->
NonFIPSConfig = [{fips, false} | Config],
case crypto:info_fips() of
@@ -543,7 +535,7 @@ api_ng() ->
api_ng(Config) when is_list(Config) ->
[_|_] = Ciphers = lazy_eval(proplists:get_value(cipher, Config, [])),
- lists:foreach(fun api_ng_cipher_increment/1, Ciphers).
+ lists:foreach(fun api_ng_cipher_increment/1, Ciphers ++ spec_0_bytes(Config)).
api_ng_cipher_increment({Type, Key, PlainTexts}=_X) ->
ct:log("~p",[_X]),
@@ -593,12 +585,33 @@ api_ng_cipher_increment_loop(Ref, InTexts) ->
end, InTexts).
%%--------------------------------------------------------------------
+%% Check that crypto do not core dump on early 0.9.8 cryptolibs
+spec_0_bytes(Config) ->
+ Type = proplists:get_value(type, Config),
+ #{iv_length := IVS, key_length := KS} = Spec = crypto:cipher_info(Type),
+ Key = <<0:KS/unit:8>>,
+ IV = <<0:IVS/unit:8>>,
+ spec_0_bytes(Type, Key, IV, Spec).
+
+
+spec_0_bytes(chacha20_poly1305, _, _, _) ->
+ [];
+spec_0_bytes(Type, Key, IV, #{mode := M}) when M == ccm_mode ;
+ M == gcm_mode ->
+ AAD = <<>>,
+ Plain = <<>>,
+ {_, Tag} = crypto:crypto_one_time_aead(Type, Key, IV, Plain, AAD, true),
+ [{Type, Key, Plain, IV, AAD, <<>>, Tag, []}];
+spec_0_bytes(Type, Key, IV, _Spec) ->
+ [{Type, Key, IV, <<>>, <<>>}].
+
+%%--------------------------------------------------------------------
api_ng_one_shot() ->
[{doc, "Test new api"}].
api_ng_one_shot(Config) when is_list(Config) ->
[_|_] = Ciphers = lazy_eval(proplists:get_value(cipher, Config, [])),
- lists:foreach(fun do_api_ng_one_shot/1, Ciphers).
+ lists:foreach(fun do_api_ng_one_shot/1, Ciphers ++ spec_0_bytes(Config)).
do_api_ng_one_shot({Type, Key, PlainTexts}=_X) ->
ct:log("~p",[_X]),
@@ -700,6 +713,23 @@ no_aead(Config) when is_list(Config) ->
notsup(fun crypto:block_decrypt/4, DecryptArgs).
%%--------------------------------------------------------------------
+no_aead_ng() ->
+ [{doc, "Test disabled aead ciphers"}].
+no_aead_ng(Config) when is_list(Config) ->
+ {EncFun, EncryptArgs} =
+ case lazy_eval(proplists:get_value(cipher, Config)) of
+ [{Type, Key, PlainText, IV, AAD, CipherText, CipherTag, TagLen, _Info} | _] ->
+ {fun crypto:crypto_one_time_aead/7, [Type, Key, IV, PlainText, AAD, TagLen, true]};
+
+ [{Type, Key, PlainText, IV, AAD, CipherText, CipherTag, _Info} | _] ->
+ {fun crypto:crypto_one_time_aead/6, [Type, Key, IV, PlainText, AAD, true]}
+ end,
+ notsup(EncFun, EncryptArgs),
+
+ DecryptArgs = [Type, Key, IV, CipherText, AAD, CipherTag, false],
+ notsup(fun crypto:crypto_one_time_aead/7, DecryptArgs).
+
+%%--------------------------------------------------------------------
stream() ->
[{doc, "Test stream ciphers"}].
stream(Config) when is_list(Config) ->
@@ -741,6 +771,40 @@ aead(Config) when is_list(Config) ->
end,
lists:foreach(fun aead_cipher/1, FilteredAEADs).
+%%--------------------------------------------------------------------
+aead_ng(Config) when is_list(Config) ->
+ [_|_] = AEADs = lazy_eval(proplists:get_value(cipher, Config)),
+ FilteredAEADs =
+ case proplists:get_bool(fips, Config) of
+ false ->
+ AEADs;
+ true ->
+ %% In FIPS mode, the IV length must be at least 12 bytes.
+ lists:filter(
+ fun(Tuple) ->
+ IVLen = byte_size(element(4, Tuple)),
+ IVLen >= 12
+ end, AEADs)
+ end,
+ lists:foreach(fun aead_cipher_ng/1, FilteredAEADs ++ spec_0_bytes(Config)).
+
+%%--------------------------------------------------------------------
+aead_bad_tag(Config) ->
+ [_|_] = AEADs = lazy_eval(proplists:get_value(cipher, Config)),
+ FilteredAEADs =
+ case proplists:get_bool(fips, Config) of
+ false ->
+ AEADs;
+ true ->
+ %% In FIPS mode, the IV length must be at least 12 bytes.
+ lists:filter(
+ fun(Tuple) ->
+ IVLen = byte_size(element(4, Tuple)),
+ IVLen >= 12
+ end, AEADs)
+ end,
+ lists:foreach(fun aead_cipher_bad_tag/1, FilteredAEADs).
+
%%--------------------------------------------------------------------
sign_verify() ->
[{doc, "Sign/verify digital signatures"}].
@@ -1281,6 +1345,97 @@ aead_cipher({Type, Key, PlainText, IV, AAD, CipherText, CipherTag, TagLen, Info}
{got, Other1}})
end.
+aead_cipher_ng({Type, Key, PlainText, IV, AAD, CipherText, CipherTag, Info}) ->
+ Plain = iolist_to_binary(PlainText),
+ case crypto:crypto_one_time_aead(Type, Key, IV, PlainText, AAD, true) of
+ {CipherText, CipherTag} ->
+ ok;
+ Other0 ->
+ ct:fail({{crypto,
+ block_encrypt,
+ [{info,Info}, {key,Key}, {pt,PlainText}, {iv,IV}, {aad,AAD}, {ct,CipherText}, {tag,CipherTag}]},
+ {expected, {CipherText, CipherTag}},
+ {got, Other0}})
+ end,
+ case crypto:crypto_one_time_aead(Type, Key, IV, CipherText, AAD, CipherTag, false) of
+ Plain ->
+ ok;
+ Other1 ->
+ ct:fail({{crypto,
+ block_decrypt,
+ [{info,Info}, {key,Key}, {pt,PlainText}, {iv,IV}, {aad,AAD}, {ct,CipherText}, {tag,CipherTag}]},
+ {expected, Plain},
+ {got, Other1}})
+ end;
+aead_cipher_ng({Type, Key, PlainText, IV, AAD, CipherText, CipherTag, TagLen, Info}) ->
+ <<TruncatedCipherTag:TagLen/binary, _/binary>> = CipherTag,
+ Plain = iolist_to_binary(PlainText),
+ try crypto:crypto_one_time_aead(Type, Key, IV, PlainText, AAD, TagLen, true) of
+ {CipherText, TruncatedCipherTag} ->
+ ok;
+ Other0 ->
+ ct:fail({{crypto,
+ block_encrypt,
+ [{info,Info}, {key,Key}, {pt,PlainText}, {iv,IV}, {aad,AAD}, {ct,CipherText}, {tag,CipherTag}, {taglen,TagLen}]},
+ {expected, {CipherText, TruncatedCipherTag}},
+ {got, Other0}})
+ catch
+ error:E ->
+ ct:log("~p",[{Type, Key, PlainText, IV, AAD, CipherText, CipherTag, TagLen, Info}]),
+ try crypto:crypto_one_time_aead(Type, Key, IV, PlainText, AAD, TagLen, true)
+ of
+ RR ->
+ ct:log("Works: ~p",[RR])
+ catch
+ CC:EE ->
+ ct:log("~p:~p", [CC,EE])
+ end,
+ ct:fail("~p",[E])
+ end,
+ case crypto:crypto_one_time_aead(Type, Key, IV, CipherText, AAD, TruncatedCipherTag, false) of
+ Plain ->
+ ok;
+ Other1 ->
+ ct:fail({{crypto,
+ block_decrypt,
+ [{info,Info}, {key,Key}, {pt,PlainText}, {iv,IV}, {aad,AAD}, {ct,CipherText}, {tag,CipherTag},
+ {truncated,TruncatedCipherTag}]},
+ {expected, Plain},
+ {got, Other1}})
+ end.
+
+mk_bad_tag(CipherTag) ->
+ case <<0:(size(CipherTag))/unit:8>> of
+ CipherTag -> % The correct tag may happen to be a suite of zeroes
+ <<1:(size(CipherTag))/unit:8>>;
+ X ->
+ X
+ end.
+
+aead_cipher_bad_tag({Type, Key, PlainText, IV, AAD, CipherText, CipherTag, Info}) ->
+ Plain = iolist_to_binary(PlainText),
+ BadTag = mk_bad_tag(CipherTag),
+ case crypto:crypto_one_time_aead(Type, Key, IV, CipherText, AAD, BadTag, false) of
+ error ->
+ ok;
+ Plain ->
+ ct:log("~p:~p~n info: ~p~n key: ~p~n pt: ~p~n iv: ~p~n aad: ~p~n ct: ~p~n tag: ~p~n bad tag: ~p~n",
+ [?MODULE,?LINE,Info, Key, PlainText, IV, AAD, CipherText, CipherTag, BadTag]),
+ ct:fail("Didn't fail on bad tag")
+ end;
+aead_cipher_bad_tag({Type, Key, PlainText, IV, AAD, CipherText, CipherTag, TagLen, Info}) ->
+ Plain = iolist_to_binary(PlainText),
+ <<TruncatedCipherTag:TagLen/binary, _/binary>> = CipherTag,
+ BadTruncatedTag = mk_bad_tag(TruncatedCipherTag),
+ case crypto:crypto_one_time_aead(Type, Key, IV, CipherText, AAD, BadTruncatedTag, false) of
+ error ->
+ ok;
+ Plain ->
+ ct:log("~p:~p~n info: ~p~n key: ~p~n pt: ~p~n iv: ~p~n aad: ~p~n ct: ~p~n tag: ~p~n bad tag: ~p~n",
+ [Info, Key, PlainText, IV, AAD, CipherText, TruncatedCipherTag, BadTruncatedTag]),
+ ct:fail("Didn't fail on bad tag")
+ end.
+
do_sign_verify({Type, undefined=Hash, Private, Public, Msg, Signature}) ->
case crypto:sign(eddsa, Hash, Msg, [Private,Type]) of
Signature ->
@@ -1454,6 +1609,8 @@ notsup(Fun, Args) ->
catch
error:notsup ->
ok;
+ error: {notsup, _, _} ->
+ ok;
Class:Error ->
{error, {Class, Error}}
end,
@@ -4157,3 +4314,85 @@ api_errors_ecdh(Config) when is_list(Config) ->
Curves = [gaffel, 0, sect571r1],
[_= (catch Test(O, C)) || O <- Others, C <- Curves],
ok.
+
+
+%%%----- Tests for bad algorithm name as argument
+-define(chk_api_name(Call, Expect),
+ %% Check that we don't segfault on bad names
+ (fun() -> % avoid binding vars
+ try
+ Call
+ catch
+ Expect -> ok;
+
+ Class:Reason:Stack ->
+ ct:log("~p:~p~n~p", [Class,Reason,Stack]),
+ ct:fail("Bad respons for bad name")
+ end
+ end)()
+ ).
+
+bad_cipher_name(_Config) ->
+ ?chk_api_name(crypto:crypto_init(foobar, <<1:128>>, true),
+ error:{badarg,{"api_ng.c",_Line},"Unknown cipher"}).
+
+bad_generate_key_name(_Config) ->
+ ?chk_api_name(crypto:generate_key(foobar, [1024]),
+ error:function_clause).
+
+bad_hash_name(_Config) ->
+ ?chk_api_name(crypto:hash_init(foobar),
+ error:badarg).
+
+bad_hmac_name(_Config) ->
+ ?chk_api_name(crypto:hmac(foobar, <<1:1024>>, "nothing"),
+ error:badarg).
+
+bad_mac_name(_Config) ->
+ ?chk_api_name(crypto:mac(foobar, <<1:1024>>, "nothing"),
+ error:function_clause).
+
+bad_sign_name(_Config) ->
+ ?chk_api_name(crypto:sign(rsa, foobar, "nothing", <<1:1024>>),
+ error:badarg),
+ ?chk_api_name(crypto:sign(foobar, sha, "nothing", <<1:1024>>),
+ error:badarg).
+
+bad_verify_name(_Config) ->
+ ?chk_api_name(crypto:verify(rsa, foobar, "nothing","nothing", <<1:1024>>),
+ error:badarg),
+ ?chk_api_name(crypto:verify(foobar, sha, "nothing", "nothing", <<1:1024>>),
+ error:badarg).
+
+
+%%%----------------------------------------------------------------
+try_enable_fips_mode(Config) ->
+ FIPSConfig = [{fips, true} | Config],
+ case crypto:info_fips() of
+ enabled ->
+ FIPSConfig;
+ not_enabled ->
+ %% Erlang/crypto configured with --enable-fips
+ case crypto:enable_fips_mode(true) of
+ true ->
+ %% and also the cryptolib is fips enabled
+ enabled = crypto:info_fips(),
+ FIPSConfig;
+ false ->
+ try
+ [{_,_,Inf}] = crypto:info_lib(),
+ re:run(Inf, "(F|f)(I|i)(P|p)(S|s)")
+ of
+ nomatch ->
+ {skip, "FIPS mode not supported in cryptolib"};
+ {match,_} ->
+ {fail, "Failed to enable FIPS mode"}
+ catch
+ _:_ ->
+ {fail, "Failed to check cryptolib info"}
+ end,
+ {skip, "FIPS mode not supported in cryptolib"}
+ end;
+ not_supported ->
+ {skip, "FIPS mode not supported"}
+ end.
diff --git a/lib/crypto/test/crypto_property_test_SUITE.erl b/lib/crypto/test/crypto_property_test_SUITE.erl
new file mode 100644
index 0000000000..75a3d4872f
--- /dev/null
+++ b/lib/crypto/test/crypto_property_test_SUITE.erl
@@ -0,0 +1,50 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2004-2017. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+-module(crypto_property_test_SUITE).
+
+-compile(export_all).
+
+-include_lib("common_test/include/ct.hrl").
+
+all() -> [encrypt_decrypt__crypto_one_time,
+ prop__crypto_init_update
+ ].
+
+%%% First prepare Config and compile the property tests for the found tool:
+init_per_suite(Config) ->
+ ct_property_test:init_per_suite(Config).
+
+end_per_suite(Config) ->
+ Config.
+
+%%%================================================================
+%%% Test suites
+%%%
+encrypt_decrypt__crypto_one_time(Config) ->
+ ct_property_test:quickcheck(
+ crypto_ng_api:prop__crypto_one_time(),
+ Config
+ ).
+prop__crypto_init_update(Config) ->
+ ct_property_test:quickcheck(
+ crypto_ng_api:prop__crypto_init_update(),
+ Config
+ ).
diff --git a/lib/crypto/test/property_test/crypto_ng_api.erl b/lib/crypto/test/property_test/crypto_ng_api.erl
new file mode 100644
index 0000000000..c3a21b0804
--- /dev/null
+++ b/lib/crypto/test/property_test/crypto_ng_api.erl
@@ -0,0 +1,134 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2004-2017. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+%%
+
+-module(crypto_ng_api).
+
+-compile(export_all).
+
+-proptest(eqc).
+-proptest([triq,proper]).
+
+-ifndef(EQC).
+-ifndef(PROPER).
+-ifndef(TRIQ).
+%%-define(EQC,true).
+-define(PROPER,true).
+%%-define(TRIQ,true).
+-endif.
+-endif.
+-endif.
+
+-ifdef(EQC).
+-include_lib("eqc/include/eqc.hrl").
+-define(MOD_eqc,eqc).
+
+-else.
+-ifdef(PROPER).
+-include_lib("proper/include/proper.hrl").
+-define(MOD_eqc,proper).
+-else.
+-ifdef(TRIQ).
+-define(MOD_eqc,triq).
+-include_lib("triq/include/triq.hrl").
+
+-endif.
+-endif.
+-endif.
+
+-include("crypto_prop_generators.hrl").
+
+%%%================================================================
+%%% Properties:
+
+prop__crypto_one_time() ->
+ numtests(10000,
+ ?FORALL({TextPlain, Cipher, Key, IV}, ?LET(Ciph,cipher(),
+ {text_plain(), Ciph, key(Ciph), iv(Ciph)}),
+ equal(TextPlain,
+ full_blocks(TextPlain, Cipher),
+ decrypt_encrypt_one_time(Cipher, Key, IV, TextPlain))
+ )
+ ).
+
+prop__crypto_init_update() ->
+ numtests(10000,
+ ?FORALL({TextPlain, Cipher, Key, IV}, ?LET(Ciph,cipher(),
+ {text_plain(), Ciph, key(Ciph), iv(Ciph)}),
+ equal(TextPlain,
+ full_blocks(TextPlain, Cipher),
+ decrypt_encrypt_init_update(Cipher, Key, IV, TextPlain))
+ )
+ ).
+
+%%%================================================================
+%%% Lib
+
+equal(_, T, T) -> true;
+equal(F, Tp, Td) ->
+ ct:pal("Full: ~p~n"
+ "Block: ~p~n"
+ "Decr: ~p~n",
+ [F, Tp, Td]),
+ false.
+
+
+decrypt_encrypt_one_time(Cipher, Key, IV, TextPlain) ->
+ io:format("~p:~p Cipher: ~p, BlockSize: ~p, Key: ~p, IV: ~p, TextPlain: ~p (~p chunks)",
+ [?MODULE,?LINE, Cipher, block_size(Cipher), size(Key), size(IV), size(iolist_to_binary(TextPlain)),
+ num_chunks(TextPlain)]),
+ TextCrypto = crypto:crypto_one_time(Cipher, Key, IV, TextPlain, true),
+ io:format("~p:~p TextCrypto: ~p", [?MODULE,?LINE, size(TextCrypto)]),
+ TextDecrypt = crypto:crypto_one_time(Cipher, Key, IV, TextCrypto, false),
+ io:format("~p:~p TextDecrypt: ~p", [?MODULE,?LINE, size(TextDecrypt)]),
+ TextDecrypt.
+
+
+decrypt_encrypt_init_update(Cipher, Key, IV, TextPlain) when is_binary(TextPlain) ->
+ decrypt_encrypt_init_update(Cipher, Key, IV, [TextPlain]);
+
+decrypt_encrypt_init_update(Cipher, Key, IV, TextPlain) ->
+ io:format("~p:~p Cipher: ~p, BlockSize: ~p, Key: ~p, IV: ~p, TextPlain: ~p (~p chunks)",
+ [?MODULE,?LINE, Cipher, block_size(Cipher), size(Key), size(IV), size(iolist_to_binary(TextPlain)),
+ num_chunks(TextPlain)]),
+ Cenc = crypto:crypto_init(Cipher, Key, IV, true),
+ TextOut = lists:foldl(fun(TextIn, TextOutAcc) ->
+ [crypto:crypto_update(Cenc,TextIn) | TextOutAcc]
+ end, [], TextPlain),
+ TextCrypto = lists:reverse(TextOut),
+ io:format("~p:~p TextCrypto: ~p",
+ [?MODULE,?LINE, size(iolist_to_binary(TextCrypto))]),
+
+ Cdec = crypto:crypto_init(Cipher, Key, IV, false),
+ TextDec = lists:foldl(fun(TextC, TextDecAcc) ->
+ [crypto:crypto_update(Cdec,TextC) | TextDecAcc]
+ end, [], TextCrypto),
+ iolist_to_binary(lists:reverse(TextDec)).
+
+full_blocks(TextPlain, Cipher) ->
+ TextPlainBin = iolist_to_binary(TextPlain),
+ {Head,_Tail} = split_binary(TextPlainBin, (size(TextPlainBin) - num_rest_bytes(TextPlainBin,Cipher))),
+ Head.
+
+num_chunks(B) when is_binary(B) -> 1;
+num_chunks(L) when is_list(L) -> length(L).
+
+num_rest_bytes(Bin, Cipher) -> size(Bin) rem block_size(Cipher).
+
diff --git a/lib/crypto/test/property_test/crypto_prop_generators.erl b/lib/crypto/test/property_test/crypto_prop_generators.erl
new file mode 100644
index 0000000000..5a53a000f0
--- /dev/null
+++ b/lib/crypto/test/property_test/crypto_prop_generators.erl
@@ -0,0 +1,93 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2004-2017. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+%%
+
+-module(crypto_prop_generators).
+
+-compile(export_all).
+
+-proptest(eqc).
+-proptest([triq,proper]).
+
+-ifndef(EQC).
+-ifndef(PROPER).
+-ifndef(TRIQ).
+%%-define(EQC,true).
+-define(PROPER,true).
+%%-define(TRIQ,true).
+-endif.
+-endif.
+-endif.
+
+-ifdef(EQC).
+-include_lib("eqc/include/eqc.hrl").
+-define(MOD_eqc,eqc).
+
+-else.
+-ifdef(PROPER).
+-include_lib("proper/include/proper.hrl").
+-define(MOD_eqc,proper).
+-else.
+-ifdef(TRIQ).
+-define(MOD_eqc,triq).
+-include_lib("triq/include/triq.hrl").
+
+-endif.
+-endif.
+-endif.
+
+%%%================================================================
+%%% Generators
+
+text_plain() -> iolist().
+
+cipher() -> oneof( non_aead_ciphers() -- [aes_ige256] ).
+
+key(Cipher) ->
+ %% Can't be shrinked
+ crypto:strong_rand_bytes( key_length(Cipher) ).
+
+iv(Cipher) ->
+ %% Can't be shrinked
+ crypto:strong_rand_bytes( iv_length(Cipher) ).
+
+iolist() -> frequency([{5, list( oneof([list(byte()),
+ binary(),
+ list(binary())]))},
+ {1, mybinary(50000)}
+ ]).
+
+mybinary(MaxSize) -> ?LET(Sz, integer(0,MaxSize), binary(Sz)).
+
+
+%%%================================================================
+non_aead_ciphers() ->
+ [C || C <- crypto:supports(ciphers),
+ C =/= chacha20_poly1305,
+ begin
+ #{mode := Mode} = crypto:cipher_info(C),
+ not lists:member(Mode, [ccm_mode, gcm_mode])
+ end].
+
+block_size(Cipher) -> maps:get(block_size, crypto:cipher_info(Cipher)).
+
+key_length(Cipher) -> maps:get(key_length, crypto:cipher_info(Cipher)).
+
+iv_length(Cipher) -> maps:get(iv_length, crypto:cipher_info(Cipher)).
diff --git a/lib/crypto/test/property_test/crypto_prop_generators.hrl b/lib/crypto/test/property_test/crypto_prop_generators.hrl
new file mode 100644
index 0000000000..56a762e651
--- /dev/null
+++ b/lib/crypto/test/property_test/crypto_prop_generators.hrl
@@ -0,0 +1,36 @@
+%%%
+%%% %CopyrightBegin%
+%%%
+%%% Copyright Ericsson AB 2004-2017. All Rights Reserved.
+%%%
+%%% Licensed under the Apache License, Version 2.0 (the "License");
+%%% you may not use this file except in compliance with the License.
+%%% You may obtain a copy of the License at
+%%%
+%%% http://www.apache.org/licenses/LICENSE-2.0
+%%%
+%%% Unless required by applicable law or agreed to in writing, software
+%%% distributed under the License is distributed on an "AS IS" BASIS,
+%%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%%% See the License for the specific language governing permissions and
+%%% limitations under the License.
+%%%
+%%% %CopyrightEnd%
+%%%
+%%%
+
+
+-import(crypto_prop_generators,
+ [
+ text_plain/0,
+ cipher/0,
+ key/1,
+ iv/1,
+ iolist/0,
+ mybinary/1,
+
+ non_aead_ciphers/0,
+ block_size/1,
+ key_length/1,
+ iv_length/1
+ ]).
diff --git a/lib/crypto/vsn.mk b/lib/crypto/vsn.mk
index c0ff0c6512..1ecffa37c2 100644
--- a/lib/crypto/vsn.mk
+++ b/lib/crypto/vsn.mk
@@ -1 +1 @@
-CRYPTO_VSN = 4.6.1
+CRYPTO_VSN = 4.6.2
diff --git a/lib/debugger/src/dbg_wx_mon_win.erl b/lib/debugger/src/dbg_wx_mon_win.erl
index fcd954454b..84de762b65 100644
--- a/lib/debugger/src/dbg_wx_mon_win.erl
+++ b/lib/debugger/src/dbg_wx_mon_win.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -85,7 +85,6 @@ init() ->
-define(W, 800).
-define(H, 390).
-%% FIXME
-define(autoId, 314).
-define(stringsId, 271).
diff --git a/lib/debugger/src/dbg_wx_trace.erl b/lib/debugger/src/dbg_wx_trace.erl
index 25f32ca7e7..210987d3e6 100644
--- a/lib/debugger/src/dbg_wx_trace.erl
+++ b/lib/debugger/src/dbg_wx_trace.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -518,7 +518,7 @@ gui_cmd({user_command, Cmd}, State) ->
gui_cmd({edit, {Var, Value}}, State) ->
Window = dbg_wx_trace_win:get_window(State#state.win),
Val = case State#state.strings of
- [] -> dbg_wx_win:to_string("~0lp",[Value]);
+ [] -> dbg_wx_win:to_string("~0ltp",[Value]);
[str_on] -> dbg_wx_win:to_string("~0tp",[Value])
end,
case dbg_wx_win:entry(Window, "Edit variable", Var, {term, Val}) of
@@ -813,7 +813,7 @@ map(?STRNAME) -> str_on; % Strings
map(str_on) -> ?STRNAME.
p(#state{strings=[str_on]}) -> "~tp";
-p(#state{strings=[]}) -> "~lp".
+p(#state{strings=[]}) -> "~ltp".
%% gui_show_module(Win, Mod, Line, Cm, Pid, How) -> Win
%% gui_show_module(Win, {Mod,Line}, _Reason, Cm, Pid, How) -> Win
diff --git a/lib/debugger/src/dbg_wx_trace_win.erl b/lib/debugger/src/dbg_wx_trace_win.erl
index 972a917728..f5e5fbc5bf 100644
--- a/lib/debugger/src/dbg_wx_trace_win.erl
+++ b/lib/debugger/src/dbg_wx_trace_win.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -572,8 +572,8 @@ update_bindings(#winInfo{bind=#sub{out=BA}}, Bs) ->
wxListCtrl:insertItem(BA, Row, ""),
wxListCtrl:setItem(BA, Row, 0, dbg_wx_win:to_string(Var)),
Format = case get(strings) of
- [] -> "~999999lP";
- [str_on] -> "~999999tP"
+ [] -> "~0ltP";
+ [str_on] -> "~0tP"
end,
wxListCtrl:setItem(BA, Row, 1, dbg_wx_win:to_string(Format,[Val, 20])),
Row+1
@@ -866,7 +866,7 @@ handle_event(#wx{event=#wxList{type=command_list_item_selected, itemIndex=Row}},
Bs = get(bindings),
{Var,Val} = lists:nth(Row+1, Bs),
Str = case get(strings) of
- [] -> io_lib:format("< ~s = ~lp~n", [Var, Val]);
+ [] -> io_lib:format("< ~s = ~ltp~n", [Var, Val]);
[str_on] -> io_lib:format("< ~s = ~tp~n", [Var, Val])
end,
eval_output(Wi, Str, bold),
diff --git a/lib/debugger/test/debugger_SUITE.erl b/lib/debugger/test/debugger_SUITE.erl
index c72f154928..ae8e1402f1 100644
--- a/lib/debugger/test/debugger_SUITE.erl
+++ b/lib/debugger/test/debugger_SUITE.erl
@@ -91,7 +91,7 @@ no_abstract_code(Config) when is_list(Config) ->
ok.
encrypted_debug_info(Config) when is_list(Config) ->
- try begin crypto:start(), crypto:info(), crypto:stop(), ok end of
+ try begin crypto:start(), crypto:stop(), ok end of
ok ->
encrypted_debug_info_1(Config)
catch
diff --git a/lib/dialyzer/src/dialyzer_contracts.erl b/lib/dialyzer/src/dialyzer_contracts.erl
index 17b2168852..e041c43cc1 100644
--- a/lib/dialyzer/src/dialyzer_contracts.erl
+++ b/lib/dialyzer/src/dialyzer_contracts.erl
@@ -248,7 +248,19 @@ check_contract(#contract{contracts = Contracts}, SuccType, Opaques) ->
|| Contract <- Contracts2],
case check_contract_inf_list(InfList, SuccType, Opaques) of
{error, _} = Invalid -> Invalid;
- ok -> check_extraneous(Contracts2, SuccType)
+ ok ->
+ case check_extraneous(Contracts2, SuccType) of
+ {error, invalid_contract} = Err ->
+ Err;
+ {error, {extra_range, _, _}} = Err ->
+ MissingError = check_missing(Contracts2, SuccType),
+ {range_warnings, [Err | MissingError]};
+ ok ->
+ case check_missing(Contracts2, SuccType) of
+ [] -> ok;
+ ErrorL -> {range_warnings, ErrorL}
+ end
+ end
end
end
catch
@@ -304,15 +316,8 @@ check_contract_inf_list([], _SuccType, _Opaques, OM) ->
check_extraneous([], _SuccType) -> ok;
check_extraneous([C|Cs], SuccType) ->
case check_extraneous_1(C, SuccType) of
- {error, invalid_contract} = Error ->
- Error;
- {error, {extra_range, _, _}} = Error ->
- {range_warnings, [Error | check_missing(C, SuccType)]};
- ok ->
- case check_missing(C, SuccType) of
- [] -> check_extraneous(Cs, SuccType);
- ErrorL -> {range_warnings, ErrorL}
- end
+ {error, _} = Error -> Error;
+ ok -> check_extraneous(Cs, SuccType)
end.
check_extraneous_1(Contract, SuccType) ->
@@ -363,16 +368,15 @@ map_part(Type) ->
is_empty_map(Type) ->
erl_types:t_is_equal(Type, erl_types:t_from_term(#{})).
-check_missing(Contract, SuccType) ->
- CRng = erl_types:t_fun_range(Contract),
+check_missing(Contracts, SuccType) ->
+ CRanges = [erl_types:t_fun_range(C) || C <- Contracts],
+ AllCRange = erl_types:t_sup(CRanges),
STRng = erl_types:t_fun_range(SuccType),
STRngs = erl_types:t_elements(STRng),
- ?debug("\nCR = ~ts\nSR = ~ts\n", [erl_types:t_to_string(CRng),
- erl_types:t_to_string(STRng)]),
case [STR || STR <- STRngs,
- erl_types:t_is_none(erl_types:t_inf(STR, CRng))] of
+ erl_types:t_is_none(erl_types:t_inf(STR, AllCRange))] of
[] -> [];
- STRs -> [{error, {missing_range, erl_types:t_sup(STRs), CRng}}]
+ STRs -> [{error, {missing_range, erl_types:t_sup(STRs), AllCRange}}]
end.
%% This is the heart of the "range function"
diff --git a/lib/dialyzer/test/behaviour_SUITE_data/src/proper/compile_flags.hrl b/lib/dialyzer/test/behaviour_SUITE_data/src/proper/compile_flags.hrl
deleted file mode 100644
index e5ee44ace1..0000000000
--- a/lib/dialyzer/test/behaviour_SUITE_data/src/proper/compile_flags.hrl
+++ /dev/null
@@ -1,2 +0,0 @@
--define(AT_LEAST_19, 1).
--define(AT_LEAST_17, 1).
diff --git a/lib/dialyzer/test/behaviour_SUITE_data/src/proper/proper_common.hrl b/lib/dialyzer/test/behaviour_SUITE_data/src/proper/proper_common.hrl
deleted file mode 100644
index c10626c5cc..0000000000
--- a/lib/dialyzer/test/behaviour_SUITE_data/src/proper/proper_common.hrl
+++ /dev/null
@@ -1,55 +0,0 @@
-%%% Copyright 2010-2013 Manolis Papadakis <manopapad@gmail.com>,
-%%% Eirini Arvaniti <eirinibob@gmail.com>
-%%% and Kostis Sagonas <kostis@cs.ntua.gr>
-%%%
-%%% This file is part of PropEr.
-%%%
-%%% PropEr is free software: you can redistribute it and/or modify
-%%% it under the terms of the GNU General Public License as published by
-%%% the Free Software Foundation, either version 3 of the License, or
-%%% (at your option) any later version.
-%%%
-%%% PropEr is distributed in the hope that it will be useful,
-%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
-%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-%%% GNU General Public License for more details.
-%%%
-%%% You should have received a copy of the GNU General Public License
-%%% along with PropEr. If not, see <http://www.gnu.org/licenses/>.
-
-%%% @copyright 2010-2013 Manolis Papadakis, Eirini Arvaniti and Kostis Sagonas
-%%% @version {@version}
-%%% @author Manolis Papadakis
-%%% @doc Common parts of user and internal header files
-
-
-%%------------------------------------------------------------------------------
-%% Test generation macros
-%%------------------------------------------------------------------------------
-
--define(FORALL(X,RawType,Prop), proper:forall(RawType,fun(X) -> Prop end)).
--define(IMPLIES(Pre,Prop), proper:implies(Pre,?DELAY(Prop))).
--define(WHENFAIL(Action,Prop), proper:whenfail(?DELAY(Action),?DELAY(Prop))).
--define(TRAPEXIT(Prop), proper:trapexit(?DELAY(Prop))).
--define(TIMEOUT(Limit,Prop), proper:timeout(Limit,?DELAY(Prop))).
-%% TODO: -define(ALWAYS(Tests,Prop), proper:always(Tests,?DELAY(Prop))).
-%% TODO: -define(SOMETIMES(Tests,Prop), proper:sometimes(Tests,?DELAY(Prop))).
-
-
-%%------------------------------------------------------------------------------
-%% Generator macros
-%%------------------------------------------------------------------------------
-
--define(FORCE(X), (X)()).
--define(DELAY(X), fun() -> X end).
--define(LAZY(X), proper_types:lazy(?DELAY(X))).
--define(SIZED(SizeArg,Gen), proper_types:sized(fun(SizeArg) -> Gen end)).
--define(LET(X,RawType,Gen), proper_types:bind(RawType,fun(X) -> Gen end,false)).
--define(SHRINK(Gen,AltGens),
- proper_types:shrinkwith(?DELAY(Gen),?DELAY(AltGens))).
--define(LETSHRINK(Xs,RawType,Gen),
- proper_types:bind(RawType,fun(Xs) -> Gen end,true)).
--define(SUCHTHAT(X,RawType,Condition),
- proper_types:add_constraint(RawType,fun(X) -> Condition end,true)).
--define(SUCHTHATMAYBE(X,RawType,Condition),
- proper_types:add_constraint(RawType,fun(X) -> Condition end,false)).
diff --git a/lib/dialyzer/test/behaviour_SUITE_data/src/proper/proper_gen.erl b/lib/dialyzer/test/behaviour_SUITE_data/src/proper/proper_gen.erl
deleted file mode 100644
index b64a139e4d..0000000000
--- a/lib/dialyzer/test/behaviour_SUITE_data/src/proper/proper_gen.erl
+++ /dev/null
@@ -1,611 +0,0 @@
-%%% Copyright 2010-2015 Manolis Papadakis <manopapad@gmail.com>,
-%%% Eirini Arvaniti <eirinibob@gmail.com>
-%%% and Kostis Sagonas <kostis@cs.ntua.gr>
-%%%
-%%% This file is part of PropEr.
-%%%
-%%% PropEr is free software: you can redistribute it and/or modify
-%%% it under the terms of the GNU General Public License as published by
-%%% the Free Software Foundation, either version 3 of the License, or
-%%% (at your option) any later version.
-%%%
-%%% PropEr is distributed in the hope that it will be useful,
-%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
-%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-%%% GNU General Public License for more details.
-%%%
-%%% You should have received a copy of the GNU General Public License
-%%% along with PropEr. If not, see <http://www.gnu.org/licenses/>.
-
-%%% @copyright 2010-2015 Manolis Papadakis, Eirini Arvaniti and Kostis Sagonas
-%%% @version {@version}
-%%% @author Manolis Papadakis
-
-%%% @doc Generator subsystem and generators for basic types.
-%%%
-%%% You can use <a href="#index">these</a> functions to try out the random
-%%% instance generation and shrinking subsystems.
-%%%
-%%% CAUTION: These functions should never be used inside properties. They are
-%%% meant for demonstration purposes only.
-
--module(proper_gen).
--export([pick/1, pick/2, pick/3,
- sample/1, sample/3, sampleshrink/1, sampleshrink/2]).
-
--export([safe_generate/1]).
--export([generate/1, normal_gen/1, alt_gens/1, clean_instance/1,
- get_ret_type/1]).
--export([integer_gen/3, float_gen/3, atom_gen/1, atom_rev/1, binary_gen/1,
- binary_rev/1, binary_len_gen/1, bitstring_gen/1, bitstring_rev/1,
- bitstring_len_gen/1, list_gen/2, distlist_gen/3, vector_gen/2,
- union_gen/1, weighted_union_gen/1, tuple_gen/1, loose_tuple_gen/2,
- loose_tuple_rev/2, exactly_gen/1, fixed_list_gen/1, function_gen/2,
- any_gen/1, native_type_gen/2, safe_weighted_union_gen/1,
- safe_union_gen/1]).
-
--export_type([instance/0, imm_instance/0, sized_generator/0, nosize_generator/0,
- generator/0, reverse_gen/0, combine_fun/0, alt_gens/0]).
-
--include("proper_internal.hrl").
-
-%%-----------------------------------------------------------------------------
-%% Types
-%%-----------------------------------------------------------------------------
-
-%% TODO: update imm_instance() when adding more types: be careful when reading
-%% anything that returns it
-%% @private_type
--type imm_instance() :: proper_types:raw_type()
- | instance()
- | {'$used', imm_instance(), imm_instance()}
- | {'$to_part', imm_instance()}.
--type instance() :: term().
-%% A value produced by the random instance generator.
--type error_reason() :: 'arity_limit' | 'cant_generate' | {'typeserver',term()}.
-
-%% @private_type
--type sized_generator() :: fun((size()) -> imm_instance()).
-%% @private_type
--type typed_sized_generator() :: {'typed',
- fun((proper_types:type(),size()) ->
- imm_instance())}.
-%% @private_type
--type nosize_generator() :: fun(() -> imm_instance()).
-%% @private_type
--type typed_nosize_generator() :: {'typed',
- fun((proper_types:type()) ->
- imm_instance())}.
-%% @private_type
--type generator() :: sized_generator()
- | typed_sized_generator()
- | nosize_generator()
- | typed_nosize_generator().
-%% @private_type
--type plain_reverse_gen() :: fun((instance()) -> imm_instance()).
-%% @private_type
--type typed_reverse_gen() :: {'typed',
- fun((proper_types:type(),instance()) ->
- imm_instance())}.
-%% @private_type
--type reverse_gen() :: plain_reverse_gen() | typed_reverse_gen().
-%% @private_type
--type combine_fun() :: fun((instance()) -> imm_instance()).
-%% @private_type
--type alt_gens() :: fun(() -> [imm_instance()]).
-%% @private_type
--type fun_seed() :: {non_neg_integer(),non_neg_integer()}.
-
-
-%%-----------------------------------------------------------------------------
-%% Instance generation functions
-%%-----------------------------------------------------------------------------
-
-%% @private
--spec safe_generate(proper_types:raw_type()) ->
- {'ok',imm_instance()} | {'error',error_reason()}.
-safe_generate(RawType) ->
- try generate(RawType) of
- ImmInstance -> {ok, ImmInstance}
- catch
- throw:'$arity_limit' -> {error, arity_limit};
- throw:'$cant_generate' -> {error, cant_generate};
- throw:{'$typeserver',SubReason} -> {error, {typeserver,SubReason}}
- end.
-
-%% @private
--spec generate(proper_types:raw_type()) -> imm_instance().
-generate(RawType) ->
- Type = proper_types:cook_outer(RawType),
- ok = add_parameters(Type),
- Instance = generate(Type, get('$constraint_tries'), none),
- ok = remove_parameters(Type),
- Instance.
-
--spec add_parameters(proper_types:type()) -> 'ok'.
-add_parameters(Type) ->
- case proper_types:find_prop(parameters, Type) of
- {ok, Params} ->
- OldParams = erlang:get('$parameters'),
- case OldParams of
- undefined ->
- erlang:put('$parameters', Params);
- _ ->
- erlang:put('$parameters', Params ++ OldParams)
- end,
- ok;
- _ ->
- ok
- end.
-
--spec remove_parameters(proper_types:type()) -> 'ok'.
-remove_parameters(Type) ->
- case proper_types:find_prop(parameters, Type) of
- {ok, Params} ->
- AllParams = erlang:get('$parameters'),
- case AllParams of
- Params->
- erlang:erase('$parameters');
- _ ->
- erlang:put('$parameters', AllParams -- Params)
- end,
- ok;
- _ ->
- ok
- end.
-
--spec generate(proper_types:type(), non_neg_integer(),
- 'none' | {'ok',imm_instance()}) -> imm_instance().
-generate(_Type, 0, none) ->
- throw('$cant_generate');
-generate(_Type, 0, {ok,Fallback}) ->
- Fallback;
-generate(Type, TriesLeft, Fallback) ->
- ImmInstance =
- case proper_types:get_prop(kind, Type) of
- constructed ->
- PartsType = proper_types:get_prop(parts_type, Type),
- Combine = proper_types:get_prop(combine, Type),
- ImmParts = generate(PartsType),
- Parts = clean_instance(ImmParts),
- ImmInstance1 = Combine(Parts),
- %% TODO: We can just generate the internal type: if it's not
- %% a type, it will turn into an exactly.
- ImmInstance2 =
- case proper_types:is_raw_type(ImmInstance1) of
- true -> generate(ImmInstance1);
- false -> ImmInstance1
- end,
- {'$used',ImmParts,ImmInstance2};
- _ ->
- ImmInstance1 = normal_gen(Type),
- case proper_types:is_raw_type(ImmInstance1) of
- true -> generate(ImmInstance1);
- false -> ImmInstance1
- end
- end,
- case proper_types:satisfies_all(clean_instance(ImmInstance), Type) of
- {_,true} -> ImmInstance;
- {true,false} -> generate(Type, TriesLeft - 1, {ok,ImmInstance});
- {false,false} -> generate(Type, TriesLeft - 1, Fallback)
- end.
-
-%% @equiv pick(Type, 10)
--spec pick(Type::proper_types:raw_type()) -> {'ok',instance()} | 'error'.
-pick(RawType) ->
- pick(RawType, 10).
-
-%% @equiv pick(Type, Size, os:timestamp())
--spec pick(Type::proper_types:raw_type(), size()) -> {'ok',instance()} | 'error'.
-pick(RawType, Size) ->
- pick(RawType, Size, os:timestamp()).
-
-%% @doc Generates a random instance of `Type', of size `Size' with seed `Seed'.
--spec pick(Type::proper_types:raw_type(), size(), seed()) ->
- {'ok',instance()} | 'error'.
-pick(RawType, Size, Seed) ->
- proper:global_state_init_size_seed(Size, Seed),
- case clean_instance(safe_generate(RawType)) of
- {ok,Instance} = Result ->
- Msg = "WARNING: Some garbage has been left in the process registry "
- "and the code server~n"
- "to allow for the returned function(s) to run normally.~n"
- "Please run proper:global_state_erase() when done.~n",
- case contains_fun(Instance) of
- true -> io:format(Msg, []);
- false -> proper:global_state_erase()
- end,
- Result;
- {error,Reason} ->
- proper:report_error(Reason, fun io:format/2),
- proper:global_state_erase(),
- error
- end.
-
-%% @equiv sample(Type, 10, 20)
--spec sample(Type::proper_types:raw_type()) -> 'ok'.
-sample(RawType) ->
- sample(RawType, 10, 20).
-
-%% @doc Generates and prints one random instance of `Type' for each size from
-%% `StartSize' up to `EndSize'.
--spec sample(Type::proper_types:raw_type(), size(), size()) -> 'ok'.
-sample(RawType, StartSize, EndSize) when StartSize =< EndSize ->
- Tests = EndSize - StartSize + 1,
- Prop = ?FORALL(X, RawType, begin io:format("~p~n",[X]), true end),
- Opts = [quiet,{start_size,StartSize},{max_size,EndSize},{numtests,Tests}],
- _ = proper:quickcheck(Prop, Opts),
- ok.
-
-%% @equiv sampleshrink(Type, 10)
--spec sampleshrink(Type::proper_types:raw_type()) -> 'ok'.
-sampleshrink(RawType) ->
- sampleshrink(RawType, 10).
-
-%% @doc Generates a random instance of `Type', of size `Size', then shrinks it
-%% as far as it goes. The value produced on each step of the shrinking process
-%% is printed on the screen.
--spec sampleshrink(Type::proper_types:raw_type(), size()) -> 'ok'.
-sampleshrink(RawType, Size) ->
- proper:global_state_init_size(Size),
- Type = proper_types:cook_outer(RawType),
- case safe_generate(Type) of
- {ok,ImmInstance} ->
- Shrunk = keep_shrinking(ImmInstance, [], Type),
- PrintInst = fun(I) -> io:format("~p~n",[clean_instance(I)]) end,
- lists:foreach(PrintInst, Shrunk);
- {error,Reason} ->
- proper:report_error(Reason, fun io:format/2)
- end,
- proper:global_state_erase(),
- ok.
-
--spec keep_shrinking(imm_instance(), [imm_instance()], proper_types:type()) ->
- [imm_instance(),...].
-keep_shrinking(ImmInstance, Acc, Type) ->
- keep_shrinking(ImmInstance, Acc, Type, init).
-
-keep_shrinking(ImmInstance, Acc, Type, State) ->
- case proper_shrink:shrink(ImmInstance, Type, State) of
- {[], done} -> %% no more shrinkers
- lists:reverse([ImmInstance|Acc]);
- {[], NewState} ->
- %% try next shrinker
- keep_shrinking(ImmInstance, Acc, Type, NewState);
- {[Shrunk|_Rest], _NewState} ->
- Acc2 = [ImmInstance|Acc],
- case lists:member(Shrunk, Acc2) of
- true ->
- %% Avoid infinite loops
- lists:reverse(Acc2);
- false ->
- keep_shrinking(Shrunk, Acc2, Type)
- end
- end.
-
--spec contains_fun(term()) -> boolean().
-contains_fun(List) when is_list(List) ->
- proper_arith:safe_any(fun contains_fun/1, List);
-contains_fun(Tuple) when is_tuple(Tuple) ->
- contains_fun(tuple_to_list(Tuple));
-contains_fun(Fun) when is_function(Fun) ->
- true;
-contains_fun(_Term) ->
- false.
-
-
-%%-----------------------------------------------------------------------------
-%% Utility functions
-%%-----------------------------------------------------------------------------
-
-%% @private
--spec normal_gen(proper_types:type()) -> imm_instance().
-normal_gen(Type) ->
- case proper_types:get_prop(generator, Type) of
- {typed, Gen} ->
- if
- is_function(Gen, 1) -> Gen(Type);
- is_function(Gen, 2) -> Gen(Type, proper:get_size(Type))
- end;
- Gen ->
- if
- is_function(Gen, 0) -> Gen();
- is_function(Gen, 1) -> Gen(proper:get_size(Type))
- end
- end.
-
-%% @private
--spec alt_gens(proper_types:type()) -> [imm_instance()].
-alt_gens(Type) ->
- case proper_types:find_prop(alt_gens, Type) of
- {ok, AltGens} -> ?FORCE(AltGens);
- error -> []
- end.
-
-%% @private
--spec clean_instance(imm_instance()) -> instance().
-clean_instance({'$used',_ImmParts,ImmInstance}) ->
- clean_instance(ImmInstance);
-clean_instance({'$to_part',ImmInstance}) ->
- clean_instance(ImmInstance);
-clean_instance(ImmInstance) ->
- if
- is_list(ImmInstance) ->
- %% CAUTION: this must handle improper lists
- proper_arith:safe_map(fun clean_instance/1, ImmInstance);
- is_tuple(ImmInstance) ->
- proper_arith:tuple_map(fun clean_instance/1, ImmInstance);
- true ->
- ImmInstance
- end.
-
-
-%%-----------------------------------------------------------------------------
-%% Basic type generators
-%%-----------------------------------------------------------------------------
-
-%% @private
--spec integer_gen(size(), proper_types:extint(), proper_types:extint()) ->
- integer().
-integer_gen(Size, inf, inf) ->
- proper_arith:rand_int(Size);
-integer_gen(Size, inf, High) ->
- High - proper_arith:rand_non_neg_int(Size);
-integer_gen(Size, Low, inf) ->
- Low + proper_arith:rand_non_neg_int(Size);
-integer_gen(Size, Low, High) ->
- proper_arith:smart_rand_int(Size, Low, High).
-
-%% @private
--spec float_gen(size(), proper_types:extnum(), proper_types:extnum()) ->
- float().
-float_gen(Size, inf, inf) ->
- proper_arith:rand_float(Size);
-float_gen(Size, inf, High) ->
- High - proper_arith:rand_non_neg_float(Size);
-float_gen(Size, Low, inf) ->
- Low + proper_arith:rand_non_neg_float(Size);
-float_gen(_Size, Low, High) ->
- proper_arith:rand_float(Low, High).
-
-%% @private
--spec atom_gen(size()) -> proper_types:type().
-%% We make sure we never clash with internal atoms by checking that the first
-%% character is not '$'.
-atom_gen(Size) ->
- ?LET(Str,
- ?SUCHTHAT(X,
- proper_types:resize(Size,
- proper_types:list(proper_types:byte())),
- X =:= [] orelse hd(X) =/= $$),
- list_to_atom(Str)).
-
-%% @private
--spec atom_rev(atom()) -> imm_instance().
-atom_rev(Atom) ->
- {'$used', atom_to_list(Atom), Atom}.
-
-%% @private
--spec binary_gen(size()) -> proper_types:type().
-binary_gen(Size) ->
- ?LET(Bytes,
- proper_types:resize(Size,
- proper_types:list(proper_types:byte())),
- list_to_binary(Bytes)).
-
-%% @private
--spec binary_rev(binary()) -> imm_instance().
-binary_rev(Binary) ->
- {'$used', binary_to_list(Binary), Binary}.
-
-%% @private
--spec binary_len_gen(length()) -> proper_types:type().
-binary_len_gen(Len) ->
- ?LET(Bytes,
- proper_types:vector(Len, proper_types:byte()),
- list_to_binary(Bytes)).
-
-%% @private
--spec bitstring_gen(size()) -> proper_types:type().
-bitstring_gen(Size) ->
- ?LET({BytesHead, NumBits, TailByte},
- {proper_types:resize(Size,proper_types:binary()),
- proper_types:range(0,7), proper_types:range(0,127)},
- <<BytesHead/binary, TailByte:NumBits>>).
-
-%% @private
--spec bitstring_rev(bitstring()) -> imm_instance().
-bitstring_rev(BitString) ->
- List = bitstring_to_list(BitString),
- {BytesList, BitsTail} = lists:splitwith(fun erlang:is_integer/1, List),
- {NumBits, TailByte} = case BitsTail of
- [] -> {0, 0};
- [Bits] -> N = bit_size(Bits),
- <<Byte:N>> = Bits,
- {N, Byte}
- end,
- {'$used',
- {{'$used',BytesList,list_to_binary(BytesList)}, NumBits, TailByte},
- BitString}.
-
-%% @private
--spec bitstring_len_gen(length()) -> proper_types:type().
-bitstring_len_gen(Len) ->
- BytesLen = Len div 8,
- BitsLen = Len rem 8,
- ?LET({BytesHead, NumBits, TailByte},
- {proper_types:binary(BytesLen), BitsLen,
- proper_types:range(0, 1 bsl BitsLen - 1)},
- <<BytesHead/binary, TailByte:NumBits>>).
-
-%% @private
--spec list_gen(size(), proper_types:type()) -> [imm_instance()].
-list_gen(Size, ElemType) ->
- Len = proper_arith:rand_int(0, Size),
- vector_gen(Len, ElemType).
-
-%% @private
--spec distlist_gen(size(), sized_generator(), boolean()) -> [imm_instance()].
-distlist_gen(RawSize, Gen, NonEmpty) ->
- Len = case NonEmpty of
- true -> proper_arith:rand_int(1, erlang:max(1,RawSize));
- false -> proper_arith:rand_int(0, RawSize)
- end,
- Size = case Len of
- 1 -> RawSize - 1;
- _ -> RawSize
- end,
- %% TODO: this produces a lot of types: maybe a simple 'div' is sufficient?
- Sizes = proper_arith:distribute(Size, Len),
- InnerTypes = [Gen(S) || S <- Sizes],
- fixed_list_gen(InnerTypes).
-
-%% @private
--spec vector_gen(length(), proper_types:type()) -> [imm_instance()].
-vector_gen(Len, ElemType) ->
- vector_gen_tr(Len, ElemType, []).
-
--spec vector_gen_tr(length(), proper_types:type(), [imm_instance()]) ->
- [imm_instance()].
-vector_gen_tr(0, _ElemType, AccList) ->
- AccList;
-vector_gen_tr(Left, ElemType, AccList) ->
- vector_gen_tr(Left - 1, ElemType, [generate(ElemType) | AccList]).
-
-%% @private
--spec union_gen([proper_types:type(),...]) -> imm_instance().
-union_gen(Choices) ->
- {_Choice,Type} = proper_arith:rand_choose(Choices),
- generate(Type).
-
-%% @private
--spec weighted_union_gen([{frequency(),proper_types:type()},...]) ->
- imm_instance().
-weighted_union_gen(FreqChoices) ->
- {_Choice,Type} = proper_arith:freq_choose(FreqChoices),
- generate(Type).
-
-%% @private
--spec safe_union_gen([proper_types:type(),...]) -> imm_instance().
-safe_union_gen(Choices) ->
- {Choice,Type} = proper_arith:rand_choose(Choices),
- try generate(Type)
- catch
- error:_ ->
- safe_union_gen(proper_arith:list_remove(Choice, Choices))
- end.
-
-%% @private
--spec safe_weighted_union_gen([{frequency(),proper_types:type()},...]) ->
- imm_instance().
-safe_weighted_union_gen(FreqChoices) ->
- {Choice,Type} = proper_arith:freq_choose(FreqChoices),
- try generate(Type)
- catch
- error:_ ->
- safe_weighted_union_gen(proper_arith:list_remove(Choice,
- FreqChoices))
- end.
-
-%% @private
--spec tuple_gen([proper_types:type()]) -> tuple().
-tuple_gen(Fields) ->
- list_to_tuple(fixed_list_gen(Fields)).
-
-%% @private
--spec loose_tuple_gen(size(), proper_types:type()) -> proper_types:type().
-loose_tuple_gen(Size, ElemType) ->
- ?LET(L,
- proper_types:resize(Size, proper_types:list(ElemType)),
- list_to_tuple(L)).
-
-%% @private
--spec loose_tuple_rev(tuple(), proper_types:type()) -> imm_instance().
-loose_tuple_rev(Tuple, ElemType) ->
- CleanList = tuple_to_list(Tuple),
- List = case proper_types:find_prop(reverse_gen, ElemType) of
- {ok,{typed, ReverseGen}} ->
- [ReverseGen(ElemType,X) || X <- CleanList];
- {ok,ReverseGen} -> [ReverseGen(X) || X <- CleanList];
- error -> CleanList
- end,
- {'$used', List, Tuple}.
-
-%% @private
--spec exactly_gen(T) -> T.
-exactly_gen(X) ->
- X.
-
-%% @private
--spec fixed_list_gen([proper_types:type()]) -> imm_instance()
- ; ({[proper_types:type()],proper_types:type()}) ->
- maybe_improper_list(imm_instance(), imm_instance() | []).
-fixed_list_gen({ProperHead,ImproperTail}) ->
- [generate(F) || F <- ProperHead] ++ generate(ImproperTail);
-fixed_list_gen(ProperFields) ->
- [generate(F) || F <- ProperFields].
-
-%% @private
--spec function_gen(arity(), proper_types:type()) -> function().
-function_gen(Arity, RetType) ->
- FunSeed = {proper_arith:rand_int(0, ?SEED_RANGE - 1),
- proper_arith:rand_int(0, ?SEED_RANGE - 1)},
- create_fun(Arity, RetType, FunSeed).
-
-%% @private
--spec any_gen(size()) -> imm_instance().
-any_gen(Size) ->
- case get('$any_type') of
- undefined -> real_any_gen(Size);
- {type,AnyType} -> generate(proper_types:resize(Size, AnyType))
- end.
-
--spec real_any_gen(size()) -> imm_instance().
-real_any_gen(0) ->
- SimpleTypes = [proper_types:integer(), proper_types:float(),
- proper_types:atom()],
- union_gen(SimpleTypes);
-real_any_gen(Size) ->
- FreqChoices = [{?ANY_SIMPLE_PROB,simple}, {?ANY_BINARY_PROB,binary},
- {?ANY_EXPAND_PROB,expand}],
- case proper_arith:freq_choose(FreqChoices) of
- {_,simple} ->
- real_any_gen(0);
- {_,binary} ->
- generate(proper_types:resize(Size, proper_types:bitstring()));
- {_,expand} ->
- %% TODO: statistics of produced terms?
- NumElems = proper_arith:rand_int(0, Size - 1),
- ElemSizes = proper_arith:distribute(Size - 1, NumElems),
- ElemTypes = [?LAZY(real_any_gen(S)) || S <- ElemSizes],
- case proper_arith:rand_int(1,2) of
- 1 -> fixed_list_gen(ElemTypes);
- 2 -> tuple_gen(ElemTypes)
- end
- end.
-
-%% @private
--spec native_type_gen(mod_name(), string()) -> proper_types:type().
-native_type_gen(Mod, TypeStr) ->
- case proper_typeserver:translate_type({Mod,TypeStr}) of
- {ok,Type} -> Type;
- {error,Reason} -> throw({'$typeserver',Reason})
- end.
-
-
-%%------------------------------------------------------------------------------
-%% Function-generation functions
-%%------------------------------------------------------------------------------
-
--spec create_fun(arity(), proper_types:type(), fun_seed()) -> function().
-create_fun(_Arity, _RetType, _FunSeed) ->
- fun() -> throw('$arity_limit') end.
-
-%% @private
--spec get_ret_type(function()) -> proper_types:type().
-get_ret_type(Fun) ->
- {arity,Arity} = erlang:fun_info(Fun, arity),
- put('$get_ret_type', true),
- RetType = apply(Fun, lists:duplicate(Arity,dummy)),
- erase('$get_ret_type'),
- RetType.
diff --git a/lib/dialyzer/test/behaviour_SUITE_data/src/proper/proper_internal.hrl b/lib/dialyzer/test/behaviour_SUITE_data/src/proper/proper_internal.hrl
deleted file mode 100644
index 89e6b34296..0000000000
--- a/lib/dialyzer/test/behaviour_SUITE_data/src/proper/proper_internal.hrl
+++ /dev/null
@@ -1,98 +0,0 @@
-%%% Copyright 2010-2013 Manolis Papadakis <manopapad@gmail.com>,
-%%% Eirini Arvaniti <eirinibob@gmail.com>
-%%% and Kostis Sagonas <kostis@cs.ntua.gr>
-%%%
-%%% This file is part of PropEr.
-%%%
-%%% PropEr is free software: you can redistribute it and/or modify
-%%% it under the terms of the GNU General Public License as published by
-%%% the Free Software Foundation, either version 3 of the License, or
-%%% (at your option) any later version.
-%%%
-%%% PropEr is distributed in the hope that it will be useful,
-%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
-%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-%%% GNU General Public License for more details.
-%%%
-%%% You should have received a copy of the GNU General Public License
-%%% along with PropEr. If not, see <http://www.gnu.org/licenses/>.
-
-%%% @copyright 2010-2016 Manolis Papadakis, Eirini Arvaniti and Kostis Sagonas
-%%% @version {@version}
-%%% @author Manolis Papadakis
-%%% @doc Internal header file: This header is included in all PropEr source
-%%% files.
-
--include("compile_flags.hrl").
--include("proper_common.hrl").
-
-
-%%------------------------------------------------------------------------------
-%% Activate strip_types parse transform
-%%------------------------------------------------------------------------------
-
--ifdef(NO_TYPES).
--compile({parse_transform, strip_types}).
--endif.
-
-%%------------------------------------------------------------------------------
-%% Random generator selection
-%%------------------------------------------------------------------------------
-
--ifdef(USE_SFMT).
--define(RANDOM_MOD, sfmt).
--define(SEED_NAME, sfmt_seed).
--else.
--define(RANDOM_MOD, random).
--define(SEED_NAME, random_seed).
--endif.
-
-%%------------------------------------------------------------------------------
-%% Macros
-%%------------------------------------------------------------------------------
-
--define(PROPERTY_PREFIX, "prop_").
-
-
-%%------------------------------------------------------------------------------
-%% Constants
-%%------------------------------------------------------------------------------
-
--define(SEED_RANGE, 4294967296).
--define(MAX_ARITY, 20).
--define(MAX_TRIES_FACTOR, 5).
--define(ANY_SIMPLE_PROB, 3).
--define(ANY_BINARY_PROB, 1).
--define(ANY_EXPAND_PROB, 8).
--define(SMALL_RANGE_THRESHOLD, 16#FFFF).
-
-
-%%------------------------------------------------------------------------------
-%% Common type aliases
-%%------------------------------------------------------------------------------
-
-%% TODO: Perhaps these should be moved inside modules.
--type mod_name() :: atom().
--type fun_name() :: atom().
--type size() :: non_neg_integer().
--type length() :: non_neg_integer().
--type position() :: pos_integer().
--type frequency() :: pos_integer().
--type seed() :: {non_neg_integer(), non_neg_integer(), non_neg_integer()}.
-
--type abs_form() :: erl_parse:abstract_form().
--type abs_expr() :: erl_parse:abstract_expr().
--type abs_clause() :: erl_parse:abstract_clause().
-
-%% TODO: Replace these with the appropriate types from stdlib.
--ifdef(AT_LEAST_19).
--type abs_type() :: erl_parse:abstract_type().
--type abs_rec_field() :: term(). % erl_parse:af_field_decl().
--else.
--type abs_type() :: term().
--type abs_rec_field() :: term().
--endif.
-
--type loose_tuple(T) :: {} | {T} | {T,T} | {T,T,T} | {T,T,T,T} | {T,T,T,T,T}
- | {T,T,T,T,T,T} | {T,T,T,T,T,T,T} | {T,T,T,T,T,T,T,T}
- | {T,T,T,T,T,T,T,T,T} | {T,T,T,T,T,T,T,T,T,T} | tuple().
diff --git a/lib/dialyzer/test/behaviour_SUITE_data/src/proper/proper_types.erl b/lib/dialyzer/test/behaviour_SUITE_data/src/proper/proper_types.erl
deleted file mode 100644
index 6b154b813b..0000000000
--- a/lib/dialyzer/test/behaviour_SUITE_data/src/proper/proper_types.erl
+++ /dev/null
@@ -1,1353 +0,0 @@
-%%% Copyright 2010-2013 Manolis Papadakis <manopapad@gmail.com>,
-%%% Eirini Arvaniti <eirinibob@gmail.com>
-%%% and Kostis Sagonas <kostis@cs.ntua.gr>
-%%%
-%%% This file is part of PropEr.
-%%%
-%%% PropEr is free software: you can redistribute it and/or modify
-%%% it under the terms of the GNU General Public License as published by
-%%% the Free Software Foundation, either version 3 of the License, or
-%%% (at your option) any later version.
-%%%
-%%% PropEr is distributed in the hope that it will be useful,
-%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
-%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-%%% GNU General Public License for more details.
-%%%
-%%% You should have received a copy of the GNU General Public License
-%%% along with PropEr. If not, see <http://www.gnu.org/licenses/>.
-
-%%% @copyright 2010-2013 Manolis Papadakis, Eirini Arvaniti and Kostis Sagonas
-%%% @version {@version}
-%%% @author Manolis Papadakis
-
-%%% @doc Type manipulation functions and predefined types.
-%%%
-%%% == Basic types ==
-%%% This module defines all the basic types of the PropEr type system as
-%%% functions. See the <a href="#index">function index</a> for an overview.
-%%%
-%%% Types can be combined in tuples or lists to produce other types. Exact
-%%% values (such as exact numbers, atoms, binaries and strings) can be combined
-%%% with types inside such structures, like in this example of the type of a
-%%% tagged tuple: ``{'result', integer()}''.
-%%%
-%%% When including the PropEr header file, all
-%%% <a href="#index">API functions</a> of this module are automatically
-%%% imported, unless `PROPER_NO_IMPORTS' is defined.
-%%%
-%%% == Customized types ==
-%%% The following operators can be applied to basic types in order to produce
-%%% new ones:
-%%%
-%%% <dl>
-%%% <dt>`?LET(<Xs>, <Xs_type>, <In>)'</dt>
-%%% <dd>To produce an instance of this type, all appearances of the variables
-%%% in `<Xs>' are replaced inside `<In>' by their corresponding values in a
-%%% randomly generated instance of `<Xs_type>'. It's OK for the `<In>' part to
-%%% evaluate to a type - in that case, an instance of the inner type is
-%%% generated recursively.</dd>
-%%% <dt>`?SUCHTHAT(<X>, <Type>, <Condition>)'</dt>
-%%% <dd>This produces a specialization of `<Type>', which only includes those
-%%% members of `<Type>' that satisfy the constraint `<Condition>' - that is,
-%%% those members for which the function `fun(<X>) -> <Condition> end' returns
-%%% `true'. If the constraint is very strict - that is, only a small
-%%% percentage of instances of `<Type>' pass the test - it will take a lot of
-%%% tries for the instance generation subsystem to randomly produce a valid
-%%% instance. This will result in slower testing, and testing may even be
-%%% stopped short, in case the `constraint_tries' limit is reached (see the
-%%% "Options" section in the documentation of the {@link proper} module). If
-%%% this is the case, it would be more appropriate to generate valid instances
-%%% of the specialized type using the `?LET' macro. Also make sure that even
-%%% small instances can satisfy the constraint, since PropEr will only try
-%%% small instances at the start of testing. If this is not possible, you can
-%%% instruct PropEr to start at a larger size, by supplying a suitable value
-%%% for the `start_size' option (see the "Options" section in the
-%%% documentation of the {@link proper} module).</dd>
-%%% <dt>`?SUCHTHATMAYBE(<X>, <Type>, <Condition>)'</dt>
-%%% <dd>Equivalent to the `?SUCHTHAT' macro, but the constraint `<Condition>'
-%%% is considered non-strict: if the `constraint_tries' limit is reached, the
-%%% generator will just return an instance of `<Type>' instead of failing,
-%%% even if that instance doesn't satisfy the constraint.</dd>
-%%% <dt>`?SHRINK(<Generator>, <List_of_alt_gens>)'</dt>
-%%% <dd>This creates a type whose instances are generated by evaluating the
-%%% statement block `<Generator>' (this may evaluate to a type, which will
-%%% then be generated recursively). If an instance of such a type is to be
-%%% shrunk, the generators in `<List_of_alt_gens>' are first run to produce
-%%% hopefully simpler instances of the type. Thus, the generators in the
-%%% second argument should be simpler than the default. The simplest ones
-%%% should be at the front of the list, since those are the generators
-%%% preferred by the shrinking subsystem. Like the main `<Generator>', the
-%%% alternatives may also evaluate to a type, which is generated recursively.
-%%% </dd>
-%%% <dt>`?LETSHRINK(<List_of_variables>, <List_of_types>, <Generator>)'</dt>
-%%% <dd>This is created by combining a `?LET' and a `?SHRINK' macro. Instances
-%%% are generated by applying a randomly generated list of values inside
-%%% `<Generator>' (just like a `?LET', with the added constraint that the
-%%% variables and types must be provided in a list - alternatively,
-%%% `<List_of_types>' may be a list or vector type). When shrinking instances
-%%% of such a type, the sub-instances that were combined to produce it are
-%%% first tried in place of the failing instance.</dd>
-%%% <dt>`?LAZY(<Generator>)'</dt>
-%%% <dd>This construct returns a type whose only purpose is to delay the
-%%% evaluation of `<Generator>' (`<Generator>' can return a type, which will
-%%% be generated recursively). Using this, you can simulate the lazy
-%%% generation of instances:
-%%% ``` stream() -> ?LAZY(frequency([ {1,[]}, {3,[0|stream()]} ])). '''
-%%% The above type produces lists of zeroes with an average length of 3. Note
-%%% that, had we not enclosed the generator with a `?LAZY' macro, the
-%%% evaluation would continue indefinitely, due to the eager evaluation of
-%%% the Erlang language.</dd>
-%%% <dt>`non_empty(<List_or_binary_type>)'</dt>
-%%% <dd>See the documentation for {@link non_empty/1}.</dd>
-%%% <dt>`noshrink(<Type>)'</dt>
-%%% <dd>See the documentation for {@link noshrink/1}.</dd>
-%%% <dt>`default(<Default_value>, <Type>)'</dt>
-%%% <dd>See the documentation for {@link default/2}.</dd>
-%%% <dt>`with_parameter(<Parameter>, <Value>, <Type>)'</dt>
-%%% <dd>See the documentation for {@link with_parameter/3}.</dd>
-%%% <dt>`with_parameters(<Param_value_pairs>, <Type>)'</dt>
-%%% <dd>See the documentation for {@link with_parameters/2}.</dd>
-%%% </dl>
-%%%
-%%% == Size manipulation ==
-%%% The following operators are related to the `size' parameter, which controls
-%%% the maximum size of produced instances. The actual size of a produced
-%%% instance is chosen randomly, but can never exceed the value of the `size'
-%%% parameter at the moment of generation. A more accurate definition is the
-%%% following: the maximum instance of `size S' can never be smaller than the
-%%% maximum instance of `size S-1'. The actual size of an instance is measured
-%%% differently for each type: the actual size of a list is its length, while
-%%% the actual size of a tree may be the number of its internal nodes. Some
-%%% types, e.g. unions, have no notion of size, thus their generation is not
-%%% influenced by the value of `size'. The `size' parameter starts at 1 and
-%%% grows automatically during testing.
-%%%
-%%% <dl>
-%%% <dt>`?SIZED(<S>, <Generator>)'</dt>
-%%% <dd>Creates a new type, whose instances are produced by replacing all
-%%% appearances of the `<S>' parameter inside the statement block
-%%% `<Generator>' with the value of the `size' parameter. It's OK for the
-%%% `<Generator>' to return a type - in that case, an instance of the inner
-%%% type is generated recursively.</dd>
-%%% <dt>`resize(<New_size>, <Type>)'</dt>
-%%% <dd>See the documentation for {@link resize/2}.</dd>
-%%% </dl>
-
--module(proper_types).
--export([is_inst/2, is_inst/3]).
-
--export([integer/2, float/2, atom/0, binary/0, binary/1, bitstring/0,
- bitstring/1, list/1, vector/2, union/1, weighted_union/1, tuple/1,
- loose_tuple/1, exactly/1, fixed_list/1, function/2, any/0,
- shrink_list/1, safe_union/1, safe_weighted_union/1]).
--export([integer/0, non_neg_integer/0, pos_integer/0, neg_integer/0, range/2,
- float/0, non_neg_float/0, number/0, boolean/0, byte/0, char/0,
- list/0, tuple/0, string/0, wunion/1, term/0, timeout/0, arity/0]).
--export([int/0, nat/0, largeint/0, real/0, bool/0, choose/2, elements/1,
- oneof/1, frequency/1, return/1, default/2, orderedlist/1, function0/1,
- function1/1, function2/1, function3/1, function4/1,
- weighted_default/2]).
--export([resize/2, non_empty/1, noshrink/1]).
-
--export([cook_outer/1, is_type/1, equal_types/2, is_raw_type/1, to_binary/1,
- from_binary/1, get_prop/2, find_prop/2, safe_is_instance/2,
- is_instance/2, unwrap/1, weakly/1, strongly/1, satisfies_all/2,
- new_type/2, subtype/2]).
--export([lazy/1, sized/1, bind/3, shrinkwith/2, add_constraint/3,
- native_type/2, distlist/3, with_parameter/3, with_parameters/2,
- parameter/1, parameter/2]).
--export([le/2]).
-
--export_type([type/0, raw_type/0, extint/0, extnum/0]).
-
--include("proper_internal.hrl").
-
-
-%%------------------------------------------------------------------------------
-%% Comparison with erl_types
-%%------------------------------------------------------------------------------
-
-%% Missing types
-%% -------------------
-%% will do:
-%% records, maybe_improper_list(T,S), nonempty_improper_list(T,S)
-%% maybe_improper_list(), maybe_improper_list(T), iolist, iodata
-%% don't need:
-%% nonempty_{list,string,maybe_improper_list}
-%% won't do:
-%% pid, port, ref, identifier, none, no_return, module, mfa, node
-%% array, dict, digraph, set, gb_tree, gb_set, queue, tid
-
-%% Missing type information
-%% ------------------------
-%% bin types:
-%% other unit sizes? what about size info?
-%% functions:
-%% generally some fun, unspecified number of arguments but specified
-%% return type
-%% any:
-%% doesn't cover functions and improper lists
-
-
-%%------------------------------------------------------------------------------
-%% Type declaration macros
-%%------------------------------------------------------------------------------
-
--define(BASIC(PropList), new_type(PropList,basic)).
--define(WRAPPER(PropList), new_type(PropList,wrapper)).
--define(CONSTRUCTED(PropList), new_type(PropList,constructed)).
--define(CONTAINER(PropList), new_type(PropList,container)).
--define(SUBTYPE(Type,PropList), subtype(PropList,Type)).
-
-
-%%------------------------------------------------------------------------------
-%% Types
-%%------------------------------------------------------------------------------
-
--type type_kind() :: 'basic' | 'wrapper' | 'constructed' | 'container' | atom().
--type instance_test() :: fun((proper_gen:imm_instance()) -> boolean())
- | {'typed',
- fun((proper_types:type(),
- proper_gen:imm_instance()) -> boolean())}.
--type index() :: pos_integer().
-%% @alias
--type value() :: term().
-%% @private_type
-%% @alias
--type extint() :: integer() | 'inf'.
-%% @private_type
-%% @alias
--type extnum() :: number() | 'inf'.
--type constraint_fun() :: fun((proper_gen:instance()) -> boolean()).
-
--opaque type() :: {'$type', [type_prop()]}.
-%% A type of the PropEr type system
-%% @type raw_type(). You can consider this as an equivalent of {@type type()}.
--type raw_type() :: type() | [raw_type()] | loose_tuple(raw_type()) | term().
--type type_prop_name() :: 'kind' | 'generator' | 'reverse_gen' | 'parts_type'
- | 'combine' | 'alt_gens' | 'shrink_to_parts'
- | 'size_transform' | 'is_instance' | 'shrinkers'
- | 'noshrink' | 'internal_type' | 'internal_types'
- | 'get_length' | 'split' | 'join' | 'get_indices'
- | 'remove' | 'retrieve' | 'update' | 'constraints'
- | 'parameters' | 'env' | 'subenv'.
-
--type type_prop_value() :: term().
--type type_prop() ::
- {'kind', type_kind()}
- | {'generator', proper_gen:generator()}
- | {'reverse_gen', proper_gen:reverse_gen()}
- | {'parts_type', type()}
- | {'combine', proper_gen:combine_fun()}
- | {'alt_gens', proper_gen:alt_gens()}
- | {'shrink_to_parts', boolean()}
- | {'size_transform', fun((size()) -> size())}
- | {'is_instance', instance_test()}
- | {'shrinkers', [proper_shrink:shrinker()]}
- | {'noshrink', boolean()}
- | {'internal_type', raw_type()}
- | {'internal_types', tuple() | maybe_improper_list(type(),type() | [])}
- %% The items returned by 'remove' must be of this type.
- | {'get_length', fun((proper_gen:imm_instance()) -> length())}
- %% If this is a container type, this should return the number of elements
- %% it contains.
- | {'split', fun((proper_gen:imm_instance()) -> [proper_gen:imm_instance()])
- | fun((length(),proper_gen:imm_instance()) ->
- {proper_gen:imm_instance(),proper_gen:imm_instance()})}
- %% If present, the appropriate form depends on whether get_length is
- %% defined: if get_length is undefined, this must be in the one-argument
- %% form (e.g. a tree should be split into its subtrees), else it must be
- %% in the two-argument form (e.g. a list should be split in two at the
- %% index provided).
- | {'join', fun((proper_gen:imm_instance(),proper_gen:imm_instance()) ->
- proper_gen:imm_instance())}
- | {'get_indices', fun((proper_types:type(),
- proper_gen:imm_instance()) -> [index()])}
- %% If this is a container type, this should return a list of indices we
- %% can use to remove or insert elements from the given instance.
- | {'remove', fun((index(),proper_gen:imm_instance()) ->
- proper_gen:imm_instance())}
- | {'retrieve', fun((index(), proper_gen:imm_instance() | tuple()
- | maybe_improper_list(type(),type() | [])) ->
- value() | type())}
- | {'update', fun((index(),value(),proper_gen:imm_instance()) ->
- proper_gen:imm_instance())}
- | {'constraints', [{constraint_fun(), boolean()}]}
- %% A list of constraints on instances of this type: each constraint is a
- %% tuple of a fun that must return 'true' for each valid instance and a
- %% boolean field that specifies whether the condition is strict.
- | {'parameters', [{atom(),value()}]}
- | {'env', term()}
- | {'subenv', term()}.
-
-
-%%------------------------------------------------------------------------------
-%% Type manipulation functions
-%%------------------------------------------------------------------------------
-
-%% TODO: We shouldn't need the fully qualified type name in the range of these
-%% functions.
-
-%% @private
-%% TODO: just cook/1 ?
--spec cook_outer(raw_type()) -> proper_types:type().
-cook_outer(Type = {'$type',_Props}) ->
- Type;
-cook_outer(RawType) ->
- if
- is_tuple(RawType) -> tuple(tuple_to_list(RawType));
- %% CAUTION: this must handle improper lists
- is_list(RawType) -> fixed_list(RawType);
- %% default case (covers integers, floats, atoms, binaries, ...):
- true -> exactly(RawType)
- end.
-
-%% @private
--spec is_type(term()) -> boolean().
-is_type({'$type',_Props}) ->
- true;
-is_type(_) ->
- false.
-
-%% @private
--spec equal_types(proper_types:type(), proper_types:type()) -> boolean().
-equal_types(SameType, SameType) ->
- true;
-equal_types(_, _) ->
- false.
-
-%% @private
--spec is_raw_type(term()) -> boolean().
-is_raw_type({'$type',_TypeProps}) ->
- true;
-is_raw_type(X) ->
- if
- is_tuple(X) -> is_raw_type_list(tuple_to_list(X));
- is_list(X) -> is_raw_type_list(X);
- true -> false
- end.
-
--spec is_raw_type_list(maybe_improper_list()) -> boolean().
-%% CAUTION: this must handle improper lists
-is_raw_type_list(List) ->
- proper_arith:safe_any(fun is_raw_type/1, List).
-
-%% @private
--spec to_binary(proper_types:type()) -> binary().
-to_binary(Type) ->
- term_to_binary(Type).
-
-%% @private
--ifdef(AT_LEAST_17).
--spec from_binary(binary()) -> proper_types:type().
--endif.
-from_binary(Binary) ->
- binary_to_term(Binary).
-
--spec type_from_list([type_prop()]) -> proper_types:type().
-type_from_list(KeyValueList) ->
- {'$type',KeyValueList}.
-
--spec add_prop(type_prop_name(), type_prop_value(), proper_types:type()) ->
- proper_types:type().
-add_prop(PropName, Value, {'$type',Props}) ->
- {'$type',lists:keystore(PropName, 1, Props, {PropName, Value})}.
-
--spec add_props([type_prop()], proper_types:type()) -> proper_types:type().
-add_props(PropList, {'$type',OldProps}) ->
- {'$type', lists:foldl(fun({N,_}=NV,Acc) ->
- lists:keystore(N, 1, Acc, NV)
- end, OldProps, PropList)}.
-
--spec append_to_prop(type_prop_name(), type_prop_value(),
- proper_types:type()) -> proper_types:type().
-append_to_prop(PropName, Value, {'$type',Props}) ->
- Val = case lists:keyfind(PropName, 1, Props) of
- {PropName, V} ->
- V;
- _ ->
- []
- end,
- {'$type', lists:keystore(PropName, 1, Props,
- {PropName, lists:reverse([Value|Val])})}.
-
--spec append_list_to_prop(type_prop_name(), [type_prop_value()],
- proper_types:type()) -> proper_types:type().
-append_list_to_prop(PropName, List, {'$type',Props}) ->
- {PropName, Val} = lists:keyfind(PropName, 1, Props),
- {'$type', lists:keystore(PropName, 1, Props, {PropName, Val++List})}.
-
-%% @private
--spec get_prop(type_prop_name(), proper_types:type()) -> type_prop_value().
-get_prop(PropName, {'$type',Props}) ->
- {_PropName, Val} = lists:keyfind(PropName, 1, Props),
- Val.
-
-%% @private
--spec find_prop(type_prop_name(), proper_types:type()) ->
- {'ok',type_prop_value()} | 'error'.
-find_prop(PropName, {'$type',Props}) ->
- case lists:keyfind(PropName, 1, Props) of
- {PropName, Value} ->
- {ok, Value};
- _ ->
- error
- end.
-
-%% @private
--spec new_type([type_prop()], type_kind()) -> proper_types:type().
-new_type(PropList, Kind) ->
- Type = type_from_list(PropList),
- add_prop(kind, Kind, Type).
-
-%% @private
--spec subtype([type_prop()], proper_types:type()) -> proper_types:type().
-%% TODO: should the 'is_instance' function etc. be reset for subtypes?
-subtype(PropList, Type) ->
- add_props(PropList, Type).
-
-%% @private
--spec is_inst(proper_gen:instance(), raw_type()) ->
- boolean() | {'error',{'typeserver',term()}}.
-is_inst(Instance, RawType) ->
- is_inst(Instance, RawType, 10).
-
-%% @private
--spec is_inst(proper_gen:instance(), raw_type(), size()) ->
- boolean() | {'error',{'typeserver',term()}}.
-is_inst(Instance, RawType, Size) ->
- proper:global_state_init_size(Size),
- Result = safe_is_instance(Instance, RawType),
- proper:global_state_erase(),
- Result.
-
-%% @private
--spec safe_is_instance(proper_gen:imm_instance(), raw_type()) ->
- boolean() | {'error',{'typeserver',term()}}.
-safe_is_instance(ImmInstance, RawType) ->
- try is_instance(ImmInstance, RawType) catch
- throw:{'$typeserver',SubReason} -> {error, {typeserver,SubReason}}
- end.
-
-%% @private
--spec is_instance(proper_gen:imm_instance(), raw_type()) -> boolean().
-%% TODO: If the second argument is not a type, let it pass (don't even check for
-%% term equality?) - if it's a raw type, don't cook it, instead recurse
-%% into it.
-is_instance(ImmInstance, RawType) ->
- CleanInstance = proper_gen:clean_instance(ImmInstance),
- Type = cook_outer(RawType),
- (case get_prop(kind, Type) of
- wrapper -> wrapper_test(ImmInstance, Type);
- constructed -> constructed_test(ImmInstance, Type);
- _ -> false
- end
- orelse
- case find_prop(is_instance, Type) of
- {ok,{typed, IsInstance}} -> IsInstance(Type, ImmInstance);
- {ok,IsInstance} -> IsInstance(ImmInstance);
- error -> false
- end)
- andalso weakly(satisfies_all(CleanInstance, Type)).
-
--spec wrapper_test(proper_gen:imm_instance(), proper_types:type()) -> boolean().
-wrapper_test(ImmInstance, Type) ->
- %% TODO: check if it's actually a raw type that's returned?
- lists:any(fun(T) -> is_instance(ImmInstance, T) end, unwrap(Type)).
-
-%% @private
--ifdef(AT_LEAST_17).
--spec unwrap(proper_types:type()) -> [proper_types:type(),...].
--endif.
-%% TODO: check if it's actually a raw type that's returned?
-unwrap(Type) ->
- RawInnerTypes = proper_gen:alt_gens(Type) ++ [proper_gen:normal_gen(Type)],
- [cook_outer(T) || T <- RawInnerTypes].
-
--spec constructed_test(proper_gen:imm_instance(), proper_types:type()) ->
- boolean().
-constructed_test({'$used',ImmParts,ImmInstance}, Type) ->
- PartsType = get_prop(parts_type, Type),
- Combine = get_prop(combine, Type),
- is_instance(ImmParts, PartsType) andalso
- begin
- %% TODO: check if it's actually a raw type that's returned?
- %% TODO: move construction code to proper_gen
- %% TODO: non-type => should we check for strict term equality?
- RawInnerType = Combine(proper_gen:clean_instance(ImmParts)),
- is_instance(ImmInstance, RawInnerType)
- end;
-constructed_test({'$to_part',ImmInstance}, Type) ->
- PartsType = get_prop(parts_type, Type),
- get_prop(shrink_to_parts, Type) =:= true andalso
- %% TODO: we reject non-container types
- get_prop(kind, PartsType) =:= container andalso
- case {find_prop(internal_type,PartsType),
- find_prop(internal_types,PartsType)} of
- {{ok,EachPartType},error} ->
- %% The parts are in a list or a vector.
- is_instance(ImmInstance, EachPartType);
- {error,{ok,PartTypesList}} ->
- %% The parts are in a fixed list.
- %% TODO: It should always be a proper list.
- lists:any(fun(T) -> is_instance(ImmInstance,T) end, PartTypesList)
- end;
-constructed_test(_CleanInstance, _Type) ->
- %% TODO: can we do anything better?
- false.
-
-%% @private
--spec weakly({boolean(),boolean()}) -> boolean().
-weakly({B1,_B2}) -> B1.
-
-%% @private
--spec strongly({boolean(),boolean()}) -> boolean().
-strongly({_B1,B2}) -> B2.
-
--spec satisfies(proper_gen:instance(), {constraint_fun(),boolean()})
- -> {boolean(),boolean()}.
-satisfies(Instance, {Test,false}) ->
- {true,Test(Instance)};
-satisfies(Instance, {Test,true}) ->
- Result = Test(Instance),
- {Result,Result}.
-
-%% @private
--spec satisfies_all(proper_gen:instance(), proper_types:type()) ->
- {boolean(),boolean()}.
-satisfies_all(Instance, Type) ->
- case find_prop(constraints, Type) of
- {ok, Constraints} ->
- L = [satisfies(Instance, C) || C <- Constraints],
- {L1,L2} = lists:unzip(L),
- {lists:all(fun(B) -> B end, L1), lists:all(fun(B) -> B end, L2)};
- error ->
- {true,true}
- end.
-
-
-%%------------------------------------------------------------------------------
-%% Type definition functions
-%%------------------------------------------------------------------------------
-
-%% @private
--spec lazy(proper_gen:nosize_generator()) -> proper_types:type().
-lazy(Gen) ->
- ?WRAPPER([
- {generator, Gen}
- ]).
-
-%% @private
--spec sized(proper_gen:sized_generator()) -> proper_types:type().
-sized(Gen) ->
- ?WRAPPER([
- {generator, Gen}
- ]).
-
-%% @private
--spec bind(raw_type(), proper_gen:combine_fun(), boolean()) ->
- proper_types:type().
-bind(RawPartsType, Combine, ShrinkToParts) ->
- PartsType = cook_outer(RawPartsType),
- ?CONSTRUCTED([
- {parts_type, PartsType},
- {combine, Combine},
- {shrink_to_parts, ShrinkToParts}
- ]).
-
-%% @private
--spec shrinkwith(proper_gen:nosize_generator(), proper_gen:alt_gens()) ->
- proper_types:type().
-shrinkwith(Gen, DelaydAltGens) ->
- ?WRAPPER([
- {generator, Gen},
- {alt_gens, DelaydAltGens}
- ]).
-
-%% @private
--spec add_constraint(raw_type(), constraint_fun(), boolean()) ->
- proper_types:type().
-add_constraint(RawType, Condition, IsStrict) ->
- Type = cook_outer(RawType),
- append_to_prop(constraints, {Condition,IsStrict}, Type).
-
-%% @private
--spec native_type(mod_name(), string()) -> proper_types:type().
-native_type(Mod, TypeStr) ->
- ?WRAPPER([
- {generator, fun() -> proper_gen:native_type_gen(Mod,TypeStr) end}
- ]).
-
-
-%%------------------------------------------------------------------------------
-%% Basic types
-%%------------------------------------------------------------------------------
-
-%% @doc All integers between `Low' and `High', bounds included.
-%% `Low' and `High' must be Erlang expressions that evaluate to integers, with
-%% `Low =< High'. Additionally, `Low' and `High' may have the value `inf', in
-%% which case they represent minus infinity and plus infinity respectively.
-%% Instances shrink towards 0 if `Low =< 0 =< High', or towards the bound with
-%% the smallest absolute value otherwise.
--spec integer(extint(), extint()) -> proper_types:type().
-integer(Low, High) ->
- ?BASIC([
- {env, {Low, High}},
- {generator, {typed, fun integer_gen/2}},
- {is_instance, {typed, fun integer_is_instance/2}},
- {shrinkers, [fun number_shrinker/3]}
- ]).
-
-integer_gen(Type, Size) ->
- {Low, High} = get_prop(env, Type),
- proper_gen:integer_gen(Size, Low, High).
-
-integer_is_instance(Type, X) ->
- {Low, High} = get_prop(env, Type),
- is_integer(X) andalso le(Low, X) andalso le(X, High).
-
-number_shrinker(X, Type, S) ->
- {Low, High} = get_prop(env, Type),
- proper_shrink:number_shrinker(X, Low, High, S).
-
-%% @doc All floats between `Low' and `High', bounds included.
-%% `Low' and `High' must be Erlang expressions that evaluate to floats, with
-%% `Low =< High'. Additionally, `Low' and `High' may have the value `inf', in
-%% which case they represent minus infinity and plus infinity respectively.
-%% Instances shrink towards 0.0 if `Low =< 0.0 =< High', or towards the bound
-%% with the smallest absolute value otherwise.
--spec float(extnum(), extnum()) -> proper_types:type().
-float(Low, High) ->
- ?BASIC([
- {env, {Low, High}},
- {generator, {typed, fun float_gen/2}},
- {is_instance, {typed, fun float_is_instance/2}},
- {shrinkers, [fun number_shrinker/3]}
- ]).
-
-float_gen(Type, Size) ->
- {Low, High} = get_prop(env, Type),
- proper_gen:float_gen(Size, Low, High).
-
-float_is_instance(Type, X) ->
- {Low, High} = get_prop(env, Type),
- is_float(X) andalso le(Low, X) andalso le(X, High).
-
-%% @private
--spec le(extnum(), extnum()) -> boolean().
-le(inf, _B) -> true;
-le(_A, inf) -> true;
-le(A, B) -> A =< B.
-
-%% @doc All atoms. All atoms used internally by PropEr start with a '`$'', so
-%% such atoms will never be produced as instances of this type. You should also
-%% refrain from using such atoms in your code, to avoid a potential clash.
-%% Instances shrink towards the empty atom, ''.
--spec atom() -> proper_types:type().
-atom() ->
- ?WRAPPER([
- {generator, fun proper_gen:atom_gen/1},
- {reverse_gen, fun proper_gen:atom_rev/1},
- {size_transform, fun(Size) -> erlang:min(Size,255) end},
- {is_instance, fun atom_is_instance/1}
- ]).
-
-atom_is_instance(X) ->
- is_atom(X)
- %% We return false for atoms starting with '$', since these are
- %% atoms used internally and never produced by the atom generator.
- andalso (X =:= '' orelse hd(atom_to_list(X)) =/= $$).
-
-%% @doc All binaries. Instances shrink towards the empty binary, `<<>>'.
--spec binary() -> proper_types:type().
-binary() ->
- ?WRAPPER([
- {generator, fun proper_gen:binary_gen/1},
- {reverse_gen, fun proper_gen:binary_rev/1},
- {is_instance, fun erlang:is_binary/1}
- ]).
-
-%% @doc All binaries with a byte size of `Len'.
-%% `Len' must be an Erlang expression that evaluates to a non-negative integer.
-%% Instances shrink towards binaries of zeroes.
--spec binary(length()) -> proper_types:type().
-binary(Len) ->
- ?WRAPPER([
- {env, Len},
- {generator, {typed, fun binary_len_gen/1}},
- {reverse_gen, fun proper_gen:binary_rev/1},
- {is_instance, {typed, fun binary_len_is_instance/2}}
- ]).
-
-binary_len_gen(Type) ->
- Len = get_prop(env, Type),
- proper_gen:binary_len_gen(Len).
-
-binary_len_is_instance(Type, X) ->
- Len = get_prop(env, Type),
- is_binary(X) andalso byte_size(X) =:= Len.
-
-%% @doc All bitstrings. Instances shrink towards the empty bitstring, `<<>>'.
--spec bitstring() -> proper_types:type().
-bitstring() ->
- ?WRAPPER([
- {generator, fun proper_gen:bitstring_gen/1},
- {reverse_gen, fun proper_gen:bitstring_rev/1},
- {is_instance, fun erlang:is_bitstring/1}
- ]).
-
-%% @doc All bitstrings with a bit size of `Len'.
-%% `Len' must be an Erlang expression that evaluates to a non-negative integer.
-%% Instances shrink towards bitstrings of zeroes
--spec bitstring(length()) -> proper_types:type().
-bitstring(Len) ->
- ?WRAPPER([
- {env, Len},
- {generator, {typed, fun bitstring_len_gen/1}},
- {reverse_gen, fun proper_gen:bitstring_rev/1},
- {is_instance, {typed, fun bitstring_len_is_instance/2}}
- ]).
-
-bitstring_len_gen(Type) ->
- Len = get_prop(env, Type),
- proper_gen:bitstring_len_gen(Len).
-
-bitstring_len_is_instance(Type, X) ->
- Len = get_prop(env, Type),
- is_bitstring(X) andalso bit_size(X) =:= Len.
-
-%% @doc All lists containing elements of type `ElemType'.
-%% Instances shrink towards the empty list, `[]'.
--spec list(ElemType::raw_type()) -> proper_types:type().
-% TODO: subtyping would be useful here (list, vector, fixed_list)
-list(RawElemType) ->
- ElemType = cook_outer(RawElemType),
- ?CONTAINER([
- {generator, {typed, fun list_gen/2}},
- {is_instance, {typed, fun list_is_instance/2}},
- {internal_type, ElemType},
- {get_length, fun erlang:length/1},
- {split, fun lists:split/2},
- {join, fun lists:append/2},
- {get_indices, fun list_get_indices/2},
- {remove, fun proper_arith:list_remove/2},
- {retrieve, fun lists:nth/2},
- {update, fun proper_arith:list_update/3}
- ]).
-
-list_gen(Type, Size) ->
- ElemType = get_prop(internal_type, Type),
- proper_gen:list_gen(Size, ElemType).
-
-list_is_instance(Type, X) ->
- ElemType = get_prop(internal_type, Type),
- list_test(X, ElemType).
-
-%% @doc A type that generates exactly the list `List'. Instances shrink towards
-%% shorter sublists of the original list.
--spec shrink_list([term()]) -> proper_types:type().
-shrink_list(List) ->
- ?CONTAINER([
- {env, List},
- {generator, {typed, fun shrink_list_gen/1}},
- {is_instance, {typed, fun shrink_list_is_instance/2}},
- {get_length, fun erlang:length/1},
- {split, fun lists:split/2},
- {join, fun lists:append/2},
- {get_indices, fun list_get_indices/2},
- {remove, fun proper_arith:list_remove/2}
- ]).
-
-shrink_list_gen(Type) ->
- get_prop(env, Type).
-
-shrink_list_is_instance(Type, X) ->
- List = get_prop(env, Type),
- is_sublist(X, List).
-
--spec is_sublist([term()], [term()]) -> boolean().
-is_sublist([], _) -> true;
-is_sublist(_, []) -> false;
-is_sublist([H|T1], [H|T2]) -> is_sublist(T1, T2);
-is_sublist(Slice, [_|T2]) -> is_sublist(Slice, T2).
-
--spec list_test(proper_gen:imm_instance(), proper_types:type()) -> boolean().
-list_test(X, ElemType) ->
- is_list(X) andalso lists:all(fun(E) -> is_instance(E, ElemType) end, X).
-
-%% @private
--spec list_get_indices(proper_gen:generator(), list()) -> [position()].
-list_get_indices(_, List) ->
- lists:seq(1, length(List)).
-
-%% @private
-%% This assumes that:
-%% - instances of size S are always valid instances of size >S
-%% - any recursive calls inside Gen are lazy
--spec distlist(size(), proper_gen:sized_generator(), boolean()) ->
- proper_types:type().
-distlist(Size, Gen, NonEmpty) ->
- ParentType = case NonEmpty of
- true -> non_empty(list(Gen(Size)));
- false -> list(Gen(Size))
- end,
- ?SUBTYPE(ParentType, [
- {subenv, {Size, Gen, NonEmpty}},
- {generator, {typed, fun distlist_gen/1}}
- ]).
-
-distlist_gen(Type) ->
- {Size, Gen, NonEmpty} = get_prop(subenv, Type),
- proper_gen:distlist_gen(Size, Gen, NonEmpty).
-
-%% @doc All lists of length `Len' containing elements of type `ElemType'.
-%% `Len' must be an Erlang expression that evaluates to a non-negative integer.
--spec vector(length(), ElemType::raw_type()) -> proper_types:type().
-vector(Len, RawElemType) ->
- ElemType = cook_outer(RawElemType),
- ?CONTAINER([
- {env, Len},
- {generator, {typed, fun vector_gen/1}},
- {is_instance, {typed, fun vector_is_instance/2}},
- {internal_type, ElemType},
- {get_indices, fun vector_get_indices/2},
- {retrieve, fun lists:nth/2},
- {update, fun proper_arith:list_update/3}
- ]).
-
-vector_gen(Type) ->
- Len = get_prop(env, Type),
- ElemType = get_prop(internal_type, Type),
- proper_gen:vector_gen(Len, ElemType).
-
-vector_is_instance(Type, X) ->
- Len = get_prop(env, Type),
- ElemType = get_prop(internal_type, Type),
- is_list(X)
- andalso length(X) =:= Len
- andalso lists:all(fun(E) -> is_instance(E, ElemType) end, X).
-
-vector_get_indices(Type, _X) ->
- lists:seq(1, get_prop(env, Type)).
-
-%% @doc The union of all types in `ListOfTypes'. `ListOfTypes' can't be empty.
-%% The random instance generator is equally likely to choose any one of the
-%% types in `ListOfTypes'. The shrinking subsystem will always try to shrink an
-%% instance of a type union to an instance of the first type in `ListOfTypes',
-%% thus you should write the simplest case first.
--spec union(ListOfTypes::[raw_type(),...]) -> proper_types:type().
-union(RawChoices) ->
- Choices = [cook_outer(C) || C <- RawChoices],
- ?BASIC([
- {env, Choices},
- {generator, {typed, fun union_gen/1}},
- {is_instance, {typed, fun union_is_instance/2}},
- {shrinkers, [fun union_shrinker_1/3, fun union_shrinker_2/3]}
- ]).
-
-union_gen(Type) ->
- Choices = get_prop(env,Type),
- proper_gen:union_gen(Choices).
-
-union_is_instance(Type, X) ->
- Choices = get_prop(env, Type),
- lists:any(fun(C) -> is_instance(X, C) end, Choices).
-
-union_shrinker_1(X, Type, S) ->
- Choices = get_prop(env, Type),
- proper_shrink:union_first_choice_shrinker(X, Choices, S).
-
-union_shrinker_2(X, Type, S) ->
- Choices = get_prop(env, Type),
- proper_shrink:union_recursive_shrinker(X, Choices, S).
-
-%% @doc A specialization of {@link union/1}, where each type in `ListOfTypes' is
-%% assigned a frequency. Frequencies must be Erlang expressions that evaluate to
-%% positive integers. Types with larger frequencies are more likely to be chosen
-%% by the random instance generator. The shrinking subsystem will ignore the
-%% frequencies and try to shrink towards the first type in the list.
--spec weighted_union(ListOfTypes::[{frequency(),raw_type()},...]) ->
- proper_types:type().
-weighted_union(RawFreqChoices) ->
- CookFreqType = fun({Freq,RawType}) -> {Freq,cook_outer(RawType)} end,
- FreqChoices = lists:map(CookFreqType, RawFreqChoices),
- Choices = [T || {_F,T} <- FreqChoices],
- ?SUBTYPE(union(Choices), [
- {subenv, FreqChoices},
- {generator, {typed, fun weighted_union_gen/1}}
- ]).
-
-weighted_union_gen(Gen) ->
- FreqChoices = get_prop(subenv, Gen),
- proper_gen:weighted_union_gen(FreqChoices).
-
-%% @private
--spec safe_union([raw_type(),...]) -> proper_types:type().
-safe_union(RawChoices) ->
- Choices = [cook_outer(C) || C <- RawChoices],
- subtype(
- [{subenv, Choices},
- {generator, {typed, fun safe_union_gen/1}}],
- union(Choices)).
-
-safe_union_gen(Type) ->
- Choices = get_prop(subenv, Type),
- proper_gen:safe_union_gen(Choices).
-
-%% @private
--spec safe_weighted_union([{frequency(),raw_type()},...]) ->
- proper_types:type().
-safe_weighted_union(RawFreqChoices) ->
- CookFreqType = fun({Freq,RawType}) ->
- {Freq,cook_outer(RawType)} end,
- FreqChoices = lists:map(CookFreqType, RawFreqChoices),
- Choices = [T || {_F,T} <- FreqChoices],
- subtype([{subenv, FreqChoices},
- {generator, {typed, fun safe_weighted_union_gen/1}}],
- union(Choices)).
-
-safe_weighted_union_gen(Type) ->
- FreqChoices = get_prop(subenv, Type),
- proper_gen:safe_weighted_union_gen(FreqChoices).
-
-%% @doc All tuples whose i-th element is an instance of the type at index i of
-%% `ListOfTypes'. Also written simply as a tuple of types.
--spec tuple(ListOfTypes::[raw_type()]) -> proper_types:type().
-tuple(RawFields) ->
- Fields = [cook_outer(F) || F <- RawFields],
- ?CONTAINER([
- {env, Fields},
- {generator, {typed, fun tuple_gen/1}},
- {is_instance, {typed, fun tuple_is_instance/2}},
- {internal_types, list_to_tuple(Fields)},
- {get_indices, fun tuple_get_indices/2},
- {retrieve, fun erlang:element/2},
- {update, fun tuple_update/3}
- ]).
-
-tuple_gen(Type) ->
- Fields = get_prop(env, Type),
- proper_gen:tuple_gen(Fields).
-
-tuple_is_instance(Type, X) ->
- Fields = get_prop(env, Type),
- is_tuple(X) andalso fixed_list_test(tuple_to_list(X), Fields).
-
-tuple_get_indices(Type, _X) ->
- lists:seq(1, length(get_prop(env, Type))).
-
--spec tuple_update(index(), value(), tuple()) -> tuple().
-tuple_update(Index, NewElem, Tuple) ->
- setelement(Index, Tuple, NewElem).
-
-%% @doc Tuples whose elements are all of type `ElemType'.
-%% Instances shrink towards the 0-size tuple, `{}'.
--spec loose_tuple(ElemType::raw_type()) -> proper_types:type().
-loose_tuple(RawElemType) ->
- ElemType = cook_outer(RawElemType),
- ?WRAPPER([
- {env, ElemType},
- {generator, {typed, fun loose_tuple_gen/2}},
- {reverse_gen, {typed, fun loose_tuple_rev/2}},
- {is_instance, {typed, fun loose_tuple_is_instance/2}}
- ]).
-
-loose_tuple_gen(Type, Size) ->
- ElemType = get_prop(env, Type),
- proper_gen:loose_tuple_gen(Size, ElemType).
-
-loose_tuple_rev(Type, X) ->
- ElemType = get_prop(env, Type),
- proper_gen:loose_tuple_rev(X, ElemType).
-
-loose_tuple_is_instance(Type, X) ->
- ElemType = get_prop(env, Type),
- is_tuple(X) andalso list_test(tuple_to_list(X), ElemType).
-
-%% @doc Singleton type consisting only of `E'. `E' must be an evaluated term.
-%% Also written simply as `E'.
--spec exactly(term()) -> proper_types:type().
-exactly(E) ->
- ?BASIC([
- {env, E},
- {generator, {typed, fun exactly_gen/1}},
- {is_instance, {typed, fun exactly_is_instance/2}}
- ]).
-
-exactly_gen(Type) ->
- E = get_prop(env, Type),
- proper_gen:exactly_gen(E).
-
-exactly_is_instance(Type, X) ->
- E = get_prop(env, Type),
- X =:= E.
-
-%% @doc All lists whose i-th element is an instance of the type at index i of
-%% `ListOfTypes'. Also written simply as a list of types.
--spec fixed_list(ListOfTypes::maybe_improper_list(raw_type(),raw_type()|[])) ->
- proper_types:type().
-fixed_list(MaybeImproperRawFields) ->
- %% CAUTION: must handle improper lists
- {Fields, Internal, Len, Retrieve, Update} =
- case proper_arith:cut_improper_tail(MaybeImproperRawFields) of
- % TODO: have cut_improper_tail return the length and use it in test?
- {ProperRawHead, ImproperRawTail} ->
- HeadLen = length(ProperRawHead),
- CookedHead = [cook_outer(F) || F <- ProperRawHead],
- CookedTail = cook_outer(ImproperRawTail),
- {{CookedHead,CookedTail},
- CookedHead ++ CookedTail,
- HeadLen + 1,
- fun(I,L) -> improper_list_retrieve(I, L, HeadLen) end,
- fun(I,V,L) -> improper_list_update(I, V, L, HeadLen) end};
- ProperRawFields ->
- LocalFields = [cook_outer(F) || F <- ProperRawFields],
- {LocalFields,
- LocalFields,
- length(ProperRawFields),
- fun lists:nth/2,
- fun proper_arith:list_update/3}
- end,
- ?CONTAINER([
- {env, {Fields, Len}},
- {generator, {typed, fun fixed_list_gen/1}},
- {is_instance, {typed, fun fixed_list_is_instance/2}},
- {internal_types, Internal},
- {get_indices, fun fixed_list_get_indices/2},
- {retrieve, Retrieve},
- {update, Update}
- ]).
-
-fixed_list_gen(Type) ->
- {Fields, _} = get_prop(env, Type),
- proper_gen:fixed_list_gen(Fields).
-
-fixed_list_is_instance(Type, X) ->
- {Fields, _} = get_prop(env, Type),
- fixed_list_test(X, Fields).
-
-fixed_list_get_indices(Type, _X) ->
- {_, Len} = get_prop(env, Type),
- lists:seq(1, Len).
-
--spec fixed_list_test(proper_gen:imm_instance(),
- [proper_types:type()] | {[proper_types:type()],
- proper_types:type()}) ->
- boolean().
-fixed_list_test(X, {ProperHead,ImproperTail}) ->
- is_list(X) andalso
- begin
- ProperHeadLen = length(ProperHead),
- proper_arith:head_length(X) >= ProperHeadLen andalso
- begin
- {XHead,XTail} = lists:split(ProperHeadLen, X),
- fixed_list_test(XHead, ProperHead)
- andalso is_instance(XTail, ImproperTail)
- end
- end;
-fixed_list_test(X, ProperFields) ->
- is_list(X)
- andalso length(X) =:= length(ProperFields)
- andalso lists:all(fun({E,T}) -> is_instance(E, T) end,
- lists:zip(X, ProperFields)).
-
-%% TODO: Move these 2 functions to proper_arith?
--spec improper_list_retrieve(index(), nonempty_improper_list(value(),value()),
- pos_integer()) -> value().
-improper_list_retrieve(Index, List, HeadLen) ->
- case Index =< HeadLen of
- true -> lists:nth(Index, List);
- false -> lists:nthtail(HeadLen, List)
- end.
-
--spec improper_list_update(index(), value(),
- nonempty_improper_list(value(),value()),
- pos_integer()) ->
- nonempty_improper_list(value(),value()).
-improper_list_update(Index, Value, List, HeadLen) ->
- case Index =< HeadLen of
- %% TODO: This happens to work, but is not implied by list_update's spec.
- true -> proper_arith:list_update(Index, Value, List);
- false -> lists:sublist(List, HeadLen) ++ Value
- end.
-
-%% @doc All pure functions that map instances of `ArgTypes' to instances of
-%% `RetType'. The syntax `function(Arity, RetType)' is also acceptable.
--spec function(ArgTypes::[raw_type()] | arity(), RetType::raw_type()) ->
- proper_types:type().
-function(Arity, RawRetType) when is_integer(Arity), Arity >= 0, Arity =< 255 ->
- RetType = cook_outer(RawRetType),
- ?BASIC([
- {env, {Arity, RetType}},
- {generator, {typed, fun function_gen/1}},
- {is_instance, {typed, fun function_is_instance/2}}
- ]);
-function(RawArgTypes, RawRetType) ->
- function(length(RawArgTypes), RawRetType).
-
-function_gen(Type) ->
- {Arity, RetType} = get_prop(env, Type),
- proper_gen:function_gen(Arity, RetType).
-
-function_is_instance(Type, X) ->
- {Arity, RetType} = get_prop(env, Type),
- is_function(X, Arity)
- %% TODO: what if it's not a function we produced?
- andalso equal_types(RetType, proper_gen:get_ret_type(X)).
-
-%% @doc All Erlang terms (that PropEr can produce). For reasons of efficiency,
-%% functions are never produced as instances of this type.<br />
-%% CAUTION: Instances of this type are expensive to produce, shrink and instance-
-%% check, both in terms of processing time and consumed memory. Only use this
-%% type if you are certain that you need it.
--spec any() -> proper_types:type().
-any() ->
- AllTypes = [integer(),float(),atom(),bitstring(),?LAZY(loose_tuple(any())),
- ?LAZY(list(any()))],
- ?SUBTYPE(union(AllTypes), [
- {generator, fun proper_gen:any_gen/1}
- ]).
-
-
-%%------------------------------------------------------------------------------
-%% Type aliases
-%%------------------------------------------------------------------------------
-
-%% @equiv integer(inf, inf)
--spec integer() -> proper_types:type().
-integer() -> integer(inf, inf).
-
-%% @equiv integer(0, inf)
--spec non_neg_integer() -> proper_types:type().
-non_neg_integer() -> integer(0, inf).
-
-%% @equiv integer(1, inf)
--spec pos_integer() -> proper_types:type().
-pos_integer() -> integer(1, inf).
-
-%% @equiv integer(inf, -1)
--spec neg_integer() -> proper_types:type().
-neg_integer() -> integer(inf, -1).
-
-%% @equiv integer(Low, High)
--spec range(extint(), extint()) -> proper_types:type().
-range(Low, High) -> integer(Low, High).
-
-%% @equiv float(inf, inf)
--spec float() -> proper_types:type().
-float() -> float(inf, inf).
-
-%% @equiv float(0.0, inf)
--spec non_neg_float() -> proper_types:type().
-non_neg_float() -> float(0.0, inf).
-
-%% @equiv union([integer(), float()])
--spec number() -> proper_types:type().
-number() -> union([integer(), float()]).
-
-%% @doc The atoms `true' and `false'. Instances shrink towards `false'.
--spec boolean() -> proper_types:type().
-boolean() -> union(['false', 'true']).
-
-%% @equiv integer(0, 255)
--spec byte() -> proper_types:type().
-byte() -> integer(0, 255).
-
-%% @equiv integer(0, 16#10ffff)
--spec char() -> proper_types:type().
-char() -> integer(0, 16#10ffff).
-
-%% @equiv list(any())
--spec list() -> proper_types:type().
-list() -> list(any()).
-
-%% @equiv loose_tuple(any())
--spec tuple() -> proper_types:type().
-tuple() -> loose_tuple(any()).
-
-%% @equiv list(char())
--spec string() -> proper_types:type().
-string() -> list(char()).
-
-%% @equiv weighted_union(FreqChoices)
--spec wunion([{frequency(),raw_type()},...]) -> proper_types:type().
-wunion(FreqChoices) -> weighted_union(FreqChoices).
-
-%% @equiv any()
--spec term() -> proper_types:type().
-term() -> any().
-
-%% @equiv union([non_neg_integer() | infinity])
--spec timeout() -> proper_types:type().
-timeout() -> union([non_neg_integer(), 'infinity']).
-
-%% @equiv integer(0, 255)
--spec arity() -> proper_types:type().
-arity() -> integer(0, 255).
-
-
-%%------------------------------------------------------------------------------
-%% QuickCheck compatibility types
-%%------------------------------------------------------------------------------
-
-%% @doc Small integers (bound by the current value of the `size' parameter).
-%% Instances shrink towards `0'.
--spec int() -> proper_types:type().
-int() -> ?SIZED(Size, integer(-Size,Size)).
-
-%% @doc Small non-negative integers (bound by the current value of the `size'
-%% parameter). Instances shrink towards `0'.
--spec nat() -> proper_types:type().
-nat() -> ?SIZED(Size, integer(0,Size)).
-
-%% @equiv integer()
--spec largeint() -> proper_types:type().
-largeint() -> integer().
-
-%% @equiv float()
--spec real() -> proper_types:type().
-real() -> float().
-
-%% @equiv boolean()
--spec bool() -> proper_types:type().
-bool() -> boolean().
-
-%% @equiv integer(Low, High)
--spec choose(extint(), extint()) -> proper_types:type().
-choose(Low, High) -> integer(Low, High).
-
-%% @equiv union(Choices)
--spec elements([raw_type(),...]) -> proper_types:type().
-elements(Choices) -> union(Choices).
-
-%% @equiv union(Choices)
--spec oneof([raw_type(),...]) -> proper_types:type().
-oneof(Choices) -> union(Choices).
-
-%% @equiv weighted_union(Choices)
--spec frequency([{frequency(),raw_type()},...]) -> proper_types:type().
-frequency(FreqChoices) -> weighted_union(FreqChoices).
-
-%% @equiv exactly(E)
--spec return(term()) -> proper_types:type().
-return(E) -> exactly(E).
-
-%% @doc Adds a default value, `Default', to `Type'.
-%% The default serves as a primary shrinking target for instances, while it
-%% is also chosen by the random instance generation subsystem half the time.
--spec default(raw_type(), raw_type()) -> proper_types:type().
-default(Default, Type) ->
- union([Default, Type]).
-
-%% @doc All sorted lists containing elements of type `ElemType'.
-%% Instances shrink towards the empty list, `[]'.
--spec orderedlist(ElemType::raw_type()) -> proper_types:type().
-orderedlist(RawElemType) ->
- ?LET(L, list(RawElemType), lists:sort(L)).
-
-%% @equiv function(0, RetType)
--spec function0(raw_type()) -> proper_types:type().
-function0(RetType) ->
- function(0, RetType).
-
-%% @equiv function(1, RetType)
--spec function1(raw_type()) -> proper_types:type().
-function1(RetType) ->
- function(1, RetType).
-
-%% @equiv function(2, RetType)
--spec function2(raw_type()) -> proper_types:type().
-function2(RetType) ->
- function(2, RetType).
-
-%% @equiv function(3, RetType)
--spec function3(raw_type()) -> proper_types:type().
-function3(RetType) ->
- function(3, RetType).
-
-%% @equiv function(4, RetType)
--spec function4(raw_type()) -> proper_types:type().
-function4(RetType) ->
- function(4, RetType).
-
-%% @doc A specialization of {@link default/2}, where `Default' and `Type' are
-%% assigned weights to be considered by the random instance generator. The
-%% shrinking subsystem will ignore the weights and try to shrink using the
-%% default value.
--spec weighted_default({frequency(),raw_type()}, {frequency(),raw_type()}) ->
- proper_types:type().
-weighted_default(Default, Type) ->
- weighted_union([Default, Type]).
-
-
-%%------------------------------------------------------------------------------
-%% Additional type specification functions
-%%------------------------------------------------------------------------------
-
-%% @doc Overrides the `size' parameter used when generating instances of
-%% `Type' with `NewSize'. Has no effect on size-less types, such as unions.
-%% Also, this will not affect the generation of any internal types contained in
-%% `Type', such as the elements of a list - those will still be generated
-%% using the test-wide value of `size'. One use of this function is to modify
-%% types to produce instances that grow faster or slower, like so:
-%% ```?SIZED(Size, resize(Size * 2, list(integer()))'''
-%% The above specifies a list type that grows twice as fast as normal lists.
--spec resize(size(), Type::raw_type()) -> proper_types:type().
-resize(NewSize, RawType) ->
- Type = cook_outer(RawType),
- case find_prop(size_transform, Type) of
- {ok,Transform} ->
- add_prop(size_transform, fun(_S) -> Transform(NewSize) end, Type);
- error ->
- add_prop(size_transform, fun(_S) -> NewSize end, Type)
- end.
-
-%% @doc This is a predefined constraint that can be applied to random-length
-%% list and binary types to ensure that the produced values are never empty.
-%%
-%% e.g. {@link list/0}, {@link string/0}, {@link binary/0})
--spec non_empty(ListType::raw_type()) -> proper_types:type().
-non_empty(RawListType) ->
- ?SUCHTHAT(L, RawListType, L =/= [] andalso L =/= <<>>).
-
-%% @doc Creates a new type which is equivalent to `Type', but whose instances
-%% are never shrunk by the shrinking subsystem.
--spec noshrink(Type::raw_type()) -> proper_types:type().
-noshrink(RawType) ->
- add_prop(noshrink, true, cook_outer(RawType)).
-
-%% @doc Associates the atom key `Parameter' with the value `Value' while
-%% generating instances of `Type'.
--spec with_parameter(atom(), value(), Type::raw_type()) -> proper_types:type().
-with_parameter(Parameter, Value, RawType) ->
- with_parameters([{Parameter,Value}], RawType).
-
-%% @doc Similar to {@link with_parameter/3}, but accepts a list of
-%% `{Parameter, Value}' pairs.
--spec with_parameters([{atom(),value()}], Type::raw_type()) ->
- proper_types:type().
-with_parameters(PVlist, RawType) ->
- Type = cook_outer(RawType),
- case find_prop(parameters, Type) of
- {ok,Params} when is_list(Params) ->
- append_list_to_prop(parameters, PVlist, Type);
- error ->
- add_prop(parameters, PVlist, Type)
- end.
-
-%% @doc Returns the value associated with `Parameter', or `Default' in case
-%% `Parameter' is not associated with any value.
--spec parameter(atom(), value()) -> value().
-parameter(Parameter, Default) ->
- Parameters =
- case erlang:get('$parameters') of
- undefined -> [];
- List -> List
- end,
- proplists:get_value(Parameter, Parameters, Default).
-
-%% @equiv parameter(Parameter, undefined)
--spec parameter(atom()) -> value().
-parameter(Parameter) ->
- parameter(Parameter, undefined).
diff --git a/lib/dialyzer/test/behaviour_SUITE_data/src/proper/proper_typeserver.erl b/lib/dialyzer/test/behaviour_SUITE_data/src/proper/proper_typeserver.erl
deleted file mode 100644
index 12f6532c0c..0000000000
--- a/lib/dialyzer/test/behaviour_SUITE_data/src/proper/proper_typeserver.erl
+++ /dev/null
@@ -1,2411 +0,0 @@
-%%% Copyright 2010-2016 Manolis Papadakis <manopapad@gmail.com>,
-%%% Eirini Arvaniti <eirinibob@gmail.com>
-%%% and Kostis Sagonas <kostis@cs.ntua.gr>
-%%%
-%%% This file is part of PropEr.
-%%%
-%%% PropEr is free software: you can redistribute it and/or modify
-%%% it under the terms of the GNU General Public License as published by
-%%% the Free Software Foundation, either version 3 of the License, or
-%%% (at your option) any later version.
-%%%
-%%% PropEr is distributed in the hope that it will be useful,
-%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
-%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-%%% GNU General Public License for more details.
-%%%
-%%% You should have received a copy of the GNU General Public License
-%%% along with PropEr. If not, see <http://www.gnu.org/licenses/>.
-
-%%% @copyright 2010-2016 Manolis Papadakis, Eirini Arvaniti and Kostis Sagonas
-%%% @version {@version}
-%%% @author Manolis Papadakis
-
-%%% @doc Erlang type system - PropEr type system integration module.
-%%%
-%%% PropEr can parse types expressed in Erlang's type language and convert them
-%%% to its own type format. Such expressions can be used instead of regular type
-%%% constructors in the second argument of `?FORALL's. No extra notation is
-%%% required; PropEr will detect which calls correspond to native types by
-%%% applying a parse transform during compilation. This parse transform is
-%%% automatically applied to any module that includes the `proper.hrl' header
-%%% file. You can disable this feature by compiling your modules with
-%%% `-DPROPER_NO_TRANS'. Note that this will currently also disable the
-%%% automatic exporting of properties.
-%%%
-%%% The use of native types in properties is subject to the following usage
-%%% rules:
-%%% <ul>
-%%% <li>Native types cannot be used outside of `?FORALL's.</li>
-%%% <li>Inside `?FORALL's, native types can be combined with other native
-%%% types, and even with PropEr types, inside tuples and lists (the constructs
-%%% `[...]', `{...}' and `++' are all allowed).</li>
-%%% <li>All other constructs of Erlang's built-in type system (e.g. `|' for
-%%% union, `_' as an alias of `any()', `<<_:_>>' binary type syntax and
-%%% `fun((...) -> ...)' function type syntax) are not allowed in `?FORALL's,
-%%% because they are rejected by the Erlang parser.</li>
-%%% <li>Anything other than a tuple constructor, list constructor, `++'
-%%% application, local or remote call will automatically be considered a
-%%% PropEr type constructor and not be processed further by the parse
-%%% transform.</li>
-%%% <li>Parametric native types are fully supported; of course, they can only
-%%% appear instantiated in a `?FORALL'. The arguments of parametric native
-%%% types are always interpreted as native types.</li>
-%%% <li>Parametric PropEr types, on the other hand, can take any kind of
-%%% argument. You can even mix native and PropEr types in the arguments of a
-%%% PropEr type. For example, assuming that the following declarations are
-%%% present:
-%%% ``` my_proper_type() -> ?LET(...).
-%%% -type my_native_type() :: ... .'''
-%%% Then the following expressions are all legal:
-%%% ``` vector(2, my_native_type())
-%%% function(0, my_native_type())
-%%% union([my_proper_type(), my_native_type()])''' </li>
-%%% <li>Some type constructors can take native types as arguments (but only
-%%% inside `?FORALL's):
-%%% <ul>
-%%% <li>`?SUCHTHAT', `?SUCHTHATMAYBE', `non_empty', `noshrink': these work
-%%% with native types too</li>
-%%% <li>`?LAZY', `?SHRINK', `resize', `?SIZED': these don't work with native
-%%% types</li>
-%%% <li>`?LET', `?LETSHRINK': only the top-level base type can be a native
-%%% type</li>
-%%% </ul></li>
-%%% <li>Native type declarations in the `?FORALL's of a module can reference any
-%%% custom type declared in a `-type' or `-opaque' attribute of the same
-%%% module, as long as no module identifier is used.</li>
-%%% <li>Typed records cannot be referenced inside `?FORALL's using the
-%%% `#rec_name{}' syntax. To use a typed record in a `?FORALL', enclose the
-%%% record in a custom type like so:
-%%% ``` -type rec_name() :: #rec_name{}. '''
-%%% and use the custom type instead.</li>
-%%% <li>`?FORALL's may contain references to self-recursive or mutually
-%%% recursive native types, so long as each type in the hierarchy has a clear
-%%% base case.
-%%% Currently, PropEr requires that the toplevel of any recursive type
-%%% declaration is either a (maybe empty) list or a union containing at least
-%%% one choice that doesn't reference the type directly (it may, however,
-%%% reference any of the types that are mutually recursive with it). This
-%%% means, for example, that some valid recursive type declarations, such as
-%%% this one:
-%%% ``` ?FORALL(..., a(), ...) '''
-%%% where:
-%%% ``` -type a() :: {'a','none' | a()}. '''
-%%% are not accepted by PropEr. However, such types can be rewritten in a way
-%%% that allows PropEr to parse them:
-%%% ``` ?FORALL(..., a(), ...) '''
-%%% where:
-%%% ``` -type a() :: {'a','none'} | {'a',a()}. '''
-%%% This also means that recursive record declarations are not allowed:
-%%% ``` ?FORALL(..., rec(), ...) '''
-%%% where:
-%%% ``` -type rec() :: #rec{}.
-%%% -record(rec, {a = 0 :: integer(), b = 'nil' :: 'nil' | #rec{}}). '''
-%%% A little rewritting can usually remedy this problem as well:
-%%% ``` ?FORALL(..., rec(), ...) '''
-%%% where:
-%%% ``` -type rec() :: #rec{b :: 'nil'} | #rec{b :: rec()}.
-%%% -record(rec, {a = 0 :: integer(), b = 'nil' :: 'nil' | #rec{}}). '''
-%%% </li>
-%%% <li>Remote types may be referenced in a `?FORALL', so long as they are
-%%% exported from the remote module. Currently, PropEr requires that any
-%%% remote modules whose types are directly referenced from within properties
-%%% are present in the code path at compile time, either compiled with
-%%% `debug_info' enabled or in source form. If PropEr cannot find a remote
-%%% module at all, finds only a compiled object file with no debug
-%%% information or fails to compile the source file, all calls to that module
-%%% will automatically be considered calls to PropEr type constructors.</li>
-%%% <li>For native types to be translated correctly, both the module that
-%%% contains the `?FORALL' declaration as well as any module that contains
-%%% the declaration of a type referenced (directly or indirectly) from inside
-%%% a `?FORALL' must be present in the code path at runtime, either compiled
-%%% with `debug_info' enabled or in source form.</li>
-%%% <li>Local types with the same name as an auto-imported BIF are not accepted
-%%% by PropEr, unless the BIF in question has been declared in a
-%%% `no_auto_import' option.</li>
-%%% <li>When an expression can be interpreted both as a PropEr type and as a
-%%% native type, the former takes precedence. This means that a function
-%%% `foo()' will shadow a type `foo()' if they are both present in the module.
-%%% The same rule applies to remote functions and types as well.</li>
-%%% <li>The above may cause some confusion when list syntax is used:
-%%% <ul>
-%%% <li>The expression `[integer()]' can be interpreted both ways, so the
-%%% PropEr way applies. Therefore, instances of this type will always be
-%%% lists of length 1, not arbitrary integer lists, as would be expected
-%%% when interpreting the expression as a native type.</li>
-%%% <li>Assuming that a custom type foo/1 has been declared, the expression
-%%% `foo([integer()])' can only be interpreted as a native type declaration,
-%%% which means that the generic type of integer lists will be passed to
-%%% `foo/1'.</li>
-%%% </ul></li>
-%%% <li>Currently, PropEr does not detect the following mistakes:
-%%% <ul>
-%%% <li>inline record-field specializations that reference non-existent
-%%% fields</li>
-%%% <li>type parameters that are not present in the RHS of a `-type'
-%%% declaration</li>
-%%% <li>using `_' as a type variable in the LHS of a `-type' declaration</li>
-%%% <li>using the same variable in more than one position in the LHS of a
-%%% `-type' declaration</li>
-%%% </ul>
-%%% </li>
-%%% </ul>
-%%%
-%%% You can use <a href="#index">these</a> functions to try out the type
-%%% translation subsystem.
-%%%
-%%% CAUTION: These functions should never be used inside properties. They are
-%%% meant for demonstration purposes only.
-
--module(proper_typeserver).
--behaviour(gen_server).
--export([demo_translate_type/2, demo_is_instance/3]).
-
--export([start/0, restart/0, stop/0, create_spec_test/3, get_exp_specced/1,
- is_instance/3, translate_type/1]).
--export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2,
- code_change/3]).
--export([get_exp_info/1, match/2]).
-
--export_type([imm_type/0, mod_exp_types/0, mod_exp_funs/0]).
-
--include("proper_internal.hrl").
-
-
-%%------------------------------------------------------------------------------
-%% Macros
-%%------------------------------------------------------------------------------
-
--define(SRC_FILE_EXT, ".erl").
-
--ifdef(AT_LEAST_19).
--define(anno(L), erl_anno:new(L)).
--else.
--define(anno(L), L).
--endif.
-
-%% Starting with 18.0 we need to handle both 'type' and 'user_type' tags;
-%% prior Erlang/OTP releases had only 'type' as a tag.
--define(IS_TYPE_TAG(T), (T =:= type orelse T =:= user_type)).
-
-%% CAUTION: all these must be sorted
--define(STD_TYPES_0,
- [any,arity,atom,binary,bitstring,bool,boolean,byte,char,float,integer,
- list,neg_integer,non_neg_integer,number,pos_integer,string,term,
- timeout]).
--define(HARD_ADTS,
- %% gb_trees:iterator and gb_sets:iterator are NOT hardcoded
- [{{array,0},array}, {{array,1},proper_array},
- {{dict,0},dict}, {{dict,2},proper_dict},
- {{gb_set,0},gb_sets}, {{gb_set,1},proper_gb_sets},
- {{gb_tree,0},gb_trees}, {{gb_tree,2},proper_gb_trees},
- {{orddict,2},proper_orddict},
- {{ordset,1},proper_ordsets},
- {{queue,0},queue}, {{queue,1},proper_queue},
- {{set,0},sets}, {{set,1},proper_sets}]).
--define(HARD_ADT_MODS,
- [{array, [{{array,0},
- {{type,0,record,[{atom,0,array}]},[]}}]},
- {dict, [{{dict,0},
- {{type,0,record,[{atom,0,dict}]},[]}}]},
- {gb_sets, [{{gb_set,0},
- {{type,0,tuple,[{type,0,non_neg_integer,[]},
- {type,0,gb_set_node,[]}]},[]}}]},
- {gb_trees, [{{gb_tree,0},
- {{type,0,tuple,[{type,0,non_neg_integer,[]},
- {type,0,gb_tree_node,[]}]},[]}}]},
- %% Our parametric ADTs are already declared as normal types, we just
- %% need to change them to opaques.
- {proper_array, [{{array,1},already_declared}]},
- {proper_dict, [{{dict,2},already_declared}]},
- {proper_gb_sets, [{{gb_set,1},already_declared},
- {{iterator,1},already_declared}]},
- {proper_gb_trees, [{{gb_tree,2},already_declared},
- {{iterator,2},already_declared}]},
- {proper_orddict, [{{orddict,2},already_declared}]},
- {proper_ordsets, [{{ordset,1},already_declared}]},
- {proper_queue, [{{queue,1},already_declared}]},
- {proper_sets, [{{set,1},already_declared}]},
- {queue, [{{queue,0},
- {{type,0,tuple,[{type,0,list,[]},{type,0,list,[]}]},[]}}]},
- {sets, [{{set,0},
- {{type,0,record,[{atom,0,set}]},[]}}]}]).
-
-
-%%------------------------------------------------------------------------------
-%% Types
-%%------------------------------------------------------------------------------
-
--type type_name() :: atom().
--type var_name() :: atom(). %% TODO: also integers?
--type field_name() :: atom().
-
--type type_kind() :: 'type' | 'record'.
--type type_ref() :: {type_kind(),type_name(),arity()}.
--ifdef(NO_MODULES_IN_OPAQUES).
--type substs_dict() :: dict(). %% dict(field_name(),ret_type())
--else.
--type substs_dict() :: dict:dict(field_name(),ret_type()).
--endif.
--type full_type_ref() :: {mod_name(),type_kind(),type_name(),
- [ret_type()] | substs_dict()}.
--type symb_info() :: 'not_symb' | {'orig_abs',abs_type()}.
--type type_repr() :: {'abs_type',abs_type(),[var_name()],symb_info()}
- | {'cached',fin_type(),abs_type(),symb_info()}
- | {'abs_record',[{field_name(),abs_type()}]}.
--type gen_fun() :: fun((size()) -> fin_type()).
--type rec_fun() :: fun(([gen_fun()],size()) -> fin_type()).
--type rec_arg() :: {boolean() | {'list',boolean(),rec_fun()},full_type_ref()}.
--type rec_args() :: [rec_arg()].
--type ret_type() :: {'simple',fin_type()} | {'rec',rec_fun(),rec_args()}.
--type rec_fun_info() :: {pos_integer(),pos_integer(),[arity(),...],
- [rec_fun(),...]}.
-
--type imm_type_ref() :: {type_name(),arity()}.
--type hard_adt_repr() :: {abs_type(),[var_name()]} | 'already_declared'.
--type fun_ref() :: {fun_name(),arity()}.
--type fun_repr() :: fun_clause_repr().
--type fun_clause_repr() :: {[abs_type()],abs_type()}.
--type proc_fun_ref() :: {fun_name(),[abs_type()],abs_type()}.
--type full_imm_type_ref() :: {mod_name(),type_name(),arity()}.
--type imm_stack() :: [full_imm_type_ref()].
--type pat_field() :: 0 | 1 | atom().
--type pattern() :: loose_tuple(pat_field()).
--type next_step() :: 'none' | 'take_head' | {'match_with',pattern()}.
-
--ifdef(NO_MODULES_IN_OPAQUES).
-%% @private_type
--type mod_exp_types() :: set(). %% set(imm_type_ref())
--type mod_types() :: dict(). %% dict(type_ref(),type_repr())
-%% @private_type
--type mod_exp_funs() :: set(). %% set(fun_ref())
--type mod_specs() :: dict(). %% dict(fun_ref(),fun_repr())
--else.
-%% @private_type
--type mod_exp_types() :: sets:set(imm_type_ref()).
--type mod_types() :: dict:dict(type_ref(),type_repr()).
-%% @private_type
--type mod_exp_funs() :: sets:set(fun_ref()).
--type mod_specs() :: dict:dict(fun_ref(),fun_repr()).
--endif.
-
--ifdef(NO_MODULES_IN_OPAQUES).
--record(state,
- {cached = dict:new() :: dict(), %% dict(imm_type(),fin_type())
- exp_types = dict:new() :: dict(), %% dict(mod_name(),mod_exp_types())
- types = dict:new() :: dict(), %% dict(mod_name(),mod_types())
- exp_specs = dict:new() :: dict()}). %% dict(mod_name(),mod_specs())
--else.
--record(state,
- {cached = dict:new() :: dict:dict(imm_type(),fin_type()),
- exp_types = dict:new() :: dict:dict(mod_name(),mod_exp_types()),
- types = dict:new() :: dict:dict(mod_name(),mod_types()),
- exp_specs = dict:new() :: dict:dict(mod_name(),mod_specs())}).
--endif.
--type state() :: #state{}.
-
--record(mod_info,
- {mod_exp_types = sets:new() :: mod_exp_types(),
- mod_types = dict:new() :: mod_types(),
- mod_opaques = sets:new() :: mod_exp_types(),
- mod_exp_funs = sets:new() :: mod_exp_funs(),
- mod_specs = dict:new() :: mod_specs()}).
--type mod_info() :: #mod_info{}.
-
--type stack() :: [full_type_ref() | 'tuple' | 'list' | 'union' | 'fun'].
--ifdef(NO_MODULES_IN_OPAQUES).
--type var_dict() :: dict(). %% dict(var_name(),ret_type())
--else.
--type var_dict() :: dict:dict(var_name(),ret_type()).
--endif.
-%% @private_type
--type imm_type() :: {mod_name(),string()}.
-%% @alias
--type fin_type() :: proper_types:type().
--type tagged_result(T) :: {'ok',T} | 'error'.
--type tagged_result2(T,S) :: {'ok',T,S} | 'error'.
-%% @alias
--type rich_result(T) :: {'ok',T} | {'error',term()}.
--type rich_result2(T,S) :: {'ok',T,S} | {'error',term()}.
--type false_positive_mfas() :: proper:false_positive_mfas().
-
--type server_call() :: {'create_spec_test',mfa(),timeout(),false_positive_mfas()}
- | {'get_exp_specced',mod_name()}
- | {'get_type_repr',mod_name(),type_ref(),boolean()}
- | {'translate_type',imm_type()}.
--type server_response() :: rich_result(proper:test())
- | rich_result([mfa()])
- | rich_result(type_repr())
- | rich_result(fin_type()).
-
-
-%%------------------------------------------------------------------------------
-%% Server interface functions
-%%------------------------------------------------------------------------------
-
-%% @private
--spec start() -> 'ok'.
-start() ->
- {ok,TypeserverPid} = gen_server:start_link(?MODULE, dummy, []),
- put('$typeserver_pid', TypeserverPid),
- ok.
-
-%% @private
--spec restart() -> 'ok'.
-restart() ->
- TypeserverPid = get('$typeserver_pid'),
- case (TypeserverPid =:= undefined orelse not is_process_alive(TypeserverPid)) of
- true -> start();
- false -> ok
- end.
-
-%% @private
--spec stop() -> 'ok'.
-stop() ->
- TypeserverPid = get('$typeserver_pid'),
- erase('$typeserver_pid'),
- gen_server:cast(TypeserverPid, stop).
-
-%% @private
--spec create_spec_test(mfa(), timeout(), false_positive_mfas()) -> rich_result(proper:test()).
-create_spec_test(MFA, SpecTimeout, FalsePositiveMFAs) ->
- TypeserverPid = get('$typeserver_pid'),
- gen_server:call(TypeserverPid, {create_spec_test,MFA,SpecTimeout,FalsePositiveMFAs}).
-
-%% @private
--spec get_exp_specced(mod_name()) -> rich_result([mfa()]).
-get_exp_specced(Mod) ->
- TypeserverPid = get('$typeserver_pid'),
- gen_server:call(TypeserverPid, {get_exp_specced,Mod}).
-
--spec get_type_repr(mod_name(), type_ref(), boolean()) ->
- rich_result(type_repr()).
-get_type_repr(Mod, TypeRef, IsRemote) ->
- TypeserverPid = get('$typeserver_pid'),
- gen_server:call(TypeserverPid, {get_type_repr,Mod,TypeRef,IsRemote}).
-
-%% @private
--spec translate_type(imm_type()) -> rich_result(fin_type()).
-translate_type(ImmType) ->
- TypeserverPid = get('$typeserver_pid'),
- gen_server:call(TypeserverPid, {translate_type,ImmType}).
-
-%% @doc Translates the native type expression `TypeExpr' (which should be
-%% provided inside a string) into a PropEr type, which can then be passed to any
-%% of the demo functions defined in the {@link proper_gen} module. PropEr acts
-%% as if it found this type expression inside the code of module `Mod'.
--spec demo_translate_type(mod_name(), string()) -> rich_result(fin_type()).
-demo_translate_type(Mod, TypeExpr) ->
- start(),
- Result = translate_type({Mod,TypeExpr}),
- stop(),
- Result.
-
-%% @doc Checks if `Term' is a valid instance of native type `TypeExpr' (which
-%% should be provided inside a string). PropEr acts as if it found this type
-%% expression inside the code of module `Mod'.
--spec demo_is_instance(term(), mod_name(), string()) ->
- boolean() | {'error',term()}.
-demo_is_instance(Term, Mod, TypeExpr) ->
- case parse_type(TypeExpr) of
- {ok,TypeForm} ->
- start(),
- Result =
- %% Force the typeserver to load the module.
- case translate_type({Mod,"integer()"}) of
- {ok,_FinType} ->
- try is_instance(Term, Mod, TypeForm)
- catch
- throw:{'$typeserver',Reason} -> {error, Reason}
- end;
- {error,_Reason} = Error ->
- Error
- end,
- stop(),
- Result;
- {error,_Reason} = Error ->
- Error
- end.
-
-
-%%------------------------------------------------------------------------------
-%% Implementation of gen_server interface
-%%------------------------------------------------------------------------------
-
-%% @private
--spec init(_) -> {'ok',state()}.
-init(_) ->
- {ok, #state{}}.
-
-%% @private
--spec handle_call(server_call(), _, state()) ->
- {'reply',server_response(),state()}.
-handle_call({create_spec_test,MFA,SpecTimeout,FalsePositiveMFAs}, _From, State) ->
- case create_spec_test(MFA, SpecTimeout, FalsePositiveMFAs, State) of
- {ok,Test,NewState} ->
- {reply, {ok,Test}, NewState};
- {error,_Reason} = Error ->
- {reply, Error, State}
- end;
-handle_call({get_exp_specced,Mod}, _From, State) ->
- case get_exp_specced(Mod, State) of
- {ok,MFAs,NewState} ->
- {reply, {ok,MFAs}, NewState};
- {error,_Reason} = Error ->
- {reply, Error, State}
- end;
-handle_call({get_type_repr,Mod,TypeRef,IsRemote}, _From, State) ->
- case get_type_repr(Mod, TypeRef, IsRemote, State) of
- {ok,TypeRepr,NewState} ->
- {reply, {ok,TypeRepr}, NewState};
- {error,_Reason} = Error ->
- {reply, Error, State}
- end;
-handle_call({translate_type,ImmType}, _From, State) ->
- case translate_type(ImmType, State) of
- {ok,FinType,NewState} ->
- {reply, {ok,FinType}, NewState};
- {error,_Reason} = Error ->
- {reply, Error, State}
- end.
-
-%% @private
--spec handle_cast('stop', state()) -> {'stop','normal',state()}.
-handle_cast(stop, State) ->
- {stop, normal, State}.
-
-%% @private
--spec handle_info(term(), state()) -> {'stop',{'received_info',term()},state()}.
-handle_info(Info, State) ->
- {stop, {received_info,Info}, State}.
-
-%% @private
--spec terminate(term(), state()) -> 'ok'.
-terminate(_Reason, _State) ->
- ok.
-
-%% @private
--spec code_change(term(), state(), _) -> {'ok',state()}.
-code_change(_OldVsn, State, _) ->
- {ok, State}.
-
-
-%%------------------------------------------------------------------------------
-%% Top-level interface
-%%------------------------------------------------------------------------------
-
--spec create_spec_test(mfa(), timeout(), false_positive_mfas(), state()) ->
- rich_result2(proper:test(),state()).
-create_spec_test(MFA, SpecTimeout, FalsePositiveMFAs, State) ->
- case get_exp_spec(MFA, State) of
- {ok,FunRepr,NewState} ->
- make_spec_test(MFA, FunRepr, SpecTimeout, FalsePositiveMFAs, NewState);
- {error,_Reason} = Error ->
- Error
- end.
-
--spec get_exp_spec(mfa(), state()) -> rich_result2(fun_repr(),state()).
-get_exp_spec({Mod,Fun,Arity} = MFA, State) ->
- case add_module(Mod, State) of
- {ok,#state{exp_specs = ExpSpecs} = NewState} ->
- ModExpSpecs = dict:fetch(Mod, ExpSpecs),
- case dict:find({Fun,Arity}, ModExpSpecs) of
- {ok,FunRepr} ->
- {ok, FunRepr, NewState};
- error ->
- {error, {function_not_exported_or_specced,MFA}}
- end;
- {error,_Reason} = Error ->
- Error
- end.
-
--spec make_spec_test(mfa(), fun_repr(), timeout(), false_positive_mfas(), state()) ->
- rich_result2(proper:test(),state()).
-make_spec_test({Mod,_Fun,_Arity}=MFA, {Domain,_Range}=FunRepr, SpecTimeout, FalsePositiveMFAs, State) ->
- case convert(Mod, {type,?anno(0),'$fixed_list',Domain}, State) of
- {ok,FinType,NewState} ->
- Test = ?FORALL(Args, FinType, apply_spec_test(MFA, FunRepr, SpecTimeout, FalsePositiveMFAs, Args)),
- {ok, Test, NewState};
- {error,_Reason} = Error ->
- Error
- end.
-
--spec apply_spec_test(mfa(), fun_repr(), timeout(), false_positive_mfas(), term()) -> proper:test().
-apply_spec_test({Mod,Fun,_Arity}=MFA, {_Domain,Range}, SpecTimeout, FalsePositiveMFAs, Args) ->
- ?TIMEOUT(SpecTimeout,
- begin
- %% NOTE: only call apply/3 inside try/catch (do not trust ?MODULE:is_instance/3)
- Result =
- try apply(Mod, Fun, Args) of
- X -> {ok, X}
- catch
- X:Y:S -> {{X, Y}, S}
- end,
- case Result of
- {ok, Z} ->
- case ?MODULE:is_instance(Z, Mod, Range) of
- true ->
- true;
- false when is_function(FalsePositiveMFAs) ->
- FalsePositiveMFAs(MFA, Args, {fail, Z});
- false ->
- false
- end;
- {Exception, S2} when is_function(FalsePositiveMFAs) ->
- case FalsePositiveMFAs(MFA, Args, Exception) of
- true ->
- true;
- false ->
- error(Exception, S2)
- end;
- {Exception, S3} ->
- error(Exception, S3)
- end
- end).
-
--spec get_exp_specced(mod_name(), state()) -> rich_result2([mfa()],state()).
-get_exp_specced(Mod, State) ->
- case add_module(Mod, State) of
- {ok,#state{exp_specs = ExpSpecs} = NewState} ->
- ModExpSpecs = dict:fetch(Mod, ExpSpecs),
- ExpSpecced = [{Mod,F,A} || {F,A} <- dict:fetch_keys(ModExpSpecs)],
- {ok, ExpSpecced, NewState};
- {error,_Reason} = Error ->
- Error
- end.
-
--spec get_type_repr(mod_name(), type_ref(), boolean(), state()) ->
- rich_result2(type_repr(),state()).
-get_type_repr(Mod, {type,Name,Arity} = TypeRef, true, State) ->
- case prepare_for_remote(Mod, Name, Arity, State) of
- {ok,NewState} ->
- get_type_repr(Mod, TypeRef, false, NewState);
- {error,_Reason} = Error ->
- Error
- end;
-get_type_repr(Mod, TypeRef, false, #state{types = Types} = State) ->
- ModTypes = dict:fetch(Mod, Types),
- case dict:find(TypeRef, ModTypes) of
- {ok,TypeRepr} ->
- {ok, TypeRepr, State};
- error ->
- {error, {missing_type,Mod,TypeRef}}
- end.
-
--spec prepare_for_remote(mod_name(), type_name(), arity(), state()) ->
- rich_result(state()).
-prepare_for_remote(RemMod, Name, Arity, State) ->
- case add_module(RemMod, State) of
- {ok,#state{exp_types = ExpTypes} = NewState} ->
- RemModExpTypes = dict:fetch(RemMod, ExpTypes),
- case sets:is_element({Name,Arity}, RemModExpTypes) of
- true -> {ok, NewState};
- false -> {error, {type_not_exported,{RemMod,Name,Arity}}}
- end;
- {error,_Reason} = Error ->
- Error
- end.
-
--spec translate_type(imm_type(), state()) -> rich_result2(fin_type(),state()).
-translate_type({Mod,Str} = ImmType, #state{cached = Cached} = State) ->
- case dict:find(ImmType, Cached) of
- {ok,Type} ->
- {ok, Type, State};
- error ->
- case parse_type(Str) of
- {ok,TypeForm} ->
- case add_module(Mod, State) of
- {ok,NewState} ->
- case convert(Mod, TypeForm, NewState) of
- {ok,FinType,
- #state{cached = Cached} = FinalState} ->
- NewCached = dict:store(ImmType, FinType,
- Cached),
- {ok, FinType,
- FinalState#state{cached = NewCached}};
- {error,_Reason} = Error ->
- Error
- end;
- {error,_Reason} = Error ->
- Error
- end;
- {error,Reason} ->
- {error, {parse_error,Str,Reason}}
- end
- end.
-
--spec parse_type(string()) -> rich_result(abs_type()).
-parse_type(Str) ->
- TypeStr = "-type mytype() :: " ++ Str ++ ".",
- case erl_scan:string(TypeStr) of
- {ok,Tokens,_EndLocation} ->
- case erl_parse:parse_form(Tokens) of
- {ok,{attribute,_Line,type,{mytype,TypeExpr,[]}}} ->
- {ok, TypeExpr};
- {error,_ErrorInfo} = Error ->
- Error
- end;
- {error,ErrorInfo,_EndLocation} ->
- {error, ErrorInfo}
- end.
-
--spec add_module(mod_name(), state()) -> rich_result(state()).
-add_module(Mod, #state{exp_types = ExpTypes} = State) ->
- case dict:is_key(Mod, ExpTypes) of
- true ->
- {ok, State};
- false ->
- case get_code_and_exports(Mod) of
- {ok,AbsCode,ModExpFuns} ->
- RawModInfo = get_mod_info(Mod, AbsCode, ModExpFuns),
- ModInfo = process_adts(Mod, RawModInfo),
- {ok, store_mod_info(Mod, ModInfo, State)};
- {error,Reason} ->
- {error, {cant_load_code,Mod,Reason}}
- end
- end.
-
-%% @private
--spec get_exp_info(mod_name()) -> rich_result2(mod_exp_types(),mod_exp_funs()).
-get_exp_info(Mod) ->
- case get_code_and_exports(Mod) of
- {ok,AbsCode,ModExpFuns} ->
- RawModInfo = get_mod_info(Mod, AbsCode, ModExpFuns),
- {ok, RawModInfo#mod_info.mod_exp_types, ModExpFuns};
- {error,_Reason} = Error ->
- Error
- end.
-
--spec get_code_and_exports(mod_name()) ->
- rich_result2([abs_form()],mod_exp_funs()).
-get_code_and_exports(Mod) ->
- case code:get_object_code(Mod) of
- {Mod, ObjBin, _ObjFileName} ->
- case get_chunks(ObjBin) of
- {ok,_AbsCode,_ModExpFuns} = Result ->
- Result;
- {error,Reason} ->
- get_code_and_exports_from_source(Mod, Reason)
- end;
- error ->
- get_code_and_exports_from_source(Mod, cant_find_object_file)
- end.
-
--spec get_code_and_exports_from_source(mod_name(), term()) ->
- rich_result2([abs_form()],mod_exp_funs()).
-get_code_and_exports_from_source(Mod, ObjError) ->
- SrcFileName = atom_to_list(Mod) ++ ?SRC_FILE_EXT,
- case code:where_is_file(SrcFileName) of
- FullSrcFileName when is_list(FullSrcFileName) ->
- Opts = [binary,debug_info,return_errors,{d,'PROPER_REMOVE_PROPS'}],
- case compile:file(FullSrcFileName, Opts) of
- {ok,Mod,Binary} ->
- get_chunks(Binary);
- {error,Errors,_Warnings} ->
- {error, {ObjError,{cant_compile_source_file,Errors}}}
- end;
- non_existing ->
- {error, {ObjError,cant_find_source_file}}
- end.
-
--spec get_chunks(string() | binary()) ->
- rich_result2([abs_form()],mod_exp_funs()).
-get_chunks(ObjFile) ->
- case beam_lib:chunks(ObjFile, [abstract_code,exports]) of
- {ok,{_Mod,[{abstract_code,AbsCodeChunk},{exports,ExpFunsList}]}} ->
- case AbsCodeChunk of
- {raw_abstract_v1,AbsCode} ->
- %% HACK: Add a declaration for iolist() to every module
- {ok, add_iolist(AbsCode), sets:from_list(ExpFunsList)};
- no_abstract_code ->
- {error, no_abstract_code};
- _ ->
- {error, unsupported_abstract_code_format}
- end;
- {error,beam_lib,Reason} ->
- {error, Reason}
- end.
-
--spec add_iolist([abs_form()]) -> [abs_form()].
-add_iolist(Forms) ->
- IOListDef =
- {type,0,maybe_improper_list,
- [{type,0,union,[{type,0,byte,[]},{type,0,binary,[]},
- {type,0,iolist,[]}]},
- {type,0,binary,[]}]},
- IOListDecl = {attribute,0,type,{iolist,IOListDef,[]}},
- [IOListDecl | Forms].
-
--spec get_mod_info(mod_name(), [abs_form()], mod_exp_funs()) -> mod_info().
-get_mod_info(Mod, AbsCode, ModExpFuns) ->
- StartModInfo = #mod_info{mod_exp_funs = ModExpFuns},
- ImmModInfo = lists:foldl(fun add_mod_info/2, StartModInfo, AbsCode),
- #mod_info{mod_specs = AllModSpecs} = ImmModInfo,
- IsExported = fun(FunRef,_FunRepr) -> sets:is_element(FunRef,ModExpFuns) end,
- ModExpSpecs = dict:filter(IsExported, AllModSpecs),
- ModInfo = ImmModInfo#mod_info{mod_specs = ModExpSpecs},
- case orddict:find(Mod, ?HARD_ADT_MODS) of
- {ok,ModADTs} ->
- #mod_info{mod_exp_types = ModExpTypes, mod_types = ModTypes,
- mod_opaques = ModOpaques} = ModInfo,
- ModADTsSet =
- sets:from_list([ImmTypeRef
- || {ImmTypeRef,_HardADTRepr} <- ModADTs]),
- NewModExpTypes = sets:union(ModExpTypes, ModADTsSet),
- NewModTypes = lists:foldl(fun store_hard_adt/2, ModTypes, ModADTs),
- NewModOpaques = sets:union(ModOpaques, ModADTsSet),
- ModInfo#mod_info{mod_exp_types = NewModExpTypes,
- mod_types = NewModTypes,
- mod_opaques = NewModOpaques};
- error ->
- ModInfo
- end.
-
--spec store_hard_adt({imm_type_ref(),hard_adt_repr()}, mod_types()) ->
- mod_types().
-store_hard_adt({_ImmTypeRef,already_declared}, ModTypes) ->
- ModTypes;
-store_hard_adt({{Name,Arity},{TypeForm,VarNames}}, ModTypes) ->
- TypeRef = {type,Name,Arity},
- TypeRepr = {abs_type,TypeForm,VarNames,not_symb},
- dict:store(TypeRef, TypeRepr, ModTypes).
-
--spec add_mod_info(abs_form(), mod_info()) -> mod_info().
-add_mod_info({attribute,_Line,export_type,TypesList},
- #mod_info{mod_exp_types = ModExpTypes} = ModInfo) ->
- NewModExpTypes = sets:union(sets:from_list(TypesList), ModExpTypes),
- ModInfo#mod_info{mod_exp_types = NewModExpTypes};
-add_mod_info({attribute,_Line,type,{{record,RecName},Fields,[]}},
- #mod_info{mod_types = ModTypes} = ModInfo) ->
- FieldInfo = [process_rec_field(F) || F <- Fields],
- NewModTypes = dict:store({record,RecName,0}, {abs_record,FieldInfo},
- ModTypes),
- ModInfo#mod_info{mod_types = NewModTypes};
-add_mod_info({attribute,Line,record,{RecName,Fields}},
- #mod_info{mod_types = ModTypes} = ModInfo) ->
- case dict:is_key(RecName, ModTypes) of
- true ->
- ModInfo;
- false -> % fake an opaque term by using the same Line as annotation
- TypedRecord = {attribute,Line,type,{{record,RecName},Fields,[]}},
- add_mod_info(TypedRecord, ModInfo)
- end;
-add_mod_info({attribute,_Line,Kind,{Name,TypeForm,VarForms}},
- #mod_info{mod_types = ModTypes,
- mod_opaques = ModOpaques} = ModInfo)
- when Kind =:= type; Kind =:= opaque ->
- Arity = length(VarForms),
- VarNames = [V || {var,_,V} <- VarForms],
- %% TODO: No check whether variables are different, or non-'_'.
- NewModTypes = dict:store({type,Name,Arity},
- {abs_type,TypeForm,VarNames,not_symb}, ModTypes),
- NewModOpaques =
- case Kind of
- type -> ModOpaques;
- opaque -> sets:add_element({Name,Arity}, ModOpaques)
- end,
- ModInfo#mod_info{mod_types = NewModTypes, mod_opaques = NewModOpaques};
-add_mod_info({attribute,_Line,spec,{RawFunRef,[RawFirstClause | _Rest]}},
- #mod_info{mod_specs = ModSpecs} = ModInfo) ->
- FunRef = case RawFunRef of
- {_Mod,Name,Arity} -> {Name,Arity};
- {_Name,_Arity} = F -> F
- end,
- %% TODO: We just take the first function clause.
- FirstClause = process_fun_clause(RawFirstClause),
- NewModSpecs = dict:store(FunRef, FirstClause, ModSpecs),
- ModInfo#mod_info{mod_specs = NewModSpecs};
-add_mod_info(_Form, ModInfo) ->
- ModInfo.
-
--spec process_rec_field(abs_rec_field()) -> {field_name(),abs_type()}.
-process_rec_field({record_field,_,{atom,_,FieldName}}) ->
- {FieldName, {type,0,any,[]}};
-process_rec_field({record_field,_,{atom,_,FieldName},_Initialization}) ->
- {FieldName, {type,0,any,[]}};
-process_rec_field({typed_record_field,RecField,FieldType}) ->
- {FieldName,_} = process_rec_field(RecField),
- {FieldName, FieldType}.
-
--spec process_fun_clause(abs_type()) -> fun_clause_repr().
-process_fun_clause({type,_,'fun',[{type,_,product,Domain},Range]}) ->
- {Domain, Range};
-process_fun_clause({type,_,bounded_fun,[MainClause,Constraints]}) ->
- {RawDomain,RawRange} = process_fun_clause(MainClause),
- VarSubsts = [{V,T} || {type,_,constraint,
- [{atom,_,is_subtype},[{var,_,V},T]]} <- Constraints,
- V =/= '_'],
- VarSubstsDict = dict:from_list(VarSubsts),
- Domain = [update_vars(A, VarSubstsDict, false) || A <- RawDomain],
- Range = update_vars(RawRange, VarSubstsDict, false),
- {Domain, Range}.
-
--spec store_mod_info(mod_name(), mod_info(), state()) -> state().
-store_mod_info(Mod, #mod_info{mod_exp_types = ModExpTypes, mod_types = ModTypes,
- mod_specs = ImmModExpSpecs},
- #state{exp_types = ExpTypes, types = Types,
- exp_specs = ExpSpecs} = State) ->
- NewExpTypes = dict:store(Mod, ModExpTypes, ExpTypes),
- NewTypes = dict:store(Mod, ModTypes, Types),
- ModExpSpecs = dict:map(fun unbound_to_any/2, ImmModExpSpecs),
- NewExpSpecs = dict:store(Mod, ModExpSpecs, ExpSpecs),
- State#state{exp_types = NewExpTypes, types = NewTypes,
- exp_specs = NewExpSpecs}.
-
--spec unbound_to_any(fun_ref(), fun_repr()) -> fun_repr().
-unbound_to_any(_FunRef, {Domain,Range}) ->
- EmptySubstsDict = dict:new(),
- NewDomain = [update_vars(A,EmptySubstsDict,true) || A <- Domain],
- NewRange = update_vars(Range, EmptySubstsDict, true),
- {NewDomain, NewRange}.
-
-
-%%------------------------------------------------------------------------------
-%% ADT translation functions
-%%------------------------------------------------------------------------------
-
--spec process_adts(mod_name(), mod_info()) -> mod_info().
-process_adts(Mod,
- #mod_info{mod_exp_types = ModExpTypes, mod_opaques = ModOpaques,
- mod_specs = ModExpSpecs} = ModInfo) ->
- %% TODO: No warning on unexported opaques.
- case sets:to_list(sets:intersection(ModExpTypes,ModOpaques)) of
- [] ->
- ModInfo;
- ModADTs ->
- %% TODO: No warning on unexported API functions.
- ModExpSpecsList = [{Name,Domain,Range}
- || {{Name,_Arity},{Domain,Range}}
- <- dict:to_list(ModExpSpecs)],
- AddADT = fun(ADT,Acc) -> add_adt(Mod,ADT,Acc,ModExpSpecsList) end,
- lists:foldl(AddADT, ModInfo, ModADTs)
- end.
-
--spec add_adt(mod_name(), imm_type_ref(), mod_info(), [proc_fun_ref()]) ->
- mod_info().
-add_adt(Mod, {Name,Arity}, #mod_info{mod_types = ModTypes} = ModInfo,
- ModExpFunSpecs) ->
- ADTRef = {type,Name,Arity},
- {abs_type,InternalRepr,VarNames,not_symb} = dict:fetch(ADTRef, ModTypes),
- FullADTRef = {Mod,Name,Arity},
- %% TODO: No warning on unsuitable range.
- SymbCalls1 = [get_symb_call(FullADTRef,Spec) || Spec <- ModExpFunSpecs],
- %% TODO: No warning on bad use of variables.
- SymbCalls2 = [fix_vars(FullADTRef,Call,RangeVars,VarNames)
- || {ok,Call,RangeVars} <- SymbCalls1],
- case [Call || {ok,Call} <- SymbCalls2] of
- [] ->
- %% TODO: No warning on no acceptable spec.
- ModInfo;
- SymbCalls3 ->
- NewADTRepr = {abs_type,{type,0,union,SymbCalls3},VarNames,
- {orig_abs,InternalRepr}},
- NewModTypes = dict:store(ADTRef, NewADTRepr, ModTypes),
- ModInfo#mod_info{mod_types = NewModTypes}
- end.
-
--spec get_symb_call(full_imm_type_ref(), proc_fun_ref()) ->
- tagged_result2(abs_type(),[var_name()]).
-get_symb_call({Mod,_TypeName,_Arity} = FullADTRef, {FunName,Domain,Range}) ->
- A = ?anno(0),
- BaseCall = {type,A,tuple,[{atom,A,'$call'},{atom,A,Mod},{atom,A,FunName},
- {type,A,'$fixed_list',Domain}]},
- unwrap_range(FullADTRef, BaseCall, Range, false).
-
--spec unwrap_range(full_imm_type_ref(), abs_type() | next_step(), abs_type(),
- boolean()) ->
- tagged_result2(abs_type() | next_step(),[var_name()]).
-unwrap_range(FullADTRef, Call, {paren_type,_,[Type]}, TestRun) ->
- unwrap_range(FullADTRef, Call, Type, TestRun);
-unwrap_range(FullADTRef, Call, {ann_type,_,[_Var,Type]}, TestRun) ->
- unwrap_range(FullADTRef, Call, Type, TestRun);
-unwrap_range(FullADTRef, Call, {type,_,list,[ElemType]}, TestRun) ->
- unwrap_list(FullADTRef, Call, ElemType, TestRun);
-unwrap_range(FullADTRef, Call, {type,_,maybe_improper_list,[Cont,_Term]},
- TestRun) ->
- unwrap_list(FullADTRef, Call, Cont, TestRun);
-unwrap_range(FullADTRef, Call, {type,_,nonempty_list,[ElemType]}, TestRun) ->
- unwrap_list(FullADTRef, Call, ElemType, TestRun);
-unwrap_range(FullADTRef, Call, {type,_,nonempty_improper_list,[Cont,_Term]},
- TestRun) ->
- unwrap_list(FullADTRef, Call, Cont, TestRun);
-unwrap_range(FullADTRef, Call,
- {type,_,nonempty_maybe_improper_list,[Cont,_Term]}, TestRun) ->
- unwrap_list(FullADTRef, Call, Cont, TestRun);
-unwrap_range(_FullADTRef, _Call, {type,_,tuple,any}, _TestRun) ->
- error;
-unwrap_range(FullADTRef, Call, {type,_,tuple,FieldForms}, TestRun) ->
- Translates = fun(T) -> unwrap_range(FullADTRef,none,T,true) =/= error end,
- case proper_arith:find_first(Translates, FieldForms) of
- none ->
- error;
- {TargetPos,TargetElem} ->
- Pattern = get_pattern(TargetPos, FieldForms),
- case TestRun of
- true ->
- NewCall =
- case Call of
- none -> {match_with,Pattern};
- _ -> Call
- end,
- {ok, NewCall, []};
- false ->
- AbsPattern = term_to_singleton_type(Pattern),
- A = ?anno(0),
- NewCall =
- {type,A,tuple,
- [{atom,A,'$call'},{atom,A,?MODULE},{atom,A,match},
- {type,A,'$fixed_list',[AbsPattern,Call]}]},
- unwrap_range(FullADTRef, NewCall, TargetElem, TestRun)
- end
- end;
-unwrap_range(FullADTRef, Call, {type,_,union,Choices}, TestRun) ->
- TestedChoices = [unwrap_range(FullADTRef,none,C,true) || C <- Choices],
- NotError = fun(error) -> false; (_) -> true end,
- case proper_arith:find_first(NotError, TestedChoices) of
- none ->
- error;
- {_ChoicePos,{ok,none,_RangeVars}} ->
- error;
- {ChoicePos,{ok,NextStep,_RangeVars}} ->
- {A, [ChoiceElem|B]} = lists:split(ChoicePos-1, Choices),
- OtherChoices = A ++ B,
- DistinctChoice =
- case NextStep of
- take_head ->
- fun cant_have_head/1;
- {match_with,Pattern} ->
- fun(C) -> cant_match(Pattern, C) end
- end,
- case {lists:all(DistinctChoice,OtherChoices), TestRun} of
- {true,true} ->
- {ok, NextStep, []};
- {true,false} ->
- unwrap_range(FullADTRef, Call, ChoiceElem, TestRun);
- {false,_} ->
- error
- end
- end;
-unwrap_range({_Mod,SameName,Arity}, Call, {type,_,SameName,ArgForms},
- _TestRun) ->
- RangeVars = [V || {var,_,V} <- ArgForms, V =/= '_'],
- case length(ArgForms) =:= Arity andalso length(RangeVars) =:= Arity of
- true -> {ok, Call, RangeVars};
- false -> error
- end;
-unwrap_range({SameMod,SameName,_Arity} = FullADTRef, Call,
- {remote_type,_,[{atom,_,SameMod},{atom,_,SameName},ArgForms]},
- TestRun) ->
- unwrap_range(FullADTRef, Call, {type,?anno(0),SameName,ArgForms}, TestRun);
-unwrap_range(_FullADTRef, _Call, _Range, _TestRun) ->
- error.
-
--spec unwrap_list(full_imm_type_ref(), abs_type() | next_step(), abs_type(),
- boolean()) ->
- tagged_result2(abs_type() | next_step(),[var_name()]).
-unwrap_list(FullADTRef, Call, HeadType, TestRun) ->
- NewCall =
- case TestRun of
- true ->
- case Call of
- none -> take_head;
- _ -> Call
- end;
- false ->
- {type,0,tuple,[{atom,0,'$call'},{atom,0,erlang},{atom,0,hd},
- {type,0,'$fixed_list',[Call]}]}
- end,
- unwrap_range(FullADTRef, NewCall, HeadType, TestRun).
-
--spec fix_vars(full_imm_type_ref(), abs_type(), [var_name()], [var_name()]) ->
- tagged_result(abs_type()).
-fix_vars(FullADTRef, Call, RangeVars, VarNames) ->
- NotAnyVar = fun(V) -> V =/= '_' end,
- case no_duplicates(VarNames) andalso lists:all(NotAnyVar,VarNames) of
- true ->
- RawUsedVars =
- collect_vars(FullADTRef, Call, [[V] || V <- RangeVars]),
- UsedVars = [lists:usort(L) || L <- RawUsedVars],
- case correct_var_use(UsedVars) of
- true ->
- PairAll = fun(L,Y) -> [{X,{var,0,Y}} || X <- L] end,
- VarSubsts =
- lists:flatten(lists:zipwith(PairAll,UsedVars,VarNames)),
- VarSubstsDict = dict:from_list(VarSubsts),
- {ok, update_vars(Call,VarSubstsDict,true)};
- false ->
- error
- end;
- false ->
- error
- end.
-
--spec no_duplicates(list()) -> boolean().
-no_duplicates(L) ->
- length(lists:usort(L)) =:= length(L).
-
--spec correct_var_use([[var_name() | 0]]) -> boolean().
-correct_var_use(UsedVars) ->
- NoNonVarArgs = fun([0|_]) -> false; (_) -> true end,
- lists:all(NoNonVarArgs, UsedVars)
- andalso no_duplicates(lists:flatten(UsedVars)).
-
--spec collect_vars(full_imm_type_ref(), abs_type(), [[var_name() | 0]]) ->
- [[var_name() | 0]].
-collect_vars(FullADTRef, {paren_type,_,[Type]}, UsedVars) ->
- collect_vars(FullADTRef, Type, UsedVars);
-collect_vars(FullADTRef, {ann_type,_,[_Var,Type]}, UsedVars) ->
- collect_vars(FullADTRef, Type, UsedVars);
-collect_vars(_FullADTRef, {type,_,tuple,any}, UsedVars) ->
- UsedVars;
-collect_vars({_Mod,SameName,Arity} = FullADTRef, {type,_,SameName,ArgForms},
- UsedVars) ->
- case length(ArgForms) =:= Arity of
- true ->
- VarArgs = [V || {var,_,V} <- ArgForms, V =/= '_'],
- case length(VarArgs) =:= Arity of
- true ->
- AddToList = fun(X,L) -> [X | L] end,
- lists:zipwith(AddToList, VarArgs, UsedVars);
- false ->
- [[0|L] || L <- UsedVars]
- end;
- false ->
- multi_collect_vars(FullADTRef, ArgForms, UsedVars)
- end;
-collect_vars(FullADTRef, {type,_,_Name,ArgForms}, UsedVars) ->
- multi_collect_vars(FullADTRef, ArgForms, UsedVars);
-collect_vars({SameMod,SameName,_Arity} = FullADTRef,
- {remote_type,_,[{atom,_,SameMod},{atom,_,SameName},ArgForms]},
- UsedVars) ->
- collect_vars(FullADTRef, {type,?anno(0),SameName,ArgForms}, UsedVars);
-collect_vars(FullADTRef, {remote_type,_,[_RemModForm,_NameForm,ArgForms]},
- UsedVars) ->
- multi_collect_vars(FullADTRef, ArgForms, UsedVars);
-collect_vars(_FullADTRef, _Call, UsedVars) ->
- UsedVars.
-
--spec multi_collect_vars(full_imm_type_ref(), [abs_type()],
- [[var_name() | 0]]) -> [[var_name() | 0]].
-multi_collect_vars({_Mod,_Name,Arity} = FullADTRef, Forms, UsedVars) ->
- NoUsedVars = lists:duplicate(Arity, []),
- MoreUsedVars = [collect_vars(FullADTRef,T,NoUsedVars) || T <- Forms],
- CombineVars = fun(L1,L2) -> lists:zipwith(fun erlang:'++'/2, L1, L2) end,
- lists:foldl(CombineVars, UsedVars, MoreUsedVars).
-
--ifdef(NO_MODULES_IN_OPAQUES).
--type var_substs_dict() :: dict().
--else.
--type var_substs_dict() :: dict:dict(var_name(),abs_type()).
--endif.
--spec update_vars(abs_type(), var_substs_dict(), boolean()) -> abs_type().
-update_vars({paren_type,Line,[Type]}, VarSubstsDict, UnboundToAny) ->
- {paren_type, Line, [update_vars(Type,VarSubstsDict,UnboundToAny)]};
-update_vars({ann_type,Line,[Var,Type]}, VarSubstsDict, UnboundToAny) ->
- {ann_type, Line, [Var,update_vars(Type,VarSubstsDict,UnboundToAny)]};
-update_vars({var,Line,VarName} = Call, VarSubstsDict, UnboundToAny) ->
- case dict:find(VarName, VarSubstsDict) of
- {ok,SubstType} ->
- SubstType;
- error when UnboundToAny =:= false ->
- Call;
- error when UnboundToAny =:= true ->
- {type,Line,any,[]}
- end;
-update_vars({remote_type,Line,[RemModForm,NameForm,ArgForms]}, VarSubstsDict,
- UnboundToAny) ->
- NewArgForms = [update_vars(A,VarSubstsDict,UnboundToAny) || A <- ArgForms],
- {remote_type, Line, [RemModForm,NameForm,NewArgForms]};
-update_vars({T,_,tuple,any} = Call, _VarSubstsDict, _UnboundToAny) when ?IS_TYPE_TAG(T) ->
- Call;
-update_vars({T,Line,Name,ArgForms}, VarSubstsDict, UnboundToAny) when ?IS_TYPE_TAG(T) ->
- NewArgForms = [update_vars(A,VarSubstsDict,UnboundToAny) || A <- ArgForms],
- {T, Line, Name, NewArgForms};
-update_vars(Call, _VarSubstsDict, _UnboundToAny) ->
- Call.
-
-
-%%------------------------------------------------------------------------------
-%% Match-related functions
-%%------------------------------------------------------------------------------
-
--spec get_pattern(position(), [abs_type()]) -> pattern().
-get_pattern(TargetPos, FieldForms) ->
- {0,RevPattern} = lists:foldl(fun add_field/2, {TargetPos,[]}, FieldForms),
- list_to_tuple(lists:reverse(RevPattern)).
-
--spec add_field(abs_type(), {non_neg_integer(),[pat_field()]}) ->
- {non_neg_integer(),[pat_field(),...]}.
-add_field(_Type, {1,Acc}) ->
- {0, [1|Acc]};
-add_field({atom,_,Tag}, {Left,Acc}) ->
- {erlang:max(0,Left-1), [Tag|Acc]};
-add_field(_Type, {Left,Acc}) ->
- {erlang:max(0,Left-1), [0|Acc]}.
-
-%% @private
--spec match(pattern(), tuple()) -> term().
-match(Pattern, Term) when tuple_size(Pattern) =:= tuple_size(Term) ->
- match(tuple_to_list(Pattern), tuple_to_list(Term), none, false);
-match(_Pattern, _Term) ->
- throw(no_match).
-
--spec match([pat_field()], [term()], 'none' | {'ok',T}, boolean()) -> T.
-match([], [], {ok,Target}, _TypeMode) ->
- Target;
-match([0|PatRest], [_|ToMatchRest], Acc, TypeMode) ->
- match(PatRest, ToMatchRest, Acc, TypeMode);
-match([1|PatRest], [Target|ToMatchRest], none, TypeMode) ->
- match(PatRest, ToMatchRest, {ok,Target}, TypeMode);
-match([Tag|PatRest], [X|ToMatchRest], Acc, TypeMode) when is_atom(Tag) ->
- MatchesTag =
- case TypeMode of
- true -> can_be_tag(Tag, X);
- false -> Tag =:= X
- end,
- case MatchesTag of
- true -> match(PatRest, ToMatchRest, Acc, TypeMode);
- false -> throw(no_match)
- end.
-
-%% CAUTION: these must be sorted
--define(NON_ATOM_TYPES,
- [arity,binary,bitstring,byte,char,float,'fun',function,integer,iodata,
- iolist,list,maybe_improper_list,mfa,neg_integer,nil,no_return,
- non_neg_integer,none,nonempty_improper_list,nonempty_list,
- nonempty_maybe_improper_list,nonempty_string,number,pid,port,
- pos_integer,range,record,reference,string,tuple]).
--define(NON_TUPLE_TYPES,
- [arity,atom,binary,bitstring,bool,boolean,byte,char,float,'fun',
- function,identifier,integer,iodata,iolist,list,maybe_improper_list,
- neg_integer,nil,no_return,node,non_neg_integer,none,
- nonempty_improper_list,nonempty_list,nonempty_maybe_improper_list,
- nonempty_string,number,pid,port,pos_integer,range,reference,string,
- timeout]).
--define(NO_HEAD_TYPES,
- [arity,atom,binary,bitstring,bool,boolean,byte,char,float,'fun',
- function,identifier,integer,mfa,module,neg_integer,nil,no_return,node,
- non_neg_integer,none,number,pid,port,pos_integer,range,record,
- reference,timeout,tuple]).
-
--spec can_be_tag(atom(), abs_type()) -> boolean().
-can_be_tag(Tag, {ann_type,_,[_Var,Type]}) ->
- can_be_tag(Tag, Type);
-can_be_tag(Tag, {paren_type,_,[Type]}) ->
- can_be_tag(Tag, Type);
-can_be_tag(Tag, {atom,_,Atom}) ->
- Tag =:= Atom;
-can_be_tag(_Tag, {integer,_,_Int}) ->
- false;
-can_be_tag(_Tag, {op,_,_Op,_Arg}) ->
- false;
-can_be_tag(_Tag, {op,_,_Op,_Arg1,_Arg2}) ->
- false;
-can_be_tag(Tag, {type,_,BName,[]}) when BName =:= bool; BName =:= boolean ->
- is_boolean(Tag);
-can_be_tag(Tag, {type,_,timeout,[]}) ->
- Tag =:= infinity;
-can_be_tag(Tag, {type,_,union,Choices}) ->
- lists:any(fun(C) -> can_be_tag(Tag,C) end, Choices);
-can_be_tag(_Tag, {type,_,Name,_Args}) ->
- not ordsets:is_element(Name, ?NON_ATOM_TYPES);
-can_be_tag(_Tag, _Type) ->
- true.
-
--spec cant_match(pattern(), abs_type()) -> boolean().
-cant_match(Pattern, {ann_type,_,[_Var,Type]}) ->
- cant_match(Pattern, Type);
-cant_match(Pattern, {paren_type,_,[Type]}) ->
- cant_match(Pattern, Type);
-cant_match(_Pattern, {atom,_,_Atom}) ->
- true;
-cant_match(_Pattern, {integer,_,_Int}) ->
- true;
-cant_match(_Pattern, {op,_,_Op,_Arg}) ->
- true;
-cant_match(_Pattern, {op,_,_Op,_Arg1,_Arg2}) ->
- true;
-cant_match(Pattern, {type,Anno,mfa,[]}) ->
- MFA_Ts = [{type,Anno,atom,[]}, {type,Anno,atom,[]}, {type,Anno,arity,[]}],
- cant_match(Pattern, {type,Anno,tuple,MFA_Ts});
-cant_match(Pattern, {type,_,union,Choices}) ->
- lists:all(fun(C) -> cant_match(Pattern,C) end, Choices);
-cant_match(_Pattern, {type,_,tuple,any}) ->
- false;
-cant_match(Pattern, {type,_,tuple,Fields}) ->
- tuple_size(Pattern) =/= length(Fields) orelse
- try match(tuple_to_list(Pattern), Fields, none, true) of
- _ -> false
- catch
- throw:no_match -> true
- end;
-cant_match(_Pattern, {type,_,Name,_Args}) ->
- ordsets:is_element(Name, ?NON_TUPLE_TYPES);
-cant_match(_Pattern, _Type) ->
- false.
-
--spec cant_have_head(abs_type()) -> boolean().
-cant_have_head({ann_type,_,[_Var,Type]}) ->
- cant_have_head(Type);
-cant_have_head({paren_type,_,[Type]}) ->
- cant_have_head(Type);
-cant_have_head({atom,_,_Atom}) ->
- true;
-cant_have_head({integer,_,_Int}) ->
- true;
-cant_have_head({op,_,_Op,_Arg}) ->
- true;
-cant_have_head({op,_,_Op,_Arg1,_Arg2}) ->
- true;
-cant_have_head({type,_,union,Choices}) ->
- lists:all(fun cant_have_head/1, Choices);
-cant_have_head({type,_,Name,_Args}) ->
- ordsets:is_element(Name, ?NO_HEAD_TYPES);
-cant_have_head(_Type) ->
- false.
-
-%% Only covers atoms, integers and tuples, i.e. those that can be specified
-%% through singleton types.
--spec term_to_singleton_type(atom() | integer()
- | loose_tuple(atom() | integer())) -> abs_type().
-term_to_singleton_type(Atom) when is_atom(Atom) ->
- {atom,?anno(0),Atom};
-term_to_singleton_type(Int) when is_integer(Int), Int >= 0 ->
- {integer,?anno(0),Int};
-term_to_singleton_type(Int) when is_integer(Int), Int < 0 ->
- A = ?anno(0),
- {op,A,'-',{integer,A,-Int}};
-term_to_singleton_type(Tuple) when is_tuple(Tuple) ->
- Fields = tuple_to_list(Tuple),
- {type,?anno(0),tuple,[term_to_singleton_type(F) || F <- Fields]}.
-
-
-%%------------------------------------------------------------------------------
-%% Instance testing functions
-%%------------------------------------------------------------------------------
-
-%% CAUTION: this must be sorted
--define(EQUIV_TYPES,
- [{arity, {type,0,range,[{integer,0,0},{integer,0,255}]}},
- {bool, {type,0,boolean,[]}},
- {byte, {type,0,range,[{integer,0,0},{integer,0,255}]}},
- {char, {type,0,range,[{integer,0,0},{integer,0,16#10ffff}]}},
- {function, {type,0,'fun',[]}},
- {identifier, {type,0,union,[{type,0,pid,[]},{type,0,port,[]},
- {type,0,reference,[]}]}},
- {iodata, {type,0,union,[{type,0,binary,[]},{type,0,iolist,[]}]}},
- {iolist, {type,0,maybe_improper_list,
- [{type,0,union,[{type,0,byte,[]},{type,0,binary,[]},
- {type,0,iolist,[]}]},
- {type,0,binary,[]}]}},
- {list, {type,0,list,[{type,0,any,[]}]}},
- {maybe_improper_list, {type,0,maybe_improper_list,[{type,0,any,[]},
- {type,0,any,[]}]}},
- {mfa, {type,0,tuple,[{type,0,atom,[]},{type,0,atom,[]},
- {type,0,arity,[]}]}},
- {node, {type,0,atom,[]}},
- {nonempty_list, {type,0,nonempty_list,[{type,0,any,[]}]}},
- {nonempty_maybe_improper_list, {type,0,nonempty_maybe_improper_list,
- [{type,0,any,[]},{type,0,any,[]}]}},
- {nonempty_string, {type,0,nonempty_list,[{type,0,char,[]}]}},
- {string, {type,0,list,[{type,0,char,[]}]}},
- {term, {type,0,any,[]}},
- {timeout, {type,0,union,[{atom,0,infinity},
- {type,0,non_neg_integer,[]}]}}]).
-
-%% @private
-%% TODO: Most of these functions accept an extended form of abs_type(), namely
-%% the addition of a custom wrapper: {'from_mod',mod_name(),...}
--spec is_instance(term(), mod_name(), abs_type()) -> boolean().
-is_instance(X, Mod, TypeForm) ->
- is_instance(X, Mod, TypeForm, []).
-
--spec is_instance(term(), mod_name(), abs_type(), imm_stack()) -> boolean().
-is_instance(X, _Mod, {from_mod,OrigMod,Type}, Stack) ->
- is_instance(X, OrigMod, Type, Stack);
-is_instance(_X, _Mod, {var,_,'_'}, _Stack) ->
- true;
-is_instance(_X, _Mod, {var,_,Name}, _Stack) ->
- %% All unconstrained spec vars have been replaced by 'any()' and we always
- %% replace the variables on the RHS of types before recursing into them.
- %% Provided that '-type' declarations contain no unbound variables, we
- %% don't expect to find any non-'_' variables while recursing.
- throw({'$typeserver',{unbound_var_in_type_declaration,Name}});
-is_instance(X, Mod, {ann_type,_,[_Var,Type]}, Stack) ->
- is_instance(X, Mod, Type, Stack);
-is_instance(X, Mod, {paren_type,_,[Type]}, Stack) ->
- is_instance(X, Mod, Type, Stack);
-is_instance(X, Mod, {remote_type,_,[{atom,_,RemMod},{atom,_,Name},ArgForms]},
- Stack) ->
- is_custom_instance(X, Mod, RemMod, Name, ArgForms, true, Stack);
-is_instance(SameAtom, _Mod, {atom,_,SameAtom}, _Stack) ->
- true;
-is_instance(SameInt, _Mod, {integer,_,SameInt}, _Stack) ->
- true;
-is_instance(X, _Mod, {op,_,_Op,_Arg} = Expr, _Stack) ->
- is_int_const(X, Expr);
-is_instance(X, _Mod, {op,_,_Op,_Arg1,_Arg2} = Expr, _Stack) ->
- is_int_const(X, Expr);
-is_instance(_X, _Mod, {type,_,any,[]}, _Stack) ->
- true;
-is_instance(X, _Mod, {type,_,atom,[]}, _Stack) ->
- is_atom(X);
-is_instance(X, _Mod, {type,_,binary,[]}, _Stack) ->
- is_binary(X);
-is_instance(X, _Mod, {type,_,binary,[BaseExpr,UnitExpr]}, _Stack) ->
- %% <<_:X,_:_*Y>> means "bitstrings of X + k*Y bits, k >= 0"
- case eval_int(BaseExpr) of
- {ok,Base} when Base >= 0 ->
- case eval_int(UnitExpr) of
- {ok,Unit} when Unit >= 0 ->
- case is_bitstring(X) of
- true ->
- BitSizeX = bit_size(X),
- case Unit =:= 0 of
- true ->
- BitSizeX =:= Base;
- false ->
- BitSizeX >= Base
- andalso
- (BitSizeX - Base) rem Unit =:= 0
- end;
- false -> false
- end;
- _ ->
- abs_expr_error(invalid_unit, UnitExpr)
- end;
- _ ->
- abs_expr_error(invalid_base, BaseExpr)
- end;
-is_instance(X, _Mod, {type,_,bitstring,[]}, _Stack) ->
- is_bitstring(X);
-is_instance(X, _Mod, {type,_,boolean,[]}, _Stack) ->
- is_boolean(X);
-is_instance(X, _Mod, {type,_,float,[]}, _Stack) ->
- is_float(X);
-is_instance(X, _Mod, {type,_,'fun',[]}, _Stack) ->
- is_function(X);
-%% TODO: how to check range type? random inputs? special case for 0-arity?
-is_instance(X, _Mod, {type,_,'fun',[{type,_,any,[]},_Range]}, _Stack) ->
- is_function(X);
-is_instance(X, _Mod, {type,_,'fun',[{type,_,product,Domain},_Range]}, _Stack) ->
- is_function(X, length(Domain));
-is_instance(X, _Mod, {type,_,integer,[]}, _Stack) ->
- is_integer(X);
-is_instance(X, Mod, {type,_,list,[Type]}, _Stack) ->
- list_test(X, Mod, Type, dummy, true, true, false);
-is_instance(X, Mod, {type,_,maybe_improper_list,[Cont,Term]}, _Stack) ->
- list_test(X, Mod, Cont, Term, true, true, true);
-is_instance(X, _Mod, {type,_,module,[]}, _Stack) ->
- is_atom(X) orelse
- is_tuple(X) andalso X =/= {} andalso is_atom(element(1,X));
-is_instance([], _Mod, {type,_,nil,[]}, _Stack) ->
- true;
-is_instance(X, _Mod, {type,_,neg_integer,[]}, _Stack) ->
- is_integer(X) andalso X < 0;
-is_instance(X, _Mod, {type,_,non_neg_integer,[]}, _Stack) ->
- is_integer(X) andalso X >= 0;
-is_instance(X, Mod, {type,_,nonempty_list,[Type]}, _Stack) ->
- list_test(X, Mod, Type, dummy, false, true, false);
-is_instance(X, Mod, {type,_,nonempty_improper_list,[Cont,Term]}, _Stack) ->
- list_test(X, Mod, Cont, Term, false, false, true);
-is_instance(X, Mod, {type,_,nonempty_maybe_improper_list,[Cont,Term]},
- _Stack) ->
- list_test(X, Mod, Cont, Term, false, true, true);
-is_instance(X, _Mod, {type,_,number,[]}, _Stack) ->
- is_number(X);
-is_instance(X, _Mod, {type,_,pid,[]}, _Stack) ->
- is_pid(X);
-is_instance(X, _Mod, {type,_,port,[]}, _Stack) ->
- is_port(X);
-is_instance(X, _Mod, {type,_,pos_integer,[]}, _Stack) ->
- is_integer(X) andalso X > 0;
-is_instance(_X, _Mod, {type,_,product,_Elements}, _Stack) ->
- throw({'$typeserver',{internal,product_in_is_instance}});
-is_instance(X, _Mod, {type,_,range,[LowExpr,HighExpr]}, _Stack) ->
- case {eval_int(LowExpr),eval_int(HighExpr)} of
- {{ok,Low},{ok,High}} when Low =< High ->
- X >= Low andalso X =< High;
- _ ->
- abs_expr_error(invalid_range, LowExpr, HighExpr)
- end;
-is_instance(X, Mod, {type,_,record,[{atom,_,Name} = NameForm | RawSubsts]},
- Stack) ->
- Substs = [{N,T} || {type,_,field_type,[{atom,_,N},T]} <- RawSubsts],
- SubstsDict = dict:from_list(Substs),
- case get_type_repr(Mod, {record,Name,0}, false) of
- {ok,{abs_record,OrigFields}} ->
- Fields = [case dict:find(FieldName, SubstsDict) of
- {ok,NewFieldType} -> NewFieldType;
- error -> OrigFieldType
- end
- || {FieldName,OrigFieldType} <- OrigFields],
- is_instance(X, Mod, {type,?anno(0),tuple,[NameForm|Fields]}, Stack);
- {error,Reason} ->
- throw({'$typeserver',Reason})
- end;
-is_instance(X, _Mod, {type,_,reference,[]}, _Stack) ->
- is_reference(X);
-is_instance(X, _Mod, {type,_,tuple,any}, _Stack) ->
- is_tuple(X);
-is_instance(X, Mod, {type,_,tuple,Fields}, _Stack) ->
- is_tuple(X) andalso tuple_test(tuple_to_list(X), Mod, Fields);
-is_instance(X, Mod, {type,_,union,Choices}, Stack) ->
- IsInstance = fun(Choice) -> is_instance(X,Mod,Choice,Stack) end,
- lists:any(IsInstance, Choices);
-is_instance(X, Mod, {T,_,Name,[]}, Stack) when ?IS_TYPE_TAG(T) ->
- case orddict:find(Name, ?EQUIV_TYPES) of
- {ok,EquivType} ->
- is_instance(X, Mod, EquivType, Stack);
- error ->
- is_maybe_hard_adt(X, Mod, Name, [], Stack)
- end;
-is_instance(X, Mod, {T,_,Name,ArgForms}, Stack) when ?IS_TYPE_TAG(T) ->
- is_maybe_hard_adt(X, Mod, Name, ArgForms, Stack);
-is_instance(_X, _Mod, _Type, _Stack) ->
- false.
-
--spec is_int_const(term(), abs_expr()) -> boolean().
-is_int_const(X, Expr) ->
- case eval_int(Expr) of
- {ok,Int} ->
- X =:= Int;
- error ->
- abs_expr_error(invalid_int_const, Expr)
- end.
-
-%% TODO: We implicitly add the '| []' at the termination of maybe_improper_list.
-%% TODO: We ignore a '[]' termination in improper_list.
--spec list_test(term(), mod_name(), abs_type(), 'dummy' | abs_type(), boolean(),
- boolean(), boolean()) -> boolean().
-list_test(X, Mod, Content, Termination, CanEmpty, CanProper, CanImproper) ->
- is_list(X) andalso
- list_rec(X, Mod, Content, Termination, CanEmpty, CanProper, CanImproper).
-
--spec list_rec(term(), mod_name(), abs_type(), 'dummy' | abs_type(), boolean(),
- boolean(), boolean()) -> boolean().
-list_rec([], _Mod, _Content, _Termination, CanEmpty, CanProper, _CanImproper) ->
- CanEmpty andalso CanProper;
-list_rec([X | Rest], Mod, Content, Termination, _CanEmpty, CanProper,
- CanImproper) ->
- is_instance(X, Mod, Content, []) andalso
- list_rec(Rest, Mod, Content, Termination, true, CanProper, CanImproper);
-list_rec(X, Mod, _Content, Termination, _CanEmpty, _CanProper, CanImproper) ->
- CanImproper andalso is_instance(X, Mod, Termination, []).
-
--spec tuple_test([term()], mod_name(), [abs_type()]) -> boolean().
-tuple_test([], _Mod, []) ->
- true;
-tuple_test([X | XTail], Mod, [T | TTail]) ->
- is_instance(X, Mod, T, []) andalso tuple_test(XTail, Mod, TTail);
-tuple_test(_, _Mod, _) ->
- false.
-
--spec is_maybe_hard_adt(term(), mod_name(), type_name(), [abs_type()],
- imm_stack()) -> boolean().
-is_maybe_hard_adt(X, Mod, Name, ArgForms, Stack) ->
- case orddict:find({Name,length(ArgForms)}, ?HARD_ADTS) of
- {ok,ADTMod} ->
- is_custom_instance(X, Mod, ADTMod, Name, ArgForms, true, Stack);
- error ->
- is_custom_instance(X, Mod, Mod, Name, ArgForms, false, Stack)
- end.
-
--spec is_custom_instance(term(), mod_name(), mod_name(), type_name(),
- [abs_type()], boolean(), imm_stack()) -> boolean().
-is_custom_instance(X, Mod, RemMod, Name, RawArgForms, IsRemote, Stack) ->
- ArgForms = case Mod =/= RemMod of
- true -> [{from_mod,Mod,A} || A <- RawArgForms];
- false -> RawArgForms
- end,
- Arity = length(ArgForms),
- FullTypeRef = {RemMod,Name,Arity},
- case lists:member(FullTypeRef, Stack) of
- true ->
- throw({'$typeserver',{self_reference,FullTypeRef}});
- false ->
- TypeRef = {type,Name,Arity},
- AbsType = get_abs_type(RemMod, TypeRef, ArgForms, IsRemote),
- is_instance(X, RemMod, AbsType, [FullTypeRef|Stack])
- end.
-
--spec get_abs_type(mod_name(), type_ref(), [abs_type()], boolean()) ->
- abs_type().
-get_abs_type(RemMod, TypeRef, ArgForms, IsRemote) ->
- case get_type_repr(RemMod, TypeRef, IsRemote) of
- {ok,TypeRepr} ->
- {FinalAbsType,SymbInfo,VarNames} =
- case TypeRepr of
- {cached,_FinType,FAT,SI} -> {FAT,SI,[]};
- {abs_type,FAT,VN,SI} -> {FAT,SI,VN}
- end,
- AbsType =
- case SymbInfo of
- not_symb -> FinalAbsType;
- {orig_abs,OrigAbsType} -> OrigAbsType
- end,
- VarSubstsDict = dict:from_list(lists:zip(VarNames,ArgForms)),
- update_vars(AbsType, VarSubstsDict, false);
- {error,Reason} ->
- throw({'$typeserver',Reason})
- end.
-
--spec abs_expr_error(atom(), abs_expr()) -> no_return().
-abs_expr_error(ImmReason, Expr) ->
- {error,Reason} = expr_error(ImmReason, Expr),
- throw({'$typeserver',Reason}).
-
--spec abs_expr_error(atom(), abs_expr(), abs_expr()) -> no_return().
-abs_expr_error(ImmReason, Expr1, Expr2) ->
- {error,Reason} = expr_error(ImmReason, Expr1, Expr2),
- throw({'$typeserver',Reason}).
-
-
-%%------------------------------------------------------------------------------
-%% Type translation functions
-%%------------------------------------------------------------------------------
-
--spec convert(mod_name(), abs_type(), state()) ->
- rich_result2(fin_type(),state()).
-convert(Mod, TypeForm, State) ->
- case convert(Mod, TypeForm, State, [], dict:new()) of
- {ok,{simple,Type},NewState} ->
- {ok, Type, NewState};
- {ok,{rec,_RecFun,_RecArgs},_NewState} ->
- {error, {internal,rec_returned_to_toplevel}};
- {error,_Reason} = Error ->
- Error
- end.
-
--spec convert(mod_name(), abs_type(), state(), stack(), var_dict()) ->
- rich_result2(ret_type(),state()).
-convert(Mod, {paren_type,_,[Type]}, State, Stack, VarDict) ->
- convert(Mod, Type, State, Stack, VarDict);
-convert(Mod, {ann_type,_,[_Var,Type]}, State, Stack, VarDict) ->
- convert(Mod, Type, State, Stack, VarDict);
-convert(_Mod, {var,_,'_'}, State, _Stack, _VarDict) ->
- {ok, {simple,proper_types:any()}, State};
-convert(_Mod, {var,_,VarName}, State, _Stack, VarDict) ->
- case dict:find(VarName, VarDict) of
- %% TODO: do we need to check if we are at toplevel of a recursive?
- {ok,RetType} -> {ok, RetType, State};
- error -> {error, {unbound_var,VarName}}
- end;
-convert(Mod, {remote_type,_,[{atom,_,RemMod},{atom,_,Name},ArgForms]}, State,
- Stack, VarDict) ->
- case prepare_for_remote(RemMod, Name, length(ArgForms), State) of
- {ok,NewState} ->
- convert_custom(Mod,RemMod,Name,ArgForms,NewState,Stack,VarDict);
- {error,_Reason} = Error ->
- Error
- end;
-convert(_Mod, {atom,_,Atom}, State, _Stack, _VarDict) ->
- {ok, {simple,proper_types:exactly(Atom)}, State};
-convert(_Mod, {integer,_,_Int} = IntExpr, State, _Stack, _VarDict) ->
- convert_integer(IntExpr, State);
-convert(_Mod, {op,_,_Op,_Arg} = OpExpr, State, _Stack, _VarDict) ->
- convert_integer(OpExpr, State);
-convert(_Mod, {op,_,_Op,_Arg1,_Arg2} = OpExpr, State, _Stack, _VarDict) ->
- convert_integer(OpExpr, State);
-convert(_Mod, {type,_,binary,[BaseExpr,UnitExpr]}, State, _Stack, _VarDict) ->
- %% <<_:X,_:_*Y>> means "bitstrings of X + k*Y bits, k >= 0"
- case eval_int(BaseExpr) of
- {ok,0} ->
- case eval_int(UnitExpr) of
- {ok,0} -> {ok, {simple,proper_types:exactly(<<>>)}, State};
- {ok,1} -> {ok, {simple,proper_types:bitstring()}, State};
- {ok,8} -> {ok, {simple,proper_types:binary()}, State};
- {ok,N} when N > 0 ->
- Gen = ?LET(L, proper_types:list(proper_types:bitstring(N)),
- concat_bitstrings(L)),
- {ok, {simple,Gen}, State};
- _ -> expr_error(invalid_unit, UnitExpr)
- end;
- {ok,Base} when Base > 0 ->
- Head = proper_types:bitstring(Base),
- case eval_int(UnitExpr) of
- {ok,0} -> {ok, {simple,Head}, State};
- {ok,1} ->
- Tail = proper_types:bitstring(),
- {ok, {simple,concat_binary_gens(Head, Tail)}, State};
- {ok,8} ->
- Tail = proper_types:binary(),
- {ok, {simple,concat_binary_gens(Head, Tail)}, State};
- {ok,N} when N > 0 ->
- Tail =
- ?LET(L, proper_types:list(proper_types:bitstring(N)),
- concat_bitstrings(L)),
- {ok, {simple,concat_binary_gens(Head, Tail)}, State};
- _ -> expr_error(invalid_unit, UnitExpr)
- end;
- _ ->
- expr_error(invalid_base, BaseExpr)
- end;
-convert(_Mod, {type,_,range,[LowExpr,HighExpr]}, State, _Stack, _VarDict) ->
- case {eval_int(LowExpr),eval_int(HighExpr)} of
- {{ok,Low},{ok,High}} when Low =< High ->
- {ok, {simple,proper_types:integer(Low,High)}, State};
- _ ->
- expr_error(invalid_range, LowExpr, HighExpr)
- end;
-convert(_Mod, {type,_,nil,[]}, State, _Stack, _VarDict) ->
- {ok, {simple,proper_types:exactly([])}, State};
-convert(Mod, {type,_,list,[ElemForm]}, State, Stack, VarDict) ->
- convert_list(Mod, false, ElemForm, State, Stack, VarDict);
-convert(Mod, {type,_,nonempty_list,[ElemForm]}, State, Stack, VarDict) ->
- convert_list(Mod, true, ElemForm, State, Stack, VarDict);
-convert(_Mod, {type,_,nonempty_list,[]}, State, _Stack, _VarDict) ->
- {ok, {simple,proper_types:non_empty(proper_types:list())}, State};
-convert(_Mod, {type,_,nonempty_string,[]}, State, _Stack, _VarDict) ->
- {ok, {simple,proper_types:non_empty(proper_types:string())}, State};
-convert(_Mod, {type,_,tuple,any}, State, _Stack, _VarDict) ->
- {ok, {simple,proper_types:tuple()}, State};
-convert(Mod, {type,_,tuple,ElemForms}, State, Stack, VarDict) ->
- convert_tuple(Mod, ElemForms, false, State, Stack, VarDict);
-convert(Mod, {type,_,'$fixed_list',ElemForms}, State, Stack, VarDict) ->
- convert_tuple(Mod, ElemForms, true, State, Stack, VarDict);
-convert(Mod, {type,_,record,[{atom,_,Name}|FieldForms]}, State, Stack,
- VarDict) ->
- convert_record(Mod, Name, FieldForms, State, Stack, VarDict);
-convert(Mod, {type,_,union,ChoiceForms}, State, Stack, VarDict) ->
- convert_union(Mod, ChoiceForms, State, Stack, VarDict);
-convert(Mod, {type,_,'fun',[{type,_,product,Domain},Range]}, State, Stack,
- VarDict) ->
- convert_fun(Mod, length(Domain), Range, State, Stack, VarDict);
-%% TODO: These types should be replaced with accurate types.
-%% TODO: Add support for nonempty_improper_list/2.
-convert(Mod, {type,Anno,maybe_improper_list,[]}, State, Stack, VarDict) ->
- convert(Mod, {type,Anno,list,[]}, State, Stack, VarDict);
-convert(Mod, {type,A,maybe_improper_list,[Cont,_Ter]}, State, Stack, VarDict) ->
- convert(Mod, {type,A,list,[Cont]}, State, Stack, VarDict);
-convert(Mod, {type,A,nonempty_maybe_improper_list,[]}, State, Stack, VarDict) ->
- convert(Mod, {type,A,nonempty_list,[]}, State, Stack, VarDict);
-convert(Mod, {type,A,nonempty_maybe_improper_list,[Cont,_Term]}, State, Stack,
- VarDict) ->
- convert(Mod, {type,A,nonempty_list,[Cont]}, State, Stack, VarDict);
-convert(Mod, {type,A,iodata,[]}, State, Stack, VarDict) ->
- RealType = {type,A,union,[{type,A,binary,[]},{type,A,iolist,[]}]},
- convert(Mod, RealType, State, Stack, VarDict);
-convert(Mod, {T,_,Name,[]}, State, Stack, VarDict) when ?IS_TYPE_TAG(T) ->
- case ordsets:is_element(Name, ?STD_TYPES_0) of
- true ->
- {ok, {simple,proper_types:Name()}, State};
- false ->
- convert_maybe_hard_adt(Mod, Name, [], State, Stack, VarDict)
- end;
-convert(Mod, {T,_,Name,ArgForms}, State, Stack, VarDict) when ?IS_TYPE_TAG(T) ->
- convert_maybe_hard_adt(Mod, Name, ArgForms, State, Stack, VarDict);
-convert(_Mod, TypeForm, _State, _Stack, _VarDict) ->
- {error, {unsupported_type,TypeForm}}.
-
--spec concat_bitstrings([bitstring()]) -> bitstring().
-concat_bitstrings(BitStrings) ->
- concat_bitstrings_tr(BitStrings, <<>>).
-
--spec concat_bitstrings_tr([bitstring()], bitstring()) -> bitstring().
-concat_bitstrings_tr([], Acc) ->
- Acc;
-concat_bitstrings_tr([BitString | Rest], Acc) ->
- concat_bitstrings_tr(Rest, <<Acc/bits,BitString/bits>>).
-
--spec concat_binary_gens(fin_type(), fin_type()) -> fin_type().
-concat_binary_gens(HeadType, TailType) ->
- ?LET({H,T}, {HeadType,TailType}, <<H/bits,T/bits>>).
-
--spec convert_fun(mod_name(), arity(), abs_type(), state(), stack(),
- var_dict()) -> rich_result2(ret_type(),state()).
-convert_fun(Mod, Arity, Range, State, Stack, VarDict) ->
- case convert(Mod, Range, State, ['fun' | Stack], VarDict) of
- {ok,{simple,RangeType},NewState} ->
- {ok, {simple,proper_types:function(Arity,RangeType)}, NewState};
- {ok,{rec,RecFun,RecArgs},NewState} ->
- case at_toplevel(RecArgs, Stack) of
- true -> base_case_error(Stack);
- false -> convert_rec_fun(Arity, RecFun, RecArgs, NewState)
- end;
- {error,_Reason} = Error ->
- Error
- end.
-
--spec convert_rec_fun(arity(), rec_fun(), rec_args(), state()) ->
- {'ok',ret_type(),state()}.
-convert_rec_fun(Arity, RecFun, RecArgs, State) ->
- %% We bind the generated value by size.
- NewRecFun =
- fun(GenFuns,Size) ->
- proper_types:function(Arity, RecFun(GenFuns,Size))
- end,
- NewRecArgs = clean_rec_args(RecArgs),
- {ok, {rec,NewRecFun,NewRecArgs}, State}.
-
--spec convert_list(mod_name(), boolean(), abs_type(), state(), stack(),
- var_dict()) -> rich_result2(ret_type(),state()).
-convert_list(Mod, NonEmpty, ElemForm, State, Stack, VarDict) ->
- case convert(Mod, ElemForm, State, [list | Stack], VarDict) of
- {ok,{simple,ElemType},NewState} ->
- InnerType = proper_types:list(ElemType),
- FinType = case NonEmpty of
- true -> proper_types:non_empty(InnerType);
- false -> InnerType
- end,
- {ok, {simple,FinType}, NewState};
- {ok,{rec,RecFun,RecArgs},NewState} ->
- case {at_toplevel(RecArgs,Stack), NonEmpty} of
- {true,true} ->
- base_case_error(Stack);
- {true,false} ->
- NewRecFun =
- fun(GenFuns,Size) ->
- ElemGen = fun(S) -> ?LAZY(RecFun(GenFuns,S)) end,
- proper_types:distlist(Size, ElemGen, false)
- end,
- NewRecArgs = clean_rec_args(RecArgs),
- {ok, {rec,NewRecFun,NewRecArgs}, NewState};
- {false,_} ->
- {NewRecFun,NewRecArgs} =
- convert_rec_list(RecFun, RecArgs, NonEmpty),
- {ok, {rec,NewRecFun,NewRecArgs}, NewState}
- end;
- {error,_Reason} = Error ->
- Error
- end.
-
--spec convert_rec_list(rec_fun(), rec_args(), boolean()) ->
- {rec_fun(),rec_args()}.
-convert_rec_list(RecFun, [{true,FullTypeRef}] = RecArgs, NonEmpty) ->
- {NewRecFun,_NormalRecArgs} =
- convert_normal_rec_list(RecFun, RecArgs, NonEmpty),
- AltRecFun =
- fun([InstListGen],Size) ->
- InstTypesList =
- proper_types:get_prop(internal_types, InstListGen(Size)),
- proper_types:fixed_list([RecFun([fun(_Size) -> I end],0)
- || I <- InstTypesList])
- end,
- NewRecArgs = [{{list,NonEmpty,AltRecFun},FullTypeRef}],
- {NewRecFun, NewRecArgs};
-convert_rec_list(RecFun, RecArgs, NonEmpty) ->
- convert_normal_rec_list(RecFun, RecArgs, NonEmpty).
-
--spec convert_normal_rec_list(rec_fun(), rec_args(), boolean()) ->
- {rec_fun(),rec_args()}.
-convert_normal_rec_list(RecFun, RecArgs, NonEmpty) ->
- NewRecFun = fun(GenFuns,Size) ->
- ElemGen = fun(S) -> RecFun(GenFuns, S) end,
- proper_types:distlist(Size, ElemGen, NonEmpty)
- end,
- NewRecArgs = clean_rec_args(RecArgs),
- {NewRecFun, NewRecArgs}.
-
--spec convert_tuple(mod_name(), [abs_type()], boolean(), state(), stack(),
- var_dict()) -> rich_result2(ret_type(),state()).
-convert_tuple(Mod, ElemForms, ToList, State, Stack, VarDict) ->
- case process_list(Mod, ElemForms, State, [tuple | Stack], VarDict) of
- {ok,RetTypes,NewState} ->
- case combine_ret_types(RetTypes, {tuple,ToList}) of
- {simple,_FinType} = RetType ->
- {ok, RetType, NewState};
- {rec,_RecFun,RecArgs} = RetType ->
- case at_toplevel(RecArgs, Stack) of
- true -> base_case_error(Stack);
- false -> {ok, RetType, NewState}
- end
- end;
- {error,_Reason} = Error ->
- Error
- end.
-
--spec convert_union(mod_name(), [abs_type()], state(), stack(), var_dict()) ->
- rich_result2(ret_type(),state()).
-convert_union(Mod, ChoiceForms, State, Stack, VarDict) ->
- case process_list(Mod, ChoiceForms, State, [union | Stack], VarDict) of
- {ok,RawChoices,NewState} ->
- ProcessChoice = fun(T,A) -> process_choice(T,A,Stack) end,
- {RevSelfRecs,RevNonSelfRecs,RevNonRecs} =
- lists:foldl(ProcessChoice, {[],[],[]}, RawChoices),
- case {lists:reverse(RevSelfRecs),lists:reverse(RevNonSelfRecs),
- lists:reverse(RevNonRecs)} of
- {_SelfRecs,[],[]} ->
- base_case_error(Stack);
- {[],NonSelfRecs,NonRecs} ->
- {ok, combine_ret_types(NonRecs ++ NonSelfRecs, union),
- NewState};
- {SelfRecs,NonSelfRecs,NonRecs} ->
- {BCaseRecFun,BCaseRecArgs} =
- case combine_ret_types(NonRecs ++ NonSelfRecs, union) of
- {simple,BCaseType} ->
- {fun([],_Size) -> BCaseType end,[]};
- {rec,BCRecFun,BCRecArgs} ->
- {BCRecFun,BCRecArgs}
- end,
- NumBCaseGens = length(BCaseRecArgs),
- [ParentRef | _Upper] = Stack,
- FallbackRecFun = fun([SelfGen],_Size) -> SelfGen(0) end,
- FallbackRecArgs = [{false,ParentRef}],
- FallbackRetType = {rec,FallbackRecFun,FallbackRecArgs},
- {rec,RCaseRecFun,RCaseRecArgs} =
- combine_ret_types([FallbackRetType] ++ SelfRecs
- ++ NonSelfRecs, wunion),
- NewRecFun =
- fun(AllGens,Size) ->
- {BCaseGens,RCaseGens} =
- lists:split(NumBCaseGens, AllGens),
- case Size of
- 0 -> BCaseRecFun(BCaseGens,0);
- _ -> RCaseRecFun(RCaseGens,Size)
- end
- end,
- NewRecArgs = BCaseRecArgs ++ RCaseRecArgs,
- {ok, {rec,NewRecFun,NewRecArgs}, NewState}
- end;
- {error,_Reason} = Error ->
- Error
- end.
-
--spec process_choice(ret_type(), {[ret_type()],[ret_type()],[ret_type()]},
- stack()) -> {[ret_type()],[ret_type()],[ret_type()]}.
-process_choice({simple,_} = RetType, {SelfRecs,NonSelfRecs,NonRecs}, _Stack) ->
- {SelfRecs, NonSelfRecs, [RetType | NonRecs]};
-process_choice({rec,RecFun,RecArgs}, {SelfRecs,NonSelfRecs,NonRecs}, Stack) ->
- case at_toplevel(RecArgs, Stack) of
- true ->
- case partition_by_toplevel(RecArgs, Stack, true) of
- {[],[],_,_} ->
- NewRecArgs = clean_rec_args(RecArgs),
- {[{rec,RecFun,NewRecArgs} | SelfRecs], NonSelfRecs,
- NonRecs};
- {SelfRecArgs,SelfPos,OtherRecArgs,_OtherPos} ->
- NumInstances = length(SelfRecArgs),
- IsListInst = fun({true,_FTRef}) -> false
- ; ({{list,_NE,_AltRecFun},_FTRef}) -> true
- end,
- NewRecFun =
- case proper_arith:filter(IsListInst,SelfRecArgs) of
- {[],[]} ->
- no_list_inst_rec_fun(RecFun,NumInstances,
- SelfPos);
- {[{{list,NonEmpty,AltRecFun},_}],[ListInstPos]} ->
- list_inst_rec_fun(AltRecFun,NumInstances,
- SelfPos,NonEmpty,ListInstPos)
- end,
- [{_B,SelfRef} | _] = SelfRecArgs,
- NewRecArgs =
- [{false,SelfRef} | clean_rec_args(OtherRecArgs)],
- {[{rec,NewRecFun,NewRecArgs} | SelfRecs], NonSelfRecs,
- NonRecs}
- end;
- false ->
- NewRecArgs = clean_rec_args(RecArgs),
- {SelfRecs, [{rec,RecFun,NewRecArgs} | NonSelfRecs], NonRecs}
- end.
-
--spec no_list_inst_rec_fun(rec_fun(), pos_integer(), [position()]) -> rec_fun().
-no_list_inst_rec_fun(RecFun, NumInstances, SelfPos) ->
- fun([SelfGen|OtherGens], Size) ->
- ?LETSHRINK(
- Instances,
- %% Size distribution will be a little off if both normal and
- %% instance-accepting generators are present.
- lists:duplicate(NumInstances, SelfGen(Size div NumInstances)),
- begin
- InstGens = [fun(_Size) -> proper_types:exactly(I) end
- || I <- Instances],
- AllGens = proper_arith:insert(InstGens, SelfPos, OtherGens),
- RecFun(AllGens, Size)
- end)
- end.
-
--spec list_inst_rec_fun(rec_fun(), pos_integer(), [position()], boolean(),
- position()) -> rec_fun().
-list_inst_rec_fun(AltRecFun, NumInstances, SelfPos, NonEmpty, ListInstPos) ->
- fun([SelfGen|OtherGens], Size) ->
- ?LETSHRINK(
- AllInsts,
- lists:duplicate(NumInstances - 1, SelfGen(Size div NumInstances))
- ++ proper_types:distlist(Size div NumInstances, SelfGen, NonEmpty),
- begin
- {Instances,InstList} = lists:split(NumInstances - 1, AllInsts),
- InstGens = [fun(_Size) -> proper_types:exactly(I) end
- || I <- Instances],
- InstTypesList = [proper_types:exactly(I) || I <- InstList],
- InstListGen =
- fun(_Size) -> proper_types:fixed_list(InstTypesList) end,
- AllInstGens = proper_arith:list_insert(ListInstPos, InstListGen,
- InstGens),
- AllGens = proper_arith:insert(AllInstGens, SelfPos, OtherGens),
- AltRecFun(AllGens, Size)
- end)
- end.
-
--spec convert_maybe_hard_adt(mod_name(), type_name(), [abs_type()], state(),
- stack(), var_dict()) ->
- rich_result2(ret_type(),state()).
-convert_maybe_hard_adt(Mod, Name, ArgForms, State, Stack, VarDict) ->
- Arity = length(ArgForms),
- case orddict:find({Name,Arity}, ?HARD_ADTS) of
- {ok,Mod} ->
- convert_custom(Mod, Mod, Name, ArgForms, State, Stack, VarDict);
- {ok,ADTMod} ->
- A = ?anno(0),
- ADT = {remote_type,A,[{atom,A,ADTMod},{atom,A,Name},ArgForms]},
- convert(Mod, ADT, State, Stack, VarDict);
- error ->
- convert_custom(Mod, Mod, Name, ArgForms, State, Stack, VarDict)
- end.
-
--spec convert_custom(mod_name(), mod_name(), type_name(), [abs_type()], state(),
- stack(), var_dict()) -> rich_result2(ret_type(),state()).
-convert_custom(Mod, RemMod, Name, ArgForms, State, Stack, VarDict) ->
- case process_list(Mod, ArgForms, State, Stack, VarDict) of
- {ok,Args,NewState} ->
- Arity = length(Args),
- TypeRef = {type,Name,Arity},
- FullTypeRef = {RemMod,type,Name,Args},
- convert_type(TypeRef, FullTypeRef, NewState, Stack);
- {error,_Reason} = Error ->
- Error
- end.
-
--spec convert_record(mod_name(), type_name(), [abs_type()], state(), stack(),
- var_dict()) -> rich_result2(ret_type(),state()).
-convert_record(Mod, Name, RawSubsts, State, Stack, VarDict) ->
- Substs = [{N,T} || {type,_,field_type,[{atom,_,N},T]} <- RawSubsts],
- {SubstFields,SubstTypeForms} = lists:unzip(Substs),
- case process_list(Mod, SubstTypeForms, State, Stack, VarDict) of
- {ok,SubstTypes,NewState} ->
- SubstsDict = dict:from_list(lists:zip(SubstFields, SubstTypes)),
- TypeRef = {record,Name,0},
- FullTypeRef = {Mod,record,Name,SubstsDict},
- convert_type(TypeRef, FullTypeRef, NewState, Stack);
- {error,_Reason} = Error ->
- Error
- end.
-
--spec convert_type(type_ref(), full_type_ref(), state(), stack()) ->
- rich_result2(ret_type(),state()).
-convert_type(TypeRef, {Mod,_Kind,_Name,_Spec} = FullTypeRef, State, Stack) ->
- case stack_position(FullTypeRef, Stack) of
- none ->
- case get_type_repr(Mod, TypeRef, false, State) of
- {ok,TypeRepr,NewState} ->
- convert_new_type(TypeRef, FullTypeRef, TypeRepr, NewState,
- Stack);
- {error,_Reason} = Error ->
- Error
- end;
- 1 ->
- base_case_error(Stack);
- _Pos ->
- {ok, {rec,fun([Gen],Size) -> Gen(Size) end,[{true,FullTypeRef}]},
- State}
- end.
-
--spec convert_new_type(type_ref(), full_type_ref(), type_repr(), state(),
- stack()) -> rich_result2(ret_type(),state()).
-convert_new_type(_TypeRef, {_Mod,type,_Name,[]},
- {cached,FinType,_TypeForm,_SymbInfo}, State, _Stack) ->
- {ok, {simple,FinType}, State};
-convert_new_type(TypeRef, {Mod,type,_Name,Args} = FullTypeRef,
- {abs_type,TypeForm,Vars,SymbInfo}, State, Stack) ->
- VarDict = dict:from_list(lists:zip(Vars, Args)),
- case convert(Mod, TypeForm, State, [FullTypeRef | Stack], VarDict) of
- {ok, {simple,ImmFinType}, NewState} ->
- FinType = case SymbInfo of
- not_symb ->
- ImmFinType;
- {orig_abs,_OrigAbsType} ->
- proper_symb:internal_well_defined(ImmFinType)
- end,
- FinalState = case Vars of
- [] -> cache_type(Mod, TypeRef, FinType, TypeForm,
- SymbInfo, NewState);
- _ -> NewState
- end,
- {ok, {simple,FinType}, FinalState};
- {ok, {rec,RecFun,RecArgs}, NewState} ->
- convert_maybe_rec(FullTypeRef, SymbInfo, RecFun, RecArgs, NewState,
- Stack);
- {error,_Reason} = Error ->
- Error
- end;
-convert_new_type(_TypeRef, {Mod,record,Name,SubstsDict} = FullTypeRef,
- {abs_record,OrigFields}, State, Stack) ->
- Fields = [case dict:find(FieldName, SubstsDict) of
- {ok,NewFieldType} -> NewFieldType;
- error -> OrigFieldType
- end
- || {FieldName,OrigFieldType} <- OrigFields],
- case convert_tuple(Mod, [{atom,0,Name} | Fields], false, State,
- [FullTypeRef | Stack], dict:new()) of
- {ok, {simple,_FinType}, _NewState} = Result ->
- Result;
- {ok, {rec,RecFun,RecArgs}, NewState} ->
- convert_maybe_rec(FullTypeRef, not_symb, RecFun, RecArgs, NewState,
- Stack);
- {error,_Reason} = Error ->
- Error
- end.
-
--spec cache_type(mod_name(), type_ref(), fin_type(), abs_type(), symb_info(),
- state()) -> state().
-cache_type(Mod, TypeRef, FinType, TypeForm, SymbInfo,
- #state{types = Types} = State) ->
- TypeRepr = {cached,FinType,TypeForm,SymbInfo},
- ModTypes = dict:fetch(Mod, Types),
- NewModTypes = dict:store(TypeRef, TypeRepr, ModTypes),
- NewTypes = dict:store(Mod, NewModTypes, Types),
- State#state{types = NewTypes}.
-
--spec convert_maybe_rec(full_type_ref(), symb_info(), rec_fun(), rec_args(),
- state(), stack()) -> rich_result2(ret_type(),state()).
-convert_maybe_rec(FullTypeRef, SymbInfo, RecFun, RecArgs, State, Stack) ->
- case at_toplevel(RecArgs, Stack) of
- true -> base_case_error(Stack);
- false -> safe_convert_maybe_rec(FullTypeRef, SymbInfo, RecFun, RecArgs,
- State)
- end.
-
--spec safe_convert_maybe_rec(full_type_ref(),symb_info(),rec_fun(),rec_args(),
- state()) -> rich_result2(ret_type(),state()).
-safe_convert_maybe_rec(FullTypeRef, SymbInfo, RecFun, RecArgs, State) ->
- case partition_rec_args(FullTypeRef, RecArgs, false) of
- {[],[],_,_} ->
- {ok, {rec,RecFun,RecArgs}, State};
- {MyRecArgs,MyPos,OtherRecArgs,_OtherPos} ->
- case lists:all(fun({B,_T}) -> B =:= false end, MyRecArgs) of
- true -> convert_rec_type(SymbInfo, RecFun, MyPos, OtherRecArgs,
- State);
- false -> {error, {internal,true_rec_arg_reached_type}}
- end
- end.
-
--spec convert_rec_type(symb_info(), rec_fun(), [position()], rec_args(),
- state()) -> {ok, ret_type(), state()}.
-convert_rec_type(SymbInfo, RecFun, MyPos, [], State) ->
- NumRecArgs = length(MyPos),
- M = fun(GenFun) ->
- fun(Size) ->
- GenFuns = lists:duplicate(NumRecArgs, GenFun),
- RecFun(GenFuns, erlang:max(0,Size - 1))
- end
- end,
- SizedGen = y(M),
- ImmFinType = ?SIZED(Size,SizedGen(Size + 1)),
- FinType = case SymbInfo of
- not_symb ->
- ImmFinType;
- {orig_abs,_OrigAbsType} ->
- proper_symb:internal_well_defined(ImmFinType)
- end,
- {ok, {simple,FinType}, State};
-convert_rec_type(_SymbInfo, RecFun, MyPos, OtherRecArgs, State) ->
- NumRecArgs = length(MyPos),
- NewRecFun =
- fun(OtherGens,TopSize) ->
- M = fun(GenFun) ->
- fun(Size) ->
- GenFuns = lists:duplicate(NumRecArgs, GenFun),
- AllGens =
- proper_arith:insert(GenFuns, MyPos, OtherGens),
- RecFun(AllGens, erlang:max(0,Size - 1))
- end
- end,
- (y(M))(TopSize)
- end,
- NewRecArgs = clean_rec_args(OtherRecArgs),
- {ok, {rec,NewRecFun,NewRecArgs}, State}.
-
-%% Y Combinator: Read more at http://bc.tech.coop/blog/070611.html.
--spec y(fun((fun((T) -> S)) -> fun((T) -> S))) -> fun((T) -> S).
-y(M) ->
- G = fun(F) ->
- M(fun(A) -> (F(F))(A) end)
- end,
- G(G).
-
--spec process_list(mod_name(), [abs_type() | ret_type()], state(), stack(),
- var_dict()) -> rich_result2([ret_type()],state()).
-process_list(Mod, RawTypes, State, Stack, VarDict) ->
- Process = fun({simple,_FinType} = Type, {ok,Types,State1}) ->
- {ok, [Type|Types], State1};
- ({rec,_RecFun,_RecArgs} = Type, {ok,Types,State1}) ->
- {ok, [Type|Types], State1};
- (TypeForm, {ok,Types,State1}) ->
- case convert(Mod, TypeForm, State1, Stack, VarDict) of
- {ok,Type,State2} -> {ok,[Type|Types],State2};
- {error,_} = Err -> Err
- end;
- (_RawType, {error,_} = Err) ->
- Err
- end,
- case lists:foldl(Process, {ok,[],State}, RawTypes) of
- {ok,RevTypes,NewState} ->
- {ok, lists:reverse(RevTypes), NewState};
- {error,_Reason} = Error ->
- Error
- end.
-
--spec convert_integer(abs_expr(), state()) -> rich_result2(ret_type(),state()).
-convert_integer(Expr, State) ->
- case eval_int(Expr) of
- {ok,Int} -> {ok, {simple,proper_types:exactly(Int)}, State};
- error -> expr_error(invalid_int_const, Expr)
- end.
-
--spec eval_int(abs_expr()) -> tagged_result(integer()).
-eval_int(Expr) ->
- NoBindings = erl_eval:new_bindings(),
- try erl_eval:expr(Expr, NoBindings) of
- {value,Value,_NewBindings} when is_integer(Value) ->
- {ok, Value};
- _ ->
- error
- catch
- error:_ ->
- error
- end.
-
--spec expr_error(atom(), abs_expr()) -> {'error',term()}.
-expr_error(Reason, Expr) ->
- {error, {Reason,lists:flatten(erl_pp:expr(Expr))}}.
-
--spec expr_error(atom(), abs_expr(), abs_expr()) -> {'error',term()}.
-expr_error(Reason, Expr1, Expr2) ->
- Str1 = lists:flatten(erl_pp:expr(Expr1)),
- Str2 = lists:flatten(erl_pp:expr(Expr2)),
- {error, {Reason,Str1,Str2}}.
-
--spec base_case_error(stack()) -> {'error',term()}.
-%% TODO: This might confuse, since it doesn't record the arguments to parametric
-%% types or the type subsitutions of a record.
-base_case_error([{Mod,type,Name,Args} | _Upper]) ->
- Arity = length(Args),
- {error, {no_base_case,{Mod,type,Name,Arity}}};
-base_case_error([{Mod,record,Name,_SubstsDict} | _Upper]) ->
- {error, {no_base_case,{Mod,record,Name}}}.
-
-
-%%------------------------------------------------------------------------------
-%% Helper datatypes handling functions
-%%------------------------------------------------------------------------------
-
--spec stack_position(full_type_ref(), stack()) -> 'none' | pos_integer().
-stack_position(FullTypeRef, Stack) ->
- SameType = fun(A) -> same_full_type_ref(A,FullTypeRef) end,
- case proper_arith:find_first(SameType, Stack) of
- {Pos,_} -> Pos;
- none -> none
- end.
-
--spec partition_by_toplevel(rec_args(), stack(), boolean()) ->
- {rec_args(),[position()],rec_args(),[position()]}.
-partition_by_toplevel(RecArgs, [], _OnlyInstanceAccepting) ->
- {[],[],RecArgs,lists:seq(1,length(RecArgs))};
-partition_by_toplevel(RecArgs, [_Parent | _Upper], _OnlyInstanceAccepting)
- when is_atom(_Parent) ->
- {[],[],RecArgs,lists:seq(1,length(RecArgs))};
-partition_by_toplevel(RecArgs, [Parent | _Upper], OnlyInstanceAccepting) ->
- partition_rec_args(Parent, RecArgs, OnlyInstanceAccepting).
-
--spec at_toplevel(rec_args(), stack()) -> boolean().
-at_toplevel(RecArgs, Stack) ->
- case partition_by_toplevel(RecArgs, Stack, false) of
- {[],[],_,_} -> false;
- _ -> true
- end.
-
--spec partition_rec_args(full_type_ref(), rec_args(), boolean()) ->
- {rec_args(),[position()],rec_args(),[position()]}.
-partition_rec_args(FullTypeRef, RecArgs, OnlyInstanceAccepting) ->
- SameType =
- case OnlyInstanceAccepting of
- true -> fun({false,_T}) -> false
- ; ({_B,T}) -> same_full_type_ref(T,FullTypeRef) end;
- false -> fun({_B,T}) -> same_full_type_ref(T,FullTypeRef) end
- end,
- proper_arith:partition(SameType, RecArgs).
-
-%% Tuples can be of 0 arity, unions of 1 and wunions at least of 2.
--spec combine_ret_types([ret_type()], {'tuple',boolean()} | 'union'
- | 'wunion') -> ret_type().
-combine_ret_types(RetTypes, EnclosingType) ->
- case lists:all(fun is_simple_ret_type/1, RetTypes) of
- true ->
- %% This should never happen for wunion.
- Combine = case EnclosingType of
- {tuple,false} -> fun proper_types:tuple/1;
- {tuple,true} -> fun proper_types:fixed_list/1;
- union -> fun proper_types:union/1
- end,
- FinTypes = [T || {simple,T} <- RetTypes],
- {simple, Combine(FinTypes)};
- false ->
- NumTypes = length(RetTypes),
- {RevRecFuns,RevRecArgsList,NumRecs} =
- lists:foldl(fun add_ret_type/2, {[],[],0}, RetTypes),
- RecFuns = lists:reverse(RevRecFuns),
- RecArgsList = lists:reverse(RevRecArgsList),
- RecArgLens = [length(RecArgs) || RecArgs <- RecArgsList],
- RecFunInfo = {NumTypes,NumRecs,RecArgLens,RecFuns},
- FlatRecArgs = lists:flatten(RecArgsList),
- {NewRecFun,NewRecArgs} =
- case EnclosingType of
- {tuple,ToList} ->
- {tuple_rec_fun(RecFunInfo,ToList),
- soft_clean_rec_args(FlatRecArgs,RecFunInfo,ToList)};
- union ->
- {union_rec_fun(RecFunInfo),clean_rec_args(FlatRecArgs)};
- wunion ->
- {wunion_rec_fun(RecFunInfo),
- clean_rec_args(FlatRecArgs)}
- end,
- {rec, NewRecFun, NewRecArgs}
- end.
-
--spec tuple_rec_fun(rec_fun_info(), boolean()) -> rec_fun().
-tuple_rec_fun({_NumTypes,NumRecs,RecArgLens,RecFuns}, ToList) ->
- Combine = case ToList of
- true -> fun proper_types:fixed_list/1;
- false -> fun proper_types:tuple/1
- end,
- fun(AllGFs,TopSize) ->
- Size = TopSize div NumRecs,
- GFsList = proper_arith:unflatten(AllGFs, RecArgLens),
- ArgsList = [[GenFuns,Size] || GenFuns <- GFsList],
- ZipFun = fun erlang:apply/2,
- Combine(lists:zipwith(ZipFun, RecFuns, ArgsList))
- end.
-
--spec union_rec_fun(rec_fun_info()) -> rec_fun().
-union_rec_fun({_NumTypes,_NumRecs,RecArgLens,RecFuns}) ->
- fun(AllGFs,Size) ->
- GFsList = proper_arith:unflatten(AllGFs, RecArgLens),
- ArgsList = [[GenFuns,Size] || GenFuns <- GFsList],
- ZipFun = fun(F,A) -> ?LAZY(apply(F,A)) end,
- proper_types:union(lists:zipwith(ZipFun, RecFuns, ArgsList))
- end.
-
--spec wunion_rec_fun(rec_fun_info()) -> rec_fun().
-wunion_rec_fun({NumTypes,_NumRecs,RecArgLens,RecFuns}) ->
- fun(AllGFs,Size) ->
- GFsList = proper_arith:unflatten(AllGFs, RecArgLens),
- ArgsList = [[GenFuns,Size] || GenFuns <- GFsList],
- ZipFun = fun(W,F,A) -> {W,?LAZY(apply(F,A))} end,
- RecWeight = erlang:max(1, Size div (NumTypes - 1)),
- Weights = [1 | lists:duplicate(NumTypes - 1, RecWeight)],
- WeightedChoices = lists:zipwith3(ZipFun, Weights, RecFuns, ArgsList),
- proper_types:wunion(WeightedChoices)
- end.
-
--spec add_ret_type(ret_type(), {[rec_fun()],[rec_args()],non_neg_integer()}) ->
- {[rec_fun()],[rec_args()],non_neg_integer()}.
-add_ret_type({simple,FinType}, {RecFuns,RecArgsList,NumRecs}) ->
- {[fun([],_) -> FinType end | RecFuns], [[] | RecArgsList], NumRecs};
-add_ret_type({rec,RecFun,RecArgs}, {RecFuns,RecArgsList,NumRecs}) ->
- {[RecFun | RecFuns], [RecArgs | RecArgsList], NumRecs + 1}.
-
--spec is_simple_ret_type(ret_type()) -> boolean().
-is_simple_ret_type({simple,_FinType}) ->
- true;
-is_simple_ret_type({rec,_RecFun,_RecArgs}) ->
- false.
-
--spec clean_rec_args(rec_args()) -> rec_args().
-clean_rec_args(RecArgs) ->
- [{false,F} || {_B,F} <- RecArgs].
-
--spec soft_clean_rec_args(rec_args(), rec_fun_info(), boolean()) -> rec_args().
-soft_clean_rec_args(RecArgs, RecFunInfo, ToList) ->
- soft_clean_rec_args_tr(RecArgs, [], RecFunInfo, ToList, false, 1).
-
--spec soft_clean_rec_args_tr(rec_args(), rec_args(), rec_fun_info(), boolean(),
- boolean(), position()) -> rec_args().
-soft_clean_rec_args_tr([], Acc, _RecFunInfo, _ToList, _FoundListInst, _Pos) ->
- lists:reverse(Acc);
-soft_clean_rec_args_tr([{{list,_NonEmpty,_AltRecFun},FTRef} | Rest], Acc,
- RecFunInfo, ToList, true, Pos) ->
- NewArg = {false,FTRef},
- soft_clean_rec_args_tr(Rest, [NewArg|Acc], RecFunInfo, ToList, true, Pos+1);
-soft_clean_rec_args_tr([{{list,NonEmpty,AltRecFun},FTRef} | Rest], Acc,
- RecFunInfo, ToList, false, Pos) ->
- {NumTypes,NumRecs,RecArgLens,RecFuns} = RecFunInfo,
- AltRecFunPos = get_group(Pos, RecArgLens),
- AltRecFuns = proper_arith:list_update(AltRecFunPos, AltRecFun, RecFuns),
- AltRecFunInfo = {NumTypes,NumRecs,RecArgLens,AltRecFuns},
- NewArg = {{list,NonEmpty,tuple_rec_fun(AltRecFunInfo,ToList)},FTRef},
- soft_clean_rec_args_tr(Rest, [NewArg|Acc], RecFunInfo, ToList, true, Pos+1);
-soft_clean_rec_args_tr([Arg | Rest], Acc, RecFunInfo, ToList, FoundListInst,
- Pos) ->
- soft_clean_rec_args_tr(Rest, [Arg | Acc], RecFunInfo, ToList, FoundListInst,
- Pos+1).
-
--spec get_group(pos_integer(), [non_neg_integer()]) -> pos_integer().
-get_group(Pos, AllMembers) ->
- get_group_tr(Pos, AllMembers, 1).
-
--spec get_group_tr(pos_integer(), [non_neg_integer()], pos_integer()) ->
- pos_integer().
-get_group_tr(Pos, [Members | Rest], GroupNum) ->
- case Pos =< Members of
- true -> GroupNum;
- false -> get_group_tr(Pos - Members, Rest, GroupNum + 1)
- end.
-
--spec same_full_type_ref(full_type_ref(), term()) -> boolean().
-same_full_type_ref({SameMod,type,SameName,Args1},
- {SameMod,type,SameName,Args2}) ->
- length(Args1) =:= length(Args2)
- andalso lists:all(fun({A,B}) -> same_ret_type(A,B) end,
- lists:zip(Args1, Args2));
-same_full_type_ref({SameMod,record,SameName,SubstsDict1},
- {SameMod,record,SameName,SubstsDict2}) ->
- same_substs_dict(SubstsDict1, SubstsDict2);
-same_full_type_ref(_, _) ->
- false.
-
--spec same_ret_type(ret_type(), ret_type()) -> boolean().
-same_ret_type({simple,FinType1}, {simple,FinType2}) ->
- same_fin_type(FinType1, FinType2);
-same_ret_type({rec,RecFun1,RecArgs1}, {rec,RecFun2,RecArgs2}) ->
- NumRecArgs = length(RecArgs1),
- length(RecArgs2) =:= NumRecArgs
- andalso lists:all(fun({A1,A2}) -> same_rec_arg(A1,A2,NumRecArgs) end,
- lists:zip(RecArgs1,RecArgs2))
- andalso same_rec_fun(RecFun1, RecFun2, NumRecArgs);
-same_ret_type(_, _) ->
- false.
-
-%% TODO: Is this too strict?
--spec same_rec_arg(rec_arg(), rec_arg(), arity()) -> boolean().
-same_rec_arg({{list,SameBool,AltRecFun1},FTRef1},
- {{list,SameBool,AltRecFun2},FTRef2}, NumRecArgs) ->
- same_rec_fun(AltRecFun1, AltRecFun2, NumRecArgs)
- andalso same_full_type_ref(FTRef1, FTRef2);
-same_rec_arg({true,FTRef1}, {true,FTRef2}, _NumRecArgs) ->
- same_full_type_ref(FTRef1, FTRef2);
-same_rec_arg({false,FTRef1}, {false,FTRef2}, _NumRecArgs) ->
- same_full_type_ref(FTRef1, FTRef2);
-same_rec_arg(_, _, _NumRecArgs) ->
- false.
-
--spec same_substs_dict(substs_dict(), substs_dict()) -> boolean().
-same_substs_dict(SubstsDict1, SubstsDict2) ->
- SameKVPair = fun({{_K,V1},{_K,V2}}) -> same_ret_type(V1,V2);
- (_) -> false
- end,
- SubstsKVList1 = lists:sort(dict:to_list(SubstsDict1)),
- SubstsKVList2 = lists:sort(dict:to_list(SubstsDict2)),
- length(SubstsKVList1) =:= length(SubstsKVList2)
- andalso lists:all(SameKVPair, lists:zip(SubstsKVList1,SubstsKVList2)).
-
--spec same_fin_type(fin_type(), fin_type()) -> boolean().
-same_fin_type(Type1, Type2) ->
- proper_types:equal_types(Type1, Type2).
-
--spec same_rec_fun(rec_fun(), rec_fun(), arity()) -> boolean().
-same_rec_fun(RecFun1, RecFun2, NumRecArgs) ->
- %% It's ok that we return a type, even if there's a 'true' for use of
- %% an instance.
- GenFun = fun(_Size) -> proper_types:exactly('$dummy') end,
- GenFuns = lists:duplicate(NumRecArgs,GenFun),
- same_fin_type(RecFun1(GenFuns,0), RecFun2(GenFuns,0)).
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/proper/proper_common.hrl b/lib/dialyzer/test/opaque_SUITE_data/src/proper/proper_common.hrl
deleted file mode 100644
index c10626c5cc..0000000000
--- a/lib/dialyzer/test/opaque_SUITE_data/src/proper/proper_common.hrl
+++ /dev/null
@@ -1,55 +0,0 @@
-%%% Copyright 2010-2013 Manolis Papadakis <manopapad@gmail.com>,
-%%% Eirini Arvaniti <eirinibob@gmail.com>
-%%% and Kostis Sagonas <kostis@cs.ntua.gr>
-%%%
-%%% This file is part of PropEr.
-%%%
-%%% PropEr is free software: you can redistribute it and/or modify
-%%% it under the terms of the GNU General Public License as published by
-%%% the Free Software Foundation, either version 3 of the License, or
-%%% (at your option) any later version.
-%%%
-%%% PropEr is distributed in the hope that it will be useful,
-%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
-%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-%%% GNU General Public License for more details.
-%%%
-%%% You should have received a copy of the GNU General Public License
-%%% along with PropEr. If not, see <http://www.gnu.org/licenses/>.
-
-%%% @copyright 2010-2013 Manolis Papadakis, Eirini Arvaniti and Kostis Sagonas
-%%% @version {@version}
-%%% @author Manolis Papadakis
-%%% @doc Common parts of user and internal header files
-
-
-%%------------------------------------------------------------------------------
-%% Test generation macros
-%%------------------------------------------------------------------------------
-
--define(FORALL(X,RawType,Prop), proper:forall(RawType,fun(X) -> Prop end)).
--define(IMPLIES(Pre,Prop), proper:implies(Pre,?DELAY(Prop))).
--define(WHENFAIL(Action,Prop), proper:whenfail(?DELAY(Action),?DELAY(Prop))).
--define(TRAPEXIT(Prop), proper:trapexit(?DELAY(Prop))).
--define(TIMEOUT(Limit,Prop), proper:timeout(Limit,?DELAY(Prop))).
-%% TODO: -define(ALWAYS(Tests,Prop), proper:always(Tests,?DELAY(Prop))).
-%% TODO: -define(SOMETIMES(Tests,Prop), proper:sometimes(Tests,?DELAY(Prop))).
-
-
-%%------------------------------------------------------------------------------
-%% Generator macros
-%%------------------------------------------------------------------------------
-
--define(FORCE(X), (X)()).
--define(DELAY(X), fun() -> X end).
--define(LAZY(X), proper_types:lazy(?DELAY(X))).
--define(SIZED(SizeArg,Gen), proper_types:sized(fun(SizeArg) -> Gen end)).
--define(LET(X,RawType,Gen), proper_types:bind(RawType,fun(X) -> Gen end,false)).
--define(SHRINK(Gen,AltGens),
- proper_types:shrinkwith(?DELAY(Gen),?DELAY(AltGens))).
--define(LETSHRINK(Xs,RawType,Gen),
- proper_types:bind(RawType,fun(Xs) -> Gen end,true)).
--define(SUCHTHAT(X,RawType,Condition),
- proper_types:add_constraint(RawType,fun(X) -> Condition end,true)).
--define(SUCHTHATMAYBE(X,RawType,Condition),
- proper_types:add_constraint(RawType,fun(X) -> Condition end,false)).
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/proper/proper_gen.erl b/lib/dialyzer/test/opaque_SUITE_data/src/proper/proper_gen.erl
deleted file mode 100644
index bf627d1373..0000000000
--- a/lib/dialyzer/test/opaque_SUITE_data/src/proper/proper_gen.erl
+++ /dev/null
@@ -1,624 +0,0 @@
-%%% Copyright 2010-2013 Manolis Papadakis <manopapad@gmail.com>,
-%%% Eirini Arvaniti <eirinibob@gmail.com>
-%%% and Kostis Sagonas <kostis@cs.ntua.gr>
-%%%
-%%% This file is part of PropEr.
-%%%
-%%% PropEr is free software: you can redistribute it and/or modify
-%%% it under the terms of the GNU General Public License as published by
-%%% the Free Software Foundation, either version 3 of the License, or
-%%% (at your option) any later version.
-%%%
-%%% PropEr is distributed in the hope that it will be useful,
-%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
-%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-%%% GNU General Public License for more details.
-%%%
-%%% You should have received a copy of the GNU General Public License
-%%% along with PropEr. If not, see <http://www.gnu.org/licenses/>.
-
-%%% @copyright 2010-2013 Manolis Papadakis, Eirini Arvaniti and Kostis Sagonas
-%%% @version {@version}
-%%% @author Manolis Papadakis
-
-%%% @doc Generator subsystem and generators for basic types.
-%%%
-%%% You can use <a href="#index">these</a> functions to try out the random
-%%% instance generation and shrinking subsystems.
-%%%
-%%% CAUTION: These functions should never be used inside properties. They are
-%%% meant for demonstration purposes only.
-
--module(proper_gen).
--export([pick/1, pick/2, pick/3, sample/1, sample/3, sampleshrink/1, sampleshrink/2]).
-
--export([safe_generate/1]).
--export([generate/1, normal_gen/1, alt_gens/1, clean_instance/1,
- get_ret_type/1]).
--export([integer_gen/3, float_gen/3, atom_gen/1, atom_rev/1, binary_gen/1,
- binary_rev/1, binary_len_gen/1, bitstring_gen/1, bitstring_rev/1,
- bitstring_len_gen/1, list_gen/2, distlist_gen/3, vector_gen/2,
- union_gen/1, weighted_union_gen/1, tuple_gen/1, loose_tuple_gen/2,
- loose_tuple_rev/2, exactly_gen/1, fixed_list_gen/1, function_gen/2,
- any_gen/1, native_type_gen/2, safe_weighted_union_gen/1,
- safe_union_gen/1]).
-
--export_type([instance/0, imm_instance/0, sized_generator/0, nosize_generator/0,
- generator/0, reverse_gen/0, combine_fun/0, alt_gens/0]).
-
--include("proper_internal.hrl").
-
-
-%%-----------------------------------------------------------------------------
-%% Types
-%%-----------------------------------------------------------------------------
-
-%% TODO: update imm_instance() when adding more types: be careful when reading
-%% anything that returns it
-%% @private_type
--type imm_instance() :: proper_types:raw_type()
- | instance()
- | {'$used', imm_instance(), imm_instance()}
- | {'$to_part', imm_instance()}.
--type instance() :: term().
-%% A value produced by the random instance generator.
--type error_reason() :: 'arity_limit' | 'cant_generate' | {'typeserver',term()}.
-
-%% @private_type
--type sized_generator() :: fun((size()) -> imm_instance()).
-%% @private_type
--type typed_sized_generator() :: {'typed',
- fun((proper_types:type(),size()) ->
- imm_instance())}.
-%% @private_type
--type nosize_generator() :: fun(() -> imm_instance()).
-%% @private_type
--type typed_nosize_generator() :: {'typed',
- fun((proper_types:type()) ->
- imm_instance())}.
-%% @private_type
--type generator() :: sized_generator()
- | typed_sized_generator()
- | nosize_generator()
- | typed_nosize_generator().
-%% @private_type
--type plain_reverse_gen() :: fun((instance()) -> imm_instance()).
-%% @private_type
--type typed_reverse_gen() :: {'typed',
- fun((proper_types:type(),instance()) ->
- imm_instance())}.
-%% @private_type
--type reverse_gen() :: plain_reverse_gen() | typed_reverse_gen().
-%% @private_type
--type combine_fun() :: fun((instance()) -> imm_instance()).
-%% @private_type
--type alt_gens() :: fun(() -> [imm_instance()]).
-%% @private_type
--type fun_seed() :: {non_neg_integer(),non_neg_integer()}.
-
-
-%%-----------------------------------------------------------------------------
-%% Instance generation functions
-%%-----------------------------------------------------------------------------
-
-%% @private
--spec safe_generate(proper_types:raw_type()) ->
- {'ok',imm_instance()} | {'error',error_reason()}.
-safe_generate(RawType) ->
- try generate(RawType) of
- ImmInstance -> {ok, ImmInstance}
- catch
- throw:'$arity_limit' -> {error, arity_limit};
- throw:'$cant_generate' -> {error, cant_generate};
- throw:{'$typeserver',SubReason} -> {error, {typeserver,SubReason}}
- end.
-
-%% @private
--spec generate(proper_types:raw_type()) -> imm_instance().
-generate(RawType) ->
- Type = proper_types:cook_outer(RawType),
- ok = add_parameters(Type),
- Instance = generate(Type, get('$constraint_tries'), none),
- ok = remove_parameters(Type),
- Instance.
-
--spec add_parameters(proper_types:type()) -> 'ok'.
-add_parameters(Type) ->
- case proper_types:find_prop(parameters, Type) of
- {ok, Params} ->
- OldParams = erlang:get('$parameters'),
- case OldParams of
- undefined ->
- erlang:put('$parameters', Params);
- _ ->
- erlang:put('$parameters', Params ++ OldParams)
- end,
- ok;
- _ ->
- ok
- end.
-
--spec remove_parameters(proper_types:type()) -> 'ok'.
-remove_parameters(Type) ->
- case proper_types:find_prop(parameters, Type) of
- {ok, Params} ->
- AllParams = erlang:get('$parameters'),
- case AllParams of
- Params->
- erlang:erase('$parameters');
- _ ->
- erlang:put('$parameters', AllParams -- Params)
- end,
- ok;
- _ ->
- ok
- end.
-
--spec generate(proper_types:type(), non_neg_integer(),
- 'none' | {'ok',imm_instance()}) -> imm_instance().
-generate(_Type, 0, none) ->
- throw('$cant_generate');
-generate(_Type, 0, {ok,Fallback}) ->
- Fallback;
-generate(Type, TriesLeft, Fallback) ->
- ImmInstance =
- case proper_types:get_prop(kind, Type) of
- constructed ->
- PartsType = proper_types:get_prop(parts_type, Type),
- Combine = proper_types:get_prop(combine, Type),
- ImmParts = generate(PartsType),
- Parts = clean_instance(ImmParts),
- ImmInstance1 = Combine(Parts),
- %% TODO: We can just generate the internal type: if it's not
- %% a type, it will turn into an exactly.
- ImmInstance2 =
- case proper_types:is_raw_type(ImmInstance1) of
- true -> generate(ImmInstance1);
- false -> ImmInstance1
- end,
- {'$used',ImmParts,ImmInstance2};
- _ ->
- ImmInstance1 = normal_gen(Type),
- case proper_types:is_raw_type(ImmInstance1) of
- true -> generate(ImmInstance1);
- false -> ImmInstance1
- end
- end,
- case proper_types:satisfies_all(clean_instance(ImmInstance), Type) of
- {_,true} -> ImmInstance;
- {true,false} -> generate(Type, TriesLeft - 1, {ok,ImmInstance});
- {false,false} -> generate(Type, TriesLeft - 1, Fallback)
- end.
-
-%% @equiv pick(Type, 10)
--spec pick(Type::proper_types:raw_type()) -> {'ok',instance()} | 'error'.
-pick(RawType) ->
- pick(RawType, 10).
-
-%% @equiv pick(Type, Size, now())
--spec pick(Type::proper_types:raw_type(), size()) -> {'ok', instance()} | 'error'.
-pick(RawType, Size) ->
- pick(RawType, Size, now()).
-
-%% @doc Generates a random instance of `Type', of size `Size' with seed `Seed'.
--spec pick(Type::proper_types:raw_type(), size(), seed()) ->
- {'ok',instance()} | 'error'.
-pick(RawType, Size, Seed) ->
- proper:global_state_init_size_seed(Size, Seed),
- case clean_instance(safe_generate(RawType)) of
- {ok,Instance} = Result ->
- Msg = "WARNING: Some garbage has been left in the process registry "
- "and the code server~n"
- "to allow for the returned function(s) to run normally.~n"
- "Please run proper:global_state_erase() when done.~n",
- case contains_fun(Instance) of
- true -> io:format(Msg, []);
- false -> proper:global_state_erase()
- end,
- Result;
- {error,Reason} ->
- proper:report_error(Reason, fun io:format/2),
- proper:global_state_erase(),
- error
- end.
-
-%% @equiv sample(Type, 10, 20)
--spec sample(Type::proper_types:raw_type()) -> 'ok'.
-sample(RawType) ->
- sample(RawType, 10, 20).
-
-%% @doc Generates and prints one random instance of `Type' for each size from
-%% `StartSize' up to `EndSize'.
--spec sample(Type::proper_types:raw_type(), size(), size()) -> 'ok'.
-sample(RawType, StartSize, EndSize) when StartSize =< EndSize ->
- Tests = EndSize - StartSize + 1,
- Prop = ?FORALL(X, RawType, begin io:format("~p~n",[X]), true end),
- Opts = [quiet,{start_size,StartSize},{max_size,EndSize},{numtests,Tests}],
- _ = proper:quickcheck(Prop, Opts),
- ok.
-
-%% @equiv sampleshrink(Type, 10)
--spec sampleshrink(Type::proper_types:raw_type()) -> 'ok'.
-sampleshrink(RawType) ->
- sampleshrink(RawType, 10).
-
-%% @doc Generates a random instance of `Type', of size `Size', then shrinks it
-%% as far as it goes. The value produced on each step of the shrinking process
-%% is printed on the screen.
--spec sampleshrink(Type::proper_types:raw_type(), size()) -> 'ok'.
-sampleshrink(RawType, Size) ->
- proper:global_state_init_size(Size),
- Type = proper_types:cook_outer(RawType),
- case safe_generate(Type) of
- {ok,ImmInstance} ->
- Shrunk = keep_shrinking(ImmInstance, [], Type),
- PrintInst = fun(I) -> io:format("~p~n",[clean_instance(I)]) end,
- lists:foreach(PrintInst, Shrunk);
- {error,Reason} ->
- proper:report_error(Reason, fun io:format/2)
- end,
- proper:global_state_erase(),
- ok.
-
--spec keep_shrinking(imm_instance(), [imm_instance()], proper_types:type()) ->
- [imm_instance(),...].
-keep_shrinking(ImmInstance, Acc, Type) ->
- case proper_shrink:shrink(ImmInstance, Type, init) of
- {[], _NewState} ->
- lists:reverse([ImmInstance|Acc]);
- {[Shrunk|_Rest], _NewState} ->
- keep_shrinking(Shrunk, [ImmInstance|Acc], Type)
- end.
-
--spec contains_fun(term()) -> boolean().
-contains_fun(List) when is_list(List) ->
- proper_arith:safe_any(fun contains_fun/1, List);
-contains_fun(Tuple) when is_tuple(Tuple) ->
- contains_fun(tuple_to_list(Tuple));
-contains_fun(Fun) when is_function(Fun) ->
- true;
-contains_fun(_Term) ->
- false.
-
-
-%%-----------------------------------------------------------------------------
-%% Utility functions
-%%-----------------------------------------------------------------------------
-
-%% @private
--spec normal_gen(proper_types:type()) -> imm_instance().
-normal_gen(Type) ->
- case proper_types:get_prop(generator, Type) of
- {typed, Gen} ->
- if
- is_function(Gen, 1) -> Gen(Type);
- is_function(Gen, 2) -> Gen(Type, proper:get_size(Type))
- end;
- Gen ->
- if
- is_function(Gen, 0) -> Gen();
- is_function(Gen, 1) -> Gen(proper:get_size(Type))
- end
- end.
-
-%% @private
--spec alt_gens(proper_types:type()) -> [imm_instance()].
-alt_gens(Type) ->
- case proper_types:find_prop(alt_gens, Type) of
- {ok, AltGens} -> ?FORCE(AltGens);
- error -> []
- end.
-
-%% @private
--spec clean_instance(imm_instance()) -> instance().
-clean_instance({'$used',_ImmParts,ImmInstance}) ->
- clean_instance(ImmInstance);
-clean_instance({'$to_part',ImmInstance}) ->
- clean_instance(ImmInstance);
-clean_instance(ImmInstance) ->
- if
- is_list(ImmInstance) ->
- %% CAUTION: this must handle improper lists
- proper_arith:safe_map(fun clean_instance/1, ImmInstance);
- is_tuple(ImmInstance) ->
- proper_arith:tuple_map(fun clean_instance/1, ImmInstance);
- true ->
- ImmInstance
- end.
-
-
-%%-----------------------------------------------------------------------------
-%% Basic type generators
-%%-----------------------------------------------------------------------------
-
-%% @private
--spec integer_gen(size(), proper_types:extint(), proper_types:extint()) ->
- integer().
-integer_gen(Size, inf, inf) ->
- proper_arith:rand_int(Size);
-integer_gen(Size, inf, High) ->
- High - proper_arith:rand_non_neg_int(Size);
-integer_gen(Size, Low, inf) ->
- Low + proper_arith:rand_non_neg_int(Size);
-integer_gen(Size, Low, High) ->
- proper_arith:smart_rand_int(Size, Low, High).
-
-%% @private
--spec float_gen(size(), proper_types:extnum(), proper_types:extnum()) ->
- float().
-float_gen(Size, inf, inf) ->
- proper_arith:rand_float(Size);
-float_gen(Size, inf, High) ->
- High - proper_arith:rand_non_neg_float(Size);
-float_gen(Size, Low, inf) ->
- Low + proper_arith:rand_non_neg_float(Size);
-float_gen(_Size, Low, High) ->
- proper_arith:rand_float(Low, High).
-
-%% @private
--spec atom_gen(size()) -> proper_types:type().
-%% We make sure we never clash with internal atoms by checking that the first
-%% character is not '$'.
-atom_gen(Size) ->
- ?LET(Str,
- ?SUCHTHAT(X,
- proper_types:resize(Size,
- proper_types:list(proper_types:byte())),
- X =:= [] orelse hd(X) =/= $$),
- list_to_atom(Str)).
-
-%% @private
--spec atom_rev(atom()) -> imm_instance().
-atom_rev(Atom) ->
- {'$used', atom_to_list(Atom), Atom}.
-
-%% @private
--spec binary_gen(size()) -> proper_types:type().
-binary_gen(Size) ->
- ?LET(Bytes,
- proper_types:resize(Size,
- proper_types:list(proper_types:byte())),
- list_to_binary(Bytes)).
-
-%% @private
--spec binary_rev(binary()) -> imm_instance().
-binary_rev(Binary) ->
- {'$used', binary_to_list(Binary), Binary}.
-
-%% @private
--spec binary_len_gen(length()) -> proper_types:type().
-binary_len_gen(Len) ->
- ?LET(Bytes,
- proper_types:vector(Len, proper_types:byte()),
- list_to_binary(Bytes)).
-
-%% @private
--spec bitstring_gen(size()) -> proper_types:type().
-bitstring_gen(Size) ->
- ?LET({BytesHead, NumBits, TailByte},
- {proper_types:resize(Size,proper_types:binary()),
- proper_types:range(0,7), proper_types:range(0,127)},
- <<BytesHead/binary, TailByte:NumBits>>).
-
-%% @private
--spec bitstring_rev(bitstring()) -> imm_instance().
-bitstring_rev(BitString) ->
- List = bitstring_to_list(BitString),
- {BytesList, BitsTail} = lists:splitwith(fun erlang:is_integer/1, List),
- {NumBits, TailByte} = case BitsTail of
- [] -> {0, 0};
- [Bits] -> N = bit_size(Bits),
- <<Byte:N>> = Bits,
- {N, Byte}
- end,
- {'$used',
- {{'$used',BytesList,list_to_binary(BytesList)}, NumBits, TailByte},
- BitString}.
-
-%% @private
--spec bitstring_len_gen(length()) -> proper_types:type().
-bitstring_len_gen(Len) ->
- BytesLen = Len div 8,
- BitsLen = Len rem 8,
- ?LET({BytesHead, NumBits, TailByte},
- {proper_types:binary(BytesLen), BitsLen,
- proper_types:range(0, 1 bsl BitsLen - 1)},
- <<BytesHead/binary, TailByte:NumBits>>).
-
-%% @private
--spec list_gen(size(), proper_types:type()) -> [imm_instance()].
-list_gen(Size, ElemType) ->
- Len = proper_arith:rand_int(0, Size),
- vector_gen(Len, ElemType).
-
-%% @private
--spec distlist_gen(size(), sized_generator(), boolean()) -> [imm_instance()].
-distlist_gen(RawSize, Gen, NonEmpty) ->
- Len = case NonEmpty of
- true -> proper_arith:rand_int(1, erlang:max(1,RawSize));
- false -> proper_arith:rand_int(0, RawSize)
- end,
- Size = case Len of
- 1 -> RawSize - 1;
- _ -> RawSize
- end,
- %% TODO: this produces a lot of types: maybe a simple 'div' is sufficient?
- Sizes = proper_arith:distribute(Size, Len),
- InnerTypes = [Gen(S) || S <- Sizes],
- fixed_list_gen(InnerTypes).
-
-%% @private
--spec vector_gen(length(), proper_types:type()) -> [imm_instance()].
-vector_gen(Len, ElemType) ->
- vector_gen_tr(Len, ElemType, []).
-
--spec vector_gen_tr(length(), proper_types:type(), [imm_instance()]) ->
- [imm_instance()].
-vector_gen_tr(0, _ElemType, AccList) ->
- AccList;
-vector_gen_tr(Left, ElemType, AccList) ->
- vector_gen_tr(Left - 1, ElemType, [generate(ElemType) | AccList]).
-
-%% @private
--spec union_gen([proper_types:type(),...]) -> imm_instance().
-union_gen(Choices) ->
- {_Choice,Type} = proper_arith:rand_choose(Choices),
- generate(Type).
-
-%% @private
--spec weighted_union_gen([{frequency(),proper_types:type()},...]) ->
- imm_instance().
-weighted_union_gen(FreqChoices) ->
- {_Choice,Type} = proper_arith:freq_choose(FreqChoices),
- generate(Type).
-
-%% @private
--spec safe_union_gen([proper_types:type(),...]) -> imm_instance().
-safe_union_gen(Choices) ->
- {Choice,Type} = proper_arith:rand_choose(Choices),
- try generate(Type)
- catch
- error:_ ->
- safe_union_gen(proper_arith:list_remove(Choice, Choices))
- end.
-
-%% @private
--spec safe_weighted_union_gen([{frequency(),proper_types:type()},...]) ->
- imm_instance().
-safe_weighted_union_gen(FreqChoices) ->
- {Choice,Type} = proper_arith:freq_choose(FreqChoices),
- try generate(Type)
- catch
- error:_ ->
- safe_weighted_union_gen(proper_arith:list_remove(Choice,
- FreqChoices))
- end.
-
-%% @private
--spec tuple_gen([proper_types:type()]) -> tuple().
-tuple_gen(Fields) ->
- list_to_tuple(fixed_list_gen(Fields)).
-
-%% @private
--spec loose_tuple_gen(size(), proper_types:type()) -> proper_types:type().
-loose_tuple_gen(Size, ElemType) ->
- ?LET(L,
- proper_types:resize(Size, proper_types:list(ElemType)),
- list_to_tuple(L)).
-
-%% @private
--spec loose_tuple_rev(tuple(), proper_types:type()) -> imm_instance().
-loose_tuple_rev(Tuple, ElemType) ->
- CleanList = tuple_to_list(Tuple),
- List = case proper_types:find_prop(reverse_gen, ElemType) of
- {ok,{typed, ReverseGen}} ->
- [ReverseGen(ElemType,X) || X <- CleanList];
- {ok,ReverseGen} -> [ReverseGen(X) || X <- CleanList];
- error -> CleanList
- end,
- {'$used', List, Tuple}.
-
-%% @private
--spec exactly_gen(T) -> T.
-exactly_gen(X) ->
- X.
-
-%% @private
--spec fixed_list_gen([proper_types:type()]) -> imm_instance()
- ; ({[proper_types:type()],proper_types:type()}) ->
- maybe_improper_list(imm_instance(), imm_instance() | []).
-fixed_list_gen({ProperHead,ImproperTail}) ->
- [generate(F) || F <- ProperHead] ++ generate(ImproperTail);
-fixed_list_gen(ProperFields) ->
- [generate(F) || F <- ProperFields].
-
-%% @private
--spec function_gen(arity(), proper_types:type()) -> function().
-function_gen(Arity, RetType) ->
- FunSeed = {proper_arith:rand_int(0, ?SEED_RANGE - 1),
- proper_arith:rand_int(0, ?SEED_RANGE - 1)},
- create_fun(Arity, RetType, FunSeed).
-
-%% @private
--spec any_gen(size()) -> imm_instance().
-any_gen(Size) ->
- case get('$any_type') of
- undefined -> real_any_gen(Size);
- {type,AnyType} -> generate(proper_types:resize(Size, AnyType))
- end.
-
--spec real_any_gen(size()) -> imm_instance().
-real_any_gen(0) ->
- SimpleTypes = [proper_types:integer(), proper_types:float(),
- proper_types:atom()],
- union_gen(SimpleTypes);
-real_any_gen(Size) ->
- FreqChoices = [{?ANY_SIMPLE_PROB,simple}, {?ANY_BINARY_PROB,binary},
- {?ANY_EXPAND_PROB,expand}],
- case proper_arith:freq_choose(FreqChoices) of
- {_,simple} ->
- real_any_gen(0);
- {_,binary} ->
- generate(proper_types:resize(Size, proper_types:bitstring()));
- {_,expand} ->
- %% TODO: statistics of produced terms?
- NumElems = proper_arith:rand_int(0, Size - 1),
- ElemSizes = proper_arith:distribute(Size - 1, NumElems),
- ElemTypes = [?LAZY(real_any_gen(S)) || S <- ElemSizes],
- case proper_arith:rand_int(1,2) of
- 1 -> fixed_list_gen(ElemTypes);
- 2 -> tuple_gen(ElemTypes)
- end
- end.
-
-%% @private
--spec native_type_gen(mod_name(), string()) -> proper_types:type().
-native_type_gen(Mod, TypeStr) ->
- case proper_typeserver:translate_type({Mod,TypeStr}) of
- {ok,Type} -> Type;
- {error,Reason} -> throw({'$typeserver',Reason})
- end.
-
-
-%%------------------------------------------------------------------------------
-%% Function-generation functions
-%%------------------------------------------------------------------------------
-
--spec create_fun(arity(), proper_types:type(), fun_seed()) -> function().
-create_fun(Arity, RetType, FunSeed) ->
- Handler = fun(Args) -> function_body(Args, RetType, FunSeed) end,
- Err = fun() -> throw('$arity_limit') end,
- case Arity of
- 0 -> fun() -> Handler([]) end;
- _ -> Err()
- end.
-
-%% @private
--spec get_ret_type(function()) -> proper_types:type().
-get_ret_type(Fun) ->
- {arity,Arity} = erlang:fun_info(Fun, arity),
- put('$get_ret_type', true),
- RetType = apply(Fun, lists:duplicate(Arity,dummy)),
- erase('$get_ret_type'),
- RetType.
--spec function_body([term()], proper_types:type(), fun_seed()) ->
- proper_types:type() | instance().
-function_body(Args, RetType, {Seed1,Seed2}) ->
- case get('$get_ret_type') of
- true ->
- RetType;
- _ ->
- SavedSeed = get(?SEED_NAME),
- update_seed({Seed1,Seed2,erlang:phash2(Args,?SEED_RANGE)}),
- Ret = clean_instance(generate(RetType)),
- put(?SEED_NAME, SavedSeed),
- proper_symb:internal_eval(Ret)
- end.
-
--ifdef(USE_SFMT).
-update_seed(Seed) ->
- sfmt:seed(Seed).
--else.
-update_seed(Seed) ->
- put(random_seed, Seed).
--endif.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/proper/proper_internal.hrl b/lib/dialyzer/test/opaque_SUITE_data/src/proper/proper_internal.hrl
deleted file mode 100644
index c790d7d4db..0000000000
--- a/lib/dialyzer/test/opaque_SUITE_data/src/proper/proper_internal.hrl
+++ /dev/null
@@ -1,92 +0,0 @@
-%%% Copyright 2010-2013 Manolis Papadakis <manopapad@gmail.com>,
-%%% Eirini Arvaniti <eirinibob@gmail.com>
-%%% and Kostis Sagonas <kostis@cs.ntua.gr>
-%%%
-%%% This file is part of PropEr.
-%%%
-%%% PropEr is free software: you can redistribute it and/or modify
-%%% it under the terms of the GNU General Public License as published by
-%%% the Free Software Foundation, either version 3 of the License, or
-%%% (at your option) any later version.
-%%%
-%%% PropEr is distributed in the hope that it will be useful,
-%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
-%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-%%% GNU General Public License for more details.
-%%%
-%%% You should have received a copy of the GNU General Public License
-%%% along with PropEr. If not, see <http://www.gnu.org/licenses/>.
-
-%%% @copyright 2010-2013 Manolis Papadakis, Eirini Arvaniti and Kostis Sagonas
-%%% @version {@version}
-%%% @author Manolis Papadakis
-%%% @doc Internal header file: This header is included in all PropEr source
-%%% files.
-
--include("proper_common.hrl").
-
-
-%%------------------------------------------------------------------------------
-%% Activate strip_types parse transform
-%%------------------------------------------------------------------------------
-
--ifdef(NO_TYPES).
--compile({parse_transform, strip_types}).
--endif.
-
-%%------------------------------------------------------------------------------
-%% Random generator selection
-%%------------------------------------------------------------------------------
-
--ifdef(USE_SFMT).
--define(RANDOM_MOD, sfmt).
--define(SEED_NAME, sfmt_seed).
--else.
--define(RANDOM_MOD, random).
--define(SEED_NAME, random_seed).
--endif.
-
-%%------------------------------------------------------------------------------
-%% Macros
-%%------------------------------------------------------------------------------
-
--define(PROPERTY_PREFIX, "prop_").
-
-
-%%------------------------------------------------------------------------------
-%% Constants
-%%------------------------------------------------------------------------------
-
--define(SEED_RANGE, 4294967296).
--define(MAX_ARITY, 20).
--define(MAX_TRIES_FACTOR, 5).
--define(ANY_SIMPLE_PROB, 3).
--define(ANY_BINARY_PROB, 1).
--define(ANY_EXPAND_PROB, 8).
--define(SMALL_RANGE_THRESHOLD, 16#FFFF).
-
-
-%%------------------------------------------------------------------------------
-%% Common type aliases
-%%------------------------------------------------------------------------------
-
-%% TODO: Perhaps these should be moved inside modules.
--type mod_name() :: atom().
--type fun_name() :: atom().
--type size() :: non_neg_integer().
--type length() :: non_neg_integer().
--type position() :: pos_integer().
--type frequency() :: pos_integer().
--type seed() :: {non_neg_integer(), non_neg_integer(), non_neg_integer()}.
-
--type abs_form() :: erl_parse:abstract_form().
--type abs_expr() :: erl_parse:abstract_expr().
--type abs_clause() :: erl_parse:abstract_clause().
-
-%% TODO: Replace these with the appropriate types from stdlib.
--type abs_type() :: term().
--type abs_rec_field() :: term().
-
--type loose_tuple(T) :: {} | {T} | {T,T} | {T,T,T} | {T,T,T,T} | {T,T,T,T,T}
- | {T,T,T,T,T,T} | {T,T,T,T,T,T,T} | {T,T,T,T,T,T,T,T}
- | {T,T,T,T,T,T,T,T,T} | {T,T,T,T,T,T,T,T,T,T} | tuple().
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/proper/proper_types.erl b/lib/dialyzer/test/opaque_SUITE_data/src/proper/proper_types.erl
deleted file mode 100644
index fe83a0ba11..0000000000
--- a/lib/dialyzer/test/opaque_SUITE_data/src/proper/proper_types.erl
+++ /dev/null
@@ -1,1349 +0,0 @@
-%%% Copyright 2010-2013 Manolis Papadakis <manopapad@gmail.com>,
-%%% Eirini Arvaniti <eirinibob@gmail.com>
-%%% and Kostis Sagonas <kostis@cs.ntua.gr>
-%%%
-%%% This file is part of PropEr.
-%%%
-%%% PropEr is free software: you can redistribute it and/or modify
-%%% it under the terms of the GNU General Public License as published by
-%%% the Free Software Foundation, either version 3 of the License, or
-%%% (at your option) any later version.
-%%%
-%%% PropEr is distributed in the hope that it will be useful,
-%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
-%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-%%% GNU General Public License for more details.
-%%%
-%%% You should have received a copy of the GNU General Public License
-%%% along with PropEr. If not, see <http://www.gnu.org/licenses/>.
-
-%%% @copyright 2010-2013 Manolis Papadakis, Eirini Arvaniti and Kostis Sagonas
-%%% @version {@version}
-%%% @author Manolis Papadakis
-
-%%% @doc Type manipulation functions and predefined types.
-%%%
-%%% == Basic types ==
-%%% This module defines all the basic types of the PropEr type system as
-%%% functions. See the <a href="#index">function index</a> for an overview.
-%%%
-%%% Types can be combined in tuples or lists to produce other types. Exact
-%%% values (such as exact numbers, atoms, binaries and strings) can be combined
-%%% with types inside such structures, like in this example of the type of a
-%%% tagged tuple: ``{'result', integer()}''.
-%%%
-%%% When including the PropEr header file, all
-%%% <a href="#index">API functions</a> of this module are automatically
-%%% imported, unless `PROPER_NO_IMPORTS' is defined.
-%%%
-%%% == Customized types ==
-%%% The following operators can be applied to basic types in order to produce
-%%% new ones:
-%%%
-%%% <dl>
-%%% <dt>`?LET(<Xs>, <Xs_type>, <In>)'</dt>
-%%% <dd>To produce an instance of this type, all appearances of the variables
-%%% in `<Xs>' are replaced inside `<In>' by their corresponding values in a
-%%% randomly generated instance of `<Xs_type>'. It's OK for the `<In>' part to
-%%% evaluate to a type - in that case, an instance of the inner type is
-%%% generated recursively.</dd>
-%%% <dt>`?SUCHTHAT(<X>, <Type>, <Condition>)'</dt>
-%%% <dd>This produces a specialization of `<Type>', which only includes those
-%%% members of `<Type>' that satisfy the constraint `<Condition>' - that is,
-%%% those members for which the function `fun(<X>) -> <Condition> end' returns
-%%% `true'. If the constraint is very strict - that is, only a small
-%%% percentage of instances of `<Type>' pass the test - it will take a lot of
-%%% tries for the instance generation subsystem to randomly produce a valid
-%%% instance. This will result in slower testing, and testing may even be
-%%% stopped short, in case the `constraint_tries' limit is reached (see the
-%%% "Options" section in the documentation of the {@link proper} module). If
-%%% this is the case, it would be more appropriate to generate valid instances
-%%% of the specialized type using the `?LET' macro. Also make sure that even
-%%% small instances can satisfy the constraint, since PropEr will only try
-%%% small instances at the start of testing. If this is not possible, you can
-%%% instruct PropEr to start at a larger size, by supplying a suitable value
-%%% for the `start_size' option (see the "Options" section in the
-%%% documentation of the {@link proper} module).</dd>
-%%% <dt>`?SUCHTHATMAYBE(<X>, <Type>, <Condition>)'</dt>
-%%% <dd>Equivalent to the `?SUCHTHAT' macro, but the constraint `<Condition>'
-%%% is considered non-strict: if the `constraint_tries' limit is reached, the
-%%% generator will just return an instance of `<Type>' instead of failing,
-%%% even if that instance doesn't satisfy the constraint.</dd>
-%%% <dt>`?SHRINK(<Generator>, <List_of_alt_gens>)'</dt>
-%%% <dd>This creates a type whose instances are generated by evaluating the
-%%% statement block `<Generator>' (this may evaluate to a type, which will
-%%% then be generated recursively). If an instance of such a type is to be
-%%% shrunk, the generators in `<List_of_alt_gens>' are first run to produce
-%%% hopefully simpler instances of the type. Thus, the generators in the
-%%% second argument should be simpler than the default. The simplest ones
-%%% should be at the front of the list, since those are the generators
-%%% preferred by the shrinking subsystem. Like the main `<Generator>', the
-%%% alternatives may also evaluate to a type, which is generated recursively.
-%%% </dd>
-%%% <dt>`?LETSHRINK(<List_of_variables>, <List_of_types>, <Generator>)'</dt>
-%%% <dd>This is created by combining a `?LET' and a `?SHRINK' macro. Instances
-%%% are generated by applying a randomly generated list of values inside
-%%% `<Generator>' (just like a `?LET', with the added constraint that the
-%%% variables and types must be provided in a list - alternatively,
-%%% `<List_of_types>' may be a list or vector type). When shrinking instances
-%%% of such a type, the sub-instances that were combined to produce it are
-%%% first tried in place of the failing instance.</dd>
-%%% <dt>`?LAZY(<Generator>)'</dt>
-%%% <dd>This construct returns a type whose only purpose is to delay the
-%%% evaluation of `<Generator>' (`<Generator>' can return a type, which will
-%%% be generated recursively). Using this, you can simulate the lazy
-%%% generation of instances:
-%%% ``` stream() -> ?LAZY(frequency([ {1,[]}, {3,[0|stream()]} ])). '''
-%%% The above type produces lists of zeroes with an average length of 3. Note
-%%% that, had we not enclosed the generator with a `?LAZY' macro, the
-%%% evaluation would continue indefinitely, due to the eager evaluation of
-%%% the Erlang language.</dd>
-%%% <dt>`non_empty(<List_or_binary_type>)'</dt>
-%%% <dd>See the documentation for {@link non_empty/1}.</dd>
-%%% <dt>`noshrink(<Type>)'</dt>
-%%% <dd>See the documentation for {@link noshrink/1}.</dd>
-%%% <dt>`default(<Default_value>, <Type>)'</dt>
-%%% <dd>See the documentation for {@link default/2}.</dd>
-%%% <dt>`with_parameter(<Parameter>, <Value>, <Type>)'</dt>
-%%% <dd>See the documentation for {@link with_parameter/3}.</dd>
-%%% <dt>`with_parameters(<Param_value_pairs>, <Type>)'</dt>
-%%% <dd>See the documentation for {@link with_parameters/2}.</dd>
-%%% </dl>
-%%%
-%%% == Size manipulation ==
-%%% The following operators are related to the `size' parameter, which controls
-%%% the maximum size of produced instances. The actual size of a produced
-%%% instance is chosen randomly, but can never exceed the value of the `size'
-%%% parameter at the moment of generation. A more accurate definition is the
-%%% following: the maximum instance of `size S' can never be smaller than the
-%%% maximum instance of `size S-1'. The actual size of an instance is measured
-%%% differently for each type: the actual size of a list is its length, while
-%%% the actual size of a tree may be the number of its internal nodes. Some
-%%% types, e.g. unions, have no notion of size, thus their generation is not
-%%% influenced by the value of `size'. The `size' parameter starts at 1 and
-%%% grows automatically during testing.
-%%%
-%%% <dl>
-%%% <dt>`?SIZED(<S>, <Generator>)'</dt>
-%%% <dd>Creates a new type, whose instances are produced by replacing all
-%%% appearances of the `<S>' parameter inside the statement block
-%%% `<Generator>' with the value of the `size' parameter. It's OK for the
-%%% `<Generator>' to return a type - in that case, an instance of the inner
-%%% type is generated recursively.</dd>
-%%% <dt>`resize(<New_size>, <Type>)'</dt>
-%%% <dd>See the documentation for {@link resize/2}.</dd>
-%%% </dl>
-
--module(proper_types).
--export([is_inst/2, is_inst/3]).
-
--export([integer/2, float/2, atom/0, binary/0, binary/1, bitstring/0,
- bitstring/1, list/1, vector/2, union/1, weighted_union/1, tuple/1,
- loose_tuple/1, exactly/1, fixed_list/1, function/2, any/0,
- shrink_list/1, safe_union/1, safe_weighted_union/1]).
--export([integer/0, non_neg_integer/0, pos_integer/0, neg_integer/0, range/2,
- float/0, non_neg_float/0, number/0, boolean/0, byte/0, char/0,
- list/0, tuple/0, string/0, wunion/1, term/0, timeout/0, arity/0]).
--export([int/0, nat/0, largeint/0, real/0, bool/0, choose/2, elements/1,
- oneof/1, frequency/1, return/1, default/2, orderedlist/1, function0/1,
- function1/1, function2/1, function3/1, function4/1,
- weighted_default/2]).
--export([resize/2, non_empty/1, noshrink/1]).
-
--export([cook_outer/1, is_type/1, equal_types/2, is_raw_type/1, to_binary/1,
- from_binary/1, get_prop/2, find_prop/2, safe_is_instance/2,
- is_instance/2, unwrap/1, weakly/1, strongly/1, satisfies_all/2,
- new_type/2, subtype/2]).
--export([lazy/1, sized/1, bind/3, shrinkwith/2, add_constraint/3,
- native_type/2, distlist/3, with_parameter/3, with_parameters/2,
- parameter/1, parameter/2]).
--export([le/2]).
-
--export_type([type/0, raw_type/0, extint/0, extnum/0]).
-
--include("proper_internal.hrl").
-
-
-%%------------------------------------------------------------------------------
-%% Comparison with erl_types
-%%------------------------------------------------------------------------------
-
-%% Missing types
-%% -------------------
-%% will do:
-%% records, maybe_improper_list(T,S), nonempty_improper_list(T,S)
-%% maybe_improper_list(), maybe_improper_list(T), iolist, iodata
-%% don't need:
-%% nonempty_{list,string,maybe_improper_list}
-%% won't do:
-%% pid, port, ref, identifier, none, no_return, module, mfa, node
-%% array, dict, digraph, set, gb_tree, gb_set, queue, tid
-
-%% Missing type information
-%% ------------------------
-%% bin types:
-%% other unit sizes? what about size info?
-%% functions:
-%% generally some fun, unspecified number of arguments but specified
-%% return type
-%% any:
-%% doesn't cover functions and improper lists
-
-
-%%------------------------------------------------------------------------------
-%% Type declaration macros
-%%------------------------------------------------------------------------------
-
--define(BASIC(PropList), new_type(PropList,basic)).
--define(WRAPPER(PropList), new_type(PropList,wrapper)).
--define(CONSTRUCTED(PropList), new_type(PropList,constructed)).
--define(CONTAINER(PropList), new_type(PropList,container)).
--define(SUBTYPE(Type,PropList), subtype(PropList,Type)).
-
-
-%%------------------------------------------------------------------------------
-%% Types
-%%------------------------------------------------------------------------------
-
--type type_kind() :: 'basic' | 'wrapper' | 'constructed' | 'container' | atom().
--type instance_test() :: fun((proper_gen:imm_instance()) -> boolean())
- | {'typed',
- fun((proper_types:type(),
- proper_gen:imm_instance()) -> boolean())}.
--type index() :: pos_integer().
-%% @alias
--type value() :: term().
-%% @private_type
-%% @alias
--type extint() :: integer() | 'inf'.
-%% @private_type
-%% @alias
--type extnum() :: number() | 'inf'.
--type constraint_fun() :: fun((proper_gen:instance()) -> boolean()).
-
--opaque type() :: {'$type', [type_prop()]}.
-%% A type of the PropEr type system
-%% @type raw_type(). You can consider this as an equivalent of {@type type()}.
--type raw_type() :: type() | [raw_type()] | loose_tuple(raw_type()) | term().
--type type_prop_name() :: 'kind' | 'generator' | 'reverse_gen' | 'parts_type'
- | 'combine' | 'alt_gens' | 'shrink_to_parts'
- | 'size_transform' | 'is_instance' | 'shrinkers'
- | 'noshrink' | 'internal_type' | 'internal_types'
- | 'get_length' | 'split' | 'join' | 'get_indices'
- | 'remove' | 'retrieve' | 'update' | 'constraints'
- | 'parameters' | 'env' | 'subenv'.
-
--type type_prop_value() :: term().
--type type_prop() ::
- {'kind', type_kind()}
- | {'generator', proper_gen:generator()}
- | {'reverse_gen', proper_gen:reverse_gen()}
- | {'parts_type', type()}
- | {'combine', proper_gen:combine_fun()}
- | {'alt_gens', proper_gen:alt_gens()}
- | {'shrink_to_parts', boolean()}
- | {'size_transform', fun((size()) -> size())}
- | {'is_instance', instance_test()}
- | {'shrinkers', [proper_shrink:shrinker()]}
- | {'noshrink', boolean()}
- | {'internal_type', raw_type()}
- | {'internal_types', tuple() | maybe_improper_list(type(),type() | [])}
- %% The items returned by 'remove' must be of this type.
- | {'get_length', fun((proper_gen:imm_instance()) -> length())}
- %% If this is a container type, this should return the number of elements
- %% it contains.
- | {'split', fun((proper_gen:imm_instance()) -> [proper_gen:imm_instance()])
- | fun((length(),proper_gen:imm_instance()) ->
- {proper_gen:imm_instance(),proper_gen:imm_instance()})}
- %% If present, the appropriate form depends on whether get_length is
- %% defined: if get_length is undefined, this must be in the one-argument
- %% form (e.g. a tree should be split into its subtrees), else it must be
- %% in the two-argument form (e.g. a list should be split in two at the
- %% index provided).
- | {'join', fun((proper_gen:imm_instance(),proper_gen:imm_instance()) ->
- proper_gen:imm_instance())}
- | {'get_indices', fun((proper_types:type(),
- proper_gen:imm_instance()) -> [index()])}
- %% If this is a container type, this should return a list of indices we
- %% can use to remove or insert elements from the given instance.
- | {'remove', fun((index(),proper_gen:imm_instance()) ->
- proper_gen:imm_instance())}
- | {'retrieve', fun((index(), proper_gen:imm_instance() | tuple()
- | maybe_improper_list(type(),type() | [])) ->
- value() | type())}
- | {'update', fun((index(),value(),proper_gen:imm_instance()) ->
- proper_gen:imm_instance())}
- | {'constraints', [{constraint_fun(), boolean()}]}
- %% A list of constraints on instances of this type: each constraint is a
- %% tuple of a fun that must return 'true' for each valid instance and a
- %% boolean field that specifies whether the condition is strict.
- | {'parameters', [{atom(),value()}]}
- | {'env', term()}
- | {'subenv', term()}.
-
-
-%%------------------------------------------------------------------------------
-%% Type manipulation functions
-%%------------------------------------------------------------------------------
-
-%% TODO: We shouldn't need the fully qualified type name in the range of these
-%% functions.
-
-%% @private
-%% TODO: just cook/1 ?
--spec cook_outer(raw_type()) -> proper_types:type().
-cook_outer(Type = {'$type',_Props}) ->
- Type;
-cook_outer(RawType) ->
- if
- is_tuple(RawType) -> tuple(tuple_to_list(RawType));
- %% CAUTION: this must handle improper lists
- is_list(RawType) -> fixed_list(RawType);
- %% default case (covers integers, floats, atoms, binaries, ...):
- true -> exactly(RawType)
- end.
-
-%% @private
--spec is_type(term()) -> boolean().
-is_type({'$type',_Props}) ->
- true;
-is_type(_) ->
- false.
-
-%% @private
--spec equal_types(proper_types:type(), proper_types:type()) -> boolean().
-equal_types(SameType, SameType) ->
- true;
-equal_types(_, _) ->
- false.
-
-%% @private
--spec is_raw_type(term()) -> boolean().
-is_raw_type({'$type',_TypeProps}) ->
- true;
-is_raw_type(X) ->
- if
- is_tuple(X) -> is_raw_type_list(tuple_to_list(X));
- is_list(X) -> is_raw_type_list(X);
- true -> false
- end.
-
--spec is_raw_type_list(maybe_improper_list()) -> boolean().
-%% CAUTION: this must handle improper lists
-is_raw_type_list(List) ->
- proper_arith:safe_any(fun is_raw_type/1, List).
-
-%% @private
--spec to_binary(proper_types:type()) -> binary().
-to_binary(Type) ->
- term_to_binary(Type).
-
-%% @private
-%% TODO: restore: -spec from_binary(binary()) -> proper_types:type().
-from_binary(Binary) ->
- binary_to_term(Binary).
-
--spec type_from_list([type_prop()]) -> proper_types:type().
-type_from_list(KeyValueList) ->
- {'$type',KeyValueList}.
-
--spec add_prop(type_prop_name(), type_prop_value(), proper_types:type()) ->
- proper_types:type().
-add_prop(PropName, Value, {'$type',Props}) ->
- {'$type',lists:keystore(PropName, 1, Props, {PropName, Value})}.
-
--spec add_props([type_prop()], proper_types:type()) -> proper_types:type().
-add_props(PropList, {'$type',OldProps}) ->
- {'$type', lists:foldl(fun({N,_}=NV,Acc) ->
- lists:keystore(N, 1, Acc, NV)
- end, OldProps, PropList)}.
-
--spec append_to_prop(type_prop_name(), type_prop_value(),
- proper_types:type()) -> proper_types:type().
-append_to_prop(PropName, Value, {'$type',Props}) ->
- Val = case lists:keyfind(PropName, 1, Props) of
- {PropName, V} ->
- V;
- _ ->
- []
- end,
- {'$type', lists:keystore(PropName, 1, Props,
- {PropName, lists:reverse([Value|Val])})}.
-
--spec append_list_to_prop(type_prop_name(), [type_prop_value()],
- proper_types:type()) -> proper_types:type().
-append_list_to_prop(PropName, List, {'$type',Props}) ->
- {PropName, Val} = lists:keyfind(PropName, 1, Props),
- {'$type', lists:keystore(PropName, 1, Props, {PropName, Val++List})}.
-
-%% @private
--spec get_prop(type_prop_name(), proper_types:type()) -> type_prop_value().
-get_prop(PropName, {'$type',Props}) ->
- {_PropName, Val} = lists:keyfind(PropName, 1, Props),
- Val.
-
-%% @private
--spec find_prop(type_prop_name(), proper_types:type()) ->
- {'ok',type_prop_value()} | 'error'.
-find_prop(PropName, {'$type',Props}) ->
- case lists:keyfind(PropName, 1, Props) of
- {PropName, Value} ->
- {ok, Value};
- _ ->
- error
- end.
-
-%% @private
--spec new_type([type_prop()], type_kind()) -> proper_types:type().
-new_type(PropList, Kind) ->
- Type = type_from_list(PropList),
- add_prop(kind, Kind, Type).
-
-%% @private
--spec subtype([type_prop()], proper_types:type()) -> proper_types:type().
-%% TODO: should the 'is_instance' function etc. be reset for subtypes?
-subtype(PropList, Type) ->
- add_props(PropList, Type).
-
-%% @private
--spec is_inst(proper_gen:instance(), raw_type()) ->
- boolean() | {'error',{'typeserver',term()}}.
-is_inst(Instance, RawType) ->
- is_inst(Instance, RawType, 10).
-
-%% @private
--spec is_inst(proper_gen:instance(), raw_type(), size()) ->
- boolean() | {'error',{'typeserver',term()}}.
-is_inst(Instance, RawType, Size) ->
- proper:global_state_init_size(Size),
- Result = safe_is_instance(Instance, RawType),
- proper:global_state_erase(),
- Result.
-
-%% @private
--spec safe_is_instance(proper_gen:imm_instance(), raw_type()) ->
- boolean() | {'error',{'typeserver',term()}}.
-safe_is_instance(ImmInstance, RawType) ->
- try is_instance(ImmInstance, RawType) catch
- throw:{'$typeserver',SubReason} -> {error, {typeserver,SubReason}}
- end.
-
-%% @private
--spec is_instance(proper_gen:imm_instance(), raw_type()) -> boolean().
-%% TODO: If the second argument is not a type, let it pass (don't even check for
-%% term equality?) - if it's a raw type, don't cook it, instead recurse
-%% into it.
-is_instance(ImmInstance, RawType) ->
- CleanInstance = proper_gen:clean_instance(ImmInstance),
- Type = cook_outer(RawType),
- (case get_prop(kind, Type) of
- wrapper -> wrapper_test(ImmInstance, Type);
- constructed -> constructed_test(ImmInstance, Type);
- _ -> false
- end
- orelse
- case find_prop(is_instance, Type) of
- {ok,{typed, IsInstance}} -> IsInstance(Type, ImmInstance);
- {ok,IsInstance} -> IsInstance(ImmInstance);
- error -> false
- end)
- andalso weakly(satisfies_all(CleanInstance, Type)).
-
--spec wrapper_test(proper_gen:imm_instance(), proper_types:type()) -> boolean().
-wrapper_test(ImmInstance, Type) ->
- %% TODO: check if it's actually a raw type that's returned?
- lists:any(fun(T) -> is_instance(ImmInstance, T) end, unwrap(Type)).
-
-%% @private
-%% TODO: restore:-spec unwrap(proper_types:type()) -> [proper_types:type(),...].
-%% TODO: check if it's actually a raw type that's returned?
-unwrap(Type) ->
- RawInnerTypes = proper_gen:alt_gens(Type) ++ [proper_gen:normal_gen(Type)],
- [cook_outer(T) || T <- RawInnerTypes].
-
--spec constructed_test(proper_gen:imm_instance(), proper_types:type()) ->
- boolean().
-constructed_test({'$used',ImmParts,ImmInstance}, Type) ->
- PartsType = get_prop(parts_type, Type),
- Combine = get_prop(combine, Type),
- is_instance(ImmParts, PartsType) andalso
- begin
- %% TODO: check if it's actually a raw type that's returned?
- %% TODO: move construction code to proper_gen
- %% TODO: non-type => should we check for strict term equality?
- RawInnerType = Combine(proper_gen:clean_instance(ImmParts)),
- is_instance(ImmInstance, RawInnerType)
- end;
-constructed_test({'$to_part',ImmInstance}, Type) ->
- PartsType = get_prop(parts_type, Type),
- get_prop(shrink_to_parts, Type) =:= true andalso
- %% TODO: we reject non-container types
- get_prop(kind, PartsType) =:= container andalso
- case {find_prop(internal_type,PartsType),
- find_prop(internal_types,PartsType)} of
- {{ok,EachPartType},error} ->
- %% The parts are in a list or a vector.
- is_instance(ImmInstance, EachPartType);
- {error,{ok,PartTypesList}} ->
- %% The parts are in a fixed list.
- %% TODO: It should always be a proper list.
- lists:any(fun(T) -> is_instance(ImmInstance,T) end, PartTypesList)
- end;
-constructed_test(_CleanInstance, _Type) ->
- %% TODO: can we do anything better?
- false.
-
-%% @private
--spec weakly({boolean(),boolean()}) -> boolean().
-weakly({B1,_B2}) -> B1.
-
-%% @private
--spec strongly({boolean(),boolean()}) -> boolean().
-strongly({_B1,B2}) -> B2.
-
--spec satisfies(proper_gen:instance(), {constraint_fun(),boolean()})
- -> {boolean(),boolean()}.
-satisfies(Instance, {Test,false}) ->
- {true,Test(Instance)};
-satisfies(Instance, {Test,true}) ->
- Result = Test(Instance),
- {Result,Result}.
-
-%% @private
--spec satisfies_all(proper_gen:instance(), proper_types:type()) ->
- {boolean(),boolean()}.
-satisfies_all(Instance, Type) ->
- case find_prop(constraints, Type) of
- {ok, Constraints} ->
- L = [satisfies(Instance, C) || C <- Constraints],
- {L1,L2} = lists:unzip(L),
- {lists:all(fun(B) -> B end, L1), lists:all(fun(B) -> B end, L2)};
- error ->
- {true,true}
- end.
-
-
-%%------------------------------------------------------------------------------
-%% Type definition functions
-%%------------------------------------------------------------------------------
-
-%% @private
--spec lazy(proper_gen:nosize_generator()) -> proper_types:type().
-lazy(Gen) ->
- ?WRAPPER([
- {generator, Gen}
- ]).
-
-%% @private
--spec sized(proper_gen:sized_generator()) -> proper_types:type().
-sized(Gen) ->
- ?WRAPPER([
- {generator, Gen}
- ]).
-
-%% @private
--spec bind(raw_type(), proper_gen:combine_fun(), boolean()) ->
- proper_types:type().
-bind(RawPartsType, Combine, ShrinkToParts) ->
- PartsType = cook_outer(RawPartsType),
- ?CONSTRUCTED([
- {parts_type, PartsType},
- {combine, Combine},
- {shrink_to_parts, ShrinkToParts}
- ]).
-
-%% @private
--spec shrinkwith(proper_gen:nosize_generator(), proper_gen:alt_gens()) ->
- proper_types:type().
-shrinkwith(Gen, DelaydAltGens) ->
- ?WRAPPER([
- {generator, Gen},
- {alt_gens, DelaydAltGens}
- ]).
-
-%% @private
--spec add_constraint(raw_type(), constraint_fun(), boolean()) ->
- proper_types:type().
-add_constraint(RawType, Condition, IsStrict) ->
- Type = cook_outer(RawType),
- append_to_prop(constraints, {Condition,IsStrict}, Type).
-
-%% @private
--spec native_type(mod_name(), string()) -> proper_types:type().
-native_type(Mod, TypeStr) ->
- ?WRAPPER([
- {generator, fun() -> proper_gen:native_type_gen(Mod,TypeStr) end}
- ]).
-
-
-%%------------------------------------------------------------------------------
-%% Basic types
-%%------------------------------------------------------------------------------
-
-%% @doc All integers between `Low' and `High', bounds included.
-%% `Low' and `High' must be Erlang expressions that evaluate to integers, with
-%% `Low =< High'. Additionally, `Low' and `High' may have the value `inf', in
-%% which case they represent minus infinity and plus infinity respectively.
-%% Instances shrink towards 0 if `Low =< 0 =< High', or towards the bound with
-%% the smallest absolute value otherwise.
--spec integer(extint(), extint()) -> proper_types:type().
-integer(Low, High) ->
- ?BASIC([
- {env, {Low, High}},
- {generator, {typed, fun integer_gen/2}},
- {is_instance, {typed, fun integer_is_instance/2}},
- {shrinkers, [fun number_shrinker/3]}
- ]).
-
-integer_gen(Type, Size) ->
- {Low, High} = get_prop(env, Type),
- proper_gen:integer_gen(Size, Low, High).
-
-integer_is_instance(Type, X) ->
- {Low, High} = get_prop(env, Type),
- is_integer(X) andalso le(Low, X) andalso le(X, High).
-
-number_shrinker(X, Type, S) ->
- {Low, High} = get_prop(env, Type),
- proper_shrink:number_shrinker(X, Low, High, S).
-
-%% @doc All floats between `Low' and `High', bounds included.
-%% `Low' and `High' must be Erlang expressions that evaluate to floats, with
-%% `Low =< High'. Additionally, `Low' and `High' may have the value `inf', in
-%% which case they represent minus infinity and plus infinity respectively.
-%% Instances shrink towards 0.0 if `Low =< 0.0 =< High', or towards the bound
-%% with the smallest absolute value otherwise.
--spec float(extnum(), extnum()) -> proper_types:type().
-float(Low, High) ->
- ?BASIC([
- {env, {Low, High}},
- {generator, {typed, fun float_gen/2}},
- {is_instance, {typed, fun float_is_instance/2}},
- {shrinkers, [fun number_shrinker/3]}
- ]).
-
-float_gen(Type, Size) ->
- {Low, High} = get_prop(env, Type),
- proper_gen:float_gen(Size, Low, High).
-
-float_is_instance(Type, X) ->
- {Low, High} = get_prop(env, Type),
- is_float(X) andalso le(Low, X) andalso le(X, High).
-
-%% @private
--spec le(extnum(), extnum()) -> boolean().
-le(inf, _B) -> true;
-le(_A, inf) -> true;
-le(A, B) -> A =< B.
-
-%% @doc All atoms. All atoms used internally by PropEr start with a '`$'', so
-%% such atoms will never be produced as instances of this type. You should also
-%% refrain from using such atoms in your code, to avoid a potential clash.
-%% Instances shrink towards the empty atom, ''.
--spec atom() -> proper_types:type().
-atom() ->
- ?WRAPPER([
- {generator, fun proper_gen:atom_gen/1},
- {reverse_gen, fun proper_gen:atom_rev/1},
- {size_transform, fun(Size) -> erlang:min(Size,255) end},
- {is_instance, fun atom_is_instance/1}
- ]).
-
-atom_is_instance(X) ->
- is_atom(X)
- %% We return false for atoms starting with '$', since these are
- %% atoms used internally and never produced by the atom generator.
- andalso (X =:= '' orelse hd(atom_to_list(X)) =/= $$).
-
-%% @doc All binaries. Instances shrink towards the empty binary, `<<>>'.
--spec binary() -> proper_types:type().
-binary() ->
- ?WRAPPER([
- {generator, fun proper_gen:binary_gen/1},
- {reverse_gen, fun proper_gen:binary_rev/1},
- {is_instance, fun erlang:is_binary/1}
- ]).
-
-%% @doc All binaries with a byte size of `Len'.
-%% `Len' must be an Erlang expression that evaluates to a non-negative integer.
-%% Instances shrink towards binaries of zeroes.
--spec binary(length()) -> proper_types:type().
-binary(Len) ->
- ?WRAPPER([
- {env, Len},
- {generator, {typed, fun binary_len_gen/1}},
- {reverse_gen, fun proper_gen:binary_rev/1},
- {is_instance, {typed, fun binary_len_is_instance/2}}
- ]).
-
-binary_len_gen(Type) ->
- Len = get_prop(env, Type),
- proper_gen:binary_len_gen(Len).
-
-binary_len_is_instance(Type, X) ->
- Len = get_prop(env, Type),
- is_binary(X) andalso byte_size(X) =:= Len.
-
-%% @doc All bitstrings. Instances shrink towards the empty bitstring, `<<>>'.
--spec bitstring() -> proper_types:type().
-bitstring() ->
- ?WRAPPER([
- {generator, fun proper_gen:bitstring_gen/1},
- {reverse_gen, fun proper_gen:bitstring_rev/1},
- {is_instance, fun erlang:is_bitstring/1}
- ]).
-
-%% @doc All bitstrings with a bit size of `Len'.
-%% `Len' must be an Erlang expression that evaluates to a non-negative integer.
-%% Instances shrink towards bitstrings of zeroes
--spec bitstring(length()) -> proper_types:type().
-bitstring(Len) ->
- ?WRAPPER([
- {env, Len},
- {generator, {typed, fun bitstring_len_gen/1}},
- {reverse_gen, fun proper_gen:bitstring_rev/1},
- {is_instance, {typed, fun bitstring_len_is_instance/2}}
- ]).
-
-bitstring_len_gen(Type) ->
- Len = get_prop(env, Type),
- proper_gen:bitstring_len_gen(Len).
-
-bitstring_len_is_instance(Type, X) ->
- Len = get_prop(env, Type),
- is_bitstring(X) andalso bit_size(X) =:= Len.
-
-%% @doc All lists containing elements of type `ElemType'.
-%% Instances shrink towards the empty list, `[]'.
--spec list(ElemType::raw_type()) -> proper_types:type().
-% TODO: subtyping would be useful here (list, vector, fixed_list)
-list(RawElemType) ->
- ElemType = cook_outer(RawElemType),
- ?CONTAINER([
- {generator, {typed, fun list_gen/2}},
- {is_instance, {typed, fun list_is_instance/2}},
- {internal_type, ElemType},
- {get_length, fun erlang:length/1},
- {split, fun lists:split/2},
- {join, fun lists:append/2},
- {get_indices, fun list_get_indices/2},
- {remove, fun proper_arith:list_remove/2},
- {retrieve, fun lists:nth/2},
- {update, fun proper_arith:list_update/3}
- ]).
-
-list_gen(Type, Size) ->
- ElemType = get_prop(internal_type, Type),
- proper_gen:list_gen(Size, ElemType).
-
-list_is_instance(Type, X) ->
- ElemType = get_prop(internal_type, Type),
- list_test(X, ElemType).
-
-%% @doc A type that generates exactly the list `List'. Instances shrink towards
-%% shorter sublists of the original list.
--spec shrink_list([term()]) -> proper_types:type().
-shrink_list(List) ->
- ?CONTAINER([
- {env, List},
- {generator, {typed, fun shrink_list_gen/1}},
- {is_instance, {typed, fun shrink_list_is_instance/2}},
- {get_length, fun erlang:length/1},
- {split, fun lists:split/2},
- {join, fun lists:append/2},
- {get_indices, fun list_get_indices/2},
- {remove, fun proper_arith:list_remove/2}
- ]).
-
-shrink_list_gen(Type) ->
- get_prop(env, Type).
-
-shrink_list_is_instance(Type, X) ->
- List = get_prop(env, Type),
- is_sublist(X, List).
-
--spec is_sublist([term()], [term()]) -> boolean().
-is_sublist([], _) -> true;
-is_sublist(_, []) -> false;
-is_sublist([H|T1], [H|T2]) -> is_sublist(T1, T2);
-is_sublist(Slice, [_|T2]) -> is_sublist(Slice, T2).
-
--spec list_test(proper_gen:imm_instance(), proper_types:type()) -> boolean().
-list_test(X, ElemType) ->
- is_list(X) andalso lists:all(fun(E) -> is_instance(E, ElemType) end, X).
-
-%% @private
--spec list_get_indices(proper_gen:generator(), list()) -> [position()].
-list_get_indices(_, List) ->
- lists:seq(1, length(List)).
-
-%% @private
-%% This assumes that:
-%% - instances of size S are always valid instances of size >S
-%% - any recursive calls inside Gen are lazy
--spec distlist(size(), proper_gen:sized_generator(), boolean()) ->
- proper_types:type().
-distlist(Size, Gen, NonEmpty) ->
- ParentType = case NonEmpty of
- true -> non_empty(list(Gen(Size)));
- false -> list(Gen(Size))
- end,
- ?SUBTYPE(ParentType, [
- {subenv, {Size, Gen, NonEmpty}},
- {generator, {typed, fun distlist_gen/1}}
- ]).
-
-distlist_gen(Type) ->
- {Size, Gen, NonEmpty} = get_prop(subenv, Type),
- proper_gen:distlist_gen(Size, Gen, NonEmpty).
-
-%% @doc All lists of length `Len' containing elements of type `ElemType'.
-%% `Len' must be an Erlang expression that evaluates to a non-negative integer.
--spec vector(length(), ElemType::raw_type()) -> proper_types:type().
-vector(Len, RawElemType) ->
- ElemType = cook_outer(RawElemType),
- ?CONTAINER([
- {env, Len},
- {generator, {typed, fun vector_gen/1}},
- {is_instance, {typed, fun vector_is_instance/2}},
- {internal_type, ElemType},
- {get_indices, fun vector_get_indices/2},
- {retrieve, fun lists:nth/2},
- {update, fun proper_arith:list_update/3}
- ]).
-
-vector_gen(Type) ->
- Len = get_prop(env, Type),
- ElemType = get_prop(internal_type, Type),
- proper_gen:vector_gen(Len, ElemType).
-
-vector_is_instance(Type, X) ->
- Len = get_prop(env, Type),
- ElemType = get_prop(internal_type, Type),
- is_list(X)
- andalso length(X) =:= Len
- andalso lists:all(fun(E) -> is_instance(E, ElemType) end, X).
-
-vector_get_indices(Type, _X) ->
- lists:seq(1, get_prop(env, Type)).
-
-%% @doc The union of all types in `ListOfTypes'. `ListOfTypes' can't be empty.
-%% The random instance generator is equally likely to choose any one of the
-%% types in `ListOfTypes'. The shrinking subsystem will always try to shrink an
-%% instance of a type union to an instance of the first type in `ListOfTypes',
-%% thus you should write the simplest case first.
--spec union(ListOfTypes::[raw_type(),...]) -> proper_types:type().
-union(RawChoices) ->
- Choices = [cook_outer(C) || C <- RawChoices],
- ?BASIC([
- {env, Choices},
- {generator, {typed, fun union_gen/1}},
- {is_instance, {typed, fun union_is_instance/2}},
- {shrinkers, [fun union_shrinker_1/3, fun union_shrinker_2/3]}
- ]).
-
-union_gen(Type) ->
- Choices = get_prop(env,Type),
- proper_gen:union_gen(Choices).
-
-union_is_instance(Type, X) ->
- Choices = get_prop(env, Type),
- lists:any(fun(C) -> is_instance(X, C) end, Choices).
-
-union_shrinker_1(X, Type, S) ->
- Choices = get_prop(env, Type),
- proper_shrink:union_first_choice_shrinker(X, Choices, S).
-
-union_shrinker_2(X, Type, S) ->
- Choices = get_prop(env, Type),
- proper_shrink:union_recursive_shrinker(X, Choices, S).
-
-%% @doc A specialization of {@link union/1}, where each type in `ListOfTypes' is
-%% assigned a frequency. Frequencies must be Erlang expressions that evaluate to
-%% positive integers. Types with larger frequencies are more likely to be chosen
-%% by the random instance generator. The shrinking subsystem will ignore the
-%% frequencies and try to shrink towards the first type in the list.
--spec weighted_union(ListOfTypes::[{frequency(),raw_type()},...]) ->
- proper_types:type().
-weighted_union(RawFreqChoices) ->
- CookFreqType = fun({Freq,RawType}) -> {Freq,cook_outer(RawType)} end,
- FreqChoices = lists:map(CookFreqType, RawFreqChoices),
- Choices = [T || {_F,T} <- FreqChoices],
- ?SUBTYPE(union(Choices), [
- {subenv, FreqChoices},
- {generator, {typed, fun weighted_union_gen/1}}
- ]).
-
-weighted_union_gen(Gen) ->
- FreqChoices = get_prop(subenv, Gen),
- proper_gen:weighted_union_gen(FreqChoices).
-
-%% @private
--spec safe_union([raw_type(),...]) -> proper_types:type().
-safe_union(RawChoices) ->
- Choices = [cook_outer(C) || C <- RawChoices],
- subtype(
- [{subenv, Choices},
- {generator, {typed, fun safe_union_gen/1}}],
- union(Choices)).
-
-safe_union_gen(Type) ->
- Choices = get_prop(subenv, Type),
- proper_gen:safe_union_gen(Choices).
-
-%% @private
--spec safe_weighted_union([{frequency(),raw_type()},...]) ->
- proper_types:type().
-safe_weighted_union(RawFreqChoices) ->
- CookFreqType = fun({Freq,RawType}) ->
- {Freq,cook_outer(RawType)} end,
- FreqChoices = lists:map(CookFreqType, RawFreqChoices),
- Choices = [T || {_F,T} <- FreqChoices],
- subtype([{subenv, FreqChoices},
- {generator, {typed, fun safe_weighted_union_gen/1}}],
- union(Choices)).
-
-safe_weighted_union_gen(Type) ->
- FreqChoices = get_prop(subenv, Type),
- proper_gen:safe_weighted_union_gen(FreqChoices).
-
-%% @doc All tuples whose i-th element is an instance of the type at index i of
-%% `ListOfTypes'. Also written simply as a tuple of types.
--spec tuple(ListOfTypes::[raw_type()]) -> proper_types:type().
-tuple(RawFields) ->
- Fields = [cook_outer(F) || F <- RawFields],
- ?CONTAINER([
- {env, Fields},
- {generator, {typed, fun tuple_gen/1}},
- {is_instance, {typed, fun tuple_is_instance/2}},
- {internal_types, list_to_tuple(Fields)},
- {get_indices, fun tuple_get_indices/2},
- {retrieve, fun erlang:element/2},
- {update, fun tuple_update/3}
- ]).
-
-tuple_gen(Type) ->
- Fields = get_prop(env, Type),
- proper_gen:tuple_gen(Fields).
-
-tuple_is_instance(Type, X) ->
- Fields = get_prop(env, Type),
- is_tuple(X) andalso fixed_list_test(tuple_to_list(X), Fields).
-
-tuple_get_indices(Type, _X) ->
- lists:seq(1, length(get_prop(env, Type))).
-
--spec tuple_update(index(), value(), tuple()) -> tuple().
-tuple_update(Index, NewElem, Tuple) ->
- setelement(Index, Tuple, NewElem).
-
-%% @doc Tuples whose elements are all of type `ElemType'.
-%% Instances shrink towards the 0-size tuple, `{}'.
--spec loose_tuple(ElemType::raw_type()) -> proper_types:type().
-loose_tuple(RawElemType) ->
- ElemType = cook_outer(RawElemType),
- ?WRAPPER([
- {env, ElemType},
- {generator, {typed, fun loose_tuple_gen/2}},
- {reverse_gen, {typed, fun loose_tuple_rev/2}},
- {is_instance, {typed, fun loose_tuple_is_instance/2}}
- ]).
-
-loose_tuple_gen(Type, Size) ->
- ElemType = get_prop(env, Type),
- proper_gen:loose_tuple_gen(Size, ElemType).
-
-loose_tuple_rev(Type, X) ->
- ElemType = get_prop(env, Type),
- proper_gen:loose_tuple_rev(X, ElemType).
-
-loose_tuple_is_instance(Type, X) ->
- ElemType = get_prop(env, Type),
- is_tuple(X) andalso list_test(tuple_to_list(X), ElemType).
-
-%% @doc Singleton type consisting only of `E'. `E' must be an evaluated term.
-%% Also written simply as `E'.
--spec exactly(term()) -> proper_types:type().
-exactly(E) ->
- ?BASIC([
- {env, E},
- {generator, {typed, fun exactly_gen/1}},
- {is_instance, {typed, fun exactly_is_instance/2}}
- ]).
-
-exactly_gen(Type) ->
- E = get_prop(env, Type),
- proper_gen:exactly_gen(E).
-
-exactly_is_instance(Type, X) ->
- E = get_prop(env, Type),
- X =:= E.
-
-%% @doc All lists whose i-th element is an instance of the type at index i of
-%% `ListOfTypes'. Also written simply as a list of types.
--spec fixed_list(ListOfTypes::maybe_improper_list(raw_type(),raw_type()|[])) ->
- proper_types:type().
-fixed_list(MaybeImproperRawFields) ->
- %% CAUTION: must handle improper lists
- {Fields, Internal, Len, Retrieve, Update} =
- case proper_arith:cut_improper_tail(MaybeImproperRawFields) of
- % TODO: have cut_improper_tail return the length and use it in test?
- {ProperRawHead, ImproperRawTail} ->
- HeadLen = length(ProperRawHead),
- CookedHead = [cook_outer(F) || F <- ProperRawHead],
- CookedTail = cook_outer(ImproperRawTail),
- {{CookedHead,CookedTail},
- CookedHead ++ CookedTail,
- HeadLen + 1,
- fun(I,L) -> improper_list_retrieve(I, L, HeadLen) end,
- fun(I,V,L) -> improper_list_update(I, V, L, HeadLen) end};
- ProperRawFields ->
- LocalFields = [cook_outer(F) || F <- ProperRawFields],
- {LocalFields,
- LocalFields,
- length(ProperRawFields),
- fun lists:nth/2,
- fun proper_arith:list_update/3}
- end,
- ?CONTAINER([
- {env, {Fields, Len}},
- {generator, {typed, fun fixed_list_gen/1}},
- {is_instance, {typed, fun fixed_list_is_instance/2}},
- {internal_types, Internal},
- {get_indices, fun fixed_list_get_indices/2},
- {retrieve, Retrieve},
- {update, Update}
- ]).
-
-fixed_list_gen(Type) ->
- {Fields, _} = get_prop(env, Type),
- proper_gen:fixed_list_gen(Fields).
-
-fixed_list_is_instance(Type, X) ->
- {Fields, _} = get_prop(env, Type),
- fixed_list_test(X, Fields).
-
-fixed_list_get_indices(Type, _X) ->
- {_, Len} = get_prop(env, Type),
- lists:seq(1, Len).
-
--spec fixed_list_test(proper_gen:imm_instance(),
- [proper_types:type()] | {[proper_types:type()],
- proper_types:type()}) ->
- boolean().
-fixed_list_test(X, {ProperHead,ImproperTail}) ->
- is_list(X) andalso
- begin
- ProperHeadLen = length(ProperHead),
- proper_arith:head_length(X) >= ProperHeadLen andalso
- begin
- {XHead,XTail} = lists:split(ProperHeadLen, X),
- fixed_list_test(XHead, ProperHead)
- andalso is_instance(XTail, ImproperTail)
- end
- end;
-fixed_list_test(X, ProperFields) ->
- is_list(X)
- andalso length(X) =:= length(ProperFields)
- andalso lists:all(fun({E,T}) -> is_instance(E, T) end,
- lists:zip(X, ProperFields)).
-
-%% TODO: Move these 2 functions to proper_arith?
--spec improper_list_retrieve(index(), nonempty_improper_list(value(),value()),
- pos_integer()) -> value().
-improper_list_retrieve(Index, List, HeadLen) ->
- case Index =< HeadLen of
- true -> lists:nth(Index, List);
- false -> lists:nthtail(HeadLen, List)
- end.
-
--spec improper_list_update(index(), value(),
- nonempty_improper_list(value(),value()),
- pos_integer()) ->
- nonempty_improper_list(value(),value()).
-improper_list_update(Index, Value, List, HeadLen) ->
- case Index =< HeadLen of
- %% TODO: This happens to work, but is not implied by list_update's spec.
- true -> proper_arith:list_update(Index, Value, List);
- false -> lists:sublist(List, HeadLen) ++ Value
- end.
-
-%% @doc All pure functions that map instances of `ArgTypes' to instances of
-%% `RetType'. The syntax `function(Arity, RetType)' is also acceptable.
--spec function(ArgTypes::[raw_type()] | arity(), RetType::raw_type()) ->
- proper_types:type().
-function(Arity, RawRetType) when is_integer(Arity), Arity >= 0, Arity =< 255 ->
- RetType = cook_outer(RawRetType),
- ?BASIC([
- {env, {Arity, RetType}},
- {generator, {typed, fun function_gen/1}},
- {is_instance, {typed, fun function_is_instance/2}}
- ]);
-function(RawArgTypes, RawRetType) ->
- function(length(RawArgTypes), RawRetType).
-
-function_gen(Type) ->
- {Arity, RetType} = get_prop(env, Type),
- proper_gen:function_gen(Arity, RetType).
-
-function_is_instance(Type, X) ->
- {Arity, RetType} = get_prop(env, Type),
- is_function(X, Arity)
- %% TODO: what if it's not a function we produced?
- andalso equal_types(RetType, proper_gen:get_ret_type(X)).
-
-%% @doc All Erlang terms (that PropEr can produce). For reasons of efficiency,
-%% functions are never produced as instances of this type.<br />
-%% CAUTION: Instances of this type are expensive to produce, shrink and instance-
-%% check, both in terms of processing time and consumed memory. Only use this
-%% type if you are certain that you need it.
--spec any() -> proper_types:type().
-any() ->
- AllTypes = [integer(),float(),atom(),bitstring(),?LAZY(loose_tuple(any())),
- ?LAZY(list(any()))],
- ?SUBTYPE(union(AllTypes), [
- {generator, fun proper_gen:any_gen/1}
- ]).
-
-
-%%------------------------------------------------------------------------------
-%% Type aliases
-%%------------------------------------------------------------------------------
-
-%% @equiv integer(inf, inf)
--spec integer() -> proper_types:type().
-integer() -> integer(inf, inf).
-
-%% @equiv integer(0, inf)
--spec non_neg_integer() -> proper_types:type().
-non_neg_integer() -> integer(0, inf).
-
-%% @equiv integer(1, inf)
--spec pos_integer() -> proper_types:type().
-pos_integer() -> integer(1, inf).
-
-%% @equiv integer(inf, -1)
--spec neg_integer() -> proper_types:type().
-neg_integer() -> integer(inf, -1).
-
-%% @equiv integer(Low, High)
--spec range(extint(), extint()) -> proper_types:type().
-range(Low, High) -> integer(Low, High).
-
-%% @equiv float(inf, inf)
--spec float() -> proper_types:type().
-float() -> float(inf, inf).
-
-%% @equiv float(0.0, inf)
--spec non_neg_float() -> proper_types:type().
-non_neg_float() -> float(0.0, inf).
-
-%% @equiv union([integer(), float()])
--spec number() -> proper_types:type().
-number() -> union([integer(), float()]).
-
-%% @doc The atoms `true' and `false'. Instances shrink towards `false'.
--spec boolean() -> proper_types:type().
-boolean() -> union(['false', 'true']).
-
-%% @equiv integer(0, 255)
--spec byte() -> proper_types:type().
-byte() -> integer(0, 255).
-
-%% @equiv integer(0, 16#10ffff)
--spec char() -> proper_types:type().
-char() -> integer(0, 16#10ffff).
-
-%% @equiv list(any())
--spec list() -> proper_types:type().
-list() -> list(any()).
-
-%% @equiv loose_tuple(any())
--spec tuple() -> proper_types:type().
-tuple() -> loose_tuple(any()).
-
-%% @equiv list(char())
--spec string() -> proper_types:type().
-string() -> list(char()).
-
-%% @equiv weighted_union(FreqChoices)
--spec wunion([{frequency(),raw_type()},...]) -> proper_types:type().
-wunion(FreqChoices) -> weighted_union(FreqChoices).
-
-%% @equiv any()
--spec term() -> proper_types:type().
-term() -> any().
-
-%% @equiv union([non_neg_integer() | infinity])
--spec timeout() -> proper_types:type().
-timeout() -> union([non_neg_integer(), 'infinity']).
-
-%% @equiv integer(0, 255)
--spec arity() -> proper_types:type().
-arity() -> integer(0, 255).
-
-
-%%------------------------------------------------------------------------------
-%% QuickCheck compatibility types
-%%------------------------------------------------------------------------------
-
-%% @doc Small integers (bound by the current value of the `size' parameter).
-%% Instances shrink towards `0'.
--spec int() -> proper_types:type().
-int() -> ?SIZED(Size, integer(-Size,Size)).
-
-%% @doc Small non-negative integers (bound by the current value of the `size'
-%% parameter). Instances shrink towards `0'.
--spec nat() -> proper_types:type().
-nat() -> ?SIZED(Size, integer(0,Size)).
-
-%% @equiv integer()
--spec largeint() -> proper_types:type().
-largeint() -> integer().
-
-%% @equiv float()
--spec real() -> proper_types:type().
-real() -> float().
-
-%% @equiv boolean()
--spec bool() -> proper_types:type().
-bool() -> boolean().
-
-%% @equiv integer(Low, High)
--spec choose(extint(), extint()) -> proper_types:type().
-choose(Low, High) -> integer(Low, High).
-
-%% @equiv union(Choices)
--spec elements([raw_type(),...]) -> proper_types:type().
-elements(Choices) -> union(Choices).
-
-%% @equiv union(Choices)
--spec oneof([raw_type(),...]) -> proper_types:type().
-oneof(Choices) -> union(Choices).
-
-%% @equiv weighted_union(Choices)
--spec frequency([{frequency(),raw_type()},...]) -> proper_types:type().
-frequency(FreqChoices) -> weighted_union(FreqChoices).
-
-%% @equiv exactly(E)
--spec return(term()) -> proper_types:type().
-return(E) -> exactly(E).
-
-%% @doc Adds a default value, `Default', to `Type'.
-%% The default serves as a primary shrinking target for instances, while it
-%% is also chosen by the random instance generation subsystem half the time.
--spec default(raw_type(), raw_type()) -> proper_types:type().
-default(Default, Type) ->
- union([Default, Type]).
-
-%% @doc All sorted lists containing elements of type `ElemType'.
-%% Instances shrink towards the empty list, `[]'.
--spec orderedlist(ElemType::raw_type()) -> proper_types:type().
-orderedlist(RawElemType) ->
- ?LET(L, list(RawElemType), lists:sort(L)).
-
-%% @equiv function(0, RetType)
--spec function0(raw_type()) -> proper_types:type().
-function0(RetType) ->
- function(0, RetType).
-
-%% @equiv function(1, RetType)
--spec function1(raw_type()) -> proper_types:type().
-function1(RetType) ->
- function(1, RetType).
-
-%% @equiv function(2, RetType)
--spec function2(raw_type()) -> proper_types:type().
-function2(RetType) ->
- function(2, RetType).
-
-%% @equiv function(3, RetType)
--spec function3(raw_type()) -> proper_types:type().
-function3(RetType) ->
- function(3, RetType).
-
-%% @equiv function(4, RetType)
--spec function4(raw_type()) -> proper_types:type().
-function4(RetType) ->
- function(4, RetType).
-
-%% @doc A specialization of {@link default/2}, where `Default' and `Type' are
-%% assigned weights to be considered by the random instance generator. The
-%% shrinking subsystem will ignore the weights and try to shrink using the
-%% default value.
--spec weighted_default({frequency(),raw_type()}, {frequency(),raw_type()}) ->
- proper_types:type().
-weighted_default(Default, Type) ->
- weighted_union([Default, Type]).
-
-
-%%------------------------------------------------------------------------------
-%% Additional type specification functions
-%%------------------------------------------------------------------------------
-
-%% @doc Overrides the `size' parameter used when generating instances of
-%% `Type' with `NewSize'. Has no effect on size-less types, such as unions.
-%% Also, this will not affect the generation of any internal types contained in
-%% `Type', such as the elements of a list - those will still be generated
-%% using the test-wide value of `size'. One use of this function is to modify
-%% types to produce instances that grow faster or slower, like so:
-%% ```?SIZED(Size, resize(Size * 2, list(integer()))'''
-%% The above specifies a list type that grows twice as fast as normal lists.
--spec resize(size(), Type::raw_type()) -> proper_types:type().
-resize(NewSize, RawType) ->
- Type = cook_outer(RawType),
- case find_prop(size_transform, Type) of
- {ok,Transform} ->
- add_prop(size_transform, fun(_S) -> Transform(NewSize) end, Type);
- error ->
- add_prop(size_transform, fun(_S) -> NewSize end, Type)
- end.
-
-%% @doc This is a predefined constraint that can be applied to random-length
-%% list and binary types to ensure that the produced values are never empty.
-%%
-%% e.g. {@link list/0}, {@link string/0}, {@link binary/0})
--spec non_empty(ListType::raw_type()) -> proper_types:type().
-non_empty(RawListType) ->
- ?SUCHTHAT(L, RawListType, L =/= [] andalso L =/= <<>>).
-
-%% @doc Creates a new type which is equivalent to `Type', but whose instances
-%% are never shrunk by the shrinking subsystem.
--spec noshrink(Type::raw_type()) -> proper_types:type().
-noshrink(RawType) ->
- add_prop(noshrink, true, cook_outer(RawType)).
-
-%% @doc Associates the atom key `Parameter' with the value `Value' while
-%% generating instances of `Type'.
--spec with_parameter(atom(), value(), Type::raw_type()) -> proper_types:type().
-with_parameter(Parameter, Value, RawType) ->
- with_parameters([{Parameter,Value}], RawType).
-
-%% @doc Similar to {@link with_parameter/3}, but accepts a list of
-%% `{Parameter, Value}' pairs.
--spec with_parameters([{atom(),value()}], Type::raw_type()) ->
- proper_types:type().
-with_parameters(PVlist, RawType) ->
- Type = cook_outer(RawType),
- case find_prop(parameters, Type) of
- {ok,Params} when is_list(Params) ->
- append_list_to_prop(parameters, PVlist, Type);
- error ->
- add_prop(parameters, PVlist, Type)
- end.
-
-%% @doc Returns the value associated with `Parameter', or `Default' in case
-%% `Parameter' is not associated with any value.
--spec parameter(atom(), value()) -> value().
-parameter(Parameter, Default) ->
- Parameters =
- case erlang:get('$parameters') of
- undefined -> [];
- List -> List
- end,
- proplists:get_value(Parameter, Parameters, Default).
-
-%% @equiv parameter(Parameter, undefined)
--spec parameter(atom()) -> value().
-parameter(Parameter) ->
- parameter(Parameter, undefined).
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/proper/proper_typeserver.erl b/lib/dialyzer/test/opaque_SUITE_data/src/proper/proper_typeserver.erl
deleted file mode 100644
index 529f9fba72..0000000000
--- a/lib/dialyzer/test/opaque_SUITE_data/src/proper/proper_typeserver.erl
+++ /dev/null
@@ -1,2402 +0,0 @@
-%%% Copyright 2010-2015 Manolis Papadakis <manopapad@gmail.com>,
-%%% Eirini Arvaniti <eirinibob@gmail.com>
-%%% and Kostis Sagonas <kostis@cs.ntua.gr>
-%%%
-%%% This file is part of PropEr.
-%%%
-%%% PropEr is free software: you can redistribute it and/or modify
-%%% it under the terms of the GNU General Public License as published by
-%%% the Free Software Foundation, either version 3 of the License, or
-%%% (at your option) any later version.
-%%%
-%%% PropEr is distributed in the hope that it will be useful,
-%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
-%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-%%% GNU General Public License for more details.
-%%%
-%%% You should have received a copy of the GNU General Public License
-%%% along with PropEr. If not, see <http://www.gnu.org/licenses/>.
-
-%%% @copyright 2010-2015 Manolis Papadakis, Eirini Arvaniti and Kostis Sagonas
-%%% @version {@version}
-%%% @author Manolis Papadakis
-
-%%% @doc Erlang type system - PropEr type system integration module.
-%%%
-%%% PropEr can parse types expressed in Erlang's type language and convert them
-%%% to its own type format. Such expressions can be used instead of regular type
-%%% constructors in the second argument of `?FORALL's. No extra notation is
-%%% required; PropEr will detect which calls correspond to native types by
-%%% applying a parse transform during compilation. This parse transform is
-%%% automatically applied to any module that includes the `proper.hrl' header
-%%% file. You can disable this feature by compiling your modules with
-%%% `-DPROPER_NO_TRANS'. Note that this will currently also disable the
-%%% automatic exporting of properties.
-%%%
-%%% The use of native types in properties is subject to the following usage
-%%% rules:
-%%% <ul>
-%%% <li>Native types cannot be used outside of `?FORALL's.</li>
-%%% <li>Inside `?FORALL's, native types can be combined with other native
-%%% types, and even with PropEr types, inside tuples and lists (the constructs
-%%% `[...]', `{...}' and `++' are all allowed).</li>
-%%% <li>All other constructs of Erlang's built-in type system (e.g. `|' for
-%%% union, `_' as an alias of `any()', `<<_:_>>' binary type syntax and
-%%% `fun((...) -> ...)' function type syntax) are not allowed in `?FORALL's,
-%%% because they are rejected by the Erlang parser.</li>
-%%% <li>Anything other than a tuple constructor, list constructor, `++'
-%%% application, local or remote call will automatically be considered a
-%%% PropEr type constructor and not be processed further by the parse
-%%% transform.</li>
-%%% <li>Parametric native types are fully supported; of course, they can only
-%%% appear instantiated in a `?FORALL'. The arguments of parametric native
-%%% types are always interpreted as native types.</li>
-%%% <li>Parametric PropEr types, on the other hand, can take any kind of
-%%% argument. You can even mix native and PropEr types in the arguments of a
-%%% PropEr type. For example, assuming that the following declarations are
-%%% present:
-%%% ``` my_proper_type() -> ?LET(...).
-%%% -type my_native_type() :: ... .'''
-%%% Then the following expressions are all legal:
-%%% ``` vector(2, my_native_type())
-%%% function(0, my_native_type())
-%%% union([my_proper_type(), my_native_type()])''' </li>
-%%% <li>Some type constructors can take native types as arguments (but only
-%%% inside `?FORALL's):
-%%% <ul>
-%%% <li>`?SUCHTHAT', `?SUCHTHATMAYBE', `non_empty', `noshrink': these work
-%%% with native types too</li>
-%%% <li>`?LAZY', `?SHRINK', `resize', `?SIZED': these don't work with native
-%%% types</li>
-%%% <li>`?LET', `?LETSHRINK': only the top-level base type can be a native
-%%% type</li>
-%%% </ul></li>
-%%% <li>Native type declarations in the `?FORALL's of a module can reference any
-%%% custom type declared in a `-type' or `-opaque' attribute of the same
-%%% module, as long as no module identifier is used.</li>
-%%% <li>Typed records cannot be referenced inside `?FORALL's using the
-%%% `#rec_name{}' syntax. To use a typed record in a `?FORALL', enclose the
-%%% record in a custom type like so:
-%%% ``` -type rec_name() :: #rec_name{}. '''
-%%% and use the custom type instead.</li>
-%%% <li>`?FORALL's may contain references to self-recursive or mutually
-%%% recursive native types, so long as each type in the hierarchy has a clear
-%%% base case.
-%%% Currently, PropEr requires that the toplevel of any recursive type
-%%% declaration is either a (maybe empty) list or a union containing at least
-%%% one choice that doesn't reference the type directly (it may, however,
-%%% reference any of the types that are mutually recursive with it). This
-%%% means, for example, that some valid recursive type declarations, such as
-%%% this one:
-%%% ``` ?FORALL(..., a(), ...) '''
-%%% where:
-%%% ``` -type a() :: {'a','none' | a()}. '''
-%%% are not accepted by PropEr. However, such types can be rewritten in a way
-%%% that allows PropEr to parse them:
-%%% ``` ?FORALL(..., a(), ...) '''
-%%% where:
-%%% ``` -type a() :: {'a','none'} | {'a',a()}. '''
-%%% This also means that recursive record declarations are not allowed:
-%%% ``` ?FORALL(..., rec(), ...) '''
-%%% where:
-%%% ``` -type rec() :: #rec{}.
-%%% -record(rec, {a = 0 :: integer(), b = 'nil' :: 'nil' | #rec{}}). '''
-%%% A little rewritting can usually remedy this problem as well:
-%%% ``` ?FORALL(..., rec(), ...) '''
-%%% where:
-%%% ``` -type rec() :: #rec{b :: 'nil'} | #rec{b :: rec()}.
-%%% -record(rec, {a = 0 :: integer(), b = 'nil' :: 'nil' | #rec{}}). '''
-%%% </li>
-%%% <li>Remote types may be referenced in a `?FORALL', so long as they are
-%%% exported from the remote module. Currently, PropEr requires that any
-%%% remote modules whose types are directly referenced from within properties
-%%% are present in the code path at compile time, either compiled with
-%%% `debug_info' enabled or in source form. If PropEr cannot find a remote
-%%% module at all, finds only a compiled object file with no debug
-%%% information or fails to compile the source file, all calls to that module
-%%% will automatically be considered calls to PropEr type constructors.</li>
-%%% <li>For native types to be translated correctly, both the module that
-%%% contains the `?FORALL' declaration as well as any module that contains
-%%% the declaration of a type referenced (directly or indirectly) from inside
-%%% a `?FORALL' must be present in the code path at runtime, either compiled
-%%% with `debug_info' enabled or in source form.</li>
-%%% <li>Local types with the same name as an auto-imported BIF are not accepted
-%%% by PropEr, unless the BIF in question has been declared in a
-%%% `no_auto_import' option.</li>
-%%% <li>When an expression can be interpreted both as a PropEr type and as a
-%%% native type, the former takes precedence. This means that a function
-%%% `foo()' will shadow a type `foo()' if they are both present in the module.
-%%% The same rule applies to remote functions and types as well.</li>
-%%% <li>The above may cause some confusion when list syntax is used:
-%%% <ul>
-%%% <li>The expression `[integer()]' can be interpreted both ways, so the
-%%% PropEr way applies. Therefore, instances of this type will always be
-%%% lists of length 1, not arbitrary integer lists, as would be expected
-%%% when interpreting the expression as a native type.</li>
-%%% <li>Assuming that a custom type foo/1 has been declared, the expression
-%%% `foo([integer()])' can only be interpreted as a native type declaration,
-%%% which means that the generic type of integer lists will be passed to
-%%% `foo/1'.</li>
-%%% </ul></li>
-%%% <li>Currently, PropEr does not detect the following mistakes:
-%%% <ul>
-%%% <li>inline record-field specializations that reference non-existent
-%%% fields</li>
-%%% <li>type parameters that are not present in the RHS of a `-type'
-%%% declaration</li>
-%%% <li>using `_' as a type variable in the LHS of a `-type' declaration</li>
-%%% <li>using the same variable in more than one position in the LHS of a
-%%% `-type' declaration</li>
-%%% </ul>
-%%% </li>
-%%% </ul>
-%%%
-%%% You can use <a href="#index">these</a> functions to try out the type
-%%% translation subsystem.
-%%%
-%%% CAUTION: These functions should never be used inside properties. They are
-%%% meant for demonstration purposes only.
-
--module(proper_typeserver).
--behaviour(gen_server).
--export([demo_translate_type/2, demo_is_instance/3]).
-
--export([start/0, restart/0, stop/0, create_spec_test/3, get_exp_specced/1,
- is_instance/3, translate_type/1]).
--export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2,
- code_change/3]).
--export([get_exp_info/1, match/2]).
-
--export_type([imm_type/0, mod_exp_types/0, mod_exp_funs/0]).
-
--include("proper_internal.hrl").
-
-
-%%------------------------------------------------------------------------------
-%% Macros
-%%------------------------------------------------------------------------------
-
--define(SRC_FILE_EXT, ".erl").
-
-%% CAUTION: all these must be sorted
--define(STD_TYPES_0,
- [any,arity,atom,binary,bitstring,bool,boolean,byte,char,float,integer,
- list,neg_integer,non_neg_integer,number,pos_integer,string,term,
- timeout]).
--define(HARD_ADTS,
- %% gb_trees:iterator and gb_sets:iterator are NOT hardcoded
- [{{array,0},array}, {{array,1},proper_array},
- {{dict,0},dict}, {{dict,2},proper_dict},
- {{gb_set,0},gb_sets}, {{gb_set,1},proper_gb_sets},
- {{gb_tree,0},gb_trees}, {{gb_tree,2},proper_gb_trees},
- {{orddict,2},proper_orddict},
- {{ordset,1},proper_ordsets},
- {{queue,0},queue}, {{queue,1},proper_queue},
- {{set,0},sets}, {{set,1},proper_sets}]).
--define(HARD_ADT_MODS,
- [{array, [{{array,0},
- {{type,0,record,[{atom,0,array}]},[]}}]},
- {dict, [{{dict,0},
- {{type,0,record,[{atom,0,dict}]},[]}}]},
- {gb_sets, [{{gb_set,0},
- {{type,0,tuple,[{type,0,non_neg_integer,[]},
- {type,0,gb_set_node,[]}]},[]}}]},
- {gb_trees, [{{gb_tree,0},
- {{type,0,tuple,[{type,0,non_neg_integer,[]},
- {type,0,gb_tree_node,[]}]},[]}}]},
- %% Our parametric ADTs are already declared as normal types, we just
- %% need to change them to opaques.
- {proper_array, [{{array,1},already_declared}]},
- {proper_dict, [{{dict,2},already_declared}]},
- {proper_gb_sets, [{{gb_set,1},already_declared},
- {{iterator,1},already_declared}]},
- {proper_gb_trees, [{{gb_tree,2},already_declared},
- {{iterator,2},already_declared}]},
- {proper_orddict, [{{orddict,2},already_declared}]},
- {proper_ordsets, [{{ordset,1},already_declared}]},
- {proper_queue, [{{queue,1},already_declared}]},
- {proper_sets, [{{set,1},already_declared}]},
- {queue, [{{queue,0},
- {{type,0,tuple,[{type,0,list,[]},{type,0,list,[]}]},[]}}]},
- {sets, [{{set,0},
- {{type,0,record,[{atom,0,set}]},[]}}]}]).
-
-
-%%------------------------------------------------------------------------------
-%% Types
-%%------------------------------------------------------------------------------
-
--type type_name() :: atom().
--type var_name() :: atom(). %% TODO: also integers?
--type field_name() :: atom().
-
--type type_kind() :: 'type' | 'record'.
--type type_ref() :: {type_kind(),type_name(),arity()}.
--ifdef(NO_MODULES_IN_OPAQUES).
--type substs_dict() :: dict(). %% dict(field_name(),ret_type())
--else.
--type substs_dict() :: dict:dict(field_name(),ret_type()).
--endif.
--type full_type_ref() :: {mod_name(),type_kind(),type_name(),
- [ret_type()] | substs_dict()}.
--type symb_info() :: 'not_symb' | {'orig_abs',abs_type()}.
--type type_repr() :: {'abs_type',abs_type(),[var_name()],symb_info()}
- | {'cached',fin_type(),abs_type(),symb_info()}
- | {'abs_record',[{field_name(),abs_type()}]}.
--type gen_fun() :: fun((size()) -> fin_type()).
--type rec_fun() :: fun(([gen_fun()],size()) -> fin_type()).
--type rec_arg() :: {boolean() | {'list',boolean(),rec_fun()},full_type_ref()}.
--type rec_args() :: [rec_arg()].
--type ret_type() :: {'simple',fin_type()} | {'rec',rec_fun(),rec_args()}.
--type rec_fun_info() :: {pos_integer(),pos_integer(),[arity(),...],
- [rec_fun(),...]}.
-
--type imm_type_ref() :: {type_name(),arity()}.
--type hard_adt_repr() :: {abs_type(),[var_name()]} | 'already_declared'.
--type fun_ref() :: {fun_name(),arity()}.
--type fun_repr() :: fun_clause_repr().
--type fun_clause_repr() :: {[abs_type()],abs_type()}.
--type proc_fun_ref() :: {fun_name(),[abs_type()],abs_type()}.
--type full_imm_type_ref() :: {mod_name(),type_name(),arity()}.
--type imm_stack() :: [full_imm_type_ref()].
--type pat_field() :: 0 | 1 | atom().
--type pattern() :: loose_tuple(pat_field()).
--type next_step() :: 'none' | 'take_head' | {'match_with',pattern()}.
-
--ifdef(NO_MODULES_IN_OPAQUES).
-%% @private_type
--type mod_exp_types() :: set(). %% set(imm_type_ref())
--type mod_types() :: dict(). %% dict(type_ref(),type_repr())
-%% @private_type
--type mod_exp_funs() :: set(). %% set(fun_ref())
--type mod_specs() :: dict(). %% dict(fun_ref(),fun_repr())
--else.
-%% @private_type
--type mod_exp_types() :: sets:set(imm_type_ref()).
--type mod_types() :: dict:dict(type_ref(),type_repr()).
-%% @private_type
--type mod_exp_funs() :: sets:set(fun_ref()).
--type mod_specs() :: dict:dict(fun_ref(),fun_repr()).
--endif.
-
--ifdef(NO_MODULES_IN_OPAQUES).
--record(state,
- {cached = dict:new() :: dict(), %% dict(imm_type(),fin_type())
- exp_types = dict:new() :: dict(), %% dict(mod_name(),mod_exp_types())
- types = dict:new() :: dict(), %% dict(mod_name(),mod_types())
- exp_specs = dict:new() :: dict()}). %% dict(mod_name(),mod_specs())
--else.
--record(state,
- {cached = dict:new() :: dict:dict(), %% dict(imm_type(),fin_type())
- exp_types = dict:new() :: dict:dict(), %% dict(mod_name(),mod_exp_types())
- types = dict:new() :: dict:dict(), %% dict(mod_name(),mod_types())
- exp_specs = dict:new() :: dict:dict()}). %% dict(mod_name(),mod_specs())
-%% {cached = dict:new() :: dict:dict(imm_type(),fin_type()),
-%% exp_types = dict:new() :: dict:dict(mod_name(),mod_exp_types()),
-%% types = dict:new() :: dict:dict(mod_name(),mod_types()),
-%% exp_specs = dict:new() :: dict:dict(mod_name(),mod_specs())}).
--endif.
--type state() :: #state{}.
-
--record(mod_info,
- {mod_exp_types = sets:new() :: mod_exp_types(),
- mod_types = dict:new() :: mod_types(),
- mod_opaques = sets:new() :: mod_exp_types(),
- mod_exp_funs = sets:new() :: mod_exp_funs(),
- mod_specs = dict:new() :: mod_specs()}).
--type mod_info() :: #mod_info{}.
-
--type stack() :: [full_type_ref() | 'tuple' | 'list' | 'union' | 'fun'].
--ifdef(NO_MODULES_IN_OPAQUES).
--type var_dict() :: dict(). %% dict(var_name(),ret_type())
--else.
--type var_dict() :: dict:dict(var_name(),ret_type()).
--endif.
-%% @private_type
--type imm_type() :: {mod_name(),string()}.
-%% @alias
--type fin_type() :: proper_types:type().
--type tagged_result(T) :: {'ok',T} | 'error'.
--type tagged_result2(T,S) :: {'ok',T,S} | 'error'.
-%% @alias
--type rich_result(T) :: {'ok',T} | {'error',term()}.
--type rich_result2(T,S) :: {'ok',T,S} | {'error',term()}.
--type false_positive_mfas() :: proper:false_positive_mfas().
-
--type server_call() :: {'create_spec_test',mfa(),timeout(),false_positive_mfas()}
- | {'get_exp_specced',mod_name()}
- | {'get_type_repr',mod_name(),type_ref(),boolean()}
- | {'translate_type',imm_type()}.
--type server_response() :: rich_result(proper:test())
- | rich_result([mfa()])
- | rich_result(type_repr())
- | rich_result(fin_type()).
-
-
-%%------------------------------------------------------------------------------
-%% Server interface functions
-%%------------------------------------------------------------------------------
-
-%% @private
--spec start() -> 'ok'.
-start() ->
- {ok,TypeserverPid} = gen_server:start_link(?MODULE, dummy, []),
- put('$typeserver_pid', TypeserverPid),
- ok.
-
-%% @private
--spec restart() -> 'ok'.
-restart() ->
- TypeserverPid = get('$typeserver_pid'),
- case (TypeserverPid =:= undefined orelse not is_process_alive(TypeserverPid)) of
- true -> start();
- false -> ok
- end.
-
-%% @private
--spec stop() -> 'ok'.
-stop() ->
- TypeserverPid = get('$typeserver_pid'),
- erase('$typeserver_pid'),
- gen_server:cast(TypeserverPid, stop).
-
-%% @private
--spec create_spec_test(mfa(), timeout(), false_positive_mfas()) -> rich_result(proper:test()).
-create_spec_test(MFA, SpecTimeout, FalsePositiveMFAs) ->
- TypeserverPid = get('$typeserver_pid'),
- gen_server:call(TypeserverPid, {create_spec_test,MFA,SpecTimeout,FalsePositiveMFAs}).
-
-%% @private
--spec get_exp_specced(mod_name()) -> rich_result([mfa()]).
-get_exp_specced(Mod) ->
- TypeserverPid = get('$typeserver_pid'),
- gen_server:call(TypeserverPid, {get_exp_specced,Mod}).
-
--spec get_type_repr(mod_name(), type_ref(), boolean()) ->
- rich_result(type_repr()).
-get_type_repr(Mod, TypeRef, IsRemote) ->
- TypeserverPid = get('$typeserver_pid'),
- gen_server:call(TypeserverPid, {get_type_repr,Mod,TypeRef,IsRemote}).
-
-%% @private
--spec translate_type(imm_type()) -> rich_result(fin_type()).
-translate_type(ImmType) ->
- TypeserverPid = get('$typeserver_pid'),
- gen_server:call(TypeserverPid, {translate_type,ImmType}).
-
-%% @doc Translates the native type expression `TypeExpr' (which should be
-%% provided inside a string) into a PropEr type, which can then be passed to any
-%% of the demo functions defined in the {@link proper_gen} module. PropEr acts
-%% as if it found this type expression inside the code of module `Mod'.
--spec demo_translate_type(mod_name(), string()) -> rich_result(fin_type()).
-demo_translate_type(Mod, TypeExpr) ->
- start(),
- Result = translate_type({Mod,TypeExpr}),
- stop(),
- Result.
-
-%% @doc Checks if `Term' is a valid instance of native type `TypeExpr' (which
-%% should be provided inside a string). PropEr acts as if it found this type
-%% expression inside the code of module `Mod'.
--spec demo_is_instance(term(), mod_name(), string()) ->
- boolean() | {'error',term()}.
-demo_is_instance(Term, Mod, TypeExpr) ->
- case parse_type(TypeExpr) of
- {ok,TypeForm} ->
- start(),
- Result =
- %% Force the typeserver to load the module.
- case translate_type({Mod,"integer()"}) of
- {ok,_FinType} ->
- try is_instance(Term, Mod, TypeForm)
- catch
- throw:{'$typeserver',Reason} -> {error, Reason}
- end;
- {error,_Reason} = Error ->
- Error
- end,
- stop(),
- Result;
- {error,_Reason} = Error ->
- Error
- end.
-
-
-%%------------------------------------------------------------------------------
-%% Implementation of gen_server interface
-%%------------------------------------------------------------------------------
-
-%% @private
--spec init(_) -> {'ok',state()}.
-init(_) ->
- {ok, #state{}}.
-
-%% @private
--spec handle_call(server_call(), _, state()) ->
- {'reply',server_response(),state()}.
-handle_call({create_spec_test,MFA,SpecTimeout,FalsePositiveMFAs}, _From, State) ->
- case create_spec_test(MFA, SpecTimeout, FalsePositiveMFAs, State) of
- {ok,Test,NewState} ->
- {reply, {ok,Test}, NewState};
- {error,_Reason} = Error ->
- {reply, Error, State}
- end;
-handle_call({get_exp_specced,Mod}, _From, State) ->
- case get_exp_specced(Mod, State) of
- {ok,MFAs,NewState} ->
- {reply, {ok,MFAs}, NewState};
- {error,_Reason} = Error ->
- {reply, Error, State}
- end;
-handle_call({get_type_repr,Mod,TypeRef,IsRemote}, _From, State) ->
- case get_type_repr(Mod, TypeRef, IsRemote, State) of
- {ok,TypeRepr,NewState} ->
- {reply, {ok,TypeRepr}, NewState};
- {error,_Reason} = Error ->
- {reply, Error, State}
- end;
-handle_call({translate_type,ImmType}, _From, State) ->
- case translate_type(ImmType, State) of
- {ok,FinType,NewState} ->
- {reply, {ok,FinType}, NewState};
- {error,_Reason} = Error ->
- {reply, Error, State}
- end.
-
-%% @private
--spec handle_cast('stop', state()) -> {'stop','normal',state()}.
-handle_cast(stop, State) ->
- {stop, normal, State}.
-
-%% @private
--spec handle_info(term(), state()) -> {'stop',{'received_info',term()},state()}.
-handle_info(Info, State) ->
- {stop, {received_info,Info}, State}.
-
-%% @private
--spec terminate(term(), state()) -> 'ok'.
-terminate(_Reason, _State) ->
- ok.
-
-%% @private
--spec code_change(term(), state(), _) -> {'ok',state()}.
-code_change(_OldVsn, State, _) ->
- {ok, State}.
-
-
-%%------------------------------------------------------------------------------
-%% Top-level interface
-%%------------------------------------------------------------------------------
-
--spec create_spec_test(mfa(), timeout(), false_positive_mfas(), state()) ->
- rich_result2(proper:test(),state()).
-create_spec_test(MFA, SpecTimeout, FalsePositiveMFAs, State) ->
- case get_exp_spec(MFA, State) of
- {ok,FunRepr,NewState} ->
- make_spec_test(MFA, FunRepr, SpecTimeout, FalsePositiveMFAs, NewState);
- {error,_Reason} = Error ->
- Error
- end.
-
--spec get_exp_spec(mfa(), state()) -> rich_result2(fun_repr(),state()).
-get_exp_spec({Mod,Fun,Arity} = MFA, State) ->
- case add_module(Mod, State) of
- {ok,#state{exp_specs = ExpSpecs} = NewState} ->
- ModExpSpecs = dict:fetch(Mod, ExpSpecs),
- case dict:find({Fun,Arity}, ModExpSpecs) of
- {ok,FunRepr} ->
- {ok, FunRepr, NewState};
- error ->
- {error, {function_not_exported_or_specced,MFA}}
- end;
- {error,_Reason} = Error ->
- Error
- end.
-
--spec make_spec_test(mfa(), fun_repr(), timeout(), false_positive_mfas(), state()) ->
- rich_result2(proper:test(),state()).
-make_spec_test({Mod,_Fun,_Arity}=MFA, {Domain,_Range}=FunRepr, SpecTimeout, FalsePositiveMFAs, State) ->
- case convert(Mod, {type,0,'$fixed_list',Domain}, State) of
- {ok,FinType,NewState} ->
- Test = ?FORALL(Args, FinType, apply_spec_test(MFA, FunRepr, SpecTimeout, FalsePositiveMFAs, Args)),
- {ok, Test, NewState};
- {error,_Reason} = Error ->
- Error
- end.
-
--spec apply_spec_test(mfa(), fun_repr(), timeout(), false_positive_mfas(), term()) -> proper:test().
-apply_spec_test({Mod,Fun,_Arity}=MFA, {_Domain,Range}, SpecTimeout, FalsePositiveMFAs, Args) ->
- ?TIMEOUT(SpecTimeout,
- begin
- %% NOTE: only call apply/3 inside try/catch (do not trust ?MODULE:is_instance/3)
- Result =
- try apply(Mod,Fun,Args) of
- X -> {ok, X}
- catch
- X:Y:S -> {{X, Y}, S}
- end,
- case Result of
- {ok, Z} ->
- case ?MODULE:is_instance(Z,Mod,Range) of
- true ->
- true;
- false when is_function(FalsePositiveMFAs) ->
- FalsePositiveMFAs(MFA, Args, {fail, Z});
- false ->
- false
- end;
- {Exception, S2} when is_function(FalsePositiveMFAs) ->
- case FalsePositiveMFAs(MFA, Args, Exception) of
- true ->
- true;
- false ->
- error(Exception, S2)
- end;
- {Exception, S3} ->
- error(Exception, S3)
- end
- end).
-
--spec get_exp_specced(mod_name(), state()) -> rich_result2([mfa()],state()).
-get_exp_specced(Mod, State) ->
- case add_module(Mod, State) of
- {ok,#state{exp_specs = ExpSpecs} = NewState} ->
- ModExpSpecs = dict:fetch(Mod, ExpSpecs),
- ExpSpecced = [{Mod,F,A} || {F,A} <- dict:fetch_keys(ModExpSpecs)],
- {ok, ExpSpecced, NewState};
- {error,_Reason} = Error ->
- Error
- end.
-
--spec get_type_repr(mod_name(), type_ref(), boolean(), state()) ->
- rich_result2(type_repr(),state()).
-get_type_repr(Mod, {type,Name,Arity} = TypeRef, true, State) ->
- case prepare_for_remote(Mod, Name, Arity, State) of
- {ok,NewState} ->
- get_type_repr(Mod, TypeRef, false, NewState);
- {error,_Reason} = Error ->
- Error
- end;
-get_type_repr(Mod, TypeRef, false, #state{types = Types} = State) ->
- ModTypes = dict:fetch(Mod, Types),
- case dict:find(TypeRef, ModTypes) of
- {ok,TypeRepr} ->
- {ok, TypeRepr, State};
- error ->
- {error, {missing_type,Mod,TypeRef}}
- end.
-
--spec prepare_for_remote(mod_name(), type_name(), arity(), state()) ->
- rich_result(state()).
-prepare_for_remote(RemMod, Name, Arity, State) ->
- case add_module(RemMod, State) of
- {ok,#state{exp_types = ExpTypes} = NewState} ->
- RemModExpTypes = dict:fetch(RemMod, ExpTypes),
- case sets:is_element({Name,Arity}, RemModExpTypes) of
- true -> {ok, NewState};
- false -> {error, {type_not_exported,{RemMod,Name,Arity}}}
- end;
- {error,_Reason} = Error ->
- Error
- end.
-
--spec translate_type(imm_type(), state()) -> rich_result2(fin_type(),state()).
-translate_type({Mod,Str} = ImmType, #state{cached = Cached} = State) ->
- case dict:find(ImmType, Cached) of
- {ok,Type} ->
- {ok, Type, State};
- error ->
- case parse_type(Str) of
- {ok,TypeForm} ->
- case add_module(Mod, State) of
- {ok,NewState} ->
- case convert(Mod, TypeForm, NewState) of
- {ok,FinType,
- #state{cached = Cached} = FinalState} ->
- NewCached = dict:store(ImmType, FinType,
- Cached),
- {ok, FinType,
- FinalState#state{cached = NewCached}};
- {error,_Reason} = Error ->
- Error
- end;
- {error,_Reason} = Error ->
- Error
- end;
- {error,Reason} ->
- {error, {parse_error,Str,Reason}}
- end
- end.
-
--spec parse_type(string()) -> rich_result(abs_type()).
-parse_type(Str) ->
- TypeStr = "-type mytype() :: " ++ Str ++ ".",
- case erl_scan:string(TypeStr) of
- {ok,Tokens,_EndLocation} ->
- case erl_parse:parse_form(Tokens) of
- {ok,{attribute,_Line,type,{mytype,TypeExpr,[]}}} ->
- {ok, TypeExpr};
- {error,_ErrorInfo} = Error ->
- Error
- end;
- {error,ErrorInfo,_EndLocation} ->
- {error, ErrorInfo}
- end.
-
--spec add_module(mod_name(), state()) -> rich_result(state()).
-add_module(Mod, #state{exp_types = ExpTypes} = State) ->
- case dict:is_key(Mod, ExpTypes) of
- true ->
- {ok, State};
- false ->
- case get_code_and_exports(Mod) of
- {ok,AbsCode,ModExpFuns} ->
- RawModInfo = get_mod_info(Mod, AbsCode, ModExpFuns),
- ModInfo = process_adts(Mod, RawModInfo),
- {ok, store_mod_info(Mod,ModInfo,State)};
- {error,Reason} ->
- {error, {cant_load_code,Mod,Reason}}
- end
- end.
-
-%% @private
--spec get_exp_info(mod_name()) -> rich_result2(mod_exp_types(),mod_exp_funs()).
-get_exp_info(Mod) ->
- case get_code_and_exports(Mod) of
- {ok,AbsCode,ModExpFuns} ->
- RawModInfo = get_mod_info(Mod, AbsCode, ModExpFuns),
- {ok, RawModInfo#mod_info.mod_exp_types, ModExpFuns};
- {error,_Reason} = Error ->
- Error
- end.
-
--spec get_code_and_exports(mod_name()) ->
- rich_result2([abs_form()],mod_exp_funs()).
-get_code_and_exports(Mod) ->
- case code:get_object_code(Mod) of
- {Mod, ObjBin, _ObjFileName} ->
- case get_chunks(ObjBin) of
- {ok,_AbsCode,_ModExpFuns} = Result ->
- Result;
- {error,Reason} ->
- get_code_and_exports_from_source(Mod, Reason)
- end;
- error ->
- get_code_and_exports_from_source(Mod, cant_find_object_file)
- end.
-
--spec get_code_and_exports_from_source(mod_name(), term()) ->
- rich_result2([abs_form()],mod_exp_funs()).
-get_code_and_exports_from_source(Mod, ObjError) ->
- SrcFileName = atom_to_list(Mod) ++ ?SRC_FILE_EXT,
- case code:where_is_file(SrcFileName) of
- FullSrcFileName when is_list(FullSrcFileName) ->
- Opts = [binary,debug_info,return_errors,{d,'PROPER_REMOVE_PROPS'}],
- case compile:file(FullSrcFileName, Opts) of
- {ok,Mod,Binary} ->
- get_chunks(Binary);
- {error,Errors,_Warnings} ->
- {error, {ObjError,{cant_compile_source_file,Errors}}}
- end;
- non_existing ->
- {error, {ObjError,cant_find_source_file}}
- end.
-
--spec get_chunks(string() | binary()) ->
- rich_result2([abs_form()],mod_exp_funs()).
-get_chunks(ObjFile) ->
- case beam_lib:chunks(ObjFile, [abstract_code,exports]) of
- {ok,{_Mod,[{abstract_code,AbsCodeChunk},{exports,ExpFunsList}]}} ->
- case AbsCodeChunk of
- {raw_abstract_v1,AbsCode} ->
- %% HACK: Add a declaration for iolist() to every module
- {ok, add_iolist(AbsCode), sets:from_list(ExpFunsList)};
- no_abstract_code ->
- {error, no_abstract_code};
- _ ->
- {error, unsupported_abstract_code_format}
- end;
- {error,beam_lib,Reason} ->
- {error, Reason}
- end.
-
--spec add_iolist([abs_form()]) -> [abs_form()].
-add_iolist(Forms) ->
- IOListDef =
- {type,0,maybe_improper_list,
- [{type,0,union,[{type,0,byte,[]},{type,0,binary,[]},
- {type,0,iolist,[]}]},
- {type,0,binary,[]}]},
- IOListDecl = {attribute,0,type,{iolist,IOListDef,[]}},
- [IOListDecl | Forms].
-
--spec get_mod_info(mod_name(), [abs_form()], mod_exp_funs()) -> mod_info().
-get_mod_info(Mod, AbsCode, ModExpFuns) ->
- StartModInfo = #mod_info{mod_exp_funs = ModExpFuns},
- ImmModInfo = lists:foldl(fun add_mod_info/2, StartModInfo, AbsCode),
- #mod_info{mod_specs = AllModSpecs} = ImmModInfo,
- IsExported = fun(FunRef,_FunRepr) -> sets:is_element(FunRef,ModExpFuns) end,
- ModExpSpecs = dict:filter(IsExported, AllModSpecs),
- ModInfo = ImmModInfo#mod_info{mod_specs = ModExpSpecs},
- case orddict:find(Mod, ?HARD_ADT_MODS) of
- {ok,ModADTs} ->
- #mod_info{mod_exp_types = ModExpTypes, mod_types = ModTypes,
- mod_opaques = ModOpaques} = ModInfo,
- ModADTsSet =
- sets:from_list([ImmTypeRef
- || {ImmTypeRef,_HardADTRepr} <- ModADTs]),
- NewModExpTypes = sets:union(ModExpTypes, ModADTsSet),
- NewModTypes = lists:foldl(fun store_hard_adt/2, ModTypes, ModADTs),
- NewModOpaques = sets:union(ModOpaques, ModADTsSet),
- ModInfo#mod_info{mod_exp_types = NewModExpTypes,
- mod_types = NewModTypes,
- mod_opaques = NewModOpaques};
- error ->
- ModInfo
- end.
-
--spec store_hard_adt({imm_type_ref(),hard_adt_repr()}, mod_types()) ->
- mod_types().
-store_hard_adt({_ImmTypeRef,already_declared}, ModTypes) ->
- ModTypes;
-store_hard_adt({{Name,Arity},{TypeForm,VarNames}}, ModTypes) ->
- TypeRef = {type,Name,Arity},
- TypeRepr = {abs_type,TypeForm,VarNames,not_symb},
- dict:store(TypeRef, TypeRepr, ModTypes).
-
--spec add_mod_info(abs_form(), mod_info()) -> mod_info().
-add_mod_info({attribute,_Line,export_type,TypesList},
- #mod_info{mod_exp_types = ModExpTypes} = ModInfo) ->
- NewModExpTypes = sets:union(sets:from_list(TypesList), ModExpTypes),
- ModInfo#mod_info{mod_exp_types = NewModExpTypes};
-add_mod_info({attribute,_Line,type,{{record,RecName},Fields,[]}},
- #mod_info{mod_types = ModTypes} = ModInfo) ->
- FieldInfo = [process_rec_field(F) || F <- Fields],
- NewModTypes = dict:store({record,RecName,0}, {abs_record,FieldInfo},
- ModTypes),
- ModInfo#mod_info{mod_types = NewModTypes};
-add_mod_info({attribute,_Line,record,{RecName,Fields}},
- #mod_info{mod_types = ModTypes} = ModInfo) ->
- case dict:is_key(RecName, ModTypes) of
- true ->
- ModInfo;
- false ->
- A = erl_anno:new(0),
- TypedRecord = {attribute,A,type,{{record,RecName},Fields,[]}},
- add_mod_info(TypedRecord, ModInfo)
- end;
-add_mod_info({attribute,_Line,Kind,{Name,TypeForm,VarForms}},
- #mod_info{mod_types = ModTypes,
- mod_opaques = ModOpaques} = ModInfo)
- when Kind =:= type; Kind =:= opaque ->
- Arity = length(VarForms),
- VarNames = [V || {var,_,V} <- VarForms],
- %% TODO: No check whether variables are different, or non-'_'.
- NewModTypes = dict:store({type,Name,Arity},
- {abs_type,TypeForm,VarNames,not_symb}, ModTypes),
- NewModOpaques =
- case Kind of
- type -> ModOpaques;
- opaque -> sets:add_element({Name,Arity}, ModOpaques)
- end,
- ModInfo#mod_info{mod_types = NewModTypes, mod_opaques = NewModOpaques};
-add_mod_info({attribute,_Line,spec,{RawFunRef,[RawFirstClause | _Rest]}},
- #mod_info{mod_specs = ModSpecs} = ModInfo) ->
- FunRef = case RawFunRef of
- {_Mod,Name,Arity} -> {Name,Arity};
- {_Name,_Arity} = F -> F
- end,
- %% TODO: We just take the first function clause.
- FirstClause = process_fun_clause(RawFirstClause),
- NewModSpecs = dict:store(FunRef, FirstClause, ModSpecs),
- ModInfo#mod_info{mod_specs = NewModSpecs};
-add_mod_info(_Form, ModInfo) ->
- ModInfo.
-
--spec process_rec_field(abs_rec_field()) -> {field_name(),abs_type()}.
-process_rec_field({record_field,_,{atom,_,FieldName}}) ->
- {FieldName, {type,0,any,[]}};
-process_rec_field({record_field,_,{atom,_,FieldName},_Initialization}) ->
- {FieldName, {type,0,any,[]}};
-process_rec_field({typed_record_field,RecField,FieldType}) ->
- {FieldName,_} = process_rec_field(RecField),
- {FieldName, FieldType}.
-
--spec process_fun_clause(abs_type()) -> fun_clause_repr().
-process_fun_clause({type,_,'fun',[{type,_,product,Domain},Range]}) ->
- {Domain, Range};
-process_fun_clause({type,_,bounded_fun,[MainClause,Constraints]}) ->
- {RawDomain,RawRange} = process_fun_clause(MainClause),
- VarSubsts = [{V,T} || {type,_,constraint,
- [{atom,_,is_subtype},[{var,_,V},T]]} <- Constraints,
- V =/= '_'],
- VarSubstsDict = dict:from_list(VarSubsts),
- Domain = [update_vars(A, VarSubstsDict, false) || A <- RawDomain],
- Range = update_vars(RawRange, VarSubstsDict, false),
- {Domain, Range}.
-
--spec store_mod_info(mod_name(), mod_info(), state()) -> state().
-store_mod_info(Mod, #mod_info{mod_exp_types = ModExpTypes, mod_types = ModTypes,
- mod_specs = ImmModExpSpecs},
- #state{exp_types = ExpTypes, types = Types,
- exp_specs = ExpSpecs} = State) ->
- NewExpTypes = dict:store(Mod, ModExpTypes, ExpTypes),
- NewTypes = dict:store(Mod, ModTypes, Types),
- ModExpSpecs = dict:map(fun unbound_to_any/2, ImmModExpSpecs),
- NewExpSpecs = dict:store(Mod, ModExpSpecs, ExpSpecs),
- State#state{exp_types = NewExpTypes, types = NewTypes,
- exp_specs = NewExpSpecs}.
-
--spec unbound_to_any(fun_ref(), fun_repr()) -> fun_repr().
-unbound_to_any(_FunRef, {Domain,Range}) ->
- EmptySubstsDict = dict:new(),
- NewDomain = [update_vars(A,EmptySubstsDict,true) || A <- Domain],
- NewRange = update_vars(Range, EmptySubstsDict, true),
- {NewDomain, NewRange}.
-
-
-%%------------------------------------------------------------------------------
-%% ADT translation functions
-%%------------------------------------------------------------------------------
-
--spec process_adts(mod_name(), mod_info()) -> mod_info().
-process_adts(Mod,
- #mod_info{mod_exp_types = ModExpTypes, mod_opaques = ModOpaques,
- mod_specs = ModExpSpecs} = ModInfo) ->
- %% TODO: No warning on unexported opaques.
- case sets:to_list(sets:intersection(ModExpTypes,ModOpaques)) of
- [] ->
- ModInfo;
- ModADTs ->
- %% TODO: No warning on unexported API functions.
- ModExpSpecsList = [{Name,Domain,Range}
- || {{Name,_Arity},{Domain,Range}}
- <- dict:to_list(ModExpSpecs)],
- AddADT = fun(ADT,Acc) -> add_adt(Mod,ADT,Acc,ModExpSpecsList) end,
- lists:foldl(AddADT, ModInfo, ModADTs)
- end.
-
--spec add_adt(mod_name(), imm_type_ref(), mod_info(), [proc_fun_ref()]) ->
- mod_info().
-add_adt(Mod, {Name,Arity}, #mod_info{mod_types = ModTypes} = ModInfo,
- ModExpFunSpecs) ->
- ADTRef = {type,Name,Arity},
- {abs_type,InternalRepr,VarNames,not_symb} = dict:fetch(ADTRef, ModTypes),
- FullADTRef = {Mod,Name,Arity},
- %% TODO: No warning on unsuitable range.
- SymbCalls1 = [get_symb_call(FullADTRef,Spec) || Spec <- ModExpFunSpecs],
- %% TODO: No warning on bad use of variables.
- SymbCalls2 = [fix_vars(FullADTRef,Call,RangeVars,VarNames)
- || {ok,Call,RangeVars} <- SymbCalls1],
- case [Call || {ok,Call} <- SymbCalls2] of
- [] ->
- %% TODO: No warning on no acceptable spec.
- ModInfo;
- SymbCalls3 ->
- NewADTRepr = {abs_type,{type,0,union,SymbCalls3},VarNames,
- {orig_abs,InternalRepr}},
- NewModTypes = dict:store(ADTRef, NewADTRepr, ModTypes),
- ModInfo#mod_info{mod_types = NewModTypes}
- end.
-
--spec get_symb_call(full_imm_type_ref(), proc_fun_ref()) ->
- tagged_result2(abs_type(),[var_name()]).
-get_symb_call({Mod,_TypeName,_Arity} = FullADTRef, {FunName,Domain,Range}) ->
- BaseCall = {type,0,tuple,[{atom,0,'$call'},{atom,0,Mod},{atom,0,FunName},
- {type,0,'$fixed_list',Domain}]},
- unwrap_range(FullADTRef, BaseCall, Range, false).
-
--spec unwrap_range(full_imm_type_ref(), abs_type() | next_step(), abs_type(),
- boolean()) ->
- tagged_result2(abs_type() | next_step(),[var_name()]).
-unwrap_range(FullADTRef, Call, {paren_type,_,[Type]}, TestRun) ->
- unwrap_range(FullADTRef, Call, Type, TestRun);
-unwrap_range(FullADTRef, Call, {ann_type,_,[_Var,Type]}, TestRun) ->
- unwrap_range(FullADTRef, Call, Type, TestRun);
-unwrap_range(FullADTRef, Call, {type,_,list,[ElemType]}, TestRun) ->
- unwrap_list(FullADTRef, Call, ElemType, TestRun);
-unwrap_range(FullADTRef, Call, {type,_,maybe_improper_list,[Cont,_Term]},
- TestRun) ->
- unwrap_list(FullADTRef, Call, Cont, TestRun);
-unwrap_range(FullADTRef, Call, {type,_,nonempty_list,[ElemType]}, TestRun) ->
- unwrap_list(FullADTRef, Call, ElemType, TestRun);
-unwrap_range(FullADTRef, Call, {type,_,nonempty_improper_list,[Cont,_Term]},
- TestRun) ->
- unwrap_list(FullADTRef, Call, Cont, TestRun);
-unwrap_range(FullADTRef, Call,
- {type,_,nonempty_maybe_improper_list,[Cont,_Term]}, TestRun) ->
- unwrap_list(FullADTRef, Call, Cont, TestRun);
-unwrap_range(_FullADTRef, _Call, {type,_,tuple,any}, _TestRun) ->
- error;
-unwrap_range(FullADTRef, Call, {type,_,tuple,FieldForms}, TestRun) ->
- Translates = fun(T) -> unwrap_range(FullADTRef,none,T,true) =/= error end,
- case proper_arith:find_first(Translates, FieldForms) of
- none ->
- error;
- {TargetPos,TargetElem} ->
- Pattern = get_pattern(TargetPos, FieldForms),
- case TestRun of
- true ->
- NewCall =
- case Call of
- none -> {match_with,Pattern};
- _ -> Call
- end,
- {ok, NewCall, []};
- false ->
- AbsPattern = term_to_singleton_type(Pattern),
- NewCall =
- {type,0,tuple,
- [{atom,0,'$call'},{atom,0,?MODULE},{atom,0,match},
- {type,0,'$fixed_list',[AbsPattern,Call]}]},
- unwrap_range(FullADTRef, NewCall, TargetElem, TestRun)
- end
- end;
-unwrap_range(FullADTRef, Call, {type,_,union,Choices}, TestRun) ->
- TestedChoices = [unwrap_range(FullADTRef,none,C,true) || C <- Choices],
- NotError = fun(error) -> false; (_) -> true end,
- case proper_arith:find_first(NotError, TestedChoices) of
- none ->
- error;
- {_ChoicePos,{ok,none,_RangeVars}} ->
- error;
- {ChoicePos,{ok,NextStep,_RangeVars}} ->
- {A, [ChoiceElem|B]} = lists:split(ChoicePos-1, Choices),
- OtherChoices = A ++ B,
- DistinctChoice =
- case NextStep of
- take_head ->
- fun cant_have_head/1;
- {match_with,Pattern} ->
- fun(C) -> cant_match(Pattern, C) end
- end,
- case {lists:all(DistinctChoice,OtherChoices), TestRun} of
- {true,true} ->
- {ok, NextStep, []};
- {true,false} ->
- unwrap_range(FullADTRef, Call, ChoiceElem, TestRun);
- {false,_} ->
- error
- end
- end;
-unwrap_range({_Mod,SameName,Arity}, Call, {type,_,SameName,ArgForms},
- _TestRun) ->
- RangeVars = [V || {var,_,V} <- ArgForms, V =/= '_'],
- case length(ArgForms) =:= Arity andalso length(RangeVars) =:= Arity of
- true -> {ok, Call, RangeVars};
- false -> error
- end;
-unwrap_range({SameMod,SameName,_Arity} = FullADTRef, Call,
- {remote_type,_,[{atom,_,SameMod},{atom,_,SameName},ArgForms]},
- TestRun) ->
- unwrap_range(FullADTRef, Call, {type,0,SameName,ArgForms}, TestRun);
-unwrap_range(_FullADTRef, _Call, _Range, _TestRun) ->
- error.
-
--spec unwrap_list(full_imm_type_ref(), abs_type() | next_step(), abs_type(),
- boolean()) ->
- tagged_result2(abs_type() | next_step(),[var_name()]).
-unwrap_list(FullADTRef, Call, HeadType, TestRun) ->
- NewCall =
- case TestRun of
- true ->
- case Call of
- none -> take_head;
- _ -> Call
- end;
- false ->
- {type,0,tuple,[{atom,0,'$call'},{atom,0,erlang},{atom,0,hd},
- {type,0,'$fixed_list',[Call]}]}
- end,
- unwrap_range(FullADTRef, NewCall, HeadType, TestRun).
-
--spec fix_vars(full_imm_type_ref(), abs_type(), [var_name()], [var_name()]) ->
- tagged_result(abs_type()).
-fix_vars(FullADTRef, Call, RangeVars, VarNames) ->
- NotAnyVar = fun(V) -> V =/= '_' end,
- case no_duplicates(VarNames) andalso lists:all(NotAnyVar,VarNames) of
- true ->
- RawUsedVars =
- collect_vars(FullADTRef, Call, [[V] || V <- RangeVars]),
- UsedVars = [lists:usort(L) || L <- RawUsedVars],
- case correct_var_use(UsedVars) of
- true ->
- PairAll = fun(L,Y) -> [{X,{var,0,Y}} || X <- L] end,
- VarSubsts =
- lists:flatten(lists:zipwith(PairAll,UsedVars,VarNames)),
- VarSubstsDict = dict:from_list(VarSubsts),
- {ok, update_vars(Call,VarSubstsDict,true)};
- false ->
- error
- end;
- false ->
- error
- end.
-
--spec no_duplicates(list()) -> boolean().
-no_duplicates(L) ->
- length(lists:usort(L)) =:= length(L).
-
--spec correct_var_use([[var_name() | 0]]) -> boolean().
-correct_var_use(UsedVars) ->
- NoNonVarArgs = fun([0|_]) -> false; (_) -> true end,
- lists:all(NoNonVarArgs, UsedVars)
- andalso no_duplicates(lists:flatten(UsedVars)).
-
--spec collect_vars(full_imm_type_ref(), abs_type(), [[var_name() | 0]]) ->
- [[var_name() | 0]].
-collect_vars(FullADTRef, {paren_type,_,[Type]}, UsedVars) ->
- collect_vars(FullADTRef, Type, UsedVars);
-collect_vars(FullADTRef, {ann_type,_,[_Var,Type]}, UsedVars) ->
- collect_vars(FullADTRef, Type, UsedVars);
-collect_vars(_FullADTRef, {type,_,tuple,any}, UsedVars) ->
- UsedVars;
-collect_vars({_Mod,SameName,Arity} = FullADTRef, {type,_,SameName,ArgForms},
- UsedVars) ->
- case length(ArgForms) =:= Arity of
- true ->
- VarArgs = [V || {var,_,V} <- ArgForms, V =/= '_'],
- case length(VarArgs) =:= Arity of
- true ->
- AddToList = fun(X,L) -> [X | L] end,
- lists:zipwith(AddToList, VarArgs, UsedVars);
- false ->
- [[0|L] || L <- UsedVars]
- end;
- false ->
- multi_collect_vars(FullADTRef, ArgForms, UsedVars)
- end;
-collect_vars(FullADTRef, {type,_,_Name,ArgForms}, UsedVars) ->
- multi_collect_vars(FullADTRef, ArgForms, UsedVars);
-collect_vars({SameMod,SameName,_Arity} = FullADTRef,
- {remote_type,_,[{atom,_,SameMod},{atom,_,SameName},ArgForms]},
- UsedVars) ->
- collect_vars(FullADTRef, {type,0,SameName,ArgForms}, UsedVars);
-collect_vars(FullADTRef, {remote_type,_,[_RemModForm,_NameForm,ArgForms]},
- UsedVars) ->
- multi_collect_vars(FullADTRef, ArgForms, UsedVars);
-collect_vars(_FullADTRef, _Call, UsedVars) ->
- UsedVars.
-
--spec multi_collect_vars(full_imm_type_ref(), [abs_type()],
- [[var_name() | 0]]) -> [[var_name() | 0]].
-multi_collect_vars({_Mod,_Name,Arity} = FullADTRef, Forms, UsedVars) ->
- NoUsedVars = lists:duplicate(Arity, []),
- MoreUsedVars = [collect_vars(FullADTRef,T,NoUsedVars) || T <- Forms],
- CombineVars = fun(L1,L2) -> lists:zipwith(fun erlang:'++'/2, L1, L2) end,
- lists:foldl(CombineVars, UsedVars, MoreUsedVars).
-
--ifdef(NO_MODULES_IN_OPAQUES).
--type var_substs_dict() :: dict().
--else.
--type var_substs_dict() :: dict:dict(var_name(),abs_type()).
--endif.
--spec update_vars(abs_type(), var_substs_dict(), boolean()) -> abs_type().
-update_vars({paren_type,Line,[Type]}, VarSubstsDict, UnboundToAny) ->
- {paren_type, Line, [update_vars(Type,VarSubstsDict,UnboundToAny)]};
-update_vars({ann_type,Line,[Var,Type]}, VarSubstsDict, UnboundToAny) ->
- {ann_type, Line, [Var,update_vars(Type,VarSubstsDict,UnboundToAny)]};
-update_vars({var,Line,VarName} = Call, VarSubstsDict, UnboundToAny) ->
- case dict:find(VarName, VarSubstsDict) of
- {ok,SubstType} ->
- SubstType;
- error when UnboundToAny =:= false ->
- Call;
- error when UnboundToAny =:= true ->
- {type,Line,any,[]}
- end;
-update_vars({remote_type,Line,[RemModForm,NameForm,ArgForms]}, VarSubstsDict,
- UnboundToAny) ->
- NewArgForms = [update_vars(A,VarSubstsDict,UnboundToAny) || A <- ArgForms],
- {remote_type, Line, [RemModForm,NameForm,NewArgForms]};
-update_vars({type,_,tuple,any} = Call, _VarSubstsDict, _UnboundToAny) ->
- Call;
-update_vars({type,Line,Name,ArgForms}, VarSubstsDict, UnboundToAny) ->
- {type, Line, Name, [update_vars(A,VarSubstsDict,UnboundToAny)
- || A <- ArgForms]};
-update_vars(Call, _VarSubstsDict, _UnboundToAny) ->
- Call.
-
-
-%%------------------------------------------------------------------------------
-%% Match-related functions
-%%------------------------------------------------------------------------------
-
--spec get_pattern(position(), [abs_type()]) -> pattern().
-get_pattern(TargetPos, FieldForms) ->
- {0,RevPattern} = lists:foldl(fun add_field/2, {TargetPos,[]}, FieldForms),
- list_to_tuple(lists:reverse(RevPattern)).
-
--spec add_field(abs_type(), {non_neg_integer(),[pat_field()]}) ->
- {non_neg_integer(),[pat_field(),...]}.
-add_field(_Type, {1,Acc}) ->
- {0, [1|Acc]};
-add_field({atom,_,Tag}, {Left,Acc}) ->
- {erlang:max(0,Left-1), [Tag|Acc]};
-add_field(_Type, {Left,Acc}) ->
- {erlang:max(0,Left-1), [0|Acc]}.
-
-%% @private
--spec match(pattern(), tuple()) -> term().
-match(Pattern, Term) when tuple_size(Pattern) =:= tuple_size(Term) ->
- match(tuple_to_list(Pattern), tuple_to_list(Term), none, false);
-match(_Pattern, _Term) ->
- throw(no_match).
-
--spec match([pat_field()], [term()], 'none' | {'ok',T}, boolean()) -> T.
-match([], [], {ok,Target}, _TypeMode) ->
- Target;
-match([0|PatRest], [_|ToMatchRest], Acc, TypeMode) ->
- match(PatRest, ToMatchRest, Acc, TypeMode);
-match([1|PatRest], [Target|ToMatchRest], none, TypeMode) ->
- match(PatRest, ToMatchRest, {ok,Target}, TypeMode);
-match([Tag|PatRest], [X|ToMatchRest], Acc, TypeMode) when is_atom(Tag) ->
- MatchesTag =
- case TypeMode of
- true -> can_be_tag(Tag, X);
- false -> Tag =:= X
- end,
- case MatchesTag of
- true -> match(PatRest, ToMatchRest, Acc, TypeMode);
- false -> throw(no_match)
- end.
-
-%% CAUTION: these must be sorted
--define(NON_ATOM_TYPES,
- [arity,binary,bitstring,byte,char,float,'fun',function,integer,iodata,
- iolist,list,maybe_improper_list,mfa,neg_integer,nil,no_return,
- non_neg_integer,none,nonempty_improper_list,nonempty_list,
- nonempty_maybe_improper_list,nonempty_string,number,pid,port,
- pos_integer,range,record,reference,string,tuple]).
--define(NON_TUPLE_TYPES,
- [arity,atom,binary,bitstring,bool,boolean,byte,char,float,'fun',
- function,identifier,integer,iodata,iolist,list,maybe_improper_list,
- neg_integer,nil,no_return,node,non_neg_integer,none,
- nonempty_improper_list,nonempty_list,nonempty_maybe_improper_list,
- nonempty_string,number,pid,port,pos_integer,range,reference,string,
- timeout]).
--define(NO_HEAD_TYPES,
- [arity,atom,binary,bitstring,bool,boolean,byte,char,float,'fun',
- function,identifier,integer,mfa,module,neg_integer,nil,no_return,node,
- non_neg_integer,none,number,pid,port,pos_integer,range,record,
- reference,timeout,tuple]).
-
--spec can_be_tag(atom(), abs_type()) -> boolean().
-can_be_tag(Tag, {ann_type,_,[_Var,Type]}) ->
- can_be_tag(Tag, Type);
-can_be_tag(Tag, {paren_type,_,[Type]}) ->
- can_be_tag(Tag, Type);
-can_be_tag(Tag, {atom,_,Atom}) ->
- Tag =:= Atom;
-can_be_tag(_Tag, {integer,_,_Int}) ->
- false;
-can_be_tag(_Tag, {op,_,_Op,_Arg}) ->
- false;
-can_be_tag(_Tag, {op,_,_Op,_Arg1,_Arg2}) ->
- false;
-can_be_tag(Tag, {type,_,BName,[]}) when BName =:= bool; BName =:= boolean ->
- is_boolean(Tag);
-can_be_tag(Tag, {type,_,timeout,[]}) ->
- Tag =:= infinity;
-can_be_tag(Tag, {type,_,union,Choices}) ->
- lists:any(fun(C) -> can_be_tag(Tag,C) end, Choices);
-can_be_tag(_Tag, {type,_,Name,_Args}) ->
- not ordsets:is_element(Name, ?NON_ATOM_TYPES);
-can_be_tag(_Tag, _Type) ->
- true.
-
--spec cant_match(pattern(), abs_type()) -> boolean().
-cant_match(Pattern, {ann_type,_,[_Var,Type]}) ->
- cant_match(Pattern, Type);
-cant_match(Pattern, {paren_type,_,[Type]}) ->
- cant_match(Pattern, Type);
-cant_match(_Pattern, {atom,_,_Atom}) ->
- true;
-cant_match(_Pattern, {integer,_,_Int}) ->
- true;
-cant_match(_Pattern, {op,_,_Op,_Arg}) ->
- true;
-cant_match(_Pattern, {op,_,_Op,_Arg1,_Arg2}) ->
- true;
-cant_match(Pattern, {type,_,mfa,[]}) ->
- cant_match(Pattern, {type,0,tuple,[{type,0,atom,[]},{type,0,atom,[]},
- {type,0,arity,[]}]});
-cant_match(Pattern, {type,_,union,Choices}) ->
- lists:all(fun(C) -> cant_match(Pattern,C) end, Choices);
-cant_match(_Pattern, {type,_,tuple,any}) ->
- false;
-cant_match(Pattern, {type,_,tuple,Fields}) ->
- tuple_size(Pattern) =/= length(Fields) orelse
- try match(tuple_to_list(Pattern), Fields, none, true) of
- _ -> false
- catch
- throw:no_match -> true
- end;
-cant_match(_Pattern, {type,_,Name,_Args}) ->
- ordsets:is_element(Name, ?NON_TUPLE_TYPES);
-cant_match(_Pattern, _Type) ->
- false.
-
--spec cant_have_head(abs_type()) -> boolean().
-cant_have_head({ann_type,_,[_Var,Type]}) ->
- cant_have_head(Type);
-cant_have_head({paren_type,_,[Type]}) ->
- cant_have_head(Type);
-cant_have_head({atom,_,_Atom}) ->
- true;
-cant_have_head({integer,_,_Int}) ->
- true;
-cant_have_head({op,_,_Op,_Arg}) ->
- true;
-cant_have_head({op,_,_Op,_Arg1,_Arg2}) ->
- true;
-cant_have_head({type,_,union,Choices}) ->
- lists:all(fun cant_have_head/1, Choices);
-cant_have_head({type,_,Name,_Args}) ->
- ordsets:is_element(Name, ?NO_HEAD_TYPES);
-cant_have_head(_Type) ->
- false.
-
-%% Only covers atoms, integers and tuples, i.e. those that can be specified
-%% through singleton types.
--spec term_to_singleton_type(atom() | integer()
- | loose_tuple(atom() | integer())) -> abs_type().
-term_to_singleton_type(Atom) when is_atom(Atom) ->
- {atom,0,Atom};
-term_to_singleton_type(Int) when is_integer(Int), Int >= 0 ->
- {integer,0,Int};
-term_to_singleton_type(Int) when is_integer(Int), Int < 0 ->
- {op,0,'-',{integer,0,-Int}};
-term_to_singleton_type(Tuple) when is_tuple(Tuple) ->
- Fields = tuple_to_list(Tuple),
- {type,0,tuple,[term_to_singleton_type(F) || F <- Fields]}.
-
-
-%%------------------------------------------------------------------------------
-%% Instance testing functions
-%%------------------------------------------------------------------------------
-
-%% CAUTION: this must be sorted
--define(EQUIV_TYPES,
- [{arity, {type,0,range,[{integer,0,0},{integer,0,255}]}},
- {bool, {type,0,boolean,[]}},
- {byte, {type,0,range,[{integer,0,0},{integer,0,255}]}},
- {char, {type,0,range,[{integer,0,0},{integer,0,16#10ffff}]}},
- {function, {type,0,'fun',[]}},
- {identifier, {type,0,union,[{type,0,pid,[]},{type,0,port,[]},
- {type,0,reference,[]}]}},
- {iodata, {type,0,union,[{type,0,binary,[]},{type,0,iolist,[]}]}},
- {iolist, {type,0,maybe_improper_list,
- [{type,0,union,[{type,0,byte,[]},{type,0,binary,[]},
- {type,0,iolist,[]}]},
- {type,0,binary,[]}]}},
- {list, {type,0,list,[{type,0,any,[]}]}},
- {maybe_improper_list, {type,0,maybe_improper_list,[{type,0,any,[]},
- {type,0,any,[]}]}},
- {mfa, {type,0,tuple,[{type,0,atom,[]},{type,0,atom,[]},
- {type,0,arity,[]}]}},
- {node, {type,0,atom,[]}},
- {nonempty_list, {type,0,nonempty_list,[{type,0,any,[]}]}},
- {nonempty_maybe_improper_list, {type,0,nonempty_maybe_improper_list,
- [{type,0,any,[]},{type,0,any,[]}]}},
- {nonempty_string, {type,0,nonempty_list,[{type,0,char,[]}]}},
- {string, {type,0,list,[{type,0,char,[]}]}},
- {term, {type,0,any,[]}},
- {timeout, {type,0,union,[{atom,0,infinity},
- {type,0,non_neg_integer,[]}]}}]).
-
-%% @private
-%% TODO: Most of these functions accept an extended form of abs_type(), namely
-%% the addition of a custom wrapper: {'from_mod',mod_name(),...}
--spec is_instance(term(), mod_name(), abs_type()) -> boolean().
-is_instance(X, Mod, TypeForm) ->
- is_instance(X, Mod, TypeForm, []).
-
--spec is_instance(term(), mod_name(), abs_type(), imm_stack()) -> boolean().
-is_instance(X, _Mod, {from_mod,OrigMod,Type}, Stack) ->
- is_instance(X, OrigMod, Type, Stack);
-is_instance(_X, _Mod, {var,_,'_'}, _Stack) ->
- true;
-is_instance(_X, _Mod, {var,_,Name}, _Stack) ->
- %% All unconstrained spec vars have been replaced by 'any()' and we always
- %% replace the variables on the RHS of types before recursing into them.
- %% Provided that '-type' declarations contain no unbound variables, we
- %% don't expect to find any non-'_' variables while recursing.
- throw({'$typeserver',{unbound_var_in_type_declaration,Name}});
-is_instance(X, Mod, {ann_type,_,[_Var,Type]}, Stack) ->
- is_instance(X, Mod, Type, Stack);
-is_instance(X, Mod, {paren_type,_,[Type]}, Stack) ->
- is_instance(X, Mod, Type, Stack);
-is_instance(X, Mod, {remote_type,_,[{atom,_,RemMod},{atom,_,Name},ArgForms]},
- Stack) ->
- is_custom_instance(X, Mod, RemMod, Name, ArgForms, true, Stack);
-is_instance(SameAtom, _Mod, {atom,_,SameAtom}, _Stack) ->
- true;
-is_instance(SameInt, _Mod, {integer,_,SameInt}, _Stack) ->
- true;
-is_instance(X, _Mod, {op,_,_Op,_Arg} = Expr, _Stack) ->
- is_int_const(X, Expr);
-is_instance(X, _Mod, {op,_,_Op,_Arg1,_Arg2} = Expr, _Stack) ->
- is_int_const(X, Expr);
-is_instance(_X, _Mod, {type,_,any,[]}, _Stack) ->
- true;
-is_instance(X, _Mod, {type,_,atom,[]}, _Stack) ->
- is_atom(X);
-is_instance(X, _Mod, {type,_,binary,[]}, _Stack) ->
- is_binary(X);
-is_instance(X, _Mod, {type,_,binary,[BaseExpr,UnitExpr]}, _Stack) ->
- %% <<_:X,_:_*Y>> means "bitstrings of X + k*Y bits, k >= 0"
- case eval_int(BaseExpr) of
- {ok,Base} when Base >= 0 ->
- case eval_int(UnitExpr) of
- {ok,Unit} when Unit >= 0 ->
- case is_bitstring(X) of
- true ->
- BitSizeX = bit_size(X),
- case Unit =:= 0 of
- true ->
- BitSizeX =:= Base;
- false ->
- BitSizeX >= Base
- andalso
- (BitSizeX - Base) rem Unit =:= 0
- end;
- false -> false
- end;
- _ ->
- abs_expr_error(invalid_unit, UnitExpr)
- end;
- _ ->
- abs_expr_error(invalid_base, BaseExpr)
- end;
-is_instance(X, _Mod, {type,_,bitstring,[]}, _Stack) ->
- is_bitstring(X);
-is_instance(X, _Mod, {type,_,boolean,[]}, _Stack) ->
- is_boolean(X);
-is_instance(X, _Mod, {type,_,float,[]}, _Stack) ->
- is_float(X);
-is_instance(X, _Mod, {type,_,'fun',[]}, _Stack) ->
- is_function(X);
-%% TODO: how to check range type? random inputs? special case for 0-arity?
-is_instance(X, _Mod, {type,_,'fun',[{type,_,any,[]},_Range]}, _Stack) ->
- is_function(X);
-is_instance(X, _Mod, {type,_,'fun',[{type,_,product,Domain},_Range]}, _Stack) ->
- is_function(X, length(Domain));
-is_instance(X, _Mod, {type,_,integer,[]}, _Stack) ->
- is_integer(X);
-is_instance(X, Mod, {type,_,list,[Type]}, _Stack) ->
- list_test(X, Mod, Type, dummy, true, true, false);
-is_instance(X, Mod, {type,_,maybe_improper_list,[Cont,Term]}, _Stack) ->
- list_test(X, Mod, Cont, Term, true, true, true);
-is_instance(X, _Mod, {type,_,module,[]}, _Stack) ->
- is_atom(X) orelse
- is_tuple(X) andalso X =/= {} andalso is_atom(element(1,X));
-is_instance([], _Mod, {type,_,nil,[]}, _Stack) ->
- true;
-is_instance(X, _Mod, {type,_,neg_integer,[]}, _Stack) ->
- is_integer(X) andalso X < 0;
-is_instance(X, _Mod, {type,_,non_neg_integer,[]}, _Stack) ->
- is_integer(X) andalso X >= 0;
-is_instance(X, Mod, {type,_,nonempty_list,[Type]}, _Stack) ->
- list_test(X, Mod, Type, dummy, false, true, false);
-is_instance(X, Mod, {type,_,nonempty_improper_list,[Cont,Term]}, _Stack) ->
- list_test(X, Mod, Cont, Term, false, false, true);
-is_instance(X, Mod, {type,_,nonempty_maybe_improper_list,[Cont,Term]},
- _Stack) ->
- list_test(X, Mod, Cont, Term, false, true, true);
-is_instance(X, _Mod, {type,_,number,[]}, _Stack) ->
- is_number(X);
-is_instance(X, _Mod, {type,_,pid,[]}, _Stack) ->
- is_pid(X);
-is_instance(X, _Mod, {type,_,port,[]}, _Stack) ->
- is_port(X);
-is_instance(X, _Mod, {type,_,pos_integer,[]}, _Stack) ->
- is_integer(X) andalso X > 0;
-is_instance(_X, _Mod, {type,_,product,_Elements}, _Stack) ->
- throw({'$typeserver',{internal,product_in_is_instance}});
-is_instance(X, _Mod, {type,_,range,[LowExpr,HighExpr]}, _Stack) ->
- case {eval_int(LowExpr),eval_int(HighExpr)} of
- {{ok,Low},{ok,High}} when Low =< High ->
- X >= Low andalso X =< High;
- _ ->
- abs_expr_error(invalid_range, LowExpr, HighExpr)
- end;
-is_instance(X, Mod, {type,_,record,[{atom,_,Name} = NameForm | RawSubsts]},
- Stack) ->
- Substs = [{N,T} || {type,_,field_type,[{atom,_,N},T]} <- RawSubsts],
- SubstsDict = dict:from_list(Substs),
- case get_type_repr(Mod, {record,Name,0}, false) of
- {ok,{abs_record,OrigFields}} ->
- Fields = [case dict:find(FieldName, SubstsDict) of
- {ok,NewFieldType} -> NewFieldType;
- error -> OrigFieldType
- end
- || {FieldName,OrigFieldType} <- OrigFields],
- is_instance(X, Mod, {type,0,tuple,[NameForm|Fields]}, Stack);
- {error,Reason} ->
- throw({'$typeserver',Reason})
- end;
-is_instance(X, _Mod, {type,_,reference,[]}, _Stack) ->
- is_reference(X);
-is_instance(X, _Mod, {type,_,tuple,any}, _Stack) ->
- is_tuple(X);
-is_instance(X, Mod, {type,_,tuple,Fields}, _Stack) ->
- is_tuple(X) andalso tuple_test(tuple_to_list(X), Mod, Fields);
-is_instance(X, Mod, {type,_,union,Choices}, Stack) ->
- IsInstance = fun(Choice) -> is_instance(X,Mod,Choice,Stack) end,
- lists:any(IsInstance, Choices);
-is_instance(X, Mod, {type,_,Name,[]}, Stack) ->
- case orddict:find(Name, ?EQUIV_TYPES) of
- {ok,EquivType} ->
- is_instance(X, Mod, EquivType, Stack);
- error ->
- is_maybe_hard_adt(X, Mod, Name, [], Stack)
- end;
-is_instance(X, Mod, {type,_,Name,ArgForms}, Stack) ->
- is_maybe_hard_adt(X, Mod, Name, ArgForms, Stack);
-is_instance(_X, _Mod, _Type, _Stack) ->
- false.
-
--spec is_int_const(term(), abs_expr()) -> boolean().
-is_int_const(X, Expr) ->
- case eval_int(Expr) of
- {ok,Int} ->
- X =:= Int;
- error ->
- abs_expr_error(invalid_int_const, Expr)
- end.
-
-%% TODO: We implicitly add the '| []' at the termination of maybe_improper_list.
-%% TODO: We ignore a '[]' termination in improper_list.
--spec list_test(term(), mod_name(), abs_type(), 'dummy' | abs_type(), boolean(),
- boolean(), boolean()) -> boolean().
-list_test(X, Mod, Content, Termination, CanEmpty, CanProper, CanImproper) ->
- is_list(X) andalso
- list_rec(X, Mod, Content, Termination, CanEmpty, CanProper, CanImproper).
-
--spec list_rec(term(), mod_name(), abs_type(), 'dummy' | abs_type(), boolean(),
- boolean(), boolean()) -> boolean().
-list_rec([], _Mod, _Content, _Termination, CanEmpty, CanProper, _CanImproper) ->
- CanEmpty andalso CanProper;
-list_rec([X | Rest], Mod, Content, Termination, _CanEmpty, CanProper,
- CanImproper) ->
- is_instance(X, Mod, Content, []) andalso
- list_rec(Rest, Mod, Content, Termination, true, CanProper, CanImproper);
-list_rec(X, Mod, _Content, Termination, _CanEmpty, _CanProper, CanImproper) ->
- CanImproper andalso is_instance(X, Mod, Termination, []).
-
--spec tuple_test([term()], mod_name(), [abs_type()]) -> boolean().
-tuple_test([], _Mod, []) ->
- true;
-tuple_test([X | XTail], Mod, [T | TTail]) ->
- is_instance(X, Mod, T, []) andalso tuple_test(XTail, Mod, TTail);
-tuple_test(_, _Mod, _) ->
- false.
-
--spec is_maybe_hard_adt(term(), mod_name(), type_name(), [abs_type()],
- imm_stack()) -> boolean().
-is_maybe_hard_adt(X, Mod, Name, ArgForms, Stack) ->
- case orddict:find({Name,length(ArgForms)}, ?HARD_ADTS) of
- {ok,ADTMod} ->
- is_custom_instance(X, Mod, ADTMod, Name, ArgForms, true, Stack);
- error ->
- is_custom_instance(X, Mod, Mod, Name, ArgForms, false, Stack)
- end.
-
--spec is_custom_instance(term(), mod_name(), mod_name(), type_name(),
- [abs_type()], boolean(), imm_stack()) -> boolean().
-is_custom_instance(X, Mod, RemMod, Name, RawArgForms, IsRemote, Stack) ->
- ArgForms = case Mod =/= RemMod of
- true -> [{from_mod,Mod,A} || A <- RawArgForms];
- false -> RawArgForms
- end,
- Arity = length(ArgForms),
- FullTypeRef = {RemMod,Name,Arity},
- case lists:member(FullTypeRef, Stack) of
- true ->
- throw({'$typeserver',{self_reference,FullTypeRef}});
- false ->
- TypeRef = {type,Name,Arity},
- AbsType = get_abs_type(RemMod, TypeRef, ArgForms, IsRemote),
- is_instance(X, RemMod, AbsType, [FullTypeRef|Stack])
- end.
-
--spec get_abs_type(mod_name(), type_ref(), [abs_type()], boolean()) ->
- abs_type().
-get_abs_type(RemMod, TypeRef, ArgForms, IsRemote) ->
- case get_type_repr(RemMod, TypeRef, IsRemote) of
- {ok,TypeRepr} ->
- {FinalAbsType,SymbInfo,VarNames} =
- case TypeRepr of
- {cached,_FinType,FAT,SI} -> {FAT,SI,[]};
- {abs_type,FAT,VN,SI} -> {FAT,SI,VN}
- end,
- AbsType =
- case SymbInfo of
- not_symb -> FinalAbsType;
- {orig_abs,OrigAbsType} -> OrigAbsType
- end,
- VarSubstsDict = dict:from_list(lists:zip(VarNames,ArgForms)),
- update_vars(AbsType, VarSubstsDict, false);
- {error,Reason} ->
- throw({'$typeserver',Reason})
- end.
-
--spec abs_expr_error(atom(), abs_expr()) -> no_return().
-abs_expr_error(ImmReason, Expr) ->
- {error,Reason} = expr_error(ImmReason, Expr),
- throw({'$typeserver',Reason}).
-
--spec abs_expr_error(atom(), abs_expr(), abs_expr()) -> no_return().
-abs_expr_error(ImmReason, Expr1, Expr2) ->
- {error,Reason} = expr_error(ImmReason, Expr1, Expr2),
- throw({'$typeserver',Reason}).
-
-
-%%------------------------------------------------------------------------------
-%% Type translation functions
-%%------------------------------------------------------------------------------
-
--spec convert(mod_name(), abs_type(), state()) ->
- rich_result2(fin_type(),state()).
-convert(Mod, TypeForm, State) ->
- case convert(Mod, TypeForm, State, [], dict:new()) of
- {ok,{simple,Type},NewState} ->
- {ok, Type, NewState};
- {ok,{rec,_RecFun,_RecArgs},_NewState} ->
- {error, {internal,rec_returned_to_toplevel}};
- {error,_Reason} = Error ->
- Error
- end.
-
--spec convert(mod_name(), abs_type(), state(), stack(), var_dict()) ->
- rich_result2(ret_type(),state()).
-convert(Mod, {paren_type,_,[Type]}, State, Stack, VarDict) ->
- convert(Mod, Type, State, Stack, VarDict);
-convert(Mod, {ann_type,_,[_Var,Type]}, State, Stack, VarDict) ->
- convert(Mod, Type, State, Stack, VarDict);
-convert(_Mod, {var,_,'_'}, State, _Stack, _VarDict) ->
- {ok, {simple,proper_types:any()}, State};
-convert(_Mod, {var,_,VarName}, State, _Stack, VarDict) ->
- case dict:find(VarName, VarDict) of
- %% TODO: do we need to check if we are at toplevel of a recursive?
- {ok,RetType} -> {ok, RetType, State};
- error -> {error, {unbound_var,VarName}}
- end;
-convert(Mod, {remote_type,_,[{atom,_,RemMod},{atom,_,Name},ArgForms]}, State,
- Stack, VarDict) ->
- case prepare_for_remote(RemMod, Name, length(ArgForms), State) of
- {ok,NewState} ->
- convert_custom(Mod,RemMod,Name,ArgForms,NewState,Stack,VarDict);
- {error,_Reason} = Error ->
- Error
- end;
-convert(_Mod, {atom,_,Atom}, State, _Stack, _VarDict) ->
- {ok, {simple,proper_types:exactly(Atom)}, State};
-convert(_Mod, {integer,_,_Int} = IntExpr, State, _Stack, _VarDict) ->
- convert_integer(IntExpr, State);
-convert(_Mod, {op,_,_Op,_Arg} = OpExpr, State, _Stack, _VarDict) ->
- convert_integer(OpExpr, State);
-convert(_Mod, {op,_,_Op,_Arg1,_Arg2} = OpExpr, State, _Stack, _VarDict) ->
- convert_integer(OpExpr, State);
-convert(_Mod, {type,_,binary,[BaseExpr,UnitExpr]}, State, _Stack, _VarDict) ->
- %% <<_:X,_:_*Y>> means "bitstrings of X + k*Y bits, k >= 0"
- case eval_int(BaseExpr) of
- {ok,0} ->
- case eval_int(UnitExpr) of
- {ok,0} -> {ok, {simple,proper_types:exactly(<<>>)}, State};
- {ok,1} -> {ok, {simple,proper_types:bitstring()}, State};
- {ok,8} -> {ok, {simple,proper_types:binary()}, State};
- {ok,N} when N > 0 ->
- Gen = ?LET(L, proper_types:list(proper_types:bitstring(N)),
- concat_bitstrings(L)),
- {ok, {simple,Gen}, State};
- _ -> expr_error(invalid_unit, UnitExpr)
- end;
- {ok,Base} when Base > 0 ->
- Head = proper_types:bitstring(Base),
- case eval_int(UnitExpr) of
- {ok,0} -> {ok, {simple,Head}, State};
- {ok,1} ->
- Tail = proper_types:bitstring(),
- {ok, {simple,concat_binary_gens(Head, Tail)}, State};
- {ok,8} ->
- Tail = proper_types:binary(),
- {ok, {simple,concat_binary_gens(Head, Tail)}, State};
- {ok,N} when N > 0 ->
- Tail =
- ?LET(L, proper_types:list(proper_types:bitstring(N)),
- concat_bitstrings(L)),
- {ok, {simple,concat_binary_gens(Head, Tail)}, State};
- _ -> expr_error(invalid_unit, UnitExpr)
- end;
- _ ->
- expr_error(invalid_base, BaseExpr)
- end;
-convert(_Mod, {type,_,range,[LowExpr,HighExpr]}, State, _Stack, _VarDict) ->
- case {eval_int(LowExpr),eval_int(HighExpr)} of
- {{ok,Low},{ok,High}} when Low =< High ->
- {ok, {simple,proper_types:integer(Low,High)}, State};
- _ ->
- expr_error(invalid_range, LowExpr, HighExpr)
- end;
-convert(_Mod, {type,_,nil,[]}, State, _Stack, _VarDict) ->
- {ok, {simple,proper_types:exactly([])}, State};
-convert(Mod, {type,_,list,[ElemForm]}, State, Stack, VarDict) ->
- convert_list(Mod, false, ElemForm, State, Stack, VarDict);
-convert(Mod, {type,_,nonempty_list,[ElemForm]}, State, Stack, VarDict) ->
- convert_list(Mod, true, ElemForm, State, Stack, VarDict);
-convert(_Mod, {type,_,nonempty_list,[]}, State, _Stack, _VarDict) ->
- {ok, {simple,proper_types:non_empty(proper_types:list())}, State};
-convert(_Mod, {type,_,nonempty_string,[]}, State, _Stack, _VarDict) ->
- {ok, {simple,proper_types:non_empty(proper_types:string())}, State};
-convert(_Mod, {type,_,tuple,any}, State, _Stack, _VarDict) ->
- {ok, {simple,proper_types:tuple()}, State};
-convert(Mod, {type,_,tuple,ElemForms}, State, Stack, VarDict) ->
- convert_tuple(Mod, ElemForms, false, State, Stack, VarDict);
-convert(Mod, {type,_,'$fixed_list',ElemForms}, State, Stack, VarDict) ->
- convert_tuple(Mod, ElemForms, true, State, Stack, VarDict);
-convert(Mod, {type,_,record,[{atom,_,Name}|FieldForms]}, State, Stack,
- VarDict) ->
- convert_record(Mod, Name, FieldForms, State, Stack, VarDict);
-convert(Mod, {type,_,union,ChoiceForms}, State, Stack, VarDict) ->
- convert_union(Mod, ChoiceForms, State, Stack, VarDict);
-convert(Mod, {type,_,'fun',[{type,_,product,Domain},Range]}, State, Stack,
- VarDict) ->
- convert_fun(Mod, length(Domain), Range, State, Stack, VarDict);
-%% TODO: These types should be replaced with accurate types.
-%% TODO: Add support for nonempty_improper_list/2.
-convert(Mod, {type,_,maybe_improper_list,[]}, State, Stack, VarDict) ->
- convert(Mod, {type,0,list,[]}, State, Stack, VarDict);
-convert(Mod, {type,_,maybe_improper_list,[Cont,_Ter]}, State, Stack, VarDict) ->
- convert(Mod, {type,0,list,[Cont]}, State, Stack, VarDict);
-convert(Mod, {type,_,nonempty_maybe_improper_list,[]}, State, Stack, VarDict) ->
- convert(Mod, {type,0,nonempty_list,[]}, State, Stack, VarDict);
-convert(Mod, {type,_,nonempty_maybe_improper_list,[Cont,_Term]}, State, Stack,
- VarDict) ->
- convert(Mod, {type,0,nonempty_list,[Cont]}, State, Stack, VarDict);
-convert(Mod, {type,_,iodata,[]}, State, Stack, VarDict) ->
- RealType = {type,0,union,[{type,0,binary,[]},{type,0,iolist,[]}]},
- convert(Mod, RealType, State, Stack, VarDict);
-convert(Mod, {type,_,Name,[]}, State, Stack, VarDict) ->
- case ordsets:is_element(Name, ?STD_TYPES_0) of
- true ->
- {ok, {simple,proper_types:Name()}, State};
- false ->
- convert_maybe_hard_adt(Mod, Name, [], State, Stack, VarDict)
- end;
-convert(Mod, {type,_,Name,ArgForms}, State, Stack, VarDict) ->
- convert_maybe_hard_adt(Mod, Name, ArgForms, State, Stack, VarDict);
-convert(_Mod, TypeForm, _State, _Stack, _VarDict) ->
- {error, {unsupported_type,TypeForm}}.
-
--spec concat_bitstrings([bitstring()]) -> bitstring().
-concat_bitstrings(BitStrings) ->
- concat_bitstrings_tr(BitStrings, <<>>).
-
--spec concat_bitstrings_tr([bitstring()], bitstring()) -> bitstring().
-concat_bitstrings_tr([], Acc) ->
- Acc;
-concat_bitstrings_tr([BitString | Rest], Acc) ->
- concat_bitstrings_tr(Rest, <<Acc/bits,BitString/bits>>).
-
--spec concat_binary_gens(fin_type(), fin_type()) -> fin_type().
-concat_binary_gens(HeadType, TailType) ->
- ?LET({H,T}, {HeadType,TailType}, <<H/bits,T/bits>>).
-
--spec convert_fun(mod_name(), arity(), abs_type(), state(), stack(),
- var_dict()) -> rich_result2(ret_type(),state()).
-convert_fun(Mod, Arity, Range, State, Stack, VarDict) ->
- case convert(Mod, Range, State, ['fun' | Stack], VarDict) of
- {ok,{simple,RangeType},NewState} ->
- {ok, {simple,proper_types:function(Arity,RangeType)}, NewState};
- {ok,{rec,RecFun,RecArgs},NewState} ->
- case at_toplevel(RecArgs, Stack) of
- true -> base_case_error(Stack);
- false -> convert_rec_fun(Arity, RecFun, RecArgs, NewState)
- end;
- {error,_Reason} = Error ->
- Error
- end.
-
--spec convert_rec_fun(arity(), rec_fun(), rec_args(), state()) ->
- {'ok',ret_type(),state()}.
-convert_rec_fun(Arity, RecFun, RecArgs, State) ->
- %% We bind the generated value by size.
- NewRecFun =
- fun(GenFuns,Size) ->
- proper_types:function(Arity, RecFun(GenFuns,Size))
- end,
- NewRecArgs = clean_rec_args(RecArgs),
- {ok, {rec,NewRecFun,NewRecArgs}, State}.
-
--spec convert_list(mod_name(), boolean(), abs_type(), state(), stack(),
- var_dict()) -> rich_result2(ret_type(),state()).
-convert_list(Mod, NonEmpty, ElemForm, State, Stack, VarDict) ->
- case convert(Mod, ElemForm, State, [list | Stack], VarDict) of
- {ok,{simple,ElemType},NewState} ->
- InnerType = proper_types:list(ElemType),
- FinType = case NonEmpty of
- true -> proper_types:non_empty(InnerType);
- false -> InnerType
- end,
- {ok, {simple,FinType}, NewState};
- {ok,{rec,RecFun,RecArgs},NewState} ->
- case {at_toplevel(RecArgs,Stack), NonEmpty} of
- {true,true} ->
- base_case_error(Stack);
- {true,false} ->
- NewRecFun =
- fun(GenFuns,Size) ->
- ElemGen = fun(S) -> ?LAZY(RecFun(GenFuns,S)) end,
- proper_types:distlist(Size, ElemGen, false)
- end,
- NewRecArgs = clean_rec_args(RecArgs),
- {ok, {rec,NewRecFun,NewRecArgs}, NewState};
- {false,_} ->
- {NewRecFun,NewRecArgs} =
- convert_rec_list(RecFun, RecArgs, NonEmpty),
- {ok, {rec,NewRecFun,NewRecArgs}, NewState}
- end;
- {error,_Reason} = Error ->
- Error
- end.
-
--spec convert_rec_list(rec_fun(), rec_args(), boolean()) ->
- {rec_fun(),rec_args()}.
-convert_rec_list(RecFun, [{true,FullTypeRef}] = RecArgs, NonEmpty) ->
- {NewRecFun,_NormalRecArgs} =
- convert_normal_rec_list(RecFun, RecArgs, NonEmpty),
- AltRecFun =
- fun([InstListGen],Size) ->
- InstTypesList =
- proper_types:get_prop(internal_types, InstListGen(Size)),
- proper_types:fixed_list([RecFun([fun(_Size) -> I end],0)
- || I <- InstTypesList])
- end,
- NewRecArgs = [{{list,NonEmpty,AltRecFun},FullTypeRef}],
- {NewRecFun, NewRecArgs};
-convert_rec_list(RecFun, RecArgs, NonEmpty) ->
- convert_normal_rec_list(RecFun, RecArgs, NonEmpty).
-
--spec convert_normal_rec_list(rec_fun(), rec_args(), boolean()) ->
- {rec_fun(),rec_args()}.
-convert_normal_rec_list(RecFun, RecArgs, NonEmpty) ->
- NewRecFun = fun(GenFuns,Size) ->
- ElemGen = fun(S) -> RecFun(GenFuns, S) end,
- proper_types:distlist(Size, ElemGen, NonEmpty)
- end,
- NewRecArgs = clean_rec_args(RecArgs),
- {NewRecFun, NewRecArgs}.
-
--spec convert_tuple(mod_name(), [abs_type()], boolean(), state(), stack(),
- var_dict()) -> rich_result2(ret_type(),state()).
-convert_tuple(Mod, ElemForms, ToList, State, Stack, VarDict) ->
- case process_list(Mod, ElemForms, State, [tuple | Stack], VarDict) of
- {ok,RetTypes,NewState} ->
- case combine_ret_types(RetTypes, {tuple,ToList}) of
- {simple,_FinType} = RetType ->
- {ok, RetType, NewState};
- {rec,_RecFun,RecArgs} = RetType ->
- case at_toplevel(RecArgs, Stack) of
- true -> base_case_error(Stack);
- false -> {ok, RetType, NewState}
- end
- end;
- {error,_Reason} = Error ->
- Error
- end.
-
--spec convert_union(mod_name(), [abs_type()], state(), stack(), var_dict()) ->
- rich_result2(ret_type(),state()).
-convert_union(Mod, ChoiceForms, State, Stack, VarDict) ->
- case process_list(Mod, ChoiceForms, State, [union | Stack], VarDict) of
- {ok,RawChoices,NewState} ->
- ProcessChoice = fun(T,A) -> process_choice(T,A,Stack) end,
- {RevSelfRecs,RevNonSelfRecs,RevNonRecs} =
- lists:foldl(ProcessChoice, {[],[],[]}, RawChoices),
- case {lists:reverse(RevSelfRecs),lists:reverse(RevNonSelfRecs),
- lists:reverse(RevNonRecs)} of
- {_SelfRecs,[],[]} ->
- base_case_error(Stack);
- {[],NonSelfRecs,NonRecs} ->
- {ok, combine_ret_types(NonRecs ++ NonSelfRecs, union),
- NewState};
- {SelfRecs,NonSelfRecs,NonRecs} ->
- {BCaseRecFun,BCaseRecArgs} =
- case combine_ret_types(NonRecs ++ NonSelfRecs, union) of
- {simple,BCaseType} ->
- {fun([],_Size) -> BCaseType end,[]};
- {rec,BCRecFun,BCRecArgs} ->
- {BCRecFun,BCRecArgs}
- end,
- NumBCaseGens = length(BCaseRecArgs),
- [ParentRef | _Upper] = Stack,
- FallbackRecFun = fun([SelfGen],_Size) -> SelfGen(0) end,
- FallbackRecArgs = [{false,ParentRef}],
- FallbackRetType = {rec,FallbackRecFun,FallbackRecArgs},
- {rec,RCaseRecFun,RCaseRecArgs} =
- combine_ret_types([FallbackRetType] ++ SelfRecs
- ++ NonSelfRecs, wunion),
- NewRecFun =
- fun(AllGens,Size) ->
- {BCaseGens,RCaseGens} =
- lists:split(NumBCaseGens, AllGens),
- case Size of
- 0 -> BCaseRecFun(BCaseGens,0);
- _ -> RCaseRecFun(RCaseGens,Size)
- end
- end,
- NewRecArgs = BCaseRecArgs ++ RCaseRecArgs,
- {ok, {rec,NewRecFun,NewRecArgs}, NewState}
- end;
- {error,_Reason} = Error ->
- Error
- end.
-
--spec process_choice(ret_type(), {[ret_type()],[ret_type()],[ret_type()]},
- stack()) -> {[ret_type()],[ret_type()],[ret_type()]}.
-process_choice({simple,_} = RetType, {SelfRecs,NonSelfRecs,NonRecs}, _Stack) ->
- {SelfRecs, NonSelfRecs, [RetType | NonRecs]};
-process_choice({rec,RecFun,RecArgs}, {SelfRecs,NonSelfRecs,NonRecs}, Stack) ->
- case at_toplevel(RecArgs, Stack) of
- true ->
- case partition_by_toplevel(RecArgs, Stack, true) of
- {[],[],_,_} ->
- NewRecArgs = clean_rec_args(RecArgs),
- {[{rec,RecFun,NewRecArgs} | SelfRecs], NonSelfRecs,
- NonRecs};
- {SelfRecArgs,SelfPos,OtherRecArgs,_OtherPos} ->
- NumInstances = length(SelfRecArgs),
- IsListInst = fun({true,_FTRef}) -> false
- ; ({{list,_NE,_AltRecFun},_FTRef}) -> true
- end,
- NewRecFun =
- case proper_arith:filter(IsListInst,SelfRecArgs) of
- {[],[]} ->
- no_list_inst_rec_fun(RecFun,NumInstances,
- SelfPos);
- {[{{list,NonEmpty,AltRecFun},_}],[ListInstPos]} ->
- list_inst_rec_fun(AltRecFun,NumInstances,
- SelfPos,NonEmpty,ListInstPos)
- end,
- [{_B,SelfRef} | _] = SelfRecArgs,
- NewRecArgs =
- [{false,SelfRef} | clean_rec_args(OtherRecArgs)],
- {[{rec,NewRecFun,NewRecArgs} | SelfRecs], NonSelfRecs,
- NonRecs}
- end;
- false ->
- NewRecArgs = clean_rec_args(RecArgs),
- {SelfRecs, [{rec,RecFun,NewRecArgs} | NonSelfRecs], NonRecs}
- end.
-
--spec no_list_inst_rec_fun(rec_fun(), pos_integer(), [position()]) -> rec_fun().
-no_list_inst_rec_fun(RecFun, NumInstances, SelfPos) ->
- fun([SelfGen|OtherGens], Size) ->
- ?LETSHRINK(
- Instances,
- %% Size distribution will be a little off if both normal and
- %% instance-accepting generators are present.
- lists:duplicate(NumInstances, SelfGen(Size div NumInstances)),
- begin
- InstGens = [fun(_Size) -> proper_types:exactly(I) end
- || I <- Instances],
- AllGens = proper_arith:insert(InstGens, SelfPos, OtherGens),
- RecFun(AllGens, Size)
- end)
- end.
-
--spec list_inst_rec_fun(rec_fun(), pos_integer(), [position()], boolean(),
- position()) -> rec_fun().
-list_inst_rec_fun(AltRecFun, NumInstances, SelfPos, NonEmpty, ListInstPos) ->
- fun([SelfGen|OtherGens], Size) ->
- ?LETSHRINK(
- AllInsts,
- lists:duplicate(NumInstances - 1, SelfGen(Size div NumInstances))
- ++ proper_types:distlist(Size div NumInstances, SelfGen, NonEmpty),
- begin
- {Instances,InstList} = lists:split(NumInstances - 1, AllInsts),
- InstGens = [fun(_Size) -> proper_types:exactly(I) end
- || I <- Instances],
- InstTypesList = [proper_types:exactly(I) || I <- InstList],
- InstListGen =
- fun(_Size) -> proper_types:fixed_list(InstTypesList) end,
- AllInstGens = proper_arith:list_insert(ListInstPos, InstListGen,
- InstGens),
- AllGens = proper_arith:insert(AllInstGens, SelfPos, OtherGens),
- AltRecFun(AllGens, Size)
- end)
- end.
-
--spec convert_maybe_hard_adt(mod_name(), type_name(), [abs_type()], state(),
- stack(), var_dict()) ->
- rich_result2(ret_type(),state()).
-convert_maybe_hard_adt(Mod, Name, ArgForms, State, Stack, VarDict) ->
- Arity = length(ArgForms),
- case orddict:find({Name,Arity}, ?HARD_ADTS) of
- {ok,Mod} ->
- convert_custom(Mod, Mod, Name, ArgForms, State, Stack, VarDict);
- {ok,ADTMod} ->
- ADT = {remote_type,0,[{atom,0,ADTMod},{atom,0,Name},ArgForms]},
- convert(Mod, ADT, State, Stack, VarDict);
- error ->
- convert_custom(Mod, Mod, Name, ArgForms, State, Stack, VarDict)
- end.
-
--spec convert_custom(mod_name(), mod_name(), type_name(), [abs_type()], state(),
- stack(), var_dict()) -> rich_result2(ret_type(),state()).
-convert_custom(Mod, RemMod, Name, ArgForms, State, Stack, VarDict) ->
- case process_list(Mod, ArgForms, State, Stack, VarDict) of
- {ok,Args,NewState} ->
- Arity = length(Args),
- TypeRef = {type,Name,Arity},
- FullTypeRef = {RemMod,type,Name,Args},
- convert_type(TypeRef, FullTypeRef, NewState, Stack);
- {error,_Reason} = Error ->
- Error
- end.
-
--spec convert_record(mod_name(), type_name(), [abs_type()], state(), stack(),
- var_dict()) -> rich_result2(ret_type(),state()).
-convert_record(Mod, Name, RawSubsts, State, Stack, VarDict) ->
- Substs = [{N,T} || {type,_,field_type,[{atom,_,N},T]} <- RawSubsts],
- {SubstFields,SubstTypeForms} = lists:unzip(Substs),
- case process_list(Mod, SubstTypeForms, State, Stack, VarDict) of
- {ok,SubstTypes,NewState} ->
- SubstsDict = dict:from_list(lists:zip(SubstFields, SubstTypes)),
- TypeRef = {record,Name,0},
- FullTypeRef = {Mod,record,Name,SubstsDict},
- convert_type(TypeRef, FullTypeRef, NewState, Stack);
- {error,_Reason} = Error ->
- Error
- end.
-
--spec convert_type(type_ref(), full_type_ref(), state(), stack()) ->
- rich_result2(ret_type(),state()).
-convert_type(TypeRef, {Mod,_Kind,_Name,_Spec} = FullTypeRef, State, Stack) ->
- case stack_position(FullTypeRef, Stack) of
- none ->
- case get_type_repr(Mod, TypeRef, false, State) of
- {ok,TypeRepr,NewState} ->
- convert_new_type(TypeRef, FullTypeRef, TypeRepr, NewState,
- Stack);
- {error,_Reason} = Error ->
- Error
- end;
- 1 ->
- base_case_error(Stack);
- _Pos ->
- {ok, {rec,fun([Gen],Size) -> Gen(Size) end,[{true,FullTypeRef}]},
- State}
- end.
-
--spec convert_new_type(type_ref(), full_type_ref(), type_repr(), state(),
- stack()) -> rich_result2(ret_type(),state()).
-convert_new_type(_TypeRef, {_Mod,type,_Name,[]},
- {cached,FinType,_TypeForm,_SymbInfo}, State, _Stack) ->
- {ok, {simple,FinType}, State};
-convert_new_type(TypeRef, {Mod,type,_Name,Args} = FullTypeRef,
- {abs_type,TypeForm,Vars,SymbInfo}, State, Stack) ->
- VarDict = dict:from_list(lists:zip(Vars, Args)),
- case convert(Mod, TypeForm, State, [FullTypeRef | Stack], VarDict) of
- {ok, {simple,ImmFinType}, NewState} ->
- FinType = case SymbInfo of
- not_symb ->
- ImmFinType;
- {orig_abs,_OrigAbsType} ->
- proper_symb:internal_well_defined(ImmFinType)
- end,
- FinalState = case Vars of
- [] -> cache_type(Mod, TypeRef, FinType, TypeForm,
- SymbInfo, NewState);
- _ -> NewState
- end,
- {ok, {simple,FinType}, FinalState};
- {ok, {rec,RecFun,RecArgs}, NewState} ->
- convert_maybe_rec(FullTypeRef, SymbInfo, RecFun, RecArgs, NewState,
- Stack);
- {error,_Reason} = Error ->
- Error
- end;
-convert_new_type(_TypeRef, {Mod,record,Name,SubstsDict} = FullTypeRef,
- {abs_record,OrigFields}, State, Stack) ->
- Fields = [case dict:find(FieldName, SubstsDict) of
- {ok,NewFieldType} -> NewFieldType;
- error -> OrigFieldType
- end
- || {FieldName,OrigFieldType} <- OrigFields],
- case convert_tuple(Mod, [{atom,0,Name} | Fields], false, State,
- [FullTypeRef | Stack], dict:new()) of
- {ok, {simple,_FinType}, _NewState} = Result ->
- Result;
- {ok, {rec,RecFun,RecArgs}, NewState} ->
- convert_maybe_rec(FullTypeRef, not_symb, RecFun, RecArgs, NewState,
- Stack);
- {error,_Reason} = Error ->
- Error
- end.
-
--spec cache_type(mod_name(), type_ref(), fin_type(), abs_type(), symb_info(),
- state()) -> state().
-cache_type(Mod, TypeRef, FinType, TypeForm, SymbInfo,
- #state{types = Types} = State) ->
- TypeRepr = {cached,FinType,TypeForm,SymbInfo},
- ModTypes = dict:fetch(Mod, Types),
- NewModTypes = dict:store(TypeRef, TypeRepr, ModTypes),
- NewTypes = dict:store(Mod, NewModTypes, Types),
- State#state{types = NewTypes}.
-
--spec convert_maybe_rec(full_type_ref(), symb_info(), rec_fun(), rec_args(),
- state(), stack()) -> rich_result2(ret_type(),state()).
-convert_maybe_rec(FullTypeRef, SymbInfo, RecFun, RecArgs, State, Stack) ->
- case at_toplevel(RecArgs, Stack) of
- true -> base_case_error(Stack);
- false -> safe_convert_maybe_rec(FullTypeRef, SymbInfo, RecFun, RecArgs,
- State)
- end.
-
--spec safe_convert_maybe_rec(full_type_ref(),symb_info(),rec_fun(),rec_args(),
- state()) -> rich_result2(ret_type(),state()).
-safe_convert_maybe_rec(FullTypeRef, SymbInfo, RecFun, RecArgs, State) ->
- case partition_rec_args(FullTypeRef, RecArgs, false) of
- {[],[],_,_} ->
- {ok, {rec,RecFun,RecArgs}, State};
- {MyRecArgs,MyPos,OtherRecArgs,_OtherPos} ->
- case lists:all(fun({B,_T}) -> B =:= false end, MyRecArgs) of
- true -> convert_rec_type(SymbInfo, RecFun, MyPos, OtherRecArgs,
- State);
- false -> {error, {internal,true_rec_arg_reached_type}}
- end
- end.
-
--spec convert_rec_type(symb_info(), rec_fun(), [position()], rec_args(),
- state()) -> {ok, ret_type(), state()}.
-convert_rec_type(SymbInfo, RecFun, MyPos, [], State) ->
- NumRecArgs = length(MyPos),
- M = fun(GenFun) ->
- fun(Size) ->
- GenFuns = lists:duplicate(NumRecArgs, GenFun),
- RecFun(GenFuns, erlang:max(0,Size - 1))
- end
- end,
- SizedGen = y(M),
- ImmFinType = ?SIZED(Size,SizedGen(Size + 1)),
- FinType = case SymbInfo of
- not_symb ->
- ImmFinType;
- {orig_abs,_OrigAbsType} ->
- proper_symb:internal_well_defined(ImmFinType)
- end,
- {ok, {simple,FinType}, State};
-convert_rec_type(_SymbInfo, RecFun, MyPos, OtherRecArgs, State) ->
- NumRecArgs = length(MyPos),
- NewRecFun =
- fun(OtherGens,TopSize) ->
- M = fun(GenFun) ->
- fun(Size) ->
- GenFuns = lists:duplicate(NumRecArgs, GenFun),
- AllGens =
- proper_arith:insert(GenFuns, MyPos, OtherGens),
- RecFun(AllGens, erlang:max(0,Size - 1))
- end
- end,
- (y(M))(TopSize)
- end,
- NewRecArgs = clean_rec_args(OtherRecArgs),
- {ok, {rec,NewRecFun,NewRecArgs}, State}.
-
-%% Y Combinator: Read more at http://bc.tech.coop/blog/070611.html.
--spec y(fun((fun((T) -> S)) -> fun((T) -> S))) -> fun((T) -> S).
-y(M) ->
- G = fun(F) ->
- M(fun(A) -> (F(F))(A) end)
- end,
- G(G).
-
--spec process_list(mod_name(), [abs_type() | ret_type()], state(), stack(),
- var_dict()) -> rich_result2([ret_type()],state()).
-process_list(Mod, RawTypes, State, Stack, VarDict) ->
- Process = fun({simple,_FinType} = Type, {ok,Types,State1}) ->
- {ok, [Type|Types], State1};
- ({rec,_RecFun,_RecArgs} = Type, {ok,Types,State1}) ->
- {ok, [Type|Types], State1};
- (TypeForm, {ok,Types,State1}) ->
- case convert(Mod, TypeForm, State1, Stack, VarDict) of
- {ok,Type,State2} -> {ok,[Type|Types],State2};
- {error,_} = Err -> Err
- end;
- (_RawType, {error,_} = Err) ->
- Err
- end,
- case lists:foldl(Process, {ok,[],State}, RawTypes) of
- {ok,RevTypes,NewState} ->
- {ok, lists:reverse(RevTypes), NewState};
- {error,_Reason} = Error ->
- Error
- end.
-
--spec convert_integer(abs_expr(), state()) -> rich_result2(ret_type(),state()).
-convert_integer(Expr, State) ->
- case eval_int(Expr) of
- {ok,Int} -> {ok, {simple,proper_types:exactly(Int)}, State};
- error -> expr_error(invalid_int_const, Expr)
- end.
-
--spec eval_int(abs_expr()) -> tagged_result(integer()).
-eval_int(Expr) ->
- NoBindings = erl_eval:new_bindings(),
- try erl_eval:expr(Expr, NoBindings) of
- {value,Value,_NewBindings} when is_integer(Value) ->
- {ok, Value};
- _ ->
- error
- catch
- error:_ ->
- error
- end.
-
--spec expr_error(atom(), abs_expr()) -> {'error',term()}.
-expr_error(Reason, Expr) ->
- {error, {Reason,lists:flatten(erl_pp:expr(Expr))}}.
-
--spec expr_error(atom(), abs_expr(), abs_expr()) -> {'error',term()}.
-expr_error(Reason, Expr1, Expr2) ->
- Str1 = lists:flatten(erl_pp:expr(Expr1)),
- Str2 = lists:flatten(erl_pp:expr(Expr2)),
- {error, {Reason,Str1,Str2}}.
-
--spec base_case_error(stack()) -> {'error',term()}.
-%% TODO: This might confuse, since it doesn't record the arguments to parametric
-%% types or the type subsitutions of a record.
-base_case_error([{Mod,type,Name,Args} | _Upper]) ->
- Arity = length(Args),
- {error, {no_base_case,{Mod,type,Name,Arity}}};
-base_case_error([{Mod,record,Name,_SubstsDict} | _Upper]) ->
- {error, {no_base_case,{Mod,record,Name}}}.
-
-
-%%------------------------------------------------------------------------------
-%% Helper datatypes handling functions
-%%------------------------------------------------------------------------------
-
--spec stack_position(full_type_ref(), stack()) -> 'none' | pos_integer().
-stack_position(FullTypeRef, Stack) ->
- SameType = fun(A) -> same_full_type_ref(A,FullTypeRef) end,
- case proper_arith:find_first(SameType, Stack) of
- {Pos,_} -> Pos;
- none -> none
- end.
-
--spec partition_by_toplevel(rec_args(), stack(), boolean()) ->
- {rec_args(),[position()],rec_args(),[position()]}.
-partition_by_toplevel(RecArgs, [], _OnlyInstanceAccepting) ->
- {[],[],RecArgs,lists:seq(1,length(RecArgs))};
-partition_by_toplevel(RecArgs, [_Parent | _Upper], _OnlyInstanceAccepting)
- when is_atom(_Parent) ->
- {[],[],RecArgs,lists:seq(1,length(RecArgs))};
-partition_by_toplevel(RecArgs, [Parent | _Upper], OnlyInstanceAccepting) ->
- partition_rec_args(Parent, RecArgs, OnlyInstanceAccepting).
-
--spec at_toplevel(rec_args(), stack()) -> boolean().
-at_toplevel(RecArgs, Stack) ->
- case partition_by_toplevel(RecArgs, Stack, false) of
- {[],[],_,_} -> false;
- _ -> true
- end.
-
--spec partition_rec_args(full_type_ref(), rec_args(), boolean()) ->
- {rec_args(),[position()],rec_args(),[position()]}.
-partition_rec_args(FullTypeRef, RecArgs, OnlyInstanceAccepting) ->
- SameType =
- case OnlyInstanceAccepting of
- true -> fun({false,_T}) -> false
- ; ({_B,T}) -> same_full_type_ref(T,FullTypeRef) end;
- false -> fun({_B,T}) -> same_full_type_ref(T,FullTypeRef) end
- end,
- proper_arith:partition(SameType, RecArgs).
-
-%% Tuples can be of 0 arity, unions of 1 and wunions at least of 2.
--spec combine_ret_types([ret_type()], {'tuple',boolean()} | 'union'
- | 'wunion') -> ret_type().
-combine_ret_types(RetTypes, EnclosingType) ->
- case lists:all(fun is_simple_ret_type/1, RetTypes) of
- true ->
- %% This should never happen for wunion.
- Combine = case EnclosingType of
- {tuple,false} -> fun proper_types:tuple/1;
- {tuple,true} -> fun proper_types:fixed_list/1;
- union -> fun proper_types:union/1
- end,
- FinTypes = [T || {simple,T} <- RetTypes],
- {simple, Combine(FinTypes)};
- false ->
- NumTypes = length(RetTypes),
- {RevRecFuns,RevRecArgsList,NumRecs} =
- lists:foldl(fun add_ret_type/2, {[],[],0}, RetTypes),
- RecFuns = lists:reverse(RevRecFuns),
- RecArgsList = lists:reverse(RevRecArgsList),
- RecArgLens = [length(RecArgs) || RecArgs <- RecArgsList],
- RecFunInfo = {NumTypes,NumRecs,RecArgLens,RecFuns},
- FlatRecArgs = lists:flatten(RecArgsList),
- {NewRecFun,NewRecArgs} =
- case EnclosingType of
- {tuple,ToList} ->
- {tuple_rec_fun(RecFunInfo,ToList),
- soft_clean_rec_args(FlatRecArgs,RecFunInfo,ToList)};
- union ->
- {union_rec_fun(RecFunInfo),clean_rec_args(FlatRecArgs)};
- wunion ->
- {wunion_rec_fun(RecFunInfo),
- clean_rec_args(FlatRecArgs)}
- end,
- {rec, NewRecFun, NewRecArgs}
- end.
-
--spec tuple_rec_fun(rec_fun_info(), boolean()) -> rec_fun().
-tuple_rec_fun({_NumTypes,NumRecs,RecArgLens,RecFuns}, ToList) ->
- Combine = case ToList of
- true -> fun proper_types:fixed_list/1;
- false -> fun proper_types:tuple/1
- end,
- fun(AllGFs,TopSize) ->
- Size = TopSize div NumRecs,
- GFsList = proper_arith:unflatten(AllGFs, RecArgLens),
- ArgsList = [[GenFuns,Size] || GenFuns <- GFsList],
- ZipFun = fun erlang:apply/2,
- Combine(lists:zipwith(ZipFun, RecFuns, ArgsList))
- end.
-
--spec union_rec_fun(rec_fun_info()) -> rec_fun().
-union_rec_fun({_NumTypes,_NumRecs,RecArgLens,RecFuns}) ->
- fun(AllGFs,Size) ->
- GFsList = proper_arith:unflatten(AllGFs, RecArgLens),
- ArgsList = [[GenFuns,Size] || GenFuns <- GFsList],
- ZipFun = fun(F,A) -> ?LAZY(apply(F,A)) end,
- proper_types:union(lists:zipwith(ZipFun, RecFuns, ArgsList))
- end.
-
--spec wunion_rec_fun(rec_fun_info()) -> rec_fun().
-wunion_rec_fun({NumTypes,_NumRecs,RecArgLens,RecFuns}) ->
- fun(AllGFs,Size) ->
- GFsList = proper_arith:unflatten(AllGFs, RecArgLens),
- ArgsList = [[GenFuns,Size] || GenFuns <- GFsList],
- ZipFun = fun(W,F,A) -> {W,?LAZY(apply(F,A))} end,
- RecWeight = erlang:max(1, Size div (NumTypes - 1)),
- Weights = [1 | lists:duplicate(NumTypes - 1, RecWeight)],
- WeightedChoices = lists:zipwith3(ZipFun, Weights, RecFuns, ArgsList),
- proper_types:wunion(WeightedChoices)
- end.
-
--spec add_ret_type(ret_type(), {[rec_fun()],[rec_args()],non_neg_integer()}) ->
- {[rec_fun()],[rec_args()],non_neg_integer()}.
-add_ret_type({simple,FinType}, {RecFuns,RecArgsList,NumRecs}) ->
- {[fun([],_) -> FinType end | RecFuns], [[] | RecArgsList], NumRecs};
-add_ret_type({rec,RecFun,RecArgs}, {RecFuns,RecArgsList,NumRecs}) ->
- {[RecFun | RecFuns], [RecArgs | RecArgsList], NumRecs + 1}.
-
--spec is_simple_ret_type(ret_type()) -> boolean().
-is_simple_ret_type({simple,_FinType}) ->
- true;
-is_simple_ret_type({rec,_RecFun,_RecArgs}) ->
- false.
-
--spec clean_rec_args(rec_args()) -> rec_args().
-clean_rec_args(RecArgs) ->
- [{false,F} || {_B,F} <- RecArgs].
-
--spec soft_clean_rec_args(rec_args(), rec_fun_info(), boolean()) -> rec_args().
-soft_clean_rec_args(RecArgs, RecFunInfo, ToList) ->
- soft_clean_rec_args_tr(RecArgs, [], RecFunInfo, ToList, false, 1).
-
--spec soft_clean_rec_args_tr(rec_args(), rec_args(), rec_fun_info(), boolean(),
- boolean(), position()) -> rec_args().
-soft_clean_rec_args_tr([], Acc, _RecFunInfo, _ToList, _FoundListInst, _Pos) ->
- lists:reverse(Acc);
-soft_clean_rec_args_tr([{{list,_NonEmpty,_AltRecFun},FTRef} | Rest], Acc,
- RecFunInfo, ToList, true, Pos) ->
- NewArg = {false,FTRef},
- soft_clean_rec_args_tr(Rest, [NewArg|Acc], RecFunInfo, ToList, true, Pos+1);
-soft_clean_rec_args_tr([{{list,NonEmpty,AltRecFun},FTRef} | Rest], Acc,
- RecFunInfo, ToList, false, Pos) ->
- {NumTypes,NumRecs,RecArgLens,RecFuns} = RecFunInfo,
- AltRecFunPos = get_group(Pos, RecArgLens),
- AltRecFuns = proper_arith:list_update(AltRecFunPos, AltRecFun, RecFuns),
- AltRecFunInfo = {NumTypes,NumRecs,RecArgLens,AltRecFuns},
- NewArg = {{list,NonEmpty,tuple_rec_fun(AltRecFunInfo,ToList)},FTRef},
- soft_clean_rec_args_tr(Rest, [NewArg|Acc], RecFunInfo, ToList, true, Pos+1);
-soft_clean_rec_args_tr([Arg | Rest], Acc, RecFunInfo, ToList, FoundListInst,
- Pos) ->
- soft_clean_rec_args_tr(Rest, [Arg | Acc], RecFunInfo, ToList, FoundListInst,
- Pos+1).
-
--spec get_group(pos_integer(), [non_neg_integer()]) -> pos_integer().
-get_group(Pos, AllMembers) ->
- get_group_tr(Pos, AllMembers, 1).
-
--spec get_group_tr(pos_integer(), [non_neg_integer()], pos_integer()) ->
- pos_integer().
-get_group_tr(Pos, [Members | Rest], GroupNum) ->
- case Pos =< Members of
- true -> GroupNum;
- false -> get_group_tr(Pos - Members, Rest, GroupNum + 1)
- end.
-
--spec same_full_type_ref(full_type_ref(), term()) -> boolean().
-same_full_type_ref({SameMod,type,SameName,Args1},
- {SameMod,type,SameName,Args2}) ->
- length(Args1) =:= length(Args2)
- andalso lists:all(fun({A,B}) -> same_ret_type(A,B) end,
- lists:zip(Args1, Args2));
-same_full_type_ref({SameMod,record,SameName,SubstsDict1},
- {SameMod,record,SameName,SubstsDict2}) ->
- same_substs_dict(SubstsDict1, SubstsDict2);
-same_full_type_ref(_, _) ->
- false.
-
--spec same_ret_type(ret_type(), ret_type()) -> boolean().
-same_ret_type({simple,FinType1}, {simple,FinType2}) ->
- same_fin_type(FinType1, FinType2);
-same_ret_type({rec,RecFun1,RecArgs1}, {rec,RecFun2,RecArgs2}) ->
- NumRecArgs = length(RecArgs1),
- length(RecArgs2) =:= NumRecArgs
- andalso lists:all(fun({A1,A2}) -> same_rec_arg(A1,A2,NumRecArgs) end,
- lists:zip(RecArgs1,RecArgs2))
- andalso same_rec_fun(RecFun1, RecFun2, NumRecArgs);
-same_ret_type(_, _) ->
- false.
-
-%% TODO: Is this too strict?
--spec same_rec_arg(rec_arg(), rec_arg(), arity()) -> boolean().
-same_rec_arg({{list,SameBool,AltRecFun1},FTRef1},
- {{list,SameBool,AltRecFun2},FTRef2}, NumRecArgs) ->
- same_rec_fun(AltRecFun1, AltRecFun2, NumRecArgs)
- andalso same_full_type_ref(FTRef1, FTRef2);
-same_rec_arg({true,FTRef1}, {true,FTRef2}, _NumRecArgs) ->
- same_full_type_ref(FTRef1, FTRef2);
-same_rec_arg({false,FTRef1}, {false,FTRef2}, _NumRecArgs) ->
- same_full_type_ref(FTRef1, FTRef2);
-same_rec_arg(_, _, _NumRecArgs) ->
- false.
-
--spec same_substs_dict(substs_dict(), substs_dict()) -> boolean().
-same_substs_dict(SubstsDict1, SubstsDict2) ->
- SameKVPair = fun({{_K,V1},{_K,V2}}) -> same_ret_type(V1,V2);
- (_) -> false
- end,
- SubstsKVList1 = lists:sort(dict:to_list(SubstsDict1)),
- SubstsKVList2 = lists:sort(dict:to_list(SubstsDict2)),
- length(SubstsKVList1) =:= length(SubstsKVList2)
- andalso lists:all(SameKVPair, lists:zip(SubstsKVList1,SubstsKVList2)).
-
--spec same_fin_type(fin_type(), fin_type()) -> boolean().
-same_fin_type(Type1, Type2) ->
- proper_types:equal_types(Type1, Type2).
-
--spec same_rec_fun(rec_fun(), rec_fun(), arity()) -> boolean().
-same_rec_fun(RecFun1, RecFun2, NumRecArgs) ->
- %% It's ok that we return a type, even if there's a 'true' for use of
- %% an instance.
- GenFun = fun(_Size) -> proper_types:exactly('$dummy') end,
- GenFuns = lists:duplicate(NumRecArgs,GenFun),
- same_fin_type(RecFun1(GenFuns,0), RecFun2(GenFuns,0)).
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/rec_env.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/rec_env.erl
deleted file mode 100644
index 76ae871aee..0000000000
--- a/lib/dialyzer/test/options1_SUITE_data/src/compiler/rec_env.erl
+++ /dev/null
@@ -1,611 +0,0 @@
-%% =====================================================================
-%% This library is free software; you can redistribute it and/or modify
-%% it under the terms of the GNU Lesser General Public License as
-%% published by the Free Software Foundation; either version 2 of the
-%% License, or (at your option) any later version.
-%%
-%% This library is distributed in the hope that it will be useful, but
-%% WITHOUT ANY WARRANTY; without even the implied warranty of
-%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-%% Lesser General Public License for more details.
-%%
-%% You should have received a copy of the GNU Lesser General Public
-%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-%% USA
-%%
-%% $Id: rec_env.erl,v 1.2 2009/09/17 09:46:19 kostis Exp $
-%%
-%% @author Richard Carlsson <richardc@csd.uu.se>
-%% @copyright 1999-2004 Richard Carlsson
-%% @doc Abstract environments, supporting self-referential bindings and
-%% automatic new-key generation.
-
-%% The current implementation is based on Erlang standard library
-%% dictionaries.
-
-%%% -define(DEBUG, true).
-
--module(rec_env).
-
--export([bind/3, bind_list/3, bind_recursive/4, delete/2, empty/0,
- get/2, is_defined/2, is_empty/1, keys/1, lookup/2, new_key/1,
- new_key/2, new_keys/2, new_keys/3, size/1, to_list/1]).
-
--ifdef(DEBUG).
--export([test/1, test_custom/1, test_custom/2]).
--endif.
-
--ifdef(DEBUG).
-%% Code for testing:
-%%@hidden
-test(N) ->
- test_0(integer, N).
-
-%%@hidden
-test_custom(N) ->
- F = fun (X) -> list_to_atom("X"++integer_to_list(X)) end,
- test_custom(F, N).
-
-%%@hidden
-test_custom(F, N) ->
- test_0({custom, F}, N).
-
-test_0(Type, N) ->
- put(new_key_calls, 0),
- put(new_key_retries, 0),
- put(new_key_max, 0),
- Env = test_1(Type, N, empty()),
- io:fwrite("\ncalls: ~w.\n", [get(new_key_calls)]),
- io:fwrite("\nretries: ~w.\n", [get(new_key_retries)]),
- io:fwrite("\nmax: ~w.\n", [get(new_key_max)]),
- dict:to_list(element(1,Env)).
-
-test_1(integer = Type, N, Env) when integer(N), N > 0 ->
- Key = new_key(Env),
- test_1(Type, N - 1, bind(Key, value, Env));
-test_1({custom, F} = Type, N, Env) when integer(N), N > 0 ->
- Key = new_key(F, Env),
- test_1(Type, N - 1, bind(Key, value, Env));
-test_1(_,0, Env) ->
- Env.
--endif.
-
-
-%% Representation:
-%%
-%% environment() = [Mapping]
-%%
-%% Mapping = {map, Dict} | {rec, Dict, Dict}
-%% Dict = dict:dictionary()
-%%
-%% An empty environment is a list containing a single `{map, Dict}'
-%% element - empty lists are not valid environments. To find a key in an
-%% environment, it is searched for in each mapping in the list, in
-%% order, until it the key is found in some mapping, or the end of the
-%% list is reached. In a 'rec' mapping, we keep the original dictionary
-%% together with a version where entries may have been deleted - this
-%% makes it possible to garbage collect the entire 'rec' mapping when
-%% all its entries are unused (for example, by being shadowed by later
-%% definitions).
-
-
-
-%% =====================================================================
-%% @type environment(). An abstract environment.
-
-
-%% =====================================================================
-%% @spec empty() -> environment()
-%%
-%% @doc Returns an empty environment.
-
-empty() ->
- [{map, dict:new()}].
-
-
-%% =====================================================================
-%% @spec is_empty(Env::environment()) -> boolean()
-%%
-%% @doc Returns <code>true</code> if the environment is empty, otherwise
-%% <code>false</code>.
-
-is_empty([{map, Dict} | Es]) ->
- N = dict:size(Dict),
- if N /= 0 -> false;
- Es == [] -> true;
- true -> is_empty(Es)
- end;
-is_empty([{rec, Dict, _} | Es]) ->
- N = dict:size(Dict),
- if N /= 0 -> false;
- Es == [] -> true;
- true -> is_empty(Es)
- end.
-
-
-%% =====================================================================
-%% @spec size(Env::environment()) -> integer()
-%%
-%% @doc Returns the number of entries in an environment.
-
-%% (The name 'size' cannot be used in local calls, since there exists a
-%% built-in function with the same name.)
-
-size(Env) ->
- env_size(Env).
-
-env_size([{map, Dict}]) ->
- dict:size(Dict);
-env_size([{map, Dict} | Env]) ->
- dict:size(Dict) + env_size(Env);
-env_size([{rec, Dict, _Dict0} | Env]) ->
- dict:size(Dict) + env_size(Env).
-
-
-%% =====================================================================
-%% @spec is_defined(Key, Env) -> boolean()
-%%
-%% Key = term()
-%% Env = environment()
-%%
-%% @doc Returns <code>true</code> if <code>Key</code> is bound in the
-%% environment, otherwise <code>false</code>.
-
-is_defined(Key, [{map, Dict} | Env]) ->
- case dict:is_key(Key, Dict) of
- true ->
- true;
- false when Env == [] ->
- false;
- false ->
- is_defined(Key, Env)
- end;
-is_defined(Key, [{rec, Dict, _Dict0} | Env]) ->
- case dict:is_key(Key, Dict) of
- true ->
- true;
- false ->
- is_defined(Key, Env)
- end.
-
-
-%% =====================================================================
-%% @spec keys(Env::environment()) -> [term()]
-%%
-%% @doc Returns the ordered list of all keys in the environment.
-
-keys(Env) ->
- lists:sort(keys(Env, [])).
-
-keys([{map, Dict}], S) ->
- dict:fetch_keys(Dict) ++ S;
-keys([{map, Dict} | Env], S) ->
- keys(Env, dict:fetch_keys(Dict) ++ S);
-keys([{rec, Dict, _Dict0} | Env], S) ->
- keys(Env, dict:fetch_keys(Dict) ++ S).
-
-
-%% =====================================================================
-%% @spec to_list(Env) -> [{Key, Value}]
-%%
-%% Env = environment()
-%% Key = term()
-%% Value = term()
-%%
-%% @doc Returns an ordered list of <code>{Key, Value}</code> pairs for
-%% all keys in <code>Env</code>. <code>Value</code> is the same as that
-%% returned by {@link get/2}.
-
-to_list(Env) ->
- lists:sort(to_list(Env, [])).
-
-to_list([{map, Dict}], S) ->
- dict:to_list(Dict) ++ S;
-to_list([{map, Dict} | Env], S) ->
- to_list(Env, dict:to_list(Dict) ++ S);
-to_list([{rec, Dict, _Dict0} | Env], S) ->
- to_list(Env, dict:to_list(Dict) ++ S).
-
-
-%% =====================================================================
-%% @spec bind(Key, Value, Env) -> environment()
-%%
-%% Key = term()
-%% Value = term()
-%% Env = environment()
-%%
-%% @doc Make a nonrecursive entry. This binds <code>Key</code> to
-%% <code>Value</code>. If the key already existed in the environment,
-%% the old entry is replaced.
-
-%% Note that deletion is done to free old bindings so they can be
-%% garbage collected.
-
-bind(Key, Value, [{map, Dict}]) ->
- [{map, dict:store(Key, Value, Dict)}];
-bind(Key, Value, [{map, Dict} | Env]) ->
- [{map, dict:store(Key, Value, Dict)} | delete_any(Key, Env)];
-bind(Key, Value, Env) ->
- [{map, dict:store(Key, Value, dict:new())} | delete_any(Key, Env)].
-
-
-%% =====================================================================
-%% @spec bind_list(Keys, Values, Env) -> environment()
-%%
-%% Keys = [term()]
-%% Values = [term()]
-%% Env = environment()
-%%
-%% @doc Make N nonrecursive entries. This binds each key in
-%% <code>Keys</code> to the corresponding value in
-%% <code>Values</code>. If some key already existed in the environment,
-%% the previous entry is replaced. If <code>Keys</code> does not have
-%% the same length as <code>Values</code>, an exception is generated.
-
-bind_list(Ks, Vs, [{map, Dict}]) ->
- [{map, store_list(Ks, Vs, Dict)}];
-bind_list(Ks, Vs, [{map, Dict} | Env]) ->
- [{map, store_list(Ks, Vs, Dict)} | delete_list(Ks, Env)];
-bind_list(Ks, Vs, Env) ->
- [{map, store_list(Ks, Vs, dict:new())} | delete_list(Ks, Env)].
-
-store_list([K | Ks], [V | Vs], Dict) ->
- store_list(Ks, Vs, dict:store(K, V, Dict));
-store_list([], _, Dict) ->
- Dict.
-
-delete_list([K | Ks], Env) ->
- delete_list(Ks, delete_any(K, Env));
-delete_list([], Env) ->
- Env.
-
-%% By not calling `delete' unless we have to, we avoid unnecessary
-%% rewriting of the data.
-
-delete_any(Key, Env) ->
- case is_defined(Key, Env) of
- true ->
- delete(Key, Env);
- false ->
- Env
- end.
-
-%% =====================================================================
-%% @spec delete(Key, Env) -> environment()
-%%
-%% Key = term()
-%% Env = environment()
-%%
-%% @doc Delete an entry. This removes <code>Key</code> from the
-%% environment.
-
-delete(Key, [{map, Dict} = E | Env]) ->
- case dict:is_key(Key, Dict) of
- true ->
- [{map, dict:erase(Key, Dict)} | Env];
- false ->
- delete_1(Key, Env, E)
- end;
-delete(Key, [{rec, Dict, Dict0} = E | Env]) ->
- case dict:is_key(Key, Dict) of
- true ->
- %% The Dict0 component must be preserved as it is until all
- %% keys in Dict have been deleted.
- Dict1 = dict:erase(Key, Dict),
- case dict:size(Dict1) of
- 0 ->
- Env; % the whole {rec,...} is now garbage
- _ ->
- [{rec, Dict1, Dict0} | Env]
- end;
- false ->
- [E | delete(Key, Env)]
- end.
-
-%% This is just like above, except we pass on the preceding 'map'
-%% mapping in the list to enable merging when removing 'rec' mappings.
-
-delete_1(Key, [{rec, Dict, Dict0} = E | Env], E1) ->
- case dict:is_key(Key, Dict) of
- true ->
- Dict1 = dict:erase(Key, Dict),
- case dict:size(Dict1) of
- 0 ->
- concat(E1, Env);
- _ ->
- [E1, {rec, Dict1, Dict0} | Env]
- end;
- false ->
- [E1, E | delete(Key, Env)]
- end.
-
-concat({map, D1}, [{map, D2} | Env]) ->
- [dict:merge(fun (_K, V1, _V2) -> V1 end, D1, D2) | Env];
-concat(E1, Env) ->
- [E1 | Env].
-
-
-%% =====================================================================
-%% @spec bind_recursive(Keys, Values, Fun, Env) -> NewEnv
-%%
-%% Keys = [term()]
-%% Values = [term()]
-%% Fun = (Value, Env) -> term()
-%% Env = environment()
-%% NewEnv = environment()
-%%
-%% @doc Make N recursive entries. This binds each key in
-%% <code>Keys</code> to the value of <code>Fun(Value, NewEnv)</code> for
-%% the corresponding <code>Value</code>. If <code>Keys</code> does not
-%% have the same length as <code>Values</code>, an exception is
-%% generated. If some key already existed in the environment, the old
-%% entry is replaced.
-%%
-%% <p>Note: the function <code>Fun</code> is evaluated each time one of
-%% the stored keys is looked up, but only then.</p>
-%%
-%% <p>Examples:
-%%<pre>
-%% NewEnv = bind_recursive([foo, bar], [1, 2],
-%% fun (V, E) -> V end,
-%% Env)</pre>
-%%
-%% This does nothing interesting; <code>get(foo, NewEnv)</code> yields
-%% <code>1</code> and <code>get(bar, NewEnv)</code> yields
-%% <code>2</code>, but there is more overhead than if the {@link
-%% bind_list/3} function had been used.
-%%
-%% <pre>
-%% NewEnv = bind_recursive([foo, bar], [1, 2],
-%% fun (V, E) -> {V, E} end,
-%% Env)</pre>
-%%
-%% Here, however, <code>get(foo, NewEnv)</code> will yield <code>{1,
-%% NewEnv}</code> and <code>get(bar, NewEnv)</code> will yield <code>{2,
-%% NewEnv}</code>, i.e., the environment <code>NewEnv</code> contains
-%% recursive bindings.</p>
-
-bind_recursive([], [], _, Env) ->
- Env;
-bind_recursive(Ks, Vs, F, Env) ->
- F1 = fun (V) ->
- fun (Dict) -> F(V, [{rec, Dict, Dict} | Env]) end
- end,
- Dict = bind_recursive_1(Ks, Vs, F1, dict:new()),
- [{rec, Dict, Dict} | Env].
-
-bind_recursive_1([K | Ks], [V | Vs], F, Dict) ->
- bind_recursive_1(Ks, Vs, F, dict:store(K, F(V), Dict));
-bind_recursive_1([], [], _, Dict) ->
- Dict.
-
-
-%% =====================================================================
-%% @spec lookup(Key, Env) -> error | {ok, Value}
-%%
-%% Key = term()
-%% Env = environment()
-%% Value = term()
-%%
-%% @doc Returns <code>{ok, Value}</code> if <code>Key</code> is bound to
-%% <code>Value</code> in <code>Env</code>, and <code>error</code>
-%% otherwise.
-
-lookup(Key, [{map, Dict} | Env]) ->
- case dict:find(Key, Dict) of
- {ok, _}=Value ->
- Value;
- error when Env == [] ->
- error;
- error ->
- lookup(Key, Env)
- end;
-lookup(Key, [{rec, Dict, Dict0} | Env]) ->
- case dict:find(Key, Dict) of
- {ok, F} ->
- {ok, F(Dict0)};
- error ->
- lookup(Key, Env)
- end.
-
-
-%% =====================================================================
-%% @spec get(Key, Env) -> Value
-%%
-%% Key = term()
-%% Env = environment()
-%% Value = term()
-%%
-%% @doc Returns the value that <code>Key</code> is bound to in
-%% <code>Env</code>. Throws <code>{undefined, Key}</code> if the key
-%% does not exist in <code>Env</code>.
-
-get(Key, Env) ->
- case lookup(Key, Env) of
- {ok, Value} -> Value;
- error -> throw({undefined, Key})
- end.
-
-
-%% =====================================================================
-%% The key-generating algorithm could possibly be further improved. The
-%% important thing to keep in mind is, that when we need a new key, we
-%% are generally in mid-traversal of a syntax tree, and existing names
-%% in the tree may be closely grouped and evenly distributed or even
-%% forming a compact range (often having been generated by a "gensym",
-%% or by this very algorithm itself). This means that if we generate an
-%% identifier whose value is too close to those already seen (i.e.,
-%% which are in the environment), it is very probable that we will
-%% shadow a not-yet-seen identifier further down in the tree, the result
-%% being that we induce another later renaming, and end up renaming most
-%% of the identifiers, completely contrary to our intention. We need to
-%% generate new identifiers in a way that avoids such systematic
-%% collisions.
-%%
-%% One way of getting a new key to try when the previous attempt failed
-%% is of course to e.g. add one to the last tried value. However, in
-%% general it's a bad idea to try adjacent identifiers: the percentage
-%% of retries will typically increase a lot, so you may lose big on the
-%% extra lookups while gaining only a little from the quicker
-%% computation.
-%%
-%% We want an initial range that is large enough for most typical cases.
-%% If we start with, say, a range of 10, we might quickly use up most of
-%% the values in the range 1-10 (or 1-100) for new top-level variables -
-%% but as we start traversing the syntax tree, it is quite likely that
-%% exactly those variables will be encountered again (this depends on
-%% how the names in the tree were created), and will then need to be
-%% renamed. If we instead begin with a larger range, it is less likely
-%% that any top-level names that we introduce will shadow names that we
-%% will find in the tree. Of course we cannot know how large is large
-%% enough: for any initial range, there is some syntax tree that uses
-%% all the values in that range, and thus any top-level names introduced
-%% will shadow names in the tree. The point is to avoid this happening
-%% all the time - a range of about 1000 seems enough for most programs.
-%%
-%% The following values have been shown to work well:
-
--define(MINIMUM_RANGE, 1000).
--define(START_RANGE_FACTOR, 50).
--define(MAX_RETRIES, 2). % retries before enlarging range
--define(ENLARGE_FACTOR, 10). % range enlargement factor
-
--ifdef(DEBUG).
-%% If you want to use these process dictionary counters, make sure to
-%% initialise them to zero before you call any of the key-generating
-%% functions.
-%%
-%% new_key_calls total number of calls
-%% new_key_retries failed key generation attempts
-%% new_key_max maximum generated integer value
-%%
--define(measure_calls(),
- put(new_key_calls, 1 + get(new_key_calls))).
--define(measure_max_key(N),
- case N > get(new_key_max) of
- true ->
- put(new_key_max, N);
- false ->
- ok
- end).
--define(measure_retries(N),
- put(new_key_retries, get(new_key_retries) + N)).
--else.
--define(measure_calls(), ok).
--define(measure_max_key(N), ok).
--define(measure_retries(N), ok).
--endif.
-
-
-%% =====================================================================
-%% @spec new_key(Env::environment()) -> integer()
-%%
-%% @doc Returns an integer which is not already used as key in the
-%% environment. New integers are generated using an algorithm which
-%% tries to keep the values randomly distributed within a reasonably
-%% small range relative to the number of entries in the environment.
-%%
-%% <p>This function uses the Erlang standard library module
-%% <code>random</code> to generate new keys.</p>
-%%
-%% <p>Note that only the new key is returned; the environment itself is
-%% not updated by this function.</p>
-
-new_key(Env) ->
- new_key(fun (X) -> X end, Env).
-
-
-%% =====================================================================
-%% @spec new_key(Function, Env) -> term()
-%%
-%% Function = (integer()) -> term()
-%% Env = environment()
-%%
-%% @doc Returns a term which is not already used as key in the
-%% environment. The term is generated by applying <code>Function</code>
-%% to an integer generated as in {@link new_key/1}.
-%%
-%% <p>Note that only the generated term is returned; the environment
-%% itself is not updated by this function.</p>
-
-new_key(F, Env) ->
- ?measure_calls(),
- R = start_range(Env),
-%%% io:fwrite("Start range: ~w.\n", [R]),
- new_key(R, F, Env).
-
-new_key(R, F, Env) ->
- new_key(generate(R, R), R, 0, F, Env).
-
-new_key(N, R, T, F, Env) when T < ?MAX_RETRIES ->
- A = F(N),
- case is_defined(A, Env) of
- true ->
-%%% io:fwrite("CLASH: ~w.\n", [A]),
- new_key(generate(N, R), R, T + 1, F, Env);
- false ->
- ?measure_max_key(N),
- ?measure_retries(T),
-%%% io:fwrite("New: ~w.\n", [N]),
- A
- end;
-new_key(N, R, _T, F, Env) ->
- %% Too many retries - enlarge the range and start over.
- ?measure_retries((_T + 1)),
- R1 = trunc(R * ?ENLARGE_FACTOR),
-%%% io:fwrite("**NEW RANGE**: ~w.\n", [R1]),
- new_key(generate(N, R1), R1, 0, F, Env).
-
-start_range(Env) ->
- max(env_size(Env) * ?START_RANGE_FACTOR, ?MINIMUM_RANGE).
-
-max(X, Y) when X > Y -> X;
-max(_, Y) -> Y.
-
-%% The previous key might or might not be used to compute the next key
-%% to be tried. It is currently not used.
-%%
-%% In order to avoid causing cascading renamings, it is important that
-%% this function does not generate values in order, but
-%% (pseudo-)randomly distributed over the range.
-
-generate(_N, Range) ->
- random:uniform(Range). % works well
-
-
-%% =====================================================================
-%% @spec new_keys(N, Env) -> [integer()]
-%%
-%% N = integer()
-%% Env = environment()
-%%
-%% @doc Returns a list of <code>N</code> distinct integers that are not
-%% already used as keys in the environment. See {@link new_key/1} for
-%% details.
-
-new_keys(N, Env) when integer(N) ->
- new_keys(N, fun (X) -> X end, Env).
-
-
-%% =====================================================================
-%% @spec new_keys(N, Function, Env) -> [term()]
-%%
-%% N = integer()
-%% Function = (integer()) -> term()
-%% Env = environment()
-%%
-%% @doc Returns a list of <code>N</code> distinct terms that are not
-%% already used as keys in the environment. See {@link new_key/3} for
-%% details.
-
-new_keys(N, F, Env) when integer(N) ->
- R = start_range(Env),
- new_keys(N, [], R, F, Env).
-
-new_keys(N, Ks, R, F, Env) when N > 0 ->
- Key = new_key(R, F, Env),
- Env1 = bind(Key, true, Env), % dummy binding
- new_keys(N - 1, [Key | Ks], R, F, Env1);
-new_keys(0, Ks, _, _, _) ->
- Ks.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/cerl_hipeify.erl b/lib/dialyzer/test/small_SUITE_data/src/cerl_hipeify.erl
deleted file mode 100644
index b7883e7b49..0000000000
--- a/lib/dialyzer/test/small_SUITE_data/src/cerl_hipeify.erl
+++ /dev/null
@@ -1,684 +0,0 @@
-%% =====================================================================
-%% This library is free software; you can redistribute it and/or modify
-%% it under the terms of the GNU Lesser General Public License as
-%% published by the Free Software Foundation; either version 2 of the
-%% License, or (at your option) any later version.
-%%
-%% This library is distributed in the hope that it will be useful, but
-%% WITHOUT ANY WARRANTY; without even the implied warranty of
-%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-%% Lesser General Public License for more details.
-%%
-%% You should have received a copy of the GNU Lesser General Public
-%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-%% USA
-%%
-%% $Id: cerl_hipeify.erl,v 1.1 2008/12/17 09:53:49 mikpe Exp $
-%%
-%% @author Richard Carlsson <richardc@csd.uu.se>
-%% @copyright 2000-2004 Richard Carlsson
-%% @doc HiPE-ification of Core Erlang code. Prepares Core Erlang code
-%% for translation to ICode.
-%% @see cerl_to_icode
-
--module(cerl_hipeify).
-
--export([transform/2]).
-
--define(PRIMOP_IDENTITY, identity). % arity 1
--define(PRIMOP_NOT, 'not'). % arity 1
--define(PRIMOP_AND, 'and'). % arity 2
--define(PRIMOP_OR, 'or'). % arity 2
--define(PRIMOP_XOR, 'xor'). % arity 2
--define(PRIMOP_ADD, '+'). % arity 2
--define(PRIMOP_SUB, '-'). % arity 2
--define(PRIMOP_NEG, neg). % arity 1
--define(PRIMOP_MUL, '*'). % arity 2
--define(PRIMOP_DIV, '/'). % arity 2
--define(PRIMOP_INTDIV, 'div'). % arity 2
--define(PRIMOP_REM, 'rem'). % arity 2
--define(PRIMOP_BAND, 'band'). % arity 2
--define(PRIMOP_BOR, 'bor'). % arity 2
--define(PRIMOP_BXOR, 'bxor'). % arity 2
--define(PRIMOP_BNOT, 'bnot'). % arity 1
--define(PRIMOP_BSL, 'bsl'). % arity 2
--define(PRIMOP_BSR, 'bsr'). % arity 2
--define(PRIMOP_EQ, '=='). % arity 2
--define(PRIMOP_NE, '/='). % arity 2
--define(PRIMOP_EXACT_EQ, '=:='). % arity 2
--define(PRIMOP_EXACT_NE, '=/='). % arity 2
--define(PRIMOP_LT, '<'). % arity 2
--define(PRIMOP_GT, '>'). % arity 2
--define(PRIMOP_LE, '=<'). % arity 2
--define(PRIMOP_GE, '>='). % arity 2
--define(PRIMOP_IS_ATOM, 'is_atom'). % arity 1
--define(PRIMOP_IS_BIGNUM, 'is_bignum'). % arity 1
--define(PRIMOP_IS_BINARY, 'is_binary'). % arity 1
--define(PRIMOP_IS_CONSTANT, 'is_constant'). % arity 1
--define(PRIMOP_IS_FIXNUM, 'is_fixnum'). % arity 1
--define(PRIMOP_IS_FLOAT, 'is_float'). % arity 1
--define(PRIMOP_IS_FUNCTION, 'is_function'). % arity 1
--define(PRIMOP_IS_INTEGER, 'is_integer'). % arity 1
--define(PRIMOP_IS_LIST, 'is_list'). % arity 1
--define(PRIMOP_IS_NUMBER, 'is_number'). % arity 1
--define(PRIMOP_IS_PID, 'is_pid'). % arity 1
--define(PRIMOP_IS_PORT, 'is_port'). % arity 1
--define(PRIMOP_IS_REFERENCE, 'is_reference'). % arity 1
--define(PRIMOP_IS_TUPLE, 'is_tuple'). % arity 1
--define(PRIMOP_IS_RECORD, 'is_record'). % arity 3
--define(PRIMOP_EXIT, exit). % arity 1
--define(PRIMOP_THROW, throw). % arity 1
--define(PRIMOP_ERROR, error). % arity 1,2
--define(PRIMOP_RETHROW, raise). % arity 2
--define(PRIMOP_RECEIVE_SELECT, receive_select). % arity 0
--define(PRIMOP_RECEIVE_NEXT, receive_next). % arity 0
--define(PRIMOP_ELEMENT, element). % arity 2
--define(PRIMOP_DSETELEMENT, dsetelement). % arity 3
--define(PRIMOP_MAKE_FUN, make_fun). % arity 6
--define(PRIMOP_APPLY_FUN, apply_fun). % arity 2
--define(PRIMOP_FUN_ELEMENT, closure_element). % arity 2
--define(PRIMOP_SET_LABEL, set_label). % arity 1
--define(PRIMOP_GOTO_LABEL, goto_label). % arity 1
--define(PRIMOP_REDUCTION_TEST, reduction_test). % arity 0
-
--record(ctxt, {class = expr}).
-
-
-%% @spec transform(Module::cerl(), Options::[term()]) -> cerl()
-%%
-%% cerl() = cerl:cerl()
-%%
-%% @doc Rewrites a Core Erlang module to a form suitable for further
-%% translation to HiPE Icode. See module <code>cerl_to_icode</code> for
-%% details.
-%%
-%% @see cerl_to_icode
-%% @see cerl_cconv
-
-transform(E, Opts) ->
- %% Start by closure converting the code
- module(cerl_cconv:transform(E, Opts), Opts).
-
-module(E, Opts) ->
- {Ds, Env, Ren} = add_defs(cerl:module_defs(E), env__new(),
- ren__new()),
- M = cerl:module_name(E),
- S0 = s__new(cerl:atom_val(M)),
- S = s__set_pmatch(proplists:get_value(pmatch, Opts), S0),
- {Ds1, _} = defs(Ds, true, Env, Ren, S),
- cerl:update_c_module(E, M, cerl:module_exports(E),
- cerl:module_attrs(E), Ds1).
-
-%% Note that the environment is defined on the renamed variables.
-
-expr(E0, Env, Ren, Ctxt, S0) ->
- %% Do peephole optimizations as we traverse the code.
- E = cerl_lib:reduce_expr(E0),
- case cerl:type(E) of
- literal ->
- {E, S0};
- var ->
- variable(E, Env, Ren, Ctxt, S0);
- values ->
- {Es, S1} = expr_list(cerl:values_es(E), Env, Ren, Ctxt, S0),
- {cerl:update_c_values(E, Es), S1};
- cons ->
- {E1, S1} = expr(cerl:cons_hd(E), Env, Ren, Ctxt, S0),
- {E2, S2} = expr(cerl:cons_tl(E), Env, Ren, Ctxt, S1),
- {cerl:update_c_cons(E, E1, E2), S2};
- tuple ->
- {Es, S1} = expr_list(cerl:tuple_es(E), Env, Ren, Ctxt, S0),
- {cerl:update_c_tuple(E, Es), S1};
- 'let' ->
- let_expr(E, Env, Ren, Ctxt, S0);
- seq ->
- {A, S1} = expr(cerl:seq_arg(E), Env, Ren, Ctxt, S0),
- {B, S2} = expr(cerl:seq_body(E), Env, Ren, Ctxt, S1),
- {cerl:update_c_seq(E, A, B), S2};
- apply ->
- {Op, S1} = expr(cerl:apply_op(E), Env, Ren, Ctxt, S0),
- {As, S2} = expr_list(cerl:apply_args(E), Env, Ren, Ctxt, S1),
- {cerl:update_c_apply(E, Op, As), S2};
- call ->
- {M, S1} = expr(cerl:call_module(E), Env, Ren, Ctxt, S0),
- {N, S2} = expr(cerl:call_name(E), Env, Ren, Ctxt, S1),
- {As, S3} = expr_list(cerl:call_args(E), Env, Ren, Ctxt, S2),
- {rewrite_call(E, M, N, As, S3), S3};
- primop ->
- {As, S1} = expr_list(cerl:primop_args(E), Env, Ren, Ctxt, S0),
- N = cerl:primop_name(E),
- {rewrite_primop(E, N, As, S1), S1};
- 'case' ->
- {A, S1} = expr(cerl:case_arg(E), Env, Ren, Ctxt, S0),
- {E1, Vs, S2} = clauses(cerl:case_clauses(E), Env, Ren, Ctxt, S1),
- {cerl:c_let(Vs, A, E1), S2};
- 'fun' ->
- Vs = cerl:fun_vars(E),
- {Vs1, Env1, Ren1} = add_vars(Vs, Env, Ren),
- {B, S1} = expr(cerl:fun_body(E), Env1, Ren1, Ctxt, S0),
- {cerl:update_c_fun(E, Vs1, B), S1};
- 'receive' ->
- receive_expr(E, Env, Ren, Ctxt, S0);
- 'try' ->
- {A, S1} = expr(cerl:try_arg(E), Env, Ren, Ctxt, S0),
- Vs = cerl:try_vars(E),
- {Vs1, Env1, Ren1} = add_vars(Vs, Env, Ren),
- {B, S2} = expr(cerl:try_body(E), Env1, Ren1, Ctxt, S1),
- Evs = cerl:try_evars(E),
- {Evs1, Env2, Ren2} = add_vars(Evs, Env, Ren),
- {H, S3} = expr(cerl:try_handler(E), Env2, Ren2, Ctxt, S2),
- {cerl:update_c_try(E, A, Vs1, B, Evs1, H), S3};
- 'catch' ->
- catch_expr(E, Env, Ren, Ctxt, S0);
- letrec ->
- {Ds, Env1, Ren1} = add_defs(cerl:letrec_defs(E), Env, Ren),
- {Ds1, S1} = defs(Ds, false, Env1, Ren1, S0),
- {B, S2} = expr(cerl:letrec_body(E), Env1, Ren1, Ctxt, S1),
- {cerl:update_c_letrec(E, Ds1, B), S2};
- binary ->
- {Segs, S1}=expr_list(cerl:binary_segments(E), Env, Ren,
- Ctxt, S0),
- {cerl:update_c_binary(E, Segs), S1};
- bitstr ->
- {E1,S1} = expr(cerl:bitstr_val(E), Env, Ren, Ctxt, S0),
- {E2,S2} = expr(cerl:bitstr_size(E), Env, Ren, Ctxt, S1),
- E3 = cerl:bitstr_unit(E),
- E4 = cerl:bitstr_type(E),
- E5 = cerl:bitstr_flags(E),
- {cerl:update_c_bitstr(E, E1, E2, E3, E4, E5), S2}
- end.
-
-guard_expr(E, Env, Ren, Ctxt, S) ->
- expr(E, Env, Ren, Ctxt#ctxt{class = guard}, S).
-
-expr_list(Es, Env, Ren, Ctxt, S0) ->
- list(Es, Env, Ren, Ctxt, S0, fun expr/5).
-
-list([E | Es], Env, Ren, Ctxt, S0, F) ->
- {E1, S1} = F(E, Env, Ren, Ctxt, S0),
- {Es1, S2} = list(Es, Env, Ren, Ctxt, S1, F),
- {[E1 | Es1], S2};
-list([], _, _, _, S, _) ->
- {[], S}.
-
-pattern(E, Env, Ren) ->
- case cerl:type(E) of
- literal ->
- E;
- var ->
- cerl:update_c_var(E, ren__map(cerl:var_name(E), Ren));
- values ->
- Es = pattern_list(cerl:values_es(E), Env, Ren),
- cerl:update_c_values(E, Es);
- cons ->
- E1 = pattern(cerl:cons_hd(E), Env, Ren),
- E2 = pattern(cerl:cons_tl(E), Env, Ren),
- cerl:update_c_cons(E, E1, E2);
- tuple ->
- Es = pattern_list(cerl:tuple_es(E), Env, Ren),
- cerl:update_c_tuple(E, Es);
- alias ->
- V = pattern(cerl:alias_var(E), Env, Ren),
- P = pattern(cerl:alias_pat(E), Env, Ren),
- cerl:update_c_alias(E, V, P);
- binary ->
- Segs=pattern_list(cerl:binary_segments(E), Env, Ren),
- cerl:update_c_binary(E, Segs);
- bitstr ->
- E1 = pattern(cerl:bitstr_val(E), Env, Ren),
- E2 = pattern(cerl:bitstr_size(E), Env, Ren),
- E3 = cerl:bitstr_unit(E),
- E4 = cerl:bitstr_type(E),
- E5 = cerl:bitstr_flags(E),
- cerl:update_c_bitstr(E, E1, E2, E3, E4, E5)
- end.
-
-
-
-pattern_list([E | Es], Env, Ren) ->
- [pattern(E, Env, Ren) | pattern_list(Es, Env, Ren)];
-pattern_list([], _, _) ->
- [].
-
-%% Visit the function body of each definition. We insert an explicit
-%% reduction test at the start of each function.
-
-defs(Ds, Top, Env, Ren, S) ->
- defs(Ds, [], Top, Env, Ren, S).
-
-defs([{V, F} | Ds], Ds1, Top, Env, Ren, S0) ->
- S1 = case Top of
- true -> s__enter_function(cerl:var_name(V), S0);
- false -> S0
- end,
- {B, S2} = expr(cerl:fun_body(F), Env, Ren, #ctxt{}, S1),
- B1 = cerl:c_seq(cerl:c_primop(cerl:c_atom(?PRIMOP_REDUCTION_TEST),
- []),
- B),
- F1 = cerl:update_c_fun(F, cerl:fun_vars(F), B1),
- defs(Ds, [{V, F1} | Ds1], Top, Env, Ren, S2);
-defs([], Ds, _Top, _Env, _Ren, S) ->
- {lists:reverse(Ds), S}.
-
-clauses([C|_]=Cs, Env, Ren, Ctxt, S) ->
- {Cs1, S1} = clause_list(Cs, Env, Ren, Ctxt, S),
- %% Perform pattern matching compilation on the clauses.
- {E, Vs} = case s__get_pmatch(S) of
- true ->
- cerl_pmatch:clauses(Cs1, Env);
- no_duplicates ->
- put('cerl_pmatch_duplicate_code', never),
- cerl_pmatch:clauses(Cs1, Env);
- duplicate_all ->
- put('cerl_pmatch_duplicate_code', always),
- cerl_pmatch:clauses(Cs1, Env);
- Other when Other == false; Other == undefined ->
- Vs0 = new_vars(cerl:clause_arity(C), Env),
- {cerl:c_case(cerl:c_values(Vs0), Cs1), Vs0}
- end,
- %% We must make sure that we also visit any clause guards generated
- %% by the pattern matching compilation. We pass an empty renaming,
- %% so we do not rename any variables twice.
- {E1, S2} = revisit_expr(E, Env, ren__new(), Ctxt, S1),
- {E1, Vs, S2}.
-
-clause_list(Cs, Env, Ren, Ctxt, S) ->
- list(Cs, Env, Ren, Ctxt, S, fun clause/5).
-
-clause(E, Env, Ren, Ctxt, S0) ->
- Vs = cerl:clause_vars(E),
- {_, Env1, Ren1} = add_vars(Vs, Env, Ren),
- %% Visit patterns to rename variables.
- Ps = pattern_list(cerl:clause_pats(E), Env1, Ren1),
- {G, S1} = guard_expr(cerl:clause_guard(E), Env1, Ren1, Ctxt, S0),
- {B, S2} = expr(cerl:clause_body(E), Env1, Ren1, Ctxt, S1),
- {cerl:update_c_clause(E, Ps, G, B), S2}.
-
-%% This does what 'expr' does, but only recurses into clause guard
-%% expressions, 'case'-expressions, and the bodies of lets and letrecs.
-%% Note that revisiting should not add further renamings, and we simply
-%% ignore making any bindings at all at this level.
-
-revisit_expr(E, Env, Ren, Ctxt, S0) ->
- %% Also enable peephole optimizations here.
- revisit_expr_1(cerl_lib:reduce_expr(E), Env, Ren, Ctxt, S0).
-
-revisit_expr_1(E, Env, Ren, Ctxt, S0) ->
- case cerl:type(E) of
- 'case' ->
- {Cs, S1} = revisit_clause_list(cerl:case_clauses(E), Env,
- Ren, Ctxt, S0),
- {cerl:update_c_case(E, cerl:case_arg(E), Cs), S1};
- 'let' ->
- {B, S1} = revisit_expr(cerl:let_body(E), Env, Ren, Ctxt, S0),
- {cerl:update_c_let(E, cerl:let_vars(E), cerl:let_arg(E), B),
- S1};
- 'letrec' ->
- {B, S1} = revisit_expr(cerl:letrec_body(E), Env, Ren, Ctxt, S0),
- {cerl:update_c_letrec(E, cerl:letrec_defs(E), B), S1};
- _ ->
- {E, S0}
- end.
-
-revisit_clause_list(Cs, Env, Ren, Ctxt, S) ->
- list(Cs, Env, Ren, Ctxt, S, fun revisit_clause/5).
-
-revisit_clause(E, Env, Ren, Ctxt, S0) ->
- %% Ignore the bindings.
- {G, S1} = guard_expr(cerl:clause_guard(E), Env, Ren, Ctxt, S0),
- {B, S2} = revisit_expr(cerl:clause_body(E), Env, Ren, Ctxt, S1),
- {cerl:update_c_clause(E, cerl:clause_pats(E), G, B), S2}.
-
-%% We use the no-shadowing strategy, renaming variables on the fly and
-%% only when necessary to uphold the invariant.
-
-add_vars(Vs, Env, Ren) ->
- add_vars(Vs, [], Env, Ren).
-
-add_vars([V | Vs], Vs1, Env, Ren) ->
- Name = cerl:var_name(V),
- {Name1, Ren1} = rename(Name, Env, Ren),
- add_vars(Vs, [cerl:update_c_var(V, Name1) | Vs1],
- env__bind(Name1, variable, Env), Ren1);
-add_vars([], Vs, Env, Ren) ->
- {lists:reverse(Vs), Env, Ren}.
-
-rename(Name, Env, Ren) ->
- case env__is_defined(Name, Env) of
- false ->
- {Name, Ren};
- true ->
- New = env__new_name(Env),
- {New, ren__add(Name, New, Ren)}
- end.
-
-%% Setting up the environment for a list of letrec-bound definitions.
-
-add_defs(Ds, Env, Ren) ->
- add_defs(Ds, [], Env, Ren).
-
-add_defs([{V, F} | Ds], Ds1, Env, Ren) ->
- Name = cerl:var_name(V),
- {Name1, Ren1} =
- case env__is_defined(Name, Env) of
- false ->
- {Name, Ren};
- true ->
- {N, A} = Name,
- S = atom_to_list(N) ++ "_",
- F = fun (Num) -> %% XXX: BUG: This should be F1
- {list_to_atom(S ++ integer_to_list(Num)), A}
- end,
- New = env__new_function_name(F, Env),
- {New, ren__add(Name, New, Ren)}
- end,
- add_defs(Ds, [{cerl:update_c_var(V, Name1), F} | Ds1],
- env__bind(Name1, function, Env), Ren1);
-add_defs([], Ds, Env, Ren) ->
- {lists:reverse(Ds), Env, Ren}.
-
-%% We change remote calls to important built-in functions into primop
-%% calls. In some cases (e.g., for the boolean operators), this is
-%% mainly to allow the cerl_to_icode module to handle them more
-%% straightforwardly. In most cases however, it is simply because they
-%% are supposed to be represented as primop calls on the Icode level.
-
-rewrite_call(E, M, F, As, S) ->
- case cerl:is_c_atom(M) and cerl:is_c_atom(F) of
- true ->
- case call_to_primop(cerl:atom_val(M),
- cerl:atom_val(F),
- length(As))
- of
- {yes, N} ->
- %% The primop might need further handling
- N1 = cerl:c_atom(N),
- E1 = cerl:update_c_primop(E, N1, As),
- rewrite_primop(E1, N1, As, S);
- no ->
- cerl:update_c_call(E, M, F, As)
- end;
- false ->
- cerl:update_c_call(E, M, F, As)
- end.
-
-call_to_primop(erlang, 'not', 1) -> {yes, ?PRIMOP_NOT};
-call_to_primop(erlang, 'and', 2) -> {yes, ?PRIMOP_AND};
-call_to_primop(erlang, 'or', 2) -> {yes, ?PRIMOP_OR};
-call_to_primop(erlang, 'xor', 2) -> {yes, ?PRIMOP_XOR};
-call_to_primop(erlang, '+', 2) -> {yes, ?PRIMOP_ADD};
-call_to_primop(erlang, '+', 1) -> {yes, ?PRIMOP_IDENTITY};
-call_to_primop(erlang, '-', 2) -> {yes, ?PRIMOP_SUB};
-call_to_primop(erlang, '-', 1) -> {yes, ?PRIMOP_NEG};
-call_to_primop(erlang, '*', 2) -> {yes, ?PRIMOP_MUL};
-call_to_primop(erlang, '/', 2) -> {yes, ?PRIMOP_DIV};
-call_to_primop(erlang, 'div', 2) -> {yes, ?PRIMOP_INTDIV};
-call_to_primop(erlang, 'rem', 2) -> {yes, ?PRIMOP_REM};
-call_to_primop(erlang, 'band', 2) -> {yes, ?PRIMOP_BAND};
-call_to_primop(erlang, 'bor', 2) -> {yes, ?PRIMOP_BOR};
-call_to_primop(erlang, 'bxor', 2) -> {yes, ?PRIMOP_BXOR};
-call_to_primop(erlang, 'bnot', 1) -> {yes, ?PRIMOP_BNOT};
-call_to_primop(erlang, 'bsl', 2) -> {yes, ?PRIMOP_BSL};
-call_to_primop(erlang, 'bsr', 2) -> {yes, ?PRIMOP_BSR};
-call_to_primop(erlang, '==', 2) -> {yes, ?PRIMOP_EQ};
-call_to_primop(erlang, '/=', 2) -> {yes, ?PRIMOP_NE};
-call_to_primop(erlang, '=:=', 2) -> {yes, ?PRIMOP_EXACT_EQ};
-call_to_primop(erlang, '=/=', 2) -> {yes, ?PRIMOP_EXACT_NE};
-call_to_primop(erlang, '<', 2) -> {yes, ?PRIMOP_LT};
-call_to_primop(erlang, '>', 2) -> {yes, ?PRIMOP_GT};
-call_to_primop(erlang, '=<', 2) -> {yes, ?PRIMOP_LE};
-call_to_primop(erlang, '>=', 2) -> {yes, ?PRIMOP_GE};
-call_to_primop(erlang, is_atom, 1) -> {yes, ?PRIMOP_IS_ATOM};
-call_to_primop(erlang, is_binary, 1) -> {yes, ?PRIMOP_IS_BINARY};
-call_to_primop(erlang, is_constant, 1) -> {yes, ?PRIMOP_IS_CONSTANT};
-call_to_primop(erlang, is_float, 1) -> {yes, ?PRIMOP_IS_FLOAT};
-call_to_primop(erlang, is_function, 1) -> {yes, ?PRIMOP_IS_FUNCTION};
-call_to_primop(erlang, is_integer, 1) -> {yes, ?PRIMOP_IS_INTEGER};
-call_to_primop(erlang, is_list, 1) -> {yes, ?PRIMOP_IS_LIST};
-call_to_primop(erlang, is_number, 1) -> {yes, ?PRIMOP_IS_NUMBER};
-call_to_primop(erlang, is_pid, 1) -> {yes, ?PRIMOP_IS_PID};
-call_to_primop(erlang, is_port, 1) -> {yes, ?PRIMOP_IS_PORT};
-call_to_primop(erlang, is_reference, 1) -> {yes, ?PRIMOP_IS_REFERENCE};
-call_to_primop(erlang, is_tuple, 1) -> {yes, ?PRIMOP_IS_TUPLE};
-call_to_primop(erlang, internal_is_record, 3) -> {yes, ?PRIMOP_IS_RECORD};
-call_to_primop(erlang, element, 2) -> {yes, ?PRIMOP_ELEMENT};
-call_to_primop(erlang, exit, 1) -> {yes, ?PRIMOP_EXIT};
-call_to_primop(erlang, throw, 1) -> {yes, ?PRIMOP_THROW};
-call_to_primop(erlang, error, 1) -> {yes, ?PRIMOP_ERROR};
-call_to_primop(erlang, error, 2) -> {yes, ?PRIMOP_ERROR};
-call_to_primop(erlang, fault, 1) -> {yes, ?PRIMOP_ERROR};
-call_to_primop(erlang, fault, 2) -> {yes, ?PRIMOP_ERROR};
-call_to_primop(_, _, _) -> no.
-
-%% Also, some primops (introduced by Erlang to Core Erlang translation
-%% and possibly other stages) must be recognized and rewritten.
-
-rewrite_primop(E, N, As, S) ->
- case {cerl:atom_val(N), As} of
- {match_fail, [R]} ->
- M = s__get_module_name(S),
- {F, A} = s__get_function_name(S),
- Stack = cerl:abstract([{M, F, A}]),
- case cerl:type(R) of
- tuple ->
- %% Function clause failures have a special encoding
- %% as '{function_clause, Arg1, ..., ArgN}'.
- case cerl:tuple_es(R) of
- [X | Xs] ->
- case cerl:is_c_atom(X) of
- true ->
- case cerl:atom_val(X) of
- function_clause ->
- FStack = cerl:make_list(
- [cerl:c_tuple(
- [cerl:c_atom(M),
- cerl:c_atom(F),
- cerl:make_list(Xs)])]),
- match_fail(E, X, FStack);
- _ ->
- match_fail(E, R, Stack)
- end;
- false ->
- match_fail(E, R, Stack)
- end;
- _ ->
- match_fail(E, R, Stack)
- end;
- _ ->
- match_fail(E, R, Stack)
- end;
- _ ->
- cerl:update_c_primop(E, N, As)
- end.
-
-match_fail(E, R, Stack) ->
- cerl:update_c_primop(E, cerl:c_atom(?PRIMOP_ERROR), [R, Stack]).
-
-%% Simple let-definitions (of degree 1) in guard context are always
-%% inline expanded. This is allowable, since they cannot have side
-%% effects, and it makes it easy to generate good code for boolean
-%% expressions. It could cause repeated evaluations, but typically,
-%% local definitions within guards are used exactly once.
-
-let_expr(E, Env, Ren, Ctxt, S) ->
- if Ctxt#ctxt.class == guard ->
- case cerl:let_vars(E) of
- [V] ->
- {Name, Ren1} = rename(cerl:var_name(V), Env, Ren),
- Env1 = env__bind(Name, {expr, cerl:let_arg(E)}, Env),
- expr(cerl:let_body(E), Env1, Ren1, Ctxt, S);
- _ ->
- let_expr_1(E, Env, Ren, Ctxt, S)
- end;
- true ->
- let_expr_1(E, Env, Ren, Ctxt, S)
- end.
-
-let_expr_1(E, Env, Ren, Ctxt, S0) ->
- {A, S1} = expr(cerl:let_arg(E), Env, Ren, Ctxt, S0),
- Vs = cerl:let_vars(E),
- {Vs1, Env1, Ren1} = add_vars(Vs, Env, Ren),
- {B, S2} = expr(cerl:let_body(E), Env1, Ren1, Ctxt, S1),
- {cerl:update_c_let(E, Vs1, A, B), S2}.
-
-variable(E, Env, Ren, Ctxt, S) ->
- V = ren__map(cerl:var_name(E), Ren),
- if Ctxt#ctxt.class == guard ->
- case env__lookup(V, Env) of
- {ok, {expr, E1}} ->
- expr(E1, Env, Ren, Ctxt, S); % inline
- _ ->
- %% Since we don't track all bindings when we revisit
- %% guards, some names will not be in the environment.
- variable_1(E, V, S)
- end;
- true ->
- variable_1(E, V, S)
- end.
-
-variable_1(E, V, S) ->
- {cerl:update_c_var(E, V), S}.
-
-%% A catch-expression 'catch Expr' is rewritten as:
-%%
-%% try Expr
-%% of (V) -> V
-%% catch (T, V, E) ->
-%% letrec 'wrap'/1 = fun (V) -> {'EXIT', V}
-%% in case T of
-%% 'throw' when 'true' -> V
-%% 'exit' when 'true' -> 'wrap'/1(V)
-%% V when 'true' ->
-%% 'wrap'/1({V, erlang:get_stacktrace()})
-%% end
-
-catch_expr(E, Env, Ren, Ctxt, S) ->
- T = cerl:c_var('T'),
- V = cerl:c_var('V'),
- X = cerl:c_var('X'),
- W = cerl:c_var({wrap,1}),
- G = cerl:c_call(cerl:c_atom('erlang'),cerl:c_atom('get_stacktrace'),[]),
- Cs = [cerl:c_clause([cerl:c_atom('throw')], V),
- cerl:c_clause([cerl:c_atom('exit')], cerl:c_apply(W, [V])),
- cerl:c_clause([T], cerl:c_apply(W, [cerl:c_tuple([V,G])]))
- ],
- C = cerl:c_case(T, Cs),
- F = cerl:c_fun([V], cerl:c_tuple([cerl:c_atom('EXIT'), V])),
- H = cerl:c_letrec([{W,F}], C),
- As = cerl:get_ann(E),
- {B, S1} = expr(cerl:catch_body(E),Env, Ren, Ctxt, S),
- {cerl:ann_c_try(As, B, [V], V, [T,V,X], H), S1}.
-
-%% Receive-expressions are rewritten as follows:
-%%
-%% receive
-%% P1 when G1 -> B1
-%% ...
-%% Pn when Gn -> Bn
-%% after T -> A end
-%% becomes:
-%% receive
-%% M when 'true' ->
-%% case M of
-%% P1 when G1 -> do primop RECEIVE_SELECT B1
-%% ...
-%% Pn when Gn -> do primop RECEIVE_SELECT Bn
-%% Pn+1 when 'true' -> primop RECEIVE_NEXT()
-%% end
-%% after T -> A end
-
-receive_expr(E, Env, Ren, Ctxt, S0) ->
- Cs = cerl:receive_clauses(E),
- {B, Vs, S1} = clauses(receive_clauses(Cs), Env, Ren, Ctxt, S0),
- {T, S2} = expr(cerl:receive_timeout(E), Env, Ren, Ctxt, S1),
- {A, S3} = expr(cerl:receive_action(E), Env, Ren, Ctxt, S2),
- Cs1 = [cerl:c_clause(Vs, B)],
- {cerl:update_c_receive(E, Cs1, T, A), S3}.
-
-receive_clauses([C | Cs]) ->
- Call = cerl:c_primop(cerl:c_atom(?PRIMOP_RECEIVE_SELECT),
- []),
- B = cerl:c_seq(Call, cerl:clause_body(C)),
- C1 = cerl:update_c_clause(C, cerl:clause_pats(C),
- cerl:clause_guard(C), B),
- [C1 | receive_clauses(Cs)];
-receive_clauses([]) ->
- Call = cerl:c_primop(cerl:c_atom(?PRIMOP_RECEIVE_NEXT),
- []),
- V = cerl:c_var('X'), % any name is ok
- [cerl:c_clause([V], Call)].
-
-
-new_vars(N, Env) ->
- [cerl:c_var(V) || V <- env__new_names(N, Env)].
-
-
-%% ---------------------------------------------------------------------
-%% Environment
-
-env__new() ->
- rec_env:empty().
-
-env__bind(Key, Value, Env) ->
- rec_env:bind(Key, Value, Env).
-
-%% env__get(Key, Env) ->
-%% rec_env:get(Key, Env).
-
-env__lookup(Key, Env) ->
- rec_env:lookup(Key, Env).
-
-env__is_defined(Key, Env) ->
- rec_env:is_defined(Key, Env).
-
-env__new_name(Env) ->
- rec_env:new_key(Env).
-
-env__new_names(N, Env) ->
- rec_env:new_keys(N, Env).
-
-env__new_function_name(F, Env) ->
- rec_env:new_key(F, Env).
-
-
-%% ---------------------------------------------------------------------
-%% Renaming
-
-ren__new() ->
- dict:new().
-
-ren__add(Key, Value, Ren) ->
- dict:store(Key, Value, Ren).
-
-ren__map(Key, Ren) ->
- case dict:find(Key, Ren) of
- {ok, Value} ->
- Value;
- error ->
- Key
- end.
-
-
-%% ---------------------------------------------------------------------
-%% State
-
--record(state, {module, function, pmatch=true}).
-
-s__new(Module) ->
- #state{module = Module}.
-
-s__get_module_name(S) ->
- S#state.module.
-
-s__enter_function(F, S) ->
- S#state{function = F}.
-
-s__get_function_name(S) ->
- S#state.function.
-
-s__set_pmatch(V, S) ->
- S#state{pmatch = V}.
-
-s__get_pmatch(S) ->
- S#state.pmatch.
diff --git a/lib/dialyzer/test/specdiffs_SUITE_data/results/overloaded b/lib/dialyzer/test/specdiffs_SUITE_data/results/overloaded
new file mode 100644
index 0000000000..f68917c009
--- /dev/null
+++ b/lib/dialyzer/test/specdiffs_SUITE_data/results/overloaded
@@ -0,0 +1,6 @@
+
+overloaded.erl:12: Type specification overloaded:u('a' | 'b' | 'c') -> term() is a subtype of the success typing: overloaded:u(_) -> any()
+overloaded.erl:17: The success typing for overloaded:v/1 implies that the function might also return {'ok','term'} but the specification return is 'ok'
+overloaded.erl:22: Type specification overloaded:x(_) -> {'ok','term'} | 'ok' is a supertype of the success typing: overloaded:x('a' | 'b') -> 'ok' | {'ok','term'}
+overloaded.erl:29: The success typing for overloaded:over/1 implies that the function might also return 'ffyy3' but the specification return is 'ffyy1' | {'ffyy2',integer()}
+overloaded.erl:7: Type specification overloaded:t('a' | 'b') -> term() is a subtype of the success typing: overloaded:t('a' | 'b' | 'c') -> any()
diff --git a/lib/dialyzer/test/specdiffs_SUITE_data/src/overloaded.erl b/lib/dialyzer/test/specdiffs_SUITE_data/src/overloaded.erl
new file mode 100644
index 0000000000..67757fbb2a
--- /dev/null
+++ b/lib/dialyzer/test/specdiffs_SUITE_data/src/overloaded.erl
@@ -0,0 +1,37 @@
+-module(overloaded).
+
+-export([t/1, v/1]).
+
+-export([over/1]).
+
+-spec t(a | b) -> term().
+
+t(A) ->
+ u(A).
+
+-spec u(a | b | c) -> term().
+
+u(X) ->
+ X.
+
+-spec v(_) -> ok.
+
+v(A) ->
+ x(A).
+
+-spec x(_) -> {ok, term} | ok.
+
+x(a) ->
+ {ok, term};
+x(b) ->
+ ok.
+
+-spec over(A) -> ffyy1 when A :: a | b;
+ (B) -> {ffyy2, integer()} when B :: c | d.
+
+over(a) ->
+ ffyy1;
+over(c) ->
+ {ffyy2, 1};
+over(d) ->
+ ffyy3.
diff --git a/lib/erl_docgen/priv/js/highlight.js b/lib/erl_docgen/priv/js/highlight.js
index 0594b42aa3..b176a60928 100644
--- a/lib/erl_docgen/priv/js/highlight.js
+++ b/lib/erl_docgen/priv/js/highlight.js
@@ -28,11 +28,22 @@ window.addEventListener("load", function () {
window.clearInterval(intervalId);
- var i, len, nodes = document.querySelectorAll('.example');
- for (i = 0, len = nodes.length; i < len; i += 1) {
- window.hljs.highlightBlock(nodes[i]);
+ function highlightLanguage(css, languages) {
+ var i, len, nodes = document.querySelectorAll(css);
+ for (i = 0, len = nodes.length; i < len; i += 1) {
+ hljs.configure({languages: languages});
+ window.hljs.highlightBlock(nodes[i]);
+ }
}
+ highlightLanguage('.example-erl',["erlang"]);
+ highlightLanguage('.example-erl-repl',["erlang-repl"]);
+ highlightLanguage('.example-c',["cpp"]);
+ highlightLanguage('.example-cpp',["cpp"]);
+ highlightLanguage('.example-sh',["bash"]);
+ highlightLanguage('.example-diff',["diff"]);
+ highlightLanguage('.example-none',["erlang","erlang-repl","bash","cpp","diff"]);
+
}
intervalId = window.setInterval(doHighlight, 50);
diff --git a/lib/erl_docgen/priv/js/highlight.pack.js b/lib/erl_docgen/priv/js/highlight.pack.js
index 073d39e644..970874f889 100644
--- a/lib/erl_docgen/priv/js/highlight.pack.js
+++ b/lib/erl_docgen/priv/js/highlight.pack.js
@@ -1,2 +1,2 @@
-/*! highlight.js v9.7.0 | BSD3 License | git.io/hljslicense */
-!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/[&<>]/gm,function(e){return I[e]})}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=B.exec(o))return R(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||R(i))return i}function o(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset<r[0].offset?e:r:"start"===r[0].event?e:r:e.length?e:r}function o(e){function r(e){return" "+e.nodeName+'="'+n(e.value)+'"'}l+="<"+t(e)+w.map.call(e.attributes,r).join("")+">"}function u(e){l+="</"+t(e)+">"}function c(e){("start"===e.event?o:u)(e.node)}for(var s=0,l="",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g===e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===s);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");u[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?c("keyword",a.k):E(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(o(e,n))}):s.push("self"===e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var l=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join("|"),!0):{exec:function(){return null}}}}r(e)}function l(e,t,a,i){function o(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function c(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=N.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function h(e,n,t,r){var a=r?"":y.classPrefix,i='<span class="'+a,o=t?"":C;return i+=e+'">',i+n+o}function p(){var e,t,r,a;if(!E.k)return n(B);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(B);r;)a+=n(B.substr(t,r.index-t)),e=g(E,r),e?(M+=e[1],a+=h(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(B);return a+n(B.substr(t))}function d(){var e="string"==typeof E.sL;if(e&&!x[E.sL])return n(B);var t=e?l(E.sL,B,!0,L[E.sL]):f(B,E.sL.length?E.sL:void 0);return E.r>0&&(M+=t.r),e&&(L[E.sL]=t.top),h(t.language,t.value,!1,!0)}function b(){k+=null!=E.sL?d():p(),B=""}function v(e){k+=e.cN?h(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function m(e,n){if(B+=e,null==n)return b(),0;var t=o(n,E);if(t)return t.skip?B+=n:(t.eB&&(B+=n),b(),t.rB||t.eB||(B=n)),v(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?B+=n:(a.rE||a.eE||(B+=n),b(),a.eE&&(B=n));do E.cN&&(k+=C),E.skip||(M+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&v(r.starts,""),a.rE?0:n.length}if(c(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"<unnamed>")+'"');return B+=n,n.length||1}var N=R(e);if(!N)throw new Error('Unknown language: "'+e+'"');s(N);var w,E=i||N,L={},k="";for(w=E;w!==N;w=w.parent)w.cN&&(k=h(w.cN,"",!0)+k);var B="",M=0;try{for(var I,j,O=0;;){if(E.t.lastIndex=O,I=E.t.exec(t),!I)break;j=m(t.substr(O,I.index-O),I[0]),O=I.index+j}for(m(t.substr(O)),w=E;w.parent;w=w.parent)w.cN&&(k+=C);return{r:M,value:k,language:e,top:E}}catch(T){if(T.message&&-1!==T.message.indexOf("Illegal"))return{r:0,value:n(t)};throw T}}function f(e,t){t=t||y.languages||E(x);var r={r:0,value:n(e)},a=r;return t.filter(R).forEach(function(n){var t=l(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function g(e){return y.tabReplace||y.useBR?e.replace(M,function(e,n){return y.useBR&&"\n"===e?"<br>":y.tabReplace?n.replace(/\t/g,y.tabReplace):void 0}):e}function h(e,n,t){var r=n?L[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function p(e){var n,t,r,o,s,p=i(e);a(p)||(y.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div"),n.innerHTML=e.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n")):n=e,s=n.textContent,r=p?l(p,s,!0):f(s),t=u(n),t.length&&(o=document.createElementNS("http://www.w3.org/1999/xhtml","div"),o.innerHTML=r.value,r.value=c(t,u(o),s)),r.value=g(r.value),e.innerHTML=r.value,e.className=h(e.className,p,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function d(e){y=o(y,e)}function b(){if(!b.called){b.called=!0;var e=document.querySelectorAll("pre code");w.forEach.call(e,p)}}function v(){addEventListener("DOMContentLoaded",b,!1),addEventListener("load",b,!1)}function m(n,t){var r=x[n]=t(e);r.aliases&&r.aliases.forEach(function(e){L[e]=n})}function N(){return E(x)}function R(e){return e=(e||"").toLowerCase(),x[e]||x[L[e]]}var w=[],E=Object.keys,x={},L={},k=/^(no-?highlight|plain|text)$/i,B=/\blang(?:uage)?-([\w-]+)\b/i,M=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,C="</span>",y={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},I={"&":"&amp;","<":"&lt;",">":"&gt;"};return e.highlight=l,e.highlightAuto=f,e.fixMarkup=g,e.highlightBlock=p,e.configure=d,e.initHighlighting=b,e.initHighlightingOnLoad=v,e.registerLanguage=m,e.listLanguages=N,e.getLanguage=R,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|like)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("erlang",function(e){var r="[a-z'][a-zA-Z0-9_']*",c="("+r+":"+r+"|"+r+")",b={keyword:"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun if let not of orelse|10 query receive rem try when xor",literal:"false true"},i=e.C("%","$"),n={cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0},a={b:"fun\\s+"+r+"/\\d+"},d={b:c+"\\(",e:"\\)",rB:!0,r:0,c:[{b:c,r:0},{b:"\\(",e:"\\)",eW:!0,rE:!0,r:0}]},o={b:"{",e:"}",r:0},t={b:"\\b_([A-Z][A-Za-z0-9_]*)?",r:0},f={b:"[A-Z][a-zA-Z0-9_]*",r:0},l={b:"#"+e.UIR,r:0,rB:!0,c:[{b:"#"+e.UIR,r:0},{b:"{",e:"}",r:0}]},s={bK:"fun receive if try case",e:"end",k:b};s.c=[i,a,e.inherit(e.ASM,{cN:""}),s,d,e.QSM,n,o,t,f,l];var u=[i,a,s,d,e.QSM,n,o,t,f,l];d.c[1].c=u,o.c=u,l.c[1].c=u;var h={cN:"params",b:"\\(",e:"\\)",c:u};return{aliases:["erl"],k:b,i:"(</|\\*=|\\+=|-=|/\\*|\\*/|\\(\\*|\\*\\))",c:[{cN:"function",b:"^"+r+"\\s*\\(",e:"->",rB:!0,i:"\\(|#|//|/\\*|\\\\|:|;",c:[h,e.inherit(e.TM,{b:r})],starts:{e:";|\\.",k:b,c:u}},i,{b:"^-",e:"\\.",r:0,eE:!0,rB:!0,l:"-"+e.IR,k:"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior -spec",c:[h]},n,e.QSM,l,t,f,o,{b:/\.$/}]}});hljs.registerLanguage("erlang-repl",function(e){return{k:{built_in:"spawn spawn_link self",keyword:"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor"},c:[{cN:"meta",b:"^[0-9]+> ",r:10},e.C("%","$"),{cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0},e.ASM,e.QSM,{b:"\\?(::)?([A-Z]\\w*(::)?)+"},{b:"->"},{b:"ok"},{b:"!"},{b:"(\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\b[a-z'][a-zA-Z0-9_']*)",r:0},{b:"[A-Z][a-zA-Z0-9_']*",r:0}]}});hljs.registerLanguage("diff",function(e){return{aliases:["patch"],c:[{cN:"meta",r:10,v:[{b:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"comment",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\-{3}/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+{3}/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"addition",b:"^\\!",e:"$"}]}});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/-?[a-z\._]+/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,s,a,t]}}); \ No newline at end of file
+/*! highlight.js v9.15.10 | BSD3 License | git.io/hljslicense */
+!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"==typeof exports||exports.nodeType?n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs})):e(exports)}(function(a){var f=[],u=Object.keys,N={},c={},n=/^(no-?highlight|plain|text)$/i,s=/\blang(?:uage)?-([\w-]+)\b/i,t=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,r={case_insensitive:"cI",lexemes:"l",contains:"c",keywords:"k",subLanguage:"sL",className:"cN",begin:"b",beginKeywords:"bK",end:"e",endsWithParent:"eW",illegal:"i",excludeBegin:"eB",excludeEnd:"eE",returnBegin:"rB",returnEnd:"rE",relevance:"r",variants:"v",IDENT_RE:"IR",UNDERSCORE_IDENT_RE:"UIR",NUMBER_RE:"NR",C_NUMBER_RE:"CNR",BINARY_NUMBER_RE:"BNR",RE_STARTERS_RE:"RSR",BACKSLASH_ESCAPE:"BE",APOS_STRING_MODE:"ASM",QUOTE_STRING_MODE:"QSM",PHRASAL_WORDS_MODE:"PWM",C_LINE_COMMENT_MODE:"CLCM",C_BLOCK_COMMENT_MODE:"CBCM",HASH_COMMENT_MODE:"HCM",NUMBER_MODE:"NM",C_NUMBER_MODE:"CNM",BINARY_NUMBER_MODE:"BNM",CSS_NUMBER_MODE:"CSSNM",REGEXP_MODE:"RM",TITLE_MODE:"TM",UNDERSCORE_TITLE_MODE:"UTM",COMMENT:"C",beginRe:"bR",endRe:"eR",illegalRe:"iR",lexemesRe:"lR",terminators:"t",terminator_end:"tE"},b="</span>",h={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};function _(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function E(e){return e.nodeName.toLowerCase()}function v(e,n){var t=e&&e.exec(n);return t&&0===t.index}function l(e){return n.test(e)}function g(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function R(e){var a=[];return function e(n,t){for(var r=n.firstChild;r;r=r.nextSibling)3===r.nodeType?t+=r.nodeValue.length:1===r.nodeType&&(a.push({event:"start",offset:t,node:r}),t=e(r,t),E(r).match(/br|hr|img|input/)||a.push({event:"stop",offset:t,node:r}));return t}(e,0),a}function i(e){if(r&&!e.langApiRestored){for(var n in e.langApiRestored=!0,r)e[n]&&(e[r[n]]=e[n]);(e.c||[]).concat(e.v||[]).forEach(i)}}function m(o){function s(e){return e&&e.source||e}function c(e,n){return new RegExp(s(e),"m"+(o.cI?"i":"")+(n?"g":""))}!function n(t,e){if(!t.compiled){if(t.compiled=!0,t.k=t.k||t.bK,t.k){function r(t,e){o.cI&&(e=e.toLowerCase()),e.split(" ").forEach(function(e){var n=e.split("|");a[n[0]]=[t,n[1]?Number(n[1]):1]})}var a={};"string"==typeof t.k?r("keyword",t.k):u(t.k).forEach(function(e){r(e,t.k[e])}),t.k=a}t.lR=c(t.l||/\w+/,!0),e&&(t.bK&&(t.b="\\b("+t.bK.split(" ").join("|")+")\\b"),t.b||(t.b=/\B|\b/),t.bR=c(t.b),t.endSameAsBegin&&(t.e=t.b),t.e||t.eW||(t.e=/\B|\b/),t.e&&(t.eR=c(t.e)),t.tE=s(t.e)||"",t.eW&&e.tE&&(t.tE+=(t.e?"|":"")+e.tE)),t.i&&(t.iR=c(t.i)),null==t.r&&(t.r=1),t.c||(t.c=[]),t.c=Array.prototype.concat.apply([],t.c.map(function(e){return function(n){return n.v&&!n.cached_variants&&(n.cached_variants=n.v.map(function(e){return g(n,{v:null},e)})),n.cached_variants||n.eW&&[g(n)]||[n]}("self"===e?t:e)})),t.c.forEach(function(e){n(e,t)}),t.starts&&n(t.starts,e);var i=t.c.map(function(e){return e.bK?"\\.?(?:"+e.b+")\\.?":e.b}).concat([t.tE,t.i]).map(s).filter(Boolean);t.t=i.length?c(function(e,n){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i<e.length;i++){var o=r,c=s(e[i]);for(0<i&&(a+=n);0<c.length;){var u=t.exec(c);if(null==u){a+=c;break}a+=c.substring(0,u.index),c=c.substring(u.index+u[0].length),"\\"==u[0][0]&&u[1]?a+="\\"+String(Number(u[1])+o):(a+=u[0],"("==u[0]&&r++)}}return a}(i,"|"),!0):{exec:function(){return null}}}}(o)}function C(e,n,i,t){function c(e,n,t,r){var a='<span class="'+(r?"":h.classPrefix);return e?(a+=e+'">')+n+(t?"":b):n}function o(){E+=null!=l.sL?function(){var e="string"==typeof l.sL;if(e&&!N[l.sL])return _(g);var n=e?C(l.sL,g,!0,f[l.sL]):O(g,l.sL.length?l.sL:void 0);return 0<l.r&&(R+=n.r),e&&(f[l.sL]=n.top),c(n.language,n.value,!1,!0)}():function(){var e,n,t,r,a,i,o;if(!l.k)return _(g);for(r="",n=0,l.lR.lastIndex=0,t=l.lR.exec(g);t;)r+=_(g.substring(n,t.index)),a=l,i=t,void 0,o=s.cI?i[0].toLowerCase():i[0],(e=a.k.hasOwnProperty(o)&&a.k[o])?(R+=e[1],r+=c(e[0],_(t[0]))):r+=_(t[0]),n=l.lR.lastIndex,t=l.lR.exec(g);return r+_(g.substr(n))}(),g=""}function u(e){E+=e.cN?c(e.cN,"",!0):"",l=Object.create(e,{parent:{value:l}})}function r(e,n){if(g+=e,null==n)return o(),0;var t=function(e,n){var t,r,a;for(t=0,r=n.c.length;t<r;t++)if(v(n.c[t].bR,e))return n.c[t].endSameAsBegin&&(n.c[t].eR=(a=n.c[t].bR.exec(e)[0],new RegExp(a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"),"m"))),n.c[t]}(n,l);if(t)return t.skip?g+=n:(t.eB&&(g+=n),o(),t.rB||t.eB||(g=n)),u(t),t.rB?0:n.length;var r=function e(n,t){if(v(n.eR,t)){for(;n.endsParent&&n.parent;)n=n.parent;return n}if(n.eW)return e(n.parent,t)}(l,n);if(r){var a=l;for(a.skip?g+=n:(a.rE||a.eE||(g+=n),o(),a.eE&&(g=n));l.cN&&(E+=b),l.skip||l.sL||(R+=l.r),(l=l.parent)!==r.parent;);return r.starts&&(r.endSameAsBegin&&(r.starts.eR=r.eR),u(r.starts)),a.rE?0:n.length}if(function(e,n){return!i&&v(n.iR,e)}(n,l))throw new Error('Illegal lexeme "'+n+'" for mode "'+(l.cN||"<unnamed>")+'"');return g+=n,n.length||1}var s=B(e);if(!s)throw new Error('Unknown language: "'+e+'"');m(s);var a,l=t||s,f={},E="";for(a=l;a!==s;a=a.parent)a.cN&&(E=c(a.cN,"",!0)+E);var g="",R=0;try{for(var d,p,M=0;l.t.lastIndex=M,d=l.t.exec(n);)p=r(n.substring(M,d.index),d[0]),M=d.index+p;for(r(n.substr(M)),a=l;a.parent;a=a.parent)a.cN&&(E+=b);return{r:R,value:E,language:e,top:l}}catch(e){if(e.message&&-1!==e.message.indexOf("Illegal"))return{r:0,value:_(n)};throw e}}function O(t,e){e=e||h.languages||u(N);var r={r:0,value:_(t)},a=r;return e.filter(B).filter(M).forEach(function(e){var n=C(e,t,!1);n.language=e,n.r>a.r&&(a=n),n.r>r.r&&(a=r,r=n)}),a.language&&(r.second_best=a),r}function d(e){return h.tabReplace||h.useBR?e.replace(t,function(e,n){return h.useBR&&"\n"===e?"<br>":h.tabReplace?n.replace(/\t/g,h.tabReplace):""}):e}function o(e){var n,t,r,a,i,o=function(e){var n,t,r,a,i=e.className+" ";if(i+=e.parentNode?e.parentNode.className:"",t=s.exec(i))return B(t[1])?t[1]:"no-highlight";for(n=0,r=(i=i.split(/\s+/)).length;n<r;n++)if(l(a=i[n])||B(a))return a}(e);l(o)||(h.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n"):n=e,i=n.textContent,r=o?C(o,i,!0):O(i),(t=R(n)).length&&((a=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=r.value,r.value=function(e,n,t){var r=0,a="",i=[];function o(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset<n[0].offset?e:n:"start"===n[0].event?e:n:e.length?e:n}function c(e){a+="<"+E(e)+f.map.call(e.attributes,function(e){return" "+e.nodeName+'="'+_(e.value).replace('"',"&quot;")+'"'}).join("")+">"}function u(e){a+="</"+E(e)+">"}function s(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var l=o();if(a+=_(t.substring(r,l[0].offset)),r=l[0].offset,l===e){for(i.reverse().forEach(u);s(l.splice(0,1)[0]),(l=o())===e&&l.length&&l[0].offset===r;);i.reverse().forEach(c)}else"start"===l[0].event?i.push(l[0].node):i.pop(),s(l.splice(0,1)[0])}return a+_(t.substr(r))}(t,R(a),i)),r.value=d(r.value),e.innerHTML=r.value,e.className=function(e,n,t){var r=n?c[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}(e.className,o,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function p(){if(!p.called){p.called=!0;var e=document.querySelectorAll("pre code");f.forEach.call(e,o)}}function B(e){return e=(e||"").toLowerCase(),N[e]||N[c[e]]}function M(e){var n=B(e);return n&&!n.disableAutodetect}return a.highlight=C,a.highlightAuto=O,a.fixMarkup=d,a.highlightBlock=o,a.configure=function(e){h=g(h,e)},a.initHighlighting=p,a.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",p,!1),addEventListener("load",p,!1)},a.registerLanguage=function(n,e){var t=N[n]=e(a);i(t),t.aliases&&t.aliases.forEach(function(e){c[e]=n})},a.listLanguages=function(){return u(N)},a.getLanguage=B,a.autoDetection=M,a.inherit=g,a.IR=a.IDENT_RE="[a-zA-Z]\\w*",a.UIR=a.UNDERSCORE_IDENT_RE="[a-zA-Z_]\\w*",a.NR=a.NUMBER_RE="\\b\\d+(\\.\\d+)?",a.CNR=a.C_NUMBER_RE="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",a.BNR=a.BINARY_NUMBER_RE="\\b(0b[01]+)",a.RSR=a.RE_STARTERS_RE="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",a.BE=a.BACKSLASH_ESCAPE={b:"\\\\[\\s\\S]",r:0},a.ASM=a.APOS_STRING_MODE={cN:"string",b:"'",e:"'",i:"\\n",c:[a.BE]},a.QSM=a.QUOTE_STRING_MODE={cN:"string",b:'"',e:'"',i:"\\n",c:[a.BE]},a.PWM=a.PHRASAL_WORDS_MODE={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},a.C=a.COMMENT=function(e,n,t){var r=a.inherit({cN:"comment",b:e,e:n,c:[]},t||{});return r.c.push(a.PWM),r.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),r},a.CLCM=a.C_LINE_COMMENT_MODE=a.C("//","$"),a.CBCM=a.C_BLOCK_COMMENT_MODE=a.C("/\\*","\\*/"),a.HCM=a.HASH_COMMENT_MODE=a.C("#","$"),a.NM=a.NUMBER_MODE={cN:"number",b:a.NR,r:0},a.CNM=a.C_NUMBER_MODE={cN:"number",b:a.CNR,r:0},a.BNM=a.BINARY_NUMBER_MODE={cN:"number",b:a.BNR,r:0},a.CSSNM=a.CSS_NUMBER_MODE={cN:"number",b:a.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},a.RM=a.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[a.BE,{b:/\[/,e:/\]/,r:0,c:[a.BE]}]},a.TM=a.TITLE_MODE={cN:"title",b:a.IR,r:0},a.UTM=a.UNDERSCORE_TITLE_MODE={cN:"title",b:a.UIR,r:0},a.METHOD_GUARD={b:"\\.\\s*"+a.UIR,r:0},a});hljs.registerLanguage("diff",function(e){return{aliases:["patch"],c:[{cN:"meta",r:10,v:[{b:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"comment",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\-{3}/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+{3}/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"addition",b:"^\\!",e:"$"}]}});hljs.registerLanguage("cpp",function(t){var e={cN:"keyword",b:"\\b[a-z\\d_]*_t\\b"},r={cN:"string",v:[{b:'(u8?|U|L)?"',e:'"',i:"\\n",c:[t.BE]},{b:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\((?:.|\n)*?\)\1"/},{b:"'\\\\?.",e:"'",i:"."}]},s={cN:"number",v:[{b:"\\b(0b[01']+)"},{b:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{b:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],r:0},i={cN:"meta",b:/#\s*[a-z]+\b/,e:/$/,k:{"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef include"},c:[{b:/\\\n/,r:0},t.inherit(r,{cN:"meta-string"}),{cN:"meta-string",b:/<[^\n>]*>/,e:/$/,i:"\\n"},t.CLCM,t.CBCM]},a=t.IR+"\\s*\\(",c={keyword:"int float while private char catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignof constexpr decltype noexcept static_assert thread_local restrict _Bool complex _Complex _Imaginary atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and or not",built_in:"std string cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr",literal:"true false nullptr NULL"},n=[e,t.CLCM,t.CBCM,s,r];return{aliases:["c","cc","h","c++","h++","hpp","hh","hxx","cxx"],k:c,i:"</",c:n.concat([i,{b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:c,c:["self",e]},{b:t.IR+"::",k:c},{v:[{b:/=/,e:/;/},{b:/\(/,e:/\)/},{bK:"new throw return else",e:/;/}],k:c,c:n.concat([{b:/\(/,e:/\)/,k:c,c:n.concat(["self"]),r:0}]),r:0},{cN:"function",b:"("+t.IR+"[\\*&\\s]+)+"+a,rB:!0,e:/[{;=]/,eE:!0,k:c,i:/[^\w\s\*&]/,c:[{b:a,rB:!0,c:[t.TM],r:0},{cN:"params",b:/\(/,e:/\)/,k:c,r:0,c:[t.CLCM,t.CBCM,r,s,e,{b:/\(/,e:/\)/,k:c,r:0,c:["self",t.CLCM,t.CBCM,r,s,e]}]},t.CLCM,t.CBCM,i]},{cN:"class",bK:"class struct",e:/[{;:]/,c:[{b:/</,e:/>/,c:["self"]},t.TM]}]),exports:{preprocessor:i,strings:r,k:c}}});hljs.registerLanguage("erlang-repl",function(e){return{k:{built_in:"spawn spawn_link self",keyword:"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor"},c:[{cN:"meta",b:"^[0-9]+> ",r:10},e.C("%","$"),{cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0},e.ASM,e.QSM,{b:"\\?(::)?([A-Z]\\w*(::)?)+"},{b:"->"},{b:"ok"},{b:"!"},{b:"(\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\b[a-z'][a-zA-Z0-9_']*)",r:0},{b:"[A-Z][a-zA-Z0-9_']*",r:0}]}});hljs.registerLanguage("erlang",function(e){var r="[a-z'][a-zA-Z0-9_']*",c="("+r+":"+r+"|"+r+")",b={keyword:"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun if let not of orelse|10 query receive rem try when xor",literal:"false true"},i=e.C("%","$"),n={cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0},a={b:"fun\\s+"+r+"/\\d+"},d={b:c+"\\(",e:"\\)",rB:!0,r:0,c:[{b:c,r:0},{b:"\\(",e:"\\)",eW:!0,rE:!0,r:0}]},o={b:"{",e:"}",r:0},t={b:"\\b_([A-Z][A-Za-z0-9_]*)?",r:0},f={b:"[A-Z][a-zA-Z0-9_]*",r:0},l={b:"#"+e.UIR,r:0,rB:!0,c:[{b:"#"+e.UIR,r:0},{b:"{",e:"}",r:0}]},s={bK:"fun receive if try case",e:"end",k:b};s.c=[i,a,e.inherit(e.ASM,{cN:""}),s,d,e.QSM,n,o,t,f,l];var u=[i,a,s,d,e.QSM,n,o,t,f,l];d.c[1].c=u,o.c=u;var h={cN:"params",b:"\\(",e:"\\)",c:l.c[1].c=u};return{aliases:["erl"],k:b,i:"(</|\\*=|\\+=|-=|/\\*|\\*/|\\(\\*|\\*\\))",c:[{cN:"function",b:"^"+r+"\\s*\\(",e:"->",rB:!0,i:"\\(|#|//|/\\*|\\\\|:|;",c:[h,e.inherit(e.TM,{b:r})],starts:{e:";|\\.",k:b,c:u}},i,{b:"^-",e:"\\.",r:0,eE:!0,rB:!0,l:"-"+e.IR,k:"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior -spec",c:[h]},n,e.QSM,l,t,f,o,{b:/\.$/}]}});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]};return{aliases:["sh","zsh"],l:/\b-?[a-z\._]+\b/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,s,{cN:"",b:/\\"/},{cN:"string",b:/'/,e:/'/},t]}}); \ No newline at end of file
diff --git a/lib/erl_docgen/priv/xsl/db_html.xsl b/lib/erl_docgen/priv/xsl/db_html.xsl
index 18bc8cd1cf..aee496b948 100644
--- a/lib/erl_docgen/priv/xsl/db_html.xsl
+++ b/lib/erl_docgen/priv/xsl/db_html.xsl
@@ -464,16 +464,25 @@
<!-- Datatype -->
<xsl:template match="datatype">
- <xsl:variable name="id" select="concat('type-',name/@name)"/>
<div class="data-types-body">
- <div class="data-type-name"
- onMouseOver="document.getElementById('ghlink-{$id}').style.visibility = 'visible';"
- onMouseOut="document.getElementById('ghlink-{$id}').style.visibility = 'hidden';">
- <xsl:call-template name="ghlink">
- <xsl:with-param name="id" select="$id"/>
- </xsl:call-template>
- <xsl:apply-templates select="name"/>
- </div>
+ <xsl:choose>
+ <xsl:when test="string-length(name/@name) > 0">
+ <xsl:variable name="id" select="concat('type-',name/@name)"/>
+ <div class="data-type-name"
+ onMouseOver="document.getElementById('ghlink-{$id}').style.visibility = 'visible';"
+ onMouseOut="document.getElementById('ghlink-{$id}').style.visibility = 'hidden';">
+ <xsl:call-template name="ghlink">
+ <xsl:with-param name="id" select="$id"/>
+ </xsl:call-template>
+ <xsl:apply-templates select="name"/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <div class="data-type-name">
+ <xsl:apply-templates select="name"/>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
<div class="data-type-desc"><xsl:apply-templates select="desc"/></div>
</div>
</xsl:template>
@@ -1226,17 +1235,18 @@
<!-- Code -->
<xsl:template match="code">
<xsl:param name="chapnum"/>
+ <xsl:variable name="type" select="@type"/>
<xsl:variable name="codenum">
<xsl:number level="any" from="chapter" count="code"/>
</xsl:variable>
- <xsl:choose>
- <xsl:when test="not(descendant::anno)">
- <div class="example"><pre><xsl:value-of select="erl:code_trim(text())"/></pre></div>
- </xsl:when>
- <xsl:otherwise>
- <div class="example"><pre><xsl:apply-templates/></pre></div>
- </xsl:otherwise>
- </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="not(descendant::anno)">
+ <div class="example example-{$type}"><pre><xsl:value-of select="erl:code_trim(text())"/></pre></div>
+ </xsl:when>
+ <xsl:otherwise>
+ <div class="example example-{$type}"><pre><xsl:apply-templates/></pre></div>
+ </xsl:otherwise>
+ </xsl:choose>
</xsl:template>
<!-- Pre -->
diff --git a/lib/ftp/doc/src/notes.xml b/lib/ftp/doc/src/notes.xml
index d71f795c09..8c1b73e87d 100644
--- a/lib/ftp/doc/src/notes.xml
+++ b/lib/ftp/doc/src/notes.xml
@@ -49,6 +49,37 @@
</section>
+ <section><title>Ftp 1.0.2.2</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ A possibly infinite loop is removed.</p>
+ <p>
+ Own Id: OTP-16243 Aux Id: PR-2436, OTP-16056 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+ <section><title>Ftp 1.0.2.1</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ A possibly infinite loop when receiving messages divided
+ in parts is removed.</p>
+ <p>
+ Own Id: OTP-16056</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Ftp 1.0.2</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/ftp/src/ftp.erl b/lib/ftp/src/ftp.erl
index e9be7b8ff7..2f7a67df67 100644
--- a/lib/ftp/src/ftp.erl
+++ b/lib/ftp/src/ftp.erl
@@ -1375,11 +1375,11 @@ handle_info({Transport, Socket, Data}, #state{csock = {Transport, Socket},
verbose = Verbose,
caller = Caller,
client = From,
- ctrl_data = {CtrlData, AccLines,
+ ctrl_data = {BinCtrlData, AccLines,
LineStatus}}
= State0) ->
- ?DBG('--ctrl ~p ----> ~s~p~n',[Socket,<<CtrlData/binary, Data/binary>>,State]),
- case ftp_response:parse_lines(<<CtrlData/binary, Data/binary>>,
+ ?DBG('--ctrl ~p ----> ~s~p~n',[Socket,<<BinCtrlData/binary, Data/binary>>,State]),
+ case ftp_response:parse_lines(<<BinCtrlData/binary, Data/binary>>,
AccLines, LineStatus) of
{ok, Lines, NextMsgData} ->
verbose(Lines, Verbose, 'receive'),
@@ -1399,12 +1399,13 @@ handle_info({Transport, Socket, Data}, #state{csock = {Transport, Socket},
ctrl_data =
{NextMsgData, [], start}})
end;
- {continue, NewCtrlData} when NewCtrlData =/= CtrlData ->
- ?DBG(' ...Continue... ctrl_data=~p~n',[NewCtrlData]),
- State = activate_ctrl_connection(State0),
- {noreply, State#state{ctrl_data = NewCtrlData}};
- {continue, NewCtrlData} when NewCtrlData == CtrlData ->
- ?DBG(' ...Continue... ctrl_data=~p~n',[NewCtrlData]),
+ {continue, CtrlData} when CtrlData =/= State0#state.ctrl_data ->
+ ?DBG(' ...Continue... ctrl_data=~p~n',[CtrlData]),
+ State1 = State0#state{ctrl_data = CtrlData},
+ State = activate_ctrl_connection(State1),
+ {noreply, State};
+ {continue, CtrlData} ->
+ ?DBG(' ...Continue... ctrl_data=~p~n',[CtrlData]),
{noreply, State0}
end;
diff --git a/lib/hipe/cerl/erl_bif_types.erl b/lib/hipe/cerl/erl_bif_types.erl
index 8ae1cd4ab7..0b6db544ca 100644
--- a/lib/hipe/cerl/erl_bif_types.erl
+++ b/lib/hipe/cerl/erl_bif_types.erl
@@ -2384,7 +2384,7 @@ arg_types(erlang, is_port, 1) ->
arg_types(erlang, is_record, 2) ->
[t_any(), t_atom()];
arg_types(erlang, is_record, 3) ->
- [t_any(), t_atom(), t_pos_fixnum()];
+ [t_any(), t_atom(), t_non_neg_fixnum()];
arg_types(erlang, is_reference, 1) ->
[t_any()];
arg_types(erlang, is_tuple, 1) ->
diff --git a/lib/inets/doc/src/notes.xml b/lib/inets/doc/src/notes.xml
index 7e2bc42d2f..7e69b4fac4 100644
--- a/lib/inets/doc/src/notes.xml
+++ b/lib/inets/doc/src/notes.xml
@@ -104,6 +104,21 @@
</section>
+ <section><title>Inets 7.0.7.2</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Add HTTP server error logging vi logger</p>
+ <p>
+ Own Id: OTP-16019</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Inets 7.0.7.1</title>
<section><title>Improvements and New Features</title>
diff --git a/lib/inets/examples/httpd_load_test/hdlt_random_html.erl b/lib/inets/examples/httpd_load_test/hdlt_random_html.erl
index 3b72d27f06..75b01fede0 100644
--- a/lib/inets/examples/httpd_load_test/hdlt_random_html.erl
+++ b/lib/inets/examples/httpd_load_test/hdlt_random_html.erl
@@ -23,10 +23,6 @@
-export([page/3]).
page(SessionID, _Env, Input) ->
-%% log("page(~p) -> deliver content-type when"
-%% "~n SessionID: ~p"
-%% "~n Env: ~p"
-%% "~n Input: ~p", [self(), SessionID, Env, Input]),
[WorkSimStr, SzSimStr] = string:tokens(Input, [$:]),
WorkSim = list_to_integer(WorkSimStr),
SzSim = list_to_integer(SzSimStr),
@@ -49,15 +45,5 @@ stop() ->
".
content(WorkSim, SzSim) ->
- {A, B, C} = {erlang:phash2([node()]),
- inets_time_compat:monotonic_time(),
- inets_time_compat:unique_integer()},
-
- random:seed(A, B, C),
- lists:sort([random:uniform(X) || X <- lists:seq(1, WorkSim)]),
+ lists:sort([rand:uniform(X) || X <- lists:seq(1, WorkSim)]),
lists:flatten(lists:duplicate(SzSim, "Dummy data ")).
-
-%% log(F, A) ->
-%% hdlt_logger:set_name("HDLT RANDOM-HTML"),
-%% hdlt_logger:set_level(debug),
-%% hdlt_logger:log(F, A).
diff --git a/lib/inets/src/http_client/httpc.erl b/lib/inets/src/http_client/httpc.erl
index 9967488f61..1e46fa955b 100644
--- a/lib/inets/src/http_client/httpc.erl
+++ b/lib/inets/src/http_client/httpc.erl
@@ -176,7 +176,7 @@ request(Method,
(Method =:= delete) orelse
(Method =:= trace) andalso
(is_atom(Profile) orelse is_pid(Profile)) ->
- case uri_string:parse(uri_string:normalize(Url)) of
+ case normalize_and_parse_url(Url) of
{error, Reason, _} ->
{error, Reason};
ParsedUrl ->
@@ -190,7 +190,7 @@ request(Method,
end.
do_request(Method, {Url, Headers, ContentType, Body}, HTTPOptions, Options, Profile) ->
- case uri_string:parse(uri_string:normalize(Url)) of
+ case normalize_and_parse_url(Url) of
{error, Reason, _} ->
{error, Reason};
ParsedUrl ->
@@ -313,7 +313,7 @@ store_cookies(SetCookieHeaders, Url) ->
store_cookies(SetCookieHeaders, Url, Profile)
when is_atom(Profile) orelse is_pid(Profile) ->
- case uri_string:parse(uri_string:normalize(Url)) of
+ case normalize_and_parse_url(Url) of
{error, Bad, _} ->
{error, {parse_failed, Bad}};
URI ->
@@ -500,6 +500,12 @@ service_info(Pid) ->
%%%========================================================================
%%% Internal functions
%%%========================================================================
+normalize_and_parse_url(Url) ->
+ case uri_string:normalize(Url) of
+ {error, _, _} = Error -> Error;
+ UriString -> uri_string:parse(UriString)
+ end.
+
handle_request(Method, Url,
URI,
Headers0, ContentType, Body0,
diff --git a/lib/inets/src/http_lib/http_request.erl b/lib/inets/src/http_lib/http_request.erl
index 2b1a0bd40f..c49402cc1f 100644
--- a/lib/inets/src/http_lib/http_request.erl
+++ b/lib/inets/src/http_lib/http_request.erl
@@ -28,7 +28,14 @@
key_value(KeyValueStr) ->
case lists:splitwith(fun($:) -> false; (_) -> true end, KeyValueStr) of
{Key, [$: | Value]} when Key =/= [] ->
- {http_util:to_lower(string:strip(Key)), string:strip(Value)};
+ %% RFC 7230 - 3.2.4 ... No whitespace is allowed between the header field-name and colon.
+ case string:strip(Key, right) of
+ Key ->
+ {http_util:to_lower(string:strip(Key, left)), string:strip(Value)};
+ _ ->
+ %% Ignore invalid header
+ undefined
+ end;
{_, []} ->
undefined;
_ ->
diff --git a/lib/inets/src/http_server/httpd_example.erl b/lib/inets/src/http_server/httpd_example.erl
index aaa7e428c2..3c25ca336f 100644
--- a/lib/inets/src/http_server/httpd_example.erl
+++ b/lib/inets/src/http_server/httpd_example.erl
@@ -22,7 +22,7 @@
-export([print/1]).
-export([get/2, put/2, post/2, yahoo/2, test1/2, get_bin/2, peer/2,new_status_and_location/2]).
--export([newformat/3, post_chunked/3, post_204/3]).
+-export([newformat/3, post_chunked/3, post_204/3, ignore_invalid_header/3]).
%% These are used by the inets test-suite
-export([delay/1, chunk_timeout/3, get_chunks/3]).
@@ -156,7 +156,16 @@ post_204(SessionID, _Env, _Input) ->
["Status: 204 No Content" ++ "\r\n\r\n"]),
mod_esi:deliver(SessionID, []).
-
+ignore_invalid_header(SessionID, Env, _Input) ->
+ case proplists:get_value(content_length, Env, undefined) of
+ undefined ->
+ mod_esi:deliver(SessionID,
+ ["Status: 204 No Content" ++ "\r\n\r\n"]);
+ _ -> %% Invalid content_length header should have been ignored
+ mod_esi:deliver(SessionID,
+ ["Status: 500 Internal Server Error" ++ "\r\n\r\n"])
+ end.
+
newformat(SessionID,_,_) ->
mod_esi:deliver(SessionID, "Content-Type:text/html\r\n\r\n"),
mod_esi:deliver(SessionID, top("new esi format test")),
diff --git a/lib/inets/src/http_server/httpd_request.erl b/lib/inets/src/http_server/httpd_request.erl
index 79566e3ac8..3df55c0f7a 100644
--- a/lib/inets/src/http_server/httpd_request.erl
+++ b/lib/inets/src/http_server/httpd_request.erl
@@ -207,7 +207,7 @@ parse_headers(<<?CR,?LF,?CR,?LF,Body/binary>>, Header, Headers, _, _,
Options, Result) ->
Customize = proplists:get_value(customize, Options),
case http_request:key_value(lists:reverse(Header)) of
- undefined -> %% Skip headers with missing :
+ undefined -> %% Skip invalid headers
FinalHeaders = lists:filtermap(fun(H) ->
httpd_custom:customize_headers(Customize, request_header, H)
end,
diff --git a/lib/inets/test/httpc_SUITE.erl b/lib/inets/test/httpc_SUITE.erl
index 8ca4f21928..04340654e1 100644
--- a/lib/inets/test/httpc_SUITE.erl
+++ b/lib/inets/test/httpc_SUITE.erl
@@ -107,7 +107,8 @@ real_requests()->
inet_opts,
invalid_headers,
invalid_body,
- no_scheme
+ no_scheme,
+ invalid_uri
].
real_requests_esi() ->
@@ -1243,6 +1244,14 @@ no_scheme(_Config) ->
%%-------------------------------------------------------------------------
+
+invalid_uri(Config) ->
+ URL = url(group_name(Config), "/bar?x[]=a", Config),
+ {error, invalid_uri} = httpc:request(URL),
+ ok.
+
+
+%%-------------------------------------------------------------------------
remote_socket_close(Config) when is_list(Config) ->
URL = url(group_name(Config), "/just_close.html", Config),
{error, socket_closed_remotely} = httpc:request(URL).
diff --git a/lib/inets/test/httpd_SUITE.erl b/lib/inets/test/httpd_SUITE.erl
index 1d80d604b7..1289432f0d 100644
--- a/lib/inets/test/httpd_SUITE.erl
+++ b/lib/inets/test/httpd_SUITE.erl
@@ -168,6 +168,7 @@ http_get() ->
missing_CR,
max_header,
max_content_length,
+ ignore_invalid_header,
ipv6
].
@@ -1362,6 +1363,25 @@ max_content_length(Config) when is_list(Config) ->
proplists:get_value(node, Config), Version).
%%-------------------------------------------------------------------------
+ignore_invalid_header() ->
+ ["RFC 7230 - 3.2.4 ... No whitespace is allowed between the header field-name and colon"].
+ignore_invalid_header(Config) when is_list(Config) ->
+ Host = proplists:get_value(host, Config),
+ Port = proplists:get_value(port, Config),
+ {Url, Header, Opts} =
+ case proplists:get_value(type, Config) of
+ ip_comm ->
+ {"http://" ++ Host ++ ":" ++ integer_to_list(Port) ++ "/cgi-bin/erl/httpd_example:ignore_invalid_header",
+ [{"Host", "localhost"},{"Te", ""}, {"Content-Length ", "0"}], []};
+ ssl ->
+ Conf = proplists:get_value(client_config, proplists:get_value(ssl_conf, Config)),
+ {"https://" ++ Host ++ ":" ++ integer_to_list(Port) ++ "/cgi-bin/erl/httpd_example:ignore_invalid_header",
+ [{"Host", "localhost"},{"Te", ""}, {"Content-Length ", "0"}], [{ssl, Conf}]}
+ end,
+ {ok,{{_,204,_}, _, _}}
+ = httpc:request(get, {Url, Header}, [{timeout, 45000} | Opts], [{headers_as_is, true}]).
+
+%%-------------------------------------------------------------------------
security_1_1(Config) when is_list(Config) ->
security([{http_version, "HTTP/1.1"} | Config]).
diff --git a/lib/kernel/doc/src/Makefile b/lib/kernel/doc/src/Makefile
index 70623ab9aa..fe3dc9dab5 100644
--- a/lib/kernel/doc/src/Makefile
+++ b/lib/kernel/doc/src/Makefile
@@ -37,17 +37,6 @@ RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN)
# ----------------------------------------------------
XML_APPLICATION_FILES = ref_man.xml
-# The doc build has problems with if-defing out modules...
-ifeq ($(USE_ESOCK),yes)
-XML_REF3_ESOCK_FILES = net.xml
-ESOCK_USE_NET_XML=<xi:include href="net.xml"\/>
-ESOCK_USE_NET_SPECS_XML=<xi:include href="../specs/specs_net.xml"/>
-else
-XML_REF3_ESOCK_FILES =
-ESOCK_USE_NET_SPECS_XML =
-ESOCK_USE_NET_XML =
-endif
-
XML_REF3_FILES = application.xml \
auth.xml \
code.xml \
@@ -74,7 +63,7 @@ XML_REF3_FILES = application.xml \
logger_disk_log_h.xml \
logger_filters.xml \
logger_formatter.xml \
- $(XML_REF3_ESOCK_FILES) \
+ net.xml \
net_adm.xml \
net_kernel.xml \
os.xml \
@@ -93,7 +82,8 @@ XML_PART_FILES = part.xml
XML_CHAPTER_FILES = \
notes.xml \
introduction_chapter.xml \
- logger_chapter.xml
+ logger_chapter.xml \
+ logger_cookbook.xml
BOOK_FILES = book.xml
@@ -152,7 +142,7 @@ SPECS_FLAGS = -I../../include
$(HTMLDIR)/%: %
$(INSTALL_DATA) $< $@
-docs: ref_man specs man pdf html
+docs: man pdf html
$(TOP_PDF_FILE): $(XML_FILES)
@@ -162,9 +152,6 @@ html: images $(HTML_REF_MAN_FILE)
man: $(MAN3_FILES) $(MAN4_FILES) $(MAN6_FILES)
-ref_man: ref_man.xml
-specs: specs.xml
-
images: $(IMAGE_FILES:%=$(HTMLDIR)/%)
info:
@@ -202,13 +189,6 @@ $(SPECDIR)/specs_zlib_stub.xml:
$(gen_verbose)escript $(SPECS_EXTRACTOR) $(SPECS_FLAGS) \
-o$(dir $@) -module zlib_stub
-ref_man.xml: ref_man.xml.src
- ($(PERL) -p -e 's?%ESOCK_USE_NET_XML%?$(ESOCK_USE_NET_XML)?' \
- $<) > $@
-specs.xml: specs.xml.src
- ($(PERL) -p -e 's?%ESOCK_USE_NET_SPECS_XML%?$(ESOCK_USE_NET_SPECS_XML)?' \
- $<) > $@
-
# ----------------------------------------------------
# Release Target
diff --git a/lib/kernel/doc/src/logger.xml b/lib/kernel/doc/src/logger.xml
index 2a060ce1f9..916ca014c0 100644
--- a/lib/kernel/doc/src/logger.xml
+++ b/lib/kernel/doc/src/logger.xml
@@ -155,7 +155,7 @@ logger:error("error happened because: ~p", [Reason]). % Without macro
handler callback itself, in a sub structure associated with
the field named <c>config</c>. See
the <seealso marker="logger_std_h"><c>logger_std_h(3)</c></seealso>
- and <seealso marker="logger_disk_log_h"><c>logger_disk_log_h</c></seealso>
+ and <seealso marker="logger_disk_log_h"><c>logger_disk_log_h(3)</c></seealso>
manual pages for information about the specifc configuration
for these handlers.</p>
<p>See the <seealso marker="logger_formatter#type-config">
@@ -501,7 +501,7 @@ logger:error("error happened because: ~p", [Reason]). % Without macro
section <seealso marker="logger_chapter#filters">Filters</seealso>
in the User's Guide for more information about filters.</p>
<p>Some built-in filters exist. These are defined in
- <seealso marker="logger_filters"><c>logger_filters</c></seealso>.</p>
+ <seealso marker="logger_filters"><c>logger_filters(3)</c></seealso>.</p>
</desc>
</func>
@@ -595,7 +595,7 @@ start(_, []) ->
Filters</seealso> in the User's Guide for more information
about filters.</p>
<p>Some built-in filters exist. These are defined
- in <seealso marker="logger_filters"><c>logger_filters</c></seealso>.</p>
+ in <seealso marker="logger_filters"><c>logger_filters(3)</c></seealso>.</p>
</desc>
</func>
@@ -1104,7 +1104,7 @@ logger:set_proxy_config(maps:merge(Old, Config)).
<p>Convert a log message on report form to <c>{Format,
Args}</c>. This is the default report callback used
by <seealso marker="logger_formatter">
- <c>logger_formatter</c></seealso> when no custom report
+ <c>logger_formatter(3)</c></seealso> when no custom report
callback is found. See
section <seealso marker="logger_chapter#log_message">Log
Message</seealso> in the Kernel User's Guide for
diff --git a/lib/kernel/doc/src/logger_cookbook.xml b/lib/kernel/doc/src/logger_cookbook.xml
new file mode 100644
index 0000000000..30209f0a90
--- /dev/null
+++ b/lib/kernel/doc/src/logger_cookbook.xml
@@ -0,0 +1,424 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>2017</year><year>2018</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ </legalnotice>
+
+ <title>Logging Cookbook</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ <file>logger_cookbook.xml</file>
+ </header>
+
+ <p>Using and especially configuring Logger can be difficult at times
+ as there are many different options that can be changed and often more
+ than one way to achieve the same result. This User's Guide tries to help
+ by giving many different examples of how you can use logger.</p>
+
+ <p>For more examples of practical use-cases of using Logger, Fred Hebert's blog post
+ <url href="https://ferd.ca/erlang-otp-21-s-new-logger.html">Erlang/OTP 21's new logger</url>
+ is a great starting point.</p>
+
+ <note><p>If you find that some common Logger usage is missing from this guide, please
+ open a pull request on github with the suggested addition</p></note>
+
+ <section>
+ <title>Get Logger information</title>
+ <section>
+ <title>Print the primary Logger configurations.</title>
+ <code type="erl-repl">1> logger:i(primary).
+Primary configuration:
+ Level: notice
+ Filter Default: log
+ Filters:
+ (none)</code>
+ <p>It is also possible to fetch the configuration using
+ <seealso marker="logger#get_primary_config-0"><c>logger:get_primary_config()</c></seealso>.
+ </p>
+ <section>
+ <title>See also</title>
+ <list>
+ <item><seealso marker="logger#i-0">logger:i()</seealso></item>
+ <item><seealso marker="logger_chapter#configuration">Configuration</seealso> in the Logging User&apos;s Guide</item>
+ </list>
+ </section>
+ </section>
+ <section>
+ <title>Print the configuration of all handlers.</title>
+ <code type="erl-repl">2> logger:i(handlers).
+Handler configuration:
+ Id: default
+ Module: logger_std_h
+ Level: all
+ Formatter:
+ Module: logger_formatter
+ Config:
+ legacy_header: true
+ single_line: false
+ Filter Default: stop
+ Filters:
+ Id: remote_gl
+ Fun: fun logger_filters:remote_gl/2
+ Arg: stop
+ Id: domain
+ Fun: fun logger_filters:domain/2
+ Arg: {log,super,[otp,sasl]}
+ Id: no_domain
+ Fun: fun logger_filters:domain/2
+ Arg: {log,undefined,[]}
+ Handler Config:
+ burst_limit_enable: true
+ burst_limit_max_count: 500
+ burst_limit_window_time: 1000
+ drop_mode_qlen: 200
+ filesync_repeat_interval: no_repeat
+ flush_qlen: 1000
+ overload_kill_enable: false
+ overload_kill_mem_size: 3000000
+ overload_kill_qlen: 20000
+ overload_kill_restart_after: 5000
+ sync_mode_qlen: 10
+ type: standard_io
+ </code>
+ <p>You can also print the configuration of a specific handler using
+ <seealso marker="logger#i-1"><c>logger:i(HanderName)</c></seealso>,
+ or fetch the configuration using
+ <seealso marker="logger#get_handler_config-0"><c>logger:get_handler_config()</c></seealso>,
+ or <seealso marker="logger#get_handler_config-1"><c>logger:get_handler_config(HandlerName)</c></seealso>
+ for a specific handler.</p>
+ <section>
+ <title>See also</title>
+ <list>
+ <item><seealso marker="logger#i-0"><c>logger:i()</c></seealso></item>
+ <item><seealso marker="logger_chapter#configuration">Configuration</seealso> in the Logging User&apos;s Guide</item>
+ </list>
+ </section>
+ </section>
+ </section>
+
+ <section>
+ <title>Configure the Logger</title>
+
+ <section>
+ <title>Where did my progress reports go?</title>
+ <p>In OTP-21 the default primary log level is <c>notice</c>. The means
+ that many log messages are by default not printed. This includes
+ the progress reports of supervisors. In order to get progress reports
+ you need to raise the primary log level to <c>info</c></p>
+ <code type="erl-repl">$ erl -kernel logger_level info
+=PROGRESS REPORT==== 4-Nov-2019::16:33:11.742069 ===
+ application: kernel
+ started_at: nonode@nohost
+=PROGRESS REPORT==== 4-Nov-2019::16:33:11.746546 ===
+ application: stdlib
+ started_at: nonode@nohost
+Eshell V10.5.3 (abort with ^G)
+1></code>
+
+ </section>
+ </section>
+
+ <section>
+ <title>Configure Logger formatter</title>
+ <p>In order to fit better into your existing logging infrastructure Logger can
+ format its logging messages any way to want to. Either you can use the built-in
+ formatter, or you can build your own.</p>
+ <section>
+ <title>Single line configuration</title>
+ <p>Since single line logging is the default of the built-in formatter you only have to
+ provide the empty map as the coniguration. The example below uses the <c>sys.config</c>
+ to change the formatter configuration.</p>
+ <code type="erl-repl">$ cat sys.config
+[{kernel,
+ [{logger,
+ [{handler, default, logger_std_h,
+ #{ formatter => {logger_formatter, #{ }}}}]}]}].
+$ erl -config sys
+Eshell V10.5.1 (abort with ^G)
+1> logger:error("Oh noes, an error").
+1962-10-03T11:07:47.466763-04:00 error: Oh noes, an error
+ </code>
+ <p>However, if you just want to change it for the current session you can
+ also do that.</p>
+ <code type="erl-repl">1> logger:set_handler_config(default, formatter, {logger_formatter, #{}}).
+ok
+2> logger:error("Oh noes, another error").
+1962-10-04T15:34:02.648713-04:00 error: Oh noes, another error</code>
+ <section>
+ <title>See also</title>
+ <list>
+ <item><seealso marker="logger_formatter#type-config">logger_formatter&apos;s Configuration</seealso></item>
+ <item><seealso marker="logger_chapter#formatters">Formatters</seealso> in the Logging User&apos;s Guide</item>
+ <item><seealso marker="logger#set_handler_config-3"><c>logger:set_handler_config/3</c></seealso></item>
+ </list>
+ </section>
+ </section>
+ <section>
+ <title>Add file and lineno to log entries</title>
+ <p>You can change what is printed to the log by using the formatter template:</p>
+ <code type="erl-repl">$ cat sys.config
+[{kernel,
+ [{logger,
+ [{handler, default, logger_std_h,
+ #{ formatter => {logger_formatter,
+ #{ template => [time," ", file,":",line," ",level,": ",msg,"\n"] }}}}]}]}].
+$ erl -config sys
+Eshell V10.5.1 (abort with ^G)
+1> logger:error("Oh noes, more errors",#{ file => "shell.erl", line => 1 }).
+1962-10-05T07:37:44.104241+02:00 shell.erl:1 error: Oh noes, more errors</code>
+ <p>Note that file and line have to be added in the metadata by the caller of
+ <seealso marker="logger#log-3"><c>logger:log/3</c></seealso> as otherwise
+ Logger will not know from where it was called. The file and line number
+ are automatically added if you use the <c>?LOG_ERROR</c> macros in
+ <c>kernel/include/logger.hrl</c>.</p>
+ <section>
+ <title>See also</title>
+ <list>
+ <item><seealso marker="logger_formatter#type-config">logger_formatter&apos;s Configuration</seealso></item>
+ <item><seealso marker="logger_formatter#type-template">logger_formatter&apos;s Template</seealso></item>
+ <item><seealso marker="logger#macros">Logger Macros</seealso></item>
+ <item><seealso marker="logger_chapter#metadata">Metadata</seealso> in the Logging User&apos;s Guide</item>
+ </list>
+ </section>
+ </section>
+ </section>
+
+ <section>
+ <title>Configuring handlers</title>
+ <section>
+ <title>Print logs to a file</title>
+ <p>Instead of printing the logs to stdout we print them to a rotating file log.</p>
+ <code type="erl-repl">$ cat sys.config
+[{kernel,
+ [{logger,
+ [{handler, default, logger_std_h,
+ #{ config => #{ file => "log/erlang.log",
+ max_no_bytes => 4096,
+ max_no_files => 5},
+ formatter => {logger_formatter, #{}}}}]}]}].
+$ erl -config sys
+Eshell V10.5.1 (abort with ^G)
+1> logger:error("Oh noes, even more errors").
+ok
+2> erlang:halt().
+$ cat log/erlang.log
+2019-10-07T11:47:16.837958+02:00 error: Oh noes, even more errors</code>
+ <section>
+ <title>See also</title>
+ <list>
+ <item><seealso marker="logger_std_h#description">logger_std_h&apos;s Description</seealso></item>
+ <item><seealso marker="logger_chapter#handlers">Handlers</seealso> in the Logging User&apos;s Guide</item>
+ </list>
+ </section>
+ </section>
+ <section>
+ <title>Debug only handler</title>
+ <p>Add a handler that prints <c>debug</c> log events to a file,
+ while the default handler prints only up to <c>notice</c> level
+ events to standard out.</p>
+ <code type="erl-repl">$ cat sys.config
+[{kernel,
+ [{logger_level, all},
+ {logger,
+ [{handler, default, logger_std_h,
+ #{ level => notice }},
+ {handler, debug, logger_std_h,
+ #{ filters => [{debug,{fun logger_filters:level/2, {stop, neq, debug}}}],
+ config => #{ file => "log/debug.log" } }}
+ ]}]}].
+$ erl -config sys
+Eshell V10.5.1 (abort with ^G)
+1> logger:error("Oh noes, even more errors").
+=ERROR REPORT==== 9-Oct-2019::14:40:54.784162 ===
+Oh noes, even more errors
+ok
+2> logger:debug("A debug event").
+ok
+3> erlang:halt().
+$ cat log/debug.log
+2019-10-09T14:41:03.680541+02:00 debug: A debug event</code>
+ <p>In the configuration above we first raise the primary log level to max in
+ order for the debug log events to get to the handlers. Then we configure
+ the default handler to only log notice and below events, the default log level
+ for a handler is <c>all</c>. Then the debug handler is configured with a filter
+ to stop any log message that is not a debug level message.</p>
+ <p>It is also possible to do the same changes in an already running system
+ using the <c>logger</c> module. Then you do like this:</p>
+ <code type="erl-repl">$ erl
+1> logger:set_handler_config(default, level, notice).
+ok
+2> logger:add_handler(debug, logger_std_h, #{
+ filters => [{debug,{fun logger_filters:level/2, {stop, neq, debug}}}],
+ config => #{ file => "log/debug.log" } }).
+ok
+3> logger:set_primary_config(level, all).
+ok
+ </code>
+ <p>It is important that you do not raise the primare log level before adjusting
+ the default handler&apos;s level as otherwise your standard out may be flooded by debug
+ log messages.</p>
+ <section>
+ <title>See also</title>
+ <list>
+ <item><seealso marker="logger_std_h#description">logger_std_h&apos;s Description</seealso></item>
+ <item><seealso marker="logger_chapter#filters">Filters</seealso> in the Logging User&apos;s Guide</item>
+ </list>
+ </section>
+ </section>
+ </section>
+
+ <!-- <section>
+ <title>Where did my event go?</title>
+ <section>
+ <title>Debugging filters and levels</title>
+ <p>TODO: Should add a section about how to debug filters
+ and levels once we've figured out how to do that.</p>
+ </section>
+ </section> -->
+
+ <section>
+ <title>Logging</title>
+ <section>
+ <title>What to log and how</title>
+ <p>The simplest way to do log something is by using the Logger macros and
+ give a report to the macro. For example if you want to log an error:</p>
+ <code type="erl">?LOG_ERROR(#{ what => http_error, status => 418, src => ClientIP, dst => ServerIP }).</code>
+ <p>This will print the following in the default log:</p>
+ <code>=ERROR REPORT==== 10-Oct-2019::12:13:10.089073 ===
+ dst: {8,8,4,4}
+ src: {8,8,8,8}
+ status: 418
+ what: http_error</code>
+ <p>or the below if you use a single line formatter</p>
+ <code>2019-10-10T12:14:11.921843+02:00 error: dst: {8,8,4,4}, src: {8,8,8,8}, status: 418, what: http_error</code>
+ <section>
+ <title>See also</title>
+ <list>
+ <item><seealso marker="logger_chapter#log_message">Log Message</seealso> in the Logging User&apos;s Guide</item>
+ </list>
+ </section>
+ </section>
+ <section>
+ <title>Report call-backs and printing of events</title>
+ <p>If you want to do structured logging, but still want to have some control
+ of how the final log message is structured you can give a <c>report_cb</c>
+ as part of the metadata with your log event.</p>
+ <code type="erl">ReportCB = fun(#{ what := What, status := Status, src := Src, dst := Dst }) ->
+ {ok, #hostent{ h_name = SrcName }} = inet:gethostbyaddr(Src),
+ {ok, #hostent{ h_name = DstName }} = inet:gethostbyaddr(Dst),
+ {"What: ~p~nStatus: ~p~nSrc: ~s (~s)~nDst: ~s (~s)~n",
+ [What, Status, inet:ntoa(Src), SrcName, inet:ntoa(Dst), DstName]}
+ end,
+?LOG_ERROR(#{ what => http_error, status => 418, src => ClientIP, dst => ServerIP },
+ #{ report_cb => ReportCB }).
+ </code>
+ <p>This will print the following:</p>
+ <code>=ERROR REPORT==== 10-Oct-2019::13:29:02.230863 ===
+What: http_error
+Status: 418
+Src: 8.8.8.8 (dns.google)
+Dst: 192.121.151.106 (erlang.org)
+ </code>
+ <p>Note that the order that things are printed have changed, and also I added
+ a reverse-dns lookup of the IP address. This will not print as nicely when using
+ a single line formatter, however you can also use a report_cb fun with 2 arguments
+ where the second argument is the formatting options.</p>
+ <section>
+ <title>See also</title>
+ <list>
+ <item><seealso marker="logger_chapter#log_message">Log Message</seealso> in the Logging User&apos;s Guide</item>
+ <item><seealso marker="logger#type-report_cb">Logger Report Callbacks</seealso></item>
+ </list>
+ </section>
+ </section>
+ </section>
+
+ <section>
+ <title>Filters</title>
+ <p>Filters are used to remove or change log events before they reach the handlers.</p>
+ <section>
+ <title>Process filters</title>
+ <p>If we only want debug messages from a specific process it is possible to do
+ this with a filter like this:</p>
+ <code type="erl">%% Initial setup to use a filter for the level filter instead of the primary level
+PrimaryLevel = maps:get(level, logger:get_primary_config()),
+ok = logger:add_primary_filter(primary_level,
+ {fun logger_filters:level/2, {log, gteq, PrimaryLevel}}),
+logger:set_primary_config(filter_default, stop),
+logger:set_primary_config(level, all),
+
+%% Test that things work as they should
+logger:notice("Notice should be logged"),
+logger:debug("Should not be logged"),
+
+%% Add the filter to allow PidToLog to send debug events
+PidToLog = self(),
+PidFilter = fun(LogEvent, _) when PidToLog =:= self() -> LogEvent;
+ (_LogEvent, _) -> ignore end,
+ok = logger:add_primary_filter(pid, {PidFilter,[]}),
+logger:debug("Debug should be logged").
+ </code>
+ <p>There is a bit of setup needed to allow filters to decide whether a specific process
+ should be allowed to log. This is because the default primary log level is notice and
+ it is enforced before the primary filters. So in order for the pid filter to be useful
+ have to raise the primary log level to <c>all</c> and then add a level filter that
+ only lets certain messages at or greater than notice through. When the setup is done,
+ it is simple to add a filter that allows a certain pid through.
+ </p>
+ <p>Note that doing the primary log level filtering through a filter and not through
+ the level is quite a lot more expensive, so make sure to test that your system can
+ handle the extra load before you enable it on a production node.</p>
+ <section>
+ <title>See also</title>
+ <list>
+ <item><seealso marker="logger_chapter#filters">Filters</seealso> in the Logging User&apos;s Guide</item>
+ <item><seealso marker="logger_filters#level-2"><c>logger_filters:level/2</c></seealso></item>
+ <item><seealso marker="logger#set_primary_config-2"><c>logger:set_primary_config/2</c></seealso></item>
+ </list>
+ </section>
+ </section>
+ <section>
+ <title>Domains</title>
+ <p>Domains are used to specify which subsystem a certain log event originates from.
+ The default handler will by default only log events with the domain <c>[otp]</c> or
+ without a domain. If you would like to include SSL log events into the
+ default handler log you could do this:</p>
+ <code type="erl-repl">1> logger:add_handler_filter(default,ssl_domain,
+ {fun logger_filters:domain/2,{log,sub,[otp,ssl]}}).
+2> application:ensure_all_started(ssl).
+{ok,[crypto,asn1,public_key,ssl]}
+3> ssl:connect("www.erlang.org",443,[{log_level,debug}]).
+%% lots of text
+ </code>
+ <section>
+ <title>See also</title>
+ <list>
+ <item><seealso marker="logger_chapter#filters">Filters</seealso> in the Logging User&apos;s Guide</item>
+ <item><seealso marker="logger_filters#domain-2"><c>logger_filters:domain/2</c></seealso></item>
+ <item><seealso marker="logger#set_primary_config-2"><c>logger:set_primary_config/2</c></seealso></item>
+ </list>
+ </section>
+ </section>
+ </section>
+
+</chapter>
diff --git a/lib/kernel/doc/src/net.xml b/lib/kernel/doc/src/net.xml
index 6fbc37076c..c8844f5257 100644
--- a/lib/kernel/doc/src/net.xml
+++ b/lib/kernel/doc/src/net.xml
@@ -36,6 +36,10 @@
<note>
<p>There is currently <em>no</em> support for Windows. </p>
</note>
+ <note>
+ <p>The content of this file is <em>only</em> valid if the system has
+ been built with 'socket' (esock) support, which is the default. </p>
+ </note>
</description>
<datatypes>
@@ -43,6 +47,34 @@
<name name="address_info"/>
</datatype>
<datatype>
+ <name name="ifaddrs"/>
+ <desc>
+ <p>This type defines all addresses (and flags) associated with
+ the interface. </p>
+ <p>Not all fields of this map has to be present.
+ The flags field can be used to test this for some of the fields.
+ For example <c>broadaddr</c> will only be present if the
+ <c>broadcast</c> flag is present in flags. </p>
+ </desc>
+ </datatype>
+ <datatype>
+ <name name="ifaddrs_flag"/>
+ </datatype>
+ <datatype>
+ <name name="ifaddrs_filter_map"/>
+ <desc>
+ <p>The '<c>default</c>' value for <c>family</c> is interpreted
+ as <c>inet</c> <em>and</em> <c>inet6</c>. </p>
+ <p>Also, the <c>family</c> field can only have the specified values
+ (and not the all the values of socket:domain()). </p>
+ <p>The use of the <c>flags</c> field is that any flag provided must
+ exist for the interface. </p>
+ <p>For example, if <c>family</c> is set to <c>inet</c> and <c>flags</c>
+ to <c>[broadcast, multicast]</c> only interfaces address family <c>inet</c>
+ and the flags <c>broadcast</c> and <c>multicast</c> will be listen. </p>
+ </desc>
+ </datatype>
+ <datatype>
<name name="name_info"/>
</datatype>
<datatype>
@@ -100,6 +132,23 @@
</func>
<func>
+ <name name="getifaddrs" arity="0" since="@OTP-16212@"/>
+ <name name="getifaddrs" arity="1" clause_i="1" since="@OTP-16212@"/>
+ <name name="getifaddrs" arity="1" clause_i="2" since="@OTP-16212@"/>
+ <name name="getifaddrs" arity="2" since="@OTP-16212@"/>
+ <fsummary>Get interface addresses.</fsummary>
+ <desc>
+ <p>Get interface addresses.</p>
+ <p>This function is used to get the machines interface addresses,
+ possibly filtered with the <c>FilterMap</c>. </p>
+ <p>By default, a filter with the content:
+ <c>#{family => default, flags => any}</c> is used.
+ This will return all interfaces with adresses in the
+ <c>inet</c> and <c>inet6</c> families. </p>
+ </desc>
+ </func>
+
+ <func>
<name name="if_name2index" arity="1" since="OTP 22.0"/>
<fsummary>Mappings between network interface names and indexes.</fsummary>
<desc>
diff --git a/lib/kernel/doc/src/part.xml b/lib/kernel/doc/src/part.xml
index fa7e92835f..a5e29ce6eb 100644
--- a/lib/kernel/doc/src/part.xml
+++ b/lib/kernel/doc/src/part.xml
@@ -33,5 +33,5 @@
</description>
<xi:include href="introduction_chapter.xml"/>
<xi:include href="logger_chapter.xml"/>
+ <xi:include href="logger_cookbook.xml"/>
</part>
-
diff --git a/lib/kernel/doc/src/ref_man.xml.src b/lib/kernel/doc/src/ref_man.xml
index 72e3409123..9df51dee22 100644
--- a/lib/kernel/doc/src/ref_man.xml.src
+++ b/lib/kernel/doc/src/ref_man.xml
@@ -60,7 +60,7 @@
<xi:include href="logger_formatter.xml"/>
<xi:include href="logger_std_h.xml"/>
<xi:include href="logger_disk_log_h.xml"/>
- %ESOCK_USE_NET_XML%
+ <xi:include href="net.xml"/>
<xi:include href="net_adm.xml"/>
<xi:include href="net_kernel.xml"/>
<xi:include href="os.xml"/>
diff --git a/lib/kernel/doc/src/rpc.xml b/lib/kernel/doc/src/rpc.xml
index c55454506e..0e07d334d8 100644
--- a/lib/kernel/doc/src/rpc.xml
+++ b/lib/kernel/doc/src/rpc.xml
@@ -111,6 +111,8 @@
for efficiency reasons when very small fast functions are
evaluated, for example, BIFs that are guaranteed not to
suspend.</p>
+ <p>See the note in <seealso marker="#call/4"><c>call/4</c></seealso>
+ for more details of the return value.</p>
</desc>
</func>
@@ -123,6 +125,8 @@
<seealso marker="#block_call/4"><c>block_call/4</c></seealso>,
but with a time-out value in the same manner as
<seealso marker="#call/5"><c>call/5</c></seealso>.</p>
+ <p>See the note in <seealso marker="#call/4"><c>call/4</c></seealso>
+ for more details of the return value.</p>
</desc>
</func>
@@ -133,7 +137,28 @@
<p>Evaluates <c>apply(<anno>Module</anno>, <anno>Function</anno>,
<anno>Args</anno>)</c> on node <c><anno>Node</anno></c> and returns
the corresponding value <c><anno>Res</anno></c>, or
- <c>{badrpc, <anno>Reason</anno>}</c> if the call fails.</p>
+ <c>{badrpc, <anno>Reason</anno>}</c> if the call fails.</p>
+ <note>
+ <p>Here follows the details of what exactly is returned.</p>
+ <p><c>{badrpc, <anno>Reason</anno>}</c> will be returned in the
+ following circumstances:</p>
+ <list type="bulleted">
+ <item>The called function fails with an <c>exit</c> exception.</item>
+ <item>The called function fails with an <c>error</c> exception.</item>
+ <item>The called function returns a term that matches
+ <c>{'EXIT', _}</c>.</item>
+ <item>The called function <c>throws</c>
+ a term that matches <c>{'EXIT', _}</c>.</item>
+ </list>
+
+ <p><c><anno>Res</anno></c> is returned in the following circumstances:</p>
+ <list type="bulleted">
+ <item>The called function returns normally with a term that does
+ <strong>not</strong> match <c>{'EXIT',_}</c>.</item>
+ <item>The called function <c>throw</c>s a term that does
+ <strong>not</strong> match <c>{'EXIT',_}</c>.</item>
+ </list>
+ </note>
</desc>
</func>
@@ -147,7 +172,9 @@
<c>{badrpc, <anno>Reason</anno>}</c> if the call fails.
<c><anno>Timeout</anno></c> is
a time-out value in milliseconds. If the call times out,
- <c><anno>Reason</anno></c> is <c>timeout</c>.</p>
+ <c><anno>Reason</anno></c> is <c>timeout</c>.
+ See the note in <seealso marker="#call/4"><c>call/4</c></seealso>
+ for more details of the return value.</p>
<p>If the reply arrives after the call times out, no message
contaminates the caller's message queue, as this
function spawns off a middleman process to act as (a void)
@@ -306,6 +333,8 @@
the tuple <c>{value, <anno>Val</anno>}</c> when the computation is
finished, or <c>timeout</c> when <c><anno>Timeout</anno></c>
milliseconds has elapsed.</p>
+ <p>See the note in <seealso marker="#call/4"><c>call/4</c></seealso>
+ for more details of <anno>Val</anno>.</p>
<note>
<p>This function must be called by the same process from which
<seealso marker="#async_call/4"><c>async_call/4</c></seealso>
@@ -424,6 +453,8 @@
<seealso marker="#async_call/4"><c>async_call/4</c></seealso>
was made otherwise it will never return.</p>
</note>
+ <p>See the note in <seealso marker="#call/4"><c>call/4</c></seealso>
+ for more details of the return value.</p>
</desc>
</func>
</funcs>
diff --git a/lib/kernel/doc/src/seq_trace.xml b/lib/kernel/doc/src/seq_trace.xml
index aa29223dd0..9aef748594 100644
--- a/lib/kernel/doc/src/seq_trace.xml
+++ b/lib/kernel/doc/src/seq_trace.xml
@@ -257,7 +257,7 @@ TimeStamp = {Seconds, Milliseconds, Microseconds}
<tag><c>{send, Serial, From, To, Message}</c></tag>
<item>
<p>Used when a process <c>From</c> with its trace token flag
- <c>print</c> set to <c>true</c> has sent a message.</p>
+ <c>send</c> set to <c>true</c> has sent a message.</p>
</item>
<tag><c>{'receive', Serial, From, To, Message}</c></tag>
<item>
diff --git a/lib/kernel/doc/src/specs.xml.src b/lib/kernel/doc/src/specs.xml
index ccb26b9458..9e258910db 100644
--- a/lib/kernel/doc/src/specs.xml.src
+++ b/lib/kernel/doc/src/specs.xml
@@ -26,7 +26,7 @@
<xi:include href="../specs/specs_logger_formatter.xml"/>
<xi:include href="../specs/specs_logger_std_h.xml"/>
<xi:include href="../specs/specs_logger_disk_log_h.xml"/>
- %ESOCK_USE_NET_SPECS_XML%
+ <xi:include href="../specs/specs_net.xml"/>
<xi:include href="../specs/specs_net_adm.xml"/>
<xi:include href="../specs/specs_net_kernel.xml"/>
<xi:include href="../specs/specs_os.xml"/>
diff --git a/lib/kernel/src/erl_epmd.erl b/lib/kernel/src/erl_epmd.erl
index 7a14e2635c..ac4fe2b78b 100644
--- a/lib/kernel/src/erl_epmd.erl
+++ b/lib/kernel/src/erl_epmd.erl
@@ -111,8 +111,9 @@ port_please1(Node,HostName, Timeout) ->
case inet:gethostbyname(HostName, Family, Timeout) of
{ok,{hostent, _Name, _ , _Af, _Size, [EpmdAddr | _]}} ->
get_port(Node, EpmdAddr, Timeout);
- Else ->
- Else
+ _Else ->
+ ?port_please_failure2(_Else),
+ noport
end.
-spec names() -> {ok, [{Name, Port}]} | {error, Reason} when
@@ -169,10 +170,14 @@ register_node(Name, PortNo, Family) ->
AddressFamily :: inet | inet6,
Port :: non_neg_integer(),
Version :: non_neg_integer(),
- Success :: {ok, inet:ip_address()} | {ok, inet:ip_address(), Port, Version}.
+ Success :: {ok, inet:ip_address()} |
+ %% This is not returned here, but is in the spec for
+ %% the documentation to show that it is possible to
+ %% return when using a custom erl_epmd
+ {ok, inet:ip_address(), Port, Version}.
address_please(_Name, Host, AddressFamily) ->
- inet:getaddr(Host, AddressFamily).
+ inet:getaddr(Host, AddressFamily).
%%%----------------------------------------------------------------------
%%% Callback functions from gen_server
diff --git a/lib/kernel/src/inet.erl b/lib/kernel/src/inet.erl
index 24aff83fbd..d91a27c769 100644
--- a/lib/kernel/src/inet.erl
+++ b/lib/kernel/src/inet.erl
@@ -1621,21 +1621,47 @@ info(S, F, Proto) ->
end.
%% Possible flags: (sorted)
%% [accepting,bound,busy,connected,connecting,listen,listening,open]
-%%
+%% Actually, we no longer gets listening...
fmt_status(Flags) ->
case lists:sort(Flags) of
[accepting | _] -> "ACCEPTING";
- [bound,busy,connected|_] -> "CONNECTED*";
- [bound,connected|_] -> "CONNECTED";
+ [bound,busy,connected|_] -> "CONNECTED(BB)";
+ [bound,connected|_] -> "CONNECTED(B)";
[bound,listen,listening | _] -> "LISTENING";
[bound,listen | _] -> "LISTEN";
[bound,connecting | _] -> "CONNECTING";
[bound,open] -> "BOUND";
+ [connected,open] -> "CONNECTED(O)";
[open] -> "IDLE";
[] -> "CLOSED";
- _ -> "????"
+ Sorted -> fmt_status2(Sorted)
end.
+fmt_status2([H]) ->
+ fmt_status3(H);
+fmt_status2([H|T]) ->
+ fmt_status3(H) ++ ":" ++ fmt_status2(T).
+
+fmt_status3(accepting) ->
+ "A";
+fmt_status3(bound) ->
+ "BD";
+fmt_status3(busy) ->
+ "BY";
+fmt_status3(connected) ->
+ "CD";
+fmt_status3(connecting) ->
+ "CG";
+fmt_status3(listen) ->
+ "LN";
+fmt_status3(listening) ->
+ "LG";
+fmt_status3(open) ->
+ "O";
+fmt_status3(X) when is_atom(X) ->
+ string:uppercase(atom_to_list(X)).
+
+
fmt_addr({error,enotconn}, _) -> "*:*";
fmt_addr({error,_}, _) -> " ";
fmt_addr({ok,Addr}, Proto) ->
diff --git a/lib/kernel/src/logger_std_h.erl b/lib/kernel/src/logger_std_h.erl
index 8477a0fc93..6641d99776 100644
--- a/lib/kernel/src/logger_std_h.erl
+++ b/lib/kernel/src/logger_std_h.erl
@@ -300,10 +300,7 @@ terminate(_Name, _Reason, #{file_ctrl_pid:=FWPid}) ->
open_log_file(HandlerName,#{type:=file,
file:=FileName,
modes:=Modes,
- file_check:=FileCheck,
- max_no_bytes:=Size,
- max_no_files:=Count,
- compress_on_rotate:=Compress}) ->
+ file_check:=FileCheck}) ->
try
case filelib:ensure_dir(FileName) of
ok ->
@@ -312,18 +309,16 @@ open_log_file(HandlerName,#{type:=file,
{ok,#file_info{inode=INode}} =
file:read_file_info(FileName,[raw]),
UpdateModes = [append | Modes--[write,append,exclusive]],
- State0 = #{handler_name=>HandlerName,
- file_name=>FileName,
- modes=>UpdateModes,
- file_check=>FileCheck,
- fd=>Fd,
- inode=>INode,
- last_check=>timestamp(),
- synced=>false,
- write_res=>ok,
- sync_res=>ok},
- State = update_rotation({Size,Count,Compress},State0),
- {ok,State};
+ {ok,#{handler_name=>HandlerName,
+ file_name=>FileName,
+ modes=>UpdateModes,
+ file_check=>FileCheck,
+ fd=>Fd,
+ inode=>INode,
+ last_check=>timestamp(),
+ synced=>false,
+ write_res=>ok,
+ sync_res=>ok}};
Error ->
Error
end;
@@ -388,18 +383,30 @@ file_ctrl_call(Pid, Msg) ->
{error,Reason}
after
?DEFAULT_CALL_TIMEOUT ->
+ %% If this timeout triggers we will get a stray
+ %% reply message in our mailbox eventually.
+ %% That does not really matter though as it will
+ %% end up in this module's handle_info and be ignored
+ demonitor(MRef, [flush]),
{error,{no_response,Pid}}
- end.
+ end.
file_ctrl_init(HandlerName,
#{type:=file,
+ max_no_bytes:=Size,
+ max_no_files:=Count,
+ compress_on_rotate:=Compress,
file:=FileName} = HConfig,
Starter) ->
process_flag(message_queue_data, off_heap),
case open_log_file(HandlerName,HConfig) of
{ok,State} ->
Starter ! {self(),ok},
- file_ctrl_loop(State);
+ %% Do the initial rotate (if any) after we ack the starting
+ %% process as otherwise startup of the system will be
+ %% delayed/crash
+ RotState = update_rotation({Size,Count,Compress},State),
+ file_ctrl_loop(RotState);
{error,Reason} ->
Starter ! {self(),{error,{open_failed,FileName,Reason}}}
end;
diff --git a/lib/kernel/src/net.erl b/lib/kernel/src/net.erl
index b8ffa64043..a81666885b 100644
--- a/lib/kernel/src/net.erl
+++ b/lib/kernel/src/net.erl
@@ -37,6 +37,7 @@
gethostname/0,
getnameinfo/1, getnameinfo/2,
getaddrinfo/1, getaddrinfo/2,
+ getifaddrs/0, getifaddrs/1, getifaddrs/2,
if_name2index/1,
if_index2name/1,
@@ -54,8 +55,11 @@
%% Should we define these here or refer to the prim_net module
-export_type([
address_info/0,
+ ifaddrs/0,
name_info/0,
+ ifaddrs_flag/0,
+
name_info_flags/0,
name_info_flag/0,
name_info_flag_ext/0,
@@ -73,21 +77,47 @@
-deprecated({sleep, 1, eventually}).
+-type ifaddrs_flag() :: up | broadcast | debug | loopback | pointopoint |
+ notrailers | running | noarp | promisc | master | slave |
+ multicast | portsel | automedia | dynamic.
+
+%% Note that not all of these fields are mandatory.
+%% Actually there are (error) cases when only the name will be included.
+%% And broadaddr and dstaddr are mutually exclusive!
+
+-type ifaddrs() :: #{name := string(),
+ flags := [ifaddrs_flag()],
+ addr := socket:sockaddr(),
+ netmask := socket:sockaddr(),
+ broadaddr := socket:sockaddr(),
+ dstaddr := socket:sockaddr()}.
+
+-type ifaddrs_filter_map() :: #{family := default | inet | inet6 | packet | all,
+ flags := any | [ifaddrs_flag()]}.
+
-type name_info_flags() :: [name_info_flag()|name_info_flag_ext()].
-type name_info_flag() :: namereqd |
dgram |
nofqdn |
numerichost |
- nomericserv.
--type name_info_flag_ext() :: idn |
- idna_allow_unassigned |
- idna_use_std3_ascii_rules.
+ numericserv.
+%% The following (ext) flags has been removed
+%% (as they are deprecated by later version of gcc):
+%% idn_allow_unassigned | idn_use_std3_ascii_rules.
+-type name_info_flag_ext() :: idn.
-type name_info() :: #{host := string(),
service := string()}.
+-ifdef(USE_ESOCK).
-type address_info() :: #{family := socket:domain(),
socktype := socket:type(),
protocol := socket:protocol(),
address := socket:sockaddr()}.
+-else.
+-type address_info() :: #{family := term(),
+ socktype := term(),
+ protocol := term(),
+ address := term()}.
+-endif.
-type network_interface_name() :: string().
-type network_interface_index() :: non_neg_integer().
@@ -177,11 +207,19 @@ gethostname() ->
getnameinfo(SockAddr) ->
getnameinfo(SockAddr, undefined).
+-ifdef(USE_ESOCK).
-spec getnameinfo(SockAddr, Flags) -> {ok, Info} | {error, Reason} when
SockAddr :: socket:sockaddr(),
Flags :: name_info_flags() | undefined,
Info :: name_info(),
Reason :: term().
+-else.
+-spec getnameinfo(SockAddr, Flags) -> {ok, Info} | {error, Reason} when
+ SockAddr :: term(),
+ Flags :: name_info_flags() | undefined,
+ Info :: name_info(),
+ Reason :: term().
+-endif.
-ifdef(USE_ESOCK).
getnameinfo(SockAddr, [] = _Flags) ->
@@ -256,6 +294,106 @@ getaddrinfo(Host, Service)
%% ===========================================================================
%%
+%% getifaddrs - Get interface addresses
+%%
+
+-spec getifaddrs() -> {ok, IfAddrs} | {error, Reason} when
+ IfAddrs :: [ifaddrs()],
+ Reason :: term().
+
+-ifdef(USE_ESOCK).
+getifaddrs() ->
+ getifaddrs(getifaddrs_filter_map_default()).
+-else.
+getifaddrs() ->
+ erlang:error(notsup).
+-endif.
+
+
+-spec getifaddrs(FilterMap) -> {ok, IfAddrs} | {error, Reason} when
+ FilterMap :: ifaddrs_filter_map(),
+ IfAddrs :: [ifaddrs()],
+ Reason :: term();
+ (Namespace) -> {ok, IfAddrs} | {error, Reason} when
+ Namespace :: file:filename_all(),
+ IfAddrs :: [ifaddrs()],
+ Reason :: term().
+
+-ifdef(USE_ESOCK).
+getifaddrs(Namespace) when is_list(Namespace) ->
+ prim_net:getifaddrs(#{netns => Namespace});
+getifaddrs(FilterMap) when is_map(FilterMap) ->
+ do_getifaddrs(getifaddrs_filter_map(FilterMap),
+ fun() -> prim_net:getifaddrs(#{}) end).
+-else.
+-dialyzer({nowarn_function, getifaddrs/1}).
+getifaddrs(Namespace) when is_list(Namespace) ->
+ erlang:error(notsup);
+getifaddrs(FilterMap) when is_map(FilterMap) ->
+ erlang:error(notsup).
+-endif.
+
+
+-spec getifaddrs(FilterMap, Namespace) -> {ok, IfAddrs} | {error, Reason} when
+ FilterMap :: ifaddrs_filter_map(),
+ Namespace :: file:filename_all(),
+ IfAddrs :: [ifaddrs()],
+ Reason :: term().
+
+getifaddrs(FilterMap, Namespace)
+ when is_map(FilterMap) andalso is_list(Namespace) ->
+ do_getifaddrs(getifaddrs_filter_map(FilterMap),
+ fun() -> getifaddrs(Namespace) end).
+
+do_getifaddrs(FilterMap, GetIfAddrs) ->
+ case GetIfAddrs() of
+ {ok, IfAddrs0} ->
+ Filter = fun(Elem) -> getifaddrs_filter(FilterMap, Elem) end,
+ {ok, lists:filtermap(Filter, IfAddrs0)};
+ {error, _} = ERROR ->
+ ERROR
+ end.
+
+getifaddrs_filter_map(FilterMap) ->
+ maps:merge(getifaddrs_filter_map_default(), FilterMap).
+
+getifaddrs_filter_map_default() ->
+ #{family => default, flags => any}.
+
+getifaddrs_filter(#{family := FFamily, flags := FFlags},
+ #{addr := #{family := Family}, flags := Flags} = _Entry)
+ when (FFamily =:= default) andalso
+ ((Family =:= inet) orelse (Family =:= inet6)) ->
+ getifaddrs_filter_flags(FFlags, Flags);
+getifaddrs_filter(#{family := FFamily, flags := FFlags},
+ #{addr := #{family := Family}, flags := Flags} = _Entry)
+ when (FFamily =:= inet) andalso (Family =:= inet) ->
+ getifaddrs_filter_flags(FFlags, Flags);
+getifaddrs_filter(#{family := FFamily, flags := FFlags},
+ #{addr := #{family := Family}, flags := Flags} = _Entry)
+ when (FFamily =:= inet6) andalso (Family =:= inet6) ->
+ getifaddrs_filter_flags(FFlags, Flags);
+getifaddrs_filter(#{family := FFamily, flags := FFlags},
+ #{addr := #{family := Family}, flags := Flags} = _Entry)
+ when (FFamily =:= packet) andalso (Family =:= packet) ->
+ getifaddrs_filter_flags(FFlags, Flags);
+getifaddrs_filter(#{family := FFamily, flags := FFlags},
+ #{flags := Flags} = _Entry)
+ when (FFamily =:= all) ->
+ getifaddrs_filter_flags(FFlags, Flags);
+getifaddrs_filter(_Filter, _Entry) ->
+ false.
+
+
+getifaddrs_filter_flags(any, _Flags) ->
+ true;
+getifaddrs_filter_flags(FilterFlags, Flags) ->
+ [] =:= (FilterFlags -- Flags).
+
+
+
+%% ===========================================================================
+%%
%% if_name2index - Mappings between network interface names and indexes:
%% name -> idx
%%
diff --git a/lib/kernel/test/Makefile b/lib/kernel/test/Makefile
index 6763a04d9f..bd1590ee8f 100644
--- a/lib/kernel/test/Makefile
+++ b/lib/kernel/test/Makefile
@@ -83,6 +83,7 @@ MODULES= \
logger_std_h_SUITE \
logger_stress_SUITE \
logger_test_lib \
+ net_SUITE \
os_SUITE \
pg2_SUITE \
seq_trace_SUITE \
diff --git a/lib/kernel/test/disk_log_SUITE.erl b/lib/kernel/test/disk_log_SUITE.erl
index 9704c3b28c..dc72c304cc 100644
--- a/lib/kernel/test/disk_log_SUITE.erl
+++ b/lib/kernel/test/disk_log_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2018. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -1776,6 +1776,7 @@ block_queue2(Conf) when is_list(Conf) ->
Parent ! disk_log_stopped_ok
end,
spawn(Fun),
+ timer:sleep(500),
ok = sync_do(Pid, close),
receive disk_log_stopped_ok -> ok end,
sync_do(Pid, terminate),
diff --git a/lib/kernel/test/file_SUITE.erl b/lib/kernel/test/file_SUITE.erl
index 3bc8e6e828..1c1b35abc1 100644
--- a/lib/kernel/test/file_SUITE.erl
+++ b/lib/kernel/test/file_SUITE.erl
@@ -94,6 +94,8 @@
-export([allocate/1]).
+-export([allocate_file_size/1]).
+
-export([standard_io/1,mini_server/1]).
-export([old_io_protocol/1]).
@@ -145,7 +147,7 @@ groups() ->
{files, [],
[{group, open}, {group, pos}, {group, file_info},
{group, consult}, {group, eval}, {group, script},
- truncate, sync, datasync, advise, allocate]},
+ truncate, sync, datasync, advise, allocate, allocate_file_size]},
{open, [],
[open1, old_modes, new_modes, path_open, close, access,
read_write, pread_write, append, open_errors,
@@ -2036,6 +2038,28 @@ allocate_and_assert(Fd, Offset, Length) ->
_ = Result
end.
+%% Tests that asserts that file:allocate/3 changes file size
+allocate_file_size(Config) when is_list(Config) ->
+ case os:type() of
+ {unix, darwin} ->
+ PrivDir = proplists:get_value(priv_dir, Config),
+ Allocate = filename:join(PrivDir, atom_to_list(?MODULE)++"_allocate_file"),
+
+ {ok, Fd} = ?FILE_MODULE:open(Allocate, [write]),
+ ok = ?FILE_MODULE:allocate(Fd, 0, 1024),
+ {ok, 1024} = ?FILE_MODULE:position(Fd, eof),
+ ok = ?FILE_MODULE:close(Fd),
+
+ [] = flush(),
+ ok;
+ {unix, linux} ->
+ {skip, "file:allocate/3 on Linux does not change file size"};
+ {win32, _} ->
+ {skip, "Windows does not support file:allocate/3"};
+ _ ->
+ {skip, "Support for allocate/3 is spotty in our test platform at the moment."}
+ end.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
delete(Config) when is_list(Config) ->
diff --git a/lib/kernel/test/logger_std_h_SUITE.erl b/lib/kernel/test/logger_std_h_SUITE.erl
index 2b2d509860..602a79c78b 100644
--- a/lib/kernel/test/logger_std_h_SUITE.erl
+++ b/lib/kernel/test/logger_std_h_SUITE.erl
@@ -157,6 +157,7 @@ all() ->
rotate_size,
rotate_size_compressed,
rotate_size_reopen,
+ rotate_on_start_compressed,
rotation_opts,
rotation_opts_restart_handler
].
@@ -1518,6 +1519,65 @@ rotate_size_reopen(Config) ->
rotate_size_reopen(cleanup,_Config) ->
ok = stop_handler(?MODULE).
+%% Test that it is possible to start the handler when there
+%% exists a large file that needs rotating at startup.
+rotate_on_start_compressed() ->
+ [{timetrap,{minutes,5}}].
+rotate_on_start_compressed(Config) ->
+
+ application:ensure_all_started(os_mon),
+
+ case file_SUITE:disc_free(?config(priv_dir, Config)) of
+ N when N >= 5 * (1 bsl 30), is_integer(N) ->
+ ct:pal("Free disk: ~w KByte~n", [N]),
+ Log = get_handler_log_name(rotate_on_start_compressed, Config),
+
+ %% Write a 1 GB file to disk
+ {ok, D} = file:open(Log,[write]),
+ [file:write(D,<<0:(1024*1024*8)>>) || I <- lists:seq(1,1024)],
+ file:close(D),
+
+ NumOfReqs = 500,
+
+ %% Start the handler that will compress and rotate the existing file
+ ok = logger:add_handler(?MODULE,
+ logger_std_h,
+ #{config => #{sync_mode_qlen => 2,
+ drop_mode_qlen => NumOfReqs+1,
+ flush_qlen => 2*NumOfReqs,
+ burst_limit_enable => false,
+ max_no_bytes=>1048576,
+ max_no_files=>10,
+ compress_on_rotate=>true,
+ type => {file,Log}},
+ filter_default=>stop,
+ filters=>filter_only_this_domain(?MODULE),
+ formatter=>{?MODULE,op}}),
+
+ %% Wait for compression to start
+ timer:sleep(50),
+
+ %% We send a burst here in order to make sure that the
+ %% compression has time to take place. The burst will
+ %% trigger sync mode which means that there will be
+ %% calls made to the file controller process which
+ %% in turn means that when the burst is done the
+ %% compression is done.
+ send_burst({n,NumOfReqs}, seq, {chars,79}, notice),
+ Lines = count_lines(Log),
+ NumOfReqs = Lines,
+ {ok,#file_info{size=1043656}} = file:read_file_info(Log++".0.gz"),
+ ok;
+ _ ->
+ {skip,"Disk not large enough"}
+ end.
+rotate_on_start_compressed(cleanup,Config) ->
+ application:stop(os_mon),
+ application:stop(sasl),
+ file:delete(get_handler_log_name(rotate_on_start_compressed, Config)),
+ file:delete(get_handler_log_name(rotate_on_start_compressed, Config)++".0.gz"),
+ ok = stop_handler(?MODULE).
+
rotation_opts(Config) ->
{Log,_HConfig,StdHConfig} =
start_handler(?MODULE, ?FUNCTION_NAME, Config),
@@ -1747,8 +1807,7 @@ start_handler(Name, TTY, _Config) when TTY == standard_io;
{HConfig,StdHConfig};
start_handler(Name, FuncName, Config) ->
- Dir = ?config(priv_dir,Config),
- Log = filename:join(Dir, lists:concat([FuncName,".log"])),
+ Log = get_handler_log_name(FuncName, Config),
ct:pal("Logging to ~tp", [Log]),
Type = {file,Log},
_ = file_delete(Log),
@@ -1761,10 +1820,13 @@ start_handler(Name, FuncName, Config) ->
{ok,HConfig = #{config := StdHConfig}} = logger:get_handler_config(Name),
{Log,HConfig,StdHConfig}.
+get_handler_log_name(FuncName, Config) ->
+ Dir = ?config(priv_dir,Config),
+ filename:join(Dir, lists:concat([FuncName,".log"])).
+
filter_only_this_domain(Name) ->
[{remote_gl,{fun logger_filters:remote_gl/2,stop}},
{domain,{fun logger_filters:domain/2,{log,super,[Name]}}}].
-
stop_handler(Name) ->
R = logger:remove_handler(Name),
@@ -1778,6 +1840,8 @@ count_lines(File) ->
wait_until_written(File, Sz) ->
timer:sleep(2000),
case file:read_file_info(File) of
+ {error,enoent} when Sz == -1 ->
+ wait_until_written(File, Sz);
{ok,#file_info{size = Sz}} ->
timer:sleep(1000),
case file:read_file_info(File) of
diff --git a/lib/kernel/test/net_SUITE.erl b/lib/kernel/test/net_SUITE.erl
new file mode 100644
index 0000000000..c6e77a5373
--- /dev/null
+++ b/lib/kernel/test/net_SUITE.erl
@@ -0,0 +1,489 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2019-2019. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+%%
+%% This test suite is basically a "placeholder" for a proper test suite...
+%% Also we should really call prim_net directly, and not net (since that does
+%% not even reside here).
+%%
+
+%% Run the entire test suite:
+%% ts:run(emulator, net_SUITE, [batch]).
+%%
+%% Run a specific group:
+%% ts:run(emulator, net_SUITE, {group, foo}, [batch]).
+%%
+%% Run a specific test case:
+%% ts:run(emulator, net_SUITE, foo, [batch]).
+
+-module(net_SUITE).
+
+-include_lib("common_test/include/ct.hrl").
+-include_lib("common_test/include/ct_event.hrl").
+
+%% Suite exports
+-export([suite/0, all/0, groups/0]).
+-export([init_per_suite/1, end_per_suite/1,
+ init_per_group/2, end_per_group/2,
+ init_per_testcase/2, end_per_testcase/2]).
+
+%% Test cases
+-export([
+ %% *** API Basic ***
+ api_b_gethostname/1,
+ api_b_name_and_addr_info/1,
+
+ api_b_name_and_index/1
+
+ %% Tickets
+ ]).
+
+
+%% -include("socket_test_evaluator.hrl").
+
+%% Internal exports
+%% -export([]).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-define(SLEEP(T), receive after T -> ok end).
+
+-define(FAIL(R), exit(R)).
+
+-define(MINS(M), timer:minutes(M)).
+-define(SECS(S), timer:seconds(S)).
+
+-define(TT(T), ct:timetrap(T)).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+suite() ->
+ [{ct_hooks,[ts_install_cth]},
+ {timetrap,{minutes,1}}].
+
+all() ->
+ Groups = [{api, "ENET_TEST_API", include}],
+ [use_group(Group, Env, Default) || {Group, Env, Default} <- Groups].
+
+use_group(Group, Env, Default) ->
+ case os:getenv(Env) of
+ false when (Default =:= include) ->
+ [{group, Group}];
+ false ->
+ [];
+ Val ->
+ case list_to_atom(string:to_lower(Val)) of
+ Use when (Use =:= include) orelse
+ (Use =:= enable) orelse
+ (Use =:= true) ->
+ [{group, Group}];
+ _ ->
+ []
+ end
+ end.
+
+
+groups() ->
+ [{api, [], api_cases()},
+ {api_basic, [], api_basic_cases()}
+
+ %% {tickets, [], ticket_cases()}
+ ].
+
+api_cases() ->
+ [
+ {group, api_basic}
+ ].
+
+api_basic_cases() ->
+ [
+ api_b_gethostname,
+ api_b_name_and_addr_info,
+ api_b_name_and_index
+ ].
+
+%% ticket_cases() ->
+%% [].
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+init_per_suite(Config) ->
+ %% We test on the socket module for simplicity
+ case lists:member(socket, erlang:loaded()) of
+ true ->
+ case os:type() of
+ {win32, _} ->
+ not_yet_implemented();
+ _ ->
+ %% ?LOGGER:start(),
+ Config
+ end;
+ false ->
+ {skip, "esock disabled"}
+ end.
+
+end_per_suite(_) ->
+ %% ?LOGGER:stop(),
+ ok.
+
+init_per_group(_Group, Config) ->
+ Config.
+
+end_per_group(_Group, Config) ->
+ Config.
+
+
+init_per_testcase(_TC, Config) ->
+ Config.
+
+end_per_testcase(_TC, Config) ->
+ Config.
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% %%
+%% API BASIC %%
+%% %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% Get the hostname of the host.
+api_b_gethostname(suite) ->
+ [];
+api_b_gethostname(doc) ->
+ [];
+api_b_gethostname(_Config) when is_list(_Config) ->
+ ?TT(?SECS(5)),
+ tc_try(api_b_gethostname,
+ fun() ->
+ ok = api_b_gethostname()
+ end).
+
+
+api_b_gethostname() ->
+ case net:gethostname() of
+ {ok, Hostname} ->
+ i("hostname: ~s", [Hostname]),
+ ok;
+ {error, Reason} ->
+ ?FAIL(Reason)
+ end.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% Get name and address info.
+api_b_name_and_addr_info(suite) ->
+ [];
+api_b_name_and_addr_info(doc) ->
+ [];
+api_b_name_and_addr_info(_Config) when is_list(_Config) ->
+ ?TT(?SECS(5)),
+ tc_try(api_b_name_and_addr_info,
+ fun() ->
+ ok = api_b_name_and_addr_info()
+ end).
+
+
+api_b_name_and_addr_info() ->
+ Domain = inet,
+ Addr = which_local_addr(Domain),
+ SA = #{family => Domain, addr => Addr},
+ Hostname =
+ case net:getnameinfo(SA) of
+ {ok, #{host := Name, service := Service} = NameInfo}
+ when is_list(Name) andalso is_list(Service) ->
+ i("getnameinfo: "
+ "~n ~p", [NameInfo]),
+ Name;
+ {ok, BadNameInfo} ->
+ ?FAIL({getnameinfo, SA, BadNameInfo});
+ {error, Reason1} ->
+ ?FAIL({getnameinfo, SA, Reason1})
+ end,
+ case net:getaddrinfo(Hostname) of
+ {ok, AddrInfos} when is_list(AddrInfos) ->
+ i("getaddrinfo: "
+ "~n ~p", [AddrInfos]),
+ verify_addr_info(AddrInfos, Domain);
+ {ok, BadAddrInfo} ->
+ ?FAIL({getaddrinfo, Hostname, BadAddrInfo});
+ {error, Reason2} ->
+ ?FAIL({getaddrinfo, Hostname, Reason2})
+ end.
+
+
+verify_addr_info(AddrInfos, Domain) when (AddrInfos =/= []) ->
+ verify_addr_info2(AddrInfos, Domain).
+
+verify_addr_info2([], _Domain) ->
+ ok;
+verify_addr_info2([#{addr := #{addr := Addr,
+ family := Domain,
+ port := Port},
+ family := Domain,
+ type := _Type,
+ protocol := _Proto}|T], Domain)
+ when is_integer(Port) andalso
+ (((Domain =:= inet) andalso is_tuple(Addr) andalso (size(Addr) =:= 4)) orelse
+ ((Domain =:= inet6) andalso is_tuple(Addr) andalso (size(Addr) =:= 8))) ->
+ verify_addr_info2(T, Domain);
+verify_addr_info2([#{family := DomainA}|T], DomainB)
+ when (DomainA =/= DomainB) ->
+ %% Ignore entries for other domains
+ verify_addr_info2(T, DomainB);
+verify_addr_info2([BadAddrInfo|_], Domain) ->
+ ?FAIL({bad_address_info, BadAddrInfo, Domain}).
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% Verify (interface) name and index functions.
+%% if_names/0,
+%% if_name2index/1
+%% if_index2name/1
+api_b_name_and_index(suite) ->
+ [];
+api_b_name_and_index(doc) ->
+ [];
+api_b_name_and_index(_Config) when is_list(_Config) ->
+ ?TT(?SECS(5)),
+ tc_try(api_b_name_and_index,
+ fun() ->
+ ok = api_b_name_and_index()
+ end).
+
+
+api_b_name_and_index() ->
+ Names =
+ case net:if_names() of
+ {ok, N} when is_list(N) andalso (N =/= []) ->
+ N;
+ {error, Reason} ->
+ ?FAIL({if_names, Reason})
+ end,
+ verify_if_names(Names).
+
+verify_if_names([]) ->
+ ok;
+verify_if_names([{Index, Name}|T]) ->
+ case net:if_name2index(Name) of
+ {ok, Index} ->
+ ok;
+ {ok, BadIndex} ->
+ ?FAIL({name2index, Name, Index, BadIndex});
+ {error, ReasonN2I} ->
+ ?FAIL({name2index, Name, ReasonN2I})
+ end,
+ case net:if_index2name(Index) of
+ {ok, Name} ->
+ ok;
+ {ok, BadName} ->
+ ?FAIL({index2name, Index, Name, BadName});
+ {error, ReasonI2N} ->
+ ?FAIL({index2name, Index, ReasonI2N})
+ end,
+ verify_if_names(T).
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% local_host() ->
+%% try net_adm:localhost() of
+%% Host when is_list(Host) ->
+%% %% Convert to shortname if long
+%% case string:tokens(Host, [$.]) of
+%% [H|_] ->
+%% list_to_atom(H)
+%% end
+%% catch
+%% C:E:S ->
+%% erlang:raise(C, E, S)
+%% end.
+
+
+%% This gets the local address (not 127.0...)
+%% We should really implement this using the (new) net module,
+%% but until that gets the necessary functionality...
+which_local_addr(Domain) ->
+ case inet:getifaddrs() of
+ {ok, IFL} ->
+ which_addr(Domain, IFL);
+ {error, Reason} ->
+ ?FAIL({inet, getifaddrs, Reason})
+ end.
+
+which_addr(_Domain, []) ->
+ skip(no_address);
+which_addr(Domain, [{"lo" ++ _, _}|IFL]) ->
+ which_addr(Domain, IFL);
+which_addr(Domain, [{_Name, IFO}|IFL]) ->
+ case which_addr2(Domain, IFO) of
+ {ok, Addr} ->
+ Addr;
+ {error, no_address} ->
+ which_addr(Domain, IFL)
+ end;
+which_addr(Domain, [_|IFL]) ->
+ which_addr(Domain, IFL).
+
+which_addr2(_Domain, []) ->
+ {error, no_address};
+which_addr2(inet = _Domain, [{addr, Addr}|_IFO]) when (size(Addr) =:= 4) ->
+ {ok, Addr};
+which_addr2(inet6 = _Domain, [{addr, Addr}|_IFO]) when (size(Addr) =:= 8) ->
+ {ok, Addr};
+which_addr2(Domain, [_|IFO]) ->
+ which_addr2(Domain, IFO).
+
+
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+not_yet_implemented() ->
+ skip("not yet implemented").
+
+skip(Reason) ->
+ throw({skip, Reason}).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% t() ->
+%% os:timestamp().
+
+
+%% tdiff({A1, B1, C1} = _T1x, {A2, B2, C2} = _T2x) ->
+%% T1 = A1*1000000000+B1*1000+(C1 div 1000),
+%% T2 = A2*1000000000+B2*1000+(C2 div 1000),
+%% T2 - T1.
+
+
+formated_timestamp() ->
+ format_timestamp(os:timestamp()).
+
+format_timestamp({_N1, _N2, _N3} = TS) ->
+ {_Date, Time} = calendar:now_to_local_time(TS),
+ %% {YYYY,MM,DD} = Date,
+ {Hour,Min,Sec} = Time,
+ %% FormatTS =
+ %% io_lib:format("~.4w-~.2.0w-~.2.0w ~.2.0w:~.2.0w:~.2.0w.~w",
+ %% [YYYY, MM, DD, Hour, Min, Sec, N3]),
+ FormatTS = io_lib:format("~.2.0w:~.2.0w:~.2.0w", [Hour, Min, Sec]),
+ lists:flatten(FormatTS).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+set_tc_name(N) when is_atom(N) ->
+ set_tc_name(atom_to_list(N));
+set_tc_name(N) when is_list(N) ->
+ put(tc_name, N).
+
+%% get_tc_name() ->
+%% get(tc_name).
+
+tc_begin(TC) ->
+ set_tc_name(TC),
+ tc_print("begin ***",
+ "~n----------------------------------------------------~n", "").
+
+tc_end(Result) when is_list(Result) ->
+ tc_print("done: ~s", [Result],
+ "", "----------------------------------------------------~n~n"),
+ ok.
+
+
+tc_try(Case, Fun) when is_atom(Case) andalso is_function(Fun, 0) ->
+ tc_begin(Case),
+ try
+ begin
+ Fun(),
+ ?SLEEP(?SECS(1)),
+ tc_end("ok")
+ end
+ catch
+ throw:{skip, _} = SKIP ->
+ tc_end("skipping"),
+ SKIP;
+ Class:Error:Stack ->
+ tc_end("failed"),
+ erlang:raise(Class, Error, Stack)
+ end.
+
+
+tc_print(F, Before, After) ->
+ tc_print(F, [], Before, After).
+
+tc_print(F, A, Before, After) ->
+ Name = tc_which_name(),
+ FStr = f("*** [~s][~s][~p] " ++ F ++ "~n",
+ [formated_timestamp(),Name,self()|A]),
+ io:format(user, Before ++ FStr ++ After, []).
+
+tc_which_name() ->
+ case get(tc_name) of
+ undefined ->
+ case get(sname) of
+ undefined ->
+ "";
+ SName when is_list(SName) ->
+ SName
+ end;
+ Name when is_list(Name) ->
+ Name
+ end.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% l2a(S) when is_list(S) ->
+%% list_to_atom(S).
+
+%% l2b(L) when is_list(L) ->
+%% list_to_binary(L).
+
+%% b2l(B) when is_binary(B) ->
+%% binary_to_list(B).
+
+f(F, A) ->
+ lists:flatten(io_lib:format(F, A)).
+
+
+%% i(F) ->
+%% i(F, []).
+
+i(F, A) ->
+ FStr = f("[~s] " ++ F, [formated_timestamp()|A]),
+ io:format(user, FStr ++ "~n", []),
+ io:format(FStr, []).
+
diff --git a/lib/kernel/test/seq_trace_SUITE.erl b/lib/kernel/test/seq_trace_SUITE.erl
index 83a94ab087..52342560b1 100644
--- a/lib/kernel/test/seq_trace_SUITE.erl
+++ b/lib/kernel/test/seq_trace_SUITE.erl
@@ -29,11 +29,13 @@
old_heap_token/1,
send/1, distributed_send/1, recv/1, distributed_recv/1,
trace_exit/1, distributed_exit/1, call/1, port/1,
+ port_clean_token/1,
match_set_seq_token/1, gc_seq_token/1, label_capability_mismatch/1,
send_literal/1]).
%% internal exports
-export([simple_tracer/2, one_time_receiver/0, one_time_receiver/1,
+ n_time_receiver/1,
start_tracer/0, stop_tracer/1,
do_match_set_seq_token/1, do_gc_seq_token/1, countdown_start/2]).
@@ -53,6 +55,7 @@ all() ->
distributed_send, recv, distributed_recv, trace_exit,
old_heap_token,
distributed_exit, call, port, match_set_seq_token,
+ port_clean_token,
gc_seq_token, label_capability_mismatch].
groups() ->
@@ -176,15 +179,21 @@ do_send(TsType) ->
do_send(TsType, Msg) ->
seq_trace:reset_trace(),
start_tracer(),
- Receiver = spawn(?MODULE,one_time_receiver,[]),
+ Receiver = spawn(?MODULE,n_time_receiver,[2]),
+ register(n_time_receiver, Receiver),
Label = make_ref(),
seq_trace:set_token(label,Label),
set_token_flags([send, TsType]),
Receiver ! Msg,
+ n_time_receiver ! Msg,
Self = self(),
seq_trace:reset_trace(),
- [{Label,{send,_,Self,Receiver,Msg}, Ts}] = stop_tracer(1),
- check_ts(TsType, Ts).
+ [{Label,{send,_,Self,Receiver,Msg}, Ts1},
+ %% Apparently named local destination process is traced as pid (!?)
+ {Label,{send,_,Self,Receiver,Msg}, Ts2}
+ ] = stop_tracer(2),
+ check_ts(TsType, Ts1),
+ check_ts(TsType, Ts2).
%% This testcase tests that we do not segfault when we have a
%% literal as the message and the message is copied onto the
@@ -221,7 +230,8 @@ do_distributed_send(TsType) ->
true = rpc:call(Node,code,add_patha,[Mdir]),
seq_trace:reset_trace(),
start_tracer(),
- Receiver = spawn(Node,?MODULE,one_time_receiver,[]),
+ Receiver = spawn(Node,?MODULE,n_time_receiver,[2]),
+ true = rpc:call(Node,erlang,register,[n_time_receiver, Receiver]),
%% Make sure complex labels survive the trip.
Label = make_ref(),
@@ -229,11 +239,17 @@ do_distributed_send(TsType) ->
set_token_flags([send,TsType]),
Receiver ! send,
+ {n_time_receiver, Node} ! "dsend",
+
Self = self(),
seq_trace:reset_trace(),
stop_node(Node),
- [{Label,{send,_,Self,Receiver,send}, Ts}] = stop_tracer(1),
- check_ts(TsType, Ts).
+ [{Label,{send,_,Self,Receiver,send}, Ts1},
+ {Label,{send,_,Self,{n_time_receiver,Node}, "dsend"}, Ts2}
+ ] = stop_tracer(2),
+
+ check_ts(TsType, Ts1),
+ check_ts(TsType, Ts2).
recv(Config) when is_list(Config) ->
@@ -909,7 +925,11 @@ transparent_tracer() ->
end
end.
-
+n_time_receiver(0) ->
+ ok;
+n_time_receiver(N) ->
+ receive _Term -> n_time_receiver(N-1)
+ end.
one_time_receiver() ->
receive _Term -> ok
diff --git a/lib/kernel/test/wrap_log_reader_SUITE.erl b/lib/kernel/test/wrap_log_reader_SUITE.erl
index 59b088ca73..7fbc3be87c 100644
--- a/lib/kernel/test/wrap_log_reader_SUITE.erl
+++ b/lib/kernel/test/wrap_log_reader_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2018. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -348,7 +348,7 @@ external(Conf) when is_list(Conf) ->
P0 = pps(),
wlt ! {open, self(), File},
rec({error, {not_a_log_file, add_ext(File, 1)}}, ?LINE),
- true = (P0 == pps()),
+ check_pps(P0),
stop(),
delete_files(File),
@@ -366,7 +366,7 @@ error(Conf) when is_list(Conf) ->
rec({error, {index_file_not_found, File}}, ?LINE),
wlt ! {open, self(), File},
rec({error, {index_file_not_found, File}}, ?LINE),
- true = (P0 == pps()),
+ check_pps(P0),
open(sune, File, ?LINE),
close(sune),
@@ -375,7 +375,7 @@ error(Conf) when is_list(Conf) ->
ok = file:delete(First),
wlt ! {open, self(), File},
rec({error, {not_a_log_file, First}}, ?LINE),
- true = (P1 == pps()),
+ check_pps(P1),
delete_files(File),
open(sune, File, ?LINE),
@@ -393,7 +393,7 @@ error(Conf) when is_list(Conf) ->
wlt ! {chunk, self(), C},
rec({error, {not_a_log_file, Second}}, ?LINE),
do_chunk([close], wlt, ?LINE, C),
- true = (P2 == pps()),
+ check_pps(P2),
delete_files(File),
open(sune, File, ?LINE),
@@ -413,7 +413,7 @@ error(Conf) when is_list(Conf) ->
ok = file:write_file(IndexFile, <<17:(3*8)>>),
wlt ! {open, self(), File, 1},
rec({error, {index_file_not_found, File}}, ?LINE),
- true = (P3 == pps()),
+ check_pps(P3),
stop(),
delete_files(File),
@@ -553,5 +553,55 @@ rec(M, Where) ->
after 5000 -> ct:fail({error, {Where, time_out}})
end.
+check_pps({Ports0,Procs0} = P0) ->
+ case pps() of
+ P0 ->
+ ok;
+ _ ->
+ timer:sleep(500),
+ case pps() of
+ P0 ->
+ ok;
+ {Ports1,Procs1} = P1 ->
+ case {Ports1 -- Ports0, Procs1 -- Procs0} of
+ {[], []} -> ok;
+ {PortsDiff,ProcsDiff} ->
+ io:format("failure, got ~p~n, expected ~p\n", [P1, P0]),
+ show("Old port", Ports0 -- Ports1),
+ show("New port", PortsDiff),
+ show("Old proc", Procs0 -- Procs1),
+ show("New proc", ProcsDiff),
+ ct:fail(failed)
+ end
+ end
+ end.
+
+show(_S, []) ->
+ ok;
+show(S, [{Pid, Name, InitCall}|Pids]) when is_pid(Pid) ->
+ io:format("~s: ~w (~w), ~w: ~p~n",
+ [S, Pid, proc_reg_name(Name), InitCall,
+ erlang:process_info(Pid)]),
+ show(S, Pids);
+show(S, [{Port, _}|Ports]) when is_port(Port)->
+ io:format("~s: ~w: ~p~n", [S, Port, erlang:port_info(Port)]),
+ show(S, Ports).
+
pps() ->
- {erlang:ports(), lists:filter(fun erlang:is_process_alive/1, processes())}.
+ timer:sleep(100),
+ {port_list(), process_list()}.
+
+port_list() ->
+ [{P,safe_second_element(erlang:port_info(P, name))} ||
+ P <- erlang:ports()].
+
+process_list() ->
+ [{P,process_info(P, registered_name),
+ safe_second_element(process_info(P, initial_call))} ||
+ P <- processes(), erlang:is_process_alive(P)].
+
+proc_reg_name({registered_name, Name}) -> Name;
+proc_reg_name([]) -> no_reg_name.
+
+safe_second_element({_,Info}) -> Info;
+safe_second_element(Other) -> Other.
diff --git a/lib/megaco/Makefile b/lib/megaco/Makefile
index f385df6a5c..1099c2a634 100644
--- a/lib/megaco/Makefile
+++ b/lib/megaco/Makefile
@@ -214,9 +214,15 @@ $(DIA_PLT): Makefile
../../lib/kernel/ebin \
../../lib/stdlib/ebin \
../../lib/runtime_tools/ebin \
+ ../../lib/syntax_tools/ebin \
../../lib/asn1/ebin \
../../lib/debugger/ebin \
../../lib/et/ebin \
+ ../../lib/mnesia/ebin \
+ ../../lib/crypto/ebin \
+ ../../lib/compiler/ebin \
+ ../../lib/wx/ebin \
+ ../../lib/hipe/ebin \
../../erts/preloaded/ebin \
--output $(DIA_ANALYSIS) \
--verbose
diff --git a/lib/megaco/examples/meas/megaco_codec_meas.erl b/lib/megaco/examples/meas/megaco_codec_meas.erl
index a4cb8097ea..eade972da5 100644
--- a/lib/megaco/examples/meas/megaco_codec_meas.erl
+++ b/lib/megaco/examples/meas/megaco_codec_meas.erl
@@ -120,12 +120,12 @@ meas_init(MessagePackage, Codecs) ->
display_system_info(),
display_app_info(),
io:format("~n", []),
- Started = now(),
+ Started = os:timestamp(),
case megaco_codec_transform:messages(MessagePackage) of
Messages when is_list(Messages) ->
ExpandedMessages = expand_messages(Codecs, Messages),
Results = t1(ExpandedMessages, []),
- display_time(Started, now()),
+ display_time(Started, os:timestamp()),
store_results(Results);
Error ->
Error
diff --git a/lib/megaco/examples/meas/megaco_codec_mstone1.erl b/lib/megaco/examples/meas/megaco_codec_mstone1.erl
index 8439e167a2..542a8a7a1d 100644
--- a/lib/megaco/examples/meas/megaco_codec_mstone1.erl
+++ b/lib/megaco/examples/meas/megaco_codec_mstone1.erl
@@ -36,15 +36,14 @@
]).
%% Internal exports
--export([mstone_runner_init/5]).
+-export([mstone_runner_init/6]).
-define(LIB, megaco_codec_mstone_lib).
--ifndef(MSTONE_TIME).
--define(MSTONE_TIME, 10).
+-ifndef(MSTONE_RUN_TIME).
+-define(MSTONE_RUN_TIME, 10). % minutes
-endif.
--define(MSTONE_RUN_TIME, timer:minutes(?MSTONE_TIME)).
-ifndef(MSTONE_VERSION3).
-define(MSTONE_VERSION3, v3).
@@ -74,63 +73,112 @@ start() ->
start(?DEFAULT_FACTOR).
start([Factor]) ->
- start(?DEFAULT_MESSAGE_PACKAGE, Factor);
+ start(?DEFAULT_MESSAGE_PACKAGE, ?MSTONE_RUN_TIME, Factor);
start([MessagePackage, Factor]) ->
- start(MessagePackage, Factor);
+ start(MessagePackage, ?MSTONE_RUN_TIME, Factor);
+start([MessagePackage, RunTime, Factor]) ->
+ start(MessagePackage, RunTime, Factor);
start(Factor) ->
- start(?DEFAULT_MESSAGE_PACKAGE, Factor).
+ start(?DEFAULT_MESSAGE_PACKAGE, ?MSTONE_RUN_TIME, Factor).
start(MessagePackage, Factor) ->
- do_start(MessagePackage, Factor, ?DEFAULT_DRV_INCLUDE).
+ start(MessagePackage, ?MSTONE_RUN_TIME, Factor).
+
+start(MessagePackage, RunTime, Factor) ->
+ do_start(MessagePackage, RunTime, Factor, ?DEFAULT_DRV_INCLUDE).
start_flex() ->
start_flex(?DEFAULT_FACTOR).
start_flex([Factor]) ->
- start_flex(?DEFAULT_MESSAGE_PACKAGE, Factor);
+ start_flex(?DEFAULT_MESSAGE_PACKAGE, ?MSTONE_RUN_TIME, Factor);
start_flex([MessagePackage, Factor]) ->
- start_flex(MessagePackage, Factor);
+ start_flex(MessagePackage, ?MSTONE_RUN_TIME, Factor);
+start_flex([MessagePackage, RunTime, Factor]) ->
+ start_flex(MessagePackage, RunTime, Factor);
start_flex(Factor) ->
- start_flex(?DEFAULT_MESSAGE_PACKAGE, Factor).
+ start_flex(?DEFAULT_MESSAGE_PACKAGE, ?MSTONE_RUN_TIME, Factor).
start_flex(MessagePackage, Factor) ->
- do_start(MessagePackage, Factor, flex).
+ do_start(MessagePackage, ?MSTONE_RUN_TIME, Factor, flex).
+
+start_flex(MessagePackage, RunTime, Factor) ->
+ do_start(MessagePackage, RunTime, Factor, flex).
start_only_drv() ->
start_only_drv(?DEFAULT_FACTOR).
start_only_drv([Factor]) ->
- start_only_drv(?DEFAULT_MESSAGE_PACKAGE, Factor);
+ start_only_drv(?DEFAULT_MESSAGE_PACKAGE, ?MSTONE_RUN_TIME, Factor);
start_only_drv([MessagePackage, Factor]) ->
- start_only_drv(MessagePackage, Factor);
+ start_only_drv(MessagePackage, ?MSTONE_RUN_TIME, Factor);
+start_only_drv([MessagePackage, RunTime, Factor]) ->
+ start_only_drv(MessagePackage, RunTime, Factor);
start_only_drv(Factor) ->
- start_only_drv(?DEFAULT_MESSAGE_PACKAGE, Factor).
+ start_only_drv(?DEFAULT_MESSAGE_PACKAGE, ?MSTONE_RUN_TIME, Factor).
start_only_drv(MessagePackage, Factor) ->
- do_start(MessagePackage, Factor, only_drv).
+ do_start(MessagePackage, ?MSTONE_RUN_TIME, Factor, only_drv).
+
+start_only_drv(MessagePackage, RunTime, Factor) ->
+ do_start(MessagePackage, RunTime, Factor, only_drv).
start_no_drv() ->
start_no_drv(?DEFAULT_FACTOR).
start_no_drv([Factor]) ->
- start_no_drv(?DEFAULT_MESSAGE_PACKAGE, Factor);
+ start_no_drv(?DEFAULT_MESSAGE_PACKAGE, ?MSTONE_RUN_TIME, Factor);
start_no_drv([MessagePackage, Factor]) ->
- start_no_drv(MessagePackage, Factor);
+ start_no_drv(MessagePackage, ?MSTONE_RUN_TIME, Factor);
+start_no_drv([MessagePackage, RunTime, Factor]) ->
+ start_no_drv(MessagePackage, RunTime, Factor);
start_no_drv(Factor) ->
- start_no_drv(?DEFAULT_MESSAGE_PACKAGE, Factor).
+ start_no_drv(?DEFAULT_MESSAGE_PACKAGE, ?MSTONE_RUN_TIME, Factor).
start_no_drv(MessagePackage, Factor) ->
- do_start(MessagePackage, Factor, no_drv).
+ do_start(MessagePackage, ?MSTONE_RUN_TIME, Factor, no_drv).
+
+start_no_drv(MessagePackage, RunTime, Factor) ->
+ do_start(MessagePackage, RunTime, Factor, no_drv).
-do_start(MessagePackageRaw, FactorRaw, DrvInclude) ->
+do_start(MessagePackageRaw, RunTimeRaw, FactorRaw, DrvInclude) ->
+ RunTime = parse_runtime(RunTimeRaw),
Factor = parse_factor(FactorRaw),
MessagePackage = parse_message_package(MessagePackageRaw),
- mstone_init(MessagePackage, Factor, DrvInclude).
-
+ mstone_init(MessagePackage, RunTime, Factor, DrvInclude).
+
+
+parse_runtime(RunTimeAtom) when is_atom(RunTimeAtom) ->
+ parse_runtime_str(atom_to_list(RunTimeAtom));
+parse_runtime(RunTimeStr) when is_list(RunTimeStr) ->
+ parse_runtime_str(RunTimeStr);
+parse_runtime(RunTime) when is_integer(RunTime) andalso (RunTime > 0) ->
+ timer:minutes(RunTime);
+parse_runtime(BadRunTime) ->
+ throw({error, {bad_runtime, BadRunTime}}).
+
+parse_runtime_str(RuneTimeStr) ->
+ try
+ begin
+ case lists:reverse(RuneTimeStr) of
+ [$s|Rest] ->
+ timer:seconds(list_to_integer(lists:reverse(Rest)));
+ [$m|Rest] ->
+ timer:minutes(list_to_integer(lists:reverse(Rest)));
+ [$h|Rest] ->
+ timer:hours(list_to_integer(lists:reverse(Rest)));
+ _ ->
+ timer:minutes(list_to_integer(RuneTimeStr))
+ end
+ end
+ catch
+ _:_:_ ->
+ throw({error, {bad_runtime, RuneTimeStr}})
+ end.
parse_factor(FactorAtom) when is_atom(FactorAtom) ->
@@ -168,21 +216,23 @@ parse_message_package(BadMessagePackage) ->
%% pretty | compact | ber | per | erlang
%%
-mstone_init(MessagePackage, Factor, DrvInclude) ->
+mstone_init(MessagePackage, RunTime, Factor, DrvInclude) ->
%% io:format("mstone_init -> entry with"
%% "~n MessagePackage: ~p"
+%% "~n RunTime: ~p"
%% "~n Factor: ~p"
%% "~n DrvInclude: ~p"
-%% "~n", [MessagePackage, Factor, DrvInclude]),
+%% "~n", [MessagePackage, RunTime, Factor, DrvInclude]),
Codecs = ?MSTONE_CODECS,
- mstone_init(MessagePackage, Factor, Codecs, DrvInclude).
+ mstone_init(MessagePackage, RunTime, Factor, Codecs, DrvInclude).
-mstone_init(MessagePackage, Factor, Codecs, DrvInclude) ->
+mstone_init(MessagePackage, RunTime, Factor, Codecs, DrvInclude) ->
Parent = self(),
Pid = spawn(
fun() ->
process_flag(trap_exit, true),
- do_mstone(MessagePackage, Factor, Codecs, DrvInclude),
+ do_mstone(MessagePackage,
+ RunTime, Factor, Codecs, DrvInclude),
Parent ! {done, self()}
end),
receive
@@ -190,7 +240,7 @@ mstone_init(MessagePackage, Factor, Codecs, DrvInclude) ->
ok
end.
-do_mstone(MessagePackage, Factor, Codecs, DrvInclude) ->
+do_mstone(MessagePackage, RunTime, Factor, Codecs, DrvInclude) ->
io:format("~n", []),
?LIB:display_os_info(),
?LIB:display_system_info(),
@@ -201,7 +251,7 @@ do_mstone(MessagePackage, Factor, Codecs, DrvInclude) ->
put(flex_scanner_conf, Conf),
EMessages = ?LIB:expanded_messages(MessagePackage, Codecs, DrvInclude),
EMsgs = duplicate(Factor, EMessages),
- MStone = t1(EMsgs),
+ MStone = t1(RunTime, EMsgs),
?LIB:stop_flex_scanner(Pid),
io:format("~n", []),
io:format("MStone: ~p~n", [MStone]).
@@ -214,11 +264,11 @@ duplicate(_N, [], Acc) ->
duplicate(N, [H|T], Acc) ->
duplicate(N, T, [lists:duplicate(N, H)|Acc]).
-t1(EMsgs) ->
+t1(RunTime, EMsgs) ->
io:format(" * starting runners [~w] ", [length(EMsgs)]),
- t1(EMsgs, []).
+ t1(RunTime, EMsgs, []).
-t1([], Runners) ->
+t1(_RunTime, [], Runners) ->
io:format(" done~n * await runners ready ", []),
await_runners_ready(Runners),
io:format(" done~n * now snooze", []),
@@ -226,10 +276,10 @@ t1([], Runners) ->
io:format("~n * release them~n", []),
lists:foreach(fun(P) -> P ! {go, self()} end, Runners),
t2(1, [], Runners);
-t1([H|T], Runners) ->
- Runner = init_runner(H),
+t1(RunTime, [H|T], Runners) ->
+ Runner = init_runner(RunTime, H),
io:format(".", []),
- t1(T, [Runner|Runners]).
+ t1(RunTime, T, [Runner|Runners]).
await_runners_ready([]) ->
ok;
@@ -312,11 +362,11 @@ t2(N, Acc, Runners) ->
t2(N + 1, [MStone|Acc], lists:delete(Pid, Runners))
end.
-init_runner({Codec, Mod, Conf, Msgs}) ->
+init_runner(RunTime, {Codec, Mod, Conf, Msgs}) ->
Conf1 = runner_conf(Conf),
Conf2 = [{version3,?VERSION3}|Conf1],
Pid = spawn_opt(?MODULE, mstone_runner_init,
- [Codec, self(), Mod, Conf2, Msgs],
+ [RunTime, Codec, self(), Mod, Conf2, Msgs],
?MSTONE_RUNNER_OPTS),
Pid.
@@ -336,7 +386,7 @@ detect_versions(Codec, Conf, [{_Name, Bin}|Bins], Acc) ->
detect_versions(Codec, Conf, Bins, [Data|Acc]).
-mstone_runner_init(_Codec, Parent, Mod, Conf, Msgs0) ->
+mstone_runner_init(RunTime, _Codec, Parent, Mod, Conf, Msgs0) ->
Msgs = detect_versions(Mod, Conf, Msgs0, []),
warmup(Mod, Conf, Msgs, []),
Parent ! {ready, self()},
@@ -344,7 +394,7 @@ mstone_runner_init(_Codec, Parent, Mod, Conf, Msgs0) ->
{go, Parent} ->
ok
end,
- erlang:send_after(?MSTONE_RUN_TIME, self(), stop),
+ erlang:send_after(RunTime, self(), stop),
mstone_runner_loop(Parent, Mod, Conf, 0, Msgs).
mstone_runner_loop(Parent, Mod, Conf, N, Msgs1) ->
diff --git a/lib/megaco/examples/meas/megaco_codec_mstone2.erl b/lib/megaco/examples/meas/megaco_codec_mstone2.erl
index eb7c2cef71..07ed82a9f0 100644
--- a/lib/megaco/examples/meas/megaco_codec_mstone2.erl
+++ b/lib/megaco/examples/meas/megaco_codec_mstone2.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -201,10 +201,10 @@ display_worker_result([{Mod, Conf, Cnt}|Res]) ->
io:format("~s: ~w~n", [image_of(Mod, Conf), Cnt]),
display_worker_result(Res).
-image_of(megaco_per_bin_encoder, Conf) ->
- bin_image("per_bin", Conf);
-image_of(megaco_ber_bin_encoder, Conf) ->
- bin_image("ber_bin", Conf);
+image_of(megaco_per_encoder, Conf) ->
+ bin_image("per", Conf);
+image_of(megaco_ber_encoder, Conf) ->
+ bin_image("ber", Conf);
image_of(megaco_pretty_text_encoder, Conf) ->
text_image("pretty", Conf);
image_of(megaco_compact_text_encoder, Conf) ->
diff --git a/lib/megaco/examples/meas/megaco_codec_mstone_lib.erl b/lib/megaco/examples/meas/megaco_codec_mstone_lib.erl
index 93515d0f16..87e015eaab 100644
--- a/lib/megaco/examples/meas/megaco_codec_mstone_lib.erl
+++ b/lib/megaco/examples/meas/megaco_codec_mstone_lib.erl
@@ -269,7 +269,7 @@ display_megaco_info() ->
io:format("Megaco version: ~s~n", [Ver]).
display_asn1_info() ->
- AI = megaco_ber__media_gateway_control_v1:info(),
+ AI = megaco_ber_media_gateway_control_v1:info(),
Vsn =
case lists:keysearch(vsn, 1, AI) of
{value, {vsn, V}} when is_atom(V) ->
diff --git a/lib/megaco/examples/meas/megaco_codec_transform.erl b/lib/megaco/examples/meas/megaco_codec_transform.erl
index cfd8568fcf..7960e08dc2 100644
--- a/lib/megaco/examples/meas/megaco_codec_transform.erl
+++ b/lib/megaco/examples/meas/megaco_codec_transform.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -27,7 +27,7 @@
%%
%% {Codec, Messages}.
%%
-%% Codec = pretty | compact | ber | per | erlang
+%% Codec = pretty | compact | ber | per | erlang
%% Messages = [{Name, binary()}]
%% Name = atom
%%
@@ -255,11 +255,11 @@ encode_message(compact, Msg) ->
Conf = [{version3,?V3}],
do_encode(Mod, Conf, Msg);
encode_message(ber, Msg) ->
- Mod = megaco_ber_bin_encoder,
+ Mod = megaco_ber_encoder,
Conf = [{version3,?V3}],
do_encode(Mod, Conf, Msg);
encode_message(per, Msg) ->
- Mod = megaco_per_bin_encoder,
+ Mod = megaco_per_encoder,
Conf = [{version3,?V3}],
do_encode(Mod, Conf, Msg);
encode_message(erlang, Msg) ->
diff --git a/lib/megaco/examples/meas/mstone1.sh.skel.src b/lib/megaco/examples/meas/mstone1.sh.skel.src
index fc4b4a28ae..700da75454 100644
--- a/lib/megaco/examples/meas/mstone1.sh.skel.src
+++ b/lib/megaco/examples/meas/mstone1.sh.skel.src
@@ -3,7 +3,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2007-2016. All Rights Reserved.
+# Copyright Ericsson AB 2007-2019. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -39,6 +39,13 @@ Options:
default is time_test
-h <num> default process heap size
-a <num> async thread pool size (default is 0)
+ -t <run time> The runtime of the test
+ Format: <value>[unit], where unit can be:
+ s: seconds
+ m: minutes (default)
+ h: hours
+ If no unit is provided, minutes is assumed.
+ defaults to 10 minutes
-f <factor> normally the test is run with 16 processes
(factor 1), one for each codec config. The test
can however be run with other factors, e.g.
@@ -78,6 +85,7 @@ STARTF="start"
FACTOR=""
MSG_PACK=time_test
SBT="+sbt tnnps"
+RT=10
while test $# != 0; do
# echo "DBG: Value = $1"
@@ -98,6 +106,10 @@ while test $# != 0; do
ATP="+A $2";
shift ; shift ;;
+ -t)
+ RT="$2";
+ shift ; shift ;;
+
-d)
case $2 in
std)
@@ -162,23 +174,17 @@ done
if [ $TYPE = factor ]; then
- MSTONE="-s $MODULE $STARTF $MSG_PACK $FACTOR"
+ MSTONE="-s $MODULE $STARTF $MSG_PACK $RT $FACTOR"
- # SCHEDS="no_smp 01 02 04"
- # SCHEDS="no_smp 01 02 04 08"
- # SCHEDS="no_smp 01 02 04 08 16"
- # SCHEDS="no_smp 01 02 04 08 16 32"
- # SCHEDS="no_smp 01 02 04 08 16 32 64"
- SCHEDS="no_smp 01 02 03 04 05 06 07 08"
+ # SCHEDS="01 02 04"
+ # SCHEDS="01 02 04 08"
+ # SCHEDS="01 02 04 08 16"
+ # SCHEDS="01 02 04 08 16 32"
+ # SCHEDS="01 02 04 08 16 32 64"
+ SCHEDS="01 02 03 04 05 06 07 08"
for i in `echo $SCHEDS`; do
case $i in
- no_smp)
- SMP_INFO="No SMP"
- SMP_OPTS="-smp disable" # THIS IS THE R12B WAY TO DISABLE SMP
- LOG="mstone1-f$FACTOR-s00.log"
- ;;
-
01)
SMP_INFO="SMP: 1 scheduler"
SMP_OPTS="-smp +S $i"
@@ -214,7 +220,7 @@ if [ $TYPE = factor ]; then
elif [ $TYPE = sched ]; then
- MSTONE="-s $MODULE $STARTF $MSG_PACK"
+ MSTONE="-s $MODULE $STARTF $MSG_PACK $RT"
# FACTORS="01 02 03 04"
# FACTORS="01 02 03 04 05 06 07 08 09 10"
@@ -222,10 +228,6 @@ elif [ $TYPE = sched ]; then
# FACTORS="001 010 100"
case $SCHED in
- no_smp)
- SMP_OPTS="-smp disable" # THIS IS THE R12B WAY TO DISABLE SMP
- ;;
-
*)
SMP_OPTS="-smp +S $SCHED"
;;
diff --git a/lib/megaco/src/flex/megaco_flex_scanner.erl b/lib/megaco/src/flex/megaco_flex_scanner.erl
index ef94594a8e..67c6a2b5a4 100644
--- a/lib/megaco/src/flex/megaco_flex_scanner.erl
+++ b/lib/megaco/src/flex/megaco_flex_scanner.erl
@@ -31,9 +31,11 @@
-define(SCHED_ID(), erlang:system_info(scheduler_id)).
-define(SMP_SUPPORT_DEFAULT(), erlang:system_info(smp_support)).
+-dialyzer({nowarn_function, is_enabled/0}).
is_enabled() ->
(true =:= ?ENABLE_MEGACO_FLEX_SCANNER).
-
+
+-dialyzer({nowarn_function, is_reentrant_enabled/0}).
is_reentrant_enabled() ->
(true =:= ?MEGACO_REENTRANT_FLEX_SCANNER).
diff --git a/lib/megaco/test/megaco_trans_test.erl b/lib/megaco/test/megaco_trans_test.erl
index 37bc134c8d..f88b163c0a 100644
--- a/lib/megaco/test/megaco_trans_test.erl
+++ b/lib/megaco/test/megaco_trans_test.erl
@@ -490,8 +490,15 @@ single_trans_req(Config) when is_list(Config) ->
d("[MGC] start the simulation"),
{ok, MgcId} = megaco_test_megaco_generator:exec(Mgc, MgcEvSeq),
- i("wait some time before starting the MG simulator"),
- sleep(1000),
+ %% i("wait some time before starting the MG simulator"),
+ %% sleep(1000),
+
+ i("await MGC ready announcement"),
+ receive
+ announce_mgc ->
+ i("received MGC ready announcement"),
+ ok
+ end,
d("[MG] start the simulator (generator)"),
{ok, Mg} = megaco_test_megaco_generator:start_link("MG", MgNode),
@@ -544,6 +551,7 @@ single_trans_req(Config) when is_list(Config) ->
-endif.
str_mgc_event_sequence(text, tcp) ->
+ CTRL = self(),
Mid = {deviceName,"ctrl"},
RI = [
{port, 2944},
@@ -555,10 +563,6 @@ str_mgc_event_sequence(text, tcp) ->
ServiceChangeReqVerify = ?str_mgc_service_change_req_verify_fun(Mid),
NotifyReqVerify = ?str_mgc_notify_req_verify_fun(),
DiscoVerify = ?str_mgc_disco_verify_fun(),
-%% ConnectVerify = fun str_mgc_verify_handle_connect/1,
-%% ServiceChangeReqVerify = str_mgc_verify_service_change_req_fun(Mid),
-%% NotifyReqVerify = str_mgc_verify_notify_request_fun(),
-%% DiscoVerify = fun str_mgc_verify_handle_disconnect/1,
EvSeq = [
{debug, false},
{megaco_trace, disable},
@@ -566,6 +570,10 @@ str_mgc_event_sequence(text, tcp) ->
{megaco_start_user, Mid, RI, []},
start_transport,
listen,
+
+ %% ANNOUNCE READY
+ {trigger, fun() -> CTRL ! announce_mgc end},
+
{megaco_callback, handle_connect, ConnectVerify},
{megaco_callback, handle_trans_request, ServiceChangeReqVerify},
{megaco_callback, handle_trans_request, NotifyReqVerify},
@@ -762,9 +770,6 @@ str_mg_event_sequence(text, tcp) ->
ConnectVerify = ?str_mg_connect_verify_fun(),
ServiceChangeReplyVerify = ?str_mg_service_change_reply_verify_fun(),
NotifyReplyVerify = ?str_mg_notify_reply_verify_fun(),
- %% ConnectVerify = fun str_mg_verify_handle_connect/1,
- %% ServiceChangeReplyVerify = fun str_mg_verify_service_change_reply/1,
- %% NotifyReplyVerify = fun str_mg_verify_notify_reply/1,
EvSeq = [
{debug, true},
megaco_start,
@@ -924,8 +929,15 @@ multi_trans_req_timeout(Config) when is_list(Config) ->
d("[MGC] start the simulation"),
{ok, MgcId} = megaco_test_megaco_generator:exec(Mgc, MgcEvSeq),
- i("wait some time before starting the MG simulator"),
- sleep(1000),
+ %% i("wait some time before starting the MG simulator"),
+ %% sleep(1000),
+
+ i("await MGC ready announcement"),
+ receive
+ announce_mgc ->
+ i("received MGC ready announcement"),
+ ok
+ end,
d("[MG] start the simulator (generator)"),
{ok, Mg} = megaco_test_megaco_generator:start_link("MG", MgNode),
@@ -978,6 +990,7 @@ multi_trans_req_timeout(Config) when is_list(Config) ->
-endif.
mtrt_mgc_event_sequence(text, tcp) ->
+ CTRL = self(),
Mid = {deviceName,"ctrl"},
RI = [
{port, 2944},
@@ -989,10 +1002,6 @@ mtrt_mgc_event_sequence(text, tcp) ->
ServiceChangeReqVerify = ?mtrt_mgc_verify_service_change_req_fun(Mid),
NotifyReqVerify = ?mtrt_mgc_verify_notify_req_fun(),
DiscoVerify = ?mtrt_mgc_verify_handle_disconnect_fun(),
-%% ConnectVerify = fun mtrt_mgc_verify_handle_connect/1,
-%% ServiceChangeReqVerify = mtrt_mgc_verify_service_change_req_fun(Mid),
-%% NotifyReqVerify = mtrt_mgc_verify_notify_request_fun(),
-%% DiscoVerify = fun mtrt_mgc_verify_handle_disconnect/1,
EvSeq = [
{debug, true},
{megaco_trace, disable},
@@ -1000,14 +1009,18 @@ mtrt_mgc_event_sequence(text, tcp) ->
{megaco_start_user, Mid, RI, []},
start_transport,
listen,
- {megaco_callback, handle_connect, ConnectVerify},
+
+ %% ANNOUNCE READY
+ {trigger, fun() -> CTRL ! announce_mgc end},
+
+ {megaco_callback, handle_connect, ConnectVerify},
{megaco_callback, handle_trans_request, ServiceChangeReqVerify},
{megaco_callback, handle_trans_request, NotifyReqVerify},
{megaco_callback, handle_trans_request, NotifyReqVerify},
{megaco_callback, handle_trans_request, NotifyReqVerify},
{megaco_callback, handle_trans_request, NotifyReqVerify},
{megaco_callback, handle_trans_request, NotifyReqVerify},
- {megaco_callback, handle_disconnect, DiscoVerify},
+ {megaco_callback, handle_disconnect, DiscoVerify},
{sleep, 1000},
megaco_stop_user,
megaco_stop
@@ -1370,8 +1383,15 @@ multi_trans_req_maxcount1(Config) when is_list(Config) ->
d("[MGC] start the simulation"),
{ok, MgcId} = megaco_test_megaco_generator:exec(Mgc, MgcEvSeq),
- i("wait some time before starting the MG simulator"),
- sleep(1000),
+ %% i("wait some time before starting the MG simulator"),
+ %% sleep(1000),
+
+ i("await MGC ready announcement"),
+ receive
+ announce_mgc ->
+ i("received MGC ready announcement"),
+ ok
+ end,
d("[MG] start the simulator (generator)"),
{ok, Mg} = megaco_test_megaco_generator:start_link("MG", MgNode),
@@ -1424,6 +1444,7 @@ multi_trans_req_maxcount1(Config) when is_list(Config) ->
-endif.
mtrmc1_mgc_event_sequence(text, tcp) ->
+ CTRL = self(),
Mid = {deviceName,"ctrl"},
RI = [
{port, 2944},
@@ -1435,10 +1456,6 @@ mtrmc1_mgc_event_sequence(text, tcp) ->
ServiceChangeReqVerify = ?mtrmc1_mgc_verify_service_change_req_fun(Mid),
NotifyReqVerify = ?mtrmc1_mgc_verify_notify_req_fun(),
DiscoVerify = ?mtrmc1_mgc_verify_handle_disconnect_fun(),
-%% ConnectVerify = fun mtrmc1_mgc_verify_handle_connect/1,
-%% ServiceChangeReqVerify = mtrmc1_mgc_verify_service_change_req_fun(Mid),
-%% NotifyReqVerify = mtrmc1_mgc_verify_notify_request_fun(),
-%% DiscoVerify = fun mtrmc1_mgc_verify_handle_disconnect/1,
EvSeq = [
{debug, true},
{megaco_trace, disable},
@@ -1446,14 +1463,18 @@ mtrmc1_mgc_event_sequence(text, tcp) ->
{megaco_start_user, Mid, RI, []},
start_transport,
listen,
- {megaco_callback, handle_connect, ConnectVerify},
+
+ %% ANNOUNCE READY
+ {trigger, fun() -> CTRL ! announce_mgc end},
+
+ {megaco_callback, handle_connect, ConnectVerify},
{megaco_callback, handle_trans_request, ServiceChangeReqVerify},
{megaco_callback, handle_trans_request, NotifyReqVerify},
{megaco_callback, handle_trans_request, NotifyReqVerify},
{megaco_callback, handle_trans_request, NotifyReqVerify},
{megaco_callback, handle_trans_request, NotifyReqVerify},
{megaco_callback, handle_trans_request, NotifyReqVerify},
- {megaco_callback, handle_disconnect, DiscoVerify},
+ {megaco_callback, handle_disconnect, DiscoVerify},
{sleep, 1000},
megaco_stop_user,
megaco_stop
@@ -1643,9 +1664,6 @@ mtrmc1_mg_event_sequence(text, tcp) ->
ConnectVerify = ?mtrmc1_mg_verify_handle_connect_fun(),
ServiceChangeReplyVerify = ?mtrmc1_mg_verify_service_change_reply_fun(),
NotifyReplyVerify = ?mtrmc1_mg_verify_notify_reply_fun(),
-%% ConnectVerify = fun mtrmc1_mg_verify_handle_connect/1,
-%% ServiceChangeReplyVerify = fun mtrmc1_mg_verify_service_change_reply/1,
-%% NotifyReplyVerify = fun mtrmc1_mg_verify_notify_reply/1,
EvSeq = [
{debug, true},
megaco_start,
@@ -1822,8 +1840,15 @@ multi_trans_req_maxcount2(Config) when is_list(Config) ->
d("[MGC] start the simulation"),
{ok, MgcId} = megaco_test_megaco_generator:exec(Mgc, MgcEvSeq),
- i("wait some time before starting the MG simulator"),
- sleep(1000),
+ %% i("wait some time before starting the MG simulator"),
+ %% sleep(1000),
+
+ i("await MGC ready announcement"),
+ receive
+ announce_mgc ->
+ i("received MGC ready announcement"),
+ ok
+ end,
d("[MG] start the simulator (generator)"),
{ok, Mg} = megaco_test_megaco_generator:start_link("MG", MgNode),
@@ -1876,6 +1901,7 @@ multi_trans_req_maxcount2(Config) when is_list(Config) ->
-endif.
mtrmc2_mgc_event_sequence(text, tcp) ->
+ CTRL = self(),
Mid = {deviceName,"ctrl"},
RI = [
{port, 2944},
@@ -1887,10 +1913,6 @@ mtrmc2_mgc_event_sequence(text, tcp) ->
ServiceChangeReqVerify = ?mtrmc2_mgc_verify_service_change_req_fun(Mid),
NotifyReqVerify = ?mtrmc2_mgc_verify_notify_req_fun(),
DiscoVerify = ?mtrmc2_mgc_verify_handle_disconnect_fun(),
-%% ConnectVerify = fun mtrmc2_mgc_verify_handle_connect/1,
-%% ServiceChangeReqVerify = mtrmc2_mgc_verify_service_change_req_fun(Mid),
-%% NotifyReqVerify = mtrmc2_mgc_verify_notify_request_fun(),
-%% DiscoVerify = fun mtrmc2_mgc_verify_handle_disconnect/1,
EvSeq = [
{debug, true},
{megaco_trace, disable},
@@ -1898,6 +1920,10 @@ mtrmc2_mgc_event_sequence(text, tcp) ->
{megaco_start_user, Mid, RI, []},
start_transport,
listen,
+
+ %% ANNOUNCE READY
+ {trigger, fun() -> CTRL ! announce_mgc end},
+
{megaco_callback, handle_connect, ConnectVerify},
{megaco_callback, handle_trans_request, ServiceChangeReqVerify},
{megaco_callback, handle_trans_request, NotifyReqVerify},
@@ -2121,9 +2147,6 @@ mtrmc2_mg_event_sequence(text, tcp) ->
ConnectVerify = ?mtrmc2_mg_verify_handle_connect_fun(),
ServiceChangeReplyVerify = ?mtrmc2_mg_verify_service_change_reply_fun(),
NotifyReplyVerify = ?mtrmc2_mg_verify_notify_reply_fun(),
-%% ConnectVerify = fun mtrmc2_mg_verify_handle_connect/1,
-%% ServiceChangeReplyVerify = fun mtrmc2_mg_verify_service_change_reply/1,
-%% NotifyReplyVerify = fun mtrmc2_mg_verify_notify_reply/1,
EvSeq = [
{debug, true},
megaco_start,
@@ -2326,8 +2349,15 @@ multi_trans_req_maxsize1(Config) when is_list(Config) ->
d("[MGC] start the simulation"),
{ok, MgcId} = megaco_test_megaco_generator:exec(Mgc, MgcEvSeq),
- i("wait some time before starting the MG simulator"),
- sleep(1000),
+ %% i("wait some time before starting the MG simulator"),
+ %% sleep(1000),
+
+ i("await MGC ready announcement"),
+ receive
+ announce_mgc ->
+ i("received MGC ready announcement"),
+ ok
+ end,
d("[MG] start the simulator (generator)"),
{ok, Mg} = megaco_test_megaco_generator:start_link("MG", MgNode),
@@ -2380,6 +2410,7 @@ multi_trans_req_maxsize1(Config) when is_list(Config) ->
-endif.
mtrms1_mgc_event_sequence(text, tcp) ->
+ CTRL = self(),
Mid = {deviceName,"ctrl"},
RI = [
{port, 2944},
@@ -2391,10 +2422,6 @@ mtrms1_mgc_event_sequence(text, tcp) ->
ServiceChangeReqVerify = ?mtrms1_mgc_verify_service_change_req_fun(Mid),
NotifyReqVerify = ?mtrms1_mgc_verify_notify_req_fun(),
DiscoVerify = ?mtrms1_mgc_verify_handle_disconnect_fun(),
-%% ConnectVerify = fun mtrms1_mgc_verify_handle_connect/1,
-%% ServiceChangeReqVerify = mtrms1_mgc_verify_service_change_req_fun(Mid),
-%% NotifyReqVerify1 = mtrms1_mgc_verify_notify_request_fun1(),
-%% DiscoVerify = fun mtrms1_mgc_verify_handle_disconnect/1,
EvSeq = [
{debug, true},
{megaco_trace, disable},
@@ -2402,6 +2429,10 @@ mtrms1_mgc_event_sequence(text, tcp) ->
{megaco_start_user, Mid, RI, []},
start_transport,
listen,
+
+ %% ANNOUNCE READY
+ {trigger, fun() -> CTRL ! announce_mgc end},
+
{megaco_callback, handle_connect, ConnectVerify},
{megaco_callback, handle_trans_request, ServiceChangeReqVerify},
{megaco_callback, handle_trans_request, NotifyReqVerify},
@@ -2602,9 +2633,6 @@ mtrms1_mg_event_sequence(text, tcp) ->
ConnectVerify = ?mtrms1_mg_verify_handle_connect_fun(),
ServiceChangeReplyVerify = ?mtrms1_mg_verify_service_change_reply_fun(),
NotifyReplyVerify = ?mtrms1_mg_verify_notify_reply_fun(),
-%% ConnectVerify = fun mtrms1_mg_verify_handle_connect/1,
-%% ServiceChangeReplyVerify = fun mtrms1_mg_verify_service_change_reply/1,
-%% NotifyReplyVerify = fun mtrms1_mg_verify_notify_reply/1,
EvSeq = [
{debug, true},
megaco_start,
@@ -2776,8 +2804,15 @@ multi_trans_req_maxsize2(Config) when is_list(Config) ->
d("[MGC] start the simulation"),
{ok, MgcId} = megaco_test_megaco_generator:exec(Mgc, MgcEvSeq),
- i("wait some time before starting the MG simulator"),
- sleep(1000),
+ %% i("wait some time before starting the MG simulator"),
+ %% sleep(1000),
+
+ i("await MGC ready announcement"),
+ receive
+ announce_mgc ->
+ i("received MGC ready announcement"),
+ ok
+ end,
d("[MG] start the simulator (generator)"),
{ok, Mg} = megaco_test_megaco_generator:start_link("MG", MgNode),
@@ -2830,6 +2865,7 @@ multi_trans_req_maxsize2(Config) when is_list(Config) ->
-endif.
mtrms2_mgc_event_sequence(text, tcp) ->
+ CTRL = self(),
Mid = {deviceName,"ctrl"},
RI = [
{port, 2944},
@@ -2841,10 +2877,6 @@ mtrms2_mgc_event_sequence(text, tcp) ->
ServiceChangeReqVerify = ?mtrms2_mgc_verify_service_change_req_fun(Mid),
NotifyReqVerify = ?mtrms2_mgc_verify_notify_req_fun(),
DiscoVerify = ?mtrms2_mgc_verify_handle_disconnect_fun(),
-%% ConnectVerify = fun mtrms2_mgc_verify_handle_connect/1,
-%% ServiceChangeReqVerify = mtrms2_mgc_verify_service_change_req_fun(Mid),
-%% NotifyReqVerify = mtrms2_mgc_verify_notify_request_fun(),
-%% DiscoVerify = fun mtrms2_mgc_verify_handle_disconnect/1,
EvSeq = [
{debug, true},
{megaco_trace, disable},
@@ -2852,6 +2884,10 @@ mtrms2_mgc_event_sequence(text, tcp) ->
{megaco_start_user, Mid, RI, []},
start_transport,
listen,
+
+ %% ANNOUNCE READY
+ {trigger, fun() -> CTRL ! announce_mgc end},
+
{megaco_callback, handle_connect, ConnectVerify},
{megaco_callback, handle_trans_request, ServiceChangeReqVerify},
{megaco_callback, handle_trans_request, NotifyReqVerify},
@@ -3071,9 +3107,6 @@ mtrms2_mg_event_sequence(text, tcp) ->
ConnectVerify = ?mtrms2_mg_verify_handle_connect_fun(),
ServiceChangeReplyVerify = ?mtrms2_mg_verify_service_change_reply_fun(),
NotifyReplyVerify = ?mtrms2_mg_verify_notify_reply_fun(),
-%% ConnectVerify = fun mtrms2_mg_verify_handle_connect/1,
-%% ServiceChangeReplyVerify = fun mtrms2_mg_verify_service_change_reply/1,
-%% NotifyReplyVerify = fun mtrms2_mg_verify_notify_reply/1,
EvSeq = [
{debug, true},
megaco_start,
@@ -3268,8 +3301,15 @@ single_trans_req_and_ack(Config) when is_list(Config) ->
d("[MGC] start the simulation"),
{ok, MgcId} = megaco_test_megaco_generator:exec(Mgc, MgcEvSeq),
- i("wait some time before starting the MG simulator"),
- sleep(1000),
+ %% i("wait some time before starting the MG simulator"),
+ %% sleep(1000),
+
+ i("await MGC ready announcement"),
+ receive
+ announce_mgc ->
+ i("received MGC ready announcement"),
+ ok
+ end,
d("[MG] start the simulator (generator)"),
{ok, Mg} = megaco_test_megaco_generator:start_link("MG", MgNode),
@@ -3326,6 +3366,7 @@ single_trans_req_and_ack(Config) when is_list(Config) ->
-endif.
straa_mgc_event_sequence(text, tcp) ->
+ CTRL = self(),
Mid = {deviceName,"ctrl"},
RI = [
{port, 2944},
@@ -3338,11 +3379,6 @@ straa_mgc_event_sequence(text, tcp) ->
NotifyReqVerify = ?straa_mgc_verify_notify_req_fun(),
AckVerify = ?straa_mgc_verify_ack_fun(),
DiscoVerify = ?straa_mgc_verify_handle_disconnect_fun(),
-%% ConnectVerify = fun straa_mgc_verify_handle_connect/1,
-%% ServiceChangeReqVerify = straa_mgc_verify_service_change_req_fun(Mid),
-%% NotifyReqVerify = straa_mgc_verify_notify_request_fun(),
-%% AckVerify = fun straa_mgc_verify_ack/1,
-%% DiscoVerify = fun straa_mgc_verify_handle_disconnect/1,
EvSeq = [
{debug, true},
{megaco_trace, disable},
@@ -3350,6 +3386,10 @@ straa_mgc_event_sequence(text, tcp) ->
{megaco_start_user, Mid, RI, []},
start_transport,
listen,
+
+ %% ANNOUNCE READY
+ {trigger, fun() -> CTRL ! announce_mgc end},
+
{megaco_callback, handle_connect, ConnectVerify},
{megaco_callback, handle_trans_request, ServiceChangeReqVerify},
{megaco_callback, handle_trans_request, NotifyReqVerify},
@@ -3571,9 +3611,6 @@ straa_mg_event_sequence(text, tcp) ->
ConnectVerify = ?straa_mg_verify_handle_connect_fun(),
ServiceChangeReplyVerify = ?straa_mg_verify_service_change_reply_fun(),
NotifyReplyVerify = ?straa_mg_verify_notify_reply_fun(),
-%% ConnectVerify = fun straa_mg_verify_handle_connect/1,
-%% ServiceChangeReplyVerify = fun straa_mg_verify_service_change_reply/1,
-%% NotifyReplyVerify = fun straa_mg_verify_notify_reply/1,
EvSeq = [
{debug, true},
megaco_start,
@@ -3747,8 +3784,15 @@ multi_trans_req_and_ack_timeout(Config) when is_list(Config) ->
d("[MGC] start the simulation"),
{ok, MgcId} = megaco_test_megaco_generator:exec(Mgc, MgcEvSeq),
- i("wait some time before starting the MG simulator"),
- sleep(1000),
+ %% i("wait some time before starting the MG simulator"),
+ %% sleep(1000),
+
+ i("await MGC ready announcement"),
+ receive
+ announce_mgc ->
+ i("received MGC ready announcement"),
+ ok
+ end,
d("[MG] start the simulator (generator)"),
{ok, Mg} = megaco_test_megaco_generator:start_link("MG", MgNode),
@@ -3805,6 +3849,7 @@ multi_trans_req_and_ack_timeout(Config) when is_list(Config) ->
-endif.
mtrtaat_mgc_event_sequence(text, tcp) ->
+ CTRL = self(),
Mid = {deviceName,"ctrl"},
RI = [
{port, 2944},
@@ -3817,11 +3862,6 @@ mtrtaat_mgc_event_sequence(text, tcp) ->
NotifyReqVerify = ?mtrtaat_mgc_verify_notify_req_fun(),
AckVerify = ?mtrtaat_mgc_verify_ack_fun(),
DiscoVerify = ?mtrtaat_mgc_verify_handle_disconnect_fun(),
-%% ConnectVerify = fun mtrtaat_mgc_verify_handle_connect/1,
-%% ServiceChangeReqVerify = mtrtaat_mgc_verify_service_change_req_fun(Mid),
-%% NotifyReqVerify = mtrtaat_mgc_verify_notify_request_fun(),
-%% AckVerify = fun mtrtaat_mgc_verify_ack/1,
-%% DiscoVerify = fun mtrtaat_mgc_verify_handle_disconnect/1,
EvSeq = [
{debug, true},
{megaco_trace, disable},
@@ -3829,6 +3869,10 @@ mtrtaat_mgc_event_sequence(text, tcp) ->
{megaco_start_user, Mid, RI, []},
start_transport,
listen,
+
+ %% ANNOUNCE READY
+ {trigger, fun() -> CTRL ! announce_mgc end},
+
{megaco_callback, handle_connect, ConnectVerify},
{megaco_callback, handle_trans_request, ServiceChangeReqVerify},
{megaco_callback, handle_trans_request, NotifyReqVerify},
@@ -4056,9 +4100,6 @@ mtrtaat_mg_event_sequence(text, tcp) ->
ConnectVerify = ?mtrtaat_mg_verify_handle_connect_fun(),
ServiceChangeReplyVerify = ?mtrtaat_mg_verify_service_change_reply_fun(),
NotifyReplyVerify = ?mtrtaat_mg_verify_notify_reply_fun(),
-%% ConnectVerify = fun mtrtaat_mg_verify_handle_connect/1,
-%% ServiceChangeReplyVerify = fun mtrtaat_mg_verify_service_change_reply/1,
-%% NotifyReplyVerify = fun mtrtaat_mg_verify_notify_reply/1,
EvSeq = [
{debug, true},
megaco_start,
@@ -4236,8 +4277,15 @@ multi_trans_req_and_ack_ackmaxcount(Config) when is_list(Config) ->
d("[MGC] start the simulation"),
{ok, MgcId} = megaco_test_megaco_generator:exec(Mgc, MgcEvSeq),
- i("wait some time before starting the MG simulator"),
- sleep(1000),
+ %% i("wait some time before starting the MG simulator"),
+ %% sleep(1000),
+
+ i("await MGC ready announcement"),
+ receive
+ announce_mgc ->
+ i("received MGC ready announcement"),
+ ok
+ end,
d("[MG] start the simulator (generator)"),
{ok, Mg} = megaco_test_megaco_generator:start_link("MG", MgNode),
@@ -4294,6 +4342,7 @@ multi_trans_req_and_ack_ackmaxcount(Config) when is_list(Config) ->
-endif.
mtrtaaamc_mgc_event_sequence(text, tcp) ->
+ CTRL = self(),
Mid = {deviceName,"ctrl"},
RI = [
{port, 2944},
@@ -4306,11 +4355,6 @@ mtrtaaamc_mgc_event_sequence(text, tcp) ->
NotifyReqVerify = ?mtrtaaamc_mgc_verify_notify_req_fun(),
AckVerify = ?mtrtaaamc_mgc_verify_ack_fun(),
DiscoVerify = ?mtrtaaamc_mgc_verify_handle_disconnect_fun(),
-%% ConnectVerify = fun mtrtaaamc_mgc_verify_handle_connect/1,
-%% ServiceChangeReqVerify = mtrtaaamc_mgc_verify_service_change_req_fun(Mid),
-%% NotifyReqVerify = mtrtaaamc_mgc_verify_notify_request_fun(),
-%% AckVerify = fun mtrtaaamc_mgc_verify_ack/1,
-%% DiscoVerify = fun mtrtaaamc_mgc_verify_handle_disconnect/1,
EvSeq = [
{debug, true},
{megaco_trace, disable},
@@ -4318,6 +4362,10 @@ mtrtaaamc_mgc_event_sequence(text, tcp) ->
{megaco_start_user, Mid, RI, []},
start_transport,
listen,
+
+ %% ANNOUNCE READY
+ {trigger, fun() -> CTRL ! announce_mgc end},
+
{megaco_callback, handle_connect, ConnectVerify},
{megaco_callback, handle_trans_request, ServiceChangeReqVerify},
{megaco_callback, handle_trans_request, NotifyReqVerify},
@@ -4550,9 +4598,6 @@ mtrtaaamc_mg_event_sequence(text, tcp) ->
ConnectVerify = ?mtrtaaamc_mg_verify_handle_connect_fun(),
ServiceChangeReplyVerify = ?mtrtaaamc_mg_verify_service_change_reply_fun(),
NotifyReplyVerify = ?mtrtaaamc_mg_verify_notify_reply_fun(),
-%% ConnectVerify = fun mtrtaaamc_mg_verify_handle_connect/1,
-%% ServiceChangeReplyVerify = fun mtrtaaamc_mg_verify_service_change_reply/1,
-%% NotifyReplyVerify = fun mtrtaaamc_mg_verify_notify_reply/1,
EvSeq = [
{debug, true},
megaco_start,
@@ -4732,8 +4777,15 @@ multi_trans_req_and_ack_reqmaxcount(Config) when is_list(Config) ->
d("[MGC] start the simulation"),
{ok, MgcId} = megaco_test_megaco_generator:exec(Mgc, MgcEvSeq),
- i("wait some time before starting the MG simulator"),
- sleep(1000),
+ %% i("wait some time before starting the MG simulator"),
+ %% sleep(1000),
+
+ i("await MGC ready announcement"),
+ receive
+ announce_mgc ->
+ i("received MGC ready announcement"),
+ ok
+ end,
d("[MG] start the simulator (generator)"),
{ok, Mg} = megaco_test_megaco_generator:start_link("MG", MgNode),
@@ -4790,6 +4842,7 @@ multi_trans_req_and_ack_reqmaxcount(Config) when is_list(Config) ->
-endif.
mtrtaarac_mgc_event_sequence(text, tcp) ->
+ CTRL = self(),
Mid = {deviceName,"ctrl"},
RI = [
{port, 2944},
@@ -4802,11 +4855,6 @@ mtrtaarac_mgc_event_sequence(text, tcp) ->
NotifyReqVerify = ?mtrtaarac_mgc_verify_notify_req_fun(),
AckVerify = ?mtrtaarac_mgc_verify_ack_fun(),
DiscoVerify = ?mtrtaarac_mgc_verify_handle_disconnect_fun(),
-%% ConnectVerify = fun mtrtaarac_mgc_verify_handle_connect/1,
-%% ServiceChangeReqVerify = mtrtaarac_mgc_verify_service_change_req_fun(Mid),
-%% NotifyReqVerify = mtrtaarac_mgc_verify_notify_request_fun(),
-%% AckVerify = fun mtrtaarac_mgc_verify_ack/1,
-%% DiscoVerify = fun mtrtaarac_mgc_verify_handle_disconnect/1,
EvSeq = [
{debug, true},
{megaco_trace, disable},
@@ -4814,6 +4862,10 @@ mtrtaarac_mgc_event_sequence(text, tcp) ->
{megaco_start_user, Mid, RI, []},
start_transport,
listen,
+
+ %% ANNOUNCE READY
+ {trigger, fun() -> CTRL ! announce_mgc end},
+
{megaco_callback, handle_connect, ConnectVerify},
{megaco_callback, handle_trans_request, ServiceChangeReqVerify},
{megaco_callback, handle_trans_request, NotifyReqVerify},
@@ -5045,9 +5097,6 @@ mtrtaarac_mg_event_sequence(text, tcp) ->
ConnectVerify = ?mtrtaarac_mg_verify_handle_connect_fun(),
ServiceChangeReplyVerify = ?mtrtaarac_mg_verify_service_change_reply_fun(),
NotifyReplyVerify = ?mtrtaarac_mg_verify_notify_reply_fun(),
-%% ConnectVerify = fun mtrtaarac_mg_verify_handle_connect/1,
-%% ServiceChangeReplyVerify = fun mtrtaarac_mg_verify_service_change_reply/1,
-%% NotifyReplyVerify = fun mtrtaarac_mg_verify_notify_reply/1,
EvSeq = [
{debug, true},
megaco_start,
@@ -5229,8 +5278,15 @@ multi_trans_req_and_ack_maxsize1(Config) when is_list(Config) ->
d("[MGC] start the simulation"),
{ok, MgcId} = megaco_test_megaco_generator:exec(Mgc, MgcEvSeq),
- i("wait some time before starting the MG simulator"),
- sleep(1000),
+ %% i("wait some time before starting the MG simulator"),
+ %% sleep(1000),
+
+ i("await MGC ready announcement"),
+ receive
+ announce_mgc ->
+ i("received MGC ready announcement"),
+ ok
+ end,
d("[MG] start the simulator (generator)"),
{ok, Mg} = megaco_test_megaco_generator:start_link("MG", MgNode),
@@ -5287,6 +5343,7 @@ multi_trans_req_and_ack_maxsize1(Config) when is_list(Config) ->
-endif.
mtrtaams1_mgc_event_sequence(text, tcp) ->
+ CTRL = self(),
Mid = {deviceName,"ctrl"},
RI = [
{port, 2944},
@@ -5299,11 +5356,6 @@ mtrtaams1_mgc_event_sequence(text, tcp) ->
NotifyReqVerify = ?mtrtaams1_mgc_verify_notify_req_fun(),
AckVerify = ?mtrtaams1_mgc_verify_ack_fun(),
DiscoVerify = ?mtrtaams1_mgc_verify_handle_disconnect_fun(),
-%% ConnectVerify = fun mtrtaams1_mgc_verify_handle_connect/1,
-%% ServiceChangeReqVerify = mtrtaams1_mgc_verify_service_change_req_fun(Mid),
-%% NotifyReqVerify = mtrtaams1_mgc_verify_notify_request_fun(),
-%% AckVerify = fun mtrtaams1_mgc_verify_ack/1,
-%% DiscoVerify = fun mtrtaams1_mgc_verify_handle_disconnect/1,
EvSeq = [
{debug, true},
{megaco_trace, disable},
@@ -5311,6 +5363,10 @@ mtrtaams1_mgc_event_sequence(text, tcp) ->
{megaco_start_user, Mid, RI, []},
start_transport,
listen,
+
+ %% ANNOUNCE READY
+ {trigger, fun() -> CTRL ! announce_mgc end},
+
{megaco_callback, handle_connect, ConnectVerify},
{megaco_callback, handle_trans_request, ServiceChangeReqVerify},
{megaco_callback, handle_trans_request, NotifyReqVerify},
@@ -5542,9 +5598,6 @@ mtrtaams1_mg_event_sequence(text, tcp) ->
ConnectVerify = ?mtrtaams1_mg_verify_handle_connect_fun(),
ServiceChangeReplyVerify = ?mtrtaams1_mg_verify_service_change_reply_fun(),
NotifyReplyVerify = ?mtrtaams1_mg_verify_notify_reply_fun(),
-%% ConnectVerify = fun mtrtaams1_mg_verify_handle_connect/1,
-%% ServiceChangeReplyVerify = fun mtrtaams1_mg_verify_service_change_reply/1,
-%% NotifyReplyVerify = fun mtrtaams1_mg_verify_notify_reply/1,
EvSeq = [
{debug, true},
megaco_start,
@@ -5723,8 +5776,15 @@ multi_trans_req_and_ack_maxsize2(Config) when is_list(Config) ->
d("[MGC] start the simulation"),
{ok, MgcId} = megaco_test_megaco_generator:exec(Mgc, MgcEvSeq),
- i("wait some time before starting the MG simulator"),
- sleep(1000),
+ %% i("wait some time before starting the MG simulator"),
+ %% sleep(1000),
+
+ i("await MGC ready announcement"),
+ receive
+ announce_mgc ->
+ i("received MGC ready announcement"),
+ ok
+ end,
d("[MG] start the simulator (generator)"),
{ok, Mg} = megaco_test_megaco_generator:start_link("MG", MgNode),
@@ -5781,6 +5841,7 @@ multi_trans_req_and_ack_maxsize2(Config) when is_list(Config) ->
-endif.
mtrtaams2_mgc_event_sequence(text, tcp) ->
+ CTRL = self(),
Mid = {deviceName,"ctrl"},
RI = [
{port, 2944},
@@ -5793,11 +5854,6 @@ mtrtaams2_mgc_event_sequence(text, tcp) ->
NotifyReqVerify = ?mtrtaams2_mgc_verify_notify_req_fun(),
AckVerify = ?mtrtaams2_mgc_verify_ack_fun(),
DiscoVerify = ?mtrtaams2_mgc_verify_handle_disconnect_fun(),
-%% ConnectVerify = fun mtrtaams2_mgc_verify_handle_connect/1,
-%% ServiceChangeReqVerify = mtrtaams2_mgc_verify_service_change_req_fun(Mid),
-%% NotifyReqVerify = mtrtaams2_mgc_verify_notify_request_fun(),
-%% AckVerify = fun mtrtaams2_mgc_verify_ack/1,
-%% DiscoVerify = fun mtrtaams2_mgc_verify_handle_disconnect/1,
EvSeq = [
{debug, true},
{megaco_trace, disable},
@@ -5805,6 +5861,10 @@ mtrtaams2_mgc_event_sequence(text, tcp) ->
{megaco_start_user, Mid, RI, []},
start_transport,
{listen, [{serialize, true}]},
+
+ %% ANNOUNCE READY
+ {trigger, fun() -> CTRL ! announce_mgc end},
+
{megaco_callback, handle_connect, ConnectVerify},
{megaco_callback, handle_trans_request, ServiceChangeReqVerify},
{megaco_callback, handle_trans_request, NotifyReqVerify},
@@ -6046,9 +6106,6 @@ mtrtaams2_mg_event_sequence(text, tcp) ->
ConnectVerify = ?mtrtaams2_mg_verify_handle_connect_fun(),
ServiceChangeReplyVerify = ?mtrtaams2_mg_verify_service_change_reply_fun(),
NotifyReplyVerify = ?mtrtaams2_mg_verify_notify_reply_fun(),
-%% ConnectVerify = fun mtrtaams2_mg_verify_handle_connect/1,
-%% ServiceChangeReplyVerify = fun mtrtaams2_mg_verify_service_change_reply/1,
-%% NotifyReplyVerify = fun mtrtaams2_mg_verify_notify_reply/1,
EvSeq = [
{debug, true},
megaco_start,
@@ -6260,8 +6317,15 @@ multi_trans_req_and_ack_and_pending(Config) when is_list(Config) ->
d("[MGC] start the simulation"),
{ok, MgcId} = megaco_test_megaco_generator:exec(Mgc, MgcEvSeq),
- i("wait some time before starting the MG simulator"),
- sleep(1000),
+ %% i("wait some time before starting the MG simulator"),
+ %% sleep(1000),
+
+ i("await MGC ready announcement"),
+ receive
+ announce_mgc ->
+ i("received MGC ready announcement"),
+ ok
+ end,
d("[MG] start the simulator (generator)"),
{ok, Mg} = megaco_test_megaco_generator:start_link("MG", MgNode),
@@ -6322,6 +6386,7 @@ multi_trans_req_and_ack_and_pending(Config) when is_list(Config) ->
-endif.
mtraaap_mgc_event_sequence(text, tcp) ->
+ CTRL = self(),
Mid = {deviceName,"ctrl"},
RI = [
{port, 2944},
@@ -6342,12 +6407,6 @@ mtraaap_mgc_event_sequence(text, tcp) ->
NotifyReplyVerify = ?mtraaap_mgc_verify_notify_reply_fun(),
AckVerify = ?mtraaap_mgc_verify_ack_fun(),
DiscoVerify = ?mtraaap_mgc_verify_handle_disconnect_fun(),
-%% ConnectVerify = fun mtraaap_mgc_verify_handle_connect/1,
-%% ServiceChangeReqVerify = mtraaap_mgc_verify_service_change_req_fun(Mid),
-%% NotifyReqVerify = mtraaap_mgc_verify_notify_request_fun(),
-%% NotifyReplyVerify = fun mtraaap_mgc_verify_notify_reply/1,
-%% AckVerify = fun mtraaap_mgc_verify_ack/1,
-%% DiscoVerify = fun mtraaap_mgc_verify_handle_disconnect/1,
EvSeq = [
{debug, true},
{megaco_trace, disable},
@@ -6355,6 +6414,10 @@ mtraaap_mgc_event_sequence(text, tcp) ->
{megaco_start_user, Mid, RI, []},
start_transport,
listen,
+
+ %% ANNOUNCE READY
+ {trigger, fun() -> CTRL ! announce_mgc end},
+
{megaco_callback, handle_connect, ConnectVerify},
{megaco_callback, handle_trans_request, ServiceChangeReqVerify},
{megaco_callback, handle_trans_request, NotifyReqVerify},
@@ -6605,10 +6668,6 @@ mtraaap_mg_event_sequence(text, tcp) ->
ServiceChangeReplyVerify = ?mtraaap_mg_verify_service_change_reply_fun(),
NotifyReqVerify = ?mtraaap_mg_verify_notify_req_fun(),
NotifyReplyVerify = ?mtraaap_mg_verify_notify_reply_fun(),
-%% ConnectVerify = fun mtraaap_mg_verify_handle_connect/1,
-%% ServiceChangeReplyVerify = fun mtraaap_mg_verify_service_change_reply/1,
-%% NotifyReqVerify = mtraaap_mg_verify_notify_request_fun(),
-%% NotifyReplyVerify = fun mtraaap_mg_verify_notify_reply/1,
EvSeq = [
{debug, true},
megaco_start,
@@ -6846,8 +6905,15 @@ multi_trans_req_and_ack_and_reply(Config) when is_list(Config) ->
d("[MGC] start the simulation"),
{ok, MgcId} = megaco_test_megaco_generator:exec(Mgc, MgcEvSeq),
- i("wait some time before starting the MG simulator"),
- sleep(1000),
+ %% i("wait some time before starting the MG simulator"),
+ %% sleep(1000),
+
+ i("await MGC ready announcement"),
+ receive
+ announce_mgc ->
+ i("received MGC ready announcement"),
+ ok
+ end,
d("[MG] start the simulator (generator)"),
{ok, Mg} = megaco_test_megaco_generator:start_link("MG", MgNode),
@@ -6908,6 +6974,7 @@ multi_trans_req_and_ack_and_reply(Config) when is_list(Config) ->
-endif.
mtraaar_mgc_event_sequence(text, tcp) ->
+ CTRL = self(),
Mid = {deviceName,"ctrl"},
RI = [
{port, 2944},
@@ -6925,12 +6992,6 @@ mtraaar_mgc_event_sequence(text, tcp) ->
NotifyReplyVerify = ?mtraaar_mgc_verify_notify_reply_fun(),
AckVerify = ?mtraaar_mgc_verify_ack_fun(),
DiscoVerify = ?mtraaar_mgc_verify_handle_disconnect_fun(),
-%% ConnectVerify = fun mtraaar_mgc_verify_handle_connect/1,
-%% ServiceChangeReqVerify = mtraaar_mgc_verify_service_change_req_fun(Mid),
-%% NotifyReqVerify = mtraaar_mgc_verify_notify_request_fun(),
-%% NotifyReplyVerify = fun mtraaar_mgc_verify_notify_reply/1,
-%% AckVerify = fun mtraaar_mgc_verify_ack/1,
-%% DiscoVerify = fun mtraaar_mgc_verify_handle_disconnect/1,
EvSeq = [
{debug, true},
%% {megaco_trace, max},
@@ -6939,6 +7000,10 @@ mtraaar_mgc_event_sequence(text, tcp) ->
{megaco_start_user, Mid, RI, []},
start_transport,
listen,
+
+ %% ANNOUNCE READY
+ {trigger, fun() -> CTRL ! announce_mgc end},
+
{megaco_callback, handle_connect, ConnectVerify},
{megaco_callback, handle_trans_request, ServiceChangeReqVerify},
{megaco_callback, handle_trans_request, NotifyReqVerify},
@@ -7195,10 +7260,6 @@ mtraaar_mg_event_sequence(text, tcp) ->
ServiceChangeReplyVerify = ?mtraaar_mg_verify_service_change_reply_fun(),
NotifyReqVerify = ?mtraaar_mg_verify_notify_req_fun(),
NotifyReplyVerify = ?mtraaar_mg_verify_notify_reply_fun(),
-%% ConnectVerify = fun mtraaar_mg_verify_handle_connect/1,
-%% ServiceChangeReplyVerify = fun mtraaar_mg_verify_service_change_reply/1,
-%% NotifyReqVerify = mtraaar_mg_verify_notify_request_fun(),
-%% NotifyReplyVerify = fun mtraaar_mg_verify_notify_reply/1,
EvSeq = [
{debug, true},
megaco_start,
@@ -7492,6 +7553,7 @@ otp_7192_1(Config) when is_list(Config) ->
-endif.
otp71921_mgc_event_sequence(text, tcp, MgMid) ->
+ CTRL = self(),
Mid = {deviceName, "ctrl"},
RI = [
{port, 2944},
@@ -7517,6 +7579,10 @@ otp71921_mgc_event_sequence(text, tcp, MgMid) ->
{megaco_start_user, Mid, RI, []},
start_transport,
listen,
+
+ %% ANNOUNCE READY
+ {trigger, fun() -> CTRL ! announce_mgc end},
+
{megaco_connect, MgMid},
{megaco_callback, handle_connect, LocalConnectVerify},
%% {megaco_callback, handle_connect, RemoteConnectVerify},
@@ -7774,10 +7840,6 @@ otp71921_mg_event_sequence(text, tcp, Mid) ->
ServiceChangeReplyVerify = ?otp71921_mg_verify_service_change_reply_fun(),
NotifyReqVerify = ?otp71921_mg_verify_notify_req_fun(),
NotifyReplyVerify = ?otp71921_mg_verify_notify_reply_fun(),
-%% ConnectVerify = fun otp71921_mg_verify_handle_connect/1,
-%% ServiceChangeReplyVerify = fun otp71921_mg_verify_service_change_reply/1,
-%% NotifyReqVerify = otp71921_mg_verify_notify_request_fun(),
-%% NotifyReplyVerify = fun otp71921_mg_verify_notify_reply/1,
EvSeq = [
{debug, true},
megaco_start,
@@ -8063,6 +8125,7 @@ otp_7192_2(Config) when is_list(Config) ->
-endif.
otp71922_mgc_event_sequence(text, tcp, MgMid) ->
+ CTRL = self(),
Mid = {deviceName, "ctrl"},
RI = [
{port, 2944},
@@ -8088,6 +8151,10 @@ otp71922_mgc_event_sequence(text, tcp, MgMid) ->
{megaco_start_user, Mid, RI, []},
start_transport,
listen,
+
+ %% ANNOUNCE READY
+ {trigger, fun() -> CTRL ! announce_mgc end},
+
{megaco_connect, MgMid},
{megaco_callback, handle_connect, LocalConnectVerify},
{megaco_callback, handle_trans_request, ServiceChangeReqVerify},
@@ -8627,6 +8694,7 @@ otp_7192_3(Config) when is_list(Config) ->
-endif.
otp72923_mgc_event_sequence(text, udp, MgMid) ->
+ CTRL = self(),
Mid = {deviceName, "ctrl"},
RI = [
{port, 2944},
@@ -8652,6 +8720,10 @@ otp72923_mgc_event_sequence(text, udp, MgMid) ->
{megaco_start_user, Mid, RI, []},
start_transport,
listen,
+
+ %% ANNOUNCE READY
+ {trigger, fun() -> CTRL ! announce_mgc end},
+
{megaco_connect, MgMid},
{megaco_callback, handle_connect, LocalConnectVerify},
{megaco_callback, handle_trans_request, ServiceChangeReqVerify},
diff --git a/lib/mnesia/src/mnesia_index.erl b/lib/mnesia/src/mnesia_index.erl
index 6f1c21e3b9..0ab03adcd8 100644
--- a/lib/mnesia/src/mnesia_index.erl
+++ b/lib/mnesia/src/mnesia_index.erl
@@ -106,8 +106,8 @@ add_index2([{{Pos, Type}, Ixt} |Tail], SorB, Storage, Tab, K, Obj, OldRecs0) ->
[] -> %% when OldRecs1 =/= [] Update without modifying index field
add_index2(Tail, SorB, Storage, Tab, K, Obj, OldRecs1);
OldRecs -> %% Update
- put_index_vals(Type, Ixt, NewVals, K),
[del_ixes(Type, Ixt, ValsF, OldObj, K) || OldObj <- OldRecs],
+ put_index_vals(Type, Ixt, NewVals, K),
add_index2(Tail, SorB, Storage, Tab, K, Obj, OldRecs1)
end;
add_index2([], _, _, _Tab, _K, _Obj, _) -> ok.
diff --git a/lib/mnesia/src/mnesia_tm.erl b/lib/mnesia/src/mnesia_tm.erl
index 8a4113422a..18520423ba 100644
--- a/lib/mnesia/src/mnesia_tm.erl
+++ b/lib/mnesia/src/mnesia_tm.erl
@@ -622,12 +622,14 @@ recover_coordinator(Tid, sync_sym_trans, committed, Local, _, _) ->
recover_coordinator(Tid, sync_sym_trans, aborted, _Local, _, _) ->
mnesia_recover:note_decision(Tid, aborted);
-recover_coordinator(Tid, asym_trans, committed, Local, DiscNs, RamNs) ->
+recover_coordinator(Tid, Protocol, committed, Local, DiscNs, RamNs)
+ when Protocol =:= asym_trans; Protocol =:= sync_asym_trans ->
D = #decision{tid = Tid, outcome = committed,
disc_nodes = DiscNs, ram_nodes = RamNs},
mnesia_recover:log_decision(D),
do_commit(Tid, Local);
-recover_coordinator(Tid, asym_trans, aborted, Local, DiscNs, RamNs) ->
+recover_coordinator(Tid, Protocol, aborted, Local, DiscNs, RamNs)
+ when Protocol =:= asym_trans; Protocol =:= sync_asym_trans ->
D = #decision{tid = Tid, outcome = aborted,
disc_nodes = DiscNs, ram_nodes = RamNs},
mnesia_recover:log_decision(D),
diff --git a/lib/mnesia/test/mnesia_dirty_access_test.erl b/lib/mnesia/test/mnesia_dirty_access_test.erl
index 984f43582c..7aafbbb98b 100644
--- a/lib/mnesia/test/mnesia_dirty_access_test.erl
+++ b/lib/mnesia/test/mnesia_dirty_access_test.erl
@@ -116,7 +116,7 @@ end_per_group(_GroupName, Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Errors in dirty activity should have stacktrace
-dirty_error_stacktrace(Config) ->
+dirty_error_stacktrace(_Config) ->
%% Custom errors should have stacktrace
try
mnesia:async_dirty(fun() -> error(custom_error) end)
diff --git a/lib/mnesia/test/mnesia_index_plugin_test.erl b/lib/mnesia/test/mnesia_index_plugin_test.erl
index 44fe047c50..ede35269ec 100644
--- a/lib/mnesia/test/mnesia_index_plugin_test.erl
+++ b/lib/mnesia/test/mnesia_index_plugin_test.erl
@@ -33,7 +33,8 @@
tab_with_multiple_plugin_indexes/1,
ix_match_w_plugin/1,
ix_match_w_plugin_ordered/1,
- ix_match_w_plugin_bag/1
+ ix_match_w_plugin_bag/1,
+ ix_update_w_plugin/1
]).
-export([ix_prefixes/3, % test plugin
@@ -59,7 +60,8 @@ all() ->
tab_with_multiple_plugin_indexes,
ix_match_w_plugin,
ix_match_w_plugin_ordered,
- ix_match_w_plugin_bag].
+ ix_match_w_plugin_bag,
+ ix_update_w_plugin].
groups() ->
[].
@@ -195,6 +197,23 @@ ix_match_w_plugin_bag(Config) when is_list(Config) ->
fill_and_test_index_match(im3, bag),
?verify_mnesia(Nodes, []).
+ix_update_w_plugin(suite) -> [];
+ix_update_w_plugin(Config) when is_list(Config) ->
+ [_N1] = Nodes = ?acquire_nodes(1, Config),
+ ok = add_plugin(),
+ {atomic, ok} = mnesia:create_table(im4, [{attributes, [k, v1, v2]},
+ {type, ordered_set},
+ {index, [{{pfx}, ordered},
+ {v1, ordered}]}]),
+
+ mnesia:dirty_write({im4, 1, "1234", "abcd"}),
+ ?match([{im4, 1, "1234", "abcd"}], mnesia:dirty_index_read(im4, <<"123">>, {pfx})),
+ ?match([{im4, 1, "1234", "abcd"}], mnesia:dirty_index_read(im4, <<"abc">>, {pfx})),
+ mnesia:dirty_write({im4, 1, "1234", "efgh"}),
+ ?match([{im4, 1, "1234", "efgh"}], mnesia:dirty_index_read(im4, <<"123">>, {pfx})),
+ ?match([{im4, 1, "1234", "efgh"}], mnesia:dirty_index_read(im4, <<"efg">>, {pfx})),
+ ?verify_mnesia(Nodes, []).
+
fill_and_test_index_match(Tab, Type) ->
[ok,ok,ok,ok,ok,ok,ok,ok,ok] =
[mnesia:dirty_write({Tab, K, V1, V2})
diff --git a/lib/observer/src/crashdump_viewer.erl b/lib/observer/src/crashdump_viewer.erl
index 97bb344cbf..de418df0ab 100644
--- a/lib/observer/src/crashdump_viewer.erl
+++ b/lib/observer/src/crashdump_viewer.erl
@@ -1240,7 +1240,10 @@ all_procinfo(Fd,Fun,Proc,WS,LineHead) ->
Bytes = list_to_integer(bytes(Fd))*WS,
get_procinfo(Fd,Fun,Proc#proc{bin_vheap_unused=Bytes},WS);
"OldBinVHeap unused" ->
- Bytes = list_to_integer(bytes(Fd))*WS,
+ Bytes = case bytes(Fd) of
+ "overflow" -> -1;
+ Int -> list_to_integer(Int)*WS
+ end,
get_procinfo(Fd,Fun,Proc#proc{old_bin_vheap_unused=Bytes},WS);
"New heap start" ->
get_procinfo(Fd,Fun,Proc#proc{new_heap_start=bytes(Fd)},WS);
diff --git a/lib/public_key/src/pubkey_crl.erl b/lib/public_key/src/pubkey_crl.erl
index 50abd704de..15aedc0f4d 100644
--- a/lib/public_key/src/pubkey_crl.erl
+++ b/lib/public_key/src/pubkey_crl.erl
@@ -340,6 +340,7 @@ verify_issuer_and_scope(#'OTPCertificate'{tbsCertificate = TBSCert}= Cert,
end.
dp_crlissuer_to_issuer(DPCRLIssuer) ->
+ %% Assume the cRLIssuer SEQUENCE is of length exactly 1
[{directoryName, Issuer}] = pubkey_cert_records:transform(DPCRLIssuer, decode),
Issuer.
diff --git a/lib/reltool/examples/display_args b/lib/reltool/examples/display_args
index a8882f7bda..38f749f8b2 100644
--- a/lib/reltool/examples/display_args
+++ b/lib/reltool/examples/display_args
@@ -1,6 +1,6 @@
#!/usr/bin/env escript
%% -*- erlang -*-
-%%! -emuarg emuvalue
+%%! -emu_type opt -emuarg emuvalue
main(Args) ->
{ok,[Emuvalue]} = init:get_argument(emuarg),
diff --git a/lib/reltool/test/reltool_server_SUITE.erl b/lib/reltool/test/reltool_server_SUITE.erl
index bb092e8bbf..500b298424 100644
--- a/lib/reltool/test/reltool_server_SUITE.erl
+++ b/lib/reltool/test/reltool_server_SUITE.erl
@@ -2792,6 +2792,8 @@ mk_node_args(Name, Args) ->
{ok, Pwd} = file:get_cwd(),
NameStr = atom_to_list(Name),
["-detached",
+ %% Don't want to try to run the debug emulator here
+ "-emu_type","opt",
NameSw, NameStr,
"-pa", Pa,
"-env", "ERL_CRASH_DUMP", Pwd ++ "/erl_crash_dump." ++ NameStr,
diff --git a/lib/snmp/Makefile b/lib/snmp/Makefile
index df321fc2d1..1a5bed50a5 100644
--- a/lib/snmp/Makefile
+++ b/lib/snmp/Makefile
@@ -143,6 +143,8 @@ $(DIA_PLT): Makefile
-r ../$(APPLICATION)/ebin \
../../lib/kernel/ebin \
../../lib/stdlib/ebin \
+ ../../lib/compiler/ebin \
+ ../../lib/hipe/ebin \
../../lib/runtime_tools/ebin \
../../lib/crypto/ebin \
../../lib/mnesia/ebin \
diff --git a/lib/snmp/doc/src/notes.xml b/lib/snmp/doc/src/notes.xml
index f19b23e475..5037801d2c 100644
--- a/lib/snmp/doc/src/notes.xml
+++ b/lib/snmp/doc/src/notes.xml
@@ -34,7 +34,40 @@
</header>
- <section><title>SNMP 5.4.1</title>
+ <section><title>SNMP 5.4.3</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Agent discovery cleanup. If there is no receiver of
+ INFORM then #state.reqs in snmpa_net_if keeps on growing
+ for DISCOVERY.</p>
+ <p>
+ Own Id: OTP-16228 Aux Id: ERIERL-427 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>SNMP 5.4.2</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ The agent discovery process has been made to work with
+ snmptrapd..</p>
+ <p>
+ Own Id: OTP-16207 Aux Id: ERIERL-427 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>SNMP 5.4.1</title>
<section><title>Improvements and New Features</title>
<list>
@@ -175,6 +208,26 @@
</section>
+ <section><title>SNMP 5.2.11.2</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ [manager] The callbacks where executed in a (new)
+ 'temporary' process, that executed the callback call and
+ then exited. This has now been made configurable so that
+ is also possible to specify a 'permanent' callback proxy
+ process. All callback calls will then be executed in this
+ (permanent) process (in sequence).</p>
+ <p>
+ Own Id: OTP-15947 Aux Id: ERIERL-378 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>SNMP 5.2.11.1</title>
<section><title>Improvements and New Features</title>
@@ -664,11 +717,11 @@
<item>
<p>[agent] Enable SNMP to create missing database directories. </p>
<p>Add
- <seealso marker="snmp_app#db_init_error">
+ <seealso marker="snmp_config#db_init_error">
{db_init_error, create_db_and_dir}</seealso> option to SNMP
- <seealso marker="snmp_app#manager_opts_and_types">manager</seealso>
+ <seealso marker="snmp_config#manager_opts_and_types">manager</seealso>
and
- <seealso marker="snmp_app#agent_opts_and_types">agent</seealso>.
+ <seealso marker="snmp_config#agent_opts_and_types">agent</seealso>.
This allows them to create any missing parent directories for
<c>db_dir</c>, rather than treating any missing directories
as a fatal error.
@@ -1341,7 +1394,7 @@
limit the number of varbinds that can be included in
a Get-BULK response message. This is specified by the
new config option,
- <seealso marker="snmp_app#agent_gb_max_vbs">gb_max_vbs</seealso>.
+ <seealso marker="snmp_config#agent_gb_max_vbs">gb_max_vbs</seealso>.
</p>
<p>Own Id: OTP-9700</p>
</item>
@@ -1400,7 +1453,7 @@
limit the number of varbinds that can be included in
a Get-BULK response message. This is specified by the
new config option,
- <seealso marker="snmp_app#agent_gb_max_vbs">gb_max_vbs</seealso>.
+ <seealso marker="snmp_config#agent_gb_max_vbs">gb_max_vbs</seealso>.
</p>
<p>Own Id: OTP-9700</p>
</item>
diff --git a/lib/snmp/doc/src/notes_history.xml b/lib/snmp/doc/src/notes_history.xml
index cae9630ff9..d66d464e1c 100644
--- a/lib/snmp/doc/src/notes_history.xml
+++ b/lib/snmp/doc/src/notes_history.xml
@@ -211,8 +211,6 @@
<seealso marker="snmp_config#audit_trail_log">Audit Trail Log</seealso>
config option. </p>
<p>See the
- <seealso marker="snmp_app#configuration_params">reference manual</seealso>
- or the
<seealso marker="snmp_config#configuration_params">Configuring the application</seealso>
chapter of the User's Guide for further info. </p>
@@ -272,8 +270,6 @@
<seealso marker="snmp_config#audit_trail_log">Audit Trail Log</seealso>
config option. </p>
<p>See the
- <seealso marker="snmp_app#configuration_params">reference manual</seealso>
- or the
<seealso marker="snmp_config#configuration_params">Configuring the application</seealso>
chapter of the User's Guide for further info. </p>
@@ -416,7 +412,7 @@
See also the Configuring chapter of
the User's Guide to see how to configure this feature. </p>
<p>See the
- <seealso marker="snmp_app#configuration_params">configuration</seealso>
+ <seealso marker="snmp_config#configuration_params">configuration</seealso>
chapter for more info about the filter options.</p>
<p>Own Id: OTP-8228</p>
<p>Aux Id: Seq 11411</p>
@@ -486,7 +482,7 @@
<seealso marker="snmpa#update_mibs_cache_age">update_mibs_cache_age/1,2</seealso> and
<seealso marker="snmpa#update_mibs_cache_gclimit">update_mibs_cache_gclimit/1,2</seealso> for more info. </p>
<p>See also the
- <seealso marker="snmp_app#configuration_params">configuration</seealso>
+ <seealso marker="snmp_config#configuration_params">configuration</seealso>
chapter for more info about the mib server cache options.</p>
<p>Own Id: OTP-8182</p>
<p>Aux Id: Seq 11383</p>
@@ -499,7 +495,7 @@
make it possible to configure the username the agent reacts to.
Default is <c>""</c>. </p>
<p>See the
- <seealso marker="snmp_app#configuration_params">configuration</seealso>
+ <seealso marker="snmp_config#configuration_params">configuration</seealso>
chapter for more info about the discovery options.</p>
<p>Own Id: OTP-8120</p>
<p>Aux Id: Seq 11361</p>
@@ -674,7 +670,7 @@
of these problems. </p>
<p>Introduced various options for controlling the discovery
process. See the
- <seealso marker="snmp_app#configuration_params">configuration</seealso>
+ <seealso marker="snmp_config#configuration_params">configuration</seealso>
chapter for more info about the discovery options.</p>
<p>Own Id: OTP-8020</p>
<p>Aux Id: Seq 11295</p>
@@ -1058,7 +1054,8 @@
<p>[agent] A simple lookup cache has been added to improve
the mib server lookup performance. </p>
<p>This can be disabled with the mib_server
- <seealso marker="snmp_app">cache</seealso> option. </p>
+ <seealso marker="snmp_config#agent_ms_cache">cache</seealso>
+ option. </p>
<p>Own Id: OTP-7346</p>
</item>
@@ -1328,7 +1325,7 @@
<list type="bulleted">
<item>
<p>[manager] The configuration option
- <seealso marker="snmp_app">inform_request_behaviour</seealso>
+ <seealso marker="snmp_config#manager_irb">inform_request_behaviour</seealso>
was not properly parsed, which caused the manager to revert
to the default value, <c>auto</c>. </p>
<p>Own Id: OTP-7219</p>
@@ -1561,7 +1558,7 @@
network interface filter module. This module must implement the
<seealso marker="snmpa_network_interface_filter">network interface filter behaviour</seealso>.
See also the
- <seealso marker="snmp_app#configuration_params">Configuring the application</seealso>
+ <seealso marker="snmp_config#configuration_params">Configuring the application</seealso>
chapter of the User's Guide to see how to configure this
feature. </p>
<p>Own Id: OTP-6649</p>
@@ -2047,9 +2044,8 @@
<item>
<p>Added a config option, <c>sndbuf</c>, for the net_if-module(s).
See
- <seealso marker="snmp_app">application configuration</seealso> or
- <seealso marker="snmp_config">running the application</seealso>
- for more info (look for manager_net_if_options and
+ <seealso marker="snmp_config#configuration_params">Configure the application</seealso>
+ for more info (look for manager_net_if_options and
agent_net_if_options). </p>
<p>Own Id: OTP-6137</p>
</item>
@@ -2366,7 +2362,7 @@
</item>
<item>
<p>Improved handling of audit trail logs.
- See the <seealso marker="snmp_app">atl_repair</seealso>
+ See the <seealso marker="snmp_config">atl_repair</seealso>
config for more info.</p>
<p>Own Id: OTP-5771</p>
</item>
@@ -2407,7 +2403,7 @@
<list type="bulleted">
<item>
<p>[manager] Introduced the
- <seealso marker="snmp_app">inform request behaviour</seealso>
+ <seealso marker="snmp_config#manager_irb">inform request behaviour</seealso>
configuration option to allow the user to specify
how/when the manager shall acknowledge inform-request's.</p>
<p>Own Id: OTP-5733</p>
@@ -3093,7 +3089,7 @@
<seealso marker="snmpm_user">user behaviour</seealso>
could be overridden (default user is the module
<c>snmpm_user_default</c>).
- See <seealso marker="snmp_app">application configuration</seealso> or
+ See
<seealso marker="snmp_config#configuration_params">configuration params</seealso>.</p>
<p>Own Id: OTP-5299</p>
</item>
@@ -3380,7 +3376,7 @@
works (if only the agent is used), it is no
longer documented and will eventually be
eliminated.
- See <seealso marker="snmp_app">application configuration</seealso> or
+ See
<seealso marker="snmp_config#configuration_params">configuration params</seealso> for more info.</p>
</item>
<item>
diff --git a/lib/snmp/doc/src/snmp_app.xml b/lib/snmp/doc/src/snmp_app.xml
index a9aeba6924..54a7eafe76 100644
--- a/lib/snmp/doc/src/snmp_app.xml
+++ b/lib/snmp/doc/src/snmp_app.xml
@@ -4,7 +4,7 @@
<appref>
<header>
<copyright>
- <year>1997</year><year>2016</year>
+ <year>1997</year><year>2019</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -22,7 +22,7 @@
</legalnotice>
- <title>snmp</title>
+ <title>SNMP</title>
<prepared></prepared>
<responsible></responsible>
<docno></docno>
@@ -32,7 +32,7 @@
<rev></rev>
<file>snmp.xml</file>
</header>
- <app>snmp</app>
+ <app>SNMP</app>
<appsummary>The SNMP Application</appsummary>
<description>
<p>This chapter describes the <c>snmp</c>
@@ -50,6 +50,17 @@
</item>
</list>
+ <!--
+
+There are achors (marker id) in this file, but do **NOT** link to anything
+in this file!! Because of the title is in capital letters, the generated
+html file will also be in capital letters.
+This should not be a problem since almost everything here is duplicated
+in the snmp_config file!
+
+ -->
+
+
</description>
<section>
@@ -583,7 +594,7 @@
<tag><marker id="manager_server"></marker>
<c><![CDATA[server() = [server_opt()] <optional>]]></c></tag>
<item>
- <p><c>server_opt() = {timeout, server_timeout()} | {verbosity, verbosity()}</c></p>
+ <p><c>server_opt() = {timeout, server_timeout()} | {verbosity, verbosity()} | {cbproxy, server_cbproxy()}</c></p>
<p>Specifies the options for the manager server process.</p>
<p>Default is <c>silence</c>.</p>
</item>
@@ -609,6 +620,27 @@
<p>Default is <c>30000</c>.</p>
</item>
+ <tag><marker id="manager_server_cbproxy"></marker>
+ <c><![CDATA[server_cbproxy() = temporary (default) | permanent <optional>]]></c></tag>
+ <item>
+ <p>This option specifies how the server will handle callback calls.</p>
+ <taglist>
+ <tag><marker id="manager_server_cbproxy_temporary"></marker>
+ <c><![CDATA[temporary (default)]]></c></tag>
+ <item>
+ <p>A temporary process will be created for each callback call. </p>
+ </item>
+
+ <tag><marker id="manager_server_cbproxy_temporary"></marker>
+ <c><![CDATA[permanent]]></c></tag>
+ <item>
+ <p>With this the server will create a permanent (named) process that
+ in effect serializes all callback calls.</p>
+ </item>
+ </taglist>
+ <p>Default is <c>temporary</c>.</p>
+ </item>
+
<tag><marker id="manager_config"></marker>
<c><![CDATA[manager_config() = [manager_config_opt()] <mandatory>]]></c></tag>
<item>
diff --git a/lib/snmp/doc/src/snmp_config.xml b/lib/snmp/doc/src/snmp_config.xml
index e4840dde83..d615edcec0 100644
--- a/lib/snmp/doc/src/snmp_config.xml
+++ b/lib/snmp/doc/src/snmp_config.xml
@@ -612,7 +612,7 @@ in so far as it will be converted to the new format if found.
<tag><marker id="manager_server"></marker>
<c><![CDATA[server() = [server_opt()] <optional>]]></c></tag>
<item>
- <p><c>server_opt() = {timeout, server_timeout()} | {verbosity, verbosity()}</c></p>
+ <p><c>server_opt() = {timeout, server_timeout()} | {verbosity, verbosity()} | {cbproxy, server_cbproxy()}</c></p>
<p>Specifies the options for the manager server process.</p>
<p>Default is <c>silence</c>.</p>
</item>
@@ -638,6 +638,27 @@ in so far as it will be converted to the new format if found.
<p>Default is <c>30000</c>.</p>
</item>
+ <tag><marker id="manager_server_cbproxy"></marker>
+ <c><![CDATA[server_cbproxy() = temporary (default) | permanent <optional>]]></c></tag>
+ <item>
+ <p>This option specifies how the server will handle callback calls.</p>
+ <taglist>
+ <tag><marker id="manager_server_cbproxy_temporary"></marker>
+ <c><![CDATA[temporary (default)]]></c></tag>
+ <item>
+ <p>A temporary process will be created for each callback call. </p>
+ </item>
+
+ <tag><marker id="manager_server_cbproxy_temporary"></marker>
+ <c><![CDATA[permanent]]></c></tag>
+ <item>
+ <p>With this the server will create a permanent (named) process that
+ in effect serializes all callback calls.</p>
+ </item>
+ </taglist>
+ <p>Default is <c>temporary</c>.</p>
+ </item>
+
<tag><marker id="manager_config"></marker>
<c><![CDATA[manager_config() = [manager_config_opt()] <mandatory>]]></c></tag>
<item>
diff --git a/lib/snmp/doc/src/snmp_manager_netif.xml b/lib/snmp/doc/src/snmp_manager_netif.xml
index 0dcf2a0255..0dfcdbda0d 100644
--- a/lib/snmp/doc/src/snmp_manager_netif.xml
+++ b/lib/snmp/doc/src/snmp_manager_netif.xml
@@ -122,7 +122,7 @@ Server ! {snmp_inform, Ref, Pdu, PduMS, Domain, Addr}
will not make the call to the
<seealso marker="snmpm_network_interface#inform_response">inform_response</seealso>
function). See the
- <seealso marker="snmp_app">inform request behaviour</seealso>
+ <seealso marker="snmp_config#manager_irb">inform request behaviour</seealso>
configuration option for more info.</p>
</item>
<item>
diff --git a/lib/snmp/doc/src/snmpa.xml b/lib/snmp/doc/src/snmpa.xml
index dc2f4e6d66..5b662620a9 100644
--- a/lib/snmp/doc/src/snmpa.xml
+++ b/lib/snmp/doc/src/snmpa.xml
@@ -1392,10 +1392,8 @@ snmp_agent:register_subagent(SA1,[1,2,3], SA2).
<p>For information about the old config (<c>OldConfig</c>)
see the OTP R9C documentation.</p>
<p>For information about the current agent config
- (<c>AgentConfig</c>), see either
- the <seealso marker="snmp_app">SNMP application</seealso>
- part of the reference manual or the
- <seealso marker="snmp_config">Configuring the application</seealso>
+ (<c>AgentConfig</c>), see the
+ <seealso marker="snmp_config#configuration_params">Configuring the application</seealso>
chapter of the SNMP user's guide.</p>
<marker id="restart_worker"></marker>
diff --git a/lib/snmp/doc/src/snmpa_network_interface_filter.xml b/lib/snmp/doc/src/snmpa_network_interface_filter.xml
index 02c7d291dd..9a9123231b 100644
--- a/lib/snmp/doc/src/snmpa_network_interface_filter.xml
+++ b/lib/snmp/doc/src/snmpa_network_interface_filter.xml
@@ -76,7 +76,7 @@
(<c>snmpa_net_if</c>). The default filter accepts all messages.</p>
<p>A network interface filter can e.g. be used during testing or for load
regulation. If the intended use is load regulation, see also
- <seealso marker="snmp_app#configuration_params">req_limit</seealso> and
+ <seealso marker="snmp_config#agent_ni_req_limit">req_limit</seealso> and
the function
<seealso marker="snmpa#register_notification_filter">register_notification_filter</seealso>. </p>
<p>Legacy network interface filter modules used arguments on the form
diff --git a/lib/snmp/doc/src/snmpm_user.xml b/lib/snmp/doc/src/snmpm_user.xml
index 9abf596c83..c961300490 100644
--- a/lib/snmp/doc/src/snmpm_user.xml
+++ b/lib/snmp/doc/src/snmpm_user.xml
@@ -243,7 +243,7 @@ snmp_v1_trap_info() :: {Enteprise :: snmp:oid(),
<c>{register, UserId, TargetName2, AgentConfig}</c> is the
<em>default user</em>.</p>
<p>If the
- <seealso marker="snmp_app">inform request behaviour</seealso>
+ <seealso marker="snmp_config#manager_irb">inform request behaviour</seealso>
configuration option is set to <c>user</c> or
<c>{user, integer()}</c>, the response (acknowledgment) to this
inform-request will be sent when this function returns.</p>
diff --git a/lib/snmp/src/agent/Makefile b/lib/snmp/src/agent/Makefile
index 2943a4d550..1bde1ca972 100644
--- a/lib/snmp/src/agent/Makefile
+++ b/lib/snmp/src/agent/Makefile
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2016. All Rights Reserved.
+# Copyright Ericsson AB 1996-2019. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -43,11 +43,12 @@ RELSYSDIR = $(RELEASE_PATH)/lib/snmp-$(VSN)
include modules.mk
-ERL_FILES = $(MODULES:%=%.erl)
+ERL_FILES = $(BEHAVIOUR_MODULES:%=%.erl) $(MODULES:%=%.erl)
HRL_FILES = $(INTERNAL_HRL_FILES:%=%.hrl)
-TARGET_FILES = $(MODULES:%=$(EBIN)/%.$(EMULATOR))
+BEHAVIOUR_TARGET_FILES = $(BEHAVIOUR_MODULES:%=$(EBIN)/%.$(EMULATOR))
+TARGET_FILES = $(MODULES:%=$(EBIN)/%.$(EMULATOR))
# ----------------------------------------------------
@@ -101,20 +102,28 @@ ERL_COMPILE_FLAGS += -I../../include \
debug:
@$(MAKE) TYPE=debug opt
-opt: $(TARGET_FILES)
+opt:
+ @$(MAKE) behaviour_targets
+ @$(MAKE) targets
+
+behaviour_targets: $(BEHAVIOUR_TARGET_FILES)
+
+targets: $(TARGET_FILES)
clean:
- rm -f $(TARGET_FILES)
+ rm -f $(BEHAVIOUR_TARGET_FILES)
+ rm -f $(TARGET_FILES)
rm -f core *~
docs:
info:
- @echo "SNMP_FLAGS: $(SNMP_FLAGS)"
- @echo "ERL_COMPILE_FLAGS: $(ERL_COMPILE_FLAGS)"
+ @echo "SNMP_FLAGS: $(SNMP_FLAGS)"
+ @echo "ERL_COMPILE_FLAGS: $(ERL_COMPILE_FLAGS)"
@echo ""
- @echo "TARGET_FILES: $(TARGET_FILES)"
+ @echo "BEHAVIOUR_TARGET_FILES: $(BEHAVIOUR_TARGET_FILES)"
+ @echo "TARGET_FILES: $(TARGET_FILES)"
@echo ""
@@ -133,7 +142,7 @@ release_spec: opt
$(INSTALL_DIR) "$(RELSYSDIR)/src/agent"
$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/src/agent"
$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- $(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) \
+ $(INSTALL_DATA) $(BEHAVIOUR_TARGET_FILES) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) \
"$(RELSYSDIR)/ebin"
# $(INSTALL_DIR) "$(RELSYSDIR)/include"
# $(INSTALL_DATA) $(EXT_HRL_FILES) "$(RELSYSDIR)/include"
diff --git a/lib/snmp/src/agent/modules.mk b/lib/snmp/src/agent/modules.mk
index 49cc158c2e..39c9aca1cd 100644
--- a/lib/snmp/src/agent/modules.mk
+++ b/lib/snmp/src/agent/modules.mk
@@ -49,7 +49,6 @@ MIB_MODULES = \
MODULES = \
snmpa \
$(MIB_MODULES) \
- $(BEHAVIOUR_MODULES) \
snmpa_acm \
snmpa_agent \
snmpa_agent_sup \
diff --git a/lib/snmp/src/agent/snmpa_mpd.erl b/lib/snmp/src/agent/snmpa_mpd.erl
index 2ec5dcb5e6..552b9671af 100644
--- a/lib/snmp/src/agent/snmpa_mpd.erl
+++ b/lib/snmp/src/agent/snmpa_mpd.erl
@@ -397,7 +397,7 @@ v3_proc(NoteStore, Packet, LocalEngineID, V3Hdr, Data, Log) ->
#note{sec_engine_id = SecEngineID,
sec_model = _MsgSecModel,
sec_name = SecName,
- sec_level = SecLevel,
+ sec_level = _SecLevel, % OTP-16207
ctx_engine_id = _CtxEngineID,
ctx_name = _CtxName,
disco = true,
diff --git a/lib/snmp/src/agent/snmpa_net_if.erl b/lib/snmp/src/agent/snmpa_net_if.erl
index 58c01146be..c1f7c6b424 100644
--- a/lib/snmp/src/agent/snmpa_net_if.erl
+++ b/lib/snmp/src/agent/snmpa_net_if.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -736,8 +736,28 @@ handle_discovery_response(
%% XXX Strange... Reqs from this Pid should be reaped
%% at process exit by clear_reqs/2 so the following
%% should be redundant.
- NReqs = lists:keydelete(ReqId, 1, Reqs),
+ NReqs = lists:keydelete(ReqId, 1, Reqs -- [{0, Pid}]), % ERIERL-427
S#state{reqs = NReqs};
+
+ %% <OTP-16207>
+ %% For some reason 'snmptrapd' response in stage 2 with request-id
+ %% of zero.
+ false when (ReqId =:= 0) ->
+ DiscoReqs = [X|| {0, From1} <- S#state.reqs,
+ {_, From2} = X <- S#state.reqs, From1 =:= From2],
+ case (length(DiscoReqs) =:= 2) of
+ true ->
+ [{_, Pid}, _] = DiscoReqs,
+ active_once(Socket),
+ Pid ! {snmp_discovery_response_received, Pdu,
+ ManagerEngineId},
+ NReqs = S#state.reqs -- DiscoReqs,
+ S#state{reqs = NReqs};
+ false ->
+ S
+ end;
+ %% </OTP-16207>
+
false ->
%% Ouch, timeout? resend?
S
@@ -1013,8 +1033,10 @@ handle_send_discovery(
log(Log, Type, Packet, {Domain, Address}),
udp_send(Socket, {Domain, Address}, Packet),
?vtrace("handle_send_discovery -> sent (~w)", [ReqId]),
- NReqs = snmp_misc:keyreplaceadd(From, 2, Reqs, {ReqId, From}),
- S#state{reqs = NReqs}
+ link(From),
+ NReqs = snmp_misc:keyreplaceadd(From, 2, Reqs, {ReqId, From}),
+ NReqs2 = (NReqs -- [{0, From}]) ++ [{0, From}], % OTP-16207
+ S#state{reqs = NReqs2}
end;
{discarded, Reason} ->
?vlog("handle_send_discovery -> "
@@ -1187,8 +1209,9 @@ handle_disk_log(_Log, _Info, State) ->
clear_reqs(Pid, S) ->
- NReqs = lists:keydelete(Pid, 2, S#state.reqs),
- S#state{reqs = NReqs}.
+ NReqs = lists:keydelete(Pid, 2, S#state.reqs),
+ NReqs2 = NReqs -- [{0, Pid}], % ERIERL-427
+ S#state{reqs = NReqs2}.
toname(P) when is_pid(P) ->
diff --git a/lib/snmp/src/agent/snmpa_trap.erl b/lib/snmp/src/agent/snmpa_trap.erl
index 119207c76b..62f35cdaf9 100644
--- a/lib/snmp/src/agent/snmpa_trap.erl
+++ b/lib/snmp/src/agent/snmpa_trap.erl
@@ -388,7 +388,8 @@ send_discovery(TargetName, Record, ContextName, Vbs, NetIf) ->
send_discovery(TargetName, Record, ContextName, Vbs, NetIf, ExtraInfo) ->
case find_dest(TargetName) of
{ok, Dest} ->
- send_discovery_pdu(Dest, Record, ContextName, Vbs, NetIf,
+ Vbs2 = make_varbind_list(Vbs), % OTP-16207
+ send_discovery_pdu(Dest, Record, ContextName, Vbs2, NetIf,
ExtraInfo);
Error ->
Error
diff --git a/lib/snmp/src/manager/Makefile b/lib/snmp/src/manager/Makefile
index 0cc87492f1..57ff08c160 100644
--- a/lib/snmp/src/manager/Makefile
+++ b/lib/snmp/src/manager/Makefile
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2004-2016. All Rights Reserved.
+# Copyright Ericsson AB 2004-2019. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -43,11 +43,12 @@ RELSYSDIR = $(RELEASE_PATH)/lib/snmp-$(VSN)
include modules.mk
-ERL_FILES = $(MODULES:%=%.erl)
+ERL_FILES = $(BEHAVIOUR_MODULES:%=%.erl) $(MODULES:%=%.erl)
HRL_FILES = $(INTERNAL_HRL_FILES:%=%.hrl)
-TARGET_FILES = $(MODULES:%=$(EBIN)/%.$(EMULATOR))
+BEHAVIOUR_TARGET_FILES = $(BEHAVIOUR_MODULES:%=$(EBIN)/%.$(EMULATOR))
+TARGET_FILES = $(MODULES:%=$(EBIN)/%.$(EMULATOR))
# ----------------------------------------------------
@@ -90,19 +91,27 @@ ERL_COMPILE_FLAGS += -I../../include \
debug:
@$(MAKE) TYPE=debug opt
-opt: $(TARGET_FILES)
+opt:
+ @$(MAKE) behaviour_targets
+ @$(MAKE) targets
+
+behaviour_targets: $(BEHAVIOUR_TARGET_FILES)
+
+targets: $(TARGET_FILES)
clean:
+ rm -f $(BEHAVIOUR_TARGET_FILES)
rm -f $(TARGET_FILES)
rm -f core *~
docs:
info:
- @echo "ERL_FILES: $(ERL_FILES)"
- @echo "HRL_FILES: $(HRL_FILES)"
- @echo "TARGET_FILES: $(TARGET_FILES)"
+ @echo "ERL_FILES: $(ERL_FILES)"
+ @echo "HRL_FILES: $(HRL_FILES)"
+ @echo "BEHAVIOUR_TARGET_FILES: $(BEHAVIOUR_TARGET_FILES)"
+ @echo "TARGET_FILES: $(TARGET_FILES)"
@echo ""
@@ -116,7 +125,7 @@ release_spec: opt
$(INSTALL_DIR) "$(RELSYSDIR)/src/manager"
$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/src/manager"
$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
+ $(INSTALL_DATA) $(BEHAVIOUR_TARGET_FILES) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
# $(INSTALL_DIR) "$(RELSYSDIR)/include"
# $(INSTALL_DATA) $(EXT_HRL_FILES) "$(RELSYSDIR)/include"
diff --git a/lib/snmp/src/manager/depend.mk b/lib/snmp/src/manager/depend.mk
index 7d8f81f55a..fd42ab13fa 100644
--- a/lib/snmp/src/manager/depend.mk
+++ b/lib/snmp/src/manager/depend.mk
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2004-2016. All Rights Reserved.
+# Copyright Ericsson AB 2004-2019. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -71,8 +71,8 @@ $(EBIN)/snmpm_supervisor.$(EMULATOR): \
snmpm_supervisor.erl
$(EBIN)/snmpm_user_default.$(EMULATOR): \
- snmpm_user_default.erl \
- snmpm_user.erl
+ snmpm_user.erl \
+ snmpm_user_default.erl
$(EBIN)/snmpm_usm.$(EMULATOR): \
snmpm_usm.erl \
diff --git a/lib/snmp/src/manager/modules.mk b/lib/snmp/src/manager/modules.mk
index ea9b52d653..7ff8745ec7 100644
--- a/lib/snmp/src/manager/modules.mk
+++ b/lib/snmp/src/manager/modules.mk
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2004-2016. All Rights Reserved.
+# Copyright Ericsson AB 2004-2019. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -25,7 +25,6 @@ BEHAVIOUR_MODULES = \
snmpm_network_interface_filter
MODULES = \
- $(BEHAVIOUR_MODULES) \
snmpm \
snmpm_conf \
snmpm_config \
diff --git a/lib/snmp/src/manager/snmpm_config.erl b/lib/snmp/src/manager/snmpm_config.erl
index 4653d9822d..fc6ddc5738 100644
--- a/lib/snmp/src/manager/snmpm_config.erl
+++ b/lib/snmp/src/manager/snmpm_config.erl
@@ -147,7 +147,12 @@
-define(USER_MOD_DEFAULT, snmpm_user_default).
-define(USER_DATA_DEFAULT, undefined).
-%% -define(DEF_ADDR_TAG, default_addr_tag).
+-define(SERVER_OPT_VERB_DEFAULT, silence).
+-define(SERVER_OPT_GCT_DEFAULT, 30000).
+-define(SERVER_OPT_MT_DEFAULT, true).
+-define(SERVER_OPT_CBP_DEFAULT, temporary). % permanent
+
+%% -define(DEF_ADDR_TAG, default_addr_tag).
-define(DEFAULT_TARGETNAME, default_agent).
-define(DEF_PORT_TAG, default_port_tag).
-define(SUPPORTED_DOMAINS, [transportDomainUdpIpv4, transportDomainUdpIpv6]).
@@ -1111,12 +1116,14 @@ do_init(Opts) ->
%% -- Server (optional) --
ServerOpts = get_opt(server, Opts, []),
- ServerVerb = get_opt(verbosity, ServerOpts, silence),
- ServerGct = get_opt(timeout, ServerOpts, 30000),
- ServerMt = get_opt(multi_threaded, ServerOpts, true),
+ ServerVerb = get_opt(verbosity, ServerOpts, ?SERVER_OPT_VERB_DEFAULT),
+ ServerGct = get_opt(timeout, ServerOpts, ?SERVER_OPT_GCT_DEFAULT),
+ ServerMt = get_opt(multi_threaded, ServerOpts, ?SERVER_OPT_MT_DEFAULT),
+ ServerCBP = get_opt(cbproxy, ServerOpts, ?SERVER_OPT_CBP_DEFAULT),
ets:insert(snmpm_config_table, {server_verbosity, ServerVerb}),
ets:insert(snmpm_config_table, {server_timeout, ServerGct}),
ets:insert(snmpm_config_table, {server_multi_threaded, ServerMt}),
+ ets:insert(snmpm_config_table, {server_cbproxy, ServerCBP}),
%% -- Mibs (optional) --
?vdebug("initiate mini mib", []),
@@ -1409,6 +1416,11 @@ verify_server_opts([{verbosity, Verbosity}|Opts]) ->
verify_server_opts([{timeout, Timeout}|Opts]) ->
verify_server_timeout(Timeout),
verify_server_opts(Opts);
+verify_server_opts([{multi_threaded, MT}|Opts]) when is_boolean(MT) ->
+ verify_server_opts(Opts);
+verify_server_opts([{cbproxy, CBP}|Opts]) ->
+ verify_server_cbproxy(CBP),
+ verify_server_opts(Opts);
verify_server_opts([Opt|_]) ->
error({invalid_server_option, Opt}).
@@ -1417,6 +1429,13 @@ verify_server_timeout(T) when is_integer(T) andalso (T > 0) ->
verify_server_timeout(T) ->
error({invalid_server_timeout, T}).
+verify_server_cbproxy(temporary) ->
+ ok;
+verify_server_cbproxy(permanent) ->
+ ok;
+verify_server_cbproxy(CBP) ->
+ error({invalid_server_cbproxy, CBP}).
+
verify_net_if_opts([]) ->
ok;
verify_net_if_opts([{module, Mod}|Opts]) ->
@@ -1789,14 +1808,14 @@ order_agent(ItemA, ItemB) ->
snmp_conf:keyorder(1, ItemA, ItemB, [tdomain, port]).
fix_agent_config(Conf) ->
- ?vdebug("fix_agent_config -> entry with~n~n"
- " Conf: ~p", [Conf]),
+ ?vdebug("fix_agent_config -> entry with"
+ "~n Conf: ~p", [Conf]),
fix_agent_config(lists:sort(fun order_agent/2, Conf), []).
fix_agent_config([], FixedConf) ->
Ret = lists:reverse(FixedConf),
- ?vdebug("fix_agent_config -> returns:~n"
- " ~p", [Ret]),
+ ?vdebug("fix_agent_config -> done when (fixed config):"
+ "~n ~p", [Ret]),
Ret;
fix_agent_config([{taddress = Item, Address} = Entry|Conf], FixedConf) ->
{value, {tdomain, TDomain}} = lists:keysearch(tdomain, 1, FixedConf),
diff --git a/lib/snmp/src/manager/snmpm_mpd.erl b/lib/snmp/src/manager/snmpm_mpd.erl
index 8d0a7918a6..a33ae9d710 100644
--- a/lib/snmp/src/manager/snmpm_mpd.erl
+++ b/lib/snmp/src/manager/snmpm_mpd.erl
@@ -871,8 +871,20 @@ get_agent_max_message_size(Domain, Addr) ->
{ok, MMS} ->
MMS;
_Error ->
- ?vlog("unknown agent: ~s",
- [snmp_conf:mk_addr_string({Domain, Addr})]),
+ TAddr = fun(TN) ->
+ case snmpm_config:agent_info(TN, taddress) of
+ {ok, TA} ->
+ TA;
+ {error, _} ->
+ undefined
+ end
+ end,
+ KnownAgents =
+ [{TargetName, TAddr(TargetName)} ||
+ TargetName <- snmpm_config:which_agents()],
+ ?vlog("[agent engine max msg size lookup] unknown agent: ~s"
+ "~n Known Agents: ~p",
+ [snmp_conf:mk_addr_string({Domain, Addr}), KnownAgents]),
get_max_message_size()
end.
%% get_agent_max_message_size(Addr, Port) ->
diff --git a/lib/snmp/src/manager/snmpm_server.erl b/lib/snmp/src/manager/snmpm_server.erl
index a6ca2b2b14..fe2c22d9ba 100644
--- a/lib/snmp/src/manager/snmpm_server.erl
+++ b/lib/snmp/src/manager/snmpm_server.erl
@@ -77,6 +77,15 @@
%% GCT exports
-export([gct_init/1, gct/2]).
+%% CallBack Proxy exports
+-export([cbproxy_loop/1,
+ do_handle_error/4,
+ do_handle_pdu/5,
+ do_handle_agent/9,
+ do_handle_trap/9,
+ do_handle_inform/10,
+ do_handle_report/9]).
+
-include("snmpm_internal.hrl").
-include("snmp_debug.hrl").
@@ -134,6 +143,9 @@
-endif.
+-define(CBP_AWT_MAX, 60*60*1000*1000).
+-define(CBP_CNT_MAX, 16#FFFFFFFF).
+
%%----------------------------------------------------------------------
@@ -147,7 +159,16 @@
net_if_ref,
req, %% ???? Last request id in outgoing message
oid, %% ???? Last oid in request outgoing message
- mini_mib
+ mini_mib,
+ %% temporary: create a new (temporary) proxy process for each callback.
+ %% transient: create one proxy process per known agent
+ %% Its created "on the fly" and lives for as long as
+ %% there is activity (inactivity for a "long" time,
+ %% will cause it to terminate).
+ %% Not currently used!
+ %% permanent: create one (named) static callback proxy process.
+ cbproxy :: temporary | permanent,
+ cbproxy_pid % Pid of the callback proxy *if* cbp = permanent
}
).
@@ -183,6 +204,9 @@
).
+-define(CBPROXY, snmpm_server_cbproxy).
+
+
%%%-------------------------------------------------------------------
%%% API
%%%-------------------------------------------------------------------
@@ -544,6 +568,16 @@ do_init() ->
{ok, Timeout} = snmpm_config:system_info(server_timeout),
{ok, GCT} = gct_start(Timeout),
+ %% What kind of CallBack Proxy (temporary by default)
+ {CBProxy, CBPPid} =
+ case snmpm_config:system_info(server_cbproxy) of
+ {ok, permanent = CBP} ->
+ %% Start CallBack Proxy process
+ {CBP, cbproxy_start()};
+ {ok, CBP} ->
+ {CBP, undefined}
+ end,
+
%% -- Create request table --
ets:new(snmpm_request_table,
[set, protected, named_table, {keypos, #request.id}]),
@@ -553,7 +587,7 @@ do_init() ->
[set, protected, named_table, {keypos, #monitor.id}]),
%% -- Start the note-store and net-if processes --
- {NoteStore, NoteStoreRef} = do_init_note_store(Prio),
+ {NoteStore, NoteStoreRef} = do_init_note_store(Prio),
{NetIf, NetIfModule, NetIfRef} = do_init_net_if(NoteStore),
MiniMIB = snmpm_config:make_mini_mib(),
@@ -563,7 +597,9 @@ do_init() ->
note_store_ref = NoteStoreRef,
net_if = NetIf,
net_if_mod = NetIfModule,
- net_if_ref = NetIfRef},
+ net_if_ref = NetIfRef,
+ cbproxy = CBProxy,
+ cbproxy_pid = CBPPid},
?vlog("started", []),
{ok, State}.
@@ -1075,6 +1111,13 @@ handle_info({'EXIT', Pid, Reason}, #state{gct = Pid} = State) ->
{noreply, State#state{gct = GCT}};
+handle_info({'EXIT', Pid, Reason}, #state{cbproxy_pid = Pid} = State) ->
+ warning_msg("CallBack Proxy (~w) process crashed: "
+ "~n ~p", [Pid, Reason]),
+ NewCBP = cbproxy_start(),
+ {noreply, State#state{cbproxy_pid = NewCBP}};
+
+
handle_info(Info, State) ->
warning_msg("received unknown info: ~n~p", [Info]),
{noreply, State}.
@@ -1103,8 +1146,9 @@ code_change(_Vsn, #state{gct = Pid} = State0, _Extra) ->
%% Terminate
%%----------------------------------------------------------
-terminate(Reason, #state{gct = GCT}) ->
+terminate(Reason, #state{gct = GCT, cbproxy = CBP}) ->
?vdebug("terminate: ~p",[Reason]),
+ cbproxy_stop(CBP),
gct_stop(GCT),
snmpm_misc_sup:stop_note_store(),
snmpm_misc_sup:stop_net_if(),
@@ -1746,24 +1790,26 @@ handle_snmp_error(Domain, Addr, ReqId, Reason, State) ->
end.
-handle_error(_UserId, Mod, Reason, ReqId, Data, _State) ->
+handle_error(_UserId, Mod, Reason, ReqId, Data,
+ #state{cbproxy = CBP} = _State) ->
?vtrace("handle_error -> entry when"
"~n Mod: ~p", [Mod]),
- F = fun() ->
- try
- begin
- Mod:handle_error(ReqId, Reason, Data)
- end
- catch
- C:E:S ->
- CallbackArgs = [ReqId, Reason, Data],
- handle_invalid_result(handle_error, CallbackArgs,
- C, E, S)
- end
- end,
- handle_callback(F),
+ handle_callback(CBP,
+ do_handle_error,
+ [Mod, ReqId, Reason, Data]),
ok.
+do_handle_error(Mod, ReqId, Reason, Data) ->
+ try
+ begin
+ Mod:handle_error(ReqId, Reason, Data)
+ end
+ catch
+ C:E:S ->
+ CallbackArgs = [ReqId, Reason, Data],
+ handle_invalid_result(handle_error, CallbackArgs, C, E, S)
+ end.
+
handle_snmp_pdu(#pdu{type = 'get-response', request_id = ReqId} = Pdu,
Domain, Addr, State) ->
@@ -1940,46 +1986,49 @@ handle_snmp_pdu(CrapPdu, Domain, Addr, _State) ->
handle_pdu(
_UserId, Mod, target_name = _RegType, TargetName, _Domain, _Addr,
- ReqId, SnmpResponse, Data, _State) ->
+ ReqId, SnmpResponse, Data, #state{cbproxy = CBP} = _State) ->
?vtrace("handle_pdu(target_name) -> entry when"
"~n Mod: ~p", [Mod]),
- F = fun() ->
- try
- begin
- Mod:handle_pdu(TargetName, ReqId, SnmpResponse, Data)
- end
- catch
- C:E:S ->
- CallbackArgs = [TargetName, ReqId, SnmpResponse, Data],
- handle_invalid_result(handle_pdu, CallbackArgs,
- C, E, S)
- end
- end,
- handle_callback(F),
+ handle_callback(CBP,
+ do_handle_pdu,
+ [Mod, TargetName, ReqId, SnmpResponse, Data]),
ok;
handle_pdu(
_UserId, Mod, addr_port = _RegType, _TargetName, _Domain, Addr,
- ReqId, SnmpResponse, Data, _State) ->
+ ReqId, SnmpResponse, Data, #state{cbproxy = CBP} = _State) ->
?vtrace("handle_pdu(addr_port) -> entry when"
"~n Mod: ~p", [Mod]),
- F = fun() ->
- {Ip, Port} = Addr,
- (catch Mod:handle_pdu(Ip, Port, ReqId, SnmpResponse, Data))
- end,
- handle_callback(F),
+ handle_callback(CBP,
+ do_handle_pdu,
+ [Mod, Addr, ReqId, SnmpResponse, Data]),
ok.
+do_handle_pdu(Mod, {Ip, Port}, ReqId, SnmpResponse, Data) ->
+ %% This is a deprecated version of the callback API, we skip handle
+ %% errors for this.
+ (catch Mod:handle_pdu(Ip, Port, ReqId, SnmpResponse, Data));
+do_handle_pdu(Mod, TargetName, ReqId, SnmpResponse, Data) ->
+ try
+ begin
+ Mod:handle_pdu(TargetName, ReqId, SnmpResponse, Data)
+ end
+ catch
+ C:E:S ->
+ CallbackArgs = [TargetName, ReqId, SnmpResponse, Data],
+ handle_invalid_result(handle_pdu, CallbackArgs, C, E, S)
+ end.
+
-handle_agent(UserId, Mod, Domain, Addr, Type, Ref, SnmpInfo, Data, State) ->
+handle_agent(UserId, Mod, Domain, Addr, Type, Ref, SnmpInfo, Data,
+ #state{cbproxy = CBP} = State) ->
?vtrace("handle_agent -> entry when"
"~n UserId: ~p"
"~n Type: ~p"
"~n Mod: ~p", [UserId, Type, Mod]),
- F = fun() ->
- do_handle_agent(UserId, Mod, Domain, Addr,
- Type, Ref, SnmpInfo, Data, State)
- end,
- handle_callback(F),
+ handle_callback(CBP,
+ do_handle_agent,
+ [UserId, Mod, Domain, Addr,
+ Type, Ref, SnmpInfo, Data, State]),
ok.
do_handle_agent(DefUserId, DefMod,
@@ -2247,17 +2296,16 @@ do_handle_snmp_trap(SnmpTrapInfo, Domain, Addr, State) ->
handle_trap(
- UserId, Mod, RegType, Target, Domain, Addr, SnmpTrapInfo, Data, State) ->
+ UserId, Mod, RegType, Target, Domain, Addr, SnmpTrapInfo, Data,
+ #state{cbproxy = CBP} = State) ->
?vtrace("handle_trap -> entry with"
"~n UserId: ~p"
"~n Mod: ~p", [UserId, Mod]),
- F = fun() ->
- do_handle_trap(
- UserId, Mod,
- RegType, Target, Domain, Addr,
- SnmpTrapInfo, Data, State)
- end,
- handle_callback(F),
+ handle_callback(CBP,
+ do_handle_trap,
+ [UserId, Mod,
+ RegType, Target, Domain, Addr,
+ SnmpTrapInfo, Data, State]),
ok.
@@ -2425,17 +2473,16 @@ handle_snmp_inform(_Ref, CrapInform, Domain, Addr, _State) ->
handle_inform(
UserId, Mod, Ref,
- RegType, Target, Domain, Addr, SnmpInform, Data, State) ->
+ RegType, Target, Domain, Addr, SnmpInform, Data,
+ #state{cbproxy = CBP} = State) ->
?vtrace("handle_inform -> entry with"
"~n UserId: ~p"
"~n Mod: ~p", [UserId, Mod]),
- F = fun() ->
- do_handle_inform(
- UserId, Mod, Ref,
- RegType, Target, Domain, Addr, SnmpInform,
- Data, State)
- end,
- handle_callback(F),
+ handle_callback(CBP,
+ do_handle_inform,
+ [UserId, Mod, Ref,
+ RegType, Target, Domain, Addr, SnmpInform,
+ Data, State]),
ok.
do_handle_inform(
@@ -2748,16 +2795,15 @@ handle_snmp_report(CrapReqId, CrapReport, CrapInfo, Domain, Addr, _State) ->
handle_report(UserId, Mod, RegType, Target, Domain, Addr,
- SnmpReport, Data, State) ->
+ SnmpReport, Data,
+ #state{cbproxy = CBP} = State) ->
?vtrace("handle_report -> entry with"
"~n UserId: ~p"
"~n Mod: ~p", [UserId, Mod]),
- F = fun() ->
- do_handle_report(
- UserId, Mod, RegType, Target, Domain, Addr,
- SnmpReport, Data, State)
- end,
- handle_callback(F),
+ handle_callback(CBP,
+ do_handle_report,
+ [UserId, Mod, RegType, Target, Domain, Addr,
+ SnmpReport, Data, State]),
ok.
do_handle_report(
@@ -2846,24 +2892,224 @@ do_handle_report(
end.
-handle_callback(F) ->
+
+%%----------------------------------------------------------------------
+%% Handle Callback
+%%----------------------------------------------------------------------
+
+handle_callback(temporary, Func, Args) ->
V = get(verbosity),
erlang:spawn(
fun() ->
put(sname, msew),
put(verbosity, V),
- F()
- end).
+ apply(?MODULE, Func, Args)
+ end);
+%% handle_callback(transient, MFA) ->
+%% Pid = which_transient_callback_proxy(ProxyID),
+%% Pid ! {?MODULE, self(), {callback, MFA}};
+handle_callback(permanent, Func, Args) ->
+ case whereis(?CBPROXY) of
+ Pid when is_pid(Pid) ->
+ Pid ! {?MODULE, self(), {callback, {?MODULE, Func, Args}}};
+ _ ->
+ %% We should really either die or restart (the cbproxy).
+ %% It could also be a race, in which case spawning a temporary
+ %% process is better than nothing...
+ %% ...but we should inform someone...
+ warning_msg("Permanent Callback Proxy could not be found - "
+ "using temporary"),
+ handle_callback(temporary, Func, Args)
+ end.
+
+
+
+%%----------------------------------------------------------------------
+cbproxy_start() ->
+ cbproxy_start(infinity).
+
+cbproxy_start(IdleTimeout) ->
+ cbproxy_start(self(), IdleTimeout).
+
+cbproxy_start(Parent, IdleTimeout) ->
+ Pid = spawn_link(fun() -> cbproxy_init(Parent, IdleTimeout) end),
+ receive
+ {?MODULE, Pid, ready} ->
+ Pid
+ end.
+
+cbproxy_stop(permanent) ->
+ case whereis(?CBPROXY) of
+ Pid when is_pid(Pid) ->
+ Pid ! {?MODULE, self(), stop},
+ ok;
+ _ ->
+ ok
+ end;
+cbproxy_stop(_) ->
+ ok.
+
+cbproxy_info() ->
+ case whereis(?CBPROXY) of
+ Pid when is_pid(Pid) ->
+ Pid ! {?MODULE, self(), info},
+ receive
+ {?MODULE, Pid, {info, Info}} ->
+ Info
+ after 5000 ->
+ %% If a callback function takes a long time,
+ %% the cb proxy may be busy. But we only wait for
+ %% a "short" time. No point in making things
+ %% complicated when all we do is collecting "info".
+ [{timeout, process_info(Pid)}]
+ end;
+ _ ->
+ []
+ end.
+
+%% The timeout is future proofing (intended to be used for
+%% "when" we introduce a transient callback proxy).
+cbproxy_init(Parent, _IdleTimeout) ->
+ ?snmpm_info("CallBack Proxy: starting", []),
+ erlang:register(?CBPROXY, self()),
+ State = #{parent => Parent,
+ cnt => 0,
+ max_work => 0,
+ awork => 0},
+ Parent ! {?MODULE, self(), ready},
+ cbproxy_loop(State).
+
+%% * Every time a "counter" wraps, we send a message regarding this
+%% (to the server) and resets the counter.
+%% * Every time the AWT (accumulated work time) exceeds or is equal to 1h,
+%% we send a message regarding this (to the server) and resets the AWT.
+%%
+cbproxy_loop(#{parent := Pid} = State) ->
+ receive
+ {?MODULE, Pid, stop} ->
+ cbp_handle_stop(State),
+ exit(normal);
+
+
+ {?MODULE, Pid, info} ->
+ Info = cbp_handle_info(State),
+ Pid ! {?MODULE, self(), {info, Info}},
+ ?MODULE:cbproxy_loop(State);
+
+
+ %% And this is what we are here for:
+ {?MODULE, Pid, {callback, {Mod, Func, Args}}} ->
+ F = fun() -> apply(Mod, Func, Args) end,
+ ?MODULE:cbproxy_loop(cbp_handle_callback(State, F));
+
+ %% And this is what we are here for:
+ {?MODULE, Pid, {callback, F}} when is_function(F, 0) ->
+ ?MODULE:cbproxy_loop(cbp_handle_callback(State, F))
+
+
+ after 5000 ->
+ %% This is for code upgrade
+ ?MODULE:cbproxy_loop(State)
+ end.
+
+cbp_handle_stop(#{activity := AT,
+ cnt := CNT,
+ max_work := MWT,
+ awork := AWT}) ->
+ ?snmpm_info("CallBack Proxy: stop =>"
+ "~n Number of Calls: ~w"
+ "~n Last Activity: ~s"
+ "~n Max Work Time: ~s"
+ "~n Accumulated Work Time: ~s",
+ [CNT, cbp_fts(cbp_ts(AT)), cbp_ft(MWT), cbp_ft(AWT)]);
+cbp_handle_stop(_) ->
+ ?snmpm_info("CallBack Proxy: stop =>"
+ "~n Number of Calls: 0", []).
+
+cbp_handle_info(#{activity := AT,
+ cnt := CNT,
+ max_work := MWT,
+ awork := AWT}) ->
+ ATS = cbp_ts(AT),
+ [{cnt, CNT},
+ {activity, ATS},
+ {max_work, MWT},
+ {work, AWT}];
+cbp_handle_info(_) ->
+ [{cnt, 0}, {awork, 0}, {max_work, 0}].
+cbp_handle_callback(#{cnt := CNT1,
+ max_work := MWT,
+ awork := AWT1} = State, F) ->
+ T1 = cbp_t(),
+ (catch F()),
+ T2 = cbp_t(),
+ CallbackWT = T2 - T1,
+ NewMWT = cbp_max(CallbackWT, MWT),
+ AWT2 = cbp_inc(awt, AWT1, CallbackWT, ?CBP_AWT_MAX),
+ CNT2 = cbp_inc(cnt, CNT1, 1, ?CBP_CNT_MAX),
+ State#{cnt => CNT2,
+ max_work => NewMWT,
+ awork => AWT2,
+ activity => T2}.
+
+cbp_t() ->
+ erlang:system_time(microsecond).
+
+cbp_max(A, B) when (A > B) ->
+ A;
+cbp_max(_, B) ->
+ B.
+
+cbp_inc(awt, Val, Inc, Max) when (Val + Inc) > Max ->
+ ?snmpm_info("CallBack Proxy: Accumulated Work Time wrapped 1 hour", []),
+ (Val+Inc) - Max;
+cbp_inc(cnt, Val, Inc, Max) when (Val + Inc) > Max ->
+ ?snmpm_info("CallBack Proxy: work counter wrapped", []),
+ (Val+Inc) - Max;
+cbp_inc(_, Val, Inc, _) ->
+ Val + Inc.
+
+cbp_ts(T) ->
+ MegaSecs = T div 1000000000000,
+ Secs = T div 1000000 - MegaSecs*1000000,
+ MicroSecs = T rem 1000000,
+ {MegaSecs, Secs, MicroSecs}.
+
+cbp_fts({_, _, N3} = TS) ->
+ {Date, Time} = calendar:now_to_datetime(TS),
+ {YYYY,MM,DD} = Date,
+ {Hour,Min,Sec} = Time,
+ FormatDate =
+ io_lib:format("~.4w:~.2.0w:~.2.0w ~.2.0w:~.2.0w:~.2.0w ~w",
+ [YYYY,MM,DD,Hour,Min,Sec,round(N3/1000)]),
+ lists:flatten(FormatDate).
+
+cbp_ft(T) when T < 1000 ->
+ cbp_f("~w usec", [T]);
+cbp_ft(T) when T < 1000000 ->
+ cbp_f("~w msec", [T div 1000]);
+cbp_ft(T) when T < 60000000 ->
+ cbp_f("~w sec", [T div (1000*1000)]);
+cbp_ft(T) ->
+ cbp_f("~w min", [T div (60*1000*1000)]).
+
+
+cbp_f(F, A) ->
+ lists:flatten(io_lib:format(F, A)).
+
+
+%%----------------------------------------------------------------------
+
handle_invalid_result(Func, Args, C, E, S) ->
error_msg("Callback function failed: "
- "~n Function: ~p"
- "~n Args: ~p"
- "~n Class: ~p"
- "~n Error: ~p"
- "~n Stacktrace: ~p",
+ "~n Function: ~p"
+ "~n Args: ~p"
+ "~n Error Class: ~p"
+ "~n Error: ~p"
+ "~n Stacktrace: ~p",
[Func, Args, C, E, S]).
handle_invalid_result(Func, Args, InvalidResult) ->
@@ -3411,6 +3657,8 @@ call(Req) ->
call(Req, To) ->
gen_server:call(?SERVER, Req, To).
+warning_msg(F) ->
+ warning_msg(F, []).
warning_msg(F, A) ->
?snmpm_warning("Server: " ++ F, A).
@@ -3420,23 +3668,33 @@ error_msg(F, A) ->
%%----------------------------------------------------------------------
-get_info(#state{gct = GCT,
- net_if = NI, net_if_mod = NIMod,
- note_store = NS}) ->
- Info = [{server, server_info(GCT)},
+get_info(#state{gct = GCT,
+ net_if = NI,
+ net_if_mod = NIMod,
+ note_store = NS,
+ cbproxy = CBP}) ->
+ Info = [{server, server_info(GCT, CBP)},
{config, config_info()},
{net_if, net_if_info(NI, NIMod)},
{note_store, note_store_info(NS)},
{stats_counters, get_stats_counters()}],
Info.
-server_info(GCT) ->
+server_info(GCT, CBP) ->
+ {CBPInfo, CBPSz} =
+ if
+ (CBP =:= permanent) ->
+ {[{cbp, cbproxy_info()}],
+ [{cbp, proc_mem(whereis(?CBPROXY))}]};
+ true ->
+ {[], []}
+ end,
ProcSize = proc_mem(self()),
GCTSz = proc_mem(GCT),
RTSz = tab_size(snmpm_request_table),
MTSz = tab_size(snmpm_monitor_table),
- [{process_memory, [{server, ProcSize}, {gct, GCTSz}]},
- {db_memory, [{request, RTSz}, {monitor, MTSz}]}].
+ [{process_memory, [{server, ProcSize}, {gct, GCTSz}] ++ CBPSz},
+ {db_memory, [{request, RTSz}, {monitor, MTSz}]}] ++ CBPInfo.
proc_mem(P) when is_pid(P) ->
case (catch erlang:process_info(P, memory)) of
diff --git a/lib/snmp/test/Makefile b/lib/snmp/test/Makefile
index d9b01536ea..a9a88ccbfa 100644
--- a/lib/snmp/test/Makefile
+++ b/lib/snmp/test/Makefile
@@ -37,7 +37,6 @@ VSN = $(SNMP_VSN)
include modules.mk
SNMP_ROOT = ..
-SNMP_SUITE = snmp_SUITE
ERL_FILES = $(MODULES:%=%.erl)
@@ -118,10 +117,6 @@ GROUP_CHECK = +'{group_check,false}'
SNMP_MIB_FLAGS += $(GROUP_CHECK) $(USE_DESCRIPTION) -I$(SNMP_BIN_TARGET_DIR)
-ifndef SUITE
-SUITE = snmp_SUITE
-endif
-
ESTOP = -s init stop
ifeq ($(DONT_STOP),true)
@@ -193,30 +188,20 @@ clean:
docs:
-appup: snmp_appup_mgr.$(EMULATOR)
-
mib: $(MIB_TARGETS)
make: old_targets
-test: make
- $(MERL) $(ARGS) -sname snmp_test $(ERL_PATH) \
- -s snmp_test_server run $(SUITE) \
- $(MAYBE_ESTOP)
+test: agent manager
agent: make
$(MERL) $(ARGS) -sname snmp_agent_test $(ERL_PATH) \
- -s snmp_test_server run snmp_agent_test \
+ -s snmp_test_server run snmp_agent_SUITE \
$(MAYBE_ESTOP)
manager: make
$(MERL) $(ARGS) -sname snmp_manager_test $(ERL_PATH) \
- -s snmp_test_server run snmp_manager_test \
- $(MAYBE_ESTOP)
-
-appup: make
- $(MERL) $(ARGS) -sname snmp_appup_test $(ERL_PATH) \
- -s snmp_test_server run snmp_appup_test \
+ -s snmp_test_server run snmp_manager_SUITE \
$(MAYBE_ESTOP)
diff --git a/lib/snmp/test/modules.mk b/lib/snmp/test/modules.mk
index ec3870dbd8..a1554815d9 100644
--- a/lib/snmp/test/modules.mk
+++ b/lib/snmp/test/modules.mk
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2004-2016. All Rights Reserved.
+# Copyright Ericsson AB 2004-2019. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -19,29 +19,27 @@
# %CopyrightEnd%
SUITE_MODULES = \
- snmp_SUITE \
- snmp_to_snmpnet_SUITE \
- snmp_app_test \
- snmp_appup_test \
- snmp_compiler_test \
- snmp_conf_test \
- snmp_log_test \
- snmp_note_store_test \
- snmp_pdus_test \
- snmp_agent_mibs_test \
- snmp_agent_nfilter_test \
- snmp_agent_test \
+ snmp_agent_SUITE \
+ snmp_agent_conf_SUITE \
+ snmp_agent_mibs_SUITE \
+ snmp_agent_nfilter_SUITE \
+ snmp_app_SUITE \
+ snmp_compiler_SUITE \
+ snmp_conf_SUITE \
+ snmp_log_SUITE \
+ snmp_manager_config_SUITE \
+ snmp_manager_user_SUITE \
+ snmp_manager_SUITE \
+ snmp_note_store_SUITE \
+ snmp_pdus_SUITE \
+ snmp_to_snmpnet_SUITE
+
+TEST_UTIL_MODULES = \
snmp_agent_test_get \
- snmp_agent_conf_test \
snmp_agent_test_lib \
- snmp_manager_config_test \
snmp_manager_user \
snmp_manager_user_old \
- snmp_manager_user_test \
snmp_manager_user_test_lib \
- snmp_manager_test
-
-TEST_UTIL_MODULES = \
snmp_test_global_sys_monitor \
snmp_test_sys_monitor \
snmp_test_lib \
diff --git a/lib/snmp/test/snmp_SUITE.erl b/lib/snmp/test/snmp_SUITE.erl
deleted file mode 100644
index 05bd86253b..0000000000
--- a/lib/snmp/test/snmp_SUITE.erl
+++ /dev/null
@@ -1,129 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2016. All Rights Reserved.
-%%
-%% Licensed under the Apache License, Version 2.0 (the "License");
-%% you may not use this file except in compliance with the License.
-%% You may obtain a copy of the License at
-%%
-%% http://www.apache.org/licenses/LICENSE-2.0
-%%
-%% Unless required by applicable law or agreed to in writing, software
-%% distributed under the License is distributed on an "AS IS" BASIS,
-%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-%% See the License for the specific language governing permissions and
-%% limitations under the License.
-%%
-%% %CopyrightEnd%
-%%
-
--module(snmp_SUITE).
-
--include("snmp_test_lib.hrl").
-
--export([all/0,
- suite/0,
- groups/0,
- init_per_suite/1, end_per_suite/1,
- init_per_group/2, end_per_group/2,
- init_per_testcase/2, end_per_testcase/2
- ]).
-
-
-%%
-%% -----
-%%
-
-init_per_testcase(_Case, Config) when is_list(Config) ->
- Config.
-
-end_per_testcase(_Case, Config) when is_list(Config) ->
- Config.
-
-
-init_per_suite(Config) when is_list(Config) ->
-
- ?DBG("init_per_suite -> entry with"
- "~n Config: ~p", [Config]),
-
- Config.
-
-end_per_suite(Config) when is_list(Config) ->
-
- ?DBG("end_per_suite -> entry with"
- "~n Config: ~p", [Config]),
-
- Config.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Top test case
-
-suite() ->
- [{ct_hooks, [ts_install_cth]}].
-
-all() ->
- [{group, app},
- {group, compiler},
- {group, misc},
- {group, agent},
- {group, manager}].
-
-groups() ->
- [
- {app, [], [{group, app_test},
- {group, appup_test}]},
- {compiler, [], [{group, compiler_test}]},
- {misc, [], [{group, conf_test},
- {group, pdus_test},
- {group, log_test},
- {group, note_store_test}]},
- {agent, [], [{group, mibs_test},
- {group, nfilter_test},
- {group, agent_test},
- {group, agent_conf_test},
- {group, snmpnet_test}]},
- {manager, [], [{group, manager_config_test},
- {group, manager_user_test},
- {group, manager_test}]},
-
- {app_test, [], [{snmp_app_test, all}]},
- {appup_test, [], [{snmp_appup_test, all}]},
- {compiler_test, [], [{snmp_compiler_test, all}]},
- {conf_test, [], [{snmp_conf_test, all}]},
- {pdus_test, [], [{snmp_pdus_test, all}]},
- {log_test, [], [{snmp_log_test, all}]},
- {note_store_test, [], [{snmp_note_store_test, all}]},
- {mibs_test, [], [{snmp_agent_mibs_test, all}]},
- {nfilter_test, [], [{snmp_agent_nfilter_test, all}]},
- {agent_test, [], [{snmp_agent_test, all}]},
- {agent_conf_test, [], [{snmp_agent_conf_test, all}]},
- {snmpnet_test, [], [{snmp_to_snmpnet_SUITE, all}]},
- {manager_config_test, [], [{snmp_manager_config_test, all}]},
- {manager_user_test, [], [{snmp_manager_user_test, all}]},
- {manager_test, [], [{snmp_manager_test, all}]}
- ].
-
-
-init_per_group(GroupName, Config0) ->
-
- ?DBG("init_per_group -> entry with"
- "~n GroupName: ~p"
- "~n Config0: ~p", [GroupName, Config0]),
-
- case GroupName of
- snmpnet_test ->
- Config0;
- _ ->
- %% Group name is not really the suite name
- %% (but it is a good enough approximation),
- %% but it does not matter since we only need
- %% it to be unique.
- snmp_test_lib:init_suite_top_dir(GroupName, Config0)
- end.
-
-end_per_group(snmpnet_test, Config) ->
- Config;
-end_per_group(_GroupName, Config) ->
- lists:keydelete(snmp_suite_top_dir, 1, Config).
diff --git a/lib/snmp/test/snmp_agent_test.erl b/lib/snmp/test/snmp_agent_SUITE.erl
index 1726a04513..6159aa9dda 100644
--- a/lib/snmp/test/snmp_agent_test.erl
+++ b/lib/snmp/test/snmp_agent_SUITE.erl
@@ -18,11 +18,10 @@
%% %CopyrightEnd%
%%
--module(snmp_agent_test).
+-module(snmp_agent_SUITE).
-export([
- all/0,
- groups/0,
+ suite/0, all/0, groups/0,
init_per_suite/1, end_per_suite/1,
init_per_group/2, end_per_group/2,
init_per_testcase/2, end_per_testcase/2,
@@ -501,6 +500,13 @@
Type, Ent, Gen, Spec, ExpVBs, To)).
+%%======================================================================
+%% Common Test interface functions
+%%======================================================================
+
+suite() ->
+ [{ct_hooks, [ts_install_cth]}].
+
all() ->
%% Reqs = [mnesia, distribution, {local_slave_nodes, 2}, {time, 360}],
Conf1 = [{group, all_tcs}],
@@ -509,7 +515,7 @@ all() ->
groups() ->
[
- {all_tcs, [], cases()},
+ {all_tcs, [], all_cases()},
{mib_storage, [], mib_storage_cases()},
{mib_storage_ets, [], mib_storage_ets_cases()},
{mib_storage_dets, [], mib_storage_dets_cases()},
@@ -550,54 +556,86 @@ groups() ->
].
+all_cases() ->
+ [
+ {group, misc},
+ {group, test_v1},
+ {group, test_v2},
+ {group, test_v1_v2},
+ {group, test_v3},
+ {group, test_v1_ipv6},
+ {group, test_v2_ipv6},
+ {group, test_v1_v2_ipv6},
+ {group, test_v3_ipv6},
+ {group, test_multi_threaded},
+ {group, mib_storage},
+ {group, tickets1}
+ ].
+
+%%
+%% -----
+%%
+
init_per_suite(Config0) when is_list(Config0) ->
p("init_per_suite -> entry with"
"~n Config: ~p"
"~n Nodes: ~p", [Config0, erlang:nodes()]),
- Config1 = snmp_test_lib:init_suite_top_dir(?MODULE, Config0),
- Config2 = snmp_test_lib:fix_data_dir(Config1),
+ case ?LIB:init_per_suite(Config0) of
+ {skip, _} = SKIP ->
+ SKIP;
- %% Mib-dirs
- MibDir = snmp_test_lib:lookup(data_dir, Config2),
- StdMibDir = join([code:priv_dir(snmp), "mibs"]),
+ Config1 when is_list(Config1) ->
+ Config2 = ?LIB:init_suite_top_dir(?MODULE, Config1),
+ Config3 = ?LIB:fix_data_dir(Config2),
- Config3 = [{mib_dir, MibDir}, {std_mib_dir, StdMibDir} | Config2],
+ %% Mib-dirs
+ MibDir = ?LIB:lookup(data_dir, Config3),
+ StdMibDir = join([code:priv_dir(snmp), "mibs"]),
- snmp_test_global_sys_monitor:start(),
- snmp_test_sys_monitor:start(), % We need one on this node also
- snmp_test_mgr_counter_server:start(),
+ Config4 = [{mib_dir, MibDir}, {std_mib_dir, StdMibDir} | Config3],
- p("init_per_suite -> end when"
- "~n Config: ~p"
- "~n Nodes: ~p", [Config3, erlang:nodes()]),
+ %% We need a monitor on this node also
+ snmp_test_sys_monitor:start(),
- Config3.
+ snmp_test_mgr_counter_server:start(),
-end_per_suite(Config) when is_list(Config) ->
+ p("init_per_suite -> end when"
+ "~n Config: ~p"
+ "~n Nodes: ~p", [Config4, erlang:nodes()]),
+
+ Config4
+ end.
+
+end_per_suite(Config0) when is_list(Config0) ->
p("end_per_suite -> entry with"
- "~n Config: ~p"
- "~n Nodes: ~p", [Config, erlang:nodes()]),
+ "~n Config0: ~p"
+ "~n Nodes: ~p", [Config0, erlang:nodes()]),
case snmp_test_mgr_counter_server:stop() of
- {ok, _Counters} ->
+ {ok, Counters} ->
p("end_per_suite -> sucessfully stopped counter server"
- "~n Counters: ~p", [_Counters]);
+ "~n Counters: ~p", [Counters]);
{error, Reason} ->
p("end_per_suite -> failed stopping counter server"
"~n Reason: ~p", [Reason])
end,
snmp_test_sys_monitor:stop(),
- snmp_test_global_sys_monitor:stop(),
+ Config1 = ?LIB:end_per_suite(Config0),
p("end_per_suite -> end when"
"~n Nodes: ~p", [erlang:nodes()]),
- Config.
+ Config1.
+
+%%
+%% -----
+%%
+
init_per_group(all_tcs = GroupName, Config) ->
init_all(snmp_test_lib:init_group_top_dir(GroupName, Config));
init_per_group(otp7157 = GroupName, Config) ->
@@ -771,7 +809,9 @@ end_per_group(_GroupName, Config) ->
-%% ---- Init Per TestCase ----
+%%
+%% ----- Init Per TestCase -----
+%%
init_per_testcase(Case, Config) when is_list(Config) ->
p("init_per_testcase -> entry with"
@@ -833,39 +873,6 @@ init_per_testcase1(_Case, Config) when is_list(Config) ->
Dog = ?WD_START(?MINS(6)),
[{watchdog, Dog}| Config ].
-
-%% ---- End Per TestCase ----
-
-end_per_testcase(Case, Config) when is_list(Config) ->
- p("end_per_testcase -> entry with"
- "~n Config: ~p"
- "~n Nodes: ~p", [Config, erlang:nodes()]),
-
- display_log(Config),
-
- p("system events during test: "
- "~n ~p", [snmp_test_global_sys_monitor:events()]),
-
- Result = end_per_testcase1(Case, Config),
-
- p("end_per_testcase -> done with"
- "~n Result: ~p"
- "~n Nodes: ~p", [Result, erlang:nodes()]),
- Result.
-
-end_per_testcase1(otp8395, Config) when is_list(Config) ->
- otp8395({fin, Config});
-end_per_testcase1(otp9884, Config) when is_list(Config) ->
- otp9884({fin, Config});
-end_per_testcase1(_Case, Config) when is_list(Config) ->
- ?DBG("end_per_testcase1 -> entry with"
- "~n Case: ~p"
- "~n Config: ~p", [_Case, Config]),
- Dog = ?config(watchdog, Config),
- ?WD_STOP(Dog),
- Config.
-
-
init_per_testcase2(Case, Config) ->
?DBG("end_per_testcase2 -> entry with"
@@ -900,25 +907,40 @@ init_per_testcase2(Case, Config) ->
{sub_agent_top_dir, SubAgentTopDir},
{manager_top_dir, ManagerTopDir} | Config].
-%% end_per_testcase2(_Case, Config) ->
-%% Config.
+
+%% ---- End Per TestCase ----
+
+end_per_testcase(Case, Config) when is_list(Config) ->
+ p("end_per_testcase -> entry with"
+ "~n Config: ~p"
+ "~n Nodes: ~p", [Config, erlang:nodes()]),
+
+ display_log(Config),
+
+ p("system events during test: "
+ "~n ~p", [snmp_test_global_sys_monitor:events()]),
+
+ Result = end_per_testcase1(Case, Config),
+
+ p("end_per_testcase -> done with"
+ "~n Result: ~p"
+ "~n Nodes: ~p", [Result, erlang:nodes()]),
+ Result.
+
+end_per_testcase1(otp8395, Config) when is_list(Config) ->
+ otp8395({fin, Config});
+end_per_testcase1(otp9884, Config) when is_list(Config) ->
+ otp9884({fin, Config});
+end_per_testcase1(_Case, Config) when is_list(Config) ->
+ ?DBG("end_per_testcase1 -> entry with"
+ "~n Case: ~p"
+ "~n Config: ~p", [_Case, Config]),
+ Dog = ?config(watchdog, Config),
+ ?WD_STOP(Dog),
+ Config.
+
-cases() ->
- [
- {group, misc},
- {group, test_v1},
- {group, test_v2},
- {group, test_v1_v2},
- {group, test_v3},
- {group, test_v1_ipv6},
- {group, test_v2_ipv6},
- {group, test_v1_v2_ipv6},
- {group, test_v3_ipv6},
- {group, test_multi_threaded},
- {group, mib_storage},
- {group, tickets1}
- ].
%%%-----------------------------------------------------------------
diff --git a/lib/snmp/test/snmp_agent_conf_test.erl b/lib/snmp/test/snmp_agent_conf_SUITE.erl
index 0a22bd47d1..889af630a4 100644
--- a/lib/snmp/test/snmp_agent_conf_test.erl
+++ b/lib/snmp/test/snmp_agent_conf_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -18,32 +18,40 @@
%% %CopyrightEnd%
%%
--module(snmp_agent_conf_test).
+-module(snmp_agent_conf_SUITE).
%%----------------------------------------------------------------------
%% Include files
%%----------------------------------------------------------------------
-%-include_lib("test_server/include/test_server.hrl").
-%-include("snmp_test_lib.hrl").
+-include("snmp_test_lib.hrl").
-include_lib("common_test/include/ct.hrl").
-export([
- all/0,
- groups/0,
- init_per_suite/1,
- end_per_suite/1,
+ suite/0, all/0, groups/0,
+ init_per_suite/1, end_per_suite/1,
+ init_per_group/2, end_per_group/2,
+ init_per_testcase/2, end_per_testcase/2,
+
+ check_agent/1,
+ check_usm/1,
+ check_vacm/1
+ ]).
- check_agent/1,
- check_usm/1,
- check_vacm/1
- ]).
-all() -> [
- check_agent,
- check_usm,
- check_vacm
+%%======================================================================
+%% Common Test interface functions
+%%======================================================================
+
+suite() ->
+ [{ct_hooks, [ts_install_cth]}].
+
+all() ->
+ [
+ check_agent,
+ check_usm,
+ check_vacm
].
@@ -51,14 +59,54 @@ groups() ->
[].
-init_per_suite(Config) ->
- PrivDir = ?config(priv_dir, Config),
- PrivSubdir = filename:join(PrivDir, "snmp_agent_conf_test"),
- ok = filelib:ensure_dir(filename:join(PrivSubdir, "dummy")),
- [{priv_subdir, PrivSubdir} | Config].
+%%
+%% -----
+%%
+
+init_per_suite(Config0) ->
+ case ?LIB:init_per_suite(Config0) of
+ {skip, _} = SKIP ->
+ SKIP;
+ Config1 when is_list(Config1) ->
+ snmp_test_sys_monitor:start(),
+ PrivDir = ?config(priv_dir, Config1),
+ PrivSubdir = filename:join(PrivDir, "snmp_agent_conf_test"),
+ ok = filelib:ensure_dir(filename:join(PrivSubdir, "dummy")),
+ [{priv_subdir, PrivSubdir} | Config1]
+ end.
+
+end_per_suite(Config) ->
+ snmp_test_sys_monitor:stop(),
+ ?LIB:end_per_suite(Config).
+
+
+
+%%
+%% -----
+%%
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+%%
+%% -----
+%%
+
+init_per_testcase(_Case, Config) when is_list(Config) ->
+ snmp_test_global_sys_monitor:reset_events(),
+ Config.
+
+end_per_testcase(_Case, Config) when is_list(Config) ->
+ ?PRINT2("system events during test: "
+ "~n ~p", [snmp_test_global_sys_monitor:events()]),
+ Config.
+
+
-end_per_suite(_Config) ->
- ok.
%%======================================================================
%% Test data
diff --git a/lib/snmp/test/snmp_agent_mibs_test.erl b/lib/snmp/test/snmp_agent_mibs_SUITE.erl
index 4babffef43..9545dfdcc9 100644
--- a/lib/snmp/test/snmp_agent_mibs_test.erl
+++ b/lib/snmp/test/snmp_agent_mibs_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -24,7 +24,7 @@
%% Some of these tests should really be in a mib-storage suite.
%%----------------------------------------------------------------------
--module(snmp_agent_mibs_test).
+-module(snmp_agent_mibs_SUITE).
%%----------------------------------------------------------------------
@@ -43,18 +43,12 @@
%%----------------------------------------------------------------------
%% External exports
%%----------------------------------------------------------------------
--export([
- all/0,
- groups/0,
-
- init_per_suite/1,
- end_per_suite/1,
-
- init_per_group/2,
- end_per_group/2,
- init_per_testcase/2,
- end_per_testcase/2,
+-export([
+ suite/0, all/0, groups/0,
+ init_per_suite/1, end_per_suite/1,
+ init_per_group/2, end_per_group/2,
+ init_per_testcase/2, end_per_testcase/2,
start_and_stop/1,
@@ -73,45 +67,98 @@
]).
-%%----------------------------------------------------------------------
-%% Internal exports
-%%----------------------------------------------------------------------
+%%======================================================================
+%% Common Test interface functions
+%%======================================================================
-%%----------------------------------------------------------------------
-%% Macros
-%%----------------------------------------------------------------------
+suite() ->
+ [{ct_hooks, [ts_install_cth]}].
-%%----------------------------------------------------------------------
-%% Records
-%%----------------------------------------------------------------------
+all() ->
+ [
+ start_and_stop,
+ load_unload,
+ {group, size_check},
+ me_lookup,
+ which_mib,
+ cache_test
+ ].
-%%======================================================================
-%% External functions
-%%======================================================================
+groups() ->
+ [
+ {size_check, [], size_check_cases()}
+ ].
+
+size_check_cases() ->
+ [
+ size_check_ets1, % Plain ets
+ size_check_ets2, % ets with a file
+ size_check_ets2_bad_file1, % ets with a bad file
+ size_check_ets3, % ets with a checksummed file
+ size_check_ets3_bad_file1, % ets with bad file (checksummed)
+ size_check_dets, % Plain dets
+ size_check_mnesia % Plain mnesia
+ ].
+
+
+
+%%
+%% -----
+%%
init_per_suite(Config0) when is_list(Config0) ->
?DBG("init_per_suite -> entry with"
"~n Config0: ~p", [Config0]),
- Config1 = snmp_test_lib:init_suite_top_dir(?MODULE, Config0),
+ case snmp_test_lib:init_per_suite(Config0) of
+ {skip, _} = SKIP ->
+ SKIP;
+
+ Config1 when is_list(Config1) ->
+ Config2 = ?LIB:init_suite_top_dir(?MODULE, Config1),
- ?DBG("init_per_suite -> done when"
- "~n Config1: ~p", [Config1]),
+ %% We need a monitor on this node also
+ snmp_test_sys_monitor:start(),
- Config1.
+ ?DBG("init_per_suite -> done when"
+ "~n Config: ~p", [Config]),
+
+ Config2
+ end.
end_per_suite(Config) when is_list(Config) ->
?DBG("end_per_suite -> entry with"
"~n Config: ~p", [Config]),
+ snmp_test_sys_monitor:stop(),
+
+ ?LIB:end_per_suite(Config).
+
+
+
+%%
+%% -----
+%%
+
+init_per_group(GroupName, Config) ->
+ ?LIB:init_group_top_dir(GroupName, Config).
+
+end_per_group(_GroupName, Config) ->
Config.
+
+
+%%
+%% -----
+%%
+
init_per_testcase(Case, Config0) when is_list(Config0) ->
- Config1 = snmp_test_lib:fix_data_dir(Config0),
- CaseTopDir = snmp_test_lib:init_testcase_top_dir(Case, Config1),
+ snmp_test_global_sys_monitor:reset_events(),
+ Config1 = ?LIB:fix_data_dir(Config0),
+ CaseTopDir = ?LIB:init_testcase_top_dir(Case, Config1),
DbDir = join(CaseTopDir, "db_dir/"),
?line ok = file:make_dir(DbDir),
init_per_testcase2(Case, [{db_dir, DbDir},
@@ -131,11 +178,18 @@ init_per_testcase2(size_check_ets3_bad_file1, Config) when is_list(Config) ->
Config;
init_per_testcase2(size_check_mnesia, Config) when is_list(Config) ->
DbDir = ?config(db_dir, Config),
- mnesia_start([{dir, DbDir}]),
- Config;
+ try
+ begin
+ mnesia_start([{dir, DbDir}]),
+ Config
+ end
+ catch
+ throw:{skip, _} = SKIP ->
+ SKIP
+ end;
init_per_testcase2(cache_test, Config) when is_list(Config) ->
Min = timer:minutes(5),
- Timeout =
+ Timeout =
case lists:keysearch(tc_timeout, 1, Config) of
{value, {tc_timeout, TcTimeout}} when TcTimeout < Min ->
Min;
@@ -149,72 +203,23 @@ init_per_testcase2(cache_test, Config) when is_list(Config) ->
init_per_testcase2(_Case, Config) when is_list(Config) ->
Config.
-%% end_per_testcase(EtsCase, Config)
-%% when (is_list(Config) andalso
-%% ((EtsCase =:= size_check_ets2) orelse
-%% (EtsCase =:= size_check_ets3))) ->
-%% Dir = ?config(ets_dir, Config),
-%% ?line ok = ?DEL_DIR(Dir),
-%% lists:keydelete(ets_dir, 1, Config);
-%% end_per_testcase(size_check_dets, Config) when is_list(Config) ->
-%% Dir = ?config(dets_dir, Config),
-%% ?line ok = ?DEL_DIR(Dir),
-%% lists:keydelete(dets_dir, 1, Config);
-end_per_testcase(size_check_mnesia, Config) when is_list(Config) ->
+
+end_per_testcase(Case, Config) when is_list(Config) ->
+ ?PRINT2("system events during test: "
+ "~n ~p", [snmp_test_global_sys_monitor:events()]),
+ end_per_testcase1(Case, Config).
+
+end_per_testcase1(size_check_mnesia, Config) when is_list(Config) ->
mnesia_stop(),
- %% Dir = ?config(db_dir, Config),
- %% ?line ok = ?DEL_DIR(Dir),
- %% lists:keydelete(mnesia_dir, 1, Config);
Config;
-end_per_testcase(cache_test, Config) when is_list(Config) ->
+end_per_testcase1(cache_test, Config) when is_list(Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
Config;
-end_per_testcase(_Case, Config) when is_list(Config) ->
- Config.
-
-
-%%======================================================================
-%% Test case definitions
-%%======================================================================
-
-all() ->
- cases().
-
-groups() ->
- [{size_check, [],
- [
- size_check_ets1, % Plain ets
- size_check_ets2, % ets with a file
- size_check_ets2_bad_file1, % ets with a bad file
- size_check_ets3, % ets with a checksummed file
- size_check_ets3_bad_file1, % ets with bad file (checksummed)
- size_check_dets, % Plain dets
- size_check_mnesia % Plain mnesia
- ]
- }].
-
-
-init_per_group(GroupName, Config) ->
- snmp_test_lib:init_group_top_dir(GroupName, Config).
-
-end_per_group(_GroupName, Config) ->
- %% Do we really need to do this?
- %% lists:keydelete(snmp_group_top_dir, 1, Config).
+end_per_testcase1(_Case, Config) when is_list(Config) ->
Config.
-cases() ->
- [
- start_and_stop,
- load_unload,
- {group, size_check},
- me_lookup,
- which_mib,
- cache_test
- ].
-
-
%%======================================================================
%% Test functions
%%======================================================================
@@ -627,26 +632,70 @@ mnesia_start(Opts) ->
mnesia_start(Opts, [node()]).
mnesia_start(Opts, Nodes) ->
- ?DBG("mnesia_start -> load mnesia", []),
- ?line ok = application:load(mnesia),
+ %% We can accept mnesia beeing loaded but *not* started.
+ %% If its started it *may* contain data that will invalidate
+ %% this test case.
+ ?PRINT2("mnesia_start -> try load mnesia when:"
+ "~n Loaded: ~p"
+ "~n Running: ~p", [apps_loaded(), apps_running()]),
+ ?line ok = case application:load(mnesia) of
+ ok ->
+ ok;
+ {error, {already_loaded, mnesia}} ->
+ ok;
+ {error, _} = ERROR ->
+ ERROR
+ end,
F = fun({Key, Val}) ->
- ?DBG("mnesia_start -> set mnesia env: ~n~p -> ~p", [Key,Val]),
+ ?PRINT2("mnesia_start -> try set mnesia env: "
+ "~n ~p -> ~p", [Key, Val]),
?line application_controller:set_env(mnesia, Key, Val)
end,
lists:foreach(F, Opts),
- ?DBG("mnesia_start -> create mnesia schema on ~p", [Nodes]),
- ?line ok = mnesia:create_schema(Nodes),
- ?DBG("mnesia_start -> start mnesia", []),
- ?line ok = application:start(mnesia),
+ ?PRINT2("mnesia_start -> create mnesia schema on ~p", [Nodes]),
+ ?line case mnesia:create_schema(Nodes) of
+ ok ->
+ ok;
+ {error, {_, {already_exist, _}}} ->
+ throw({skip, "Mnesia schema already exists"});
+ {error, SchemaReason} ->
+ throw({skip,
+ ?F("Failed create mnesia schema: ~p", [SchemaReason])})
+ end,
+ ?PRINT2("mnesia_start -> start mnesia", []),
+ ?line case application:start(mnesia) of
+ ok ->
+ ok;
+ {error, {already_started, mnesia}} ->
+ throw({skip, "Mnesia already started"});
+ {error, StartReason} ->
+ throw({skip,
+ ?F("Failed starting mnesia: ~p", [StartReason])})
+ end,
+ ?PRINT2("mnesia_start -> mnesia started", []),
ok.
mnesia_stop() ->
- ?DBG("mnesia_stop -> stop mnesia", []),
+ ?PRINT2("mnesia_stop -> try stop mnesia when:"
+ "~n Loaded: ~p"
+ "~n Running: ~p", [apps_loaded(), apps_running()]),
application:stop(mnesia),
- ?DBG("mnesia_stop -> unload mnesia", []),
+ ?PRINT2("mnesia_stop -> try unload mnesia when"
+ "~n Loaded: ~p"
+ "~n Running: ~p", [apps_loaded(), apps_running()]),
application:unload(mnesia),
+ ?PRINT2("mnesia_stop -> done when:"
+ "~n Loaded: ~p"
+ "~n Running: ~p", [apps_loaded(), apps_running()]),
ok.
-
+
+apps_loaded() ->
+ [App || {App, _, _} <- application:loaded_applications()].
+
+apps_running() ->
+ [App || {App, _, _} <- application:which_applications()].
+
+
%% - Symbolic Store mini interface
sym_start(Prio, Verbosity) ->
diff --git a/lib/snmp/test/snmp_agent_nfilter_test.erl b/lib/snmp/test/snmp_agent_nfilter_SUITE.erl
index 64fdf20c3f..d43871e57d 100644
--- a/lib/snmp/test/snmp_agent_nfilter_test.erl
+++ b/lib/snmp/test/snmp_agent_nfilter_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@
%%----------------------------------------------------------------------
%% Purpose:
%%----------------------------------------------------------------------
--module(snmp_agent_nfilter_test).
+-module(snmp_agent_nfilter_SUITE).
%%----------------------------------------------------------------------
%% Include files
@@ -62,11 +62,12 @@ init_per_testcase(_Case, Config) when is_list(Config) ->
end_per_testcase(_Case, Config) when is_list(Config) ->
Config.
+
%%======================================================================
%% Test case definitions
%%======================================================================
all() ->
- {skip,not_yet_implemented}.
+ {skip, "Not yet implemented"}.
%%======================================================================
diff --git a/lib/snmp/test/snmp_app_test.erl b/lib/snmp/test/snmp_app_SUITE.erl
index 5e69866f9a..07ebadd70d 100644
--- a/lib/snmp/test/snmp_app_test.erl
+++ b/lib/snmp/test/snmp_app_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -21,22 +21,74 @@
%%----------------------------------------------------------------------
%% Purpose: Verify the application specifics of the snmp application
%%----------------------------------------------------------------------
--module(snmp_app_test).
+-module(snmp_app_SUITE).
%% Note: This directive should only be used in test suites.
--compile(export_all).
+-export([
+ suite/0, all/0,
+ init_per_suite/1, end_per_suite/1,
+ init_per_group/2, end_per_group/2,
+ init_per_testcase/2, end_per_testcase/2,
+
+ app/0, app/1,
+ appup/0, appup/1
+ ]).
+
-include_lib("common_test/include/ct.hrl").
+-include("snmp_test_lib.hrl").
+
%%--------------------------------------------------------------------
%% Common Test interface functions -----------------------------------
%%--------------------------------------------------------------------
+
+suite() ->
+ [{ct_hooks, [ts_install_cth]}].
+
all() ->
[
app,
appup
].
+
+
+%%
+%% -----
+%%
+
+init_per_suite(Config) when is_list(Config) ->
+ Config.
+
+end_per_suite(Config) when is_list(Config) ->
+ Config.
+
+
+
+%%
+%% -----
+%%
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+%%
+%% -----
+%%
+
+init_per_testcase(_Case, Config) when is_list(Config) ->
+ Config.
+
+end_per_testcase(_Case, Config) when is_list(Config) ->
+ Config.
+
+
+
%%--------------------------------------------------------------------
%% Test Cases --------------------------------------------------------
%%--------------------------------------------------------------------
@@ -44,6 +96,8 @@ app() ->
[{doc, "Test that the snmp app file is ok"}].
app(Config) when is_list(Config) ->
ok = test_server:app_test(snmp).
+
+
%%--------------------------------------------------------------------
appup() ->
[{doc, "Test that the snmp appup file is ok"}].
diff --git a/lib/snmp/test/snmp_compiler_test.erl b/lib/snmp/test/snmp_compiler_SUITE.erl
index a28f925a22..aeb055742e 100644
--- a/lib/snmp/test/snmp_compiler_test.erl
+++ b/lib/snmp/test/snmp_compiler_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -21,10 +21,10 @@
%%----------------------------------------------------------------------
%% Purpose: Test the snmp mib compiler
%%
-%% Run test: ts:run(snmp, snmp_compiler_test, [batch]).
+%% Run test: ts:run(snmp, snmp_compiler_SUITE, [batch]).
%%
%%----------------------------------------------------------------------
--module(snmp_compiler_test).
+-module(snmp_compiler_SUITE).
%%----------------------------------------------------------------------
%% Include files
@@ -38,10 +38,10 @@
%% External exports
%%----------------------------------------------------------------------
-export([
- all/0,
+ suite/0, all/0,
+ init_per_suite/1, end_per_suite/1,
groups/0, init_per_group/2, end_per_group/2,
init_per_testcase/2, end_per_testcase/2,
- init_per_suite/1, end_per_suite/1,
description/1,
oid_conflicts/1,
@@ -62,25 +62,47 @@
otp_14196/1
]).
-%%----------------------------------------------------------------------
-%% Internal exports
-%%----------------------------------------------------------------------
--export([
- ]).
+%%======================================================================
+%% Common Test interface functions
+%%======================================================================
+suite() ->
+ [{ct_hooks, [ts_install_cth]}].
-%%----------------------------------------------------------------------
-%% Macros
-%%----------------------------------------------------------------------
-%%----------------------------------------------------------------------
-%% Records
-%%----------------------------------------------------------------------
+all() ->
+ [
+ description,
+ oid_conflicts,
+ imports,
+ module_identity,
+ agent_capabilities,
+ module_compliance,
+ warnings_as_errors,
+ augments_extra_info,
+ {group, tickets}
+ ].
-%%======================================================================
-%% External functions
-%%======================================================================
+groups() ->
+ [{tickets, [], tickets_cases()}].
+
+tickets_cases() ->
+ [
+ otp_6150,
+ otp_8574,
+ otp_8595,
+ otp_10799,
+ otp_10808,
+ otp_14145,
+ otp_13014,
+ otp_14196
+ ].
+
+
+%%
+%% -----
+%%
init_per_suite(Config0) when is_list(Config0) ->
@@ -106,50 +128,36 @@ end_per_suite(Config) when is_list(Config) ->
Config.
-init_per_testcase(Case, Config) when is_list(Config) ->
+%%
+%% -----
+%%
- ?DBG("init_per_testcase -> entry with"
- "~n Config: ~p", [Config]),
+init_per_group(_GroupName, Config) ->
+ Config.
- CaseTopDir = snmp_test_lib:init_testcase_top_dir(Case, Config),
+end_per_group(_GroupName, Config) ->
+ Config.
- [{case_top_dir, CaseTopDir} | Config].
-end_per_testcase(_Case, Config) when is_list(Config) ->
- Config.
+%%
+%% -----
+%%
-%%======================================================================
-%% Test case definitions
-%%======================================================================
+init_per_testcase(Case, Config) when is_list(Config) ->
-all() ->
- [
- description,
- oid_conflicts,
- imports,
- module_identity,
- agent_capabilities,
- module_compliance,
- warnings_as_errors,
- augments_extra_info,
- {group, tickets}
- ].
+ ?DBG("init_per_testcase -> entry with"
+ "~n Config: ~p", [Config]),
-groups() ->
- [{tickets, [],
- [otp_6150, otp_8574, otp_8595, otp_10799, otp_10808, otp_14145,
- otp_13014, otp_14196]}].
+ CaseTopDir = snmp_test_lib:init_testcase_top_dir(Case, Config),
-init_per_group(_GroupName, Config) ->
- Config.
+ [{case_top_dir, CaseTopDir} | Config].
-end_per_group(_GroupName, Config) ->
+end_per_testcase(_Case, Config) when is_list(Config) ->
Config.
-
%%======================================================================
%% Test functions
%%======================================================================
diff --git a/lib/snmp/test/snmp_conf_test.erl b/lib/snmp/test/snmp_conf_SUITE.erl
index 6242fdeca3..bd8375b400 100644
--- a/lib/snmp/test/snmp_conf_test.erl
+++ b/lib/snmp/test/snmp_conf_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -22,11 +22,12 @@
%%----------------------------------------------------------------------
%% Purpose:
%%----------------------------------------------------------------------
--module(snmp_conf_test).
+-module(snmp_conf_SUITE).
%%----------------------------------------------------------------------
%% Include files
%%----------------------------------------------------------------------
+
-include_lib("common_test/include/ct.hrl").
-include("snmp_test_lib.hrl").
@@ -38,7 +39,9 @@
%% External exports
%%----------------------------------------------------------------------
-export([
- all/0,groups/0,init_per_group/2,end_per_group/2,
+ suite/0, all/0, groups/0,
+ init_per_suite/1, end_per_suite/1,
+ init_per_group/2, end_per_group/2,
init_per_testcase/2, end_per_testcase/2,
check_mandatory/1,
@@ -60,43 +63,52 @@
read_files/1
]).
-%%----------------------------------------------------------------------
-%% Internal exports
-%%----------------------------------------------------------------------
--export([
- ]).
-
-%%----------------------------------------------------------------------
-%% Macros
-%%----------------------------------------------------------------------
-
-%%----------------------------------------------------------------------
-%% Records
-%%----------------------------------------------------------------------
%%======================================================================
-%% External functions
+%% Common Test interface functions
%%======================================================================
-init_per_testcase(_Case, Config) when is_list(Config) ->
- Config.
+suite() ->
+ [{ct_hooks, [ts_install_cth]}].
-end_per_testcase(_Case, Config) when is_list(Config) ->
- Config.
-
-%%======================================================================
-%% Test case definitions
-%%======================================================================
all() ->
-[check_mandatory, check_integer1, check_integer2,
- check_string1, check_string2, check_atom, check_ip,
- check_taddress, check_packet_size, check_oid,
- check_sec_model1, check_sec_model2, check_sec_level,
- check_timer, read, read_files].
+ [
+ check_mandatory,
+ check_integer1, check_integer2,
+ check_string1, check_string2,
+ check_atom,
+ check_ip,
+ check_taddress,
+ check_packet_size,
+ check_oid,
+ check_sec_model1,
+ check_sec_model2,
+ check_sec_level,
+ check_timer,
+ read, read_files
+ ].
groups() ->
[].
+
+
+%%
+%% -----
+%%
+
+init_per_suite(Config) when is_list(Config) ->
+ Config.
+
+end_per_suite(Config) when is_list(Config) ->
+ Config.
+
+
+
+%%
+%% -----
+%%
+
init_per_group(_GroupName, Config) ->
Config.
@@ -105,6 +117,18 @@ end_per_group(_GroupName, Config) ->
+%%
+%% -----
+%%
+
+init_per_testcase(_Case, Config) when is_list(Config) ->
+ Config.
+
+end_per_testcase(_Case, Config) when is_list(Config) ->
+ Config.
+
+
+
%%======================================================================
%% Test functions
%%======================================================================
diff --git a/lib/snmp/test/snmp_log_test.erl b/lib/snmp/test/snmp_log_SUITE.erl
index 8890b4b20d..6f9e7f5e49 100644
--- a/lib/snmp/test/snmp_log_test.erl
+++ b/lib/snmp/test/snmp_log_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -21,11 +21,12 @@
%%----------------------------------------------------------------------
%% Purpose:
%%
-%% Test: ts:run(snmp, snmp_log_test, [batch]).
-%% Test: ts:run(snmp, snmp_log_test, log_to_txt2, [batch]).
+%% Test: ts:run(snmp, snmp_log_SUITE, [batch]).
+%% Test: ts:run(snmp, snmp_log_SUITE, log_to_txt2, [batch]).
%%
%%----------------------------------------------------------------------
--module(snmp_log_test).
+-module(snmp_log_SUITE).
+
%%----------------------------------------------------------------------
%% Include files
@@ -41,13 +42,11 @@
%% External exports
%%----------------------------------------------------------------------
-export([
+ suite/0, all/0, groups/0,
+ init_per_suite/1, end_per_suite/1,
+ init_per_group/2, end_per_group/2,
init_per_testcase/2, end_per_testcase/2,
- all/0,
- groups/0,
- init_per_group/2,
- end_per_group/2,
-
open_and_close/1,
open_write_and_close1/1,
@@ -74,45 +73,13 @@
]).
-%%----------------------------------------------------------------------
-%% Macros
-%%----------------------------------------------------------------------
-
-%%----------------------------------------------------------------------
-%% Records
-%%----------------------------------------------------------------------
-
%%======================================================================
-%% External functions
+%% Common Test interface functions
%%======================================================================
-init_per_testcase(Case, Config) when is_list(Config) ->
- Dir = ?config(priv_dir, Config),
- LogTestDir = join(Dir, ?MODULE),
- CaseDir = join(LogTestDir, Case),
- case file:make_dir(LogTestDir) of
- ok ->
- ok;
- {error, eexist} ->
- ok;
- Error ->
- ?FAIL({failed_creating_subsuite_top_dir, Error})
- end,
- ?line ok = file:make_dir(CaseDir),
- Dog = ?WD_START(?MINS(5)),
- [{log_dir, CaseDir}, {watchdog, Dog}|Config].
-
-end_per_testcase(_Case, Config) when is_list(Config) ->
- %% Leave the dirs created above (enable debugging of the test case(s))
- Dog = ?config(watchdog, Config),
- ?WD_STOP(Dog),
- lists:keydelete(watchdog, 1, Config).
+suite() ->
+ [{ct_hooks, [ts_install_cth]}].
-
-%%======================================================================
-%% Test case definitions
-%%======================================================================
-%% ?SKIP(not_yet_implemented).
all() ->
[
open_and_close,
@@ -122,25 +89,99 @@ all() ->
groups() ->
[
- {open_write_and_close, [],
- [open_write_and_close1, open_write_and_close2,
- open_write_and_close3, open_write_and_close4]},
- {log_to_io, [], [log_to_io1, log_to_io2]},
- {log_to_txt, [],
- [log_to_txt1, log_to_txt2, log_to_txt3]}
+ {open_write_and_close, [], owac_cases()},
+ {log_to_io, [], l2i_cases()},
+ {log_to_txt, [], l2t_cases()}
+ ].
+
+
+owac_cases() ->
+ [
+ open_write_and_close1,
+ open_write_and_close2,
+ open_write_and_close3,
+ open_write_and_close4
].
+l2i_cases() ->
+ [
+ log_to_io1,
+ log_to_io2
+ ].
+
+l2t_cases() ->
+ [
+ log_to_txt1,
+ log_to_txt2,
+ log_to_txt3
+ ].
+
+
+
+%%
+%% -----
+%%
+
+init_per_suite(Config0) when is_list(Config0) ->
+ case ?LIB:init_per_suite(Config0) of
+ {skip, _} = SKIP ->
+ SKIP;
+
+ Config1 when is_list(Config1) ->
+ snmp_test_sys_monitor:start(),
+ Config1
+ end.
+
+end_per_suite(Config) when is_list(Config) ->
+ snmp_test_sys_monitor:stop(),
+ ?LIB:end_per_suite(Config).
+
+
+
+%%
+%% -----
+%%
+
init_per_group(_GroupName, Config) ->
- Config.
+ Config.
end_per_group(_GroupName, Config) ->
- Config.
+ Config.
+%%
+%% -----
+%%
+
+init_per_testcase(Case, Config) when is_list(Config) ->
+
+ snmp_test_global_sys_monitor:reset_events(),
+
+ Dir = ?config(priv_dir, Config),
+ LogTestDir = join(Dir, ?MODULE),
+ CaseDir = join(LogTestDir, Case),
+ case file:make_dir(LogTestDir) of
+ ok ->
+ ok;
+ {error, eexist} ->
+ ok;
+ Error ->
+ ?FAIL({failed_creating_subsuite_top_dir, Error})
+ end,
+ ?line ok = file:make_dir(CaseDir),
+ Dog = ?WD_START(?MINS(5)),
+ [{log_dir, CaseDir}, {watchdog, Dog}|Config].
+end_per_testcase(_Case, Config) when is_list(Config) ->
+ ?PRINT2("system events during test: "
+ "~n ~p", [snmp_test_global_sys_monitor:events()]),
+ %% Leave the dirs created above (enable debugging of the test case(s))
+ Dog = ?config(watchdog, Config),
+ ?WD_STOP(Dog),
+ lists:keydelete(watchdog, 1, Config).
@@ -510,7 +551,7 @@ log_to_txt(Name, SeqNoGen, Config) when is_list(Config) ->
?SLEEP(Time),
ok
end,
- To = lists:duplicate(20, 5000),
+ To = lists:duplicate(10, 5000),
?DBG("log_to_txt -> log the messages", []),
Start = calendar:local_time(),
diff --git a/lib/snmp/test/snmp_manager_test.erl b/lib/snmp/test/snmp_manager_SUITE.erl
index 0d171f8359..98aa8336fb 100644
--- a/lib/snmp/test/snmp_manager_test.erl
+++ b/lib/snmp/test/snmp_manager_SUITE.erl
@@ -21,12 +21,12 @@
%%----------------------------------------------------------------------
%% Purpose:
%%
-%% Test: ts:run(snmp, snmp_manager_test, [batch]).
-%% Test: ts:run(snmp, snmp_manager_test, event_tests, [batch]).
-%% Test: ts:run(snmp, snmp_manager_test, inform_swarm, [batch]).
+%% Test: ts:run(snmp, snmp_manager_SUITE, [batch]).
+%% Test: ts:run(snmp, snmp_manager_SUITE, event_tests, [batch]).
+%% Test: ts:run(snmp, snmp_manager_SUITE, inform_swarm, [batch]).
%%
%%----------------------------------------------------------------------
--module(snmp_manager_test).
+-module(snmp_manager_SUITE).
%%----------------------------------------------------------------------
%% Include files
@@ -45,14 +45,12 @@
%% External exports
%%----------------------------------------------------------------------
-export([
- all/0,
- groups/0,
- init_per_group/2, end_per_group/2,
- init_per_testcase/2, end_per_testcase/2,
+ suite/0, all/0, groups/0,
+ init_per_suite/1, end_per_suite/1,
+ init_per_group/2, end_per_group/2,
+ init_per_testcase/2, end_per_testcase/2,
- init_per_suite/1, end_per_suite/1,
-
simple_start_and_stop1/1,
simple_start_and_stop2/1,
simple_start_and_stop3/1,
@@ -77,17 +75,23 @@
simple_sync_get_next2/1,
simple_sync_get_next3/1,
simple_async_get_next2/1,
- simple_async_get_next3/1,
+ simple_async_get_next3_cbp_def/1,
+ simple_async_get_next3_cbp_temp/1,
+ simple_async_get_next3_cbp_perm/1,
simple_sync_set2/1,
simple_sync_set3/1,
simple_async_set2/1,
- simple_async_set3/1,
+ simple_async_set3_cbp_def/1,
+ simple_async_set3_cbp_temp/1,
+ simple_async_set3_cbp_perm/1,
simple_sync_get_bulk2/1,
simple_sync_get_bulk3/1,
simple_async_get_bulk2/1,
- simple_async_get_bulk3/1,
+ simple_async_get_bulk3_cbp_def/1,
+ simple_async_get_bulk3_cbp_temp/1,
+ simple_async_get_bulk3_cbp_perm/1,
misc_async2/1,
@@ -100,7 +104,9 @@
inform2/1,
inform3/1,
inform4/1,
- inform_swarm/1,
+ inform_swarm_cbp_def/1,
+ inform_swarm_cbp_temp/1,
+ inform_swarm_cbp_perm/1,
report/1,
@@ -140,52 +146,315 @@
%%----------------------------------------------------------------------
%%======================================================================
-%% External functions
+%% Common Test interface functions
%%======================================================================
+suite() ->
+ [{ct_hooks, [ts_install_cth]}].
+
+
+all() ->
+ [
+ {group, start_and_stop_tests},
+ {group, misc_tests},
+ {group, user_tests},
+ {group, agent_tests},
+ {group, request_tests},
+ {group, request_tests_mt},
+ {group, event_tests},
+ {group, event_tests_mt},
+ discovery,
+ {group, tickets},
+ {group, ipv6},
+ {group, ipv6_mt}
+ ].
+
+groups() ->
+ [
+ {start_and_stop_tests, [],
+ [
+ simple_start_and_stop1,
+ simple_start_and_stop2,
+ simple_start_and_stop3,
+ simple_start_and_monitor_crash1,
+ simple_start_and_monitor_crash2,
+ notify_started01,
+ notify_started02
+ ]
+ },
+ {misc_tests, [],
+ [
+ info
+ ]
+ },
+ {user_tests, [],
+ [
+ register_user1
+ ]
+ },
+ {agent_tests, [],
+ [
+ register_agent_old,
+ register_agent2,
+ register_agent3
+ ]
+ },
+ {request_tests, [],
+ [
+ {group, get_tests},
+ {group, get_next_tests},
+ {group, set_tests},
+ {group, bulk_tests},
+ {group, misc_request_tests}
+ ]
+ },
+ {request_tests_mt, [],
+ [
+ {group, get_tests},
+ {group, get_next_tests},
+ {group, set_tests},
+ {group, bulk_tests},
+ {group, misc_request_tests}
+ ]
+ },
+ {get_tests, [],
+ [
+ simple_sync_get2,
+ simple_sync_get3,
+ simple_async_get2,
+ simple_async_get3
+ ]
+ },
+ {get_next_tests, [],
+ [
+ simple_sync_get_next2,
+ simple_sync_get_next3,
+ simple_async_get_next2,
+ simple_async_get_next3_cbp_def,
+ simple_async_get_next3_cbp_temp,
+ simple_async_get_next3_cbp_perm
+ ]
+ },
+ {set_tests, [],
+ [
+ simple_sync_set2,
+ simple_sync_set3,
+ simple_async_set2,
+ simple_async_set3_cbp_def,
+ simple_async_set3_cbp_temp,
+ simple_async_set3_cbp_perm
+ ]
+ },
+ {bulk_tests, [],
+ [
+ simple_sync_get_bulk2,
+ simple_sync_get_bulk3,
+ simple_async_get_bulk2,
+ simple_async_get_bulk3_cbp_def,
+ simple_async_get_bulk3_cbp_temp,
+ simple_async_get_bulk3_cbp_perm
+ ]
+ },
+ {misc_request_tests, [],
+ [
+ misc_async2
+ ]
+ },
+ {event_tests, [],
+ [
+ trap1,
+ trap2,
+ inform1,
+ inform2,
+ inform3,
+ inform4,
+ inform_swarm_cbp_def,
+ inform_swarm_cbp_temp,
+ inform_swarm_cbp_perm,
+ report
+ ]
+ },
+ {event_tests_mt, [],
+ [
+ trap1,
+ trap2,
+ inform1,
+ inform2,
+ inform3,
+ inform4,
+ inform_swarm_cbp_def,
+ inform_swarm_cbp_temp,
+ inform_swarm_cbp_perm,
+ report
+ ]
+ },
+ {tickets, [],
+ [
+ {group, otp8015},
+ {group, otp8395}
+ ]
+ },
+ {otp8015, [],
+ [
+ otp8015_1
+ ]
+ },
+ {otp8395, [],
+ [
+ otp8395_1
+ ]
+ },
+ {ipv6, [], ipv6_tests()},
+ {ipv6_mt, [], ipv6_tests()}
+
+ ].
+
+ipv6_tests() ->
+ [
+ register_agent_old,
+ simple_sync_get_next3,
+ simple_async_get2,
+ simple_sync_get3,
+ simple_async_get_next2,
+ simple_sync_set3,
+ simple_async_set2,
+ simple_sync_get_bulk2,
+ simple_async_get_bulk3_cbp_def,
+ simple_async_get_bulk3_cbp_temp,
+ simple_async_get_bulk3_cbp_perm,
+ misc_async2,
+ inform1,
+ inform_swarm_cbp_def,
+ inform_swarm_cbp_temp,
+ inform_swarm_cbp_perm
+ ].
+
+
+
+%%
+%% -----
+%%
+
init_per_suite(Config0) when is_list(Config0) ->
?DBG("init_per_suite -> entry with"
"~n Config0: ~p", [Config0]),
- %% Preferably this test SUITE should be divided into groups
- %% so that if crypto does not work only v3 tests that
- %% need crypto will be skipped, but as this is only a
- %% problem with one legacy test machine, we will procrastinate
- %% until we have a more important reason to fix this.
- case snmp_test_lib:crypto_start() of
- ok ->
-
- snmp_test_global_sys_monitor:start(),
- snmp_test_sys_monitor:start(), % We need one on this node also
-
- Config1 = snmp_test_lib:init_suite_top_dir(?MODULE, Config0),
- Config2 = snmp_test_lib:fix_data_dir(Config1),
- %% Mib-dirs
- %% data_dir is trashed by the test-server / common-test
- %% so there is no point in fixing it...
- MibDir = snmp_test_lib:lookup(data_dir, Config2),
- StdMibDir = filename:join([code:priv_dir(snmp), "mibs"]),
-
- [{mib_dir, MibDir}, {std_mib_dir, StdMibDir} | Config2];
- _ ->
- {skip, "Crypto did not start"}
+ case snmp_test_lib:init_per_suite(Config0) of
+ {skip, _} = SKIP ->
+ SKIP;
+
+ Config1 ->
+
+ %% Preferably this test SUITE should be divided into groups
+ %% so that if crypto does not work only v3 tests that
+ %% need crypto will be skipped, but as this is only a
+ %% problem with one legacy test machine, we will procrastinate
+ %% until we have a more important reason to fix this.
+ case snmp_test_lib:crypto_start() of
+ ok ->
+ %% We need one on this node also
+ snmp_test_sys_monitor:start(),
+
+ Config2 = snmp_test_lib:init_suite_top_dir(?MODULE, Config1),
+ Config3 = snmp_test_lib:fix_data_dir(Config2),
+ %% Mib-dirs
+ %% data_dir is trashed by the test-server / common-test
+ %% so there is no point in fixing it...
+ MibDir = snmp_test_lib:lookup(data_dir, Config3),
+ StdMibDir = filename:join([code:priv_dir(snmp), "mibs"]),
+ [{mib_dir, MibDir}, {std_mib_dir, StdMibDir} | Config3];
+
+ _ ->
+ {skip, "Crypto did not start"}
+ end
end.
-end_per_suite(Config) when is_list(Config) ->
+end_per_suite(Config0) when is_list(Config0) ->
- ?DBG("end_per_suite -> entry with"
- "~n Config: ~p", [Config]),
+ p("end_per_suite -> entry with"
+ "~n Config0: ~p"
+ "~n Nodes: ~p", [Config0, erlang:nodes()]),
snmp_test_sys_monitor:stop(),
- snmp_test_global_sys_monitor:stop(),
+ Config1 = snmp_test_lib:end_per_suite(Config0),
- Config.
+ p("end_per_suite -> end when"
+ "~n Nodes: ~p", [erlang:nodes()]),
+ Config1.
+%%
+%% -----
+%%
+
+init_per_group(request_tests_mt = GroupName, Config) ->
+ snmp_test_lib:init_group_top_dir(
+ GroupName,
+ [{manager_net_if_module, snmpm_net_if_mt} | Config]);
+init_per_group(event_tests_mt = GroupName, Config) ->
+ snmp_test_lib:init_group_top_dir(
+ GroupName,
+ [{manager_net_if_module, snmpm_net_if_mt} | Config]);
+init_per_group(ipv6_mt = GroupName, Config) ->
+ init_per_group_ipv6(GroupName,
+ [{manager_net_if_module, snmpm_net_if_mt} | Config]);
+init_per_group(ipv6 = GroupName, Config) ->
+ init_per_group_ipv6(GroupName, Config);
+init_per_group(GroupName, Config) ->
+ snmp_test_lib:init_group_top_dir(GroupName, Config).
+
+
+init_per_group_ipv6(GroupName, Config) ->
+ %% <OS-CONDITIONAL-SKIP>
+ OSSkipable = [{unix,
+ [
+ {darwin, fun(V) when (V > {9, 8, 0}) ->
+ %% This version is OK: No Skip
+ false;
+ (_) ->
+ %% This version is *not* ok: Skip
+ %% We need a fully qualified hostname
+ %% to get a proper IPv6 address (in this
+ %% version), but its just to messy, so
+ %% instead we skip this **OLD** darwin...
+ true
+ end}
+ ]
+ }],
+ %% </OS-CONDITIONAL-SKIP>
+ case ?OS_BASED_SKIP(OSSkipable) of
+ true ->
+ {skip, "Host *may* not *properly* support IPV6"};
+ false ->
+ %% Even if this host supports IPv6 we don't use it unless its
+ %% one of the configures/supported IPv6 hosts...
+ case (?HAS_SUPPORT_IPV6() andalso ?IS_IPV6_HOST()) of
+ true ->
+ ipv6_init(snmp_test_lib:init_group_top_dir(GroupName, Config));
+ false ->
+ {skip, "Host does not support IPv6"}
+ end
+ end.
+
+
+end_per_group(_GroupName, Config) ->
+ %% Do we really need to do this?
+ lists:keydelete(snmp_group_top_dir, 1, Config).
+
+
+
+
+%%
+%% -----
+%%
+
init_per_testcase(Case, Config) when is_list(Config) ->
p(Case, "init_per_testcase begin when"
"~n Nodes: ~p~n~n", [erlang:nodes()]),
+
+ snmp_test_global_sys_monitor:reset_events(),
+
%% This version of the API, based on Addr and Port, has been deprecated
DeprecatedApiCases =
[
@@ -249,8 +518,19 @@ init_per_testcase2(Case, Config) ->
Family = proplists:get_value(ipfamily, Config, inet),
- Conf = [{watchdog, ?WD_START(?MINS(5))},
- {ipfamily, Family},
+ TO = case Case of
+ inform3 ->
+ ?MINS(2);
+ InformSwarm when (InformSwarm =:= inform_swarm_cbp_def) orelse
+ (InformSwarm =:= inform_swarm_cbp_temp) orelse
+ (InformSwarm =:= inform_swarm_cbp_perm) ->
+ ?MINS(60);
+ _ ->
+ ?MINS(1)
+ end,
+ ct:timetrap(TO),
+
+ Conf = [{ipfamily, Family},
{ip, ?LOCALHOST(Family)},
{case_top_dir, CaseTopDir},
{agent_dir, AgTopDir},
@@ -283,13 +563,19 @@ init_per_testcase3(Case, Config) ->
ApiCases03 =
[
simple_sync_get3,
- simple_async_get3,
- simple_sync_get_next3,
- simple_async_get_next3,
- simple_sync_set3,
- simple_async_set3,
- simple_sync_get_bulk3,
- simple_async_get_bulk3
+ simple_async_get3,
+ simple_sync_get_next3,
+ simple_async_get_next3_cbp_def,
+ simple_async_get_next3_cbp_temp,
+ simple_async_get_next3_cbp_perm,
+ simple_sync_set3,
+ simple_async_set3_cbp_def,
+ simple_async_set3_cbp_temp,
+ simple_async_set3_cbp_perm,
+ simple_sync_get_bulk3,
+ simple_async_get_bulk3_cbp_def,
+ simple_async_get_bulk3_cbp_temp,
+ simple_async_get_bulk3_cbp_perm
],
Cases =
[
@@ -299,17 +585,26 @@ init_per_testcase3(Case, Config) ->
inform2,
inform3,
inform4,
- inform_swarm,
+ inform_swarm_cbp_def,
+ inform_swarm_cbp_temp,
+ inform_swarm_cbp_perm,
report
] ++
ApiCases02 ++
ApiCases03,
case lists:member(Case, Cases) of
true ->
- NoAutoInformCases = [inform1, inform2, inform3, inform_swarm],
+ NoAutoInformCases = [inform1, inform2, inform3,
+ inform_swarm_cbp_def,
+ inform_swarm_cbp_temp,
+ inform_swarm_cbp_perm],
AutoInform = not lists:member(Case, NoAutoInformCases),
Conf1 = if
- Case =:= inform_swarm ->
+ %% We turn off verbosity for the swarm cases
+ %% (too much output).
+ (Case =:= inform_swarm_cbp_def) orelse
+ (Case =:= inform_swarm_cbp_temp) orelse
+ (Case =:= inform_swarm_cbp_perm) ->
Verb = [{manager_config_verbosity, silence},
{manager_note_store_verbosity, silence},
{manager_server_verbosity, info},
@@ -322,17 +617,31 @@ init_per_testcase3(Case, Config) ->
true ->
Config
end,
+ Conf2 = if
+ (Case =:= simple_async_get_next3_cbp_temp) orelse
+ (Case =:= simple_async_set3_cbp_temp) orelse
+ (Case =:= simple_async_get_bulk3_cbp_temp) orelse
+ (Case =:= inform_swarm_cbp_temp) ->
+ [{manager_server_cbproxy, temporary} | Conf1];
+ (Case =:= simple_async_get_next3_cbp_perm) orelse
+ (Case =:= simple_async_set3_cbp_perm) orelse
+ (Case =:= simple_async_get_bulk3_cbp_perm) orelse
+ (Case =:= inform_swarm_cbp_perm) ->
+ [{manager_server_cbproxy, permanent} | Conf1];
+ true ->
+ Conf1
+ end,
%% We don't need to try catch this (init_agent)
%% since we have a try catch "higher up"...
- Conf2 = init_agent(Conf1),
- Conf3 = try init_manager(AutoInform, Conf2)
+ Conf3 = init_agent(Conf2),
+ Conf4 = try init_manager(AutoInform, Conf3)
catch AC:AE:_ ->
%% Ouch we need to clean up:
%% The init_agent starts an agent node!
init_per_testcase_fail_agent_cleanup(Conf2),
throw({skip, {manager_init_failed, AC, AE}})
end,
- Conf4 = try init_mgr_user(Conf3)
+ Conf5 = try init_mgr_user(Conf4)
catch MC:ME:_ ->
%% Ouch we need to clean up:
%% The init_agent starts an agent node!
@@ -343,9 +652,9 @@ init_per_testcase3(Case, Config) ->
end,
case lists:member(Case, ApiCases02 ++ ApiCases03) of
true ->
- init_mgr_user_data2(Conf4);
+ init_mgr_user_data2(Conf5);
false ->
- init_mgr_user_data1(Conf4)
+ init_mgr_user_data1(Conf5)
end;
false ->
Config
@@ -360,14 +669,16 @@ init_per_testcase_fail_agent_cleanup(Conf) ->
end_per_testcase(Case, Config) when is_list(Config) ->
p(Case, "end_per_testcase begin when"
"~n Nodes: ~p~n~n", [erlang:nodes()]),
- ?DBG("fin [~w] Nodes [1]: ~p", [Case, erlang:nodes()]),
- Dog = ?config(watchdog, Config),
- ?WD_STOP(Dog),
- Conf1 = lists:keydelete(watchdog, 1, Config),
+
+ ?PRINT2("system events during test: "
+ "~n ~p", [snmp_test_global_sys_monitor:events()]),
+
+ %% Dog = ?config(watchdog, Config),
+ %% ?WD_STOP(Dog),
+ %% Conf1 = lists:keydelete(watchdog, 1, Config),
+ Conf1 = Config,
Conf2 = end_per_testcase2(Case, Conf1),
- ?DBG("fin [~w] Nodes [2]: ~p", [Case, erlang:nodes()]),
- %% TopDir = ?config(top_dir, Conf2),
- %% ?DEL_DIR(TopDir),
+
p(Case, "end_per_testcase end when"
"~n Nodes: ~p~n~n", [erlang:nodes()]),
Conf2.
@@ -391,11 +702,17 @@ end_per_testcase2(Case, Config) ->
simple_sync_get3,
simple_async_get3,
simple_sync_get_next3,
- simple_async_get_next3,
+ simple_async_get_next3_cbp_def,
+ simple_async_get_next3_cbp_temp,
+ simple_async_get_next3_cbp_perm,
simple_sync_set3,
- simple_async_set3,
+ simple_async_set3_cbp_def,
+ simple_async_set3_cbp_temp,
+ simple_async_set3_cbp_perm,
simple_sync_get_bulk3,
- simple_async_get_bulk3
+ simple_async_get_bulk3_cbp_def,
+ simple_async_get_bulk3_cbp_temp,
+ simple_async_get_bulk3_cbp_perm
],
Cases =
[
@@ -405,7 +722,9 @@ end_per_testcase2(Case, Config) ->
inform2,
inform3,
inform4,
- inform_swarm,
+ inform_swarm_cbp_def,
+ inform_swarm_cbp_temp,
+ inform_swarm_cbp_perm,
report
] ++
ApiCases02 ++
@@ -430,223 +749,6 @@ end_per_testcase2(Case, Config) ->
%% Test case definitions
%%======================================================================
-all() ->
- [
- {group, start_and_stop_tests},
- {group, misc_tests},
- {group, user_tests},
- {group, agent_tests},
- {group, request_tests},
- {group, request_tests_mt},
- {group, event_tests},
- {group, event_tests_mt},
- discovery,
- {group, tickets},
- {group, ipv6},
- {group, ipv6_mt}
- ].
-
-groups() ->
- [
- {start_and_stop_tests, [],
- [
- simple_start_and_stop1,
- simple_start_and_stop2,
- simple_start_and_stop3,
- simple_start_and_monitor_crash1,
- simple_start_and_monitor_crash2,
- notify_started01,
- notify_started02
- ]
- },
- {misc_tests, [],
- [
- info
- ]
- },
- {user_tests, [],
- [
- register_user1
- ]
- },
- {agent_tests, [],
- [
- register_agent_old,
- register_agent2,
- register_agent3
- ]
- },
- {request_tests, [],
- [
- {group, get_tests},
- {group, get_next_tests},
- {group, set_tests},
- {group, bulk_tests},
- {group, misc_request_tests}
- ]
- },
- {request_tests_mt, [],
- [
- {group, get_tests},
- {group, get_next_tests},
- {group, set_tests},
- {group, bulk_tests},
- {group, misc_request_tests}
- ]
- },
- {get_tests, [],
- [
- simple_sync_get2,
- simple_sync_get3,
- simple_async_get2,
- simple_async_get3
- ]
- },
- {get_next_tests, [],
- [
- simple_sync_get_next2,
- simple_sync_get_next3,
- simple_async_get_next2,
- simple_async_get_next3
- ]
- },
- {set_tests, [],
- [
- simple_sync_set2,
- simple_sync_set3,
- simple_async_set2,
- simple_async_set3
- ]
- },
- {bulk_tests, [],
- [
- simple_sync_get_bulk2,
- simple_sync_get_bulk3,
- simple_async_get_bulk2,
- simple_async_get_bulk3
- ]
- },
- {misc_request_tests, [],
- [
- misc_async2
- ]
- },
- {event_tests, [],
- [
- trap1,
- trap2,
- inform1,
- inform2,
- inform3,
- inform4,
- inform_swarm,
- report
- ]
- },
- {event_tests_mt, [],
- [
- trap1,
- trap2,
- inform1,
- inform2,
- inform3,
- inform4,
- inform_swarm,
- report
- ]
- },
- {tickets, [],
- [
- {group, otp8015},
- {group, otp8395}
- ]
- },
- {otp8015, [],
- [
- otp8015_1
- ]
- },
- {otp8395, [],
- [
- otp8395_1
- ]
- },
- {ipv6, [], ipv6_tests()},
- {ipv6_mt, [], ipv6_tests()}
-
- ].
-
-ipv6_tests() ->
- [
- register_agent_old,
- simple_sync_get_next3,
- simple_async_get2,
- simple_sync_get3,
- simple_async_get_next2,
- simple_sync_set3,
- simple_async_set2,
- simple_sync_get_bulk2,
- simple_async_get_bulk3,
- misc_async2,
- inform1,
- inform_swarm
- ].
-
-
-init_per_group(request_tests_mt = GroupName, Config) ->
- snmp_test_lib:init_group_top_dir(
- GroupName,
- [{manager_net_if_module, snmpm_net_if_mt} | Config]);
-init_per_group(event_tests_mt = GroupName, Config) ->
- snmp_test_lib:init_group_top_dir(
- GroupName,
- [{manager_net_if_module, snmpm_net_if_mt} | Config]);
-init_per_group(ipv6_mt = GroupName, Config) ->
- init_per_group_ipv6(GroupName,
- [{manager_net_if_module, snmpm_net_if_mt} | Config]);
-init_per_group(ipv6 = GroupName, Config) ->
- init_per_group_ipv6(GroupName, Config);
-init_per_group(GroupName, Config) ->
- snmp_test_lib:init_group_top_dir(GroupName, Config).
-
-
-init_per_group_ipv6(GroupName, Config) ->
- %% <OS-CONDITIONAL-SKIP>
- OSSkipable = [{unix,
- [
- {darwin, fun(V) when (V > {9, 8, 0}) ->
- %% This version is OK: No Skip
- false;
- (_) ->
- %% This version is *not* ok: Skip
- %% We need a fully qualified hostname
- %% to get a proper IPv6 address (in this
- %% version), but its just to messy, so
- %% instead we skip this **OLD** darwin...
- true
- end}
- ]
- }],
- %% </OS-CONDITIONAL-SKIP>
- case ?OS_BASED_SKIP(OSSkipable) of
- true ->
- {skip, "Host *may* not *properly* support IPV6"};
- false ->
- %% Even if this host supports IPv6 we don't use it unless its
- %% one of the configures/supported IPv6 hosts...
- case (?HAS_SUPPORT_IPV6() andalso ?IS_IPV6_HOST()) of
- true ->
- ipv6_init(snmp_test_lib:init_group_top_dir(GroupName, Config));
- false ->
- {skip, "Host does not support IPv6"}
- end
- end.
-
-
-end_per_group(_GroupName, Config) ->
- %% Do we really need to do this?
- lists:keydelete(snmp_group_top_dir, 1, Config).
-
%%======================================================================
%% Test functions
@@ -2376,15 +2478,33 @@ async_gn_exec2(Node, TargetName, Oids) ->
%%======================================================================
-simple_async_get_next3(doc) ->
+simple_async_get_next3_cbp_def(doc) ->
["Simple (async) get_next-request - "
"Version 3 API (TargetName with send-opts)"];
-simple_async_get_next3(suite) -> [];
-simple_async_get_next3(Config) when is_list(Config) ->
- ?TC_TRY(simple_async_get_next3,
+simple_async_get_next3_cbp_def(suite) -> [];
+simple_async_get_next3_cbp_def(Config) when is_list(Config) ->
+ simple_async_get_next3(ssgn2_cbp_def, Config).
+
+simple_async_get_next3_cbp_temp(doc) ->
+ ["Simple (async) get_next-request - "
+ "Version 3 API (TargetName with send-opts)"];
+simple_async_get_next3_cbp_temp(suite) -> [];
+simple_async_get_next3_cbp_temp(Config) when is_list(Config) ->
+ simple_async_get_next3(ssgn2_cbp_temp, Config).
+
+simple_async_get_next3_cbp_perm(doc) ->
+ ["Simple (async) get_next-request - "
+ "Version 3 API (TargetName with send-opts)"];
+simple_async_get_next3_cbp_perm(suite) -> [];
+simple_async_get_next3_cbp_perm(Config) when is_list(Config) ->
+ simple_async_get_next3(ssgn2_cbp_perm, Config).
+
+simple_async_get_next3(Case, Config) when is_list(Config) ->
+ ?TC_TRY(Case,
fun() -> do_simple_async_get_next3(Config) end).
do_simple_async_get_next3(Config) ->
+ %% process_flag(trap_exit, true),
p("starting with Config: ~p~n", [Config]),
MgrNode = ?config(manager_node, Config),
@@ -2645,11 +2765,26 @@ async_s_exec2(Node, TargetName, VAVs) ->
%%======================================================================
-simple_async_set3(doc) ->
+simple_async_set3_cbp_def(doc) ->
["Simple (async) set-request - Version 3 API (TargetName with send-opts)"];
-simple_async_set3(suite) -> [];
-simple_async_set3(Config) when is_list(Config) ->
- ?TC_TRY(simple_async_set3,
+simple_async_set3_cbp_def(suite) -> [];
+simple_async_set3_cbp_def(Config) when is_list(Config) ->
+ simple_async_set3(sas3_cbp_def, Config).
+
+simple_async_set3_cbp_temp(doc) ->
+ ["Simple (async) set-request - Version 3 API (TargetName with send-opts)"];
+simple_async_set3_cbp_temp(suite) -> [];
+simple_async_set3_cbp_temp(Config) when is_list(Config) ->
+ simple_async_set3(sas3_cbp_temp, Config).
+
+simple_async_set3_cbp_perm(doc) ->
+ ["Simple (async) set-request - Version 3 API (TargetName with send-opts)"];
+simple_async_set3_cbp_perm(suite) -> [];
+simple_async_set3_cbp_perm(Config) when is_list(Config) ->
+ simple_async_set3(sas3_cbp_perm, Config).
+
+simple_async_set3(Case, Config) ->
+ ?TC_TRY(Case,
fun() -> do_simple_async_set3(Config) end).
do_simple_async_set3(Config) ->
@@ -3082,15 +3217,19 @@ async_gb_exec2(Node, TargetName, {NR, MR, Oids}) ->
%%======================================================================
-simple_async_get_bulk3(doc) ->
+simple_async_get_bulk3_cbp_def(doc) ->
["Simple (async) get_bulk-request - "
"Version 3 API (TargetName with send-opts)"];
-simple_async_get_bulk3(suite) -> [];
-simple_async_get_bulk3(Config) when is_list(Config) ->
- ?TC_TRY(simple_async_get_bulk3,
+simple_async_get_bulk3_cbp_def(suite) -> [];
+simple_async_get_bulk3_cbp_def(Config) when is_list(Config) ->
+ simple_async_get_bulk3(sagb3_cbp_def, Config).
+
+simple_async_get_bulk3(Case, Config) ->
+ ?TC_TRY(Case,
fun() -> do_simple_async_get_bulk3(Config) end).
do_simple_async_get_bulk3(Config) ->
+ process_flag(trap_exit, true),
p("starting with Config: ~p~n", [Config]),
MgrNode = ?config(manager_node, Config),
@@ -3129,6 +3268,26 @@ async_gb_exec3(Node, TargetName, {NR, MR, Oids}, SendOpts) ->
%%======================================================================
+simple_async_get_bulk3_cbp_temp(doc) ->
+ ["Simple (async) get_bulk-request - "
+ "Version 3 API (TargetName with send-opts)"];
+simple_async_get_bulk3_cbp_temp(suite) -> [];
+simple_async_get_bulk3_cbp_temp(Config) when is_list(Config) ->
+ simple_async_get_bulk3(sagb3_cbp_temp, Config).
+
+
+%%======================================================================
+
+simple_async_get_bulk3_cbp_perm(doc) ->
+ ["Simple (async) get_bulk-request - "
+ "Version 3 API (TargetName with send-opts)"];
+simple_async_get_bulk3_cbp_perm(suite) -> [];
+simple_async_get_bulk3_cbp_perm(Config) when is_list(Config) ->
+ simple_async_get_bulk3(sagb3_cbp_perm, Config).
+
+
+%%======================================================================
+
misc_async2(doc) ->
["Misc (async) request(s) - Version 2 API (TargetName)"];
misc_async2(suite) -> [];
@@ -4294,14 +4453,26 @@ do_inform4(Config) ->
%%======================================================================
%%
-%% Test: ts:run(snmp, snmp_manager_test, inform_swarm, [batch]).
+%% Test: ts:run(snmp, snmp_manager_test, inform_swarm_cbp_def, [batch]).
+
+inform_swarm_cbp_def(suite) -> [];
+inform_swarm_cbp_def(Config) when is_list(Config) ->
+ inform_swarm(is_cbp_def, Config).
+
+inform_swarm_cbp_temp(suite) -> [];
+inform_swarm_cbp_temp(Config) when is_list(Config) ->
+ inform_swarm(is_cbp_temp, Config).
+
+inform_swarm_cbp_perm(suite) -> [];
+inform_swarm_cbp_perm(Config) when is_list(Config) ->
+ inform_swarm(is_cbp_perm, Config).
-inform_swarm(suite) -> [];
-inform_swarm(Config) when is_list(Config) ->
- ?TC_TRY(inform_swarm,
+inform_swarm(Case, Config) ->
+ ?TC_TRY(Case,
fun() -> do_inform_swarm(Config) end).
do_inform_swarm(Config) ->
+ %% process_flag(trap_exit, true),
p("starting with Config: ~p~n", [Config]),
MgrNode = ?config(manager_node, Config),
@@ -4317,7 +4488,7 @@ do_inform_swarm(Config) ->
?line ok = agent_load_mib(AgentNode, Test2Mib),
?line ok = agent_load_mib(AgentNode, TestTrapMib),
?line ok = agent_load_mib(AgentNode, TestTrapv2Mib),
- NumInforms = 100,
+ NumInforms = 2000,
Collector = self(),
@@ -4339,10 +4510,13 @@ do_inform_swarm(Config) ->
[]),
%% Sleep some [(N div 10)*100 ms]
%% every tenth notification
- if
+ if
+ N rem 100 == 0 ->
+ Sleep = 1000,
+ p("sleep ~w [~w]", [Sleep, N]),
+ ?SLEEP(Sleep);
N rem 10 == 0 ->
- %% Time to sleep some
- Sleep = (N div 10) * 50,
+ Sleep = 100,
p("sleep ~w [~w]", [Sleep, N]),
?SLEEP(Sleep);
true ->
@@ -4402,17 +4576,17 @@ inform_swarm_collector(N, SentAckCnt, RecvCnt, RespCnt, _)
(N == RespCnt) and
(N =< RecvCnt)) ->
p("inform_swarm_collector -> done when"
- "~n N: ~w"
- "~n SentAckCnt: ~w"
- "~n RecvCnt: ~w"
- "~n RespCnt: ~w", [N, SentAckCnt, RecvCnt, RespCnt]),
+ "~n N: ~w"
+ "~n SentAckCnt: ~w"
+ "~n RecvCnt: ~w"
+ "~n RespCnt: ~w", [N, SentAckCnt, RecvCnt, RespCnt]),
ok;
inform_swarm_collector(N, SentAckCnt, RecvCnt, RespCnt, Timeout) ->
p("inform_swarm_collector -> entry with"
- "~n N: ~w"
- "~n SentAckCnt: ~w"
- "~n RecvCnt: ~w"
- "~n RespCnt: ~w", [N, SentAckCnt, RecvCnt, RespCnt]),
+ "~n N: ~w"
+ "~n SentAckCnt: ~w"
+ "~n RecvCnt: ~w"
+ "~n RespCnt: ~w", [N, SentAckCnt, RecvCnt, RespCnt]),
receive
{snmp_targets, {inform2_tag1, Id}, [_Addr]} ->
p("received inform-sent acknowledgement for ~w", [Id]),
@@ -4438,9 +4612,9 @@ inform_swarm_collector(N, SentAckCnt, RecvCnt, RespCnt, Timeout) ->
%% The agent has received ack from the manager
{snmp_notification, {inform2_tag1, Id}, {got_response, Addr}} ->
- p("received expected \"got response\" for ~w"
+ p("received expected \"got response\" for ~w "
"notification from: "
- "~n ~p",
+ "~n ~p",
[Id, Addr]),
inform_swarm_collector(N, SentAckCnt, RecvCnt, RespCnt+1,
Timeout);
@@ -4449,7 +4623,7 @@ inform_swarm_collector(N, SentAckCnt, RecvCnt, RespCnt, Timeout) ->
{snmp_notification, inform2_tag1, {no_response, Addr}} ->
e("Received expected \"no response\" notification "
"from: "
- "~n ~p", [Addr]),
+ "~n ~p", [Addr]),
Reason = {no_response, Addr, {N, SentAckCnt, RecvCnt, RespCnt}},
{error, Reason}
@@ -4639,11 +4813,11 @@ command_handler([{No, Desc, Cmd}|Cmds]) ->
%% -- Misc manager functions --
init_manager(AutoInform, Config) ->
+
?LOG("init_manager -> entry with"
"~n AutoInform: ~p"
"~n Config: ~p", [AutoInform, Config]),
-
%% --
%% Start node
%%
@@ -5300,16 +5474,17 @@ mgr_user_name_to_oid(Node, Name) ->
start_manager(Node, Vsns, Config) ->
start_manager(Node, Vsns, Config, []).
start_manager(Node, Vsns, Conf0, _Opts) ->
+
?DBG("start_manager -> entry with"
"~n Node: ~p"
"~n Vsns: ~p"
"~n Conf0: ~p"
"~n Opts: ~p", [Node, Vsns, Conf0, _Opts]),
-
+
AtlDir = ?config(manager_log_dir, Conf0),
ConfDir = ?config(manager_conf_dir, Conf0),
- DbDir = ?config(manager_db_dir, Conf0),
- IRB = ?config(irb, Conf0),
+ DbDir = ?config(manager_db_dir, Conf0),
+ IRB = ?config(irb, Conf0),
ConfigVerbosity = get_opt(manager_config_verbosity, Conf0, trace),
NoteStoreVerbosity = get_opt(manager_note_store_verbosity, Conf0, log),
@@ -5318,6 +5493,8 @@ start_manager(Node, Vsns, Conf0, _Opts) ->
AtlSeqNo = get_opt(manager_atl_seqno, Conf0, false),
+ CBP = get_opt(manager_server_cbproxy, Conf0, temporary),
+
NetIfConf =
case get_opt(manager_net_if_module, Conf0, no_module) of
no_module ->
@@ -5338,7 +5515,8 @@ start_manager(Node, Vsns, Conf0, _Opts) ->
{db_dir, DbDir},
{verbosity, ConfigVerbosity}]},
{note_store, [{verbosity, NoteStoreVerbosity}]},
- {server, [{verbosity, ServerVerbosity}]},
+ {server, [{verbosity, ServerVerbosity},
+ {cbproxy, CBP}]},
{net_if, NetIfConf}],
?line ok = set_mgr_env(Node, Env),
diff --git a/lib/snmp/test/snmp_manager_config_test.erl b/lib/snmp/test/snmp_manager_config_SUITE.erl
index ccbdd77629..b5c1894294 100644
--- a/lib/snmp/test/snmp_manager_config_test.erl
+++ b/lib/snmp/test/snmp_manager_config_SUITE.erl
@@ -24,10 +24,10 @@
%% Test:
%% ts:run().
%% ts:run(snmp, [batch]).
-%% ts:run(snmp, snmp_manager_config_test, [batch]).
+%% ts:run(snmp, snmp_manager_config_SUITE, [batch]).
%%
%%----------------------------------------------------------------------
--module(snmp_manager_config_test).
+-module(snmp_manager_config_SUITE).
%%----------------------------------------------------------------------
%% Include files
@@ -44,10 +44,11 @@
%% -compile(export_all).
-export([
- all/0,groups/0,init_per_group/2,end_per_group/2,
- init_per_testcase/2, end_per_testcase/2,
+ suite/0, all/0, groups/0,
+ init_per_suite/1, end_per_suite/1,
+ init_per_group/2, end_per_group/2,
+ init_per_testcase/2, end_per_testcase/2,
-
simple_start_and_stop/1,
start_without_mandatory_opts1/1,
@@ -62,8 +63,6 @@
start_with_create_db_and_dir_opt/1,
-
-
simple_system_op/1,
@@ -116,41 +115,156 @@
%%======================================================================
-%% External functions
+%% Common Test interface functions
%%======================================================================
+suite() ->
+ [{ct_hooks, [ts_install_cth]}].
+
+
+all() ->
+ [
+ {group, start_and_stop},
+ {group, normal_op},
+ {group, tickets}
+ ].
+
+groups() ->
+ [
+ {start_and_stop, [], start_and_stop_cases()},
+ {normal_op, [], normal_op_cases()},
+ {system, [], system_cases()},
+ {users, [], users_cases()},
+ {agents, [], agents_cases()},
+ {usm_users, [], usm_users_cases()},
+ {counter, [], counter_cases()},
+ {stats_counter, [], stats_counter_cases()},
+ {tickets, [], tickets_cases()},
+ {otp_8395, [], otp_8395_cases()}
+ ].
+
+start_and_stop_cases() ->
+ [
+ simple_start_and_stop,
+ start_without_mandatory_opts1,
+ start_without_mandatory_opts2,
+ start_with_all_valid_opts,
+ start_with_unknown_opts,
+ start_with_incorrect_opts,
+ start_with_create_db_and_dir_opt,
+ start_with_invalid_manager_conf_file1,
+ start_with_invalid_users_conf_file1,
+ start_with_invalid_agents_conf_file1,
+ start_with_invalid_usm_conf_file1
+ ].
+
+normal_op_cases() ->
+ [
+ {group, system},
+ {group, agents},
+ {group, users},
+ {group, usm_users},
+ {group, counter},
+ {group, stats_counter}
+ ].
+
+system_cases() ->
+ [
+ simple_system_op
+ ].
+
+users_cases() ->
+ [
+ register_user_using_file,
+ register_user_using_function,
+ register_user_failed_using_function1
+ ].
+
+agents_cases() ->
+ [
+ register_agent_using_file,
+ register_agent_using_function,
+ register_agent_failed_using_function1
+ ].
+
+usm_users_cases() ->
+ [
+ register_usm_user_using_file,
+ register_usm_user_using_function,
+ register_usm_user_failed_using_function1,
+ update_usm_user_info
+ ].
+
+counter_cases() ->
+ [
+ create_and_increment
+ ].
+
+stats_counter_cases() ->
+ [
+ stats_create_and_increment
+ ].
+
+tickets_cases() ->
+ [
+ otp_7219,
+ {group, otp_8395}
+ ].
+
+otp_8395_cases() ->
+ [
+ otp_8395_1,
+ otp_8395_2,
+ otp_8395_3,
+ otp_8395_4
+ ].
+
+init_per_suite(Config0) when is_list(Config0) ->
+
+ ?DBG("init_per_suite -> entry with"
+ "~n Config0: ~p", [Config0]),
+
+ Config1 = snmp_test_lib:init_suite_top_dir(?MODULE, Config0),
+
+ ?DBG("init_per_suite -> done when"
+ "~n Config1: ~p", [Config1]),
+
+ Config1.
+
+end_per_suite(Config) when is_list(Config) ->
+
+ ?DBG("end_per_suite -> entry with"
+ "~n Config: ~p", [Config]),
+
+ Config.
+
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
init_per_testcase(Case, Config) when is_list(Config) ->
p("init_per_testcase -> Case: ~p", [Case]),
- SnmpPrivDir = ?config(priv_dir, Config),
- p("init_per_testcase -> SnmpPrivDir: ~p", [SnmpPrivDir]),
- SuiteDir = atom_to_list(?MODULE),
- SuiteTopDir = filename:join(SnmpPrivDir, SuiteDir),
- case file:make_dir(SuiteTopDir) of
- ok ->
- ok;
- {error, eexist} ->
- ok;
- {error, Reason} ->
- ?FAIL({failed_creating, SuiteTopDir, Reason})
- end,
- p("init_per_testcase -> SuiteTopDir: ~p", [SuiteTopDir]),
- CaseDir = atom_to_list(Case),
- ?line ok =
- file:make_dir(CaseTopDir = filename:join(SuiteTopDir, CaseDir)),
+ SuiteTopDir = ?config(snmp_suite_top_dir, Config),
+ CaseTopDir = filename:join(SuiteTopDir, atom_to_list(Case)),
+ ?line ok = file:make_dir(CaseTopDir),
p("init_per_testcase -> CaseTopDir: ~p", [CaseTopDir]),
- ?line ok =
- file:make_dir(MgrTopDir = filename:join(CaseTopDir, "manager/")),
- ?line ok =
- file:make_dir(MgrConfDir = filename:join(MgrTopDir, "conf/")),
- MgrDbDir = filename:join(MgrTopDir, "db/"),
+ MgrTopDir = filename:join(CaseTopDir, "manager/"),
+ ?line ok = file:make_dir(MgrTopDir),
+ MgrConfDir = filename:join(MgrTopDir, "conf/"),
+ ?line ok = file:make_dir(MgrConfDir),
+ MgrDbDir = filename:join(MgrTopDir, "db/"),
case Case of
start_with_create_db_and_dir_opt ->
ok;
_ ->
?line ok = file:make_dir(MgrDbDir)
end,
- ?line ok =
- file:make_dir(MgrLogDir = filename:join(MgrTopDir, "log/")),
+ MgrLogDir = filename:join(MgrTopDir, "log/"),
+ ?line ok = file:make_dir(MgrLogDir),
[{case_top_dir, CaseTopDir},
{manager_dir, MgrTopDir},
{manager_conf_dir, MgrConfDir},
@@ -161,73 +275,15 @@ init_per_testcase(Case, Config) when is_list(Config) ->
end_per_testcase(Case, Config) when is_list(Config) ->
p("end_per_testcase -> Case: ~p", [Case]),
%% The cleanup is removed due to some really discusting NFS behaviour...
- %% CaseTopDir = ?config(manager_dir, Config),
- %% ?line ok = ?DEL_DIR(CaseTopDir),
+ %% Also, it can always be useful to retain "all the stuff" after
+ %% the test case in case of debugging...
Config.
%%======================================================================
-%% Test case definitions
-%%======================================================================
-% all(doc) ->
-% "The top snmp manager config test case";
-all() ->
-[{group, start_and_stop}, {group, normal_op},
- {group, tickets}].
-
-groups() ->
- [{start_and_stop, [],
- [simple_start_and_stop,
- start_without_mandatory_opts1,
- start_without_mandatory_opts2,
- start_with_all_valid_opts, start_with_unknown_opts,
- start_with_incorrect_opts,
- start_with_create_db_and_dir_opt,
- start_with_invalid_manager_conf_file1,
- start_with_invalid_users_conf_file1,
- start_with_invalid_agents_conf_file1,
- start_with_invalid_usm_conf_file1]},
- {normal_op, [],
- [{group, system},
- {group, agents},
- {group, users},
- {group, usm_users},
- {group, counter},
- {group, stats_counter}]},
- {system, [], [simple_system_op]},
- {users, [],
- [register_user_using_file,
- register_user_using_function,
- register_user_failed_using_function1]},
- {agents, [],
- [register_agent_using_file,
- register_agent_using_function,
- register_agent_failed_using_function1]},
- {usm_users, [],
- [register_usm_user_using_file,
- register_usm_user_using_function,
- register_usm_user_failed_using_function1,
- update_usm_user_info]},
- {counter, [], [create_and_increment]},
- {stats_counter, [], [stats_create_and_increment]},
- {tickets, [], [otp_7219, {group, otp_8395}]},
- {otp_8395, [],
- [otp_8395_1, otp_8395_2, otp_8395_3, otp_8395_4]}].
-
-init_per_group(_GroupName, Config) ->
- Config.
-
-end_per_group(_GroupName, Config) ->
- Config.
-
-
-
-%%======================================================================
%% Test functions
%%======================================================================
-
-
%%
%% ---
%%
diff --git a/lib/snmp/test/snmp_manager_user_test.erl b/lib/snmp/test/snmp_manager_user_SUITE.erl
index 915249ec77..353f1b21f3 100644
--- a/lib/snmp/test/snmp_manager_user_test.erl
+++ b/lib/snmp/test/snmp_manager_user_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@
%%----------------------------------------------------------------------
%% Purpose: Various (snmp manager) user related tests
%%----------------------------------------------------------------------
--module(snmp_manager_user_test).
+-module(snmp_manager_user_SUITE).
%%----------------------------------------------------------------------
@@ -34,11 +34,12 @@
%%----------------------------------------------------------------------
%% External exports
%%----------------------------------------------------------------------
-%% -compile(export_all).
-export([
- all/0,groups/0,init_per_group/2,end_per_group/2,
- init_per_testcase/2, end_per_testcase/2,
+ suite/0, all/0, groups/0,
+ init_per_suite/1, end_per_suite/1,
+ init_per_group/2, end_per_group/2,
+ init_per_testcase/2, end_per_testcase/2,
simple_register_and_unregister1/1,
@@ -68,6 +69,7 @@
]).
+
%%----------------------------------------------------------------------
%% Internal exports
%%----------------------------------------------------------------------
@@ -86,80 +88,90 @@
%%======================================================================
-%% External functions
+%% Common Test interface functions
%%======================================================================
-init_per_testcase(Case, Config) when is_list(Config) ->
- p("init_per_testcase -> Case: ~p", [Case]),
- SnmpPrivDir = ?config(priv_dir, Config),
- p("init_per_testcase -> SnmpPrivDir: ~p", [SnmpPrivDir]),
- SuiteDir = atom_to_list(?MODULE),
- SuiteTopDir = filename:join(SnmpPrivDir, SuiteDir),
- case file:make_dir(SuiteTopDir) of
- ok ->
- ok;
- {error, eexist} ->
- ok;
- {error, Reason} ->
- ?FAIL({failed_creating, SuiteTopDir, Reason})
- end,
- p("init_per_testcase -> SuiteTopDir: ~p", [SuiteTopDir]),
- CaseDir = atom_to_list(Case),
- ?line ok =
- file:make_dir(CaseTopDir = filename:join(SuiteTopDir, CaseDir)),
- p("init_per_testcase -> CaseTopDir: ~p", [CaseTopDir]),
- ?line ok =
- file:make_dir(MgrTopDir = filename:join(CaseTopDir, "manager/")),
- ?line ok =
- file:make_dir(MgrConfDir = filename:join(MgrTopDir, "conf/")),
- ?line ok =
- file:make_dir(MgrDbDir = filename:join(MgrTopDir, "db/")),
- ?line ok =
- file:make_dir(MgrLogDir = filename:join(MgrTopDir, "log/")),
- [{suite_top_dir, SuiteTopDir},
- {case_top_dir, CaseTopDir},
- {manager_dir, MgrTopDir},
- {manager_conf_dir, MgrConfDir},
- {manager_db_dir, MgrDbDir},
- {manager_log_dir, MgrLogDir} | Config].
+suite() ->
+ [{ct_hooks, [ts_install_cth]}].
-end_per_testcase(Case, Config) when is_list(Config) ->
- p("end_per_testcase -> Case: ~p", [Case]),
-% MgrTopDir = ?config(manager_dir, Config),
-% ?DEL_DIR(MgrTopDir),
- Config.
+all() ->
+ [
+ {group, register_user},
+ {group, tickets}
+ ].
+groups() ->
+ [
+ {register_user, [], register_user_cases()},
+ {tickets, [], tickets_cases()}
+ ].
+
+register_user_cases() ->
+ [
+ simple_register_and_unregister1,
+ simple_register_and_unregister2,
+ simple_register_and_unregister3, register_and_crash1,
+ register_and_crash2, register_and_crash3,
+ register_request_and_crash1,
+ register_request_and_crash2,
+ register_request_and_crash3,
+ simple_register_monitor_and_unregister1,
+ simple_register_monitor_and_unregister2,
+ simple_register_monitor_and_unregister3,
+ register_monitor_and_crash1,
+ register_monitor_and_crash2,
+ register_monitor_and_crash3,
+ register_monitor_and_crash4,
+ register_monitor_and_crash5,
+ register_monitor_request_and_crash1,
+ register_monitor_request_and_crash2,
+ register_monitor_request_and_crash3,
+ register_monitor_request_and_crash4
+ ].
+
+tickets_cases() ->
+ [
+ otp7902
+ ].
-%%======================================================================
-%% Test case definitions
-%%======================================================================
-all() ->
-[{group, register_user}, {group, tickets}].
-groups() ->
- [{register_user, [],
- [simple_register_and_unregister1,
- simple_register_and_unregister2,
- simple_register_and_unregister3, register_and_crash1,
- register_and_crash2, register_and_crash3,
- register_request_and_crash1,
- register_request_and_crash2,
- register_request_and_crash3,
- simple_register_monitor_and_unregister1,
- simple_register_monitor_and_unregister2,
- simple_register_monitor_and_unregister3,
- register_monitor_and_crash1,
- register_monitor_and_crash2,
- register_monitor_and_crash3,
- register_monitor_and_crash4,
- register_monitor_and_crash5,
- register_monitor_request_and_crash1,
- register_monitor_request_and_crash2,
- register_monitor_request_and_crash3,
- register_monitor_request_and_crash4]},
- {tickets, [], [otp7902]}].
+%%
+%% -----
+%%
+
+init_per_suite(Config0) when is_list(Config0) ->
+
+ p("init_per_suite -> entry with"
+ "~n Config0: ~p", [Config0]),
+
+ case ?LIB:init_per_suite(Config0) of
+ {skip, _} = SKIP ->
+ SKIP;
+ Config1 when is_list(Config1) ->
+ snmp_test_sys_monitor:start(),
+ Config2 = snmp_test_lib:init_suite_top_dir(?MODULE, Config1),
+
+ p("init_per_suite -> done when"
+ "~n Config: ~p", [Config2]),
+
+ Config2
+ end.
+
+end_per_suite(Config) when is_list(Config) ->
+
+ p("end_per_suite -> entry with"
+ "~n Config: ~p", [Config]),
+
+ snmp_test_sys_monitor:stop(),
+ ?LIB:end_per_suite(Config).
+
+
+
+%%
+%% -----
+%%
init_per_group(_GroupName, Config) ->
Config.
@@ -169,6 +181,41 @@ end_per_group(_GroupName, Config) ->
+%%
+%% -----
+%%
+
+init_per_testcase(Case, Config) when is_list(Config) ->
+ p("init_per_testcase -> Case: ~p", [Case]),
+
+ snmp_test_global_sys_monitor:reset_events(),
+
+ SuiteTopDir = ?config(snmp_suite_top_dir, Config),
+ CaseTopDir = filename:join(SuiteTopDir, atom_to_list(Case)),
+ ?line ok = file:make_dir(CaseTopDir),
+ p("init_per_testcase -> CaseTopDir: ~p", [CaseTopDir]),
+ MgrTopDir = filename:join(CaseTopDir, "manager/"),
+ ?line ok = file:make_dir(MgrTopDir),
+ MgrConfDir = filename:join(MgrTopDir, "conf/"),
+ ?line ok = file:make_dir(MgrConfDir),
+ MgrDbDir = filename:join(MgrTopDir, "db/"),
+ ?line ok = file:make_dir(MgrDbDir),
+ MgrLogDir = filename:join(MgrTopDir, "log/"),
+ ?line ok = file:make_dir(MgrLogDir),
+ [{case_top_dir, CaseTopDir},
+ {manager_dir, MgrTopDir},
+ {manager_conf_dir, MgrConfDir},
+ {manager_db_dir, MgrDbDir},
+ {manager_log_dir, MgrLogDir} | Config].
+
+
+end_per_testcase(Case, Config) when is_list(Config) ->
+ p("end_per_testcase -> Case: ~p", [Case]),
+
+ p("system events during test: "
+ "~n ~p~n", [snmp_test_global_sys_monitor:events()]),
+
+ Config.
diff --git a/lib/snmp/test/snmp_manager_user_test_lib.erl b/lib/snmp/test/snmp_manager_user_test_lib.erl
index 8df7f1e662..15dcc81382 100644
--- a/lib/snmp/test/snmp_manager_user_test_lib.erl
+++ b/lib/snmp/test/snmp_manager_user_test_lib.erl
@@ -55,15 +55,16 @@
-export([
handle_error/3,
- handle_agent/4,
+ handle_agent/5,
+ handle_agent/4, % For backwards compatibillity
handle_pdu/4,
- handle_pdu/5, % For backwards compatibillity
+ handle_pdu/5, % For backwards compatibillity
handle_trap/3,
- handle_trap/4, % For backwards compatibillity
+ handle_trap/4, % For backwards compatibillity
handle_inform/3,
- handle_inform/4, % For backwards compatibillity
- handle_report/3,
- handle_report/4 % For backwards compatibillity
+ handle_inform/4, % For backwards compatibillity
+ handle_report/3,
+ handle_report/4 % For backwards compatibillity
]).
@@ -211,6 +212,10 @@ user_loop(#state{parent = Parent} = S) ->
do_handle_error(Pid, ReqId, Reason),
user_loop(S);
+ {handle_agent, Pid, Domain, Address, Type, SnmpInfo} ->
+ do_handle_agent(Pid, Domain, Address, Type, SnmpInfo),
+ user_loop(S);
+
{handle_agent, Pid, Addr, Port, SnmpInfo} ->
do_handle_agent(Pid, Addr, Port, SnmpInfo),
user_loop(S);
@@ -263,6 +268,16 @@ do_handle_error(Pid, ReqId, Reason) ->
ok.
+do_handle_agent(Pid, Domain, Address, Type, SnmpInfo) ->
+ info("received agent callback:"
+ "~n Domain: ~p"
+ "~n Address: ~p"
+ "~n Type: ~p"
+ "~n SnmpInfo: ~p", [Domain, Address, Type, SnmpInfo]),
+ Pid ! {ignore, self()},
+ ok.
+
+
do_handle_agent(Pid, Addr, Port, SnmpInfo) ->
info("received agent callback:"
"~n Addr: ~p"
@@ -378,11 +393,17 @@ handle_error(ReqId, Reason, UserPid) ->
ignore.
+handle_agent(Domain, Address, Type, SnmpInfo, UserPid) ->
+ UserPid ! {handle_agent, self(), Domain, Address, Type, SnmpInfo},
+ ignore.
+
+
+%% For backwards compatibillity
handle_agent(Addr, Port, SnmpInfo, UserPid) ->
UserPid ! {handle_agent, self(), Addr, Port, SnmpInfo},
ignore.
-
-
+
+
handle_pdu(TargetName, ReqId, SnmpResponse, UserPid) ->
UserPid ! {handle_pdu, self(), TargetName, ReqId, SnmpResponse},
ignore.
diff --git a/lib/snmp/test/snmp_note_store_test.erl b/lib/snmp/test/snmp_note_store_SUITE.erl
index 94d400fb53..832c03029e 100644
--- a/lib/snmp/test/snmp_note_store_test.erl
+++ b/lib/snmp/test/snmp_note_store_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@
%%----------------------------------------------------------------------
%% Purpose:
%%----------------------------------------------------------------------
--module(snmp_note_store_test).
+-module(snmp_note_store_SUITE).
%%----------------------------------------------------------------------
%% Include files
@@ -34,8 +34,11 @@
%% External exports
%%----------------------------------------------------------------------
-export([
+ suite/0, all/0, groups/0,
+ init_per_suite/1, end_per_suite/1,
+ init_per_group/2, end_per_group/2,
init_per_testcase/2, end_per_testcase/2,
- all/0,groups/0,init_per_group/2,end_per_group/2,
+
start_and_stop/1,
notes/1,
info/1,
@@ -49,33 +52,47 @@
system_start_time/0
]).
-%%----------------------------------------------------------------------
-%% Macros
-%%----------------------------------------------------------------------
-
-%%----------------------------------------------------------------------
-%% Records
-%%----------------------------------------------------------------------
%%======================================================================
%% External functions
%%======================================================================
-init_per_testcase(_Case, Config) when is_list(Config) ->
- Config.
-
-end_per_testcase(_Case, Config) when is_list(Config) ->
- Config.
-
%%======================================================================
%% Test case definitions
%%======================================================================
+
+suite() ->
+ [{ct_hooks, [ts_install_cth]}].
+
all() ->
-[start_and_stop, notes, info, garbage_in].
+ [
+ start_and_stop,
+ notes,
+ info,
+ garbage_in
+ ].
groups() ->
[].
+
+
+%%
+%% -----
+%%
+
+init_per_suite(Config) when is_list(Config) ->
+ Config.
+
+end_per_suite(Config) when is_list(Config) ->
+ Config.
+
+
+
+%%
+%% -----
+%%
+
init_per_group(_GroupName, Config) ->
Config.
@@ -84,6 +101,18 @@ end_per_group(_GroupName, Config) ->
+%%
+%% -----
+%%
+
+init_per_testcase(_Case, Config) when is_list(Config) ->
+ Config.
+
+end_per_testcase(_Case, Config) when is_list(Config) ->
+ Config.
+
+
+
%%======================================================================
%% Test functions
%%======================================================================
diff --git a/lib/snmp/test/snmp_pdus_test.erl b/lib/snmp/test/snmp_pdus_SUITE.erl
index 29a793ebcb..f49e2eb602 100644
--- a/lib/snmp/test/snmp_pdus_test.erl
+++ b/lib/snmp/test/snmp_pdus_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -21,7 +21,8 @@
%%----------------------------------------------------------------------
%% Purpose:
%%----------------------------------------------------------------------
--module(snmp_pdus_test).
+-module(snmp_pdus_SUITE).
+
%%----------------------------------------------------------------------
%% Include files
@@ -34,52 +35,57 @@
%%----------------------------------------------------------------------
%% External exports
%%----------------------------------------------------------------------
+
-export([
- all/0,groups/0,init_per_group/2,end_per_group/2,
-
+ suite/0, all/0, groups/0,
+ init_per_suite/1, end_per_suite/1,
+ init_per_group/2, end_per_group/2,
+ init_per_testcase/2, end_per_testcase/2,
+
otp7575/1,
otp8563/1,
otp9022/1,
- otp10132/1,
-
- init_per_testcase/2, end_per_testcase/2
+ otp10132/1
]).
-%%----------------------------------------------------------------------
-%% Internal exports
-%%----------------------------------------------------------------------
--export([
- ]).
+%%======================================================================
+%% Common Test interface functions
+%%======================================================================
+suite() ->
+ [{ct_hooks, [ts_install_cth]}].
-%%----------------------------------------------------------------------
-%% Macros
-%%----------------------------------------------------------------------
+all() ->
+ [{group, tickets}].
-%%----------------------------------------------------------------------
-%% Records
-%%----------------------------------------------------------------------
+groups() ->
+ [{tickets, [], tickets_cases()}].
-%%======================================================================
-%% External functions
-%%======================================================================
+tickets_cases() ->
+ [
+ otp7575,
+ otp8563,
+ otp9022,
+ otp10132
+ ].
-init_per_testcase(_Case, Config) when is_list(Config) ->
+
+%%
+%% -----
+%%
+
+init_per_suite(Config) when is_list(Config) ->
Config.
-end_per_testcase(_Case, Config) when is_list(Config) ->
+end_per_suite(Config) when is_list(Config) ->
Config.
-%%======================================================================
-%% Test case definitions
-%%======================================================================
-all() ->
- [{group, tickets}].
-groups() ->
- [{tickets, [], [otp7575, otp8563, otp9022, otp10132]}].
+%%
+%% -----
+%%
init_per_group(_GroupName, Config) ->
Config.
@@ -89,6 +95,16 @@ end_per_group(_GroupName, Config) ->
+%%
+%% -----
+%%
+
+init_per_testcase(_Case, Config) when is_list(Config) ->
+ Config.
+
+end_per_testcase(_Case, Config) when is_list(Config) ->
+ Config.
+
%%======================================================================
@@ -144,7 +160,7 @@ otp8563(Config) when is_list(Config) ->
{{'Counter64', Val2}, []} = snmp_pdus:dec_value(Enc2),
Val3 = Val2 + 1,
- io:format("try encode and decode valule 3: ~w (0x~.16b)~n", [Val3, Val3]),
+ io:format("try encode and decode value 3: ~w (0x~.16b)~n", [Val3, Val3]),
Enc3 = snmp_pdus:enc_value('Counter64', Val3),
io:format(" => ~w~n", [Enc3]),
{{'Counter64', Val3}, []} = snmp_pdus:dec_value(Enc3),
diff --git a/lib/snmp/test/snmp_test_global_sys_monitor.erl b/lib/snmp/test/snmp_test_global_sys_monitor.erl
index eafb96621a..54cc7d588e 100644
--- a/lib/snmp/test/snmp_test_global_sys_monitor.erl
+++ b/lib/snmp/test/snmp_test_global_sys_monitor.erl
@@ -26,6 +26,8 @@
log/1]).
-export([init/1]).
+-include("snmp_test_lib.hrl").
+
-define(NAME, ?MODULE).
@@ -41,7 +43,7 @@ stop() ->
%% This does not reset the global counter but the "collector"
%% See events for more info.
reset_events() ->
- cast(reset_events).
+ call(reset_events).
events() ->
call(events).
@@ -56,7 +58,7 @@ init(Parent) ->
process_flag(priority, high),
case global:register_name(?NAME, self()) of
yes ->
- info_msg("Starting", []),
+ info_msg("Starting as ~p (on ~p)", [self(), node()]),
proc_lib:init_ack(Parent, {ok, self()}),
loop(#{parent => Parent, ev_cnt => 0, evs => []});
no ->
@@ -75,7 +77,14 @@ loop(State) ->
[maps:get(ev_cnt, State)]),
exit(normal);
- {?MODULE, reset_events} ->
+ {?MODULE, Ref, From, reset_events} ->
+ TotEvCnt = maps:get(ev_cnt, State),
+ EvCnt = length(maps:get(evs, State)),
+ info_msg("Reset events when"
+ "~n Total Number of Events: ~p"
+ "~n Current Number of Events: ~p",
+ [TotEvCnt, EvCnt]),
+ From ! {?MODULE, Ref, {ok, {TotEvCnt, EvCnt}}},
loop(State#{evs => []});
{?MODULE, Ref, From, events} ->
@@ -103,7 +112,7 @@ process_event(State, Node, {Pid, TS, Tag, Info}) ->
process_event(State, Node, {TS, starting}) ->
FTS = snmp_misc:format_timestamp(TS),
- info_msg("System Monitor on node ~p starting at ~s", [Node, FTS]),
+ info_msg("System Monitor starting on node ~p at ~s", [Node, FTS]),
if
(Node =/= node()) ->
erlang:monitor_node(Node, true);
@@ -112,9 +121,20 @@ process_event(State, Node, {TS, starting}) ->
end,
State;
+process_event(State, Node, {TS, stopping}) ->
+ FTS = ?FTS(TS),
+ info_msg("System Monitor stopping on node ~p at ~s", [Node, FTS]),
+ if
+ (Node =/= node()) ->
+ erlang:monitor_node(Node, false);
+ true ->
+ ok
+ end,
+ State;
+
process_event(State, Node, {TS, already_started}) ->
FTS = snmp_misc:format_timestamp(TS),
- info_msg("System Monitor on node ~p already started", [Node, FTS]),
+ info_msg("System Monitor already started on node ~p at ~s", [Node, FTS]),
State;
process_event(State, Node, nodedown) ->
@@ -131,23 +151,24 @@ process_event(State, Node, Event) ->
%% We only *count* system events
process_system_event(#{ev_cnt := Cnt, evs := Evs} = State,
Node, Pid, TS, long_gc = Ev, Info) ->
- print_system_event("Long GC", Node, Pid, TS, Info),
+ print_system_event(f("Long GC (~w)", [length(Evs)]), Node, Pid, TS, Info),
State#{ev_cnt => Cnt + 1, evs => [{Node, Ev} | Evs]};
process_system_event(#{ev_cnt := Cnt, evs := Evs} = State,
Node, Pid, TS, long_schedule = Ev, Info) ->
- print_system_event("Long Schedule", Node, Pid, TS, Info),
+ print_system_event(f("Long Schedule (~w)", [length(Evs)]), Node, Pid, TS, Info),
State#{ev_cnt => Cnt + 1, evs => [{Node, Ev} | Evs]};
process_system_event(#{ev_cnt := Cnt, evs := Evs} = State,
Node, Pid, TS, large_heap = Ev, Info) ->
- print_system_event("Large Heap", Node, Pid, TS, Info),
+ print_system_event(f("Large Heap (~w)", [length(Evs)]), Node, Pid, TS, Info),
State#{ev_cnt => Cnt + 1, evs => [{Node, Ev} | Evs]};
process_system_event(#{ev_cnt := Cnt, evs := Evs} = State,
Node, Pid, TS, busy_port = Ev, Info) ->
- print_system_event("Busy port", Node, Pid, TS, Info),
+ print_system_event(f("Busy port (~w)", [length(Evs)]), Node, Pid, TS, Info),
State#{ev_cnt => Cnt + 1, evs => [{Node, Ev} | Evs]};
process_system_event(#{ev_cnt := Cnt, evs := Evs} = State,
Node, Pid, TS, busy_dist_port = Ev, Info) ->
- print_system_event("Busy dist port", Node, Pid, TS, Info),
+ print_system_event(f("Busy dist port (~w)", [length(Evs)]),
+ Node, Pid, TS, Info),
State#{ev_cnt => Cnt + 1, evs => [{Node, Ev} | Evs]};
%% And everything else
diff --git a/lib/snmp/test/snmp_test_lib.erl b/lib/snmp/test/snmp_test_lib.erl
index a040c4f39c..d2edd636cc 100644
--- a/lib/snmp/test/snmp_test_lib.erl
+++ b/lib/snmp/test/snmp_test_lib.erl
@@ -29,8 +29,9 @@
-export([non_pc_tc_maybe_skip/4, os_based_skip/1,
has_support_ipv6/0, has_support_ipv6/1,
is_ipv6_host/0, is_ipv6_host/1]).
--export([fix_data_dir/1,
- init_suite_top_dir/2, init_group_top_dir/2, init_testcase_top_dir/2,
+-export([init_per_suite/1, end_per_suite/1,
+ init_suite_top_dir/2, init_group_top_dir/2, init_testcase_top_dir/2,
+ fix_data_dir/1,
lookup/2,
replace_config/3, set_config/3, get_config/2, get_config/3]).
-export([fail/3, skip/3]).
@@ -186,6 +187,13 @@ hostname(Node) ->
%% {ok, Ip} = snmp_misc:ip(net_adm:localhost(), Family),
%% Ip.
+%% localhost() ->
+%% {ok, Ip} = snmp_misc:ip(net_adm:localhost()),
+%% Ip.
+%% localhost(Family) ->
+%% {ok, Ip} = snmp_misc:ip(net_adm:localhost(), Family),
+%% Ip.
+
localhost() ->
localhost(inet).
@@ -441,6 +449,56 @@ is_ipv6_host(Hostname) ->
%% Test suite utility functions
%%
+%% Common suite init function
+%% This should be used by "all" suite init functions.
+
+init_per_suite(Config) ->
+
+ %% We have some crap machines that causes random test case failures
+ %% for no obvious reason. So, attempt to identify those without actually
+ %% checking for the host name...
+ %% We have two "machines" we are checking for. Both are old installations
+ %% running on really slow VMs (the host machines are old and tired).
+ LinuxVersionVerify =
+ fun(V) when (V > {3,6,11}) ->
+ false; % OK - No skip
+ (V) when (V =:= {3,6,11}) ->
+ case string:trim(os:cmd("cat /etc/issue")) of
+ "Fedora release 16 " ++ _ -> % Stone age Fedora => Skip
+ true;
+ _ ->
+ false
+ end;
+ (V) when (V > {2,6,24}) ->
+ false; % OK - No skip
+ (_) ->
+ %% We are specifically checking for
+ %% a *really* old gento...
+ case string:find(string:strip(os:cmd("uname -a")), "gentoo") of
+ nomatch ->
+ false;
+ _ -> % Stone age gentoo => Skip
+ true
+ end
+ end,
+ COND = [{unix, [{linux, LinuxVersionVerify}]}],
+ case os_based_skip(COND) of
+ true ->
+ {skip, "Unstable host and/or os (or combo thererof)"};
+ false ->
+ snmp_test_global_sys_monitor:start(),
+ Config
+ end.
+
+
+end_per_suite(Config) when is_list(Config) ->
+
+ snmp_test_global_sys_monitor:stop(),
+
+ Config.
+
+
+
fix_data_dir(Config) ->
DataDir0 = lookup(data_dir, Config),
DataDir1 = filename:split(filename:absname(DataDir0)),
diff --git a/lib/snmp/test/snmp_test_lib.hrl b/lib/snmp/test/snmp_test_lib.hrl
index f077f15d3e..c91b6d1859 100644
--- a/lib/snmp/test/snmp_test_lib.hrl
+++ b/lib/snmp/test/snmp_test_lib.hrl
@@ -29,38 +29,39 @@
-define(APPLICATION, snmp).
-endif.
--define(SCONF(K,D,C), snmp_test_lib:set_config(K,D,C)).
--define(GCONF(K,C), snmp_test_lib:get_config(K,C)).
--define(RCONF(K,C,V), snmp_test_lib:replace_config(K,C,V)).
--define(HOSTNAME(N), snmp_test_lib:hostname(N)).
--define(LOCALHOST(), snmp_test_lib:localhost()).
--define(LOCALHOST(Family), snmp_test_lib:localhost(Family)).
--define(SZ(X), snmp_test_lib:sz(X)).
--define(OSTYPE(), snmp_test_lib:os_type()).
--define(DISPLAY_SUITE_INFO(), snmp_test_lib:display_suite_info(?MODULE)).
+-define(LIB, snmp_test_lib).
+
+-define(SCONF(K,D,C), ?LIB:set_config(K,D,C)).
+-define(GCONF(K,C), ?LIB:get_config(K,C)).
+-define(RCONF(K,C,V), ?LIB:replace_config(K,C,V)).
+-define(HOSTNAME(N), ?LIB:hostname(N)).
+-define(LOCALHOST(), ?LIB:localhost()).
+-define(LOCALHOST(Family), ?LIB:localhost(Family)).
+-define(SZ(X), ?LIB:sz(X)).
+-define(OSTYPE(), ?LIB:os_type()).
+-define(DISPLAY_SUITE_INFO(), ?LIB:display_suite_info(?MODULE)).
%% - Test case macros -
--define(TC_TRY(C, TC), snmp_test_lib:tc_try(C, TC)).
--define(TC_TRY(C, TCCond, TC), snmp_test_lib:tc_try(C, TCCond, TC)).
--define(OS_BASED_SKIP(Skippable),
- snmp_test_lib:os_based_skip(Skippable)).
+-define(TC_TRY(C, TC), ?LIB:tc_try(C, TC)).
+-define(TC_TRY(C, TCCond, TC), ?LIB:tc_try(C, TCCond, TC)).
+-define(OS_BASED_SKIP(Skippable), ?LIB:os_based_skip(Skippable)).
-define(NON_PC_TC_MAYBE_SKIP(Config, Condition),
- snmp_test_lib:non_pc_tc_maybe_skip(Config, Condition, ?MODULE, ?LINE)).
--define(SKIP(Reason), snmp_test_lib:skip(Reason, ?MODULE, ?LINE)).
--define(FAIL(Reason), snmp_test_lib:fail(Reason, ?MODULE, ?LINE)).
--define(IS_IPV6_HOST(), snmp_test_lib:is_ipv6_host()).
--define(IS_IPV6_HOST(H), snmp_test_lib:is_ipv6_host(H)).
--define(HAS_SUPPORT_IPV6(), snmp_test_lib:has_support_ipv6()).
--define(HAS_SUPPORT_IPV6(H), snmp_test_lib:has_support_ipv6(H)).
+ ?LIB:non_pc_tc_maybe_skip(Config, Condition, ?MODULE, ?LINE)).
+-define(SKIP(Reason), ?LIB:skip(Reason, ?MODULE, ?LINE)).
+-define(FAIL(Reason), ?LIB:fail(Reason, ?MODULE, ?LINE)).
+-define(IS_IPV6_HOST(), ?LIB:is_ipv6_host()).
+-define(IS_IPV6_HOST(H), ?LIB:is_ipv6_host(H)).
+-define(HAS_SUPPORT_IPV6(), ?LIB:has_support_ipv6()).
+-define(HAS_SUPPORT_IPV6(H), ?LIB:has_support_ipv6(H)).
%% - Time macros -
-ifdef(DONT_USE_TEST_SERVER).
--define(HOURS(N), snmp_test_lib:hours(N)).
--define(MINS(N), snmp_test_lib:minutes(N)).
--define(SECS(N), snmp_test_lib:seconds(N)).
+-define(HOURS(N), ?LIB:hours(N)).
+-define(MINS(N), ?LIB:minutes(N)).
+-define(SECS(N), ?LIB:seconds(N)).
-else.
-define(HOURS(N), test_server:hours(N)).
-define(MINS(N), test_server:minutes(N)).
@@ -68,51 +69,52 @@
-endif.
-ifdef(DONT_USE_TEST_SERVER).
--define(WD_START(T), snmp_test_lib:watchdog_start(T)).
--define(WD_STOP(P), snmp_test_lib:watchdog_stop(P)).
+-define(WD_START(T), ?LIB:watchdog_start(T)).
+-define(WD_STOP(P), ?LIB:watchdog_stop(P)).
-else.
-define(WD_START(T), test_server:timetrap(T)).
-define(WD_STOP(P), test_server:timetrap_cancel(P)).
-endif.
--define(SLEEP(MSEC), snmp_test_lib:sleep(MSEC)).
+-define(SLEEP(MSEC), ?LIB:sleep(MSEC)).
%% - Process utility macros -
--define(FLUSH(), snmp_test_lib:flush_mqueue()).
--define(ETRAP_GET(), snmp_test_lib:trap_exit()).
--define(ETRAP_SET(O), snmp_test_lib:trap_exit(O)).
+-define(FLUSH(), ?LIB:flush_mqueue()).
+-define(ETRAP_GET(), ?LIB:trap_exit()).
+-define(ETRAP_SET(O), ?LIB:trap_exit(O)).
%% - Node utility macros -
--define(PING(N), snmp_test_lib:ping(N)).
--define(LNODES(), snmp_test_lib:local_nodes()).
--define(NODES(H), snmp_test_lib:nodes_on(H)).
--define(START_NODE(N,A), snmp_test_lib:start_node(N,A)).
--define(STOP_NODE(N), snmp_test_lib:stop_node(N)).
+-define(PING(N), ?LIB:ping(N)).
+-define(LNODES(), ?LIB:local_nodes()).
+-define(NODES(H), ?LIB:nodes_on(H)).
+-define(START_NODE(N,A), ?LIB:start_node(N,A)).
+-define(STOP_NODE(N), ?LIB:stop_node(N)).
%% - Application and Crypto utility macros -
--define(IS_APP_RUNNING(A), snmp_test_lib:is_app_running(A)).
--define(IS_SNMP_RUNNING(), snmp_test_lib:is_snmp_running()).
--define(IS_MNESIA_RUNNING(), snmp_test_lib:is_mnesia_running()).
--define(IS_CRYPTO_RUNNING(), snmp_test_lib:is_crypto_running()).
--define(CRYPTO_START(), snmp_test_lib:crypto_start()).
--define(CRYPTO_SUPPORT(), snmp_test_lib:crypto_support()).
+-define(IS_APP_RUNNING(A), ?LIB:is_app_running(A)).
+-define(IS_SNMP_RUNNING(), ?LIB:is_snmp_running()).
+-define(IS_MNESIA_RUNNING(), ?LIB:is_mnesia_running()).
+-define(IS_CRYPTO_RUNNING(), ?LIB:is_crypto_running()).
+-define(CRYPTO_START(), ?LIB:crypto_start()).
+-define(CRYPTO_SUPPORT(), ?LIB:crypto_support()).
%% - Dir macros -
--define(DEL_DIR(D), snmp_test_lib:del_dir(D)).
+-define(DEL_DIR(D), ?LIB:del_dir(D)).
%% - Print macros
--define(P(C), snmp_test_lib:p(?MODULE, C)).
--define(P1(F), snmp_test_lib:p(F, [])).
--define(P2(F, A), snmp_test_lib:p(F, A)).
+-define(P(C), ?LIB:p(?MODULE, C)).
+-define(P1(F), ?LIB:p(F, [])).
+-define(P2(F, A), ?LIB:p(F, A)).
+-define(F(F, A), ?LIB:f(F, A)).
-ifdef(snmp_debug).
-ifndef(snmp_log).
@@ -147,16 +149,18 @@
-define(ERR(F,A), ok).
-endif.
--define(INF(F,A), ?PRINT("INF", F, A)).
+-define(INF(F,A), ?PRINT("INF", F, A)).
--define(PRINT(P,F,A),
- snmp_test_lib:print(P, ?MODULE, ?LINE, F, A)).
+-define(PRINT(P,F,A), ?LIB:print(P, ?MODULE, ?LINE, F, A)).
--define(PRINT1(F, A), snmp_test_lib:print1(F, A)).
+-define(PRINT1(F, A), ?LIB:print1(F, A)).
-define(PRINT1(F), ?PRINT1(F, [])).
-define(EPRINT1(F, A), ?PRINT1("<ERROR> " ++ F, A)).
--define(PRINT2(F, A), snmp_test_lib:print2(F, A)).
+-define(PRINT2(F, A), ?LIB:print2(F, A)).
-define(PRINT2(F), ?PRINT2(F, [])).
-define(EPRINT2(F, A), ?PRINT2("<ERROR> " ++ F, A)).
+-define(FTS(), snmp_misc:formated_timestamp()).
+-define(FTS(TS), snmp_misc:format_timestamp(TS)).
+
diff --git a/lib/snmp/test/snmp_test_sys_monitor.erl b/lib/snmp/test/snmp_test_sys_monitor.erl
index 2291c6ca97..847d9bc716 100644
--- a/lib/snmp/test/snmp_test_sys_monitor.erl
+++ b/lib/snmp/test/snmp_test_sys_monitor.erl
@@ -36,8 +36,11 @@ start() ->
stop() ->
case whereis(?NAME) of
Pid when is_pid(Pid) ->
- Pid ! {?MODULE, stop},
- ok;
+ Pid ! {?MODULE, self(), stop},
+ receive
+ {?MODULE, Pid, stop} ->
+ ok
+ end;
_ ->
ok
end.
@@ -78,6 +81,11 @@ loop(State) ->
?GSM:log({Pid, erlang:timestamp(), Tag, Info}),
loop(State);
+ {?MODULE, From, stop} ->
+ ?GSM:log({erlang:timestamp(), stopping}),
+ From ! {?MODULE, self(), stop},
+ exit(normal);
+
_ ->
loop(State)
end.
diff --git a/lib/snmp/test/snmp_to_snmpnet_SUITE.erl b/lib/snmp/test/snmp_to_snmpnet_SUITE.erl
index b8bdb30271..09f20ad48a 100644
--- a/lib/snmp/test/snmp_to_snmpnet_SUITE.erl
+++ b/lib/snmp/test/snmp_to_snmpnet_SUITE.erl
@@ -28,9 +28,19 @@
-module(snmp_to_snmpnet_SUITE).
-%% Note: This directive should only be used in test suites.
--compile(export_all).
+-export([
+ suite/0, all/0, groups/0,
+ init_per_suite/1, end_per_suite/1,
+ init_per_group/2, end_per_group/2,
+ init_per_testcase/2, end_per_testcase/2,
+ erlang_agent_netsnmp_get/0, erlang_agent_netsnmp_get/1,
+ erlang_agent_netsnmp_inform/0, erlang_agent_netsnmp_inform/1,
+ erlang_manager_netsnmp_get/0, erlang_manager_netsnmp_get/1
+
+ ]).
+
+-include("snmp_test_lib.hrl").
-include_lib("common_test/include/ct.hrl").
-include_lib("snmp/include/STANDARD-MIB.hrl").
@@ -44,6 +54,7 @@ expected(?sysDescr_instance = Oid, get) ->
OidStr = oid_str(Oid),
iolist_to_binary([OidStr | " = STRING: \"Erlang SNMP agent\""]).
+
%%--------------------------------------------------------------------
%% Common Test interface functions -----------------------------------
%%--------------------------------------------------------------------
@@ -58,49 +69,116 @@ all() ->
].
groups() ->
- [{ipv4, [],
- [{group, snmpget},
- {group, snmptrapd},
- {group, snmpd_mt},
- {group, snmpd}
- ]},
- {ipv6, [],
- [{group, snmpget},
- {group, snmptrapd},
- {group, snmpd_mt},
- {group, snmpd}
- ]},
- {ipv4_ipv6, [],
- [{group, snmpget},
- {group, snmptrapd},
- {group, snmpd_mt},
- {group, snmpd}
- ]},
- %%
- {snmpget, [],
- [erlang_agent_netsnmp_get]},
- {snmptrapd, [],
- [erlang_agent_netsnmp_inform]},
- {snmpd_mt, [],
- [erlang_manager_netsnmp_get]},
- {snmpd, [],
- [erlang_manager_netsnmp_get]}
+ [
+ {ipv4, [], ipv4_cases()},
+ {ipv6, [], ipv6_cases()},
+ {ipv4_ipv6, [], ipv4_ipv6_cases()},
+
+ {snmpget, [], snmpget_cases()},
+ {snmptrapd, [], snmptrapd_cases()},
+ {snmpd_mt, [], snmpd_mt_cases()},
+ {snmpd, [], snmpd_cases()}
+ ].
+
+ipv4_cases() ->
+ [
+ {group, snmpget},
+ {group, snmptrapd},
+ {group, snmpd_mt},
+ {group, snmpd}
+ ].
+
+ipv6_cases() ->
+ [
+ {group, snmpget},
+ {group, snmptrapd},
+ {group, snmpd_mt},
+ {group, snmpd}
+ ].
+
+ipv4_ipv6_cases() ->
+ [
+ {group, snmpget},
+ {group, snmptrapd},
+ {group, snmpd_mt},
+ {group, snmpd}
+ ].
+
+snmpget_cases() ->
+ [
+ erlang_agent_netsnmp_get
+ ].
+
+snmptrapd_cases() ->
+ [
+ erlang_agent_netsnmp_inform
].
+snmpd_mt_cases() ->
+ [
+ erlang_manager_netsnmp_get
+ ].
+
+snmpd_cases() ->
+ [
+ erlang_manager_netsnmp_get
+ ].
+
+
+
+%%
+%% -----
+%%
+
init_per_suite(Config) ->
- case re:run(os:cmd("snmpd -v"),"NET-SNMP", [{capture, first}]) of
+ try
+ begin
+ Config2 = ?LIB:init_per_suite(netsnmp_init(Config)),
+ snmp_test_sys_monitor:start(),
+ Config2
+ end
+ catch
+ throw:{skip, _} = SKIP ->
+ SKIP
+ end.
+
+netsnmp_init(Config) ->
+ case has_netsnmp() of
+ true ->
+ case proper_netsnmp_version() of
+ true ->
+ [{agent_port, ?AGENT_PORT},
+ {manager_port, ?MANAGER_PORT} | Config];
+ false ->
+ throw({skip, "Buggy NetSNMP"})
+ end;
+ false ->
+ throw({skip, "No NetSNMP"})
+ end.
+
+has_netsnmp() ->
+ netsnmp_check("NET-SNMP").
+
+proper_netsnmp_version() ->
+ not netsnmp_check("5.4|5.6.2.1").
+
+netsnmp_check(RE) ->
+ case re:run(os:cmd("snmpd -v"), RE, [{capture, first}]) of
nomatch ->
- {skip, "snmpd is NOT NET-SNMP"};
+ false;
{match, _} ->
- case re:run(os:cmd("snmpd -v"),"5.4|5.6.2.1", [{capture, first}]) of
- nomatch ->
- [{agent_port, ?AGENT_PORT}, {manager_port, ?MANAGER_PORT} | Config];
- {match, _} ->
- {skip, "buggy snmpd"}
- end
+ true
end.
-end_per_suite(_Config) ->
- ok.
+
+
+end_per_suite(Config) ->
+ snmp_test_sys_monitor:stop(),
+ ?LIB:end_per_suite(Config).
+
+
+%%
+%% -----
+%%
init_per_group(ipv4, Config) ->
init_per_group_ip([inet], Config);
@@ -108,7 +186,7 @@ init_per_group(ipv6, Config) ->
init_per_group_ipv6([inet6], Config);
init_per_group(ipv4_ipv6, Config) ->
init_per_group_ipv6([inet, inet6], Config);
-%%
+
init_per_group(snmpget = Exec, Config) ->
%% From Ubuntu package snmp
init_per_group_agent(Exec, Config);
@@ -125,36 +203,29 @@ init_per_group(snmpd = Exec, Config) ->
init_per_group_manager(
Exec,
[{manager_net_if_module, snmpm_net_if} | Config]);
-%%
+
init_per_group(_, Config) ->
Config.
init_per_group_ipv6(Families, Config) ->
- {ok, Hostname0} = inet:gethostname(),
- case ct:require(ipv6_hosts) of
- ok ->
- case lists:member(list_to_atom(Hostname0), ct:get_config(ipv6_hosts)) of
- true ->
- init_per_group_ip(Families, Config);
- false ->
- {skip, "Host does not support IPv6"}
- end;
- _ ->
- {skip, "Test config ipv6_hosts is missing"}
+ case ?LIB:has_support_ipv6() of
+ true ->
+ init_per_group_ip(Families, Config);
+ false ->
+ {skip, "Host does not support IPv6"}
end.
init_per_group_ip(Families, Config) ->
AgentPort = ?config(agent_port, Config),
ManagerPort = ?config(manager_port, Config),
- {ok, Host} = inet:gethostname(),
Transports =
[begin
- {ok, Addr} = inet:getaddr(Host, Family),
+ Addr = ?LIB:localhost(Family),
{domain(Family), {Addr, AgentPort}}
end || Family <- Families],
Targets =
[begin
- {ok, Addr} = inet:getaddr(Host, Family),
+ Addr = ?LIB:localhost(Family),
{domain(Family), {Addr, ManagerPort}}
end || Family <- Families],
[{transports, Transports}, {targets, Targets} | Config].
@@ -175,17 +246,29 @@ init_per_group_manager(Exec, Config) ->
find_executable(Exec, [{snmp_versions, Versions} | Config]).
-
end_per_group(_GroupName, Config) ->
Config.
+
+
+%%
+%% -----
+%%
+
init_per_testcase(_Case, Config) ->
+
+ snmp_test_global_sys_monitor:reset_events(),
+
Dog = ct:timetrap(20000),
application:stop(snmp),
application:unload(snmp),
[{watchdog, Dog} | Config].
end_per_testcase(_, Config) ->
+
+ ?PRINT2("system events during test: "
+ "~n ~p", [snmp_test_global_sys_monitor:events()]),
+
case application:stop(snmp) of
ok ->
ok;
@@ -235,6 +318,8 @@ start_manager(Config) ->
ok = application:set_env(snmp, manager, manager_app_env(Config)),
ok = application:start(snmp).
+
+
%%--------------------------------------------------------------------
%% Test Cases --------------------------------------------------------
%%--------------------------------------------------------------------
@@ -264,8 +349,8 @@ erlang_manager_netsnmp_get() ->
[{doc,"Test that the erlang snmp manager can access snmpnet agent"}].
erlang_manager_netsnmp_get(Config) when is_list(Config) ->
- Community = "happy-testing",
- SysDescr = "Net-SNMP agent",
+ Community = "happy-testing",
+ SysDescr = "Net-SNMP agent",
TargetName = "Target Net-SNMP agent",
Transports = ?config(transports, Config),
case start_snmpd(Community, SysDescr, Config) of
@@ -298,6 +383,9 @@ erlang_manager_netsnmp_get(Config) when is_list(Config) ->
%%--------------------------------------------------------------------
+erlang_agent_netsnmp_inform() ->
+ [{doc, "TBD"}].
+
erlang_agent_netsnmp_inform(Config) when is_list(Config) ->
DataDir = ?config(data_dir, Config),
Mib = "TestTrapv2",
@@ -614,3 +702,4 @@ mk_port_number() ->
{ok, PortNum} = inet:port(Socket),
ok = gen_udp:close(Socket),
PortNum.
+
diff --git a/lib/snmp/vsn.mk b/lib/snmp/vsn.mk
index f5655f2ac0..1ff1a074e3 100644
--- a/lib/snmp/vsn.mk
+++ b/lib/snmp/vsn.mk
@@ -19,6 +19,6 @@
# %CopyrightEnd%
APPLICATION = snmp
-SNMP_VSN = 5.4.1
+SNMP_VSN = 5.4.3
PRE_VSN =
APP_VSN = "$(APPLICATION)-$(SNMP_VSN)$(PRE_VSN)"
diff --git a/lib/ssh/doc/src/notes.xml b/lib/ssh/doc/src/notes.xml
index b9cb80806e..da986707a9 100644
--- a/lib/ssh/doc/src/notes.xml
+++ b/lib/ssh/doc/src/notes.xml
@@ -125,6 +125,23 @@
</section>
+<section><title>Ssh 4.7.6.2</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ The ssh cli (e.g shell) server behaved strangely when
+ characters were inserted in a string so that the last
+ characters tried to wrap the line.</p>
+ <p>
+ Own Id: OTP-14849 Aux Id: ERL-545 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Ssh 4.7.6.1</title>
<section><title>Fixed Bugs and Malfunctions</title>
@@ -483,6 +500,23 @@
</section>
</section>
+<section><title>Ssh 4.6.9.5</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ The ssh cli (e.g shell) server behaved strangely when
+ characters were inserted in a string so that the last
+ characters tried to wrap the line.</p>
+ <p>
+ Own Id: OTP-14849 Aux Id: ERL-545 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Ssh 4.6.9.4</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/ssh/doc/src/ssh.xml b/lib/ssh/doc/src/ssh.xml
index afcae71418..aa0fbe376c 100644
--- a/lib/ssh/doc/src/ssh.xml
+++ b/lib/ssh/doc/src/ssh.xml
@@ -368,14 +368,16 @@
<datatype>
<name name="shell_daemon_option"/>
+ <name name="shell_spec"/>
+ <name name="shell_fun"/>
<name name="'shell_fun/1'"/>
<name name="'shell_fun/2'"/>
<desc>
<p>Defines the read-eval-print loop used in a daemon when a shell is requested by the client.
The default is to use the Erlang shell: <c><![CDATA[{shell, start, []}]]></c>
</p>
- <p>See the option <seealso marker="#type-exec_daemon_option"><c>exec</c></seealso>
- for a description of how the daemon execute exec-requests depending on
+ <p>See the option <seealso marker="#type-exec_daemon_option"><c>exec-option</c></seealso>
+ for a description of how the daemon executes shell-requests and exec-requests depending on
the shell- and exec-options.</p>
</desc>
</datatype>
@@ -398,51 +400,102 @@
<datatype>
<name name="exec_result"/>
<desc>
- <p>This option changes how the daemon execute exec-requests from clients. The term in the return value
- is formatted to a string if it is a non-string type. No trailing newline is added in the ok-case but in the
- error case.</p>
+ <p>This option changes how the daemon executes exec-requests from clients. The term in the return value
+ is formatted to a string if it is a non-string type. No trailing newline is added in the ok-case.
+ </p>
+ <p>See the User's Guide section on
+ <seealso marker="using_ssh#one-time-execution">One-Time Execution</seealso> for examples.
+ </p>
<p>Error texts are returned on channel-type 1 which usually is piped to <c>stderr</c> on e.g Linux systems.
- Texts from a successful execution will in similar manner be piped to <c>stdout</c>. The exit-status code
- is set to 0 for success and -1 for errors. The exact results presented on the client side depends on the
+ Texts from a successful execution are returned on channel-type 0 and
+ will in similar manner be piped to <c>stdout</c>. The exit-status code
+ is set to 0 for success and 255 for errors. The exact results presented on the client side depends on the
client and the client's operating system.
</p>
+ <p>In case of the <c>{direct, exec_fun()}</c> variant or no exec-option at all,
+ all reads from <c>standard_input</c> will be from the received data-events of type 0.
+ Those are sent by the client. Similarily all writes to <c>standard_output</c>
+ will be sent as data-events to the client. An OS shell client like the command 'ssh' will usally use
+ stdin and stdout for the user interface.
+ </p>
<p>The option cooperates with the daemon-option <seealso marker="#type-shell_daemon_option"><c>shell</c></seealso>
in the following way:</p>
+
<taglist>
- <tag>1. If the exec-option is present (the shell-option may or may not be present):</tag>
+ <tag>1. If neither the <seealso marker="#type-exec_daemon_option"><c>exec-option</c></seealso> nor the
+ <seealso marker="#type-shell_daemon_option"><c>shell-option</c></seealso> is present:</tag>
+ <item>
+ <p>The default Erlang evaluator is used both for exec and shell requests.
+ The result is returned to the client.</p>
+ </item>
+
+ <tag>2. If the <seealso marker="#type-exec_daemon_option"><c>exec_spec</c></seealso>'s value is <c>disabled</c>
+ (the <seealso marker="#type-shell_daemon_option"><c>shell-option</c></seealso> may or may not be present):</tag>
+ <item>
+ <p>No exec-requests are executed but shell-requests are not affected, they follow the
+ <seealso marker="#type-shell_daemon_option"><c>shell_spec</c></seealso>'s value.</p>
+ </item>
+
+ <tag>3. If the <seealso marker="#type-exec_daemon_option"><c>exec-option</c></seealso>
+ is present and the <seealso marker="#type-exec_daemon_option"><c>exec_spec</c></seealso> value =/= <c>disabled</c>
+ (the <seealso marker="#type-shell_daemon_option"><c>shell-option</c></seealso> may or may not be present):</tag>
<item>
- <p>The exec-option fun is called with the same number of parameters as the arity of the fun,
+ <p>The <seealso marker="#type-exec_daemon_option"><c>exec_spec</c></seealso>
+ <c>fun()</c> is called with the same number of parameters as the arity of the fun,
and the result is returned to the client.
+ Shell-requests are not affected, they follow the
+ <seealso marker="#type-shell_daemon_option"><c>shell_spec</c></seealso>'s value.
</p>
</item>
- <tag>2. If the exec-option is absent, but a shell-option is present with the default Erlang shell:</tag>
+ <tag>4. If the <seealso marker="#type-exec_daemon_option"><c>exec-option</c></seealso> is absent, and the
+ <seealso marker="#type-shell_daemon_option"><c>shell-option</c></seealso>
+ is present with the default Erlang shell as the
+ <seealso marker="#type-shell_daemon_option"><c>shell_spec</c></seealso>'s
+ value:</tag>
<item>
- <p>The default Erlang evaluator is used and the result is returned to the client.</p>
+ <p>The default Erlang evaluator is used both for exec and shell requests.
+ The result is returned to the client.</p>
</item>
- <tag>3. If the exec-option is absent, but a shell-option is present that is not the default Erlang shell:</tag>
+ <tag>5. If the <seealso marker="#type-exec_daemon_option"><c>exec-option</c></seealso> is absent, and the
+ <seealso marker="#type-shell_daemon_option"><c>shell-option</c></seealso>
+ is present with a value that is neither the default Erlang shell nor the value <c>disabled</c>:</tag>
<item>
- <p>The exec-request is not evaluated and an error message is returned to the client.</p>
+ <p>The exec-request is not evaluated and an error message is returned to the client. Shell-requests
+ are executed according to the value of the
+ <seealso marker="#type-shell_daemon_option"><c>shell_spec</c></seealso>.</p>
</item>
- <tag>4. If neither the exec-option nor the shell-option is present:</tag>
+ <tag>6. If the <seealso marker="#type-exec_daemon_option"><c>exec-option</c></seealso> is absent, and the
+ <seealso marker="#type-shell_daemon_option"><c>shell_spec</c></seealso>'s value is <c>disabled</c>:</tag>
<item>
- <p>The default Erlang evaluator is used and the result is returned to the client.</p>
+ <p>Exec requests are executed by the default shell, but shell-requests are not executed.</p>
</item>
+
</taglist>
- <p>If a custom CLI is installed (see the option <seealso marker="#type-ssh_cli_daemon_option"><c>ssh_cli</c></seealso>)
+ <p>If a custom CLI is installed (see the option
+ <seealso marker="#type-ssh_cli_daemon_option"><c>ssh_cli</c></seealso>)
the rules above are replaced by thoose implied by the custom CLI.
</p>
<note>
- <p>The exec-option has existed for a long time but has not previously been documented. The old
- definition and behaviour are retained but obey the rules 1-4 above if conflicting.
+ <p>The <seealso marker="#type-exec_daemon_option"><c>exec-option</c></seealso>
+ has existed for a long time but has not previously been documented. The old
+ definition and behaviour are retained but obey the rules 1-6 above if conflicting.
The old and undocumented style should not be used in new programs.</p>
</note>
</desc>
</datatype>
<datatype>
+ <name name="deprecated_exec_opt"/>
+ <desc>
+ <p>Old-style exec specification that are kept for compatibility, but should not be used in
+ new programs</p>
+ </desc>
+ </datatype>
+
+ <datatype>
<name name="ssh_cli_daemon_option"/>
<desc>
<p>Provides your own CLI implementation in a daemon.</p>
@@ -720,7 +773,12 @@
<datatype>
<name name="max_idle_time_common_option"/>
<desc>
- <p>Sets a time-out on a connection when no channels are active. Defaults to <c>infinity</c>.</p>
+ <p>Sets a time-out on a connection when no channels are open. Defaults to <c>infinity</c>.
+ The unit is milliseconds.
+ </p>
+ <p>The timeout is not active until channels are started, so it does
+ not limit the time from the connection creation to the first channel opening.
+ </p>
</desc>
</datatype>
diff --git a/lib/ssh/doc/src/ssh_app.xml b/lib/ssh/doc/src/ssh_app.xml
index 0c22a50c3f..0ff03cca3d 100644
--- a/lib/ssh/doc/src/ssh_app.xml
+++ b/lib/ssh/doc/src/ssh_app.xml
@@ -165,7 +165,7 @@
<seealso marker="ssh:ssh#type-preferred_algorithms_common_option">preferred_algorithms</seealso>
or
<seealso marker="ssh:ssh#type-modify_algorithms_common_option">modify_algorithms</seealso>
- options)</item>
+ options. Use for example the Option value <c>{modify_algorithms, [{append, [{kex,['diffie-hellman-group1-sha1']}]}]}</c>)</item>
</list>
</item>
@@ -190,6 +190,11 @@
<item>hmac-sha2-256</item>
<item>hmac-sha2-512</item>
<item>hmac-sha1</item>
+ <item>(hmac-sha1-96 It can be enabled with the
+ <seealso marker="ssh:ssh#type-preferred_algorithms_common_option">preferred_algorithms</seealso>
+ or
+ <seealso marker="ssh:ssh#type-modify_algorithms_common_option">modify_algorithms</seealso>
+ options. Use for example the Option value <c>{modify_algorithms, [{append, [{mac,['hmac-sha1-96']}]}]}</c>)</item>
</list>
</item>
@@ -202,6 +207,8 @@
<item>aes192-ctr</item>
<item>aes128-gcm@openssh.com</item>
<item>aes128-ctr</item>
+ <item>aes256-cbc</item>
+ <item>aes192-cbc</item>
<item>aes128-cbc</item>
<item>3des-cbc</item>
<item>(AEAD_AES_128_GCM, not enabled per default)</item>
diff --git a/lib/ssh/doc/src/ssh_connection.xml b/lib/ssh/doc/src/ssh_connection.xml
index 9fa1da659c..65c0347c40 100644
--- a/lib/ssh/doc/src/ssh_connection.xml
+++ b/lib/ssh/doc/src/ssh_connection.xml
@@ -291,27 +291,6 @@
following pattern. The last message is a channel close message, as the <c>exec</c>
request is a one-time execution that closes the channel when it is done.</p>
- <!--taglist>
- <tag><c>N x {ssh_cm, </c><seealso marker="ssh:ssh#type-connection_ref">ssh:connection_ref()</seealso><c>, {data, </c><seealso marker="ssh:ssh#type-channel_id">ssh:channel_id()</seealso><c>, </c><seealso marker="#type-ssh_data_type_code">ssh_data_type_code()</seealso><c>, Data :: binary()}}</c></tag>
- <item><p>The result of executing the command can be only one line
- or thousands of lines depending on the command.</p></item>
-
- <tag><c>0 or 1 x {ssh_cm, </c><seealso marker="ssh:ssh#type-connection_ref">ssh:connection_ref()</seealso><c>, {eof, </c><seealso marker="ssh:ssh#type-channel_id">ssh:channel_id()</seealso><c>}}</c></tag>
- <item><p>Indicates that no more data is to be sent.</p></item>
-
- <tag><c>0 or 1 x {ssh_cm, </c><seealso marker="ssh:ssh#type-connection_ref">ssh:connection_ref()</seealso><c>, {exit_signal, </c><seealso marker="ssh:ssh#type-channel_id">ssh:channel_id()</seealso><c>, ExitSignal :: string(), ErrorMsg :: string(), LanguageString :: string()}}</c></tag>
- <item><p>Not all systems send signals. For details on valid string
- values, see RFC 4254, Section 6.10</p></item>
-
- <tag><c>0 or 1 x {ssh_cm, </c><seealso marker="ssh:ssh#type-connection_ref">ssh:connection_ref()</seealso><c>, {exit_status, </c><seealso marker="ssh:ssh#type-channel_id">ssh:channel_id()</seealso><c>, ExitStatus :: integer()}}</c></tag>
- <item><p>It is recommended by the SSH Connection Protocol to send this
- message, but that is not always the case.</p></item>
-
- <tag><c>1 x {ssh_cm, </c><seealso marker="ssh:ssh#type-connection_ref">ssh:connection_ref()</seealso><c>, {closed, </c><seealso marker="ssh:ssh#type-channel_id">ssh:channel_id()</seealso><c>}}</c></tag>
- <item><p>Indicates that the <c>ssh_client_channel</c> started for the
- execution of the command has now been shut down.</p></item>
- </taglist-->
-
<taglist>
<tag>N x <seealso marker="#type-data_ch_msg">data message(s)</seealso></tag>
<item><p>The result of executing the command can be only one line
@@ -332,6 +311,9 @@
<item><p>Indicates that the <c>ssh_client_channel</c> started for the
execution of the command has now been shut down.</p></item>
</taglist>
+ <p>See the User's Guide section on
+ <seealso marker="using_ssh#one-time-execution">One-Time Execution</seealso> for examples.
+ </p>
</desc>
</func>
diff --git a/lib/ssh/doc/src/using_ssh.xml b/lib/ssh/doc/src/using_ssh.xml
index 5c56dee81d..a3d5efbe06 100644
--- a/lib/ssh/doc/src/using_ssh.xml
+++ b/lib/ssh/doc/src/using_ssh.xml
@@ -58,16 +58,15 @@
<c>ssh:shell/1</c> client to connect to the <em>openssh</em> daemon running on a
host called <em>tarlop</em>:</p>
- <code type="erl" >
- 1> ssh:start().
- ok
- 2> {ok, S} = ssh:shell("tarlop").
- otptest@tarlop:> pwd
- /home/otptest
- otptest@tarlop:> exit
- logout
- 3>
- </code>
+ <pre>
+1> <input>ssh:start().</input>
+ok
+2> <input>{ok, S} = ssh:shell("tarlop").</input>
+otptest@tarlop:> <input>pwd</input>
+/home/otptest
+otptest@tarlop:> <input>exit</input>
+logout
+3> </pre>
</section>
<section>
@@ -89,40 +88,38 @@
<p><em>Step 1.</em> To run the example without root privileges,
generate new keys and host keys:</p>
- <code>
- $bash> ssh-keygen -t rsa -f /tmp/ssh_daemon/ssh_host_rsa_key
- [...]
- $bash> ssh-keygen -t rsa -f /tmp/otptest_user/.ssh/id_rsa
- [...]
- </code>
+ <pre>
+$bash> <input>ssh-keygen -t rsa -f /tmp/ssh_daemon/ssh_host_rsa_key</input>
+[...]
+$bash> <input>ssh-keygen -t rsa -f /tmp/otptest_user/.ssh/id_rsa</input>
+[...] </pre>
<p><em>Step 2.</em> Create the file <c>/tmp/otptest_user/.ssh/authorized_keys</c>
and add the content of <c>/tmp/otptest_user/.ssh/id_rsa.pub</c>.</p>
+ <marker id="start-daemon-step3"></marker>
<p><em>Step 3.</em> Start the Erlang <c>ssh</c> daemon:</p>
- <code type="erl">
- 1> ssh:start().
- ok
- 2> {ok, Sshd} = ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
- {user_dir, "/tmp/otptest_user/.ssh"}]).
- {ok,&lt;0.54.0>}
- 3>
- </code>
+ <pre>
+1> <input>ssh:start().</input>
+ok
+2> <input>{ok, Sshd} = ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
+ {user_dir, "/tmp/otptest_user/.ssh"}]).</input>
+{ok,&lt;0.54.0>}
+3> </pre>
<p><em>Step 4.</em> Use the <em>openssh</em> client from a shell to connect
to the Erlang <c>ssh</c> daemon:</p>
- <code>
- $bash> ssh tarlop -p 8989 -i /tmp/otptest_user/.ssh/id_rsa\
- -o UserKnownHostsFile=/tmp/otptest_user/.ssh/known_hosts
- The authenticity of host 'tarlop' can't be established.
- RSA key fingerprint is 14:81:80:50:b1:1f:57:dd:93:a8:2d:2f:dd:90:ae:a8.
- Are you sure you want to continue connecting (yes/no)? yes
- Warning: Permanently added 'tarlop' (RSA) to the list of known hosts.
- Eshell V5.10 (abort with ^G)
- 1>
- </code>
+ <pre>
+$bash> <input>ssh tarlop -p 8989 -i /tmp/otptest_user/.ssh/id_rsa \
+ -o UserKnownHostsFile=/tmp/otptest_user/.ssh/known_hosts</input>
+The authenticity of host 'tarlop' can't be established.
+RSA key fingerprint is 14:81:80:50:b1:1f:57:dd:93:a8:2d:2f:dd:90:ae:a8.
+Are you sure you want to continue connecting (yes/no)? <input>yes</input>
+Warning: Permanently added 'tarlop' (RSA) to the list of known hosts.
+Eshell V5.10 (abort with ^G)
+1> </pre>
<p>There are two ways of shutting down an <c>ssh</c> daemon,
see <em>Step 5a</em> and <em>Step 5b</em>.</p>
@@ -131,61 +128,299 @@
stops the listener but leaves existing connections, started by the listener,
operational:</p>
- <code type="erl">
- 3> ssh:stop_listener(Sshd).
- ok
- 4>
- </code>
+ <pre>
+3> <input>ssh:stop_listener(Sshd).</input>
+ok
+4> </pre>
<p><em>Step 5b.</em> Shut down the Erlang <c>ssh</c> daemon so that it
stops the listener and all connections started by the listener:</p>
- <code type="erl">
- 3> ssh:stop_daemon(Sshd)
- ok
- 4>
- </code>
-
+ <pre>
+3> <input>ssh:stop_daemon(Sshd).</input>
+ok
+4> </pre>
</section>
<section>
<title>One-Time Execution</title>
+ <section>
+ <marker id="simple-client-example"/>
+ <title>Erlang client contacting OS standard ssh server</title>
<p>In the following example, the Erlang shell is the client process
- that receives the channel replies.</p>
-
- <note><p>The number of received messages in this example depends on which OS
- and which shell that is used on the machine running the <c>ssh</c> daemon.
- See also <seealso marker="ssh_connection#exec-4">ssh_connection:exec/4</seealso>.
- </p></note>
-
- <p>Do a one-time execution of a remote command over <c>ssh</c>:</p>
-
- <code type="erl" >
- 1> ssh:start().
- ok
- 2> {ok, ConnectionRef} = ssh:connect("tarlop", 22, []).
- {ok,&lt;0.57.0>}
- 3>{ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
- {ok,0}
- 4> success = ssh_connection:exec(ConnectionRef, ChannelId, "pwd", infinity).
- 5> flush().
- Shell got {ssh_cm,&lt;0.57.0>,{data,0,0,&lt;&lt;"/home/otptest\n">>}}
- Shell got {ssh_cm,&lt;0.57.0>,{eof,0}}
- Shell got {ssh_cm,&lt;0.57.0>,{exit_status,0,0}}
- Shell got {ssh_cm,&lt;0.57.0>,{closed,0}}
- ok
- 6>
- </code>
+ that receives the channel replies as Erlang messages.</p>
+
+ <p>Do an one-time execution of a remote OS command ("pwd") over <c>ssh</c> to the
+ ssh server of the OS at the host "tarlop":</p>
+
+ <pre>
+1> <input>ssh:start().</input>
+ok
+2> <input>{ok, ConnectionRef} = ssh:connect("tarlop", 22, []).</input>
+{ok,&lt;0.57.0>}
+3> <input>{ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).</input>
+{ok,0}
+4> <input>success = ssh_connection:exec(ConnectionRef, ChannelId, "pwd", infinity).</input>
+5> <input>flush().</input> % Get all pending messages. NOTE: ordering may vary!
+Shell got {ssh_cm,&lt;0.57.0>,{data,0,0,&lt;&lt;"/home/otptest\n">>}}
+Shell got {ssh_cm,&lt;0.57.0>,{eof,0}}
+Shell got {ssh_cm,&lt;0.57.0>,{exit_status,0,0}}
+Shell got {ssh_cm,&lt;0.57.0>,{closed,0}}
+ok
+6> <input>ssh:connection_info(ConnectionRef, channels).</input>
+{channels,[]}
+7></pre>
+
+ <p>See <seealso marker="ssh_connection#description">ssh_connection</seealso> and
+ <seealso marker="ssh_connection#exec-4">ssh_connection:exec/4</seealso>
+ for finding documentation of the channel messages.</p>
+
+ <p>To collect the channel messages in a program, use <c>receive...end</c> instead of <c>flush/1</c>:</p>
+ <pre>
+5> <input>receive</input>
+5> <input> {ssh_cm, ConnectionRef, {data, ChannelId, Type, Result}} when Type == 0 -></input>
+5> <input> {ok,Result}</input>
+5> <input> {ssh_cm, ConnectionRef, {data, ChannelId, Type, Result}} when Type == 1 -></input>
+5> <input> {error,Result}</input>
+5> <input>end.</input>
+{ok,&lt;&lt;"/home/otptest\n">>}
+6></pre>
+
+
+ <p>Note that only the exec channel is closed after the one-time execution.
+ The connection is still up and can handle previously opened channels. It is also
+ possible to open a new channel:</p>
+
+ <pre>
+% try to open a new channel to check if the ConnectionRef is still open
+7> <input>{ok, NewChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).</input>
+{ok,1}
+8></pre>
+
+ <p>To close the connection, call the function <seealso marker="ssh#close-1"><c>ssh:close(ConnectionRef)</c></seealso>.
+ As an alternative, set the option
+ <seealso marker="ssh#type-max_idle_time_common_option"><c>{idle_time, 1}</c></seealso>
+ when opening the connection. This will cause the connection to be closed automaticaly when there are
+ no channels open for the specified time period, in this case 1 ms.
+ </p>
+ </section>
+
+ <section>
+ <title>OS standard client and Erlang daemon (server)</title>
+ <p>An Erlang SSH daemon could be called for one-time execution of a "command". The "command" must be
+ as if entered into the erlang shell, that is a sequence of Erlang
+ <seealso marker="doc/reference_manual:expressions">expressions</seealso> ended by a period (.).
+ Variables bound in that sequence will keep their bindings throughout the expression sequence.
+ The bindings are disposed when the result is returned.</p>
+ <p>Here is an example of a suitable expression sequence:</p>
+ <pre>
+A=1, B=2, 3 == (A + B).</pre>
+ <p>It evaluates to <c>true</c> if submitted to the Erlang daemon started in
+ <seealso marker="#start-daemon-step3">Step 3</seealso> above:</p>
+ <pre>
+$bash> <input>ssh tarlop -p 8989 "A=1, B=2, 3 == (A + B)."</input>
+true
+$bash></pre>
+
+ <p>The same example but now using the Erlang ssh client to contact the Erlang server:</p>
+ <pre>
+1> <input>{ok, ConnectionRef} = ssh:connect("tarlop", 8989, []).</input>
+{ok,&lt;0.216.0>}
+2> <input>{ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).</input>
+{ok,0}
+3> <input>success = ssh_connection:exec(ConnectionRef, ChannelId,
+ "A=1, B=2, 3 == (A + B).",
+ infinity).</input>
+success
+4> <input>flush().</input>
+Shell got {ssh_cm,&lt;0.216.0>,{data,0,0,&lt;&lt;"true">>}}
+Shell got {ssh_cm,&lt;0.216.0>,{exit_status,0,0}}
+Shell got {ssh_cm,&lt;0.216.0>,{eof,0}}
+Shell got {ssh_cm,&lt;0.216.0>,{closed,0}}
+ok
+5></pre>
+
+ <p>Note that Erlang shell specific functions and control sequences like for example
+ <c>h().</c> are not supported.
+ </p>
+ </section>
- <p>Notice that only the channel is closed. The connection is still up and can
- handle other channels:</p>
+ <section>
+ <title>I/O from a function called in an Erlang ssh daemon</title>
+
+ <p>Output to stdout on the server side is also displayed as well as the resulting term
+ from the function call:</p>
+ <pre>
+$bash> <input>ssh tarlop -p 8989 'io:format("Hello!~n~nHow are ~p?~n",[you]).'</input>
+Hello!
+
+How are you?
+ok
+$bash></pre>
+
+ <p>And similar for reading from stdin. As an example we use
+ <seealso marker="stdlib:io#read-1">io:read/1</seealso> which
+ displays the argument as a prompt on stdout, reads a term from stdin and returns it
+ in an ok-tuple:</p>
+ <pre>
+$bash> <input>ssh tarlop -p 8989 'io:read("write something: ").'</input>
+write something: <input>[a,b,c].</input>
+{ok,[a,b,c]}
+$bash></pre>
+
+ <p>The same example but using the Erlang ssh client:</p>
+ <pre>
+Eshell V10.5.2 (abort with ^G)
+1> <input>ssh:start().</input>
+ok
+2> <input>{ok, ConnectionRef} = ssh:connect(loopback, 8989, []).</input>
+{ok,&lt;0.92.0>}
+3> <input>{ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).</input>
+{ok,0}
+4> <input>success = ssh_connection:exec(ConnectionRef, ChannelId,
+ "io:read(\"write something: \").",
+ infinity).</input>
+success
+5> <input>flush().</input>
+Shell got {ssh_cm,&lt;0.92.0>,{data,0,0,&lt;&lt;"write something: ">>}}
+ok
+% All data is sent as binaries with string contents:
+6> <input>ok = ssh_connection:send(ConnectionRef, ChannelId, &lt;&lt;"[a,b,c].">>).</input>
+ok
+7> <input>flush().</input>
+ok
+%% Nothing is received, because the io:read/1
+%% requires the input line to end with a newline.
+
+%% Send a newline (it could have been included in the last send):
+8> <input>ssh_connection:send(ConnectionRef, ChannelId, &lt;&lt;"\n">>).</input>
+ok
+9> <input>flush().</input>
+Shell got {ssh_cm,&lt;0.92.0>,{data,0,0,&lt;&lt;"{ok,[a,b,c]}">>}}
+Shell got {ssh_cm,&lt;0.92.0>,{exit_status,0,0}}
+Shell got {ssh_cm,&lt;0.92.0>,{eof,0}}
+Shell got {ssh_cm,&lt;0.92.0>,{closed,0}}
+ok
+10></pre>
+ </section>
+
+ <section>
+ <title>Configuring the server's (daemon's) command execution</title>
+ <p>Every time a daemon <seealso marker="#running-an-erlang-ssh-daemon">is started</seealso>, it enables
+ one-time execution of commands as described in the
+ <seealso marker="#simple-client-example">previous section</seealso> unless explicitly disabled.
+ </p>
+
+ <p>There is often a need to configure some other exec evaluator to tailor the input language or
+ restrict the possible functions to call. There are two ways of doing this which will be shown with examples
+ below. See <seealso marker="ssh#daemon-2">ssh:daemon/2,3</seealso> and
+ <seealso marker="ssh#type-exec_daemon_option">exec_daemon_option()</seealso>) for details.</p>
+ <p>Examples of the two ways to configure the exec evaluator:</p>
+ <list type="ordered">
+ <item>Disable one-time execution.<br/>
+ To modify the daemon start example above to reject one-time execution requests,
+ we change <seealso marker="#start-daemon-step3">Step 3</seealso> by adding the option
+ <c>{exec, disabled}</c>
+ to:
+ <pre>
+1> <input>ssh:start().</input>
+ok
+2> <input>{ok, Sshd} = ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
+ {user_dir, "/tmp/otptest_user/.ssh"},
+ {exec, disabled}
+ ]).</input>
+{ok,&lt;0.54.0>}
+3> </pre>
+ <p>A call to that daemon will return the text "Prohibited." on stderr (depending on the client and OS),
+ and the exit status 255:</p>
+ <pre>
+$bash> <input>ssh tarlop -p 8989 "test."</input>
+Prohibited.
+$bash> <input>echo $?</input>
+255
+$bash> </pre>
+ <p>And the Erlang client library also returns the text "Prohibited." on data type 1 instead of the normal 0
+ and exit status 255:</p>
+ <pre>
+2> <input>{ok, ConnectionRef} = ssh:connect(loopback, 8989, []).</input>
+{ok,&lt;0.92.0>}
+3> <input>{ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).</input>
+{ok,0}
+4> <input>success = ssh_connection:exec(ConnectionRef, ChannelId, "test."</input>
+success
+5> <input>flush().</input>
+Shell got {ssh_cm,&lt;0.106.0>,{data,0,1,&lt;&lt;"Prohibited.">>}}
+Shell got {ssh_cm,&lt;0.106.0>,{exit_status,0,255}}
+Shell got {ssh_cm,&lt;0.106.0>,{eof,0}}
+Shell got {ssh_cm,&lt;0.106.0>,{closed,0}}
+ok
+6></pre>
+ </item>
+
+ <item>Install an alternative evaluator.<br/>
+ Start the damon with a reference to a <c>fun()</c> that handles the evaluation:
+ <pre>
+1> <input>ssh:start().</input>
+ok
+2> <input>MyEvaluator = fun("1") -> {ok, some_value};
+ ("2") -> {ok, some_other_value};
+ ("3") -> {ok, V} = io:read("input erlang term>> "),
+ {ok, V};
+ (Err) -> {error,{bad_input,Err}}
+ end.</input>
+3> <input>{ok, Sshd} = ssh:daemon(1234, [{system_dir, "/tmp/ssh_daemon"},
+ {user_dir, "/tmp/otptest_user/.ssh"},
+ {exec, {direct,MyEvaluator}}
+ ]).</input>
+{ok,&lt;0.275.0>}
+4></pre>
+ and call it:
+ <pre>
+$bash> <input>ssh localhost -p 1234 1</input>
+some_value
+$bash> <input>ssh localhost -p 1234 2</input>
+some_other_value
+# I/O works:
+$bash> <input>ssh localhost -p 1234 3</input>
+input erlang term>> <input>abc.</input>
+abc
+# Check that Erlang evaluation is disabled:
+$bash> <input>ssh localhost -p 1234 1+ 2.</input>
+**Error** {bad_input,"1+ 2."}
+$bash> </pre>
+ Note that spaces are preserved and that no point (.) is needed at the end - that was required
+ by the default evaluator.
+ <p>The error return in the Erlang client (The text as data type 1 and exit_status 255):</p>
+ <pre>
+2> <input>{ok, ConnectionRef} = ssh:connect(loopback, 1234, []).</input>
+{ok,&lt;0.92.0>}
+3> <input>{ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).</input>
+{ok,0}
+4> <input>success = ssh_connection:exec(ConnectionRef, ChannelId, "1+ 2."</input>
+success
+5> <input>flush().</input>
+Shell got {ssh_cm,&lt;0.106.0>,{data,0,1,&lt;&lt;"**Error** {bad_input,\"1+ 2.\"}">>}}
+Shell got {ssh_cm,&lt;0.106.0>,{exit_status,0,255}}
+Shell got {ssh_cm,&lt;0.106.0>,{eof,0}}
+Shell got {ssh_cm,&lt;0.106.0>,{closed,0}}
+ok
+6></pre>
+ <p>The <c>fun()</c> in the exec option could take up to three arguments
+ (<c>Cmd</c>, <c>User</c> and <c>ClientAddress</c>). See
+ the <seealso marker="ssh#type-exec_daemon_option">exec_daemon_option()</seealso> for the details.</p>
+ </item>
+ </list>
+
+
+ <note><p>An old, discouraged and undocumented way of installing an alternative evaluator exists.</p>
+ <p>It still works, but lacks
+ for example I/O possibility. It is because of that compatibility we need
+ the <c>{direct,...}</c> construction.
+ </p>
+ </note>
+ </section>
- <code type="erl" >
- 6> {ok, NewChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
- {ok,1}
- ...
- </code>
</section>
<section>
@@ -193,27 +428,26 @@
<p>Start the Erlang <c>ssh</c> daemon with the SFTP subsystem:</p>
- <code type="erl" >
- 1> ssh:start().
- ok
- 2> ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
- {user_dir, "/tmp/otptest_user/.ssh"},
- {subsystems, [ssh_sftpd:subsystem_spec([{cwd, "/tmp/sftp/example"}])
- ]}]).
- {ok,&lt;0.54.0>}
- 3>
- </code>
+ <pre>
+1> <input>ssh:start().</input>
+ok
+2> <input>ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
+ {user_dir, "/tmp/otptest_user/.ssh"},
+ {subsystems, [ssh_sftpd:subsystem_spec(
+ [{cwd, "/tmp/sftp/example"}])
+ ]}]).</input>
+{ok,&lt;0.54.0>}
+3> </pre>
<p>Run the OpenSSH SFTP client:</p>
- <code type="erl">
- $bash> sftp -oPort=8989 -o IdentityFile=/tmp/otptest_user/.ssh/id_rsa\
- -o UserKnownHostsFile=/tmp/otptest_user/.ssh/known_hosts tarlop
- Connecting to tarlop...
- sftp> pwd
- Remote working directory: /tmp/sftp/example
- sftp>
- </code>
+ <pre>
+$bash> <input>sftp -oPort=8989 -o IdentityFile=/tmp/otptest_user/.ssh/id_rsa \
+ -o UserKnownHostsFile=/tmp/otptest_user/.ssh/known_hosts tarlop</input>
+Connecting to tarlop...
+sftp> <input>pwd</input>
+Remote working directory: /tmp/sftp/example
+sftp> </pre>
</section>
<section>
@@ -221,14 +455,13 @@
<p>Fetch a file with the Erlang SFTP client:</p>
- <code type="erl" >
- 1> ssh:start().
- ok
- 2> {ok, ChannelPid, Connection} = ssh_sftp:start_channel("tarlop", []).
- {ok,&lt;0.57.0>,&lt;0.51.0>}
- 3> ssh_sftp:read_file(ChannelPid, "/home/otptest/test.txt").
- {ok,&lt;&lt;"This is a test file\n">>}
- </code>
+ <pre>
+1> <input>ssh:start().</input>
+ok
+2> <input>{ok, ChannelPid, Connection} = ssh_sftp:start_channel("tarlop", []).</input>
+{ok,&lt;0.57.0>,&lt;0.51.0>}
+3> <input>ssh_sftp:read_file(ChannelPid, "/home/otptest/test.txt").</input>
+{ok,&lt;&lt;"This is a test file\n">>} </pre>
</section>
<section>
@@ -237,17 +470,17 @@
<title>Basic example</title>
<p>This is an example of writing and then reading a tar file:</p>
<code type="erl">
- {ok,HandleWrite} = ssh_sftp:open_tar(ChannelPid, ?tar_file_name, [write]),
- ok = erl_tar:add(HandleWrite, .... ),
- ok = erl_tar:add(HandleWrite, .... ),
- ...
- ok = erl_tar:add(HandleWrite, .... ),
- ok = erl_tar:close(HandleWrite),
-
- %% And for reading
- {ok,HandleRead} = ssh_sftp:open_tar(ChannelPid, ?tar_file_name, [read]),
- {ok,NameValueList} = erl_tar:extract(HandleRead,[memory]),
- ok = erl_tar:close(HandleRead),
+{ok,HandleWrite} = ssh_sftp:open_tar(ChannelPid, ?tar_file_name, [write]),
+ok = erl_tar:add(HandleWrite, .... ),
+ok = erl_tar:add(HandleWrite, .... ),
+...
+ok = erl_tar:add(HandleWrite, .... ),
+ok = erl_tar:close(HandleWrite),
+
+%% And for reading
+{ok,HandleRead} = ssh_sftp:open_tar(ChannelPid, ?tar_file_name, [read]),
+{ok,NameValueList} = erl_tar:extract(HandleRead,[memory]),
+ok = erl_tar:close(HandleRead),
</code>
</section>
@@ -367,30 +600,30 @@ terminate(_Reason, _State) ->
as described in Section <seealso marker="#Running an Erlang ssh Daemon">
Running an Erlang ssh Daemon</seealso>:</p>
- <code type="erl" >
- 1> ssh:start().
- ok
- 2> ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
- {user_dir, "/tmp/otptest_user/.ssh"}
- {subsystems, [{"echo_n", {ssh_echo_server, [10]}}]}]).
- {ok,&lt;0.54.0>}
- 3>
- </code>
-
- <code type="erl" >
- 1> ssh:start().
- ok
- 2>{ok, ConnectionRef} = ssh:connect("tarlop", 8989, [{user_dir, "/tmp/otptest_user/.ssh"}]).
- {ok,&lt;0.57.0>}
- 3>{ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).
- 4> success = ssh_connection:subsystem(ConnectionRef, ChannelId, "echo_n", infinity).
- 5> ok = ssh_connection:send(ConnectionRef, ChannelId, "0123456789", infinity).
- 6> flush().
- {ssh_msg, &lt;0.57.0>, {data, 0, 1, "0123456789"}}
- {ssh_msg, &lt;0.57.0>, {eof, 0}}
- {ssh_msg, &lt;0.57.0>, {closed, 0}}
- 7> {error, closed} = ssh_connection:send(ConnectionRef, ChannelId, "10", infinity).
- </code>
+ <pre>
+1> <input>ssh:start().</input>
+ok
+2> <input>ssh:daemon(8989, [{system_dir, "/tmp/ssh_daemon"},
+ {user_dir, "/tmp/otptest_user/.ssh"}
+ {subsystems, [{"echo_n", {ssh_echo_server, [10]}}]}]).</input>
+{ok,&lt;0.54.0>}
+3> </pre>
+
+ <pre>
+1> <input>ssh:start().</input>
+ok
+2> <input>{ok, ConnectionRef} = ssh:connect("tarlop", 8989,
+ [{user_dir, "/tmp/otptest_user/.ssh"}]).</input>
+ {ok,&lt;0.57.0>}
+3> <input>{ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity).</input>
+4> <input>success = ssh_connection:subsystem(ConnectionRef, ChannelId, "echo_n", infinity).</input>
+5> <input>ok = ssh_connection:send(ConnectionRef, ChannelId, "0123456789", infinity).</input>
+6> <input>flush().</input>
+{ssh_msg, &lt;0.57.0>, {data, 0, 1, "0123456789"}}
+{ssh_msg, &lt;0.57.0>, {eof, 0}}
+{ssh_msg, &lt;0.57.0>, {closed, 0}}
+7> <input>{error, closed} = ssh_connection:send(ConnectionRef, ChannelId, "10", infinity).</input> </pre>
+
<p>See also <seealso marker="ssh_client_channel">ssh_client_channel(3)</seealso> (replaces ssh_channel(3)).</p>
</section>
diff --git a/lib/ssh/src/ssh.erl b/lib/ssh/src/ssh.erl
index 28f8e0ac18..c93b796078 100644
--- a/lib/ssh/src/ssh.erl
+++ b/lib/ssh/src/ssh.erl
@@ -477,33 +477,12 @@ stop_daemon(Address, Port, Profile) ->
%% and will not return until the remote shell is ended.(e.g. on
%% exit from the shell)
%%--------------------------------------------------------------------
--spec shell(open_socket() | host()) -> _.
+-spec shell(open_socket() | host() | connection_ref()) -> _.
shell(Socket) when is_port(Socket) ->
shell(Socket, []);
-shell(Host) ->
- shell(Host, ?SSH_DEFAULT_PORT, []).
-
-
--spec shell(open_socket() | host(), client_options()) -> _.
-
-shell(Socket, Options) when is_port(Socket) ->
- start_shell( connect(Socket, Options) );
-shell(Host, Options) ->
- shell(Host, ?SSH_DEFAULT_PORT, Options).
-
--spec shell(Host, Port, Options) -> _ when
- Host :: host(),
- Port :: inet:port_number(),
- Options :: client_options() .
-
-shell(Host, Port, Options) ->
- start_shell( connect(Host, Port, Options) ).
-
-
-
-start_shell({ok, ConnectionRef}) ->
+shell(ConnectionRef) when is_pid(ConnectionRef) ->
case ssh_connection:session_channel(ConnectionRef, infinity) of
{ok,ChannelId} ->
success = ssh_connection:ptty_alloc(ConnectionRef, ChannelId, []),
@@ -521,8 +500,38 @@ start_shell({ok, ConnectionRef}) ->
Error
end;
-start_shell(Error) ->
- Error.
+shell(Host) ->
+ shell(Host, ?SSH_DEFAULT_PORT, []).
+
+
+-spec shell(open_socket() | host(), client_options()) -> _.
+
+shell(Socket, Options) when is_port(Socket) ->
+ case connect(Socket, Options) of
+ {ok,ConnectionRef} ->
+ shell(ConnectionRef),
+ close(ConnectionRef);
+ Error ->
+ Error
+ end;
+
+shell(Host, Options) ->
+ shell(Host, ?SSH_DEFAULT_PORT, Options).
+
+
+-spec shell(Host, Port, Options) -> _ when
+ Host :: host(),
+ Port :: inet:port_number(),
+ Options :: client_options() .
+
+shell(Host, Port, Options) ->
+ case connect(Host, Port, Options) of
+ {ok,ConnectionRef} ->
+ shell(ConnectionRef),
+ close(ConnectionRef);
+ Error ->
+ Error
+ end.
%%--------------------------------------------------------------------
-spec default_algorithms() -> algs_list() .
diff --git a/lib/ssh/src/ssh.hrl b/lib/ssh/src/ssh.hrl
index a991f72cf2..86c447f695 100644
--- a/lib/ssh/src/ssh.hrl
+++ b/lib/ssh/src/ssh.hrl
@@ -163,6 +163,8 @@
'aes128-ctr' |
'aes128-gcm@openssh.com' |
'aes192-ctr' |
+ 'aes192-cbc' |
+ 'aes256-cbc' |
'aes256-ctr' |
'aes256-gcm@openssh.com' |
'chacha20-poly1305@openssh.com'
@@ -171,6 +173,7 @@
-type mac_alg() :: 'AEAD_AES_128_GCM' |
'AEAD_AES_256_GCM' |
'hmac-sha1' |
+ 'hmac-sha1-96' |
'hmac-sha2-256' |
'hmac-sha2-512'
.
@@ -315,17 +318,20 @@
-type subsystem_daemon_option() :: {subsystems, subsystem_specs()}.
-type subsystem_specs() :: [ subsystem_spec() ].
--type shell_daemon_option() :: {shell, mod_fun_args() | 'shell_fun/1'() | 'shell_fun/2'() }.
+-type shell_daemon_option() :: {shell, shell_spec()} .
+-type shell_spec() :: mod_fun_args() | shell_fun() | disabled .
+-type shell_fun() :: 'shell_fun/1'() | 'shell_fun/2'() .
-type 'shell_fun/1'() :: fun((User::string()) -> pid()) .
-type 'shell_fun/2'() :: fun((User::string(), PeerAddr::inet:ip_address()) -> pid()).
-type exec_daemon_option() :: {exec, exec_spec()} .
--type exec_spec() :: {direct, exec_fun()} .
+-type exec_spec() :: {direct, exec_fun()} | disabled | deprecated_exec_opt().
-type exec_fun() :: 'exec_fun/1'() | 'exec_fun/2'() | 'exec_fun/3'().
-type 'exec_fun/1'() :: fun((Cmd::string()) -> exec_result()) .
-type 'exec_fun/2'() :: fun((Cmd::string(), User::string()) -> exec_result()) .
-type 'exec_fun/3'() :: fun((Cmd::string(), User::string(), ClientAddr::ip_port()) -> exec_result()) .
-type exec_result() :: {ok,Result::term()} | {error,Reason::term()} .
+-type deprecated_exec_opt() :: fun() | mod_fun_args() .
-type ssh_cli_daemon_option() :: {ssh_cli, mod_args() | no_cli }.
diff --git a/lib/ssh/src/ssh_cli.erl b/lib/ssh/src/ssh_cli.erl
index af51356355..7f04fcb804 100644
--- a/lib/ssh/src/ssh_cli.erl
+++ b/lib/ssh/src/ssh_cli.erl
@@ -46,6 +46,8 @@
exec
}).
+-define(EXEC_ERROR_STATUS, 255).
+
%%====================================================================
%% ssh_server_channel callbacks
%%====================================================================
@@ -105,6 +107,12 @@ handle_ssh_msg({ssh_cm, ConnectionHandler,
write_chars(ConnectionHandler, ChannelId, Chars),
{ok, State#state{pty = Pty, buf = NewBuf}};
+handle_ssh_msg({ssh_cm, ConnectionHandler, {shell, ChannelId, WantReply}}, #state{shell=disabled} = State) ->
+ write_chars(ConnectionHandler, ChannelId, 1, "Prohibited."),
+ ssh_connection:reply_request(ConnectionHandler, WantReply, success, ChannelId),
+ ssh_connection:exit_status(ConnectionHandler, ChannelId, ?EXEC_ERROR_STATUS),
+ ssh_connection:send_eof(ConnectionHandler, ChannelId),
+ {stop, ChannelId, State#state{channel = ChannelId, cm = ConnectionHandler}};
handle_ssh_msg({ssh_cm, ConnectionHandler, {shell, ChannelId, WantReply}}, State) ->
NewState = start_shell(ConnectionHandler, State),
ssh_connection:reply_request(ConnectionHandler, WantReply, success, ChannelId),
@@ -114,22 +122,28 @@ handle_ssh_msg({ssh_cm, ConnectionHandler, {shell, ChannelId, WantReply}}, Stat
handle_ssh_msg({ssh_cm, ConnectionHandler, {exec, ChannelId, WantReply, Cmd}}, S0) ->
case
case S0#state.exec of
+ disabled ->
+ {"Prohibited.", ?EXEC_ERROR_STATUS, 1};
+
{direct,F} ->
%% Exec called and a Fun or MFA is defined to use. The F returns the
%% value to return.
- exec_direct(ConnectionHandler, F, Cmd);
+ %% The standard I/O is directed from/to the channel ChannelId.
+ exec_direct(ConnectionHandler, ChannelId, Cmd, F, WantReply, S0);
- undefined when S0#state.shell == ?DEFAULT_SHELL ->
+ undefined when S0#state.shell == ?DEFAULT_SHELL ;
+ S0#state.shell == disabled ->
%% Exec called and the shell is the default shell (= Erlang shell).
%% To be exact, eval the term as an Erlang term (but not using the
%% ?DEFAULT_SHELL directly). This disables banner, prompts and such.
- exec_in_erlang_default_shell(Cmd);
+ %% The standard I/O is directed from/to the channel ChannelId.
+ exec_in_erlang_default_shell(ConnectionHandler, ChannelId, Cmd, WantReply, S0);
undefined ->
%% Exec called, but the a shell other than the default shell is defined.
%% No new exec shell is defined, so don't execute!
%% We don't know if it is intended to use the new shell or not.
- {"Prohibited.", 255, 1};
+ {"Prohibited.", ?EXEC_ERROR_STATUS, 1};
_ ->
%% Exec called and a Fun or MFA is defined to use. The F communicates via
@@ -216,14 +230,9 @@ handle_msg({Group, Req}, #state{group = Group, buf = Buf, pty = Pty,
write_chars(ConnectionHandler, ChannelId, Chars),
{ok, State#state{buf = NewBuf}};
-handle_msg({'EXIT', Group, Reason}, #state{group = Group,
+handle_msg({'EXIT', Group, _Reason}, #state{group = Group,
cm = ConnectionHandler,
channel = ChannelId} = State) ->
- Status = case Reason of
- normal -> 0;
- _ -> -1
- end,
- ssh_connection:exit_status(ConnectionHandler, ChannelId, Status),
ssh_connection:send_eof(ConnectionHandler, ChannelId),
{stop, ChannelId, State};
@@ -357,7 +366,7 @@ insert_chars([], {Buf, BufTail, Col}, _Tty) ->
insert_chars(Chars, {Buf, BufTail, Col}, Tty) ->
{NewBuf, _NewBufTail, WriteBuf, NewCol} =
conv_buf(Chars, Buf, [], [], Col),
- M = move_cursor(NewCol + length(BufTail), NewCol, Tty),
+ M = move_cursor(special_at_width(NewCol+length(BufTail), Tty), NewCol, Tty),
{[WriteBuf, BufTail | M], {NewBuf, BufTail, NewCol}}.
%%% delete characters at current position, (backwards if negative argument)
@@ -372,7 +381,7 @@ delete_chars(N, {Buf, BufTail, Col}, Tty) -> % N < 0
NewBuf = nthtail(-N, Buf),
NewCol = case Col + N of V when V >= 0 -> V; _ -> 0 end,
M1 = move_cursor(Col, NewCol, Tty),
- M2 = move_cursor(NewCol + length(BufTail) - N, NewCol, Tty),
+ M2 = move_cursor(special_at_width(NewCol+length(BufTail)-N, Tty), NewCol, Tty),
{[M1, BufTail, lists:duplicate(-N, $ ) | M2],
{NewBuf, BufTail, NewCol}}.
@@ -429,6 +438,10 @@ move_cursor(From, To, #ssh_pty{width=Width, term=Type}) ->
end,
[Tcol | Trow].
+%%% Caution for line "breaks"
+special_at_width(From0, #ssh_pty{width=Width}) when (From0 rem Width) == 0 -> From0 - 1;
+special_at_width(From0, _) -> From0.
+
%% %%% write out characters
%% %%% make sure that there is data to send
%% %%% before calling ssh_connection:send
@@ -518,86 +531,94 @@ start_exec_shell(ConnectionHandler, Cmd, State) ->
buf = empty_buf()}.
%%--------------------------------------------------------------------
-exec_in_erlang_default_shell(Cmd) ->
- case eval(parse(scan(Cmd))) of
- {ok, Term} ->
- {io_lib:format("~p\n", [Term]), 0, 0};
- {error, Error} when is_atom(Error) ->
- {io_lib:format("Error in ~p: ~p\n", [Cmd,Error]), -1, 1};
- _ ->
- {io_lib:format("Error: ~p\n", [Cmd]), -1, 1}
- end.
+exec_in_erlang_default_shell(ConnectionHandler, ChannelId, Cmd, WantReply, State) ->
+ exec_in_self_group(ConnectionHandler, ChannelId, WantReply, State,
+ fun() ->
+ eval(parse(scan(Cmd)))
+ end).
+
scan(Cmd) ->
erl_scan:string(Cmd).
parse({ok, Tokens, _}) ->
erl_parse:parse_exprs(Tokens);
-parse(Error) ->
- Error.
+parse({error, {_,erl_scan,Cause}, _}) ->
+ {error, erl_scan:format_error(Cause)}.
eval({ok, Expr_list}) ->
- case (catch erl_eval:exprs(Expr_list,
- erl_eval:new_bindings())) of
- {value, Value, _NewBindings} ->
- {ok, Value};
- {'EXIT', {Error, _}} ->
- {error, Error};
- {error, Error} ->
- {error, Error};
- Error ->
- {error, Error}
- end;
+ {value, Value, _NewBindings} = erl_eval:exprs(Expr_list, erl_eval:new_bindings()),
+ {ok, Value};
+eval({error, {_,erl_parse,Cause}}) ->
+ {error, erl_parse:format_error(Cause)};
eval({error,Error}) ->
- {error, Error};
-eval(Error) ->
{error, Error}.
%%--------------------------------------------------------------------
-exec_direct(ConnectionHandler, ExecSpec, Cmd) ->
- try
- case ExecSpec of
- _ when is_function(ExecSpec, 1) ->
- ExecSpec(Cmd);
- _ when is_function(ExecSpec, 2) ->
- [{user,User}] = ssh_connection_handler:connection_info(ConnectionHandler, [user]),
- ExecSpec(Cmd, User);
- _ when is_function(ExecSpec, 3) ->
- ConnectionInfo =
- ssh_connection_handler:connection_info(ConnectionHandler, [peer, user]),
- User = proplists:get_value(user, ConnectionInfo),
- {_, PeerAddr} = proplists:get_value(peer, ConnectionInfo),
- ExecSpec(Cmd, User, PeerAddr)
- end
- of
- Reply ->
- return_direct_exec_reply(Reply, Cmd)
- catch
- C:Error ->
- {io_lib:format("Error in \"~s\": ~p ~p~n", [Cmd,C,Error]), -1, 1}
- end.
-
-
+exec_direct(ConnectionHandler, ChannelId, Cmd, ExecSpec, WantReply, State) ->
+ Fun =
+ fun() ->
+ if
+ is_function(ExecSpec, 1) ->
+ ExecSpec(Cmd);
+
+ is_function(ExecSpec, 2) ->
+ [{user,User}] = ssh_connection_handler:connection_info(ConnectionHandler, [user]),
+ ExecSpec(Cmd, User);
+
+ is_function(ExecSpec, 3) ->
+ ConnectionInfo =
+ ssh_connection_handler:connection_info(ConnectionHandler, [peer, user]),
+ User = proplists:get_value(user, ConnectionInfo),
+ {_, PeerAddr} = proplists:get_value(peer, ConnectionInfo),
+ ExecSpec(Cmd, User, PeerAddr);
+
+ true ->
+ {error, "Bad exec fun in server"}
+ end
+ end,
+ exec_in_self_group(ConnectionHandler, ChannelId, WantReply, State, Fun).
-return_direct_exec_reply(Reply, Cmd) ->
- case fmt_exec_repl(Reply) of
- {ok,S} ->
- {S, 0, 0};
- {error,S} ->
- {io_lib:format("Error in \"~s\": ~s~n", [Cmd,S]), -1, 1}
- end.
+%%--------------------------------------------------------------------
+%% Help for directing stdin and stdout from and to the channel from/to the client
+%%
+exec_in_self_group(ConnectionHandler, ChannelId, WantReply, State, Fun) ->
+ Exec =
+ fun() ->
+ spawn(
+ fun() ->
+ case try
+ ssh_connection:reply_request(ConnectionHandler, WantReply, success, ChannelId),
+ Fun()
+ of
+ {ok, Result} ->
+ {ok, Result};
+ {error, Error} ->
+ {error, Error};
+ X ->
+ {error, "Bad exec fun in server. Invalid return value: "++t2str(X)}
+ catch error:Err ->
+ {error,Err};
+ Cls:Exp ->
+ {error,{Cls,Exp}}
+ end
+ of
+ {ok,Str} ->
+ write_chars(ConnectionHandler, ChannelId, t2str(Str)),
+ ssh_connection:exit_status(ConnectionHandler, ChannelId, 0);
+ {error, Str} ->
+ write_chars(ConnectionHandler, ChannelId, 1, "**Error** "++t2str(Str)),
+ ssh_connection:exit_status(ConnectionHandler, ChannelId, ?EXEC_ERROR_STATUS)
+ end
+ end)
+ end,
+ {ok, State#state{group = group:start(self(), Exec, [{echo,false}]),
+ buf = empty_buf()}}.
+
-fmt_exec_repl({T,A}) when T==ok ; T==error ->
- try
- {T, io_lib:format("~s",[A])}
- catch
- error:badarg ->
- {T, io_lib:format("~p", [A])};
- C:Err ->
- {error, io_lib:format("~p:~p~n",[C,Err])}
- end;
-fmt_exec_repl(Other) ->
- {error, io_lib:format("Bad exec-plugin return: ~p",[Other])}.
+t2str(T) -> try io_lib:format("~s",[T])
+ catch _:_ -> io_lib:format("~p",[T])
+ end.
%%--------------------------------------------------------------------
% Pty can be undefined if the client never sets any pty options before
diff --git a/lib/ssh/src/ssh_options.erl b/lib/ssh/src/ssh_options.erl
index 39f23a8b8a..e2a18edc0d 100644
--- a/lib/ssh/src/ssh_options.erl
+++ b/lib/ssh/src/ssh_options.erl
@@ -306,6 +306,7 @@ default(server) ->
shell =>
#{default => ?DEFAULT_SHELL,
chk => fun({M,F,A}) -> is_atom(M) andalso is_atom(F) andalso is_list(A);
+ (disabled) -> true;
(V) -> check_function1(V) orelse check_function2(V)
end,
class => user_option
@@ -314,6 +315,7 @@ default(server) ->
exec =>
#{default => undefined,
chk => fun({direct, V}) -> check_function1(V) orelse check_function2(V) orelse check_function3(V);
+ (disabled) -> true;
%% Compatibility (undocumented):
({M,F,A}) -> is_atom(M) andalso is_atom(F) andalso is_list(A);
(V) -> check_function1(V) orelse check_function2(V) orelse check_function3(V)
diff --git a/lib/ssh/src/ssh_sftp.erl b/lib/ssh/src/ssh_sftp.erl
index 4b6e187c3a..28df85dfa4 100644
--- a/lib/ssh/src/ssh_sftp.erl
+++ b/lib/ssh/src/ssh_sftp.erl
@@ -160,8 +160,10 @@ start_channel(Socket, UserOptions) when is_port(Socket) ->
start_channel(Cm, UserOptions) when is_pid(Cm) ->
Timeout = proplists:get_value(timeout, UserOptions, infinity),
{_SshOpts, ChanOpts, SftpOpts} = handle_options(UserOptions),
- case ssh_xfer:attach(Cm, [], ChanOpts) of
- {ok, ChannelId, Cm} ->
+ WindowSize = proplists:get_value(window_size, ChanOpts, ?XFER_WINDOW_SIZE),
+ PacketSize = proplists:get_value(packet_size, ChanOpts, ?XFER_PACKET_SIZE),
+ case ssh_connection:session_channel(Cm, WindowSize, PacketSize, Timeout) of
+ {ok, ChannelId} ->
case ssh_client_channel:start(Cm, ChannelId,
?MODULE, [Cm, ChannelId, SftpOpts]) of
{ok, Pid} ->
@@ -194,25 +196,24 @@ start_channel(Host, UserOptions) ->
-> {ok,pid(),ssh:connection_ref()} | {error,reason()}.
start_channel(Host, Port, UserOptions) ->
- {SshOpts, ChanOpts, SftpOpts} = handle_options(UserOptions),
+ {SshOpts, _ChanOpts, _SftpOpts} = handle_options(UserOptions),
Timeout = % A mixture of ssh:connect and ssh_sftp:start_channel:
- proplists:get_value(connect_timeout, SshOpts,
- proplists:get_value(timeout, SftpOpts, infinity)),
- case ssh_xfer:connect(Host, Port, SshOpts, ChanOpts, Timeout) of
- {ok, ChannelId, Cm} ->
- case ssh_client_channel:start(Cm, ChannelId, ?MODULE, [Cm,ChannelId,SftpOpts]) of
- {ok, Pid} ->
- case wait_for_version_negotiation(Pid, Timeout) of
- ok ->
- {ok, Pid, Cm};
- TimeOut ->
- TimeOut
- end;
- {error, Reason} ->
- {error, format_channel_start_error(Reason)};
- ignore ->
- {error, ignore}
- end;
+ case proplists:get_value(connect_timeout, UserOptions) of
+ undefined ->
+ proplists:get_value(timeout, UserOptions, infinity);
+ TO ->
+ TO
+ end,
+ case ssh:connect(Host, Port, SshOpts, Timeout) of
+ {ok, Cm} ->
+ case start_channel(Cm, UserOptions) of
+ {ok, Pid} ->
+ {ok, Pid, Cm};
+ Error ->
+ Error
+ end;
+ {error, Timeout} ->
+ {error, timeout};
Error ->
Error
end.
diff --git a/lib/ssh/src/ssh_transport.erl b/lib/ssh/src/ssh_transport.erl
index a85926354e..d1a3d513d1 100644
--- a/lib/ssh/src/ssh_transport.erl
+++ b/lib/ssh/src/ssh_transport.erl
@@ -108,7 +108,9 @@ default_algorithms(cipher) ->
]));
default_algorithms(mac) ->
supported_algorithms(mac, same(['AEAD_AES_128_GCM',
- 'AEAD_AES_256_GCM']));
+ 'AEAD_AES_256_GCM',
+ 'hmac-sha1-96'
+ ]));
default_algorithms(Alg) ->
supported_algorithms(Alg, []).
@@ -161,6 +163,8 @@ supported_algorithms(cipher) ->
{'aes128-ctr', [{ciphers,aes_128_ctr}]},
{'AEAD_AES_256_GCM', [{ciphers,aes_256_gcm}]},
{'AEAD_AES_128_GCM', [{ciphers,aes_128_gcm}]},
+ {'aes256-cbc', [{ciphers,aes_256_cbc}]},
+ {'aes192-cbc', [{ciphers,aes_192_cbc}]},
{'aes128-cbc', [{ciphers,aes_128_cbc}]},
{'3des-cbc', [{ciphers,des_ede3_cbc}]}
]
@@ -171,6 +175,7 @@ supported_algorithms(mac) ->
[{'hmac-sha2-256', [{macs,hmac}, {hashs,sha256}]},
{'hmac-sha2-512', [{macs,hmac}, {hashs,sha512}]},
{'hmac-sha1', [{macs,hmac}, {hashs,sha}]},
+ {'hmac-sha1-96', [{macs,hmac}, {hashs,sha}]},
{'AEAD_AES_128_GCM', [{ciphers,aes_128_gcm}]},
{'AEAD_AES_256_GCM', [{ciphers,aes_256_gcm}]}
]
@@ -1345,6 +1350,18 @@ cipher('aes128-cbc') ->
iv_bytes = 16,
block_bytes = 16};
+cipher('aes192-cbc') ->
+ #cipher{impl = aes_192_cbc,
+ key_bytes = 24,
+ iv_bytes = 16,
+ block_bytes = 16};
+
+cipher('aes256-cbc') ->
+ #cipher{impl = aes_256_cbc,
+ key_bytes = 32,
+ iv_bytes = 16,
+ block_bytes = 16};
+
cipher('aes128-ctr') ->
#cipher{impl = aes_128_ctr,
key_bytes = 16,
diff --git a/lib/ssh/src/ssh_xfer.erl b/lib/ssh/src/ssh_xfer.erl
index 1d77ccb311..b071b38be2 100644
--- a/lib/ssh/src/ssh_xfer.erl
+++ b/lib/ssh/src/ssh_xfer.erl
@@ -24,7 +24,6 @@
-module(ssh_xfer).
--export([attach/2, attach/3, connect/3, connect/4, connect/5]).
-export([open/6, opendir/3, readdir/3, close/3, read/5, write/5,
rename/5, remove/3, mkdir/4, rmdir/3, realpath/3, extended/4,
stat/4, fstat/4, lstat/4, setstat/4,
@@ -47,44 +46,6 @@
-define(is_set(F, Bits),
((F) band (Bits)) == (F)).
--define(XFER_PACKET_SIZE, 65536).
--define(XFER_WINDOW_SIZE, 20*?XFER_PACKET_SIZE).
-
-attach(CM, Opts) ->
- open_xfer(CM, Opts, []).
-
-attach(CM, Opts, ChanOpts) ->
- open_xfer(CM, Opts, ChanOpts).
-
-
-connect(Host, Port, Opts) ->
- case ssh:connect(Host, Port, Opts) of
- {ok, CM} -> open_xfer(CM, Opts, []);
- Error -> Error
- end.
-
-connect(Host, Port, Opts, Timeout) ->
- connect(Host, Port, Opts, [], Timeout).
-
-connect(Host, Port, Opts, ChanOpts, Timeout) ->
- case ssh:connect(Host, Port, Opts, Timeout) of
- {ok, CM} -> open_xfer(CM, [{timeout, Timeout}|Opts], ChanOpts);
- {error, Timeout} -> {error, timeout};
- Error -> Error
- end.
-
-
-open_xfer(CM, Opts, ChanOpts) ->
- TMO = proplists:get_value(timeout, Opts, infinity),
- WindowSize = proplists:get_value(window_size, ChanOpts, ?XFER_WINDOW_SIZE),
- PacketSize = proplists:get_value(packet_size, ChanOpts, ?XFER_PACKET_SIZE),
- case ssh_connection:session_channel(CM, WindowSize, PacketSize, TMO) of
- {ok, ChannelId} ->
- {ok, ChannelId, CM};
- Error ->
- Error
- end.
-
protocol_version_request(XF, Version) ->
xf_request(XF, ?SSH_FXP_INIT, <<?UINT32(Version)>>).
diff --git a/lib/ssh/src/ssh_xfer.hrl b/lib/ssh/src/ssh_xfer.hrl
index a76e9151db..aaf2c16d10 100644
--- a/lib/ssh/src/ssh_xfer.hrl
+++ b/lib/ssh/src/ssh_xfer.hrl
@@ -20,6 +20,10 @@
%%
+
+-define(XFER_PACKET_SIZE, 65536).
+-define(XFER_WINDOW_SIZE, 20*?XFER_PACKET_SIZE).
+
%%% Description: SFTP defines
-define(SSH_SFTP_PROTOCOL_VERSION, 6).
%%%----------------------------------------------------------------------
diff --git a/lib/ssh/test/ssh_algorithms_SUITE.erl b/lib/ssh/test/ssh_algorithms_SUITE.erl
index 02e5f40c38..f9557b4fe9 100644
--- a/lib/ssh/test/ssh_algorithms_SUITE.erl
+++ b/lib/ssh/test/ssh_algorithms_SUITE.erl
@@ -43,7 +43,7 @@ all() ->
groups() ->
- ErlAlgos = extract_algos(ssh:default_algorithms()),
+ ErlAlgos = extract_algos(ssh_transport:supported_algorithms()),
SshcAlgos = extract_algos(ssh_test_lib:default_algorithms(sshc)),
SshdAlgos = extract_algos(ssh_test_lib:default_algorithms(sshd)),
@@ -225,22 +225,29 @@ end_per_testcase(_TC, Config) ->
%% A simple sftp transfer
simple_sftp(Config) ->
{Host,Port} = proplists:get_value(srvr_addr, Config),
- ssh_test_lib:std_simple_sftp(Host, Port, Config).
+ {preferred_algorithms,AlgEntries} = proplists:get_value(pref_algs, Config),
+ ssh_test_lib:std_simple_sftp(Host, Port, Config,
+ [{modify_algorithms,[{append,AlgEntries}]}]
+ ).
%%--------------------------------------------------------------------
%% A simple exec call
simple_exec(Config) ->
{Host,Port} = proplists:get_value(srvr_addr, Config),
- ssh_test_lib:std_simple_exec(Host, Port, Config).
+ {preferred_algorithms,AlgEntries} = proplists:get_value(pref_algs, Config),
+ ssh_test_lib:std_simple_exec(Host, Port, Config,
+ [{modify_algorithms,[{append,AlgEntries}]}]
+ ).
%%--------------------------------------------------------------------
%% A simple exec call
simple_connect(Config) ->
{Host,Port} = proplists:get_value(srvr_addr, Config),
+ {preferred_algorithms,AlgEntries} = proplists:get_value(pref_algs, Config),
Opts =
case proplists:get_value(tag_alg, Config) of
{public_key,Alg} -> [{pref_public_key_algs,[Alg]}];
- _ -> []
+ _ -> [{modify_algorithms,[{append,AlgEntries}]}]
end,
ConnectionRef = ssh_test_lib:std_connect(Config, Host, Port, Opts),
ct:log("~p:~p connected! ~p",[?MODULE,?LINE,ConnectionRef]),
diff --git a/lib/ssh/test/ssh_basic_SUITE.erl b/lib/ssh/test/ssh_basic_SUITE.erl
index 9b987dea5a..30d03f842f 100644
--- a/lib/ssh/test/ssh_basic_SUITE.erl
+++ b/lib/ssh/test/ssh_basic_SUITE.erl
@@ -47,8 +47,11 @@ all() ->
daemon_already_started
].
+%%%-define(PARALLEL, ).
+-define(PARALLEL, parallel).
+
groups() ->
- [{all_tests, [parallel], [{group, ssh_renegotiate_SUITE},
+ [{all_tests, [?PARALLEL], [{group, ssh_renegotiate_SUITE},
{group, ssh_basic_SUITE}
]},
{ssh_basic_SUITE, [], [app_test,
@@ -79,7 +82,7 @@ groups() ->
shell_exit_status
]},
- {ssh_renegotiate_SUITE, [parallel], [rekey0,
+ {ssh_renegotiate_SUITE, [?PARALLEL], [rekey0,
rekey1,
rekey2,
rekey3,
@@ -101,7 +104,7 @@ groups() ->
{ed25519_key, [], [{group, basic}]},
{ed448_key, [], [{group, basic}]},
{rsa_host_key_is_actualy_ecdsa, [], [fail_daemon_start]},
- {host_user_key_differs, [parallel], [exec_key_differs1,
+ {host_user_key_differs, [?PARALLEL], [exec_key_differs1,
exec_key_differs2,
exec_key_differs3,
exec_key_differs_fail]},
@@ -110,9 +113,9 @@ groups() ->
{ecdsa_sha2_nistp256_pass_key, [], [pass_phrase]},
{ecdsa_sha2_nistp384_pass_key, [], [pass_phrase]},
{ecdsa_sha2_nistp521_pass_key, [], [pass_phrase]},
- {key_cb, [parallel], [key_callback, key_callback_options]},
+ {key_cb, [?PARALLEL], [key_callback, key_callback_options]},
{internal_error, [], [internal_error]},
- {login_bad_pwd_no_retry, [parallel], [login_bad_pwd_no_retry1,
+ {login_bad_pwd_no_retry, [?PARALLEL], [login_bad_pwd_no_retry1,
login_bad_pwd_no_retry2,
login_bad_pwd_no_retry3,
login_bad_pwd_no_retry4,
@@ -124,8 +127,9 @@ groups() ->
close,
known_hosts
]},
- {p_basic, [parallel], [send, peername_sockname,
+ {p_basic, [?PARALLEL], [send, peername_sockname,
exec, exec_compressed,
+ exec_with_io_out, exec_with_io_in,
cli,
idle_time_client, idle_time_server, openssh_zlib_basic_test,
misc_ssh_options, inet_option, inet6_option]}
@@ -251,23 +255,27 @@ init_per_group(ed448_key, Config) ->
{skip, unsupported_pub_key}
end;
init_per_group(rsa_pass_key, Config) ->
+ DataDir = proplists:get_value(data_dir, Config),
+ PrivDir = proplists:get_value(priv_dir, Config),
case lists:member('ssh-rsa',
- ssh_transport:default_algorithms(public_key)) of
+ ssh_transport:default_algorithms(public_key))
+ andalso
+ ssh_test_lib:setup_rsa_pass_phrase(DataDir, PrivDir, "Password")
+ of
true ->
- DataDir = proplists:get_value(data_dir, Config),
- PrivDir = proplists:get_value(priv_dir, Config),
- ssh_test_lib:setup_rsa_pass_pharse(DataDir, PrivDir, "Password"),
[{pass_phrase, {rsa_pass_phrase, "Password"}}| Config];
false ->
{skip, unsupported_pub_key}
end;
init_per_group(dsa_pass_key, Config) ->
+ DataDir = proplists:get_value(data_dir, Config),
+ PrivDir = proplists:get_value(priv_dir, Config),
case lists:member('ssh-dss',
- ssh_transport:default_algorithms(public_key)) of
+ ssh_transport:default_algorithms(public_key))
+ andalso
+ ssh_test_lib:setup_dsa_pass_phrase(DataDir, PrivDir, "Password")
+ of
true ->
- DataDir = proplists:get_value(data_dir, Config),
- PrivDir = proplists:get_value(priv_dir, Config),
- ssh_test_lib:setup_dsa_pass_pharse(DataDir, PrivDir, "Password"),
[{pass_phrase, {dsa_pass_phrase, "Password"}}| Config];
false ->
{skip, unsupported_pub_key}
@@ -543,7 +551,7 @@ exec(Config) when is_list(Config) ->
{ok, ChannelId0} = ssh_connection:session_channel(ConnectionRef, infinity),
success = ssh_connection:exec(ConnectionRef, ChannelId0,
"1+1.", infinity),
- Data0 = {ssh_cm, ConnectionRef, {data, ChannelId0, 0, <<"2\n">>}},
+ Data0 = {ssh_cm, ConnectionRef, {data, ChannelId0, 0, <<"2">>}},
case ssh_test_lib:receive_exec_result(Data0) of
expected ->
ok;
@@ -557,7 +565,7 @@ exec(Config) when is_list(Config) ->
{ok, ChannelId1} = ssh_connection:session_channel(ConnectionRef, infinity),
success = ssh_connection:exec(ConnectionRef, ChannelId1,
"2+2.", infinity),
- Data1 = {ssh_cm, ConnectionRef, {data, ChannelId1, 0, <<"4\n">>}},
+ Data1 = {ssh_cm, ConnectionRef, {data, ChannelId1, 0, <<"4">>}},
case ssh_test_lib:receive_exec_result(Data1) of
expected ->
ok;
@@ -569,6 +577,58 @@ exec(Config) when is_list(Config) ->
ssh:stop_daemon(Pid).
%%--------------------------------------------------------------------
+%%% Test api function ssh_connection:exec with erlang server and the Command
+%%% makes io
+exec_with_io_out(Config) when is_list(Config) ->
+ process_flag(trap_exit, true),
+ SystemDir = filename:join(proplists:get_value(priv_dir, Config), system),
+ UserDir = proplists:get_value(priv_dir, Config),
+
+ {Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SystemDir},
+ {user_dir, UserDir},
+ {failfun, fun ssh_test_lib:failfun/2}]),
+ ConnectionRef =
+ ssh_test_lib:connect(Host, Port, [{silently_accept_hosts, true},
+ {user_dir, UserDir},
+ {user_interaction, false}]),
+ {ok, ChannelId0} = ssh_connection:session_channel(ConnectionRef, infinity),
+ success = ssh_connection:exec(ConnectionRef, ChannelId0,
+ "io:write(hej).", infinity),
+ case ssh_test_lib:receive_exec_result(
+ [{ssh_cm, ConnectionRef, {data, ChannelId0, 0, <<"hej">>}},
+ {ssh_cm, ConnectionRef, {data, ChannelId0, 0, <<"ok">>}}]) of
+ expected ->
+ ok;
+ Other0 ->
+ ct:fail(Other0)
+ end,
+ ssh_test_lib:receive_exec_end(ConnectionRef, ChannelId0),
+ ssh:close(ConnectionRef),
+ ssh:stop_daemon(Pid).
+
+exec_with_io_in(Config) when is_list(Config) ->
+ process_flag(trap_exit, true),
+ SystemDir = filename:join(proplists:get_value(priv_dir, Config), system),
+ UserDir = proplists:get_value(priv_dir, Config),
+
+ {Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SystemDir},
+ {user_dir, UserDir},
+ {failfun, fun ssh_test_lib:failfun/2}]),
+ C = ssh_test_lib:connect(Host, Port, [{silently_accept_hosts, true},
+ {user_dir, UserDir},
+ {user_interaction, false}]),
+ {ok, Ch} = ssh_connection:session_channel(C, infinity),
+ ssh_connection:exec(C, Ch, "io:read('% ').", 1000),
+
+ ssh_test_lib:receive_exec_result_or_fail({ssh_cm, C, {data,Ch,0,<<"% ">>}}),
+ ok = ssh_connection:send(C, Ch, "hej.\n", 10000),
+
+ ssh_test_lib:receive_exec_result_or_fail({ssh_cm, C, {data,Ch,0,<<"{ok,hej}">>}}),
+ ssh_test_lib:receive_exec_end(C, Ch),
+ ssh:close(C),
+ ssh:stop_daemon(Pid).
+
+%%--------------------------------------------------------------------
%%% Test that compression option works
exec_compressed(Config) when is_list(Config) ->
case ssh_test_lib:ssh_supports(zlib, compression) of
@@ -591,7 +651,7 @@ exec_compressed(Config) when is_list(Config) ->
{ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity),
success = ssh_connection:exec(ConnectionRef, ChannelId,
"1+1.", infinity),
- Data = {ssh_cm, ConnectionRef, {data, ChannelId, 0, <<"2\n">>}},
+ Data = {ssh_cm, ConnectionRef, {data, ChannelId, 0, <<"2">>}},
case ssh_test_lib:receive_exec_result(Data) of
expected ->
ok;
diff --git a/lib/ssh/test/ssh_compat_SUITE.erl b/lib/ssh/test/ssh_compat_SUITE.erl
index 06ed9082cf..93593c82b5 100644
--- a/lib/ssh/test/ssh_compat_SUITE.erl
+++ b/lib/ssh/test/ssh_compat_SUITE.erl
@@ -86,13 +86,13 @@ init_per_suite(Config) ->
Config
end).
-end_per_suite(Config) ->
+end_per_suite(_Config) ->
%% Remove all containers that are not running:
%%% os:cmd("docker rm $(docker ps -aq -f status=exited)"),
%% Remove dangling images:
%%% os:cmd("docker rmi $(docker images -f dangling=true -q)"),
catch ssh:stop(),
- Config.
+ ok.
init_per_group(otp_server, Config) ->
@@ -812,7 +812,7 @@ iptoa(IP) -> inet_parse:ntoa(IP).
host_ip() ->
{ok,Name} = inet:gethostname(),
- {ok,#hostent{h_addr_list = [IP|_]}} = inet_res:gethostbyname(Name),
+ {ok,IP} = inet:ip(Name),
IP.
%%--------------------------------------------------------------------
diff --git a/lib/ssh/test/ssh_connection_SUITE.erl b/lib/ssh/test/ssh_connection_SUITE.erl
index 6aa587dc7f..c187a5e4b5 100644
--- a/lib/ssh/test/ssh_connection_SUITE.erl
+++ b/lib/ssh/test/ssh_connection_SUITE.erl
@@ -47,6 +47,8 @@ all() ->
interrupted_send,
exec_erlang_term,
exec_erlang_term_non_default_shell,
+ exec_disabled,
+ exec_shell_disabled,
start_shell,
start_shell_exec,
start_shell_exec_fun,
@@ -57,6 +59,8 @@ all() ->
start_shell_exec_direct_fun3,
start_shell_exec_direct_fun1_error,
start_shell_exec_direct_fun1_error_type,
+ start_exec_direct_fun1_read_write,
+ start_exec_direct_fun1_read_write_advanced,
start_shell_sock_exec_fun,
start_shell_sock_daemon_exec,
connect_sock_not_tcp,
@@ -93,9 +97,9 @@ sock() ->
init_per_suite(Config) ->
?CHECK_CRYPTO(Config).
-end_per_suite(Config) ->
+end_per_suite(_Config) ->
catch ssh:stop(),
- Config.
+ ok.
%%--------------------------------------------------------------------
init_per_group(openssh, Config) ->
@@ -314,7 +318,7 @@ send_after_exit(Config) when is_list(Config) ->
10000 -> ct:fail("timeout ~p:~p",[?MODULE,?LINE])
end,
receive
- {ssh_cm, ConnectionRef, {exit_status, ChannelId0, _ExitStatus}} ->
+ {ssh_cm, ConnectionRef, {exit_status, ChannelId0, ExitStatus}} when ExitStatus=/=0 ->
ok
after
10000 -> ct:fail("timeout ~p:~p",[?MODULE,?LINE])
@@ -504,19 +508,12 @@ start_shell(Config) when is_list(Config) ->
{password, "morot"},
{user_interaction, true},
{user_dir, UserDir}]),
-
- {ok, ChannelId0} = ssh_connection:session_channel(ConnectionRef, infinity),
- ok = ssh_connection:shell(ConnectionRef,ChannelId0),
-
- receive
- {ssh_cm,ConnectionRef, {data, ChannelId0, 0, <<"Enter command\r\n">>}} ->
- ok
- after 5000 ->
- ct:fail("CLI Timeout")
- end,
-
+ test_shell_is_enabled(ConnectionRef, <<"Enter command\r\n">>),
+ test_exec_is_disabled(ConnectionRef),
ssh:close(ConnectionRef),
ssh:stop_daemon(Pid).
+
+
%%--------------------------------------------------------------------
start_shell_exec() ->
[{doc, "start shell to exec command"}].
@@ -536,18 +533,8 @@ start_shell_exec(Config) when is_list(Config) ->
{password, "morot"},
{user_interaction, true},
{user_dir, UserDir}]),
-
- {ok, ChannelId0} = ssh_connection:session_channel(ConnectionRef, infinity),
-
- success = ssh_connection:exec(ConnectionRef, ChannelId0,
- "testing", infinity),
- receive
- {ssh_cm, ConnectionRef, {data, _ChannelId, 0, <<"echo testing\r\n">>}} ->
- ok
- after 5000 ->
- ct:fail("Exec Timeout")
- end,
-
+ test_shell_is_enabled(ConnectionRef),
+ test_exec_is_enabled(ConnectionRef, "testing", <<"echo testing\r\n">>),
ssh:close(ConnectionRef),
ssh:stop_daemon(Pid).
@@ -567,24 +554,10 @@ exec_erlang_term(Config) when is_list(Config) ->
{password, "morot"},
{user_interaction, true},
{user_dir, UserDir}]),
-
- {ok, ChannelId0} = ssh_connection:session_channel(ConnectionRef, infinity),
-
- success = ssh_connection:exec(ConnectionRef, ChannelId0,
- "1+2.", infinity),
- TestResult =
- receive
- {ssh_cm, ConnectionRef, {data, _ChannelId, 0, <<"3",_/binary>>}} = R ->
- ct:log("Got expected ~p",[R]);
- Other ->
- ct:log("Got unexpected ~p",[Other])
- after 5000 ->
- {fail,"Exec Timeout"}
- end,
-
+ test_shell_is_enabled(ConnectionRef),
+ test_exec_is_enabled(ConnectionRef),
ssh:close(ConnectionRef),
- ssh:stop_daemon(Pid),
- TestResult.
+ ssh:stop_daemon(Pid).
%%--------------------------------------------------------------------
exec_erlang_term_non_default_shell(Config) when is_list(Config) ->
@@ -604,25 +577,51 @@ exec_erlang_term_non_default_shell(Config) when is_list(Config) ->
{user_interaction, true},
{user_dir, UserDir}
]),
+ test_exec_is_disabled(ConnectionRef),
+ ssh:close(ConnectionRef),
+ ssh:stop_daemon(Pid).
- {ok, ChannelId0} = ssh_connection:session_channel(ConnectionRef, infinity),
+%%--------------------------------------------------------------------
+exec_disabled(Config) when is_list(Config) ->
+ PrivDir = proplists:get_value(priv_dir, Config),
+ UserDir = filename:join(PrivDir, nopubkey), % to make sure we don't use public-key-auth
+ file:make_dir(UserDir),
+ SysDir = proplists:get_value(data_dir, Config),
+ {Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SysDir},
+ {user_dir, UserDir},
+ {password, "morot"},
+ {exec, disabled}
+ ]),
+ ConnectionRef = ssh_test_lib:connect(Host, Port, [{silently_accept_hosts, true},
+ {user, "foo"},
+ {password, "morot"},
+ {user_interaction, true},
+ {user_dir, UserDir}
+ ]),
+ test_shell_is_enabled(ConnectionRef),
+ test_exec_is_disabled(ConnectionRef),
+ ssh:stop_daemon(Pid).
- success = ssh_connection:exec(ConnectionRef, ChannelId0,
- "1+2.", infinity),
- TestResult =
- receive
- {ssh_cm, ConnectionRef, {data, _ChannelId, 0, <<"3",_/binary>>}} = R ->
- ct:log("Got unexpected ~p",[R]),
- {fail,"Could exec erlang term although non-erlang shell"};
- Other ->
- ct:log("Got expected ~p",[Other])
- after 5000 ->
- {fail, "Exec Timeout"}
- end,
- ssh:close(ConnectionRef),
- ssh:stop_daemon(Pid),
- TestResult.
+exec_shell_disabled(Config) when is_list(Config) ->
+ PrivDir = proplists:get_value(priv_dir, Config),
+ UserDir = filename:join(PrivDir, nopubkey), % to make sure we don't use public-key-auth
+ file:make_dir(UserDir),
+ SysDir = proplists:get_value(data_dir, Config),
+ {Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SysDir},
+ {user_dir, UserDir},
+ {password, "morot"},
+ {shell, disabled}
+ ]),
+ ConnectionRef = ssh_test_lib:connect(Host, Port, [{silently_accept_hosts, true},
+ {user, "foo"},
+ {password, "morot"},
+ {user_interaction, true},
+ {user_dir, UserDir}
+ ]),
+ test_shell_is_disabled(ConnectionRef),
+ test_exec_is_enabled(ConnectionRef),
+ ssh:stop_daemon(Pid).
%%--------------------------------------------------------------------
start_shell_exec_fun(Config) ->
@@ -657,14 +656,135 @@ start_shell_exec_direct_fun3(Config) ->
start_shell_exec_direct_fun1_error(Config) ->
do_start_shell_exec_fun({direct, fun ssh_exec_direct_echo_error_return/1},
- "testing", <<"Error in \"testing\": {bad}\n">>, 1,
+ "testing", <<"**Error** {bad}">>, 1,
Config).
start_shell_exec_direct_fun1_error_type(Config) ->
do_start_shell_exec_fun({direct, fun ssh_exec_direct_echo_error_return_type/1},
- "testing", <<"Error in \"testing\": Bad exec-plugin return: very_bad\n">>, 1,
+ "testing", <<"**Error** Bad exec fun in server. Invalid return value: very_bad">>, 1,
Config).
+start_exec_direct_fun1_read_write(Config) ->
+ PrivDir = proplists:get_value(priv_dir, Config),
+ UserDir = filename:join(PrivDir, nopubkey), % to make sure we don't use public-key-auth
+ file:make_dir(UserDir),
+ SysDir = proplists:get_value(data_dir, Config),
+ {Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SysDir},
+ {user_dir, UserDir},
+ {password, "morot"},
+ {exec, {direct,fun read_write_loop/1}}]),
+
+ C = ssh_test_lib:connect(Host, Port, [{silently_accept_hosts, true},
+ {user, "foo"},
+ {password, "morot"},
+ {user_interaction, true},
+ {user_dir, UserDir}]),
+
+ {ok, Ch} = ssh_connection:session_channel(C, infinity),
+
+ success = ssh_connection:exec(C, Ch, "> ", infinity),
+ ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"Tiny read/write test\r\n">>}}),
+
+ ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"1> ">>}}),
+ ok = ssh_connection:send(C, Ch, "hej.\n", 5000),
+ ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"{simple_eval,hej}\r\n">>}}),
+
+ ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"2> ">>}}),
+ ok = ssh_connection:send(C, Ch, "quit.\n", 5000),
+ ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"{1,inputs}">>}}),
+ receive
+ {ssh_cm,C,{exit_status,Ch,0}} -> ok
+ after 5000 -> go_on
+ end,
+ receive
+ {ssh_cm,C,{eof,Ch}} -> ok
+ after 5000 -> go_on
+ end,
+ receive
+ {ssh_cm,C,{closed,Ch}} -> ok
+ after 5000 -> go_on
+ end,
+ receive
+ X -> ct:fail("remaining messages"),
+ ct:log("remaining message: ~p",[X])
+ after 0 -> go_on
+ end,
+ ssh:stop_daemon(Pid).
+
+
+start_exec_direct_fun1_read_write_advanced(Config) ->
+ PrivDir = proplists:get_value(priv_dir, Config),
+ UserDir = filename:join(PrivDir, nopubkey), % to make sure we don't use public-key-auth
+ file:make_dir(UserDir),
+ SysDir = proplists:get_value(data_dir, Config),
+ {Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SysDir},
+ {user_dir, UserDir},
+ {password, "morot"},
+ {exec, {direct,fun read_write_loop/1}}]),
+
+ C = ssh_test_lib:connect(Host, Port, [{silently_accept_hosts, true},
+ {user, "foo"},
+ {password, "morot"},
+ {user_interaction, true},
+ {user_dir, UserDir}]),
+
+ {ok, Ch} = ssh_connection:session_channel(C, infinity),
+
+ success = ssh_connection:exec(C, Ch, "> ", infinity),
+ ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"Tiny read/write test\r\n">>}}),
+
+ ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"1> ">>}}),
+ ok = ssh_connection:send(C, Ch, "hej.\n", 5000),
+ ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"{simple_eval,hej}\r\n">>}}),
+
+ ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"2> ">>}}),
+ ok = ssh_connection:send(C, Ch, "'Hi ", 5000),
+ ok = ssh_connection:send(C, Ch, "there", 5000),
+ ok = ssh_connection:send(C, Ch, "'", 5000),
+ ok = ssh_connection:send(C, Ch, ".\n", 5000),
+ ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"{simple_eval,'Hi there'}\r\n">>}}),
+ ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"3> ">>}}),
+ ok = ssh_connection:send(C, Ch, "bad_input.\n", 5000),
+ ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,1,<<"**Error** {bad_input,3}">>}}),
+ receive
+ {ssh_cm,C,{exit_status,Ch,255}} -> ok
+ after 5000 -> go_on
+ end,
+ receive
+ {ssh_cm,C,{eof,Ch}} -> ok
+ after 5000 -> go_on
+ end,
+ receive
+ {ssh_cm,C,{closed,Ch}} -> ok
+ after 5000 -> go_on
+ end,
+ receive
+ X -> ct:fail("remaining messages"),
+ ct:log("remaining message: ~p",[X])
+ after 0 -> go_on
+ end,
+ ssh:stop_daemon(Pid).
+
+
+
+
+%% A tiny read-write loop ended by a 'quit.\n'
+read_write_loop(Prompt) ->
+ io:format("Tiny read/write test~n", []),
+ read_write_loop1(Prompt, 1).
+
+read_write_loop1(Prompt, N) ->
+ case io:read(lists:concat([N,Prompt])) of
+ {ok, quit} ->
+ {ok, {N-1, inputs}};
+ {ok, bad_input} ->
+ {error, {bad_input,N}};
+ {ok,Inp} ->
+ io:format("~p~n",[simple_eval(Inp)]),
+ read_write_loop1(Prompt, N+1)
+ end.
+
+simple_eval(Inp) -> {simple_eval,Inp}.
do_start_shell_exec_fun(Fun, Command, Expect, ExpectType, Config) ->
@@ -1056,6 +1176,117 @@ max_channels_option(Config) when is_list(Config) ->
%%--------------------------------------------------------------------
%% Internal functions ------------------------------------------------
%%--------------------------------------------------------------------
+flush_msgs() ->
+ receive
+ _ -> flush_msgs()
+ after
+ 500 -> ok
+ end.
+
+test_shell_is_disabled(ConnectionRef) ->
+ test_shell_is_disabled(ConnectionRef, <<"Prohibited.">>, <<"Eshell V">>).
+
+test_shell_is_disabled(ConnectionRef, Expect, NotExpect) ->
+ {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity),
+ ok = ssh_connection:shell(ConnectionRef, ChannelId),
+ ExpSz = size(Expect),
+ NotExpSz = size(NotExpect),
+ receive
+ {ssh_cm, ConnectionRef, {data, ChannelId, 1, <<Expect:ExpSz/binary, _/binary>>}} ->
+ flush_msgs();
+
+ {ssh_cm, ConnectionRef, {data, ChannelId, 0, <<NotExpect:NotExpSz/binary, _/binary>>}} ->
+ ct:fail("Could start disabled shell!");
+
+ R ->
+ ct:log("~p:~p Got unexpected ~p",[?MODULE,?LINE,R]),
+ ct:fail("Strange shell response")
+
+ after 5000 ->
+ ct:fail("Shell Timeout")
+ end.
+
+test_exec_is_disabled(ConnectionRef) ->
+ {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity),
+ success = ssh_connection:exec(ConnectionRef, ChannelId, "1+2.", infinity),
+ receive
+ {ssh_cm, ConnectionRef, {data,ChannelId,1,<<"Prohibited.">>}} ->
+ flush_msgs();
+ R ->
+ ct:log("~p:~p Got unexpected ~p",[?MODULE,?LINE,R]),
+ ct:fail("Could exec erlang term although non-erlang shell")
+ after 5000 ->
+ ct:fail("Exec Timeout")
+ end.
+
+test_shell_is_enabled(ConnectionRef) ->
+ test_shell_is_enabled(ConnectionRef, <<"Eshell V">>).
+
+test_shell_is_enabled(ConnectionRef, Expect) ->
+ {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity),
+ ok = ssh_connection:shell(ConnectionRef,ChannelId),
+ ExpSz = size(Expect),
+ receive
+ {ssh_cm,ConnectionRef, {data, ChannelId, 0, <<Expect:ExpSz/binary, _/binary>>}} ->
+ flush_msgs();
+
+ R ->
+ ct:log("~p:~p Got unexpected ~p",[?MODULE,?LINE,R]),
+ ct:fail("Strange shell response")
+
+ after 5000 ->
+ ct:fail("CLI Timeout")
+ end.
+
+
+test_exec_is_enabled(ConnectionRef) ->
+ test_exec_is_enabled(ConnectionRef, "1+2.", <<"3">>).
+
+test_exec_is_enabled(ConnectionRef, Exec, Expect) ->
+ {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity),
+ success = ssh_connection:exec(ConnectionRef, ChannelId, Exec, infinity),
+ ExpSz = size(Expect),
+ receive
+ {ssh_cm, ConnectionRef, {data, ChannelId, 0, <<Expect:ExpSz/binary, _/binary>>}} = R ->
+ ct:log("~p:~p Got expected ~p",[?MODULE,?LINE,R]);
+ Other ->
+ ct:log("~p:~p Got unexpected ~p",[?MODULE,?LINE,Other])
+ after 5000 ->
+ {fail,"Exec Timeout"}
+ end.
+
+
+%%%----------------------------------------------------------------
+get_channel_close_sequence(ConnectionRef, ChannelId) ->
+ Set = [eof, exit_status, closed],
+ get_channel_close_sequence(ConnectionRef, ChannelId, Set).
+
+get_channel_close_sequence(_ConnectionRef, _ChannelId, []) ->
+ ok;
+get_channel_close_sequence(ConnectionRef, ChannelId, Set) ->
+ receive
+ {ssh_cm, ConnectionRef, Event} when element(2,Event) == ChannelId ->
+ try lists:member(element(1,Event), Set)
+ of
+ true ->
+ ct:log("get_channel_close_sequence: ~p received", [Event]),
+ get_channel_close_sequence(ConnectionRef, Event, Set--[element(1,Event)]);
+ false ->
+ ct:log("~p:~p Got unexpected ~p~nExpecting ~p",[?MODULE,?LINE,Event,Set]),
+ ct:fail("Strange response 1")
+ catch
+ _ :_ ->
+ ct:log("~p:~p Got unexpected ~p~nExpecting ~p",[?MODULE,?LINE,Event,Set]),
+ ct:fail("Strange response 2")
+ end;
+ Msg ->
+ ct:log("~p:~p Got unexpected ~p~nExpecting event from the set ~p",[?MODULE,?LINE,Msg,Set]),
+ ct:fail("Strange response 3")
+ after
+ 10000 -> ct:fail("timeout ~p:~p",[?MODULE,?LINE])
+ end.
+
+%%%----------------------------------------------------------------
big_cat_rx(ConnectionRef, ChannelId) ->
big_cat_rx(ConnectionRef, ChannelId, []).
diff --git a/lib/ssh/test/ssh_options_SUITE.erl b/lib/ssh/test/ssh_options_SUITE.erl
index bf90f74324..b244c1bbd4 100644
--- a/lib/ssh/test/ssh_options_SUITE.erl
+++ b/lib/ssh/test/ssh_options_SUITE.erl
@@ -805,11 +805,14 @@ do_hostkey_fingerprint_check(Config, HashAlg) ->
case supported_hash(HashAlg) of
true ->
really_do_hostkey_fingerprint_check(Config, HashAlg);
+ false when HashAlg == old ->
+ {skip,{unsupported_hash,md5}};% Happen to know that public_key:ssh_hostkey_fingerprint/1 uses md5...
false ->
{skip,{unsupported_hash,HashAlg}}
end.
-supported_hash(old) -> true;
+supported_hash(old) ->
+ supported_hash(md5); % Happen to know that public_key:ssh_hostkey_fingerprint/1 uses md5...
supported_hash(HashAlg) ->
Hs = if is_atom(HashAlg) -> [HashAlg];
is_list(HashAlg) -> HashAlg
diff --git a/lib/ssh/test/ssh_property_test_SUITE.erl b/lib/ssh/test/ssh_property_test_SUITE.erl
index 9aaac898a0..4290ec1487 100644
--- a/lib/ssh/test/ssh_property_test_SUITE.erl
+++ b/lib/ssh/test/ssh_property_test_SUITE.erl
@@ -36,6 +36,8 @@
-compile(export_all).
-include_lib("common_test/include/ct.hrl").
+-include("ssh_test_lib.hrl").
+
all() -> [{group, messages},
client_sends_info_timing,
@@ -54,10 +56,12 @@ groups() ->
%%% First prepare Config and compile the property tests for the found tool:
init_per_suite(Config) ->
- ct_property_test:init_per_suite(Config).
+ ?CHECK_CRYPTO(
+ ct_property_test:init_per_suite(Config)
+ ).
-end_per_suite(Config) ->
- Config.
+end_per_suite(_Config) ->
+ ok.
%%% One group in this suite happens to support only QuickCheck, so skip it
%%% if we run proper.
diff --git a/lib/ssh/test/ssh_sftpd_SUITE.erl b/lib/ssh/test/ssh_sftpd_SUITE.erl
index 5fc948fbed..a9e12fddca 100644
--- a/lib/ssh/test/ssh_sftpd_SUITE.erl
+++ b/lib/ssh/test/ssh_sftpd_SUITE.erl
@@ -32,8 +32,8 @@
-define(USER, "Alladin").
-define(PASSWD, "Sesame").
--define(XFER_PACKET_SIZE, 32768).
--define(XFER_WINDOW_SIZE, 4*?XFER_PACKET_SIZE).
+%% -define(XFER_PACKET_SIZE, 32768).
+%% -define(XFER_WINDOW_SIZE, 4*?XFER_PACKET_SIZE).
-define(SSH_TIMEOUT, 10000).
-define(REG_ATTERS, <<0,0,0,0,1>>).
-define(UNIX_EPOCH, 62167219200).
@@ -841,7 +841,7 @@ reply(Cm, Channel, RBuf) ->
{ssh_cm, Cm, Msg} ->
ct:fail(Msg)
after
- 30000 -> ct:fail("timeout ~p:~p",[?MODULE,?LINE])
+ 90000 -> ct:fail("timeout ~p:~p",[?MODULE,?LINE])
end.
open_file(File, Cm, Channel, ReqId, Access, Flags) ->
diff --git a/lib/ssh/test/ssh_test_lib.erl b/lib/ssh/test/ssh_test_lib.erl
index 1129303414..036820fa8d 100644
--- a/lib/ssh/test/ssh_test_lib.erl
+++ b/lib/ssh/test/ssh_test_lib.erl
@@ -163,7 +163,7 @@ std_simple_exec(Host, Port, Config, Opts) ->
ct:log("~p:~p exec ~p",[?MODULE,?LINE,ExecResult]),
case ExecResult of
success ->
- Expected = {ssh_cm, ConnectionRef, {data,ChannelId,0,<<"42\n">>}},
+ Expected = {ssh_cm, ConnectionRef, {data,ChannelId,0,<<"42">>}},
case receive_exec_result(Expected) of
expected ->
ok;
@@ -290,23 +290,39 @@ rcv_lingering(Timeout) ->
end.
-receive_exec_result(Msg) ->
- ct:log("Expect data! ~p", [Msg]),
+receive_exec_result([]) ->
+ expected;
+receive_exec_result(Msgs) when is_list(Msgs) ->
+ ct:log("Expect data! ~p", [Msgs]),
receive
- {ssh_cm,_,{data,_,1, Data}} ->
- ct:log("StdErr: ~p~n", [Data]),
- receive_exec_result(Msg);
- Msg ->
- ct:log("1: Collected data ~p", [Msg]),
- expected;
- Other ->
- ct:log("Other ~p", [Other]),
- {unexpected_msg, Other}
+ Msg ->
+ case lists:member(Msg, Msgs) of
+ true ->
+ ct:log("Collected data ~p", [Msg]),
+ receive_exec_result(Msgs--[Msg]);
+ false ->
+ case Msg of
+ {ssh_cm,_,{data,_,1, Data}} ->
+ ct:log("StdErr: ~p~n", [Data]),
+ receive_exec_result(Msgs);
+ Other ->
+ ct:log("Other ~p", [Other]),
+ {unexpected_msg, Other}
+ end
+ end
after
30000 -> ct:fail("timeout ~p:~p",[?MODULE,?LINE])
- end.
+ end;
+receive_exec_result(Msg) ->
+ receive_exec_result([Msg]).
+receive_exec_result_or_fail(Msg) ->
+ case receive_exec_result(Msg) of
+ expected -> expected;
+ Other -> ct:fail(Other)
+ end.
+
receive_exec_end(ConnectionRef, ChannelId) ->
Eof = {ssh_cm, ConnectionRef, {eof, ChannelId}},
ExitStatus = {ssh_cm, ConnectionRef, {exit_status, ChannelId, 0}},
@@ -435,25 +451,37 @@ clean_rsa(UserDir) ->
file:delete(filename:join(UserDir,"known_hosts")),
file:delete(filename:join(UserDir,"authorized_keys")).
-setup_dsa_pass_pharse(DataDir, UserDir, Phrase) ->
- {ok, KeyBin} = file:read_file(filename:join(DataDir, "id_dsa")),
- setup_pass_pharse(KeyBin, filename:join(UserDir, "id_dsa"), Phrase),
- System = filename:join(UserDir, "system"),
- file:make_dir(System),
- file:copy(filename:join(DataDir, "ssh_host_dsa_key"), filename:join(System, "ssh_host_dsa_key")),
- file:copy(filename:join(DataDir, "ssh_host_dsa_key.pub"), filename:join(System, "ssh_host_dsa_key.pub")),
- setup_dsa_known_host(DataDir, UserDir),
- setup_dsa_auth_keys(DataDir, UserDir).
+setup_dsa_pass_phrase(DataDir, UserDir, Phrase) ->
+ try
+ {ok, KeyBin} = file:read_file(filename:join(DataDir, "id_dsa")),
+ setup_pass_phrase(KeyBin, filename:join(UserDir, "id_dsa"), Phrase),
+ System = filename:join(UserDir, "system"),
+ file:make_dir(System),
+ file:copy(filename:join(DataDir, "ssh_host_dsa_key"), filename:join(System, "ssh_host_dsa_key")),
+ file:copy(filename:join(DataDir, "ssh_host_dsa_key.pub"), filename:join(System, "ssh_host_dsa_key.pub")),
+ setup_dsa_known_host(DataDir, UserDir),
+ setup_dsa_auth_keys(DataDir, UserDir)
+ of
+ _ -> true
+ catch
+ _:_ -> false
+ end.
-setup_rsa_pass_pharse(DataDir, UserDir, Phrase) ->
- {ok, KeyBin} = file:read_file(filename:join(DataDir, "id_rsa")),
- setup_pass_pharse(KeyBin, filename:join(UserDir, "id_rsa"), Phrase),
- System = filename:join(UserDir, "system"),
- file:make_dir(System),
- file:copy(filename:join(DataDir, "ssh_host_rsa_key"), filename:join(System, "ssh_host_rsa_key")),
- file:copy(filename:join(DataDir, "ssh_host_rsa_key.pub"), filename:join(System, "ssh_host_rsa_key.pub")),
- setup_rsa_known_host(DataDir, UserDir),
- setup_rsa_auth_keys(DataDir, UserDir).
+setup_rsa_pass_phrase(DataDir, UserDir, Phrase) ->
+ try
+ {ok, KeyBin} = file:read_file(filename:join(DataDir, "id_rsa")),
+ setup_pass_phrase(KeyBin, filename:join(UserDir, "id_rsa"), Phrase),
+ System = filename:join(UserDir, "system"),
+ file:make_dir(System),
+ file:copy(filename:join(DataDir, "ssh_host_rsa_key"), filename:join(System, "ssh_host_rsa_key")),
+ file:copy(filename:join(DataDir, "ssh_host_rsa_key.pub"), filename:join(System, "ssh_host_rsa_key.pub")),
+ setup_rsa_known_host(DataDir, UserDir),
+ setup_rsa_auth_keys(DataDir, UserDir)
+ of
+ _ -> true
+ catch
+ _:_ -> false
+ end.
setup_ecdsa_pass_phrase(Size, DataDir, UserDir, Phrase) ->
try
@@ -465,7 +493,7 @@ setup_ecdsa_pass_phrase(Size, DataDir, UserDir, Phrase) ->
Other ->
Other
end,
- setup_pass_pharse(KeyBin, filename:join(UserDir, "id_ecdsa"), Phrase),
+ setup_pass_phrase(KeyBin, filename:join(UserDir, "id_ecdsa"), Phrase),
System = filename:join(UserDir, "system"),
file:make_dir(System),
file:copy(filename:join(DataDir, "ssh_host_ecdsa_key"++Size), filename:join(System, "ssh_host_ecdsa_key")),
@@ -478,7 +506,7 @@ setup_ecdsa_pass_phrase(Size, DataDir, UserDir, Phrase) ->
_:_ -> false
end.
-setup_pass_pharse(KeyBin, OutFile, Phrase) ->
+setup_pass_phrase(KeyBin, OutFile, Phrase) ->
[{KeyType, _,_} = Entry0] = public_key:pem_decode(KeyBin),
Key = public_key:pem_entry_decode(Entry0),
Salt = crypto:strong_rand_bytes(8),
@@ -1054,3 +1082,45 @@ ntoa(A) ->
_:_ when is_list(A) -> A
end.
+%%%----------------------------------------------------------------
+try_enable_fips_mode() ->
+ case crypto:info_fips() of
+ enabled ->
+ report("FIPS mode already enabled", ?LINE),
+ ok;
+ not_enabled ->
+ %% Erlang/crypto configured with --enable-fips
+ case crypto:enable_fips_mode(true) of
+ true ->
+ %% and also the cryptolib is fips enabled
+ report("FIPS mode enabled", ?LINE),
+ enabled = crypto:info_fips(),
+ ok;
+ false ->
+ case is_cryptolib_fips_capable() of
+ false ->
+ report("No FIPS mode in cryptolib", ?LINE),
+ {skip, "FIPS mode not supported in cryptolib"};
+ true ->
+ ct:fail("Failed to enable FIPS mode", [])
+ end
+ end;
+ not_supported ->
+ report("FIPS mode not supported by Erlang/OTP", ?LINE),
+ {skip, "FIPS mode not supported"}
+ end.
+
+is_cryptolib_fips_capable() ->
+ [{_,_,Inf}] = crypto:info_lib(),
+ nomatch =/= re:run(Inf, "(F|f)(I|i)(P|p)(S|s)").
+
+report(Comment, Line) ->
+ ct:comment(Comment),
+ ct:log("~p:~p try_enable_fips_mode~n"
+ "crypto:info_lib() = ~p~n"
+ "crypto:info_fips() = ~p~n"
+ "crypto:supports() =~n~p~n",
+ [?MODULE, Line,
+ crypto:info_lib(),
+ crypto:info_fips(),
+ crypto:supports()]).
diff --git a/lib/ssh/test/ssh_test_lib.hrl b/lib/ssh/test/ssh_test_lib.hrl
index 4b6579bd71..b9af2ecb5d 100644
--- a/lib/ssh/test/ssh_test_lib.hrl
+++ b/lib/ssh/test/ssh_test_lib.hrl
@@ -6,10 +6,16 @@
%%-------------------------------------------------------------------------
%% Check for usable crypt
%%-------------------------------------------------------------------------
--define(CHECK_CRYPTO(Available),
- try crypto:start()
- of _ -> Available
- catch _:_ -> {skip, "Can't start crypto"}
+-define(CHECK_CRYPTO(UsersInitCode),
+ try
+ crypto:start(),
+ ssh_test_lib:try_enable_fips_mode()
+ of
+ ok -> UsersInitCode;
+ {skip,_} -> UsersInitCode;
+ Other -> Other
+ catch
+ _:_ -> {skip, "Can't start crypto"}
end
).
diff --git a/lib/ssh/test/ssh_to_openssh_SUITE.erl b/lib/ssh/test/ssh_to_openssh_SUITE.erl
index 334281f53b..cf64ac8dab 100644
--- a/lib/ssh/test/ssh_to_openssh_SUITE.erl
+++ b/lib/ssh/test/ssh_to_openssh_SUITE.erl
@@ -50,7 +50,9 @@ all() ->
groups() ->
[{erlang_client, [], [erlang_shell_client_openssh_server
]},
- {erlang_server, [], [erlang_server_openssh_client_renegotiate
+ {erlang_server, [], [erlang_server_openssh_client_renegotiate,
+ exec_with_io_in_sshc,
+ exec_direct_with_io_in_sshc
]}
].
@@ -113,14 +115,66 @@ erlang_shell_client_openssh_server() ->
erlang_shell_client_openssh_server(Config) when is_list(Config) ->
process_flag(trap_exit, true),
IO = ssh_test_lib:start_io_server(),
+ Prev = lists:usort(supervisor:which_children(sshc_sup)),
Shell = ssh_test_lib:start_shell(?SSH_DEFAULT_PORT, IO),
IO ! {input, self(), "echo Hej\n"},
receive_data("Hej", undefined),
IO ! {input, self(), "exit\n"},
receive_logout(),
- receive_normal_exit(Shell).
+ receive_normal_exit(Shell),
+ %% Check that the connection is closed:
+ ct:log("Expects ~p", [Prev]),
+ ?wait_match(Prev, lists:usort(supervisor:which_children(sshc_sup))).
%%--------------------------------------------------------------------
+%% Test that the server could redirect stdin and stdout from/to an
+%% OpensSSH client when handling an exec request
+exec_with_io_in_sshc(Config) when is_list(Config) ->
+ SystemDir = proplists:get_value(data_dir, Config),
+ {Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SystemDir},
+ {failfun, fun ssh_test_lib:failfun/2}]),
+ ct:sleep(500),
+
+ ExecStr = "\"io:read('% ').\"",
+ Cmd = "echo howdy. | " ++ ssh_test_lib:open_sshc_cmd(Host, Port,
+ "-x", % Disable X forwarding
+ ExecStr),
+ ct:pal("Cmd = ~p~n",[Cmd]),
+ case os:cmd(Cmd) of
+ "% {ok,howdy}" -> ok;
+ "{ok,howdy}% " -> ok; % Could happen if the client sends the piped
+ % input before receiving the prompt ("% ").
+ Other -> ct:fail("Received ~p",[Other])
+ end,
+ ssh:stop_daemon(Pid).
+
+%%--------------------------------------------------------------------
+%% Test that the server could redirect stdin and stdout from/to an
+%% OpensSSH client when handling an direct exec request
+exec_direct_with_io_in_sshc(Config) when is_list(Config) ->
+ SystemDir = proplists:get_value(data_dir, Config),
+ {Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SystemDir},
+ {failfun, fun ssh_test_lib:failfun/2},
+ {exec,{direct,fun(Cmnd) ->
+ {ok,X} = io:read(Cmnd),
+ {ok,{X,lists:reverse(atom_to_list(X))}}
+ end}}
+ ]),
+ ct:sleep(500),
+
+ Cmd = "echo ciao. | " ++ ssh_test_lib:open_sshc_cmd(Host, Port,
+ "-x", % Disable X forwarding
+ "'? '"),
+ ct:pal("Cmd = ~p~n",[Cmd]),
+ case os:cmd(Cmd) of
+ "? {ciao,\"oaic\"}" -> ok;
+ "{ciao,\"oaic\"}? " -> ok; % Could happen if the client sends the piped
+ % input before receiving the prompt ("? ").
+ Other -> ct:fail("Received ~p",[Other])
+ end,
+ ssh:stop_daemon(Pid).
+
+%%--------------------------------------------------------------------
%% Test that the Erlang/OTP server can renegotiate with openSSH
erlang_server_openssh_client_renegotiate(Config) ->
_PubKeyAlg = ssh_rsa,
diff --git a/lib/ssl/doc/src/ssl.xml b/lib/ssl/doc/src/ssl.xml
index 05590666da..0ad2d8da0b 100644
--- a/lib/ssl/doc/src/ssl.xml
+++ b/lib/ssl/doc/src/ssl.xml
@@ -655,16 +655,18 @@ fun(srp, Username :: string(), UserState :: term()) ->
<datatype>
<name name="log_alert"/>
- <desc><p>If set to <c>false</c>, error reports are not displayed.
+ <desc><p>If set to <c>false</c>, TLS/DTLS Alert reports are not displayed.
Deprecated in OTP 22, use {log_level, <seealso marker="#type-logging_level">logging_level()</seealso>} instead.</p>
</desc>
</datatype>
<datatype>
<name name="logging_level"/>
- <desc><p>Specifies the log level for TLS/DTLS. At verbosity level <c>notice</c> and above error reports are
- displayed in TLS/DTLS. The level <c>debug</c> triggers verbose logging of TLS/DTLS protocol
- messages.</p>
+ <desc><p>Specifies the log level for a TLS/DTLS
+ connection. Alerts are logged on <c>notice</c> level, which is
+ the default level. The level <c>debug</c> triggers verbose
+ logging of TLS/DTLS protocol messages. See also <seealso marker="ssl_app">ssl(6)</seealso>
+ </p>
</desc>
</datatype>
diff --git a/lib/ssl/doc/src/ssl_app.xml b/lib/ssl/doc/src/ssl_app.xml
index b05caf44ea..129fc57862 100644
--- a/lib/ssl/doc/src/ssl_app.xml
+++ b/lib/ssl/doc/src/ssl_app.xml
@@ -67,14 +67,14 @@
<tag><c>protocol_version = </c><seealso marker="ssl#type-protocol">ssl:ssl_tls_protocol()</seealso><c><![CDATA[<optional>]]></c></tag>
<item><p>Protocol supported by started clients and
servers. If this option is not set, it defaults to all
- TLS protocols currently supported by the SSL application.
+ TLS protocols currently supported, more might be configurable, by the SSL application.
This option can be overridden by the version option
to <c>ssl:connect/[2,3]</c> and <c>ssl:listen/2</c>.</p></item>
<tag><c>dtls_protocol_version = </c><seealso marker="ssl#type-protocol">ssl:dtls_protocol()</seealso><c><![CDATA[<optional>]]></c></tag>
<item><p>Protocol supported by started clients and
servers. If this option is not set, it defaults to all
- DTLS protocols currently supported by the SSL application.
+ DTLS protocols currently supported, more might be configurable, by the SSL application.
This option can be overridden by the version option
to <c>ssl:connect/[2,3]</c> and <c>ssl:listen/2</c>.</p></item>
@@ -155,10 +155,17 @@
<section>
<title>ERROR LOGGER AND EVENT HANDLERS</title>
- <p>The SSL application uses the default <seealso
- marker="kernel:error_logger">OTP error logger</seealso> to log
- unexpected errors and TLS/DTLS alerts. The logging of TLS/DTLS alerts may be
- turned off with the <c>log_alert</c> option. </p>
+
+ <p>The SSL application uses <seealso
+ marker="kernel:logger">OTP logger</seealso>.
+ TLS/DTLS alerts are logged on notice level. Unexpected
+ errors are logged on error level. These log entries
+ will by default end up in the default Erlang log.
+ The option <c>log_level</c> may be used to in run-time to set
+ the log level of a specific TLS connection, which is
+ handy when you want to use level debug to inspect the
+ TLS handshake setup.
+ </p>
</section>
<section>
diff --git a/lib/ssl/doc/src/ssl_crl_cache_api.xml b/lib/ssl/doc/src/ssl_crl_cache_api.xml
index 4cba4e1de1..9922cfb0e9 100644
--- a/lib/ssl/doc/src/ssl_crl_cache_api.xml
+++ b/lib/ssl/doc/src/ssl_crl_cache_api.xml
@@ -56,19 +56,29 @@
</desc>
</datatype>
-
<datatype>
<name name="dist_point"/>
<desc>
<p>For description see <seealso
marker="public_key:public_key_records"> X509 certificates records</seealso></p>
</desc>
- </datatype>
+ </datatype>
+
+ <datatype>
+ <name name="logger_info"/>
+ <desc>
+ <p>Information for ssl applications use of <seealso
+ marker="kernel:logger"> Logger(3)</seealso></p>
+ </desc>
+ </datatype>
+
+
</datatypes>
<funcs>
- <func>
- <name since="OTP 18.0">fresh_crl(DistributionPoint, CRL) -> FreshCRL</name>
+ <func>
+ <name since="@maint@">fresh_crl(DistributionPoint, CRL) -> FreshCRL </name>
+ <name since="OTP 18.0">fresh_crl(DistributionPoint, CRL) -> FreshCRL | {LoggerInfo, FreshCRL}</name>
<fsummary> <c>fun fresh_crl/2 </c> will be used as input option <c>update_crl</c> to
public_key:pkix_crls_validate/3 </fsummary>
<type>
@@ -77,14 +87,21 @@
marker="public_key:public_key#type-der_encoded">public_key:der_encoded()</seealso>] </v>
<v> FreshCRL = [<seealso
marker="public_key:public_key#type-der_encoded">public_key:der_encoded()</seealso>] </v>
+ <v> LoggerInfo = {logger, <seealso marker="#type-logger_info"> logger_info() </seealso>}} </v>
</type>
<desc>
<p> <c>fun fresh_crl/2 </c> will be used as input option <c>update_crl</c> to
<seealso marker="public_key:public_key#pkix_crls_validate-3">public_key:pkix_crls_validate/3 </seealso> </p>
+
+ <p>It is possible to return logger info that will be used by the TLS connection
+ to produce log events.
+ </p>
</desc>
</func>
<func>
+ <name since="@maint@">lookup(DistributionPoint, Issuer, DbHandle) -> not_available | CRLs |
+ {LoggerInfo, CRLs} </name>
<name since="OTP 19.0">lookup(DistributionPoint, Issuer, DbHandle) -> not_available | CRLs </name>
<name since="OTP 18.0">lookup(DistributionPoint, DbHandle) -> not_available | CRLs </name>
<fsummary> </fsummary>
@@ -94,7 +111,8 @@
marker="public_key:public_key#type-issuer_name">public_key:issuer_name()</seealso> </v>
<v> DbHandle = <seealso marker="#type-crl_cache_ref"> crl_cache_ref() </seealso></v>
<v> CRLs = [<seealso
- marker="public_key:public_key#type-der_encoded">public_key:der_encoded()</seealso>] </v>
+ marker="public_key:public_key#type-der_encoded">public_key:der_encoded()</seealso>]</v>
+ <v> LoggerInfo = {logger, <seealso marker="#type-logger_info"> logger_info() </seealso>}} </v>
</type>
<desc> <p>Lookup the CRLs belonging to the distribution point <c> Distributionpoint</c>.
This function may choose to only look in the cache or to follow distribution point
@@ -111,19 +129,35 @@
compatibility, this is still supported: if there is no
<c>lookup/3</c> function in the callback module,
<c>lookup/2</c> is called instead.</p>
+
+ <p>It is possible to return logger info that will be used by the TLS connection
+ to produce log events.
+ </p>
</desc>
</func>
<func>
+ <name since="@maint@">select(Issuer, DbHandle) -> CRLs | {LoggerInfo, CRLs} </name>
<name since="OTP 18.0">select(Issuer, DbHandle) -> CRLs </name>
<fsummary>Select the CRLs in the cache that are issued by <c>Issuer</c></fsummary>
<type>
<v> Issuer = <seealso
- marker="public_key:public_key#type-issuer_name">public_key:issuer_name()</seealso></v>
+ marker="public_key:public_key#type-issuer_name">public_key:issuer_name()</seealso> | list() </v>
<v> DbHandle = <seealso marker="#type-crl_cache_ref"> cache_ref() </seealso></v>
- </type>
+ <v> LoggerInfo = {logger, <seealso marker="#type-logger_info"> logger_info() </seealso>} </v>
+ </type>
<desc>
- <p>Select the CRLs in the cache that are issued by <c>Issuer</c> </p>
+ <p>Select the CRLs in the cache that are issued by <c>Issuer</c> unless
+ the value is a list of so called general names, see <seealso
+ marker="public_key:public_key_records"> X509 certificates records</seealso>,
+ originating form <c>#'DistributionPoint'.cRLissuer</c> and
+ representing different mechanism to obtain the CRLs. The cache
+ callback needs to use the appropriate entry to retrive the CRLs or
+ return an empty list if it does not exist.
+ </p>
+
+ <p>It is possible to return logger info that will be used by the TLS connection
+ to produce log events.</p>
</desc>
</func>
</funcs>
diff --git a/lib/ssl/src/Makefile b/lib/ssl/src/Makefile
index 8dc76f2638..e961f05b37 100644
--- a/lib/ssl/src/Makefile
+++ b/lib/ssl/src/Makefile
@@ -50,6 +50,7 @@ MODULES= \
dtls_listener_sup \
dtls_packet_demux \
dtls_record \
+ dtls_sup \
dtls_socket \
dtls_v1 \
inet_tls_dist \
@@ -83,6 +84,7 @@ MODULES= \
ssl_srp_primes \
ssl_sup \
ssl_v3 \
+ tls_bloom_filter \
tls_connection \
tls_connection_sup \
tls_connection_1_3 \
@@ -90,8 +92,13 @@ MODULES= \
tls_handshake_1_3 \
tls_record \
tls_record_1_3 \
+ tls_client_ticket_store \
tls_sender \
+ tls_server_session_ticket\
+ tls_server_session_ticket_sup\
+ tls_server_sup\
tls_socket \
+ tls_sup \
tls_v1
diff --git a/lib/ssl/src/dtls_connection.erl b/lib/ssl/src/dtls_connection.erl
index f8fd42e36d..a658fe0306 100644
--- a/lib/ssl/src/dtls_connection.erl
+++ b/lib/ssl/src/dtls_connection.erl
@@ -441,19 +441,19 @@ init({call, From}, {start, Timeout},
handshake_env = #handshake_env{renegotiation = {Renegotiation, _}},
connection_env = CEnv,
ssl_options = #{versions := Versions} = SslOpts,
- session = #session{own_certificate = Cert} = Session0,
+ session = #session{own_certificate = Cert} = NewSession,
connection_states = ConnectionStates0
} = State0) ->
+ Session = ssl_session:client_select_session({Host, Port, SslOpts}, Cache, CacheCb, NewSession),
Hello = dtls_handshake:client_hello(Host, Port, ConnectionStates0, SslOpts,
- Cache, CacheCb, Renegotiation, Cert),
+ Session#session.session_id, Renegotiation, Cert),
Version = Hello#client_hello.client_version,
HelloVersion = dtls_record:hello_version(Version, Versions),
State1 = prepare_flight(State0#state{connection_env = CEnv#connection_env{negotiated_version = Version}}),
{State2, Actions} = send_handshake(Hello, State1#state{connection_env = CEnv#connection_env{negotiated_version = HelloVersion}}),
State = State2#state{connection_env = CEnv#connection_env{negotiated_version = Version}, %% RequestedVersion
- session =
- Session0#session{session_id = Hello#client_hello.session_id},
+ session = Session,
start_or_recv_from = From},
next_event(hello, no_record, State, [{{timeout, handshake}, Timeout, close} | Actions]);
init({call, _} = Type, Event, #state{static_env = #static_env{role = server},
@@ -521,30 +521,24 @@ hello(internal, #client_hello{cookie = <<>>,
Actions);
hello(internal, #hello_verify_request{cookie = Cookie}, #state{static_env = #static_env{role = client,
host = Host,
- port = Port,
- session_cache = Cache,
- session_cache_cb = CacheCb},
+ port = Port},
handshake_env = #handshake_env{renegotiation = {Renegotiation, _}} = HsEnv,
connection_env = CEnv,
ssl_options = SslOpts,
- session = #session{own_certificate = OwnCert}
- = Session0,
+ session = #session{own_certificate = Cert, session_id = Id},
connection_states = ConnectionStates0
} = State0) ->
Hello = dtls_handshake:client_hello(Host, Port, Cookie, ConnectionStates0,
- SslOpts,
- Cache, CacheCb, Renegotiation, OwnCert),
+ SslOpts, Id, Renegotiation, Cert),
Version = Hello#client_hello.client_version,
State1 = prepare_flight(State0#state{handshake_env =
HsEnv#handshake_env{tls_handshake_history
= ssl_handshake:init_handshake_history()}}),
{State2, Actions} = send_handshake(Hello, State1),
- State = State2#state{connection_env = CEnv#connection_env{negotiated_version = Version}, %% Requested version
- session =
- Session0#session{session_id =
- Hello#client_hello.session_id}},
+ State = State2#state{connection_env = CEnv#connection_env{negotiated_version = Version} % RequestedVersion
+ },
next_event(?FUNCTION_NAME, no_record, State, Actions);
hello(internal, #client_hello{extensions = Extensions} = Hello,
#state{ssl_options = #{handshake := hello},
@@ -702,7 +696,7 @@ connection(internal, #hello_request{}, #state{static_env = #static_env{host = Ho
session_cache = Cache,
session_cache_cb = CacheCb
},
- handshake_env = #handshake_env{ renegotiation = {Renegotiation, _}},
+ handshake_env = #handshake_env{renegotiation = {Renegotiation, _}},
connection_env = CEnv,
session = #session{own_certificate = Cert} = Session0,
ssl_options = #{versions := Versions} = SslOpts,
@@ -710,15 +704,15 @@ connection(internal, #hello_request{}, #state{static_env = #static_env{host = Ho
protocol_specific = PS
} = State0) ->
+ Session = ssl_session:client_select_session({Host, Port, SslOpts}, Cache, CacheCb, Session0),
Hello = dtls_handshake:client_hello(Host, Port, ConnectionStates0, SslOpts,
- Cache, CacheCb, Renegotiation, Cert),
+ Session#session.session_id, Renegotiation, Cert),
Version = Hello#client_hello.client_version,
HelloVersion = dtls_record:hello_version(Version, Versions),
State1 = prepare_flight(State0),
{State2, Actions} = send_handshake(Hello, State1#state{connection_env = CEnv#connection_env{negotiated_version = HelloVersion}}),
State = State2#state{protocol_specific = PS#{flight_state => initial_flight_state(DataTag)},
- session = Session0#session{session_id
- = Hello#client_hello.session_id}},
+ session = Session},
next_event(hello, no_record, State, Actions);
connection(internal, #client_hello{} = Hello, #state{static_env = #static_env{role = server},
handshake_env = #handshake_env{allow_renegotiate = true} = HsEnv} = State) ->
@@ -1209,12 +1203,13 @@ is_ignore_alert(#alert{description = ?ILLEGAL_PARAMETER}) ->
is_ignore_alert(_) ->
false.
-log_ignore_alert(debug, StateName, Alert, Role) ->
- Txt = ssl_alert:alert_txt(Alert),
- ?LOG_ERROR("DTLS over UDP ~p: In state ~p ignored to send ALERT ~s as DoS-attack mitigation \n",
- [Role, StateName, Txt]);
-log_ignore_alert(_, _, _, _) ->
- ok.
+log_ignore_alert(Level, StateName, #alert{where = Location} = Alert, Role) ->
+ ssl_logger:log(info,
+ Level, #{alert => Alert,
+ alerter => ignored,
+ statename => StateName,
+ role => Role,
+ protocol => protocol_name()}, Location).
send_application_data(Data, From, _StateName,
#state{static_env = #static_env{socket = Socket,
diff --git a/lib/ssl/src/dtls_handshake.erl b/lib/ssl/src/dtls_handshake.erl
index b2a5fcfa66..cad31b23ee 100644
--- a/lib/ssl/src/dtls_handshake.erl
+++ b/lib/ssl/src/dtls_handshake.erl
@@ -30,7 +30,7 @@
-include("ssl_alert.hrl").
%% Handshake handling
--export([client_hello/8, client_hello/9, cookie/4, hello/4,
+-export([client_hello/7, client_hello/8, cookie/4, hello/4,
hello_verify_request/2]).
%% Handshake encoding
@@ -47,29 +47,29 @@
%%====================================================================
%%--------------------------------------------------------------------
-spec client_hello(ssl:host(), inet:port_number(), ssl_record:connection_states(),
- ssl_options(), integer(), atom(), boolean(), der_cert()) ->
+ ssl_options(), binary(), boolean(), der_cert()) ->
#client_hello{}.
%%
%% Description: Creates a client hello message.
%%--------------------------------------------------------------------
client_hello(Host, Port, ConnectionStates, SslOpts,
- Cache, CacheCb, Renegotiation, OwnCert) ->
+ Id, Renegotiation, OwnCert) ->
%% First client hello (two sent in DTLS ) uses empty Cookie
client_hello(Host, Port, <<>>, ConnectionStates, SslOpts,
- Cache, CacheCb, Renegotiation, OwnCert).
+ Id, Renegotiation, OwnCert).
%%--------------------------------------------------------------------
-spec client_hello(ssl:host(), inet:port_number(), term(), ssl_record:connection_states(),
- ssl_options(), integer(), atom(), boolean(), der_cert()) ->
+ ssl_options(), binary(),boolean(), der_cert()) ->
#client_hello{}.
%%
%% Description: Creates a client hello message.
%%--------------------------------------------------------------------
-client_hello(Host, Port, Cookie, ConnectionStates,
+client_hello(_Host, _Port, Cookie, ConnectionStates,
#{versions := Versions,
ciphers := UserSuites,
fallback := Fallback} = SslOpts,
- Cache, CacheCb, Renegotiation, OwnCert) ->
+ Id, Renegotiation, _OwnCert) ->
Version = dtls_record:highest_protocol_version(Versions),
Pending = ssl_record:pending_connection_state(ConnectionStates, read),
SecParams = maps:get(security_parameters, Pending),
@@ -78,8 +78,8 @@ client_hello(Host, Port, Cookie, ConnectionStates,
Extensions = ssl_handshake:client_hello_extensions(TLSVersion, CipherSuites,
SslOpts, ConnectionStates,
- Renegotiation, undefined),
- Id = ssl_session:client_id({Host, Port, SslOpts}, Cache, CacheCb, OwnCert),
+ Renegotiation, undefined,
+ undefined),
#client_hello{session_id = Id,
client_version = Version,
diff --git a/lib/ssl/src/dtls_listener_sup.erl b/lib/ssl/src/dtls_listener_sup.erl
index dc30696a2c..2c43c215be 100644
--- a/lib/ssl/src/dtls_listener_sup.erl
+++ b/lib/ssl/src/dtls_listener_sup.erl
@@ -29,7 +29,9 @@
%% API
-export([start_link/0]).
--export([start_child/1]).
+-export([start_child/1,
+ lookup_listner/1,
+ register_listner/2]).
%% Supervisor callback
-export([init/1]).
@@ -43,10 +45,37 @@ start_link() ->
start_child(Args) ->
supervisor:start_child(?MODULE, Args).
+lookup_listner(0) ->
+ undefined;
+lookup_listner(Port) ->
+ try ets:lookup(dtls_listener_sup, Port) of
+ [{Port, {Owner, Handler}}] ->
+ case erlang:is_process_alive(Handler) of
+ true ->
+ case erlang:is_process_alive(Owner) of
+ true ->
+ {error, already_listening};
+ false ->
+ {ok, Handler}
+ end;
+ false ->
+ ets:delete(dtls_listener_sup, Port),
+ undefined
+ end;
+ [] ->
+ undefined
+ catch _:_ ->
+ undefined
+ end.
+
+register_listner(OwnerAndListner, Port) ->
+ ets:insert(dtls_listener_sup, {Port, OwnerAndListner}).
+
%%%=========================================================================
%%% Supervisor callback
%%%=========================================================================
init(_O) ->
+ ets:new(dtls_listener_sup, [named_table, public]),
RestartStrategy = simple_one_for_one,
MaxR = 0,
MaxT = 3600,
diff --git a/lib/ssl/src/dtls_packet_demux.erl b/lib/ssl/src/dtls_packet_demux.erl
index 94b350eaa5..d3cbc364bf 100644
--- a/lib/ssl/src/dtls_packet_demux.erl
+++ b/lib/ssl/src/dtls_packet_demux.erl
@@ -28,7 +28,7 @@
%% API
-export([start_link/5, active_once/3, accept/2, sockname/1, close/1,
- get_all_opts/1, get_sock_opts/2, set_sock_opts/2]).
+ get_all_opts/1, set_all_opts/2, get_sock_opts/2, set_sock_opts/2]).
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
@@ -72,6 +72,8 @@ get_all_opts(PacketSocket) ->
call(PacketSocket, get_all_opts).
set_sock_opts(PacketSocket, Opts) ->
call(PacketSocket, {set_sock_opts, Opts}).
+set_all_opts(PacketSocket, Opts) ->
+ call(PacketSocket, {set_all_opts, Opts}).
%%%===================================================================
%%% gen_server callbacks
@@ -141,7 +143,10 @@ handle_call(get_all_opts, _, #state{dtls_options = DTLSOptions,
handle_call({set_sock_opts, {SocketOpts, NewEmOpts}}, _, #state{listener = Socket, emulated_options = EmOpts0} = State) ->
set_socket_opts(Socket, SocketOpts),
EmOpts = do_set_emulated_opts(NewEmOpts, EmOpts0),
- {reply, ok, State#state{emulated_options = EmOpts}}.
+ {reply, ok, State#state{emulated_options = EmOpts}};
+handle_call({set_all_opts, {SocketOpts, NewEmOpts, SslOpts}}, _, #state{listener = Socket} = State) ->
+ set_socket_opts(Socket, SocketOpts),
+ {reply, ok, State#state{emulated_options = NewEmOpts, dtls_options = SslOpts}}.
handle_cast({active_once, Client, Pid}, State0) ->
State = handle_active_once(Client, Pid, State0),
diff --git a/lib/ssl/src/dtls_socket.erl b/lib/ssl/src/dtls_socket.erl
index b305d08f70..f7b1968064 100644
--- a/lib/ssl/src/dtls_socket.erl
+++ b/lib/ssl/src/dtls_socket.erl
@@ -31,23 +31,34 @@ send(Transport, {{IP,Port},Socket}, Data) ->
listen(Port, #config{transport_info = TransportInfo,
ssl = SslOpts,
- emulated = EmOpts,
+ emulated = EmOpts0,
inet_user = Options} = Config) ->
-
- case dtls_listener_sup:start_child([Port, TransportInfo, emulated_socket_options(EmOpts, #socket_options{}),
- Options ++ internal_inet_values(), SslOpts]) of
- {ok, Pid} ->
- Socket = #sslsocket{pid = {dtls, Config#config{dtls_handler = {Pid, Port}}}},
- check_active_n(EmOpts, Socket),
+ Result = case dtls_listener_sup:lookup_listner(Port) of
+ undefined ->
+ Result0 = {ok, Listner0} = dtls_listener_sup:start_child([Port, TransportInfo, emulated_socket_options(EmOpts0, #socket_options{}),
+ Options ++ internal_inet_values(), SslOpts]),
+ dtls_listener_sup:register_listner({self(), Listner0}, Port),
+ Result0;
+ {ok, Listner0} = Result0 ->
+ dtls_packet_demux:set_all_opts(Listner0, {Options, emulated_socket_options(EmOpts0, #socket_options{}), SslOpts}),
+ dtls_listener_sup:register_listner({self(), Listner0}, Port),
+ Result0;
+ Result0 ->
+ Result0
+ end,
+ case Result of
+ {ok, Listner} ->
+ Socket = #sslsocket{pid = {dtls, Config#config{dtls_handler = {Listner, Port}}}},
+ check_active_n(EmOpts0, Socket),
{ok, Socket};
- Err = {error, _} ->
- Err
+ Err ->
+ Err
end.
accept(dtls, #config{transport_info = {Transport,_,_,_,_},
- connection_cb = ConnectionCb,
- dtls_handler = {Listner, _}}, _Timeout) ->
+ connection_cb = ConnectionCb,
+ dtls_handler = {Listner, _}}, _Timeout) ->
case dtls_packet_demux:accept(Listner, self()) of
{ok, Pid, Socket} ->
{ok, socket([Pid], Transport, {Listner, Socket}, ConnectionCb)};
diff --git a/lib/ssl/src/dtls_sup.erl b/lib/ssl/src/dtls_sup.erl
new file mode 100644
index 0000000000..2e72c10ba0
--- /dev/null
+++ b/lib/ssl/src/dtls_sup.erl
@@ -0,0 +1,76 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2019-2019. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+%%
+
+-module(dtls_sup).
+
+-behaviour(supervisor).
+
+%% API
+-export([start_link/0]).
+
+%% Supervisor callback
+-export([init/1]).
+
+%%%=========================================================================
+%%% API
+%%%=========================================================================
+
+-spec start_link() -> {ok, pid()} | ignore | {error, term()}.
+
+start_link() ->
+ supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+%%%=========================================================================
+%%% Supervisor callback
+%%%=========================================================================
+
+init([]) ->
+ DTLSConnetionManager = dtls_connection_manager_child_spec(),
+ DTLSListeners = dtls_listeners_spec(),
+
+ {ok, {{one_for_one, 10, 3600}, [DTLSConnetionManager,
+ DTLSListeners
+ ]}}.
+
+
+%%--------------------------------------------------------------------
+%%% Internal functions
+%%--------------------------------------------------------------------
+
+dtls_connection_manager_child_spec() ->
+ Name = dtls_connection,
+ StartFunc = {dtls_connection_sup, start_link, []},
+ Restart = permanent,
+
+ Shutdown = 4000,
+ Modules = [dtls_connection_sup],
+ Type = supervisor,
+ {Name, StartFunc, Restart, Shutdown, Type, Modules}.
+
+dtls_listeners_spec() ->
+ Name = dtls_listener,
+ StartFunc = {dtls_listener_sup, start_link, []},
+ Restart = permanent,
+ Shutdown = 4000,
+ Modules = [],
+ Type = supervisor,
+ {Name, StartFunc, Restart, Shutdown, Type, Modules}.
diff --git a/lib/ssl/src/ssl.app.src b/lib/ssl/src/ssl.app.src
index e7a4d73ec4..c45e6bcf9a 100644
--- a/lib/ssl/src/ssl.app.src
+++ b/lib/ssl/src/ssl.app.src
@@ -14,6 +14,10 @@
ssl_v3,
tls_connection_sup,
tls_sender,
+ tls_server_sup,
+ tls_server_session_ticket_sup,
+ tls_server_session_ticket,
+ tls_sup,
ssl_dh_groups,
%% DTLS
dtls_connection,
@@ -24,6 +28,7 @@
dtls_connection_sup,
dtls_packet_demux,
dtls_listener_sup,
+ dtls_sup,
%% API
ssl, %% Main API
ssl_session_cache_api,
@@ -37,6 +42,8 @@
ssl_srp_primes,
ssl_alert,
ssl_listen_tracker_sup, %% may be used by DTLS over SCTP
+ tls_bloom_filter,
+ tls_client_ticket_store,
%% Erlang Distribution over SSL/TLS
inet_tls_dist,
inet6_tls_dist,
diff --git a/lib/ssl/src/ssl.erl b/lib/ssl/src/ssl.erl
index 0d6501b5ee..aae79d7625 100644
--- a/lib/ssl/src/ssl.erl
+++ b/lib/ssl/src/ssl.erl
@@ -92,13 +92,12 @@
connection_information/1,
connection_information/2]).
%% Misc
--export([handle_options/2,
+-export([handle_options/2,
+ handle_options/3,
tls_version/1,
- new_ssl_options/3,
suite_to_str/1,
suite_to_openssl_str/1,
- str_to_suite/1,
- options_to_map/1]).
+ str_to_suite/1]).
-deprecated({ssl_accept, 1, eventually}).
-deprecated({ssl_accept, 2, eventually}).
@@ -439,7 +438,6 @@
elliptic_curves => [public_key:oid()],
sni => hostname()}. % exported
%% -------------------------------------------------------------------------------------------------------
--define(SSL_OPTIONS, record_info(fields, ssl_options)).
%%%--------------------------------------------------------------------
%%% API
@@ -501,7 +499,8 @@ connect(Socket, SslOptions) when is_port(Socket) ->
connect(Socket, SslOptions0, Timeout) when is_port(Socket),
(is_integer(Timeout) andalso Timeout >= 0) or (Timeout == infinity) ->
- CbInfo = handle_option(cb_info, SslOptions0, default_cb_info(tls)),
+ CbInfo = handle_option_cb_info(SslOptions0, tls),
+
Transport = element(1, CbInfo),
EmulatedOptions = tls_socket:emulated_options(),
{ok, SocketValues} = tls_socket:getopts(Transport, Socket, EmulatedOptions),
@@ -687,9 +686,10 @@ handshake(ListenSocket, SslOptions) when is_port(ListenSocket) ->
handshake(#sslsocket{} = Socket, [], Timeout) when (is_integer(Timeout) andalso Timeout >= 0) or
(Timeout == infinity)->
handshake(Socket, Timeout);
-handshake(#sslsocket{fd = {_, _, _, Tracker}} = Socket, SslOpts, Timeout) when
+handshake(#sslsocket{fd = {_, _, _, Trackers}} = Socket, SslOpts, Timeout) when
(is_integer(Timeout) andalso Timeout >= 0) or (Timeout == infinity)->
try
+ Tracker = proplists:get_value(option_tracker, Trackers),
{ok, EmOpts, _} = tls_socket:get_all_opts(Tracker),
ssl_connection:handshake(Socket, {SslOpts,
tls_socket:emulated_socket_options(EmOpts, #socket_options{})}, Timeout)
@@ -707,7 +707,8 @@ handshake(#sslsocket{pid = [Pid|_], fd = {_, _, _}} = Socket, SslOpts, Timeout)
end;
handshake(Socket, SslOptions, Timeout) when is_port(Socket),
(is_integer(Timeout) andalso Timeout >= 0) or (Timeout == infinity) ->
- CbInfo = handle_option(cb_info, SslOptions, default_cb_info(tls)),
+ CbInfo = handle_option_cb_info(SslOptions, tls),
+
Transport = element(1, CbInfo),
EmulatedOptions = tls_socket:emulated_options(),
{ok, SocketValues} = tls_socket:getopts(Transport, Socket, EmulatedOptions),
@@ -1461,6 +1462,7 @@ do_listen(Port, Config, dtls_connection) ->
dtls_socket:listen(Port, Config).
+
-spec handle_options([any()], client | server) -> {ok, #config{}};
([any()], ssl_options()) -> ssl_options().
@@ -1468,255 +1470,360 @@ handle_options(Opts, Role) ->
handle_options(Opts, Role, undefined).
-%% Handle ssl options at handshake_continue
-handle_options(Opts0, #{protocol := Protocol,
- cacerts := CaCerts0,
- cacertfile := CaCertFile0} = InheritedSslOpts, _) ->
- RecordCB = record_cb(Protocol),
- CaCerts = handle_option(cacerts, Opts0, CaCerts0),
- {Verify, FailIfNoPeerCert, CaCertDefault, VerifyFun, PartialChainHanlder,
- VerifyClientOnce} = handle_verify_options(Opts0, CaCerts),
- CaCertFile = case proplists:get_value(cacertfile, Opts0, CaCertFile0) of
- undefined ->
- CaCertDefault;
- CAFile ->
- CAFile
- end,
-
- NewVerifyOpts = InheritedSslOpts#{cacerts => CaCerts,
- cacertfile => CaCertFile,
- verify => Verify,
- verify_fun => VerifyFun,
- partial_chain => PartialChainHanlder,
- fail_if_no_peer_cert => FailIfNoPeerCert,
- verify_client_once => VerifyClientOnce},
- SslOpts1 = lists:foldl(fun(Key, PropList) ->
- proplists:delete(Key, PropList)
- end, Opts0, [cacerts, cacertfile, verify, verify_fun, partial_chain,
- fail_if_no_peer_cert, verify_client_once]),
- case handle_option(versions, SslOpts1, []) of
- [] ->
- new_ssl_options(SslOpts1, NewVerifyOpts, RecordCB);
- Value ->
- Versions0 = [RecordCB:protocol_version(Vsn) || Vsn <- Value],
- Versions1 = lists:sort(fun RecordCB:is_higher/2, Versions0),
- new_ssl_options(proplists:delete(versions, SslOpts1),
- NewVerifyOpts#{versions => Versions1}, record_cb(Protocol))
- end;
-
+%% Handle ssl options at handshake, handshake_continue
+handle_options(Opts0, Role, InheritedSslOpts) when is_map(InheritedSslOpts) ->
+ {SslOpts, _} = expand_options(Opts0, ?RULES),
+ process_options(SslOpts, InheritedSslOpts, #{role => Role,
+ rules => ?RULES});
%% Handle all options in listen, connect and handshake
handle_options(Opts0, Role, Host) ->
- Opts = proplists:expand([{binary, [{mode, binary}]},
- {list, [{mode, list}]}], Opts0),
- assert_proplist(Opts),
- RecordCb = record_cb(Opts),
- CaCerts = handle_option(cacerts, Opts, undefined),
-
- {Verify, FailIfNoPeerCert, CaCertDefault, VerifyFun, PartialChainHanlder, VerifyClientOnce} =
- handle_verify_options(Opts, CaCerts),
-
- CertFile = handle_option(certfile, Opts, <<>>),
-
- [HighestVersion|_] = Versions =
- case handle_option(versions, Opts, []) of
- [] ->
- RecordCb:supported_protocol_versions();
- Vsns ->
- Versions0 = [RecordCb:protocol_version(Vsn) || Vsn <- Vsns],
- lists:sort(fun RecordCb:is_higher/2, Versions0)
- end,
-
- Protocol = handle_option(protocol, Opts, tls),
+ {SslOpts0, SockOpts} = expand_options(Opts0, ?RULES),
+
+ %% Ensure all options are evaluated at startup
+ SslOpts1 = add_missing_options(SslOpts0, ?RULES),
+ SslOpts = #{protocol := Protocol,
+ versions := Versions}
+ = process_options(SslOpts1,
+ #{},
+ #{role => Role,
+ host => Host,
+ rules => ?RULES}),
case Versions of
[{3, 0}] ->
- reject_alpn_next_prot_options(Opts);
+ reject_alpn_next_prot_options(SslOpts0);
_ ->
ok
end,
-
- SSLOptions0 = #ssl_options{
- versions = Versions,
- verify = validate_option(verify, Verify),
- verify_fun = VerifyFun,
- partial_chain = PartialChainHanlder,
- fail_if_no_peer_cert = FailIfNoPeerCert,
- verify_client_once = VerifyClientOnce,
- depth = handle_option(depth, Opts, 1),
- cert = handle_option(cert, Opts, undefined),
- certfile = CertFile,
- key = handle_option(key, Opts, undefined),
- keyfile = handle_option(keyfile, Opts, CertFile),
- password = handle_option(password, Opts, ""),
- cacerts = CaCerts,
- cacertfile = handle_option(cacertfile, Opts, CaCertDefault),
- dh = handle_option(dh, Opts, undefined),
- dhfile = handle_option(dhfile, Opts, undefined),
- user_lookup_fun = handle_option(user_lookup_fun, Opts, undefined),
- psk_identity = handle_option(psk_identity, Opts, undefined),
- srp_identity = handle_option(srp_identity, Opts, undefined),
- ciphers = handle_option(ciphers, Opts, undefined, undefined, undefined, HighestVersion),
-
- eccs = handle_option(eccs, Opts, undefined, undefined, undefined, HighestVersion),
-
- supported_groups = handle_option(supported_groups, Opts, undefined, undefined, undefined,
- HighestVersion),
- signature_algs = handle_option(signature_algs, Opts, undefined, Role, undefined, HighestVersion),
- signature_algs_cert = handle_option(signature_algs_cert, Opts, undefined, undefined, undefined,
- HighestVersion),
- reuse_sessions = handle_option(reuse_sessions, Opts, undefined, Role),
-
- reuse_session = handle_option(reuse_session, Opts, undefined, Role),
-
- secure_renegotiate = handle_option(secure_renegotiate, Opts, true),
- client_renegotiation = handle_option(client_renegotiation, Opts, undefined, Role),
- renegotiate_at = handle_option(renegotiate_at, Opts, ?DEFAULT_RENEGOTIATE_AT),
- hibernate_after = handle_option(hibernate_after, Opts, infinity),
- erl_dist = handle_option(erl_dist, Opts, false),
- alpn_advertised_protocols =
- handle_option(alpn_advertised_protocols, Opts, undefined),
- alpn_preferred_protocols =
- handle_option(alpn_preferred_protocols, Opts, undefined),
- next_protocols_advertised =
- handle_option(next_protocols_advertised, Opts, undefined),
- next_protocol_selector =
- handle_option(next_protocol_selector, Opts, undefined),
- server_name_indication =
- handle_option(server_name_indication, Opts, undefined, Role, Host),
- sni_hosts = handle_option(sni_hosts, Opts, []),
- sni_fun = handle_option(sni_fun, Opts, undefined),
- honor_cipher_order = handle_option(honor_cipher_order, Opts, undefined, Role),
- honor_ecc_order = handle_option(honor_ecc_order, Opts, undefined, Role),
- protocol = Protocol,
- padding_check = proplists:get_value(padding_check, Opts, true),
- beast_mitigation = handle_option(beast_mitigation, Opts, one_n_minus_one),
- fallback = handle_option(fallback, Opts, undefined, Role),
-
- crl_check = handle_option(crl_check, Opts, false),
- crl_cache = handle_option(crl_cache, Opts, {ssl_crl_cache, {internal, []}}),
- max_handshake_size = handle_option(max_handshake_size, Opts, ?DEFAULT_MAX_HANDSHAKE_SIZE),
- handshake = handle_option(handshake, Opts, full),
- customize_hostname_check = handle_option(customize_hostname_check, Opts, [])
- },
- LogLevel = handle_option(log_alert, Opts, true),
- SSLOptions1 = SSLOptions0#ssl_options{
- log_level = handle_option(log_level, Opts, LogLevel)
- },
-
- CbInfo = handle_option(cb_info, Opts, default_cb_info(Protocol)),
-
- SockOpts = lists:foldl(fun(Key, PropList) ->
- proplists:delete(Key, PropList)
- end, Opts, ?SSL_OPTIONS ++
- [ssl_imp, %% TODO: remove ssl_imp
- client_preferred_next_protocols, %% next_protocol_selector
- log_alert,
- cb_info]),
+ %% Handle special options
{Sock, Emulated} = emulated_options(Protocol, SockOpts),
- ConnetionCb = connection_cb(Opts),
- SSLOptions = options_to_map(SSLOptions1),
- {ok, #config{ssl = SSLOptions, emulated = Emulated, inet_ssl = Sock,
- inet_user = Sock, transport_info = CbInfo, connection_cb = ConnetionCb
- }}.
-
-%% handle_option(OptionName, Opts, Default, Role, Role) ->
-%% handle_option(OptionName, Opts, Default);
-%% handle_option(_, _, undefined = Value, _, _) ->
-%% Value.
-
-handle_option(OptionName, Opts, Default) ->
- handle_option(OptionName, Opts, Default, undefined, undefined, undefined).
+ ConnetionCb = connection_cb(Protocol),
+ CbInfo = handle_option_cb_info(Opts0, Protocol),
+
+ {ok, #config{
+ ssl = SslOpts,
+ emulated = Emulated,
+ inet_ssl = Sock,
+ inet_user = Sock,
+ transport_info = CbInfo,
+ connection_cb = ConnetionCb
+ }}.
+
+
+%% process_options(SSLOptions, OptionsMap, Env) where
+%% SSLOptions is the following tuple:
+%% {InOptions, SkippedOptions, Counter}
%%
-handle_option(OptionName, Opts, Default, Role) ->
- handle_option(OptionName, Opts, Default, Role, undefined, undefined).
-%%
-handle_option(OptionName, Opts, Default, Role, Host) ->
- handle_option(OptionName, Opts, Default, Role, Host, undefined).
-%%
-handle_option(sni_fun, Opts, Default, _Role, _Host, _Version) ->
- OptFun = validate_option(sni_fun,
- proplists:get_value(sni_fun, Opts, Default)),
- OptHosts = proplists:get_value(sni_hosts, Opts, undefined),
- case {OptFun, OptHosts} of
- {Default, _} ->
- Default;
- {_, undefined} ->
- OptFun;
+%% The list of options is processed in multiple passes. When
+%% processing an option all dependencies must already be resolved.
+%% If there are unresolved dependencies the option will be
+%% skipped and processed in a subsequent pass.
+%% Counter is equal to the number of unprocessed options at
+%% the beginning of a pass. Its value must monotonically decrease
+%% after each successful pass.
+%% If the value of the counter is unchanged at the end of a pass,
+%% the processing stops due to faulty input data.
+process_options({[], [], _}, OptionsMap, _Env) ->
+ OptionsMap;
+process_options({[], [_|_] = Skipped, Counter}, OptionsMap, Env)
+ when length(Skipped) < Counter ->
+ %% Continue handling options if current pass was successful
+ process_options({Skipped, [], length(Skipped)}, OptionsMap, Env);
+process_options({[], [_|_], _Counter}, _OptionsMap, _Env) ->
+ throw({error, faulty_configuration});
+process_options({[{K0,V} = E|T], S, Counter}, OptionsMap0, Env) ->
+ K = maybe_map_key_internal(K0),
+ case check_dependencies(K, OptionsMap0, Env) of
+ true ->
+ OptionsMap = handle_option(K, V, OptionsMap0, Env),
+ process_options({T, S, Counter}, OptionsMap, Env);
+ false ->
+ %% Skip option for next pass
+ process_options({T, [E|S], Counter}, OptionsMap0, Env)
+ end.
+
+
+handle_option(cacertfile = Option, unbound, #{cacerts := CaCerts,
+ verify := Verify,
+ verify_fun := VerifyFun} = OptionsMap, _Env)
+ when Verify =:= verify_none orelse
+ Verify =:= 0 ->
+ Value = validate_option(Option, ca_cert_default(verify_none, VerifyFun, CaCerts)),
+ OptionsMap#{Option => Value};
+handle_option(cacertfile = Option, unbound, #{cacerts := CaCerts,
+ verify := Verify,
+ verify_fun := VerifyFun} = OptionsMap, _Env)
+ when Verify =:= verify_peer orelse
+ Verify =:= 1 orelse
+ Verify =:= 2 ->
+ Value = validate_option(Option, ca_cert_default(verify_peer, VerifyFun, CaCerts)),
+ OptionsMap#{Option => Value};
+handle_option(cacertfile = Option, Value0, OptionsMap, _Env) ->
+ Value = validate_option(Option, Value0),
+ OptionsMap#{Option => Value};
+handle_option(ciphers = Option, unbound, #{versions := [HighestVersion|_]} = OptionsMap, #{rules := Rules}) ->
+ Value = handle_cipher_option(default_value(Option, Rules), HighestVersion),
+ OptionsMap#{Option => Value};
+handle_option(ciphers = Option, Value0, #{versions := [HighestVersion|_]} = OptionsMap, _Env) ->
+ Value = handle_cipher_option(Value0, HighestVersion),
+ OptionsMap#{Option => Value};
+handle_option(client_renegotiation = Option, unbound, OptionsMap, #{role := Role}) ->
+ Value = default_option_role(server, true, Role),
+ OptionsMap#{Option => Value};
+handle_option(client_renegotiation = Option, Value0, OptionsMap, #{role := Role}) ->
+ assert_role(server_only, Role, Option, Value0),
+ Value = validate_option(Option, Value0),
+ OptionsMap#{Option => Value};
+handle_option(eccs = Option, unbound, #{versions := [HighestVersion|_]} = OptionsMap, #{rules := _Rules}) ->
+ Value = handle_eccs_option(eccs(), HighestVersion),
+ OptionsMap#{Option => Value};
+handle_option(eccs = Option, Value0, #{versions := [HighestVersion|_]} = OptionsMap, _Env) ->
+ Value = handle_eccs_option(Value0, HighestVersion),
+ OptionsMap#{Option => Value};
+handle_option(fallback = Option, unbound, OptionsMap, #{role := Role}) ->
+ Value = default_option_role(client, false, Role),
+ OptionsMap#{Option => Value};
+handle_option(fallback = Option, Value0, OptionsMap, #{role := Role}) ->
+ assert_role(client_only, Role, Option, Value0),
+ Value = validate_option(Option, Value0),
+ OptionsMap#{Option => Value};
+handle_option(honor_cipher_order = Option, unbound, OptionsMap, #{role := Role}) ->
+ Value = default_option_role(server, false, Role),
+ OptionsMap#{Option => Value};
+handle_option(honor_cipher_order = Option, Value0, OptionsMap, #{role := Role}) ->
+ assert_role(server_only, Role, Option, Value0),
+ Value = validate_option(Option, Value0),
+ OptionsMap#{Option => Value};
+handle_option(honor_ecc_order = Option, unbound, OptionsMap, #{role := Role}) ->
+ Value = default_option_role(server, false, Role),
+ OptionsMap#{Option => Value};
+handle_option(honor_ecc_order = Option, Value0, OptionsMap, #{role := Role}) ->
+ assert_role(server_only, Role, Option, Value0),
+ Value = validate_option(Option, Value0),
+ OptionsMap#{Option => Value};
+handle_option(keyfile = Option, unbound, #{certfile := CertFile} = OptionsMap, _Env) ->
+ Value = validate_option(Option, CertFile),
+ OptionsMap#{Option => Value};
+handle_option(next_protocol_selector = Option, unbound, OptionsMap, #{rules := Rules}) ->
+ Value = default_value(Option, Rules),
+ OptionsMap#{Option => Value};
+handle_option(next_protocol_selector = Option, Value0, OptionsMap, _Env) ->
+ Value = make_next_protocol_selector(
+ validate_option(client_preferred_next_protocols, Value0)),
+ OptionsMap#{Option => Value};
+handle_option(reuse_session = Option, unbound, OptionsMap, #{role := Role}) ->
+ Value =
+ case Role of
+ client ->
+ undefined;
+ server ->
+ fun(_, _, _, _) -> true end
+ end,
+ OptionsMap#{Option => Value};
+handle_option(reuse_session = Option, Value0, OptionsMap, _Env) ->
+ Value = validate_option(Option, Value0),
+ OptionsMap#{Option => Value};
+%% TODO: validate based on role
+handle_option(reuse_sessions = Option, unbound, OptionsMap, #{rules := Rules}) ->
+ Value = validate_option(Option, default_value(Option, Rules)),
+ OptionsMap#{Option => Value};
+handle_option(reuse_sessions = Option, Value0, OptionsMap, _Env) ->
+ Value = validate_option(Option, Value0),
+ OptionsMap#{Option => Value};
+handle_option(anti_replay = Option, unbound, OptionsMap, #{rules := Rules}) ->
+ Value = validate_option(Option, default_value(Option, Rules)),
+ OptionsMap#{Option => Value};
+handle_option(anti_replay = Option, Value0,
+ #{session_tickets := SessionTickets} = OptionsMap, #{rules := Rules}) ->
+ case SessionTickets of
+ stateless ->
+ Value = validate_option(Option, Value0),
+ OptionsMap#{Option => Value};
_ ->
- throw({error, {conflict_options, [sni_fun, sni_hosts]}})
- end;
-handle_option(cb_info, Opts, Default, _Role, _Host, _Version) ->
- CbInfo = proplists:get_value(cb_info, Opts, Default),
- true = validate_option(cb_info, CbInfo),
- handle_cb_info(CbInfo, Default);
-handle_option(ciphers = Key, Opts, _Default, _Role, _Host, HighestVersion) ->
- handle_cipher_option(proplists:get_value(Key, Opts, []),
- HighestVersion);
-handle_option(eccs = Key, Opts, _Default, _Role, _Host, HighestVersion) ->
- handle_eccs_option(proplists:get_value(Key, Opts, eccs()),
- HighestVersion);
-handle_option(supported_groups = Key, Opts, _Default, _Role, _Host, HighestVersion) ->
- handle_supported_groups_option(proplists:get_value(Key, Opts, groups(default)),
- HighestVersion);
-handle_option(signature_algs = Key, Opts, _Default, Role, _Host, HighestVersion) ->
- handle_hashsigns_option(
- proplists:get_value(Key,
- Opts,
- default_option_role_sign_algs(server,
- tls_v1:default_signature_algs(HighestVersion),
- Role,
- HighestVersion)),
- tls_version(HighestVersion));
-handle_option(signature_algs_cert = Key, Opts, _Default, _Role, _Host, HighestVersion) ->
- handle_signature_algorithms_option(
- proplists:get_value(Key,
- Opts,
- undefined), %% Do not send by default
- tls_version(HighestVersion));
-handle_option(reuse_sessions = Key, Opts, _Default, client, _Host, _Version) ->
- Value = proplists:get_value(Key, Opts, true),
- validate_option(Key, Value),
- Value;
-handle_option(reuse_sessions = Key, Opts0, _Default, server, _Host, _Version) ->
- Opts = proplists:delete({Key, save}, Opts0),
- Value = proplists:get_value(Key, Opts, true),
- validate_option(Key, Value),
- Value;
-handle_option(reuse_session = Key, Opts, _Default, client, _Host, _Version) ->
- Value = proplists:get_value(Key, Opts, undefined),
- validate_option(Key, Value),
- Value;
-handle_option(reuse_session = Key, Opts, _Default, server, _Host, _Version) ->
- ReuseSessionFun = fun(_, _, _, _) -> true end,
- Value = proplists:get_value(Key, Opts, ReuseSessionFun),
- validate_option(Key, Value),
- Value;
-handle_option(fallback = Key, Opts, _Default, Role, _Host, _Version) ->
- Value = proplists:get_value(Key, Opts, default_option_role(client, false, Role)),
- assert_role(client_only, Role, Key, Value),
- validate_option(Key, Value);
-handle_option(client_renegotiation = Key, Opts, _Default, Role, _Host, _Version) ->
- Value = proplists:get_value(Key, Opts, default_option_role(server, true, Role)),
- assert_role(server_only, Role, Key, Value),
- validate_option(Key, Value);
-handle_option(honor_cipher_order = Key, Opts, _Default, Role, _Host, _Version) ->
- Value = proplists:get_value(Key, Opts, default_option_role(server, false, Role)),
- assert_role(server_only, Role, Key, Value),
- validate_option(Key, Value);
-handle_option(honor_ecc_order = Key, Opts, _Default, Role, _Host, _Version) ->
- Value = proplists:get_value(Key, Opts, default_option_role(server, false, Role)),
- assert_role(server_only, Role, Key, Value),
- validate_option(Key, Value);
-handle_option(next_protocol_selector = _Key, Opts, _Default, _Role, _Host, _Version) ->
- make_next_protocol_selector(
- handle_option(client_preferred_next_protocols, Opts, undefined, undefined, undefined, undefined));
-handle_option(server_name_indication = Key, Opts, _Default, Role, Host, _Version) ->
- Default = default_option_role(client, server_name_indication_default(Host), Role),
- validate_option(Key, proplists:get_value(Key, Opts, Default));
-handle_option(OptionName, Opts, Default, _Role, _Host, _Version) ->
- validate_option(OptionName,
- proplists:get_value(OptionName, Opts, Default)).
+ OptionsMap#{Option => default_value(Option, Rules)}
+end;
+handle_option(server_name_indication = Option, unbound, OptionsMap, #{host := Host,
+ role := Role}) ->
+ Value = default_option_role(client, server_name_indication_default(Host), Role),
+ OptionsMap#{Option => Value};
+handle_option(server_name_indication = Option, Value0, OptionsMap, _Env) ->
+ Value = validate_option(Option, Value0),
+ OptionsMap#{Option => Value};
+handle_option(signature_algs = Option, unbound, #{versions := [HighestVersion|_]} = OptionsMap, #{role := Role}) ->
+ Value =
+ handle_hashsigns_option(
+ default_option_role_sign_algs(
+ server,
+ tls_v1:default_signature_algs(HighestVersion),
+ Role,
+ HighestVersion),
+ tls_version(HighestVersion)),
+ OptionsMap#{Option => Value};
+handle_option(signature_algs = Option, Value0, #{versions := [HighestVersion|_]} = OptionsMap, _Env) ->
+ Value = handle_hashsigns_option(Value0, tls_version(HighestVersion)),
+ OptionsMap#{Option => Value};
+handle_option(signature_algs_cert = Option, unbound, #{versions := [HighestVersion|_]} = OptionsMap, _Env) ->
+ %% Do not send by default
+ Value = handle_signature_algorithms_option(undefined, tls_version(HighestVersion)),
+ OptionsMap#{Option => Value};
+handle_option(signature_algs_cert = Option, Value0, #{versions := [HighestVersion|_]} = OptionsMap, _Env) ->
+ Value = handle_signature_algorithms_option(Value0, tls_version(HighestVersion)),
+ OptionsMap#{Option => Value};
+handle_option(sni_fun = Option, unbound, OptionsMap, #{rules := Rules}) ->
+ Value = default_value(Option, Rules),
+ OptionsMap#{Option => Value};
+handle_option(sni_fun = Option, Value0, OptionsMap, _Env) ->
+ validate_option(Option, Value0),
+ OptHosts = maps:get(sni_hosts, OptionsMap, undefined),
+ Value =
+ case {Value0, OptHosts} of
+ {undefined, _} ->
+ Value0;
+ {_, []} ->
+ Value0;
+ _ ->
+ throw({error, {conflict_options, [sni_fun, sni_hosts]}})
+ end,
+ OptionsMap#{Option => Value};
+handle_option(supported_groups = Option, unbound, #{versions := [HighestVersion|_]} = OptionsMap, #{rules := _Rules}) ->
+ Value = handle_supported_groups_option(groups(default), HighestVersion),
+ OptionsMap#{Option => Value};
+handle_option(supported_groups = Option, Value0, #{versions := [HighestVersion|_]} = OptionsMap, _Env) ->
+ Value = handle_supported_groups_option(Value0, HighestVersion),
+ OptionsMap#{Option => Value};
+handle_option(verify = Option, unbound, OptionsMap, #{rules := Rules}) ->
+ handle_verify_option(default_value(Option, Rules), OptionsMap);
+handle_option(verify = _Option, Value, OptionsMap, _Env) ->
+ handle_verify_option(Value, OptionsMap);
+
+handle_option(verify_fun = Option, unbound, #{verify := Verify} = OptionsMap, #{rules := Rules})
+ when Verify =:= verify_none orelse
+ Verify =:= 0 ->
+ OptionsMap#{Option => default_value(Option, Rules)};
+handle_option(verify_fun = Option, unbound, #{verify := Verify} = OptionsMap, _Env)
+ when Verify =:= verify_peer orelse
+ Verify =:= 1 orelse
+ Verify =:= 2 ->
+ OptionsMap#{Option => undefined};
+handle_option(verify_fun = Option, Value0, OptionsMap, _Env) ->
+ Value = validate_option(Option, Value0),
+ OptionsMap#{Option => Value};
+handle_option(versions = Option, unbound, #{protocol := Protocol} = OptionsMap, _Env) ->
+ RecordCb = record_cb(Protocol),
+ Vsns0 = RecordCb:supported_protocol_versions(),
+ Value = lists:sort(fun RecordCb:is_higher/2, Vsns0),
+ OptionsMap#{Option => Value};
+handle_option(versions = Option, Vsns0, #{protocol := Protocol} = OptionsMap, _Env) ->
+ validate_option(versions, Vsns0),
+ RecordCb = record_cb(Protocol),
+ Vsns1 = [RecordCb:protocol_version(Vsn) || Vsn <- Vsns0],
+ Value = lists:sort(fun RecordCb:is_higher/2, Vsns1),
+ OptionsMap#{Option => Value};
+%% Special options
+handle_option(cb_info = Option, unbound, #{protocol := Protocol} = OptionsMap, _Env) ->
+ Default = default_cb_info(Protocol),
+ validate_option(Option, Default),
+ Value = handle_cb_info(Default),
+ OptionsMap#{Option => Value};
+handle_option(cb_info = Option, Value0, OptionsMap, _Env) ->
+ validate_option(Option, Value0),
+ Value = handle_cb_info(Value0),
+ OptionsMap#{Option => Value};
+%% Generic case
+handle_option(Option, unbound, OptionsMap, #{rules := Rules}) ->
+ Value = validate_option(Option, default_value(Option, Rules)),
+ OptionsMap#{Option => Value};
+handle_option(Option, Value0, OptionsMap, _Env) ->
+ Value = validate_option(Option, Value0),
+ OptionsMap#{Option => Value}.
+
+handle_option_cb_info(Options, Protocol) ->
+ Value = proplists:get_value(cb_info, Options, default_cb_info(Protocol)),
+ #{cb_info := CbInfo} = handle_option(cb_info, Value, #{protocol => Protocol}, #{}),
+ CbInfo.
+
+
+maybe_map_key_internal(client_preferred_next_protocols) ->
+ next_protocol_selector;
+maybe_map_key_internal(K) ->
+ K.
+
+
+maybe_map_key_external(next_protocol_selector) ->
+ client_preferred_next_protocols;
+maybe_map_key_external(K) ->
+ K.
+
+
+check_dependencies(K, OptionsMap, Env) ->
+ Rules = maps:get(rules, Env),
+ Deps = get_dependencies(K, Rules),
+ case Deps of
+ [] ->
+ true;
+ L ->
+ option_already_defined(K,OptionsMap) orelse
+ dependecies_already_defined(L, OptionsMap)
+ end.
+
+
+%% Handle options that are not present in the map
+get_dependencies(K, _) when K =:= cb_info orelse K =:= log_alert->
+ [];
+get_dependencies(K, Rules) ->
+ {_, Deps} = maps:get(K, Rules),
+ Deps.
+
+
+option_already_defined(K, Map) ->
+ maps:get(K, Map, unbound) =/= unbound.
+
+
+dependecies_already_defined(L, OptionsMap) ->
+ Fun = fun (E) -> option_already_defined(E, OptionsMap) end,
+ lists:all(Fun, L).
+
+
+expand_options(Opts0, Rules) ->
+ Opts1 = proplists:expand([{binary, [{mode, binary}]},
+ {list, [{mode, list}]}], Opts0),
+ assert_proplist(Opts1),
+
+ %% Remove depricated ssl_imp option
+ Opts = proplists:delete(ssl_imp, Opts1),
+ AllOpts = maps:keys(Rules),
+ SockOpts = lists:foldl(fun(Key, PropList) -> proplists:delete(Key, PropList) end,
+ Opts,
+ AllOpts ++
+ [ssl_imp, %% TODO: remove ssl_imp
+ cb_info,
+ client_preferred_next_protocols, %% next_protocol_selector
+ log_alert]), %% obsoleted by log_level
+
+ SslOpts = {Opts -- SockOpts, [], length(Opts -- SockOpts)},
+ {SslOpts, SockOpts}.
+
+
+add_missing_options({L0, S, _C}, Rules) ->
+ Fun = fun(K0, Acc) ->
+ K = maybe_map_key_external(K0),
+ case proplists:is_defined(K, Acc) of
+ true ->
+ Acc;
+ false ->
+ Default = unbound,
+ [{K, Default}|Acc]
+ end
+ end,
+ AllOpts = maps:keys(Rules),
+ L = lists:foldl(Fun, L0, AllOpts),
+ {L, S, length(L)}.
+
+
+default_value(Key, Rules) ->
+ {Default, _} = maps:get(Key, Rules, {undefined, []}),
+ Default.
assert_role(client_only, client, _, _) ->
@@ -1961,23 +2068,45 @@ validate_option(handshake, full = Value) ->
Value;
validate_option(customize_hostname_check, Value) when is_list(Value) ->
Value;
-validate_option(cb_info, {V1, V2, V3, V4}) when is_atom(V1),
- is_atom(V2),
- is_atom(V3),
- is_atom(V4)
+validate_option(cb_info, {V1, V2, V3, V4} = Value) when is_atom(V1),
+ is_atom(V2),
+ is_atom(V3),
+ is_atom(V4)
->
- true;
-validate_option(cb_info, {V1, V2, V3, V4, V5}) when is_atom(V1),
- is_atom(V2),
- is_atom(V3),
- is_atom(V4),
- is_atom(V5)
+ Value;
+validate_option(cb_info, {V1, V2, V3, V4, V5} = Value) when is_atom(V1),
+ is_atom(V2),
+ is_atom(V3),
+ is_atom(V4),
+ is_atom(V5)
->
- true;
-validate_option(cb_info, _) ->
- false;
+ Value;
+validate_option(use_ticket, Value) when is_list(Value) ->
+ Value;
+validate_option(session_tickets, Value) when Value =:= disabled orelse
+ Value =:= enabled orelse
+ Value =:= auto orelse
+ Value =:= stateless orelse
+ Value =:= stateful ->
+ Value;
+validate_option(anti_replay, '10k') ->
+ %% n = 10000
+ %% p = 0.030003564 (1 in 33)
+ %% m = 72985 (8.91KiB)
+ %% k = 5
+ {10, 5, 72985};
+validate_option(anti_replay, '100k') ->
+ %% n = 100000
+ %% p = 0.03000428 (1 in 33)
+ %% m = 729845 (89.09KiB)
+ %% k = 5
+ {10, 5, 729845};
+validate_option(anti_replay, Value) when (is_tuple(Value) andalso
+ tuple_size(Value) =:= 3) ->
+ Value;
validate_option(Opt, undefined = Value) ->
- case lists:member(Opt, ?SSL_OPTIONS) of
+ AllOpts = maps:keys(?RULES),
+ case lists:member(Opt, AllOpts) of
true ->
Value;
false ->
@@ -1986,9 +2115,9 @@ validate_option(Opt, undefined = Value) ->
validate_option(Opt, Value) ->
throw({error, {options, {Opt, Value}}}).
-handle_cb_info({V1, V2, V3, V4}, {_,_,_,_,_}) ->
+handle_cb_info({V1, V2, V3, V4}) ->
{V1,V2,V3,V4, list_to_atom(atom_to_list(V2) ++ "_passive")};
-handle_cb_info(CbInfo, _) ->
+handle_cb_info(CbInfo) ->
CbInfo.
handle_hashsigns_option(Value, Version) when is_list(Value)
@@ -2275,159 +2404,22 @@ assert_proplist([inet6 | Rest]) ->
assert_proplist([Value | _]) ->
throw({option_not_a_key_value_tuple, Value}).
-new_ssl_options([], #{} = Opts, _) ->
- Opts;
-new_ssl_options([{verify_client_once, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{verify_client_once =>
- validate_option(verify_client_once, Value)}, RecordCB);
-new_ssl_options([{depth, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{depth => validate_option(depth, Value)}, RecordCB);
-new_ssl_options([{cert, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{cert => validate_option(cert, Value)}, RecordCB);
-new_ssl_options([{certfile, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{certfile => validate_option(certfile, Value)}, RecordCB);
-new_ssl_options([{key, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{key => validate_option(key, Value)}, RecordCB);
-new_ssl_options([{keyfile, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{keyfile => validate_option(keyfile, Value)}, RecordCB);
-new_ssl_options([{password, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{password => validate_option(password, Value)}, RecordCB);
-new_ssl_options([{dh, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{dh => validate_option(dh, Value)}, RecordCB);
-new_ssl_options([{dhfile, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{dhfile => validate_option(dhfile, Value)}, RecordCB);
-new_ssl_options([{user_lookup_fun, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{user_lookup_fun => validate_option(user_lookup_fun, Value)}, RecordCB);
-new_ssl_options([{psk_identity, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{psk_identity => validate_option(psk_identity, Value)}, RecordCB);
-new_ssl_options([{srp_identity, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{srp_identity => validate_option(srp_identity, Value)}, RecordCB);
-new_ssl_options([{ciphers, Value} | Rest], #{versions := Versions} = Opts, RecordCB) ->
- Ciphers = handle_cipher_option(Value, RecordCB:highest_protocol_version(Versions)),
- new_ssl_options(Rest, Opts#{ciphers => Ciphers}, RecordCB);
-new_ssl_options([{reuse_session, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{reuse_session => validate_option(reuse_session, Value)}, RecordCB);
-new_ssl_options([{reuse_sessions, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{reuse_sessions => validate_option(reuse_sessions, Value)}, RecordCB);
-new_ssl_options([{ssl_imp, _Value} | Rest], #{} = Opts, RecordCB) -> %% Not used backwards compatibility
- new_ssl_options(Rest, Opts, RecordCB);
-new_ssl_options([{renegotiate_at, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{renegotiate_at => validate_option(renegotiate_at, Value)}, RecordCB);
-new_ssl_options([{secure_renegotiate, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{secure_renegotiate => validate_option(secure_renegotiate, Value)}, RecordCB);
-new_ssl_options([{client_renegotiation, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{client_renegotiation => validate_option(client_renegotiation, Value)}, RecordCB);
-new_ssl_options([{hibernate_after, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{hibernate_after => validate_option(hibernate_after, Value)}, RecordCB);
-new_ssl_options([{alpn_advertised_protocols, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{alpn_advertised_protocols => validate_option(alpn_advertised_protocols, Value)},
- RecordCB);
-new_ssl_options([{alpn_preferred_protocols, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{alpn_preferred_protocols => validate_option(alpn_preferred_protocols, Value)},
- RecordCB);
-new_ssl_options([{next_protocols_advertised, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{next_protocols_advertised => validate_option(next_protocols_advertised, Value)},
- RecordCB);
-new_ssl_options([{client_preferred_next_protocols, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest,
- Opts#{next_protocol_selector =>
- make_next_protocol_selector(validate_option(client_preferred_next_protocols, Value))},
- RecordCB);
-new_ssl_options([{log_alert, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{log_level => validate_option(log_alert, Value)}, RecordCB);
-new_ssl_options([{log_level, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{log_level => validate_option(log_level, Value)}, RecordCB);
-new_ssl_options([{server_name_indication, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{server_name_indication => validate_option(server_name_indication, Value)}, RecordCB);
-new_ssl_options([{honor_cipher_order, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{honor_cipher_order => validate_option(honor_cipher_order, Value)}, RecordCB);
-new_ssl_options([{honor_ecc_order, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest, Opts#{honor_ecc_order => validate_option(honor_ecc_order, Value)}, RecordCB);
-new_ssl_options([{eccs, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest,
- Opts#{eccs => handle_eccs_option(Value, RecordCB:highest_protocol_version())
- },
- RecordCB);
-new_ssl_options([{supported_groups, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest,
- Opts#{supported_groups =>
- handle_supported_groups_option(Value, RecordCB:highest_protocol_version())
- },
- RecordCB);
-new_ssl_options([{signature_algs, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(Rest,
- Opts#{signature_algs =>
- handle_hashsigns_option(Value,
- tls_version(RecordCB:highest_protocol_version()))},
- RecordCB);
-new_ssl_options([{signature_algs_cert, Value} | Rest], #{} = Opts, RecordCB) ->
- new_ssl_options(
- Rest,
- Opts#{signature_algs_cert =>
- handle_signature_algorithms_option(
- Value,
- tls_version(RecordCB:highest_protocol_version()))},
- RecordCB);
-new_ssl_options([{protocol, dtls = Value} | Rest], #{} = Opts, dtls_record = RecordCB) ->
- new_ssl_options(Rest, Opts#{protocol => Value}, RecordCB);
-new_ssl_options([{protocol, tls = Value} | Rest], #{} = Opts, tls_record = RecordCB) ->
- new_ssl_options(Rest, Opts#{protocol => Value}, RecordCB);
-new_ssl_options([{Key, Value} | _Rest], #{}, _) ->
- throw({error, {options, {Key, Value}}}).
-
-
-handle_verify_options(Opts, CaCerts) ->
- DefaultVerifyNoneFun =
- {fun(_,{bad_cert, _}, UserState) ->
- {valid, UserState};
- (_,{extension, #'Extension'{critical = true}}, UserState) ->
- %% This extension is marked as critical, so
- %% certificate verification should fail if we don't
- %% understand the extension. However, this is
- %% `verify_none', so let's accept it anyway.
- {valid, UserState};
- (_,{extension, _}, UserState) ->
- {unknown, UserState};
- (_, valid, UserState) ->
- {valid, UserState};
- (_, valid_peer, UserState) ->
- {valid, UserState}
- end, []},
- VerifyNoneFun = handle_option(verify_fun, Opts, DefaultVerifyNoneFun),
-
- UserFailIfNoPeerCert = handle_option(fail_if_no_peer_cert, Opts, false),
- UserVerifyFun = handle_option(verify_fun, Opts, undefined),
-
- PartialChainHanlder = handle_option(partial_chain, Opts,
- fun(_) -> unknown_ca end),
-
- VerifyClientOnce = handle_option(verify_client_once, Opts, false),
-
- %% Handle 0, 1, 2 for backwards compatibility
- case proplists:get_value(verify, Opts, verify_none) of
- 0 ->
- {verify_none, false,
- ca_cert_default(verify_none, VerifyNoneFun, CaCerts),
- VerifyNoneFun, PartialChainHanlder, VerifyClientOnce};
- 1 ->
- {verify_peer, false,
- ca_cert_default(verify_peer, UserVerifyFun, CaCerts),
- UserVerifyFun, PartialChainHanlder, VerifyClientOnce};
- 2 ->
- {verify_peer, true,
- ca_cert_default(verify_peer, UserVerifyFun, CaCerts),
- UserVerifyFun, PartialChainHanlder, VerifyClientOnce};
- verify_none ->
- {verify_none, false,
- ca_cert_default(verify_none, VerifyNoneFun, CaCerts),
- VerifyNoneFun, PartialChainHanlder, VerifyClientOnce};
- verify_peer ->
- {verify_peer, UserFailIfNoPeerCert,
- ca_cert_default(verify_peer, UserVerifyFun, CaCerts),
- UserVerifyFun, PartialChainHanlder, VerifyClientOnce};
- Value ->
- throw({error, {options, {verify, Value}}})
- end.
+
+handle_verify_option(verify_none, #{fail_if_no_peer_cert := _FailIfNoPeerCert} = OptionsMap) ->
+ OptionsMap#{verify => verify_none,
+ fail_if_no_peer_cert => false};
+handle_verify_option(verify_peer, #{fail_if_no_peer_cert := FailIfNoPeerCert} = OptionsMap) ->
+ OptionsMap#{verify => verify_peer,
+ fail_if_no_peer_cert => FailIfNoPeerCert};
+%% Handle 0, 1, 2 for backwards compatibility
+handle_verify_option(0, OptionsMap) ->
+ handle_verify_option(verify_none, OptionsMap);
+handle_verify_option(1, OptionsMap) ->
+ handle_verify_option(verify_peer, OptionsMap#{fail_if_no_peer_cert => false});
+handle_verify_option(2, OptionsMap) ->
+ handle_verify_option(verify_peer, OptionsMap#{fail_if_no_peer_cert => true});
+handle_verify_option(Value, _) ->
+ throw({error, {options, {verify, Value}}}).
%% Added to handle default values for signature_algs in TLS 1.3
default_option_role_sign_algs(_, Value, _, Version) when Version >= {3,4} ->
@@ -2464,7 +2456,7 @@ server_name_indication_default(_) ->
undefined.
-reject_alpn_next_prot_options(Opts) ->
+reject_alpn_next_prot_options({Opts,_,_}) ->
AlpnNextOpts = [alpn_advertised_protocols,
alpn_preferred_protocols,
next_protocols_advertised,
@@ -2486,10 +2478,3 @@ add_filter(undefined, Filters) ->
Filters;
add_filter(Filter, Filters) ->
[Filter | Filters].
-
-%% Convert the record #ssl_options{} into a map for internal usage
-options_to_map(Options) ->
- Fields = record_info(fields, ssl_options),
- [_Tag| Values] = tuple_to_list(Options),
- L = lists:zip(Fields, Values),
- maps:from_list(L).
diff --git a/lib/ssl/src/ssl_admin_sup.erl b/lib/ssl/src/ssl_admin_sup.erl
index 9c96435753..01ddbb7686 100644
--- a/lib/ssl/src/ssl_admin_sup.erl
+++ b/lib/ssl/src/ssl_admin_sup.erl
@@ -46,7 +46,8 @@ start_link() ->
init([]) ->
PEMCache = pem_cache_child_spec(),
SessionCertManager = session_and_cert_manager_child_spec(),
- {ok, {{rest_for_one, 10, 3600}, [PEMCache, SessionCertManager]}}.
+ TicketStore = ticket_store_spec(),
+ {ok, {{rest_for_one, 10, 3600}, [PEMCache, SessionCertManager, TicketStore]}}.
manager_opts() ->
CbOpts = case application:get_env(ssl, session_cb) of
@@ -86,6 +87,16 @@ session_and_cert_manager_child_spec() ->
Type = worker,
{Name, StartFunc, Restart, Shutdown, Type, Modules}.
+ticket_store_spec() ->
+ Name = tls_client_ticket_store,
+ %% TODO do not hardcode storage size and lifetime
+ StartFunc = {tls_client_ticket_store, start_link, [20,10]},
+ Restart = permanent,
+ Shutdown = 4000,
+ Modules = [tls_client_ticket_store],
+ Type = worker,
+ {Name, StartFunc, Restart, Shutdown, Type, Modules}.
+
session_cb_init_args() ->
case application:get_env(ssl, session_cb_init_args) of
{ok, Args} when is_list(Args) ->
diff --git a/lib/ssl/src/ssl_alert.erl b/lib/ssl/src/ssl_alert.erl
index 2d57b72f7b..d4b0cb1f14 100644
--- a/lib/ssl/src/ssl_alert.erl
+++ b/lib/ssl/src/ssl_alert.erl
@@ -33,9 +33,8 @@
-include("ssl_internal.hrl").
-export([decode/1,
- own_alert_txt/1,
- alert_txt/1,
- alert_txt/4,
+ own_alert_format/4,
+ alert_format/4,
reason_code/4]).
%%====================================================================
@@ -62,53 +61,69 @@ decode(Bin) ->
reason_code(#alert{description = ?CLOSE_NOTIFY}, _, _, _) ->
closed;
reason_code(#alert{description = Description, role = Role} = Alert, Role, ProtocolName, StateName) ->
- Txt = lists:flatten(alert_txt(ProtocolName, Role, StateName, own_alert_txt(Alert))),
+ {PrefixFmt, PrefixArgs} = alert_prefix_format(ProtocolName, Role, StateName),
+ {Fmt, Args} = own_alert_format_depth(Alert),
+ Txt = lists:flatten(io_lib:format(PrefixFmt ++ Fmt, PrefixArgs ++ Args)),
{tls_alert, {description_atom(Description), Txt}};
reason_code(#alert{description = Description} = Alert, Role, ProtocolName, StateName) ->
- Txt = lists:flatten(alert_txt(ProtocolName, Role, StateName, alert_txt(Alert))),
+ {Fmt, Args} = alert_format(ProtocolName, Role, StateName, Alert),
+ Txt = lists:flatten(io_lib:format(Fmt, Args)),
{tls_alert, {description_atom(Description), Txt}}.
%%--------------------------------------------------------------------
--spec alert_txt(string(), server | client, StateNam::atom(), string()) -> string().
+-spec own_alert_format(string(), server | client, StateNam::atom(), #alert{}) -> {io:format(), list()}.
%%
%% Description: Generates alert text for log or string part of error return.
%%--------------------------------------------------------------------
-alert_txt(ProtocolName, Role, StateName, Txt) ->
- io_lib:format("~s ~p: In state ~p ~s\n", [ProtocolName, Role, StateName, Txt]).
+own_alert_format(ProtocolName, Role, StateName, Alert) ->
+ {PrfixFmt, PrefixArgs} = alert_prefix_format(ProtocolName, Role, StateName),
+ {Fmt, Args} = own_alert_format(Alert),
+ {PrfixFmt ++ Fmt, PrefixArgs ++ Args}.
%%--------------------------------------------------------------------
--spec own_alert_txt(#alert{}) -> string().
+-spec alert_format(string(), server | client, StateNam::atom(), #alert{}) -> {io:format(), list()}.
%%
-%% Description: Returns the error string for given alert generated
-%% by the erlang implementation.
-%%--------------------------------------------------------------------
-own_alert_txt(#alert{level = Level, description = Description, where = {Mod,Line}, reason = undefined, role = Role}) ->
- "at " ++ Mod ++ ":" ++ integer_to_list(Line) ++ " generated " ++ string:uppercase(atom_to_list(Role)) ++ " ALERT: " ++
- level_txt(Level) ++ description_txt(Description);
-own_alert_txt(#alert{reason = Reason} = Alert) ->
- BaseTxt = own_alert_txt(Alert#alert{reason = undefined}),
- FormatDepth = 9, % Some limit on printed representation of an error
- ReasonTxt = lists:flatten(io_lib:format("~P", [Reason, FormatDepth])),
- BaseTxt ++ " - " ++ ReasonTxt.
-
-%%--------------------------------------------------------------------
--spec alert_txt(#alert{}) -> string().
-%%
-%% Description: Returns the error string for given alert received from
-%% the peer.
+%% Description: Generates alert text for log or string part of error return.
%%--------------------------------------------------------------------
-alert_txt(#alert{level = Level, description = Description, reason = undefined, role = Role}) ->
- "received " ++ string:uppercase(atom_to_list(Role)) ++ " ALERT: " ++
- level_txt(Level) ++ description_txt(Description);
-alert_txt(#alert{reason = Reason} = Alert) ->
- BaseTxt = alert_txt(Alert#alert{reason = undefined}),
- FormatDepth = 9, % Some limit on printed representation of an error
- ReasonTxt = lists:flatten(io_lib:format("~P", [Reason, FormatDepth])),
- BaseTxt ++ " - " ++ ReasonTxt.
+alert_format(ProtocolName, Role, StateName, Alert) ->
+ {PrfixFmt, PrefixArgs} = alert_prefix_format(ProtocolName, Role, StateName),
+ {Fmt, Args} = alert_format(Alert),
+ {PrfixFmt ++ Fmt, PrefixArgs ++ Args}.
%%--------------------------------------------------------------------
%%% Internal functions
%%--------------------------------------------------------------------
+alert_prefix_format(ProtocolName, Role, StateName) ->
+ {"~s ~p: In state ~p", [ProtocolName, Role, StateName]}.
+
+own_alert_format(#alert{reason = Reason} = Alert) ->
+ Txt = own_alert_txt(Alert),
+ case Reason of
+ undefined ->
+ {" ~s\n", [Txt]};
+ Reason ->
+ {" ~s\n - ~p", [Txt, Reason]}
+ end.
+own_alert_format_depth(#alert{reason = Reason} = Alert) ->
+ Txt = own_alert_txt(Alert),
+ case Reason of
+ undefined ->
+ {" ~s\n", [Txt]};
+ Reason ->
+ {" ~s\n ~P", [Txt, Reason, ?DEPTH]}
+ end.
+
+own_alert_txt(#alert{level = Level, description = Description, where = #{line := Line, file := Mod}, role = Role}) ->
+ "at " ++ Mod ++ ":" ++ integer_to_list(Line) ++ " generated " ++ string:uppercase(atom_to_list(Role)) ++ " ALERT: " ++
+ level_txt(Level) ++ description_txt(Description).
+
+alert_format(Alert) ->
+ Txt = alert_txt(Alert),
+ {" ~s\n ", [Txt]}.
+
+alert_txt(#alert{level = Level, description = Description, role = Role}) ->
+ "received " ++ string:uppercase(atom_to_list(Role)) ++ " ALERT: " ++
+ level_txt(Level) ++ description_txt(Description).
%% It is very unlikely that an correct implementation will send more than one alert at the time
%% So it there is more than 10 warning alerts we consider it an error
diff --git a/lib/ssl/src/ssl_alert.hrl b/lib/ssl/src/ssl_alert.hrl
index 9b2322da17..0edc4bf8e4 100644
--- a/lib/ssl/src/ssl_alert.hrl
+++ b/lib/ssl/src/ssl_alert.hrl
@@ -26,6 +26,7 @@
-ifndef(ssl_alert).
-define(ssl_alert, true).
+-include_lib("kernel/include/logger.hrl").
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Alert protocol - RFC 2246 section 7.2
@@ -113,8 +114,8 @@
-define(CERTIFICATE_REQUIRED, 116).
-define(NO_APPLICATION_PROTOCOL, 120).
--define(ALERT_REC(Level,Desc), #alert{level=Level,description=Desc,where={?FILE, ?LINE}}).
--define(ALERT_REC(Level,Desc,Reason), #alert{level=Level,description=Desc,where={?FILE, ?LINE},reason=Reason}).
+-define(ALERT_REC(Level,Desc), #alert{level=Level,description=Desc,where= ?LOCATION}).
+-define(ALERT_REC(Level,Desc,Reason), #alert{level=Level,description=Desc,where=?LOCATION,reason=Reason}).
-define(MAX_ALERTS, 10).
@@ -122,7 +123,7 @@
-record(alert, {
level,
description,
- where = {?FILE, ?LINE},
+ where,
role,
reason
}).
diff --git a/lib/ssl/src/ssl_app.erl b/lib/ssl/src/ssl_app.erl
index 9e6d676bef..840a075e84 100644
--- a/lib/ssl/src/ssl_app.erl
+++ b/lib/ssl/src/ssl_app.erl
@@ -45,7 +45,8 @@ start_logger() ->
Filter = {fun logger_filters:domain/2,{log,sub,[otp,ssl]}},
logger:add_handler(ssl_handler, logger_std_h, Config),
logger:add_handler_filter(ssl_handler, filter_non_ssl, Filter),
- logger:set_application_level(ssl, debug).
+ logger:set_module_level([ssl_logger],
+ debug).
%%
%% Description: Stop SSL logger
diff --git a/lib/ssl/src/ssl_certificate.erl b/lib/ssl/src/ssl_certificate.erl
index 9997f5e0c8..104bbd65c8 100644
--- a/lib/ssl/src/ssl_certificate.erl
+++ b/lib/ssl/src/ssl_certificate.erl
@@ -103,7 +103,7 @@ certificate_chain(OwnCert, CertDbHandle, CertsDbRef) ->
certificate_chain(OwnCert, DerCert, CertDbHandle, CertsDbRef, [DerCert], []).
%%--------------------------------------------------------------------
--spec certificate_chain(undefined | binary() | #'OTPCertificate'{} , db_handle(), certdb_ref(), [der_cert()]) ->
+-spec certificate_chain(undefined | binary() | #'OTPCertificate'{} , db_handle(), certdb_ref() | {extracted, list()}, [der_cert()]) ->
{error, no_cert} | {ok, #'OTPCertificate'{} | undefined, [der_cert()]}.
%%
%% Description: Create certificate chain with certs from
diff --git a/lib/ssl/src/ssl_cipher.erl b/lib/ssl/src/ssl_cipher.erl
index c16e2331ff..c97884ec08 100644
--- a/lib/ssl/src/ssl_cipher.erl
+++ b/lib/ssl/src/ssl_cipher.erl
@@ -48,7 +48,11 @@
key_material/1, signature_algorithm_to_scheme/1]).
%% RFC 8446 TLS 1.3
--export([generate_client_shares/1, generate_server_share/1, add_zero_padding/2]).
+-export([generate_client_shares/1,
+ generate_server_share/1,
+ add_zero_padding/2,
+ encrypt_ticket/3,
+ decrypt_ticket/3]).
-compile(inline).
@@ -1386,3 +1390,63 @@ add_zero_padding(Bin, PrimeSize)
Bin;
add_zero_padding(Bin, PrimeSize) ->
add_zero_padding(<<0, Bin/binary>>, PrimeSize).
+
+
+%% Functions for handling self-encrypted session tickets (TLS 1.3).
+%%
+encrypt_ticket(#stateless_ticket{
+ hash = Hash,
+ pre_shared_key = PSK,
+ ticket_age_add = TicketAgeAdd,
+ lifetime = Lifetime,
+ timestamp = Timestamp
+ }, Shard, IV) ->
+ Plaintext = <<(ssl_cipher:hash_algorithm(Hash)):8,PSK/binary,
+ ?UINT64(TicketAgeAdd),?UINT32(Lifetime),?UINT32(Timestamp)>>,
+ encrypt_ticket_data(Plaintext, Shard, IV).
+
+
+decrypt_ticket(CipherFragment, Shard, IV) ->
+ case decrypt_ticket_data(CipherFragment, Shard, IV) of
+ error ->
+ error;
+ Plaintext ->
+ <<?BYTE(HKDF),T/binary>> = Plaintext,
+ Hash = hash_algorithm(HKDF),
+ HashSize = hash_size(Hash),
+ <<PSK:HashSize/binary,?UINT64(TicketAgeAdd),?UINT32(Lifetime),?UINT32(Timestamp),_/binary>> = T,
+ #stateless_ticket{
+ hash = Hash,
+ pre_shared_key = PSK,
+ ticket_age_add = TicketAgeAdd,
+ lifetime = Lifetime,
+ timestamp = Timestamp
+ }
+ end.
+
+
+encrypt_ticket_data(Plaintext, Shard, IV) ->
+ AAD = additional_data(erlang:iolist_size(Plaintext) + 16), %% TagLen = 16
+ {OTP, Key} = make_otp_key(Shard),
+ {Content, CipherTag} = crypto:crypto_one_time_aead(aes_256_gcm, Key, IV, Plaintext, AAD, 16, true),
+ <<Content/binary,CipherTag/binary,OTP/binary>>.
+
+
+decrypt_ticket_data(CipherFragment, Shard, IV) ->
+ Size = byte_size(Shard),
+ AAD = additional_data(erlang:iolist_size(CipherFragment) - Size),
+ Len = byte_size(CipherFragment) - Size - 16,
+ <<Encrypted:Len/binary,CipherTag:16/binary,OTP:Size/binary>> = CipherFragment,
+ Key = crypto:exor(OTP, Shard),
+ crypto:crypto_one_time_aead(aes_256_gcm, Key, IV, Encrypted, AAD, CipherTag, false).
+
+
+additional_data(Length) ->
+ <<"ticket",?UINT16(Length)>>.
+
+
+make_otp_key(Shard) ->
+ Size = byte_size(Shard),
+ OTP = crypto:strong_rand_bytes(Size),
+ Key = crypto:exor(OTP, Shard),
+ {OTP, Key}.
diff --git a/lib/ssl/src/ssl_cipher.hrl b/lib/ssl/src/ssl_cipher.hrl
index 0fa5f66c49..150d37ef18 100644
--- a/lib/ssl/src/ssl_cipher.hrl
+++ b/lib/ssl/src/ssl_cipher.hrl
@@ -27,6 +27,16 @@
-ifndef(ssl_cipher).
-define(ssl_cipher, true).
+%%% Session tickets %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-record(stateless_ticket,
+ {
+ hash,
+ pre_shared_key,
+ ticket_age_add,
+ lifetime,
+ timestamp
+ }).
+
%%% SSL cipher protocol %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-define(CHANGE_CIPHER_SPEC_PROTO, 1). % _PROTO to not clash with
% SSL record protocol
diff --git a/lib/ssl/src/ssl_connection.erl b/lib/ssl/src/ssl_connection.erl
index 6789c2c23f..9ef66bfb26 100644
--- a/lib/ssl/src/ssl_connection.erl
+++ b/lib/ssl/src/ssl_connection.erl
@@ -178,24 +178,24 @@ socket_control(Connection, Socket, Pid, Transport) ->
socket_control(Connection, Socket, Pid, Transport, undefined).
%--------------------------------------------------------------------
--spec socket_control(tls_connection | dtls_connection, port(), [pid()], atom(), pid()| atom()) ->
+-spec socket_control(tls_connection | dtls_connection, port(), [pid()], atom(), [pid()] | atom()) ->
{ok, #sslsocket{}} | {error, reason()}.
%%--------------------------------------------------------------------
socket_control(Connection, Socket, Pids, Transport, udp_listener) ->
%% dtls listener process must have the socket control
{ok, Connection:socket(Pids, Transport, Socket, undefined)};
-socket_control(tls_connection = Connection, Socket, [Pid|_] = Pids, Transport, ListenTracker) ->
+socket_control(tls_connection = Connection, Socket, [Pid|_] = Pids, Transport, Trackers) ->
case Transport:controlling_process(Socket, Pid) of
ok ->
- {ok, Connection:socket(Pids, Transport, Socket, ListenTracker)};
+ {ok, Connection:socket(Pids, Transport, Socket, Trackers)};
{error, Reason} ->
{error, Reason}
end;
-socket_control(dtls_connection = Connection, {_, Socket}, [Pid|_] = Pids, Transport, ListenTracker) ->
+socket_control(dtls_connection = Connection, {_, Socket}, [Pid|_] = Pids, Transport, Trackers) ->
case Transport:controlling_process(Socket, Pid) of
ok ->
- {ok, Connection:socket(Pids, Transport, Socket, ListenTracker)};
+ {ok, Connection:socket(Pids, Transport, Socket, Trackers)};
{error, Reason} ->
{error, Reason}
end.
@@ -350,29 +350,29 @@ handle_normal_shutdown(Alert, StateName, #state{static_env = #static_env{role =
socket = Socket,
transport_cb = Transport,
protocol_cb = Connection,
- tracker = Tracker},
+ trackers = Trackers},
handshake_env = #handshake_env{renegotiation = {false, first}},
start_or_recv_from = StartFrom} = State) ->
Pids = Connection:pids(State),
- alert_user(Pids, Transport, Tracker,Socket, StartFrom, Alert, Role, StateName, Connection);
+ alert_user(Pids, Transport, Trackers, Socket, StartFrom, Alert, Role, StateName, Connection);
handle_normal_shutdown(Alert, StateName, #state{static_env = #static_env{role = Role,
socket = Socket,
transport_cb = Transport,
protocol_cb = Connection,
- tracker = Tracker},
+ trackers = Trackers},
connection_env = #connection_env{user_application = {_Mon, Pid}},
socket_options = Opts,
start_or_recv_from = RecvFrom} = State) ->
Pids = Connection:pids(State),
- alert_user(Pids, Transport, Tracker, Socket, StateName, Opts, Pid, RecvFrom, Alert, Role, StateName, Connection).
+ alert_user(Pids, Transport, Trackers, Socket, StateName, Opts, Pid, RecvFrom, Alert, Role, StateName, Connection).
handle_alert(#alert{level = ?FATAL} = Alert0, StateName,
#state{static_env = #static_env{role = Role,
socket = Socket,
host = Host,
port = Port,
- tracker = Tracker,
+ trackers = Trackers,
transport_cb = Transport,
protocol_cb = Connection},
connection_env = #connection_env{user_application = {_Mon, Pid}},
@@ -385,7 +385,7 @@ handle_alert(#alert{level = ?FATAL} = Alert0, StateName,
log_alert(LogLevel, Role, Connection:protocol_name(),
StateName, Alert),
Pids = Connection:pids(State),
- alert_user(Pids, Transport, Tracker, Socket, StateName, Opts, Pid, From, Alert, Role, StateName, Connection),
+ alert_user(Pids, Transport, Trackers, Socket, StateName, Opts, Pid, From, Alert, Role, StateName, Connection),
{stop, {shutdown, normal}, State};
handle_alert(#alert{level = ?WARNING, description = ?CLOSE_NOTIFY} = Alert,
@@ -444,19 +444,22 @@ handle_alert(#alert{level = ?WARNING} = Alert, StateName,
%%====================================================================
%% Data handling
%%====================================================================
-passive_receive(State0 = #state{user_data_buffer = {_,BufferSize,_}}, StateName, Connection, StartTimerAction) ->
+passive_receive(#state{user_data_buffer = {Front,BufferSize,Rear},
+ %% Assert! Erl distribution uses active sockets
+ connection_env = #connection_env{erl_dist_handle = undefined}}
+ = State0, StateName, Connection, StartTimerAction) ->
case BufferSize of
0 ->
Connection:next_event(StateName, no_record, State0, StartTimerAction);
_ ->
- case read_application_data(<<>>, State0) of
+ case read_application_data(State0, Front, BufferSize, Rear) of
{stop, _, _} = ShutdownError ->
ShutdownError;
{Record, State} ->
case State#state.start_or_recv_from of
undefined ->
%% Cancel recv timeout as data has been delivered
- Connection:next_event(StateName, Record, State,
+ Connection:next_event(StateName, Record, State,
[{{timeout, recv}, infinity, timeout}]);
_ ->
Connection:next_event(StateName, Record, State, StartTimerAction)
@@ -556,13 +559,13 @@ read_application_data_bin(State, Front0, BufferSize0, Rear0, SocketOpts0, RecvFr
socket = Socket,
protocol_cb = Connection,
transport_cb = Transport,
- tracker = Tracker},
+ trackers = Trackers},
connection_env =
#connection_env{user_application = {_Mon, Pid}}} = State,
Buffer = iolist_to_binary([Bin0,Front0|lists:reverse(Rear0)]),
deliver_packet_error(
Connection:pids(State), Transport, Socket, SocketOpts0,
- Buffer, Pid, RecvFrom, Tracker, Connection),
+ Buffer, Pid, RecvFrom, Trackers, Connection),
{stop, {shutdown, normal}, State#state{socket_options = SocketOpts0,
bytes_to_read = BytesToRead,
start_or_recv_from = RecvFrom,
@@ -576,12 +579,12 @@ read_application_data_deliver(State, Front, BufferSize, Rear, SocketOpts0, RecvF
socket = Socket,
protocol_cb = Connection,
transport_cb = Transport,
- tracker = Tracker},
+ trackers = Trackers},
connection_env =
#connection_env{user_application = {_Mon, Pid}}} = State,
SocketOpts =
deliver_app_data(
- Connection:pids(State), Transport, Socket, SocketOpts0, Data, Pid, RecvFrom, Tracker, Connection),
+ Connection:pids(State), Transport, Socket, SocketOpts0, Data, Pid, RecvFrom, Trackers, Connection),
if
SocketOpts#socket_options.active =:= false ->
%% Passive mode, wait for active once or recv
@@ -821,7 +824,7 @@ init({call, From}, {start, {Opts, EmOpts}, Timeout},
ssl_options = OrigSSLOptions,
socket_options = SockOpts} = State0, Connection) ->
try
- SslOpts = ssl:handle_options(Opts, OrigSSLOptions),
+ SslOpts = ssl:handle_options(Opts, Role, OrigSSLOptions),
State = ssl_config(SslOpts, Role, State0),
init({call, From}, {start, Timeout},
State#state{ssl_options = SslOpts,
@@ -870,7 +873,7 @@ user_hello({call, From}, {handshake_continue, NewOptions, Timeout},
#state{static_env = #static_env{role = Role},
handshake_env = #handshake_env{hello = Hello},
ssl_options = Options0} = State0, _Connection) ->
- Options = ssl:handle_options(NewOptions, Options0#{handshake => full}),
+ Options = ssl:handle_options(NewOptions, Role, Options0#{handshake => full}),
State = ssl_config(Options, Role, State0),
{next_state, hello, State#state{start_or_recv_from = From},
[{next_event, internal, Hello}, {{timeout, handshake}, Timeout, close}]};
@@ -965,7 +968,7 @@ certify(internal, #certificate{asn1_certificates = []},
ssl_options = #{verify := verify_peer,
fail_if_no_peer_cert := true}} =
State, _) ->
- Alert = ?ALERT_REC(?FATAL,?HANDSHAKE_FAILURE),
+ Alert = ?ALERT_REC(?FATAL,?HANDSHAKE_FAILURE, no_client_certificate_provided),
handle_own_alert(Alert, Version, ?FUNCTION_NAME, State);
certify(internal, #certificate{asn1_certificates = []},
#state{static_env = #static_env{role = server},
@@ -1434,7 +1437,7 @@ handle_call({get_opts, OptTags}, From, _,
handle_call({set_opts, Opts0}, From, StateName,
#state{static_env = #static_env{socket = Socket,
transport_cb = Transport,
- tracker = Tracker},
+ trackers = Trackers},
connection_env =
#connection_env{user_application = {_Mon, Pid}},
socket_options = Opts1
@@ -1445,7 +1448,7 @@ handle_call({set_opts, Opts0}, From, StateName,
send_user(
Pid,
format_passive(
- Connection:pids(State0), Transport, Socket, Tracker, Connection));
+ Connection:pids(State0), Transport, Socket, Trackers, Connection));
_ ->
ok
end,
@@ -1488,19 +1491,20 @@ handle_info({ErrorTag, Socket, econnaborted}, StateName,
socket = Socket,
transport_cb = Transport,
error_tag = ErrorTag,
- tracker = Tracker,
+ trackers = Trackers,
protocol_cb = Connection},
start_or_recv_from = StartFrom
} = State) when StateName =/= connection ->
Pids = Connection:pids(State),
- alert_user(Pids, Transport, Tracker,Socket,
+ alert_user(Pids, Transport, Trackers,Socket,
StartFrom, ?ALERT_REC(?FATAL, ?CLOSE_NOTIFY), Role, StateName, Connection),
{stop, {shutdown, normal}, State};
handle_info({ErrorTag, Socket, Reason}, StateName, #state{static_env = #static_env{socket = Socket,
- error_tag = ErrorTag}} = State) ->
- Report = io_lib:format("SSL: Socket error: ~p ~n", [Reason]),
- ?LOG_ERROR(Report),
+ error_tag = ErrorTag},
+ ssl_options = #{log_level := Level}} = State) ->
+ ssl_logger:log(info, Level, #{description => "Socket error",
+ reason => [{error_tag, ErrorTag}, {description, Reason}]}, ?LOCATION),
handle_normal_shutdown(?ALERT_REC(?FATAL, ?CLOSE_NOTIFY), StateName, State),
{stop, {shutdown,normal}, State};
@@ -1528,9 +1532,11 @@ handle_info({'EXIT', Socket, Reason}, _StateName, #state{static_env = #static_en
handle_info(allow_renegotiate, StateName, #state{handshake_env = HsEnv} = State) ->
{next_state, StateName, State#state{handshake_env = HsEnv#handshake_env{allow_renegotiate = true}}};
-handle_info(Msg, StateName, #state{static_env = #static_env{socket = Socket, error_tag = Tag}} = State) ->
- Report = io_lib:format("SSL: Got unexpected info: ~p ~n", [{Msg, Tag, Socket}]),
- ?LOG_NOTICE(Report),
+handle_info(Msg, StateName, #state{static_env = #static_env{socket = Socket, error_tag = ErrorTag},
+ ssl_options = #{log_level := Level}} = State) ->
+ ssl_logger:log(notice, Level, #{description => "Unexpected INFO message",
+ reason => [{message, Msg}, {socket, Socket},
+ {error_tag, ErrorTag}]}, ?LOCATION),
{next_state, StateName, State}.
%%====================================================================
@@ -1616,7 +1622,8 @@ send_alert(Alert, _, #state{static_env = #static_env{protocol_cb = Connection}}
Connection:send_alert(Alert, State).
connection_info(#state{static_env = #static_env{protocol_cb = Connection},
- handshake_env = #handshake_env{sni_hostname = SNIHostname},
+ handshake_env = #handshake_env{sni_hostname = SNIHostname,
+ resumption = Resumption},
session = #session{session_id = SessionId,
cipher_suite = CipherSuite, ecc = ECCCurve},
connection_env = #connection_env{negotiated_version = {_,_} = Version},
@@ -1633,6 +1640,7 @@ connection_info(#state{static_env = #static_env{protocol_cb = Connection},
end,
[{protocol, RecordCB:protocol_version(Version)},
{session_id, SessionId},
+ {session_resumption, Resumption},
{cipher_suite, ssl_cipher_format:suite_legacy(CipherSuiteDef)},
{selected_cipher_suite, CipherSuiteDef},
{sni_hostname, SNIHostname} | CurveInfo] ++ ssl_options_list(Opts).
@@ -2863,12 +2871,12 @@ decode_packet(Type, Buffer, PacketOpts) ->
deliver_app_data(
CPids, Transport, Socket,
#socket_options{active=Active, packet=Type} = SOpts,
- Data, Pid, From, Tracker, Connection) ->
+ Data, Pid, From, Trackers, Connection) ->
%%
send_or_reply(
Active, Pid, From,
format_reply(
- CPids, Transport, Socket, SOpts, Data, Tracker, Connection)),
+ CPids, Transport, Socket, SOpts, Data, Trackers, Connection)),
SO =
case Data of
{P, _, _, _}
@@ -2889,7 +2897,7 @@ deliver_app_data(
send_user(
Pid,
format_passive(
- CPids, Transport, Socket, Tracker, Connection)),
+ CPids, Transport, Socket, Trackers, Connection)),
SO#socket_options{active=false};
N when is_integer(N) ->
SO#socket_options{active=N - 1};
@@ -2901,20 +2909,20 @@ format_reply(_, _, _,#socket_options{active = false, mode = Mode, packet = Packe
header = Header}, Data, _, _) ->
{ok, do_format_reply(Mode, Packet, Header, Data)};
format_reply(CPids, Transport, Socket, #socket_options{active = _, mode = Mode, packet = Packet,
- header = Header}, Data, Tracker, Connection) ->
- {ssl, Connection:socket(CPids, Transport, Socket, Tracker),
+ header = Header}, Data, Trackers, Connection) ->
+ {ssl, Connection:socket(CPids, Transport, Socket, Trackers),
do_format_reply(Mode, Packet, Header, Data)}.
deliver_packet_error(CPids, Transport, Socket,
- SO= #socket_options{active = Active}, Data, Pid, From, Tracker, Connection) ->
+ SO= #socket_options{active = Active}, Data, Pid, From, Trackers, Connection) ->
send_or_reply(Active, Pid, From, format_packet_error(CPids,
- Transport, Socket, SO, Data, Tracker, Connection)).
+ Transport, Socket, SO, Data, Trackers, Connection)).
format_packet_error(_, _, _,#socket_options{active = false, mode = Mode}, Data, _, _) ->
{error, {invalid_packet, do_format_reply(Mode, raw, 0, Data)}};
format_packet_error(CPids, Transport, Socket, #socket_options{active = _, mode = Mode},
- Data, Tracker, Connection) ->
- {ssl_error, Connection:socket(CPids, Transport, Socket, Tracker),
+ Data, Trackers, Connection) ->
+ {ssl_error, Connection:socket(CPids, Transport, Socket, Trackers),
{invalid_packet, do_format_reply(Mode, raw, 0, Data)}}.
do_format_reply(binary, _, N, Data) when N > 0 -> % Header mode
@@ -2929,8 +2937,8 @@ do_format_reply(list, Packet, _, Data)
do_format_reply(list, _,_, Data) ->
binary_to_list(Data).
-format_passive(CPids, Transport, Socket, Tracker, Connection) ->
- {ssl_passive, Connection:socket(CPids, Transport, Socket, Tracker)}.
+format_passive(CPids, Transport, Socket, Trackers, Connection) ->
+ {ssl_passive, Connection:socket(CPids, Transport, Socket, Trackers)}.
header(0, <<>>) ->
<<>>;
@@ -2955,13 +2963,13 @@ send_user(Pid, Msg) ->
Pid ! Msg,
ok.
-alert_user(Pids, Transport, Tracker, Socket, connection, Opts, Pid, From, Alert, Role, StateName, Connection) ->
- alert_user(Pids, Transport, Tracker, Socket, Opts#socket_options.active, Pid, From, Alert, Role, StateName, Connection);
-alert_user(Pids, Transport, Tracker, Socket,_, _, _, From, Alert, Role, StateName, Connection) ->
- alert_user(Pids, Transport, Tracker, Socket, From, Alert, Role, StateName, Connection).
+alert_user(Pids, Transport, Trackers, Socket, connection, Opts, Pid, From, Alert, Role, StateName, Connection) ->
+ alert_user(Pids, Transport, Trackers, Socket, Opts#socket_options.active, Pid, From, Alert, Role, StateName, Connection);
+alert_user(Pids, Transport, Trackers, Socket,_, _, _, From, Alert, Role, StateName, Connection) ->
+ alert_user(Pids, Transport, Trackers, Socket, From, Alert, Role, StateName, Connection).
-alert_user(Pids, Transport, Tracker, Socket, From, Alert, Role, StateName, Connection) ->
- alert_user(Pids, Transport, Tracker, Socket, false, no_pid, From, Alert, Role, StateName, Connection).
+alert_user(Pids, Transport, Trackers, Socket, From, Alert, Role, StateName, Connection) ->
+ alert_user(Pids, Transport, Trackers, Socket, false, no_pid, From, Alert, Role, StateName, Connection).
alert_user(_, _, _, _, false = Active, Pid, From, Alert, Role, StateName, Connection) when From =/= undefined ->
%% If there is an outstanding ssl_accept | recv
@@ -2969,24 +2977,28 @@ alert_user(_, _, _, _, false = Active, Pid, From, Alert, Role, StateName, Conne
%% send the appropriate error message.
ReasonCode = ssl_alert:reason_code(Alert, Role, Connection:protocol_name(), StateName),
send_or_reply(Active, Pid, From, {error, ReasonCode});
-alert_user(Pids, Transport, Tracker, Socket, Active, Pid, From, Alert, Role, StateName, Connection) ->
+alert_user(Pids, Transport, Trackers, Socket, Active, Pid, From, Alert, Role, StateName, Connection) ->
case ssl_alert:reason_code(Alert, Role, Connection:protocol_name(), StateName) of
closed ->
send_or_reply(Active, Pid, From,
- {ssl_closed, Connection:socket(Pids, Transport, Socket, Tracker)});
+ {ssl_closed, Connection:socket(Pids, Transport, Socket, Trackers)});
ReasonCode ->
send_or_reply(Active, Pid, From,
- {ssl_error, Connection:socket(Pids, Transport, Socket, Tracker), ReasonCode})
+ {ssl_error, Connection:socket(Pids, Transport, Socket, Trackers), ReasonCode})
end.
log_alert(Level, Role, ProtocolName, StateName, #alert{role = Role} = Alert) ->
- Txt = ssl_alert:own_alert_txt(Alert),
- Report = ssl_alert:alert_txt(ProtocolName, Role, StateName, Txt),
- ssl_logger:notice(Level, Report);
-log_alert(Level, Role, ProtocolName, StateName, Alert) ->
- Txt = ssl_alert:alert_txt(Alert),
- Report = ssl_alert:alert_txt(ProtocolName, Role, StateName, Txt),
- ssl_logger:notice(Level, Report).
+ ssl_logger:log(notice, Level, #{protocol => ProtocolName,
+ role => Role,
+ statename => StateName,
+ alert => Alert,
+ alerter => own}, Alert#alert.where);
+log_alert(Level, Role, ProtocolName, StateName, Alert) ->
+ ssl_logger:log(notice, Level, #{protocol => ProtocolName,
+ role => Role,
+ statename => StateName,
+ alert => Alert,
+ alerter => peer}, Alert#alert.where).
invalidate_session(client, Host, Port, Session) ->
ssl_manager:invalidate_session(Host, Port, Session);
@@ -3042,7 +3054,7 @@ update_ssl_options_from_sni(#{sni_fun := SNIFun,
undefined ->
undefined;
_ ->
- ssl:handle_options(SSLOption, OrigSSLOptions)
+ ssl:handle_options(SSLOption, server, OrigSSLOptions)
end.
new_emulated([], EmOpts) ->
diff --git a/lib/ssl/src/ssl_connection.hrl b/lib/ssl/src/ssl_connection.hrl
index be94fd05bb..284ded64d8 100644
--- a/lib/ssl/src/ssl_connection.hrl
+++ b/lib/ssl/src/ssl_connection.hrl
@@ -50,9 +50,10 @@
crl_db :: term(),
file_ref_db :: db_handle(),
cert_db_ref :: certdb_ref() | 'undefined',
- tracker :: pid() | 'undefined' %% Tracker process for listen socket
+ trackers :: [{atom(), pid()}] | 'undefined' %% Tracker process for listen socket
}).
+
-record(handshake_env, {
client_hello_version :: ssl_record:ssl_version() | 'undefined',
unprocessed_handshake_events = 0 :: integer(),
@@ -60,6 +61,7 @@
| 'undefined',
expecting_finished = false ::boolean(),
renegotiation :: undefined | {boolean(), From::term() | internal | peer},
+ resumption = false :: boolean(), %% TLS 1.3
allow_renegotiate = true ::boolean(),
%% Ext handling
hello, %%:: #client_hello{} | #server_hello{}
@@ -77,7 +79,8 @@
srp_params :: #srp_user{} | secret_printout() | 'undefined',
public_key_info :: ssl_handshake:public_key_info() | 'undefined',
premaster_secret :: binary() | secret_printout() | 'undefined',
- server_psk_identity :: binary() | 'undefined' % server psk identity hint
+ server_psk_identity :: binary() | 'undefined', % server psk identity hint
+ ticket_seed
}).
-record(connection_env, {
diff --git a/lib/ssl/src/ssl_connection_sup.erl b/lib/ssl/src/ssl_connection_sup.erl
index 934dd39df5..d43254d23a 100644
--- a/lib/ssl/src/ssl_connection_sup.erl
+++ b/lib/ssl/src/ssl_connection_sup.erl
@@ -45,57 +45,31 @@ start_link() ->
init([]) ->
- TLSConnetionManager = tls_connection_manager_child_spec(),
- %% Handles emulated options so that they inherited by the accept
- %% socket, even when setopts is performed on the listen socket
- ListenOptionsTracker = listen_options_tracker_child_spec(),
-
- DTLSConnetionManager = dtls_connection_manager_child_spec(),
- DTLSListeners = dtls_listeners_spec(),
+ TLSSup = tls_sup_child_spec(),
+ DTLSSup = dtls_sup_child_spec(),
- {ok, {{one_for_one, 10, 3600}, [TLSConnetionManager,
- ListenOptionsTracker,
- DTLSConnetionManager,
- DTLSListeners
- ]}}.
+ {ok, {{one_for_one, 10, 3600}, [TLSSup, DTLSSup]}}.
%%--------------------------------------------------------------------
%%% Internal functions
%%--------------------------------------------------------------------
-tls_connection_manager_child_spec() ->
- Name = tls_connection,
- StartFunc = {tls_connection_sup, start_link, []},
+tls_sup_child_spec() ->
+ Name = tls_sup,
+ StartFunc = {tls_sup, start_link, []},
Restart = permanent,
Shutdown = 4000,
- Modules = [tls_connection_sup],
+ Modules = [tls_sup],
Type = supervisor,
{Name, StartFunc, Restart, Shutdown, Type, Modules}.
-dtls_connection_manager_child_spec() ->
- Name = dtls_connection,
- StartFunc = {dtls_connection_sup, start_link, []},
+dtls_sup_child_spec() ->
+ Name = dtls_sup,
+ StartFunc = {dtls_sup, start_link, []},
Restart = permanent,
Shutdown = 4000,
- Modules = [dtls_connection_sup],
- Type = supervisor,
- {Name, StartFunc, Restart, Shutdown, Type, Modules}.
-
-listen_options_tracker_child_spec() ->
- Name = tls_socket,
- StartFunc = {ssl_listen_tracker_sup, start_link, []},
- Restart = permanent,
- Shutdown = 4000,
- Modules = [tls_socket],
+ Modules = [dtls_sup],
Type = supervisor,
{Name, StartFunc, Restart, Shutdown, Type, Modules}.
-dtls_listeners_spec() ->
- Name = dtls_listener,
- StartFunc = {dtls_listener_sup, start_link, []},
- Restart = permanent,
- Shutdown = 4000,
- Modules = [],
- Type = supervisor,
- {Name, StartFunc, Restart, Shutdown, Type, Modules}.
diff --git a/lib/ssl/src/ssl_crl_cache.erl b/lib/ssl/src/ssl_crl_cache.erl
index 841620ce57..2dc538c251 100644
--- a/lib/ssl/src/ssl_crl_cache.erl
+++ b/lib/ssl/src/ssl_crl_cache.erl
@@ -46,6 +46,12 @@ lookup(#'DistributionPoint'{distributionPoint = {fullName, Names}},
lookup(_,_,_) ->
not_available.
+select(GenNames, CRLDbHandle) when is_list(GenNames) ->
+ lists:flatmap(fun({directoryName, Issuer}) ->
+ select(Issuer, CRLDbHandle);
+ (_) ->
+ []
+ end, GenNames);
select(Issuer, {{_Cache, Mapping},_}) ->
case ssl_pkix_db:lookup(Issuer, Mapping) of
undefined ->
diff --git a/lib/ssl/src/ssl_crl_cache_api.erl b/lib/ssl/src/ssl_crl_cache_api.erl
index 8a750b3929..0c7842dc4b 100644
--- a/lib/ssl/src/ssl_crl_cache_api.erl
+++ b/lib/ssl/src/ssl_crl_cache_api.erl
@@ -23,13 +23,16 @@
-module(ssl_crl_cache_api).
-include_lib("public_key/include/public_key.hrl").
--export_type([dist_point/0, crl_cache_ref/0]).
+-export_type([dist_point/0, crl_cache_ref/0, logger_info/0]).
-type crl_cache_ref() :: any().
-type issuer_name() :: {rdnSequence,[#'AttributeTypeAndValue'{}]}.
-type dist_point() :: #'DistributionPoint'{}.
+-type logger_info() :: {logger:level(), Report::#{description => string(), reason => term()}, logger:metadata()}.
-
--callback lookup(dist_point(), issuer_name(), crl_cache_ref()) -> not_available | [public_key:der_encoded()].
--callback select(issuer_name(), crl_cache_ref()) -> [public_key:der_encoded()].
--callback fresh_crl(dist_point(), public_key:der_encoded()) -> public_key:der_encoded().
+-callback lookup(dist_point(), issuer_name(), crl_cache_ref()) -> not_available | [public_key:der_encoded()] |
+ {{logger, logger_info()}, [public_key:der_encoded()]}.
+-callback select(issuer_name() | list(), crl_cache_ref()) -> [public_key:der_encoded()] |
+ {logger, logger_info(), [public_key:der_encoded()]}.
+-callback fresh_crl(dist_point(), public_key:der_encoded()) -> public_key:der_encoded() |
+ {logger, logger_info(), public_key:der_encoded()}.
diff --git a/lib/ssl/src/ssl_crl_hash_dir.erl b/lib/ssl/src/ssl_crl_hash_dir.erl
index 9478ff9b78..635b82ed1e 100644
--- a/lib/ssl/src/ssl_crl_hash_dir.erl
+++ b/lib/ssl/src/ssl_crl_hash_dir.erl
@@ -27,72 +27,65 @@
-export([lookup/3, select/2, fresh_crl/2]).
lookup(#'DistributionPoint'{cRLIssuer = CRLIssuer} = DP, CertIssuer, CRLDbInfo) ->
- Issuer =
- case CRLIssuer of
- asn1_NOVALUE ->
- %% If the distribution point extension doesn't
- %% indicate a CRL issuer, use the certificate issuer.
- CertIssuer;
- _ ->
- CRLIssuer
- end,
- %% Find all CRLs for this issuer, and return those that match the
- %% given distribution point.
- AllCRLs = select(Issuer, CRLDbInfo),
- lists:filter(fun(DER) ->
- public_key:pkix_match_dist_point(DER, DP)
- end, AllCRLs).
+ case CRLIssuer of
+ asn1_NOVALUE ->
+ %% If the distribution point extension doesn't
+ %% indicate a CRL issuer, use the certificate issuer.
+ select(CertIssuer, CRLDbInfo);
+ _ ->
+ CRLs = select(CRLIssuer, CRLDbInfo),
+ lists:filter(fun(DER) ->
+ public_key:pkix_match_dist_point(DER, DP)
+ end, CRLs)
+ end.
fresh_crl(#'DistributionPoint'{}, CurrentCRL) ->
CurrentCRL.
-select(Issuer, {_DbHandle, [{dir, Dir}]}) ->
- case find_crls(Issuer, Dir) of
- [_|_] = DERs ->
- DERs;
- [] ->
- %% That's okay, just report that we didn't find any CRL.
- %% If the crl_check setting is best_effort, ssl_handshake
- %% is happy with that, but if it's true, this is an error.
- [];
+select({rdnSequence, _} = Issuer, DbHandle) ->
+ select([{directoryName, Issuer}], DbHandle);
+select([], _) ->
+ [];
+select([{directoryName, Issuer} | _], {_DbHandle, [{dir, Dir}]}) ->
+ case find_crls(public_key:pkix_normalize_name(Issuer), Dir) of
+ {#{reason := []}, DERs} ->
+ DERs;
+ {#{reason := [_|_]} = Report, DERs} ->
+ {logger, {notice, Report, ?LOCATION}, DERs};
{error, Error} ->
- ?LOG_ERROR(
- [{cannot_find_crl, Error},
- {dir, Dir},
- {module, ?MODULE},
- {line, ?LINE}]),
- []
- end.
+ {logger, {error, #{description => "CRL retrival",
+ reason => [{cannot_find_crl, Error},
+ {dir, Dir}]}, ?LOCATION}, []}
+ end;
+select([_ | Rest], CRLDbInfo) ->
+ select(Rest, CRLDbInfo).
find_crls(Issuer, Dir) ->
case filelib:is_dir(Dir) of
true ->
Hash = public_key:short_name_hash(Issuer),
- find_crls(Issuer, Hash, Dir, 0, []);
+ find_crls(Issuer, Hash, Dir, 0, [], #{description => "CRL file traversal",
+ reason => []});
false ->
{error, not_a_directory}
end.
-find_crls(Issuer, Hash, Dir, N, Acc) ->
+find_crls(Issuer, Hash, Dir, N, Acc, #{reason := Reason} = Report) ->
Filename = filename:join(Dir, Hash ++ ".r" ++ integer_to_list(N)),
case file:read_file(Filename) of
{error, enoent} ->
- Acc;
- {ok, Bin} ->
+ {Report, Acc};
+ {ok, Bin} ->
try maybe_parse_pem(Bin) of
DER when is_binary(DER) ->
%% Found one file. Let's see if there are more.
- find_crls(Issuer, Hash, Dir, N + 1, [DER] ++ Acc)
+ find_crls(Issuer, Hash, Dir, N + 1, [DER] ++ Acc, Report)
catch
error:Error ->
%% Something is wrong with the file. Report
%% it, and try the next one.
- ?LOG_ERROR(
- [{crl_parse_error, Error},
- {filename, Filename},
- {module, ?MODULE},
- {line, ?LINE}]),
- find_crls(Issuer, Hash, Dir, N + 1, Acc)
+ find_crls(Issuer, Hash, Dir, N + 1, Acc, Report#{reason => [{{crl_parse_error, Error},
+ {filename, Filename}} | Reason]})
end
end.
diff --git a/lib/ssl/src/ssl_handshake.erl b/lib/ssl/src/ssl_handshake.erl
index 1c8a2ca452..ecbe905d28 100644
--- a/lib/ssl/src/ssl_handshake.erl
+++ b/lib/ssl/src/ssl_handshake.erl
@@ -72,7 +72,7 @@
premaster_secret/2, premaster_secret/3, premaster_secret/4]).
%% Extensions handling
--export([client_hello_extensions/6,
+-export([client_hello_extensions/7,
handle_client_hello_extensions/9, %% Returns server hello extensions
handle_server_hello_extensions/9, select_curve/2, select_curve/3,
select_hashsign/4, select_hashsign/5,
@@ -82,7 +82,7 @@
-export([get_cert_params/1,
server_name/3,
- validation_fun_and_state/9,
+ validation_fun_and_state/10,
handle_path_validation_error/7]).
%%====================================================================
@@ -343,12 +343,13 @@ next_protocol(SelectedProtocol) ->
%%--------------------------------------------------------------------
certify(#certificate{asn1_certificates = ASN1Certs}, CertDbHandle, CertDbRef,
#{server_name_indication := ServerNameIndication,
- partial_chain := PartialChain,
- verify_fun := VerifyFun,
- customize_hostname_check := CustomizeHostnameCheck,
- crl_check := CrlCheck,
- depth := Depth} = Opts, CRLDbHandle, Role, Host) ->
-
+ partial_chain := PartialChain,
+ verify_fun := VerifyFun,
+ customize_hostname_check := CustomizeHostnameCheck,
+ crl_check := CrlCheck,
+ log_level := Level,
+ depth := Depth} = Opts, CRLDbHandle, Role, Host) ->
+
ServerName = server_name(ServerNameIndication, Host, Role),
[PeerCert | ChainCerts ] = ASN1Certs,
try
@@ -358,7 +359,7 @@ certify(#certificate{asn1_certificates = ASN1Certs}, CertDbHandle, CertDbRef,
ValidationFunAndState = validation_fun_and_state(VerifyFun, Role,
CertDbHandle, CertDbRef, ServerName,
CustomizeHostnameCheck,
- CrlCheck, CRLDbHandle, CertPath),
+ CrlCheck, CRLDbHandle, CertPath, Level),
Options = [{max_path_length, Depth},
{verify_fun, ValidationFunAndState}],
case public_key:pkix_path_validation(TrustedCert, CertPath, Options) of
@@ -369,7 +370,7 @@ certify(#certificate{asn1_certificates = ASN1Certs}, CertDbHandle, CertDbRef,
CertDbHandle, CertDbRef)
end
catch
- error:{badmatch,{error, {asn1, Asn1Reason}}} ->
+ error:{_,{error, {asn1, Asn1Reason}}} ->
%% ASN-1 decode of certificate somehow failed
?ALERT_REC(?FATAL, ?CERTIFICATE_UNKNOWN, {failed_to_decode_certificate, Asn1Reason});
error:OtherReason ->
@@ -724,12 +725,16 @@ encode_extensions([#psk_key_exchange_modes{ke_modes = KEModes0} | Rest], Acc) ->
encode_extensions([#pre_shared_key_client_hello{
offered_psks = #offered_psks{
identities = Identities0,
- binders = Binders0} = PSKs} | Rest], Acc) ->
+ binders = Binders0} = _PSKs} | Rest], Acc) ->
Identities = encode_psk_identities(Identities0),
Binders = encode_psk_binders(Binders0),
Len = byte_size(Identities) + byte_size(Binders),
- encode_extensions(Rest, <<?UINT16(?PRE_SHARED_KEY_EXT),
- ?UINT16(Len), Identities/binary, Binders/binary, Acc/binary>>);
+ %% The "pre_shared_key" extension MUST be the last extension in the
+ %% ClientHello (this facilitates implementation as described below).
+ %% Servers MUST check that it is the last extension and otherwise fail
+ %% the handshake with an "illegal_parameter" alert.
+ encode_extensions(Rest, <<Acc/binary,?UINT16(?PRE_SHARED_KEY_EXT),
+ ?UINT16(Len), Identities/binary, Binders/binary>>);
encode_extensions([#pre_shared_key_server_hello{selected_identity = Identity} | Rest], Acc) ->
encode_extensions(Rest, <<?UINT16(?PRE_SHARED_KEY_EXT),
?UINT16(2), ?UINT16(Identity), Acc/binary>>).
@@ -952,9 +957,9 @@ select_session(SuggestedSessionId, CipherSuites, HashSigns, Compressions, Port,
Session, Version,
#{ciphers := UserSuites, honor_cipher_order := HonorCipherOrder} = SslOpts,
Cache, CacheCb, Cert) ->
- {SessionId, Resumed} = ssl_session:server_id(Port, SuggestedSessionId,
- SslOpts, Cert,
- Cache, CacheCb),
+ {SessionId, Resumed} = ssl_session:server_select_session(Version, Port, SuggestedSessionId,
+ SslOpts, Cert,
+ Cache, CacheCb),
case Resumed of
undefined ->
Suites = available_suites(Cert, UserSuites, Version, HashSigns, ECCCurve0),
@@ -1069,10 +1074,11 @@ premaster_secret(EncSecret, #{algorithm := rsa} = Engine) ->
%%====================================================================
%% Extensions handling
%%====================================================================
-client_hello_extensions(Version, CipherSuites, SslOpts, ConnectionStates, Renegotiation, KeyShare) ->
+client_hello_extensions(Version, CipherSuites, SslOpts, ConnectionStates, Renegotiation, KeyShare,
+ TicketData) ->
HelloExtensions0 = add_tls12_extensions(Version, SslOpts, ConnectionStates, Renegotiation),
HelloExtensions1 = add_common_extensions(Version, HelloExtensions0, CipherSuites, SslOpts),
- maybe_add_tls13_extensions(Version, HelloExtensions1, SslOpts, KeyShare).
+ maybe_add_tls13_extensions(Version, HelloExtensions1, SslOpts, KeyShare, TicketData).
add_tls12_extensions(_Version,
@@ -1129,14 +1135,16 @@ maybe_add_tls13_extensions({3,4},
HelloExtensions0,
#{signature_algs_cert := SignatureSchemes,
versions := SupportedVersions},
- KeyShare) ->
- HelloExtensions =
+ KeyShare,
+ TicketData) ->
+ HelloExtensions1 =
HelloExtensions0#{client_hello_versions =>
#client_hello_versions{versions = SupportedVersions},
signature_algs_cert =>
signature_algs_cert(SignatureSchemes)},
- maybe_add_key_share(HelloExtensions, KeyShare);
-maybe_add_tls13_extensions(_, HelloExtensions, _, _) ->
+ HelloExtensions = maybe_add_key_share(HelloExtensions1, KeyShare),
+ maybe_add_pre_shared_key(HelloExtensions, TicketData);
+maybe_add_tls13_extensions(_, HelloExtensions, _, _, _) ->
HelloExtensions.
@@ -1181,6 +1189,43 @@ maybe_add_key_share(HelloExtensions, KeyShare) ->
HelloExtensions#{key_share => #key_share_client_hello{
client_shares = ClientShares}}.
+
+maybe_add_pre_shared_key(HelloExtensions, undefined) ->
+ HelloExtensions;
+maybe_add_pre_shared_key(HelloExtensions, TicketData) ->
+ {Identities, Binders} = get_identities_binders(TicketData),
+
+ %% A client MUST provide a "psk_key_exchange_modes" extension if it
+ %% offers a "pre_shared_key" extension.
+ HelloExtensions#{pre_shared_key =>
+ #pre_shared_key_client_hello{
+ offered_psks =
+ #offered_psks{
+ identities = Identities,
+ binders = Binders}},
+ psk_key_exchange_modes =>
+ #psk_key_exchange_modes{
+ ke_modes = [psk_ke, psk_dhe_ke]}}.
+
+
+get_identities_binders(TicketData) ->
+ get_identities_binders(TicketData, {[], []}, 0).
+%%
+get_identities_binders([], {Identities, Binders}, _) ->
+ {lists:reverse(Identities), lists:reverse(Binders)};
+get_identities_binders([{Key, _, Identity, _, _, HKDF}|T], {I0, B0}, N) ->
+ %% Use dummy binder for proper calculation of packet size when creating
+ %% the real binder value.
+ Binder = dummy_binder(HKDF),
+ %% Store ticket position in identities
+ tls_client_ticket_store:update_ticket(Key, N),
+ get_identities_binders(T, {[Identity|I0], [Binder|B0]}, N + 1).
+
+
+dummy_binder(HKDF) ->
+ binary:copy(<<0>>, ssl_cipher:hash_size(HKDF)).
+
+
add_server_share(server_hello, Extensions, KeyShare) ->
#key_share_server_hello{server_share = ServerShare0} = KeyShare,
%% Keep only public keys
@@ -1216,6 +1261,7 @@ kse_remove_private_key(#key_share_entry{
group = Group,
key_exchange = PublicKey}.
+
signature_algs_ext(undefined) ->
undefined;
signature_algs_ext(SignatureSchemes0) ->
@@ -1520,7 +1566,13 @@ extension_value(#key_share_server_hello{server_share = ServerShare}) ->
extension_value(#client_hello_versions{versions = Versions}) ->
Versions;
extension_value(#server_hello_selected_version{selected_version = SelectedVersion}) ->
- SelectedVersion.
+ SelectedVersion;
+extension_value(#pre_shared_key_client_hello{offered_psks = PSKs}) ->
+ PSKs;
+extension_value(#pre_shared_key_server_hello{selected_identity = SelectedIdentity}) ->
+ SelectedIdentity;
+extension_value(#psk_key_exchange_modes{ke_modes = Modes}) ->
+ Modes.
%%--------------------------------------------------------------------
@@ -1581,7 +1633,8 @@ certificate_authorities_from_db(_CertDbHandle, {extracted, CertDbData}) ->
%%-------------Handle handshake messages --------------------------------
validation_fun_and_state({Fun, UserState0}, Role, CertDbHandle, CertDbRef,
- ServerNameIndication, CustomizeHostCheck, CRLCheck, CRLDbHandle, CertPath) ->
+ ServerNameIndication, CustomizeHostCheck, CRLCheck,
+ CRLDbHandle, CertPath, LogLevel) ->
{fun(OtpCert, {extension, _} = Extension, {SslState, UserState}) ->
case ssl_certificate:validate(OtpCert,
Extension,
@@ -1590,17 +1643,18 @@ validation_fun_and_state({Fun, UserState0}, Role, CertDbHandle, CertDbRef,
{valid, {NewSslState, UserState}};
{fail, Reason} ->
apply_user_fun(Fun, OtpCert, Reason, UserState,
- SslState, CertPath);
+ SslState, CertPath, LogLevel);
{unknown, _} ->
apply_user_fun(Fun, OtpCert,
- Extension, UserState, SslState, CertPath)
+ Extension, UserState, SslState, CertPath, LogLevel)
end;
(OtpCert, VerifyResult, {SslState, UserState}) ->
apply_user_fun(Fun, OtpCert, VerifyResult, UserState,
- SslState, CertPath)
+ SslState, CertPath, LogLevel)
end, {{Role, CertDbHandle, CertDbRef, {ServerNameIndication, CustomizeHostCheck}, CRLCheck, CRLDbHandle}, UserState0}};
validation_fun_and_state(undefined, Role, CertDbHandle, CertDbRef,
- ServerNameIndication, CustomizeHostCheck, CRLCheck, CRLDbHandle, CertPath) ->
+ ServerNameIndication, CustomizeHostCheck, CRLCheck,
+ CRLDbHandle, CertPath, LogLevel) ->
{fun(OtpCert, {extension, _} = Extension, SslState) ->
ssl_certificate:validate(OtpCert,
Extension,
@@ -1608,7 +1662,7 @@ validation_fun_and_state(undefined, Role, CertDbHandle, CertDbRef,
(OtpCert, VerifyResult, SslState) when (VerifyResult == valid) or
(VerifyResult == valid_peer) ->
case crl_check(OtpCert, CRLCheck, CertDbHandle, CertDbRef,
- CRLDbHandle, VerifyResult, CertPath) of
+ CRLDbHandle, VerifyResult, CertPath, LogLevel) of
valid ->
ssl_certificate:validate(OtpCert,
VerifyResult,
@@ -1623,21 +1677,21 @@ validation_fun_and_state(undefined, Role, CertDbHandle, CertDbRef,
end, {Role, CertDbHandle, CertDbRef, {ServerNameIndication, CustomizeHostCheck}, CRLCheck, CRLDbHandle}}.
apply_user_fun(Fun, OtpCert, VerifyResult, UserState0,
- {_, CertDbHandle, CertDbRef, _, CRLCheck, CRLDbHandle} = SslState, CertPath) when
+ {_, CertDbHandle, CertDbRef, _, CRLCheck, CRLDbHandle} = SslState, CertPath, LogLevel) when
(VerifyResult == valid) or (VerifyResult == valid_peer) ->
case Fun(OtpCert, VerifyResult, UserState0) of
{Valid, UserState} when (Valid == valid) or (Valid == valid_peer) ->
case crl_check(OtpCert, CRLCheck, CertDbHandle, CertDbRef,
- CRLDbHandle, VerifyResult, CertPath) of
+ CRLDbHandle, VerifyResult, CertPath, LogLevel) of
valid ->
{Valid, {SslState, UserState}};
Result ->
- apply_user_fun(Fun, OtpCert, Result, UserState, SslState, CertPath)
+ apply_user_fun(Fun, OtpCert, Result, UserState, SslState, CertPath, LogLevel)
end;
{fail, _} = Fail ->
Fail
end;
-apply_user_fun(Fun, OtpCert, ExtensionOrError, UserState0, SslState, _CertPath) ->
+apply_user_fun(Fun, OtpCert, ExtensionOrError, UserState0, SslState, _CertPath, _LogLevel) ->
case Fun(OtpCert, ExtensionOrError, UserState0) of
{Valid, UserState} when (Valid == valid) or (Valid == valid_peer)->
{Valid, {SslState, UserState}};
@@ -1651,40 +1705,44 @@ handle_path_validation_error({bad_cert, unknown_ca} = Reason, PeerCert, Chain,
Opts, Options, CertDbHandle, CertsDbRef) ->
handle_incomplete_chain(PeerCert, Chain, Opts, Options, CertDbHandle, CertsDbRef, Reason);
handle_path_validation_error({bad_cert, invalid_issuer} = Reason, PeerCert, Chain0,
- #{partial_chain := PartialChain} = Opts, Options, CertDbHandle, CertsDbRef) ->
- case ssl_certificate:certificate_chain(PeerCert, CertDbHandle, CertsDbRef, Chain0) of
- {ok, _, [PeerCert | Chain] = OrdedChain} when Chain =/= Chain0 -> %% Chain appaears to be unorded
- {Trusted, Path} = ssl_certificate:trusted_cert_and_path(OrdedChain,
+ Opts, Options, CertDbHandle, CertsDbRef) ->
+ handle_unordered_chain(PeerCert, Chain0, Opts, Options, CertDbHandle, CertsDbRef, Reason);
+handle_path_validation_error(Reason, _, _, _, _,_, _) ->
+ path_validation_alert(Reason).
+
+handle_incomplete_chain(PeerCert, Chain0,
+ #{partial_chain := PartialChain} = Opts, Options, CertDbHandle, CertsDbRef, Reason) ->
+ case ssl_certificate:certificate_chain(PeerCert, CertDbHandle, CertsDbRef) of
+ {ok, _, [PeerCert | _] = Chain} when Chain =/= Chain0 -> %% Chain candidate found
+ {Trusted, Path} = ssl_certificate:trusted_cert_and_path(Chain,
CertDbHandle, CertsDbRef,
PartialChain),
case public_key:pkix_path_validation(Trusted, Path, Options) of
{ok, {PublicKeyInfo,_}} ->
{PeerCert, PublicKeyInfo};
{error, PathError} ->
- handle_path_validation_error(PathError, PeerCert, Path,
- Opts, Options, CertDbHandle, CertsDbRef)
+ handle_unordered_chain(PeerCert, Chain0, Opts, Options, CertDbHandle, CertsDbRef, PathError)
end;
_ ->
- path_validation_alert(Reason)
- end;
-handle_path_validation_error(Reason, _, _, _, _,_, _) ->
- path_validation_alert(Reason).
+ handle_unordered_chain(PeerCert, Chain0, Opts, Options, CertDbHandle, CertsDbRef, Reason)
+ end.
-handle_incomplete_chain(PeerCert, Chain0,
- #{partial_chain := PartialChain}, Options, CertDbHandle, CertsDbRef, PathError0) ->
- case ssl_certificate:certificate_chain(PeerCert, CertDbHandle, CertsDbRef) of
- {ok, _, [PeerCert | _] = Chain} when Chain =/= Chain0 -> %% Chain candidate found
+handle_unordered_chain(PeerCert, Chain0,
+ #{partial_chain := PartialChain}, Options, CertDbHandle, CertsDbRef, Reason) ->
+ {ok, ExtractedCerts} = ssl_pkix_db:extract_trusted_certs({der, Chain0}),
+ case ssl_certificate:certificate_chain(PeerCert, CertDbHandle, ExtractedCerts, Chain0) of
+ {ok, _, Chain} when Chain =/= Chain0 -> %% Chain appaears to be unordered
{Trusted, Path} = ssl_certificate:trusted_cert_and_path(Chain,
CertDbHandle, CertsDbRef,
PartialChain),
case public_key:pkix_path_validation(Trusted, Path, Options) of
- {ok, {PublicKeyInfo,_}} ->
- {PeerCert, PublicKeyInfo};
+ {ok, {PublicKeyInfo,_}} ->
+ {PeerCert, PublicKeyInfo};
{error, PathError} ->
- path_validation_alert(PathError)
+ path_validation_alert(PathError)
end;
_ ->
- path_validation_alert(PathError0)
+ path_validation_alert(Reason)
end.
path_validation_alert({bad_cert, cert_expired}) ->
@@ -1705,7 +1763,7 @@ path_validation_alert({bad_cert, {revocation_status_undetermined, Details}}) ->
path_validation_alert({bad_cert, selfsigned_peer}) ->
?ALERT_REC(?FATAL, ?BAD_CERTIFICATE);
path_validation_alert({bad_cert, unknown_ca}) ->
- ?ALERT_REC(?FATAL, ?UNKNOWN_CA);
+ ?ALERT_REC(?FATAL, ?UNKNOWN_CA);
path_validation_alert(Reason) ->
?ALERT_REC(?FATAL, ?HANDSHAKE_FAILURE, Reason).
@@ -1741,29 +1799,38 @@ bad_key(#'RSAPrivateKey'{}) ->
bad_key(#'ECPrivateKey'{}) ->
unacceptable_ecdsa_key.
-crl_check(_, false, _,_,_, _, _) ->
+crl_check(_, false, _,_,_, _, _, _) ->
valid;
-crl_check(_, peer, _, _,_, valid, _) -> %% Do not check CAs with this option.
+crl_check(_, peer, _, _,_, valid, _, _) -> %% Do not check CAs with this option.
valid;
-crl_check(OtpCert, Check, CertDbHandle, CertDbRef, {Callback, CRLDbHandle}, _, CertPath) ->
+crl_check(OtpCert, Check, CertDbHandle, CertDbRef, {Callback, CRLDbHandle}, _, CertPath, LogLevel) ->
Options = [{issuer_fun, {fun(_DP, CRL, Issuer, DBInfo) ->
ssl_crl:trusted_cert_and_path(CRL, Issuer, {CertPath,
DBInfo})
end, {CertDbHandle, CertDbRef}}},
- {update_crl, fun(DP, CRL) -> Callback:fresh_crl(DP, CRL) end},
+ {update_crl, fun(DP, CRL) ->
+ case Callback:fresh_crl(DP, CRL) of
+ {logger, LogInfo, Fresh} ->
+ handle_log(LogLevel, LogInfo),
+ Fresh;
+ Fresh ->
+ Fresh
+ end
+ end},
{undetermined_details, true}
],
- case dps_and_crls(OtpCert, Callback, CRLDbHandle, ext) of
+ case dps_and_crls(OtpCert, Callback, CRLDbHandle, ext, LogLevel) of
no_dps ->
crl_check_same_issuer(OtpCert, Check,
- dps_and_crls(OtpCert, Callback, CRLDbHandle, same_issuer),
+ dps_and_crls(OtpCert, Callback, CRLDbHandle, same_issuer, LogLevel),
Options);
DpsAndCRLs -> %% This DP list may be empty if relevant CRLs existed
%% but could not be retrived, will result in {bad_cert, revocation_status_undetermined}
case public_key:pkix_crls_validate(OtpCert, DpsAndCRLs, Options) of
{bad_cert, {revocation_status_undetermined, _}} ->
- crl_check_same_issuer(OtpCert, Check, dps_and_crls(OtpCert, Callback,
- CRLDbHandle, same_issuer), Options);
+ crl_check_same_issuer(OtpCert, Check,
+ dps_and_crls(OtpCert, Callback,
+ CRLDbHandle, same_issuer, LogLevel), Options);
Other ->
Other
end
@@ -1779,21 +1846,27 @@ crl_check_same_issuer(OtpCert, best_effort, Dps, Options) ->
crl_check_same_issuer(OtpCert, _, Dps, Options) ->
public_key:pkix_crls_validate(OtpCert, Dps, Options).
-dps_and_crls(OtpCert, Callback, CRLDbHandle, ext) ->
+dps_and_crls(OtpCert, Callback, CRLDbHandle, ext, LogLevel) ->
case public_key:pkix_dist_points(OtpCert) of
[] ->
no_dps;
DistPoints ->
Issuer = OtpCert#'OTPCertificate'.tbsCertificate#'OTPTBSCertificate'.issuer,
- CRLs = distpoints_lookup(DistPoints, Issuer, Callback, CRLDbHandle),
+ CRLs = distpoints_lookup(DistPoints, Issuer, Callback, CRLDbHandle, LogLevel),
dps_and_crls(DistPoints, CRLs, [])
end;
-dps_and_crls(OtpCert, Callback, CRLDbHandle, same_issuer) ->
+dps_and_crls(OtpCert, Callback, CRLDbHandle, same_issuer, LogLevel) ->
DP = #'DistributionPoint'{distributionPoint = {fullName, GenNames}} =
public_key:pkix_dist_point(OtpCert),
CRLs = lists:flatmap(fun({directoryName, Issuer}) ->
- Callback:select(Issuer, CRLDbHandle);
+ case Callback:select(Issuer, CRLDbHandle) of
+ {logger, LogInfo, Return} ->
+ handle_log(LogLevel, LogInfo),
+ Return;
+ Return ->
+ Return
+ end;
(_) ->
[]
end, GenNames),
@@ -1805,9 +1878,9 @@ dps_and_crls([DP | Rest], CRLs, Acc) ->
DpCRL = [{DP, {CRL, public_key:der_decode('CertificateList', CRL)}} || CRL <- CRLs],
dps_and_crls(Rest, CRLs, DpCRL ++ Acc).
-distpoints_lookup([],_, _, _) ->
+distpoints_lookup([],_, _, _, _) ->
[];
-distpoints_lookup([DistPoint | Rest], Issuer, Callback, CRLDbHandle) ->
+distpoints_lookup([DistPoint | Rest], Issuer, Callback, CRLDbHandle, LogLevel) ->
Result =
try Callback:lookup(DistPoint, Issuer, CRLDbHandle)
catch
@@ -1818,8 +1891,11 @@ distpoints_lookup([DistPoint | Rest], Issuer, Callback, CRLDbHandle) ->
end,
case Result of
not_available ->
- distpoints_lookup(Rest, Issuer, Callback, CRLDbHandle);
- CRLs ->
+ distpoints_lookup(Rest, Issuer, Callback, CRLDbHandle, LogLevel);
+ {logger, LogInfo, CRLs} ->
+ handle_log(LogLevel, LogInfo),
+ CRLs;
+ CRLs ->
CRLs
end.
@@ -2144,7 +2220,7 @@ encode_psk_identities([#psk_identity{
identity = Identity,
obfuscated_ticket_age = Age}|T], Acc) ->
IdLen = byte_size(Identity),
- encode_psk_identities(T, <<Acc/binary,?UINT16(IdLen),Identity/binary,Age/binary>>).
+ encode_psk_identities(T, <<Acc/binary,?UINT16(IdLen),Identity/binary,?UINT32(Age)>>).
encode_psk_binders(Binders) ->
@@ -2613,7 +2689,7 @@ decode_psk_identities(Identities) ->
%%
decode_psk_identities(<<>>, Acc) ->
lists:reverse(Acc);
-decode_psk_identities(<<?UINT16(Len), Identity:Len/binary, Age:4/binary, Rest/binary>>, Acc) ->
+decode_psk_identities(<<?UINT16(Len), Identity:Len/binary, ?UINT32(Age), Rest/binary>>, Acc) ->
decode_psk_identities(Rest, [#psk_identity{
identity = Identity,
obfuscated_ticket_age = Age}|Acc]).
@@ -3202,3 +3278,6 @@ empty_extensions(_, server_hello) ->
alpn => undefined,
next_protocol_negotiation => undefined,
ec_point_formats => undefined}.
+
+handle_log(Level, {LogLevel, ReportMap, Meta}) ->
+ ssl_logger:log(Level, LogLevel, ReportMap, Meta).
diff --git a/lib/ssl/src/ssl_internal.hrl b/lib/ssl/src/ssl_internal.hrl
index fc9f16a189..ceca206605 100644
--- a/lib/ssl/src/ssl_internal.hrl
+++ b/lib/ssl/src/ssl_internal.hrl
@@ -60,6 +60,7 @@
-define(CDR_MAGIC, "GIOP").
-define(CDR_HDR_SIZE, 12).
-define(INTERNAL_ACTIVE_N, 100).
+-define(DEPTH, 20).
-define(DEFAULT_TIMEOUT, 5000).
-define(NO_DIST_POINT, "http://dummy/no_distribution_point").
@@ -108,76 +109,91 @@
-define('24H_in_msec', 86400000).
-define('24H_in_sec', 86400).
--record(ssl_options, {
- protocol :: tls | dtls | 'undefined',
- versions :: [ssl_record:ssl_version()] | 'undefined', %% ssl_record:atom_version() in API
- verify :: verify_none | verify_peer | 'undefined',
- verify_fun, %%:: fun(CertVerifyErrors::term()) -> boolean(),
- partial_chain :: fun() | 'undefined',
- fail_if_no_peer_cert :: boolean() | 'undefined',
- verify_client_once :: boolean() | 'undefined',
- %% fun(Extensions, State, Verify, AccError) -> {Extensions, State, AccError}
- validate_extensions_fun,
- depth :: integer() | 'undefined',
- certfile :: binary() | 'undefined',
- cert :: public_key:der_encoded() | secret_printout() | 'undefined',
- keyfile :: binary() | 'undefined',
- key :: {'RSAPrivateKey' | 'DSAPrivateKey' | 'ECPrivateKey' | 'PrivateKeyInfo' | 'undefined',
- public_key:der_encoded()} | map() %%map() -> ssl:key() how to handle dialyzer?
- | secret_printout() | 'undefined',
- password :: string() | secret_printout() | 'undefined',
- cacerts :: [public_key:der_encoded()] | secret_printout() | 'undefined',
- cacertfile :: binary() | 'undefined',
- dh :: public_key:der_encoded() | secret_printout() | 'undefined',
- dhfile :: binary() | secret_printout() | 'undefined',
- user_lookup_fun, % server option, fun to lookup the user
- psk_identity :: binary() | secret_printout() | 'undefined',
- srp_identity, % client option {User, Password}
- ciphers, %
- %% Local policy for the server if it want's to reuse the session
- %% or not. Defaluts to allways returning true.
- %% fun(SessionId, PeerCert, Compression, CipherSuite) -> boolean()
- reuse_session :: fun() | binary() | undefined, %% Server side is a fun()
- %% If false sessions will never be reused, if true they
- %% will be reused if possible.
- reuse_sessions :: boolean() | save | 'undefined', %% Only client side can use value save
- renegotiate_at,
- secure_renegotiate,
- client_renegotiation,
- %% undefined if not hibernating, or number of ms of
- %% inactivity after which ssl_connection will go into
- %% hibernation
- hibernate_after :: timeout() | 'undefined',
- %% This option should only be set to true by inet_tls_dist
- erl_dist = false :: boolean(),
- alpn_advertised_protocols = undefined :: [binary()] | undefined,
- alpn_preferred_protocols = undefined :: [binary()] | undefined,
- next_protocols_advertised = undefined :: [binary()] | undefined,
- next_protocol_selector = undefined, %% fun([binary()]) -> binary())
- log_level = notice :: atom(),
- server_name_indication = undefined,
- sni_hosts :: [{inet:hostname(), [tuple()]}] | 'undefined',
- sni_fun :: function() | undefined,
- %% Should the server prefer its own cipher order over the one provided by
- %% the client?
- honor_cipher_order = false :: boolean(),
- padding_check = true :: boolean(),
- %%Should we use 1/n-1 or 0/n splitting to mitigate BEAST, or disable
- %%mitigation entirely?
- beast_mitigation = one_n_minus_one :: one_n_minus_one | zero_n | disabled,
- fallback = false :: boolean(),
- crl_check :: boolean() | peer | best_effort | 'undefined',
- crl_cache,
- signature_algs,
- signature_algs_cert,
- eccs,
- supported_groups, %% RFC 8422, RFC 8446
- honor_ecc_order :: boolean() | 'undefined',
- max_handshake_size :: integer() | 'undefined',
- handshake,
- customize_hostname_check
- %% ,
- %% save_session :: boolean()
+
+%% This map stores all supported options with default values and
+%% list of dependencies:
+%% #{<option> => {<default_value>, [<option>]},
+%% ...}
+-define(RULES,
+ #{
+ alpn_advertised_protocols => {undefined, [versions]},
+ alpn_preferred_protocols => {undefined, [versions]},
+ beast_mitigation => {one_n_minus_one, [versions]},
+ cacertfile => {undefined, [versions,
+ verify_fun,
+ cacerts]},
+ cacerts => {undefined, [versions]},
+ cert => {undefined, [versions]},
+ certfile => {<<>>, [versions]},
+ ciphers => {[], [versions]},
+ client_renegotiation => {undefined, [versions]},
+ crl_cache => {{ssl_crl_cache, {internal, []}}, [versions]},
+ crl_check => {false, [versions]},
+ customize_hostname_check => {[], [versions]},
+ depth => {1, [versions]},
+ dh => {undefined, [versions]},
+ dhfile => {undefined, [versions]},
+ eccs => {undefined, [versions]},
+ erl_dist => {false, [versions]},
+ fail_if_no_peer_cert => {false, [versions]},
+ fallback => {false, [versions]},
+ handshake => {full, [versions]},
+ hibernate_after => {infinity, [versions]},
+ honor_cipher_order => {false, [versions]},
+ honor_ecc_order => {undefined, [versions]},
+ key => {undefined, [versions]},
+ keyfile => {undefined, [versions,
+ certfile]},
+ log_level => {notice, [versions]},
+ max_handshake_size => {?DEFAULT_MAX_HANDSHAKE_SIZE, [versions]},
+ next_protocol_selector => {undefined, [versions]},
+ next_protocols_advertised => {undefined, [versions]},
+ padding_check => {true, [versions]},
+ partial_chain => {fun(_) -> unknown_ca end, [versions]},
+ password => {"", [versions]},
+ protocol => {tls, []},
+ psk_identity => {undefined, [versions]},
+ renegotiate_at => {?DEFAULT_RENEGOTIATE_AT, [versions]},
+ reuse_session => {undefined, [versions]},
+ reuse_sessions => {true, [versions]},
+ anti_replay => {undefined, [versions, session_tickets]},
+ secure_renegotiate => {true, [versions]},
+ server_name_indication => {undefined, [versions]},
+ session_tickets => {disabled, [versions]},
+ signature_algs => {undefined, [versions]},
+ signature_algs_cert => {undefined, [versions]},
+ sni_fun => {undefined, [versions,
+ sni_hosts]},
+ sni_hosts => {[], [versions]},
+ srp_identity => {undefined, [versions]},
+ supported_groups => {undefined, [versions]},
+ use_ticket => {undefined, [versions]},
+ user_lookup_fun => {undefined, [versions]},
+ validate_extensions_fun => {undefined, [versions]},
+ verify => {verify_none, [versions,
+ fail_if_no_peer_cert,
+ partial_chain,
+ verify_client_once]},
+ verify_client_once => {false, [versions]},
+ verify_fun =>
+ {
+ {fun(_,{bad_cert, _}, UserState) ->
+ {valid, UserState};
+ (_,{extension, #'Extension'{critical = true}}, UserState) ->
+ %% This extension is marked as critical, so
+ %% certificate verification should fail if we don't
+ %% understand the extension. However, this is
+ %% `verify_none', so let's accept it anyway.
+ {valid, UserState};
+ (_,{extension, _}, UserState) ->
+ {unknown, UserState};
+ (_, valid, UserState) ->
+ {valid, UserState};
+ (_, valid_peer, UserState) ->
+ {valid, UserState}
+ end, []},
+ [versions, verify]},
+ versions => {[], [protocol]}
}).
-record(socket_options,
@@ -191,7 +207,8 @@
-record(config, {ssl, %% SSL parameters
inet_user, %% User set inet options
- emulated, %% Emulated option list or "inherit_tracker" pid
+ emulated, %% Emulated option list or
+ trackers,
dtls_handler,
inet_ssl, %% inet options for internal ssl socket
transport_info, %% Callback info
diff --git a/lib/ssl/src/ssl_logger.erl b/lib/ssl/src/ssl_logger.erl
index 514a4464bc..9ee0c23aaa 100644
--- a/lib/ssl/src/ssl_logger.erl
+++ b/lib/ssl/src/ssl_logger.erl
@@ -20,9 +20,10 @@
-module(ssl_logger).
--export([debug/4,
+-export([log/4,
+ debug/4,
format/2,
- notice/2]).
+ format/1]).
-define(DEC2HEX(X),
if ((X) >= 0) andalso ((X) =< 9) -> (X) + $0;
@@ -31,6 +32,7 @@
-define(rec_info(T,R),lists:zip(record_info(fields,T),tl(tuple_to_list(R)))).
+-include("ssl_internal.hrl").
-include("tls_record.hrl").
-include("ssl_cipher.hrl").
-include("ssl_internal.hrl").
@@ -40,31 +42,21 @@
-include_lib("kernel/include/logger.hrl").
%%-------------------------------------------------------------------------
-%% External API
+%% Internal API -- Stateful logging
%%-------------------------------------------------------------------------
-%% SSL log formatter
-format(#{level:= _Level, msg:= {report, Msg}, meta:= _Meta}, _Config0) ->
- #{direction := Direction,
- protocol := Protocol,
- message := Content} = Msg,
- case Protocol of
- 'record' ->
- BinMsg =
- case Content of
- #ssl_tls{} ->
- [tls_record:build_tls_record(Content)];
- _ when is_list(Content) ->
- lists:flatten(Content)
- end,
- format_tls_record(Direction, BinMsg);
- 'handshake' ->
- format_handshake(Direction, Content);
- _Other ->
- []
+log(Level, LogLevel, ReportMap, Meta) ->
+ case logger:compare_levels(LogLevel, Level) of
+ lt ->
+ logger:log(Level, ReportMap, Meta#{depth => ?DEPTH,
+ report_cb => fun ?MODULE:format/1});
+ eq ->
+ logger:log(Level, ReportMap, Meta#{depth => ?DEPTH,
+ report_cb => fun ?MODULE:format/1});
+ _ ->
+ ok
end.
-%% Stateful logging
debug(Level, Direction, Protocol, Message)
when (Direction =:= inbound orelse Direction =:= outbound) andalso
(Protocol =:= 'record' orelse Protocol =:= 'handshake') ->
@@ -83,17 +75,64 @@ debug(Level, Direction, Protocol, Message)
ok
end.
-%% Stateful logging
-notice(Level, Report) ->
- case logger:compare_levels(Level, notice) of
- lt ->
- ?LOG_NOTICE(Report);
- eq ->
- ?LOG_NOTICE(Report);
- _ ->
- ok
+%%-------------------------------------------------------------------------
+%% Report formatting CB
+%%-------------------------------------------------------------------------
+format(#{alert := Alert, alerter := own} = Report) ->
+ #{protocol := ProtocolName,
+ role := Role,
+ alert := Alert,
+ statename := StateName } = Report,
+ ssl_alert:own_alert_format(ProtocolName, Role, StateName, Alert);
+format(#{alert := Alert, alerter := peer} = Report) ->
+ #{protocol := ProtocolName,
+ role := Role,
+ alert := Alert,
+ statename := StateName } = Report,
+ ssl_alert:alert_format(ProtocolName, Role, StateName, Alert);
+format(#{alert := Alert, alerter := ignored} = Report) ->
+ #{protocol := ProtocolName,
+ role := Role,
+ alert := Alert,
+ statename := StateName} = Report,
+ %% Happens in DTLS
+ {Fmt, Args} = ssl_alert:own_alert_format(ProtocolName, Role, StateName, Alert),
+ {"~s " ++ Fmt, ["Ignored alert to mitigate DoS attacks", Args]};
+format(#{description := Desc} = Report) ->
+ #{reason := Reason} = Report,
+ {"~s11:~p"
+ "~n"
+ "~s11:~p"
+ "~n",
+ ["Description", Desc, "Reason", Reason]
+ }.
+
+%%-------------------------------------------------------------------------
+%% SSL log handler formatter
+%%-------------------------------------------------------------------------
+format(#{msg:= {report, Msg}}, _Config0) ->
+ #{direction := Direction,
+ protocol := Protocol,
+ message := Content} = Msg,
+ case Protocol of
+ 'record' ->
+ BinMsg =
+ case Content of
+ #ssl_tls{} ->
+ [tls_record:build_tls_record(Content)];
+ _ when is_list(Content) ->
+ lists:flatten(Content)
+ end,
+ format_tls_record(Direction, BinMsg);
+ 'handshake' ->
+ format_handshake(Direction, Content);
+ _Other ->
+ []
end.
+%%-------------------------------------------------------------------------
+%% Internal functions
+%%-------------------------------------------------------------------------
%%-------------------------------------------------------------------------
%% Handshake Protocol
diff --git a/lib/ssl/src/ssl_manager.erl b/lib/ssl/src/ssl_manager.erl
index 456a560bf6..fd842fcec4 100644
--- a/lib/ssl/src/ssl_manager.erl
+++ b/lib/ssl/src/ssl_manager.erl
@@ -53,7 +53,6 @@
session_lifetime :: integer(),
certificate_db :: db_handle(),
session_validation_timer :: reference(),
- last_delay_timer = {undefined, undefined},%% Keep for testing purposes
session_cache_client_max :: integer(),
session_cache_server_max :: integer(),
session_server_invalidator :: undefined | pid(),
@@ -375,12 +374,6 @@ handle_info(validate_sessions, #state{session_cache_cb = CacheCb,
session_client_invalidator = CPid,
session_server_invalidator = SPid}};
-
-handle_info({delayed_clean_session, Key, Cache}, #state{session_cache_cb = CacheCb
- } = State) ->
- CacheCb:delete(Cache, Key),
- {noreply, State};
-
handle_info({clean_cert_db, Ref, File},
#state{certificate_db = [CertDb, {RefDb, FileMapDb} | _]} = State) ->
@@ -470,14 +463,6 @@ session_validation({{Port, _}, Session}, LifeTime) ->
validate_session(Port, Session, LifeTime),
LifeTime.
-delay_time() ->
- case application:get_env(ssl, session_delay_cleanup_time) of
- {ok, Time} when is_integer(Time) ->
- Time;
- _ ->
- ?CLEAN_SESSION_DB
- end.
-
max_session_cache_size(CacheType) ->
case application:get_env(ssl, CacheType) of
{ok, Size} when is_integer(Size) ->
@@ -486,36 +471,15 @@ max_session_cache_size(CacheType) ->
?DEFAULT_MAX_SESSION_CACHE
end.
-invalidate_session(Cache, CacheCb, Key, Session, State) ->
+invalidate_session(Cache, CacheCb, Key, _Session, State) ->
case CacheCb:lookup(Cache, Key) of
undefined -> %% Session is already invalidated
{noreply, State};
- #session{is_resumable = new} ->
+ #session{} ->
CacheCb:delete(Cache, Key),
- {noreply, State};
- _ ->
- delayed_invalidate_session(CacheCb, Cache, Key, Session, State)
+ {noreply, State}
end.
-delayed_invalidate_session(CacheCb, Cache, Key, Session,
- #state{last_delay_timer = LastTimer} = State) ->
- %% When a registered session is invalidated we need to
- %% wait a while before deleting it as there might be
- %% pending connections that rightfully needs to look up
- %% the session data but new connections should not get to
- %% use this session.
- CacheCb:update(Cache, Key, Session#session{is_resumable = false}),
- TRef =
- erlang:send_after(delay_time(), self(),
- {delayed_clean_session, Key, Cache}),
- {noreply, State#state{last_delay_timer =
- last_delay_timer(Key, TRef, LastTimer)}}.
-
-last_delay_timer({{_,_},_}, TRef, {LastServer, _}) ->
- {LastServer, TRef};
-last_delay_timer({_,_}, TRef, {_, LastClient}) ->
- {TRef, LastClient}.
-
%% If we cannot generate a not allready in use session ID in
%% ?GEN_UNIQUE_ID_MAX_TRIES we make the new session uncacheable The
%% value of ?GEN_UNIQUE_ID_MAX_TRIES is stolen from open SSL which
diff --git a/lib/ssl/src/ssl_pkix_db.erl b/lib/ssl/src/ssl_pkix_db.erl
index dec48fa914..49db77ffd0 100644
--- a/lib/ssl/src/ssl_pkix_db.erl
+++ b/lib/ssl/src/ssl_pkix_db.erl
@@ -310,9 +310,8 @@ decode_certs(Ref, Cert) ->
{decoded, {{Ref, SerialNumber, Issuer}, {Cert, ErlCert}}}
catch
error:_ ->
- Report = io_lib:format("SSL WARNING: Ignoring a CA cert as "
- "it could not be correctly decoded.~n", []),
- ?LOG_NOTICE(Report),
+ ?LOG_NOTICE("SSL WARNING: Ignoring a CA cert as "
+ "it could not be correctly decoded.~n"),
undefined
end.
diff --git a/lib/ssl/src/ssl_record.hrl b/lib/ssl/src/ssl_record.hrl
index 6d4d47cedb..e37e3f714f 100644
--- a/lib/ssl/src/ssl_record.hrl
+++ b/lib/ssl/src/ssl_record.hrl
@@ -66,6 +66,7 @@
hash_size, % unit 8
compression_algorithm, % unit 8
master_secret, % opaque 48
+ resumption_master_secret,
client_random, % opaque 32
server_random, % opaque 32
exportable % boolean
diff --git a/lib/ssl/src/ssl_session.erl b/lib/ssl/src/ssl_session.erl
index fd012acd5e..0f7ea0502b 100644
--- a/lib/ssl/src/ssl_session.erl
+++ b/lib/ssl/src/ssl_session.erl
@@ -30,7 +30,7 @@
-include("ssl_api.hrl").
%% Internal application API
--export([is_new/2, client_id/4, server_id/6, valid_session/2]).
+-export([is_new/2, client_select_session/4, server_select_session/7, valid_session/2]).
-type seconds() :: integer().
@@ -48,41 +48,38 @@ is_new(_ClientSuggestion, _ServerDecision) ->
true.
%%--------------------------------------------------------------------
--spec client_id({ssl:host(), inet:port_number(), ssl_options()}, db_handle(), atom(),
- undefined | binary()) -> binary().
+-spec client_select_session({ssl:host(), inet:port_number(), map()}, db_handle(), atom(),
+ #session{}) -> #session{}.
%%
%% Description: Should be called by the client side to get an id
%% for the client hello message.
%%--------------------------------------------------------------------
-client_id({Host, Port, #{reuse_session := SessionId}}, Cache, CacheCb, _) when is_binary(SessionId)->
- case CacheCb:lookup(Cache, {{Host, Port}, SessionId}) of
- undefined ->
- <<>>;
- #session{} ->
- SessionId
- end;
-client_id(ClientInfo, Cache, CacheCb, OwnCert) ->
- case select_session(ClientInfo, Cache, CacheCb, OwnCert) of
- no_session ->
- <<>>;
- SessionId ->
- SessionId
- end.
+client_select_session({_, _, #{versions := Versions,
+ protocol := Protocol}} = ClientInfo,
+ Cache, CacheCb, NewSession) ->
+
+ RecordCb = record_cb(Protocol),
+ Version = RecordCb:lowest_protocol_version(Versions),
+
+ case Version of
+ {3, N} when N >= 4 ->
+ NewSession#session{session_id = crypto:strong_rand_bytes(32)};
+ _ ->
+ do_client_select_session(ClientInfo, Cache, CacheCb, NewSession)
+ end.
--spec valid_session(#session{}, seconds() | {invalidate_before, integer()}) -> boolean().
+%%--------------------------------------------------------------------
+-spec server_select_session(ssl_record:ssl_version(), inet:port_number(), binary(), map(),
+ binary(),db_handle(), atom()) -> {binary(), #session{} | undefined}.
%%
-%% Description: Check that the session has not expired
+%% Description: Should be called by the server side to get an id
+%% for the client hello message.
%%--------------------------------------------------------------------
-valid_session(#session{time_stamp = TimeStamp}, {invalidate_before, Before}) ->
- TimeStamp > Before;
-valid_session(#session{time_stamp = TimeStamp}, LifeTime) ->
- Now = erlang:monotonic_time(),
- Lived = erlang:convert_time_unit(Now-TimeStamp, native, seconds),
- Lived < LifeTime.
-
-server_id(Port, <<>>, _SslOpts, _Cert, _, _) ->
+server_select_session({_, Minor}, Port, <<>>, _SslOpts, _Cert, _, _) when Minor >= 4 ->
{ssl_manager:new_session_id(Port), undefined};
-server_id(Port, SuggestedId, Options, Cert, Cache, CacheCb) ->
+server_select_session(_, Port, <<>>, _SslOpts, _Cert, _, _) ->
+ {ssl_manager:new_session_id(Port), undefined};
+server_select_session(_, Port, SuggestedId, Options, Cert, Cache, CacheCb) ->
LifeTime = case application:get_env(ssl, session_lifetime) of
{ok, Time} when is_integer(Time) -> Time;
_ -> ?'24H_in_sec'
@@ -96,11 +93,38 @@ server_id(Port, SuggestedId, Options, Cert, Cache, CacheCb) ->
{ssl_manager:new_session_id(Port), undefined}
end.
+-spec valid_session(#session{}, seconds() | {invalidate_before, integer()}) -> boolean().
+%%
+%% Description: Check that the session has not expired
+%%--------------------------------------------------------------------
+valid_session(#session{time_stamp = TimeStamp}, {invalidate_before, Before}) ->
+ TimeStamp > Before;
+valid_session(#session{time_stamp = TimeStamp}, LifeTime) ->
+ Now = erlang:monotonic_time(),
+ Lived = erlang:convert_time_unit(Now-TimeStamp, native, seconds),
+ Lived < LifeTime.
%%--------------------------------------------------------------------
%%% Internal functions
%%--------------------------------------------------------------------
+
+do_client_select_session({Host, Port, #{reuse_session := SessionId}}, Cache, CacheCb, NewSession) when is_binary(SessionId)->
+ case CacheCb:lookup(Cache, {{Host, Port}, SessionId}) of
+ undefined ->
+ NewSession#session{session_id = <<>>};
+ #session{} = Session->
+ Session
+ end;
+do_client_select_session(ClientInfo,
+ Cache, CacheCb, #session{own_certificate = OwnCert} = NewSession) ->
+ case select_session(ClientInfo, Cache, CacheCb, OwnCert) of
+ no_session ->
+ NewSession#session{session_id = <<>>};
+ Session ->
+ Session
+ end.
+
select_session({_, _, #{reuse_sessions := Reuse}}, _Cache, _CacheCb, _OwnCert) when Reuse =/= true ->
- %% If reuse_sessions == true | save a new session should be created
+ %% If reuse_sessions == false | save a new session should be created
no_session;
select_session({HostIP, Port, SslOpts}, Cache, CacheCb, OwnCert) ->
Sessions = CacheCb:select_session(Cache, {HostIP, Port}),
@@ -117,7 +141,7 @@ select_session(Sessions, #{ciphers := Ciphers}, OwnCert) ->
end,
case lists:dropwhile(IsNotResumable, Sessions) of
[] -> no_session;
- [Session | _] -> Session#session.session_id
+ [Session | _] -> Session
end.
is_resumable(_, _, #{reuse_sessions := false}, _, _, _, _) ->
@@ -154,3 +178,8 @@ reusable_options(#{fail_if_no_peer_cert := true,
(Session#session.peer_certificate =/= undefined);
reusable_options(_,_) ->
true.
+
+record_cb(tls) ->
+ tls_record;
+record_cb(dtls) ->
+ dtls_record.
diff --git a/lib/ssl/src/tls_bloom_filter.erl b/lib/ssl/src/tls_bloom_filter.erl
new file mode 100644
index 0000000000..5cc29b6048
--- /dev/null
+++ b/lib/ssl/src/tls_bloom_filter.erl
@@ -0,0 +1,113 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2007-2019. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+%%----------------------------------------------------------------------
+%% Purpose: Bloom Filter implementation for anti-replay protection
+%% in TLS 1.3 (stateless tickets)
+%%----------------------------------------------------------------------
+
+-module(tls_bloom_filter).
+
+-export([add_elem/2,
+ contains/2,
+ new/2,
+ rotate/1]).
+
+%%--------------------------------------------------------------------
+%% API ---------------------------------------------------------------
+%%--------------------------------------------------------------------
+
+%% Create new Bloom Filter with k hashes, m bits in the filter
+new(K, M) ->
+ Size = round(math:ceil(M / 8)),
+ BitField = binary:copy(<<0>>, Size),
+ #{k => K,
+ m => M,
+ current => BitField,
+ old => BitField
+ }.
+
+
+%% Add new element to Bloom Filter
+add_elem(#{k := K,
+ m := M,
+ current := BitField0} = BloomFilter,
+ Elem) ->
+ Hash = hash(Elem, K, M),
+ BitField = set_bits(BitField0, Hash),
+ BloomFilter#{current => BitField}.
+
+
+%% Check if Bloom Filter contains element.
+contains(#{k := K,
+ m := M,
+ current := BFCurrent,
+ old := BFOld},
+ Elem) ->
+ Hash = hash(Elem, K, M),
+ lists:all(fun (Pos) -> bit_is_set(BFCurrent, Pos) end, Hash) orelse
+ lists:all(fun (Pos) -> bit_is_set(BFOld, Pos) end, Hash).
+
+
+rotate(#{m := M,
+ current := BFCurrent} = BloomFilter) ->
+ Size = round(math:ceil(M / 8)),
+ BFNew = binary:copy(<<0>>, Size),
+ BloomFilter#{current := BFNew,
+ old := BFCurrent}.
+
+
+%%--------------------------------------------------------------------
+%% Internal functions ------------------------------------------------
+%%--------------------------------------------------------------------
+bit_is_set(<<1:1,_/bitstring>>, 0) ->
+ true;
+bit_is_set(BitField, N) ->
+ case BitField of
+ <<_:N,1:1,_/bitstring>> ->
+ true;
+ _ ->
+ false
+ end.
+
+
+set_bits(BitField, []) ->
+ BitField;
+set_bits(BitField, [H|T]) ->
+ set_bits(set_bit(BitField, H), T).
+
+
+set_bit(BitField, 0) ->
+ <<_:1,Rest/bitstring>> = BitField,
+ <<1:1,Rest/bitstring>>;
+set_bit(BitField, B) ->
+ <<Front:B,_:1,Rest/bitstring>> = BitField,
+ <<Front:B,1:1,Rest/bitstring>>.
+
+
+%% Kirsch-Mitzenmacher-Optimization
+hash(Elem, K, M) ->
+ hash(Elem, K, M, []).
+%%
+hash(_, 0, _, Acc) ->
+ Acc;
+hash(Elem, K, M, Acc) ->
+ H = (erlang:phash2({Elem, 0}, M) + (K - 1) * erlang:phash2({Elem, 1}, M)) rem M,
+ hash(Elem, K - 1, M, [H|Acc]).
diff --git a/lib/ssl/src/tls_client_ticket_store.erl b/lib/ssl/src/tls_client_ticket_store.erl
new file mode 100644
index 0000000000..6343b9cf0b
--- /dev/null
+++ b/lib/ssl/src/tls_client_ticket_store.erl
@@ -0,0 +1,355 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2007-2019. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+%%----------------------------------------------------------------------
+%% Purpose: Handle client side TLS-1.3 session ticket storage
+%%----------------------------------------------------------------------
+
+-module(tls_client_ticket_store).
+-behaviour(gen_server).
+
+-include("tls_handshake_1_3.hrl").
+
+%% API
+-export([find_ticket/2,
+ get_tickets/2,
+ lock_tickets/2,
+ remove_tickets/1,
+ start_link/2,
+ store_ticket/4,
+ unlock_tickets/2,
+ update_ticket/2]).
+
+%% gen_server callbacks
+-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
+ terminate/2, code_change/3, format_status/2]).
+
+-define(SERVER, ?MODULE).
+
+-record(state, {
+ db,
+ lifetime,
+ max
+ }).
+
+-record(data, {
+ pos = undefined,
+ hkdf,
+ sni,
+ psk,
+ timestamp,
+ ticket,
+ lock = undefined
+ }).
+
+%%%===================================================================
+%%% API
+%%%===================================================================
+-spec start_link(integer(), integer()) -> {ok, Pid :: pid()} |
+ {error, Error :: {already_started, pid()}} |
+ {error, Error :: term()} |
+ ignore.
+start_link(Max, Lifetime) ->
+ gen_server:start_link({local, ?MODULE}, ?MODULE, [Max, Lifetime], []).
+
+find_ticket(Pid, HashAlgos) ->
+ %% TODO use also SNI when selecting tickets
+ gen_server:call(?MODULE, {find_ticket, Pid, HashAlgos}, infinity).
+
+get_tickets(Pid, Keys) ->
+ gen_server:call(?MODULE, {get_tickets, Pid, Keys}, infinity).
+
+lock_tickets(_, undefined) ->
+ ok;
+lock_tickets(Pid, Keys) ->
+ gen_server:call(?MODULE, {lock, Pid, Keys}, infinity).
+
+remove_tickets([]) ->
+ ok;
+remove_tickets(Keys) ->
+ gen_server:cast(?MODULE, {remove_tickets, Keys}).
+
+store_ticket(Ticket, HKDF, SNI, PSK) ->
+ gen_server:call(?MODULE, {store_ticket, Ticket, HKDF, SNI, PSK}, infinity).
+
+unlock_tickets(Pid, Keys) ->
+ gen_server:call(?MODULE, {unlock, Pid, Keys}, infinity).
+
+update_ticket(Key, Pos) ->
+ gen_server:call(?MODULE, {update_ticket, Key, Pos}, infinity).
+
+%%%===================================================================
+%%% gen_server callbacks
+%%%===================================================================
+
+-spec init(Args :: term()) -> {ok, State :: term()}.
+
+init(Args) ->
+ process_flag(trap_exit, true),
+ State = inital_state(Args),
+ {ok, State}.
+
+-spec handle_call(Request :: term(), From :: {pid(), term()}, State :: term()) ->
+ {reply, Reply :: term(), NewState :: term()} .
+handle_call({find_ticket, Pid, HashAlgos}, _From, State) ->
+ Key = find_ticket(State, Pid, HashAlgos),
+ {reply, Key, State};
+handle_call({get_tickets, Pid, Keys}, _From, State) ->
+ Data = get_tickets(State, Pid, Keys),
+ {reply, Data, State};
+handle_call({lock, Pid, Keys}, _From, State0) ->
+ State = lock_tickets(State0, Pid, Keys),
+ {reply, ok, State};
+handle_call({store_ticket, Ticket, HKDF, SNI, PSK}, _From, State0) ->
+ State = store_ticket(State0, Ticket, HKDF, SNI, PSK),
+ {reply, ok, State};
+handle_call({unlock, Pid, Keys}, _From, State0) ->
+ State = unlock_tickets(State0, Pid, Keys),
+ {reply, ok, State};
+handle_call({update_ticket, Key, Pos}, _From, State0) ->
+ State = update_ticket(State0, Key, Pos),
+ {reply, ok, State}.
+
+-spec handle_cast(Request :: term(), State :: term()) ->
+ {noreply, NewState :: term()}.
+handle_cast({remove_tickets, Key}, State0) ->
+ State = remove_tickets(State0, Key),
+ {noreply, State};
+handle_cast(_Request, State) ->
+ {noreply, State}.
+
+-spec handle_info(Info :: timeout() | term(), State :: term()) ->
+ {noreply, NewState :: term()}.
+handle_info(remove_invalid_tickets, State0) ->
+ State = remove_invalid_tickets(State0),
+ {noreply, State};
+handle_info(_Info, State) ->
+ {noreply, State}.
+
+-spec terminate(Reason :: normal | shutdown | {shutdown, term()} | term(),
+ State :: term()) -> any().
+terminate(_Reason, _State) ->
+ ok.
+
+-spec code_change(OldVsn :: term() | {down, term()},
+ State :: term(),
+ Extra :: term()) -> {ok, NewState :: term()} |
+ {error, Reason :: term()}.
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
+
+
+-spec format_status(Opt :: normal | terminate,
+ Status :: list()) -> Status :: term().
+format_status(_Opt, Status) ->
+ Status.
+%%%===================================================================
+%%% Internal functions
+%%%===================================================================
+
+inital_state([Max, Lifetime]) ->
+ erlang:send_after(Lifetime * 1000, self(), remove_invalid_tickets),
+ #state{db = gb_trees:empty(),
+ lifetime = Lifetime,
+ max = Max
+ }.
+
+
+find_ticket(_, _, []) ->
+ undefined;
+find_ticket(#state{db = Db,
+ lifetime = Lifetime} = State, Pid, [Hash|T]) ->
+ case iterate_tickets(gb_trees:iterator(Db), Pid, Hash, Lifetime) of
+ none ->
+ find_ticket(State, Pid, T);
+ Key ->
+ Key
+ end.
+
+
+iterate_tickets(Iter0, Pid, Hash, Lifetime) ->
+ case gb_trees:next(Iter0) of
+ {Key, #data{hkdf = Hash,
+ timestamp = Timestamp,
+ lock = Lock}, Iter} when Lock =:= undefined orelse
+ Lock =:= Pid ->
+ Age = erlang:system_time(seconds) - Timestamp,
+ if Age < Lifetime ->
+ Key;
+ true ->
+ iterate_tickets(Iter, Pid, Hash, Lifetime)
+ end;
+ {_, _, Iter} ->
+ iterate_tickets(Iter, Pid, Hash, Lifetime);
+ none ->
+ none
+ end.
+
+
+%% Get tickets that are not locked by another process
+get_tickets(State, Pid, Keys) ->
+ get_tickets(State, Pid, Keys, []).
+%%
+get_tickets(_, _, [], []) ->
+ undefined; %% No tickets found
+get_tickets(_, _, [], Acc) ->
+ Acc;
+get_tickets(#state{db = Db} = State, Pid, [Key|T], Acc) ->
+ try gb_trees:get(Key, Db) of
+ #data{pos = Pos,
+ hkdf = HKDF,
+ psk = PSK,
+ timestamp = Timestamp,
+ ticket = NewSessionTicket,
+ lock = Lock} when Lock =:= undefined orelse
+ Lock =:= Pid ->
+ #new_session_ticket{
+ ticket_lifetime = _LifeTime,
+ ticket_age_add = AgeAdd,
+ ticket_nonce = Nonce,
+ ticket = Ticket,
+ extensions = _Extensions
+ } = NewSessionTicket,
+ TicketAge = erlang:system_time(seconds) - Timestamp,
+ ObfuscatedTicketAge = obfuscate_ticket_age(TicketAge, AgeAdd),
+ Identity = #psk_identity{
+ identity = Ticket,
+ obfuscated_ticket_age = ObfuscatedTicketAge},
+ get_tickets(State, Pid, T, [{Key, Pos, Identity, PSK, Nonce, HKDF}|Acc])
+ catch
+ _:_ ->
+ get_tickets(State, Pid, T, Acc)
+ end.
+
+%% The "obfuscated_ticket_age"
+%% field of each PskIdentity contains an obfuscated version of the
+%% ticket age formed by taking the age in milliseconds and adding the
+%% "ticket_age_add" value that was included with the ticket
+%% (see Section 4.6.1), modulo 2^32.
+obfuscate_ticket_age(TicketAge, AgeAdd) ->
+ (TicketAge + AgeAdd) rem round(math:pow(2,32)).
+
+
+remove_tickets(State, []) ->
+ State;
+remove_tickets(State0, [Key|T]) ->
+ remove_tickets(remove_ticket(State0, Key), T).
+
+
+remove_ticket(#state{db = Db0} = State, Key) ->
+ Db = gb_trees:delete_any(Key, Db0),
+ State#state{db = Db}.
+
+
+remove_invalid_tickets(#state{db = Db,
+ lifetime = Lifetime} = State0) ->
+ Keys = collect_invalid_tickets(gb_trees:iterator(Db), Lifetime),
+ State = remove_tickets(State0, Keys),
+ erlang:send_after(Lifetime * 1000, self(), remove_invalid_tickets),
+ State.
+
+
+collect_invalid_tickets(Iter, Lifetime) ->
+ collect_invalid_tickets(Iter, Lifetime, []).
+%%
+collect_invalid_tickets(Iter0, Lifetime, Acc) ->
+ case gb_trees:next(Iter0) of
+ {Key, #data{timestamp = Timestamp,
+ lock = undefined}, Iter} ->
+ Age = erlang:system_time(seconds) - Timestamp,
+ if Age < Lifetime ->
+ collect_invalid_tickets(Iter, Lifetime, Acc);
+ true ->
+ collect_invalid_tickets(Iter, Lifetime, [Key|Acc])
+ end;
+ {_, _, Iter} -> %% Skip locked tickets
+ collect_invalid_tickets(Iter, Lifetime, Acc);
+ none ->
+ Acc
+ end.
+
+
+store_ticket(#state{db = Db0, max = Max} = State, Ticket, HKDF, SNI, PSK) ->
+ Timestamp = erlang:system_time(seconds),
+ Size = gb_trees:size(Db0),
+ Db1 = if Size =:= Max ->
+ delete_oldest(Db0);
+ true ->
+ Db0
+ end,
+ Key = erlang:monotonic_time(),
+ Db = gb_trees:insert(Key,
+ #data{hkdf = HKDF,
+ sni = SNI,
+ psk = PSK,
+ timestamp = Timestamp,
+ ticket = Ticket},
+ Db1),
+ State#state{db = Db}.
+
+
+update_ticket(#state{db = Db0} = State, Key, Pos) ->
+ try gb_trees:get(Key, Db0) of
+ Value ->
+ Db = gb_trees:update(Key, Value#data{pos = Pos}, Db0),
+ State#state{db = Db}
+ catch
+ _:_ ->
+ State
+ end.
+
+
+delete_oldest(Db0) ->
+ try gb_trees:take_smallest(Db0) of
+ {_, _, Db} ->
+ Db
+ catch
+ _:_ ->
+ Db0
+ end.
+
+
+lock_tickets(State, Pid, Keys) ->
+ set_lock(State, Pid, Keys, lock).
+
+
+unlock_tickets(State, Pid, Keys) ->
+ set_lock(State, Pid, Keys, unlock).
+
+
+set_lock(State, _, [], _) ->
+ State;
+set_lock(#state{db = Db0} = State, Pid, [Key|T], Cmd) ->
+ try gb_trees:get(Key, Db0) of
+ Value ->
+ Db = gb_trees:update(Key, update_data_lock(Value, Pid, Cmd), Db0),
+ set_lock(State#state{db = Db}, Pid, T, Cmd)
+ catch
+ _:_ ->
+ set_lock(State, Pid, T, Cmd)
+ end.
+
+
+update_data_lock(Value, Pid, lock) ->
+ Value#data{lock = Pid};
+update_data_lock(#data{lock = Pid} = Value, Pid, unlock) ->
+ Value#data{lock = undefined};
+update_data_lock(Value, _, _) ->
+ Value.
diff --git a/lib/ssl/src/tls_connection.erl b/lib/ssl/src/tls_connection.erl
index cf104cd805..20224f4c65 100644
--- a/lib/ssl/src/tls_connection.erl
+++ b/lib/ssl/src/tls_connection.erl
@@ -98,28 +98,28 @@
%%====================================================================
%% Setup
%%====================================================================
-start_fsm(Role, Host, Port, Socket, {#{erl_dist := false},_, Tracker} = Opts,
+start_fsm(Role, Host, Port, Socket, {#{erl_dist := false},_, Trackers} = Opts,
User, {CbModule, _,_, _, _} = CbInfo,
Timeout) ->
try
{ok, Sender} = tls_sender:start(),
{ok, Pid} = tls_connection_sup:start_child([Role, Sender, Host, Port, Socket,
Opts, User, CbInfo]),
- {ok, SslSocket} = ssl_connection:socket_control(?MODULE, Socket, [Pid, Sender], CbModule, Tracker),
+ {ok, SslSocket} = ssl_connection:socket_control(?MODULE, Socket, [Pid, Sender], CbModule, Trackers),
ssl_connection:handshake(SslSocket, Timeout)
catch
error:{badmatch, {error, _} = Error} ->
Error
end;
-start_fsm(Role, Host, Port, Socket, {#{erl_dist := true},_, Tracker} = Opts,
+start_fsm(Role, Host, Port, Socket, {#{erl_dist := true},_, Trackers} = Opts,
User, {CbModule, _,_, _, _} = CbInfo,
Timeout) ->
try
{ok, Sender} = tls_sender:start([{spawn_opt, ?DIST_CNTRL_SPAWN_OPTS}]),
{ok, Pid} = tls_connection_sup:start_child_dist([Role, Sender, Host, Port, Socket,
Opts, User, CbInfo]),
- {ok, SslSocket} = ssl_connection:socket_control(?MODULE, Socket, [Pid, Sender], CbModule, Tracker),
+ {ok, SslSocket} = ssl_connection:socket_control(?MODULE, Socket, [Pid, Sender], CbModule, Trackers),
ssl_connection:handshake(SslSocket, Timeout)
catch
error:{badmatch, {error, _} = Error} ->
@@ -298,9 +298,12 @@ handle_protocol_record(#ssl_tls{type = ?HANDSHAKE, fragment = Data},
StateName, #state{protocol_buffers =
#protocol_buffers{tls_handshake_buffer = Buf0} = Buffers,
connection_env = #connection_env{negotiated_version = Version},
+ static_env = #static_env{role = Role},
ssl_options = Options} = State0) ->
try
- EffectiveVersion = effective_version(Version, Options),
+ %% Calculate the effective version that should be used when decoding an incoming handshake
+ %% message.
+ EffectiveVersion = effective_version(Version, Options, Role),
{Packets, Buf} = tls_handshake:get_tls_handshake(EffectiveVersion,Data,Buf0, Options),
State =
State0#state{protocol_buffers =
@@ -514,8 +517,8 @@ protocol_name() ->
%% Data handling
%%====================================================================
-socket(Pids, Transport, Socket, Tracker) ->
- tls_socket:socket(Pids, Transport, Socket, ?MODULE, Tracker).
+socket(Pids, Transport, Socket, Trackers) ->
+ tls_socket:socket(Pids, Transport, Socket, ?MODULE, Trackers).
setopts(Transport, Socket, Other) ->
tls_socket:setopts(Transport, Socket, Other).
@@ -543,26 +546,48 @@ init({call, From}, {start, Timeout},
handshake_env = #handshake_env{renegotiation = {Renegotiation, _}} = HsEnv,
connection_env = CEnv,
ssl_options = #{log_level := LogLevel,
- versions := Versions} = SslOpts,
- session = #session{own_certificate = Cert} = Session0,
+ %% Use highest version in initial ClientHello.
+ %% Versions is a descending list of supported versions.
+ versions := [HelloVersion|_] = Versions,
+ session_tickets := SessionTickets} = SslOpts,
+ session = NewSession,
connection_states = ConnectionStates0
} = State0) ->
KeyShare = maybe_generate_client_shares(SslOpts),
+ Session = ssl_session:client_select_session({Host, Port, SslOpts}, Cache, CacheCb, NewSession),
+ %% Update UseTicket in case of automatic session resumption
+ {UseTicket, State1} = tls_handshake_1_3:maybe_automatic_session_resumption(State0),
+ TicketData = tls_handshake_1_3:get_ticket_data(self(), SessionTickets, UseTicket),
Hello = tls_handshake:client_hello(Host, Port, ConnectionStates0, SslOpts,
- Cache, CacheCb, Renegotiation, Cert, KeyShare),
+ Session#session.session_id,
+ Renegotiation,
+ Session#session.own_certificate,
+ KeyShare,
+ TicketData),
- HelloVersion = tls_record:hello_version(Versions),
Handshake0 = ssl_handshake:init_handshake_history(),
+
+ %% Update pre_shared_key extension with binders (TLS 1.3)
+ Hello1 = tls_handshake_1_3:maybe_add_binders(Hello, TicketData, HelloVersion),
+
{BinMsg, ConnectionStates, Handshake} =
- encode_handshake(Hello, HelloVersion, ConnectionStates0, Handshake0),
+ encode_handshake(Hello1, HelloVersion, ConnectionStates0, Handshake0),
+
tls_socket:send(Transport, Socket, BinMsg),
- ssl_logger:debug(LogLevel, outbound, 'handshake', Hello),
+ ssl_logger:debug(LogLevel, outbound, 'handshake', Hello1),
ssl_logger:debug(LogLevel, outbound, 'record', BinMsg),
- State = State0#state{connection_states = ConnectionStates,
- connection_env = CEnv#connection_env{negotiated_version = HelloVersion}, %% Requested version
- session =
- Session0#session{session_id = Hello#client_hello.session_id},
+ %% RequestedVersion is used as the legacy record protocol version and shall be
+ %% {3,3} in case of TLS 1.2 and higher. In all other cases it defaults to the
+ %% lowest supported protocol version.
+ %%
+ %% negotiated_version is also used by the TLS 1.3 state machine and is set after
+ %% ServerHello is processed.
+ RequestedVersion = tls_record:hello_version(Versions),
+ State = State1#state{connection_states = ConnectionStates,
+ connection_env = CEnv#connection_env{
+ negotiated_version = RequestedVersion},
+ session = Session,
handshake_env = HsEnv#handshake_env{tls_handshake_history = Handshake},
start_or_recv_from = From,
key_share = KeyShare},
@@ -599,7 +624,7 @@ hello(internal, #client_hello{extensions = Extensions} = Hello,
{next_state, user_hello, State#state{start_or_recv_from = undefined,
handshake_env = HsEnv#handshake_env{hello = Hello}},
[{reply, From, {ok, Extensions}}]};
-hello(internal, #server_hello{extensions = Extensions} = Hello,
+hello(internal, #server_hello{extensions = Extensions} = Hello,
#state{ssl_options = #{handshake := hello},
handshake_env = HsEnv,
start_or_recv_from = From} = State) ->
@@ -670,9 +695,12 @@ hello(internal, #server_hello{} = Hello,
ssl_connection:handle_session(Hello,
Version, NewId, ConnectionStates, ProtoExt, Protocol, State);
%% TLS 1.3
- {next_state, wait_sh} ->
+ {next_state, wait_sh, SelectedVersion} ->
%% Continue in TLS 1.3 'wait_sh' state
- {next_state, wait_sh, State, [{next_event, internal, Hello}]}
+ {next_state, wait_sh,
+ State#state{
+ connection_env = CEnv#connection_env{negotiated_version = SelectedVersion}},
+ [{next_event, internal, Hello}]}
end;
hello(info, Event, State) ->
gen_info(Event, ?FUNCTION_NAME, State);
@@ -762,11 +790,14 @@ connection(internal, #hello_request{},
connection_states = ConnectionStates} = State0) ->
try tls_sender:peer_renegotiate(Pid) of
{ok, Write} ->
+ Session = ssl_session:client_select_session({Host, Port, SslOpts}, Cache, CacheCb, Session0),
Hello = tls_handshake:client_hello(Host, Port, ConnectionStates, SslOpts,
- Cache, CacheCb, Renegotiation, Cert, undefined),
- {State, Actions} = send_handshake(Hello, State0#state{connection_states = ConnectionStates#{current_write => Write}}),
- next_event(hello, no_record, State#state{session = Session0#session{session_id
- = Hello#client_hello.session_id}}, Actions)
+ Session#session.session_id,
+ Renegotiation, Cert, undefined,
+ undefined),
+ {State, Actions} = send_handshake(Hello, State0#state{connection_states = ConnectionStates#{current_write => Write},
+ session = Session}),
+ next_event(hello, no_record, State, Actions)
catch
_:_ ->
{stop, {shutdown, sender_blocked}, State0}
@@ -774,19 +805,17 @@ connection(internal, #hello_request{},
connection(internal, #hello_request{},
#state{static_env = #static_env{role = client,
host = Host,
- port = Port,
- session_cache = Cache,
- session_cache_cb = CacheCb},
+ port = Port},
handshake_env = #handshake_env{renegotiation = {Renegotiation, _}},
- session = #session{own_certificate = Cert} = Session0,
+ session = #session{own_certificate = Cert},
ssl_options = SslOpts,
connection_states = ConnectionStates} = State0) ->
Hello = tls_handshake:client_hello(Host, Port, ConnectionStates, SslOpts,
- Cache, CacheCb, Renegotiation, Cert, undefined),
+ <<>>, Renegotiation, Cert, undefined,
+ undefined),
{State, Actions} = send_handshake(Hello, State0),
- next_event(hello, no_record, State#state{session = Session0#session{session_id
- = Hello#client_hello.session_id}}, Actions);
+ next_event(hello, no_record, State, Actions);
connection(internal, #client_hello{} = Hello,
#state{static_env = #static_env{role = server},
handshake_env = #handshake_env{allow_renegotiate = true}= HsEnv,
@@ -813,9 +842,9 @@ connection(internal, #client_hello{},
State = reinit_handshake_data(State0),
next_event(?FUNCTION_NAME, no_record, State);
-connection(internal, #new_session_ticket{}, State) ->
+connection(internal, #new_session_ticket{} = NewSessionTicket, State) ->
%% TLS 1.3
- %% Drop NewSessionTicket (currently not supported)
+ handle_new_session_ticket(NewSessionTicket, State),
next_event(?FUNCTION_NAME, no_record, State);
connection(Type, Event, State) ->
@@ -981,7 +1010,7 @@ code_change(_OldVsn, StateName, State, _) ->
%%--------------------------------------------------------------------
%%% Internal functions
%%--------------------------------------------------------------------
-initial_state(Role, Sender, Host, Port, Socket, {SSLOptions, SocketOptions, Tracker}, User,
+initial_state(Role, Sender, Host, Port, Socket, {SSLOptions, SocketOptions, Trackers}, User,
{CbModule, DataTag, CloseTag, ErrorTag, PassiveTag}) ->
#{beast_mitigation := BeastMitigation,
erl_dist := IsErlDist,
@@ -1012,8 +1041,8 @@ initial_state(Role, Sender, Host, Port, Socket, {SSLOptions, SocketOptions, Trac
port = Port,
socket = Socket,
session_cache_cb = SessionCacheCb,
- tracker = Tracker
- },
+ trackers = Trackers
+ },
#state{
static_env = InitStatEnv,
handshake_env = #handshake_env{
@@ -1040,7 +1069,7 @@ initialize_tls_sender(#state{static_env = #static_env{
role = Role,
transport_cb = Transport,
socket = Socket,
- tracker = Tracker
+ trackers = Trackers
},
connection_env = #connection_env{negotiated_version = Version},
socket_options = SockOpts,
@@ -1052,7 +1081,7 @@ initialize_tls_sender(#state{static_env = #static_env{
role => Role,
socket => Socket,
socket_options => SockOpts,
- tracker => Tracker,
+ trackers => Trackers,
transport_cb => Transport,
negotiated_version => Version,
renegotiate_at => RenegotiateAt,
@@ -1065,12 +1094,19 @@ next_tls_record(Data, StateName,
tls_cipher_texts = CT0} = Buffers,
ssl_options = SslOpts} = State0) ->
Versions =
- %% TLS 1.3 Client/Server
- %% - Ignore TLSPlaintext.legacy_record_version
- %% - Verify that TLSCiphertext.legacy_record_version is set to 0x0303 for all records
- %% other than an initial ClientHello, where it MAY also be 0x0301.
+ %% TLSPlaintext.legacy_record_version is ignored in TLS 1.3 and thus all
+ %% record version are accepted when receiving initial ClientHello and
+ %% ServerHello. This can happen in state 'hello' in case of all TLS
+ %% versions and also in state 'start' when TLS 1.3 is negotiated.
+ %% After the version is negotiated all subsequent TLS records shall have
+ %% the proper legacy_record_version (= negotiated_version).
+ %% Note: TLS record version {3,4} is used internally in TLS 1.3 and at this
+ %% point it is the same as the negotiated protocol version.
+ %% TODO: Refactor state machine and introduce a record_protocol_version beside
+ %% the negotiated_version.
case StateName of
- hello ->
+ State when State =:= hello orelse
+ State =:= start ->
[tls_record:protocol_version(Vsn) || Vsn <- ?ALL_AVAILABLE_VERSIONS];
_ ->
State0#state.connection_env#connection_env.negotiated_version
@@ -1323,7 +1359,55 @@ choose_tls_version(_, _) ->
'tls_v1.2'.
-effective_version(undefined, #{versions := [Version|_]}) ->
+%% Special version handling for TLS 1.3 clients:
+%% In the shared state 'init' negotiated_version is set to requested version and
+%% that is expected by the legacy part of the state machine. However, in order to
+%% be able to process new TLS 1.3 extensions, the effective version shall be set
+%% {3,4}.
+%% When highest supported version is {3,4} the negotiated version is set to {3,3}.
+effective_version({3,3} , #{versions := [Version|_]}, client) when Version >= {3,4} ->
+ Version;
+%% Use highest supported version during startup (TLS server, all versions).
+effective_version(undefined, #{versions := [Version|_]}, _) ->
Version;
-effective_version(Version, _) ->
+%% Use negotiated version in all other cases.
+effective_version(Version, _, _) ->
Version.
+
+
+handle_new_session_ticket(_, #state{ssl_options = #{session_tickets := disabled}}) ->
+ ok;
+handle_new_session_ticket(#new_session_ticket{ticket_nonce = Nonce} = NewSessionTicket,
+ #state{connection_states = ConnectionStates,
+ ssl_options = #{session_tickets := SessionTickets,
+ server_name_indication := SNI},
+ connection_env = #connection_env{user_application = {_, User}}})
+ when SessionTickets =:= enabled ->
+ #{security_parameters := SecParams} =
+ ssl_record:current_connection_state(ConnectionStates, read),
+ HKDF = SecParams#security_parameters.prf_algorithm,
+ RMS = SecParams#security_parameters.resumption_master_secret,
+ PSK = tls_v1:pre_shared_key(RMS, Nonce, HKDF),
+ send_ticket_data(User, NewSessionTicket, HKDF, SNI, PSK);
+handle_new_session_ticket(#new_session_ticket{ticket_nonce = Nonce} = NewSessionTicket,
+ #state{connection_states = ConnectionStates,
+ ssl_options = #{session_tickets := SessionTickets,
+ server_name_indication := SNI}})
+ when SessionTickets =:= auto ->
+ #{security_parameters := SecParams} =
+ ssl_record:current_connection_state(ConnectionStates, read),
+ HKDF = SecParams#security_parameters.prf_algorithm,
+ RMS = SecParams#security_parameters.resumption_master_secret,
+ PSK = tls_v1:pre_shared_key(RMS, Nonce, HKDF),
+ tls_client_ticket_store:store_ticket(NewSessionTicket, HKDF, SNI, PSK).
+
+
+%% Send ticket data to user as opaque binary
+send_ticket_data(User, NewSessionTicket, HKDF, SNI, PSK) ->
+ Timestamp = erlang:system_time(seconds),
+ TicketData = #{hkdf => HKDF,
+ sni => SNI,
+ psk => PSK,
+ timestamp => Timestamp,
+ ticket => NewSessionTicket},
+ User ! {ssl, session_ticket, {SNI, erlang:term_to_binary(TicketData)}}.
diff --git a/lib/ssl/src/tls_connection_1_3.erl b/lib/ssl/src/tls_connection_1_3.erl
index 117e4f059d..6fb96b1f5a 100644
--- a/lib/ssl/src/tls_connection_1_3.erl
+++ b/lib/ssl/src/tls_connection_1_3.erl
@@ -128,7 +128,9 @@ start(internal, #client_hello{} = Hello, State0, _Module) ->
{State, start} ->
{next_state, start, State, []};
{State, negotiated} ->
- {next_state, negotiated, State, [{next_event, internal, start_handshake}]}
+ {next_state, negotiated, State, [{next_event, internal, {start_handshake, undefined}}]};
+ {State, negotiated, PSK} -> %% Session Resumption with PSK
+ {next_state, negotiated, State, [{next_event, internal, {start_handshake, PSK}}]}
end;
start(internal, #server_hello{} = ServerHello, State0, _Module) ->
case tls_handshake_1_3:do_start(ServerHello, State0) of
diff --git a/lib/ssl/src/tls_handshake.erl b/lib/ssl/src/tls_handshake.erl
index 203f89a0b8..474cbd621b 100644
--- a/lib/ssl/src/tls_handshake.erl
+++ b/lib/ssl/src/tls_handshake.erl
@@ -51,18 +51,18 @@
%%====================================================================
%%--------------------------------------------------------------------
-spec client_hello(ssl:host(), inet:port_number(), ssl_record:connection_states(),
- ssl_options(), integer(), atom(), boolean(), der_cert(),
- #key_share_client_hello{} | undefined) ->
+ ssl_options(), binary(), boolean(), der_cert(),
+ #key_share_client_hello{} | undefined, tuple() | undefined) ->
#client_hello{}.
%%
%% Description: Creates a client hello message.
%%--------------------------------------------------------------------
-client_hello(Host, Port, ConnectionStates,
+client_hello(_Host, _Port, ConnectionStates,
#{versions := Versions,
ciphers := UserSuites,
fallback := Fallback
} = SslOpts,
- Cache, CacheCb, Renegotiation, OwnCert, KeyShare) ->
+ Id, Renegotiation, _OwnCert, KeyShare, TicketData) ->
Version = tls_record:highest_protocol_version(Versions),
%% In TLS 1.3, the client indicates its version preferences in the
@@ -83,9 +83,9 @@ client_hello(Host, Port, ConnectionStates,
AvailableCipherSuites,
SslOpts, ConnectionStates,
Renegotiation,
- KeyShare),
+ KeyShare,
+ TicketData),
CipherSuites = ssl_handshake:cipher_suites(AvailableCipherSuites, Renegotiation, Fallback),
- Id = ssl_session:client_id({Host, Port, SslOpts}, Cache, CacheCb, OwnCert),
#client_hello{session_id = Id,
client_version = LegacyVersion,
cipher_suites = CipherSuites,
@@ -105,7 +105,7 @@ client_hello(Host, Port, ConnectionStates,
{tls_record:tls_version(), {resumed | new, #session{}},
ssl_record:connection_states(), binary() | undefined,
HelloExt::map(), {ssl:hash(), ssl:sign_algo()} |
- undefined} | {atom(), atom()} |#alert{}.
+ undefined} | {atom(), atom()} | {atom(), atom(), tuple()} | #alert{}.
%%
%% Description: Handles a received hello message
%%--------------------------------------------------------------------
@@ -175,9 +175,9 @@ hello(#server_hello{server_version = LegacyVersion,
handle_server_hello_extensions(Version, SessionId, Random, CipherSuite,
Compression, HelloExt, SslOpt,
ConnectionStates0, Renegotiation);
- {3,4} ->
+ SelectedVersion ->
%% TLS 1.3
- {next_state, wait_sh}
+ {next_state, wait_sh, SelectedVersion}
end;
false ->
?ALERT_REC(?FATAL, ?ILLEGAL_PARAMETER)
diff --git a/lib/ssl/src/tls_handshake_1_3.erl b/lib/ssl/src/tls_handshake_1_3.erl
index 5f4c0b9a4a..119ed75d36 100644
--- a/lib/ssl/src/tls_handshake_1_3.erl
+++ b/lib/ssl/src/tls_handshake_1_3.erl
@@ -48,8 +48,13 @@
do_wait_finished/2,
do_wait_sh/2,
do_wait_ee/2,
- do_wait_cert_cr/2]).
+ do_wait_cert_cr/2,
+ get_ticket_data/3,
+ maybe_add_binders/3,
+ maybe_add_binders/4,
+ maybe_automatic_session_resumption/1]).
+-export([is_valid_binder/4]).
%% crypto:hash(sha256, "HelloRetryRequest").
-define(HELLO_RETRY_REQUEST_RANDOM, <<207,33,173,116,229,154,97,17,
@@ -61,10 +66,10 @@
%% Create handshake messages
%%====================================================================
-server_hello(MsgType, SessionId, KeyShare, ConnectionStates) ->
+server_hello(MsgType, SessionId, KeyShare, PSK, ConnectionStates) ->
#{security_parameters := SecParams} =
ssl_record:pending_connection_state(ConnectionStates, read),
- Extensions = server_hello_extensions(MsgType, KeyShare),
+ Extensions = server_hello_extensions(MsgType, KeyShare, PSK),
#server_hello{server_version = {3,3}, %% legacy_version
cipher_suite = SecParams#security_parameters.cipher_suite,
compression_method = 0, %% legacy attribute
@@ -81,13 +86,19 @@ server_hello(MsgType, SessionId, KeyShare, ConnectionStates) ->
%% extensions that were not first offered by the client in its
%% ClientHello, with the exception of optionally the "cookie" (see
%% Section 4.2.2) extension.
-server_hello_extensions(hello_retry_request = MsgType, KeyShare) ->
+server_hello_extensions(hello_retry_request = MsgType, KeyShare, _) ->
SupportedVersions = #server_hello_selected_version{selected_version = {3,4}},
Extensions = #{server_hello_selected_version => SupportedVersions},
ssl_handshake:add_server_share(MsgType, Extensions, KeyShare);
-server_hello_extensions(MsgType, KeyShare) ->
+server_hello_extensions(MsgType, KeyShare, undefined) ->
SupportedVersions = #server_hello_selected_version{selected_version = {3,4}},
Extensions = #{server_hello_selected_version => SupportedVersions},
+ ssl_handshake:add_server_share(MsgType, Extensions, KeyShare);
+server_hello_extensions(MsgType, KeyShare, {SelectedIdentity, _}) ->
+ SupportedVersions = #server_hello_selected_version{selected_version = {3,4}},
+ PreSharedKey = #pre_shared_key_server_hello{selected_identity = SelectedIdentity},
+ Extensions = #{server_hello_selected_version => SupportedVersions,
+ pre_shared_key => PreSharedKey},
ssl_handshake:add_server_share(MsgType, Extensions, KeyShare).
@@ -271,9 +282,11 @@ encode_handshake(#new_session_ticket{
ticket = Ticket,
extensions = Exts}) ->
TicketSize = byte_size(Ticket),
+ NonceSize = byte_size(Nonce),
BinExts = encode_extensions(Exts),
{?NEW_SESSION_TICKET, <<?UINT32(LifeTime), ?UINT32(Age),
- ?BYTE(Nonce), ?UINT16(TicketSize), Ticket/binary,
+ ?BYTE(NonceSize), Nonce/binary,
+ ?UINT16(TicketSize), Ticket/binary,
BinExts/binary>>};
encode_handshake(#end_of_early_data{}) ->
{?END_OF_EARLY_DATA, <<>>};
@@ -352,6 +365,18 @@ decode_handshake(?KEY_UPDATE, <<?BYTE(Update)>>) ->
decode_handshake(Tag, HandshakeMsg) ->
ssl_handshake:decode_handshake({3,4}, Tag, HandshakeMsg).
+is_valid_binder(Binder, HHistory, PSK, Hash) ->
+ case HHistory of
+ [ClientHello2, HRR, MessageHash|_] ->
+ Truncated = truncate_client_hello(ClientHello2),
+ FinishedKey = calculate_finished_key(PSK, Hash),
+ Binder == calculate_binder(FinishedKey, Hash, [MessageHash, HRR, Truncated]);
+ [ClientHello1|_] ->
+ Truncated = truncate_client_hello(ClientHello1),
+ FinishedKey = calculate_finished_key(PSK, Hash),
+ Binder == calculate_binder(FinishedKey, Hash, Truncated)
+ end.
+
%%--------------------------------------------------------------------
%%% Internal functions
%%--------------------------------------------------------------------
@@ -515,6 +540,8 @@ do_start(#client_hello{cipher_suites = ClientCiphers,
ClientShares0 = maps:get(key_share, Extensions, undefined),
ClientShares = get_key_shares(ClientShares0),
+ OfferedPSKs = get_offered_psks(Extensions),
+
ClientALPN0 = maps:get(alpn, Extensions, undefined),
ClientALPN = ssl_handshake:decode_alpn(ClientALPN0),
@@ -534,6 +561,7 @@ do_start(#client_hello{cipher_suites = ClientCiphers,
%% and a signature algorithm/certificate pair to authenticate itself to
%% the client.
Cipher = Maybe(select_cipher_suite(HonorCipherOrder, ClientCiphers, ServerCiphers)),
+
Groups = Maybe(select_common_groups(ServerGroups, ClientGroups)),
Maybe(validate_client_key_share(ClientGroups, ClientShares)),
@@ -569,10 +597,14 @@ do_start(#client_hello{cipher_suites = ClientCiphers,
%% message if it is able to find an acceptable set of parameters but the
%% ClientHello does not contain sufficient information to proceed with
%% the handshake.
- Maybe(send_hello_retry_request(State1, ClientPubKey, KeyShare, SessionId))
-
- %% TODO: session handling
-
+ case Maybe(send_hello_retry_request(State1, ClientPubKey, KeyShare, SessionId)) of
+ {_, start} = NextStateTuple ->
+ NextStateTuple;
+ {_, negotiated} = NextStateTuple ->
+ %% Exclude any incompatible PSKs.
+ PSK = Maybe(handle_pre_shared_key(State1, OfferedPSKs, Cipher)),
+ Maybe(session_resumption(NextStateTuple, PSK))
+ end
catch
{Ref, {insufficient_security, no_suitable_groups}} ->
?ALERT_REC(?FATAL, ?INSUFFICIENT_SECURITY, no_suitable_groups);
@@ -590,20 +622,18 @@ do_start(#client_hello{cipher_suites = ClientCiphers,
%% TLS Client
do_start(#server_hello{cipher_suite = SelectedCipherSuite,
session_id = SessionId,
- extensions = Extensions} = _ServerHello,
+ extensions = Extensions},
#state{static_env = #static_env{role = client,
host = Host,
port = Port,
transport_cb = Transport,
- socket = Socket,
- session_cache = Cache,
- session_cache_cb = CacheCb},
- handshake_env = #handshake_env{renegotiation = {Renegotiation, _},
- tls_handshake_history = _HHistory} = HsEnv,
- connection_env = CEnv,
+ socket = Socket},
+ handshake_env = #handshake_env{renegotiation = {Renegotiation, _}} = HsEnv,
+ connection_env = #connection_env{negotiated_version = NegotiatedVersion},
ssl_options = #{ciphers := ClientCiphers,
supported_groups := ClientGroups0,
- versions := Versions,
+ use_ticket := UseTicket,
+ session_tickets := SessionTickets,
log_level := LogLevel} = SslOpts,
session = #session{own_certificate = Cert} = Session0,
connection_states = ConnectionStates0
@@ -632,10 +662,10 @@ do_start(#server_hello{cipher_suite = SelectedCipherSuite,
%% new KeyShareEntry for the group indicated in the selected_group field
%% of the triggering HelloRetryRequest.
ClientKeyShare = ssl_cipher:generate_client_shares([SelectedGroup]),
- Hello = tls_handshake:client_hello(Host, Port, ConnectionStates0, SslOpts,
- Cache, CacheCb, Renegotiation, Cert, ClientKeyShare),
-
- HelloVersion = tls_record:hello_version(Versions),
+ TicketData = get_ticket_data(self(), SessionTickets, UseTicket),
+ Hello0 = tls_handshake:client_hello(Host, Port, ConnectionStates0, SslOpts,
+ SessionId, Renegotiation, Cert, ClientKeyShare,
+ TicketData),
%% Update state
State1 = update_start_state(State0,
@@ -646,19 +676,21 @@ do_start(#server_hello{cipher_suite = SelectedCipherSuite,
%% Replace ClientHello1 with a special synthetic handshake message
State2 = replace_ch1_with_message_hash(State1),
- #state{handshake_env = #handshake_env{tls_handshake_history = HHistory}} = State2,
+ #state{handshake_env = #handshake_env{tls_handshake_history = HHistory0}} = State2,
+
+ %% Update pre_shared_key extension with binders (TLS 1.3)
+ Hello = tls_handshake_1_3:maybe_add_binders(Hello0, HHistory0, TicketData, NegotiatedVersion),
- {BinMsg, ConnectionStates, Handshake} =
- tls_connection:encode_handshake(Hello, HelloVersion, ConnectionStates0, HHistory),
+ {BinMsg, ConnectionStates, HHistory} =
+ tls_connection:encode_handshake(Hello, NegotiatedVersion, ConnectionStates0, HHistory0),
tls_socket:send(Transport, Socket, BinMsg),
ssl_logger:debug(LogLevel, outbound, 'handshake', Hello),
ssl_logger:debug(LogLevel, outbound, 'record', BinMsg),
State = State2#state{
connection_states = ConnectionStates,
- connection_env = CEnv#connection_env{negotiated_version = HelloVersion}, %% Requested version
session = Session0#session{session_id = Hello#client_hello.session_id},
- handshake_env = HsEnv#handshake_env{tls_handshake_history = Handshake},
+ handshake_env = HsEnv#handshake_env{tls_handshake_history = HHistory},
key_share = ClientKeyShare},
{State, wait_sh}
@@ -669,36 +701,32 @@ do_start(#server_hello{cipher_suite = SelectedCipherSuite,
end.
-do_negotiated(start_handshake,
+do_negotiated({start_handshake, PSK0},
#state{connection_states = ConnectionStates0,
session = #session{session_id = SessionId,
- own_certificate = OwnCert,
ecc = SelectedGroup,
- sign_alg = SignatureScheme,
dh_public_value = ClientPublicKey},
ssl_options = #{} = SslOpts,
- key_share = KeyShare,
- handshake_env = #handshake_env{tls_handshake_history = _HHistory0},
- connection_env = #connection_env{private_key = CertPrivateKey},
- static_env = #static_env{
- cert_db = CertDbHandle,
- cert_db_ref = CertDbRef,
- socket = _Socket,
- transport_cb = _Transport}
- } = State0) ->
+ key_share = KeyShare} = State0) ->
ServerPrivateKey = get_server_private_key(KeyShare),
- {Ref,Maybe} = maybe(),
+ #{security_parameters := SecParamsR} =
+ ssl_record:pending_connection_state(ConnectionStates0, read),
+ #security_parameters{prf_algorithm = HKDF} = SecParamsR,
+
+ {Ref,Maybe} = maybe(),
try
%% Create server_hello
- %% Extensions: supported_versions, key_share, (pre_shared_key)
- ServerHello = server_hello(server_hello, SessionId, KeyShare, ConnectionStates0),
+ ServerHello = server_hello(server_hello, SessionId, KeyShare, PSK0, ConnectionStates0),
{State1, _} = tls_connection:send_handshake(ServerHello, State0),
+ PSK = get_pre_shared_key(PSK0, HKDF),
+
State2 =
- calculate_handshake_secrets(ClientPublicKey, ServerPrivateKey, SelectedGroup, State1),
+ calculate_handshake_secrets(ClientPublicKey, ServerPrivateKey, SelectedGroup,
+ PSK, State1),
State3 = ssl_record:step_encryption_state(State2),
@@ -709,19 +737,13 @@ do_negotiated(start_handshake,
State4 = tls_connection:queue_handshake(EncryptedExtensions, State3),
%% Create and send CertificateRequest ({verify, verify_peer})
- {State5, NextState} = maybe_send_certificate_request(State4, SslOpts),
+ {State5, NextState} = maybe_send_certificate_request(State4, SslOpts, PSK0),
- %% Create Certificate
- Certificate = Maybe(certificate(OwnCert, CertDbHandle, CertDbRef, <<>>, server)),
+ %% Create and send Certificate (if PSK is undefined)
+ State6 = Maybe(maybe_send_certificate(State5, PSK0)),
- %% Encode Certificate
- State6 = tls_connection:queue_handshake(Certificate, State5),
-
- %% Create CertificateVerify
- CertificateVerify = Maybe(certificate_verify(CertPrivateKey, SignatureScheme,
- State6, server)),
- %% Encode CertificateVerify
- State7 = tls_connection:queue_handshake(CertificateVerify, State6),
+ %% Create and send CertificateVerify (if PSK is undefined)
+ State7 = Maybe(maybe_send_certificate_verify(State6, PSK0)),
%% Create Finished
Finished = finished(State7),
@@ -779,17 +801,19 @@ do_wait_cv(#certificate_verify_1_3{} = CertificateVerify, State0) ->
%% TLS Server
do_wait_finished(#finished{verify_data = VerifyData},
#state{static_env = #static_env{role = server}} = State0) ->
-
{Ref,Maybe} = maybe(),
try
Maybe(validate_client_finished(State0, VerifyData)),
State1 = calculate_traffic_secrets(State0),
+ State2 = maybe_calculate_resumption_master_secret(State1),
%% Configure traffic keys
- ssl_record:step_encryption_state(State1)
+ State3 = ssl_record:step_encryption_state(State2),
+ %% Send session ticket
+ maybe_send_session_ticket(State3, 3)
catch
{Ref, decrypt_error} ->
@@ -816,9 +840,10 @@ do_wait_finished(#finished{verify_data = _VerifyData},
{State3, _} = tls_connection:send_handshake_flight(State2),
State4 = calculate_traffic_secrets(State3),
+ State5 = maybe_calculate_resumption_master_secret(State4),
%% Configure traffic keys
- ssl_record:step_encryption_state(State4)
+ ssl_record:step_encryption_state(State5)
catch
{Ref, decrypt_error} ->
@@ -835,9 +860,13 @@ do_wait_sh(#server_hello{cipher_suite = SelectedCipherSuite,
extensions = Extensions} = ServerHello,
#state{key_share = ClientKeyShare0,
ssl_options = #{ciphers := ClientCiphers,
- supported_groups := ClientGroups0}} = State0) ->
+ supported_groups := ClientGroups0,
+ session_tickets := SessionTickets,
+ use_ticket := UseTicket}} = State0) ->
ClientGroups = get_supported_groups(ClientGroups0),
ServerKeyShare0 = maps:get(key_share, Extensions, undefined),
+ ServerPreSharedKey = maps:get(pre_shared_key, Extensions, undefined),
+ SelectedIdentity = get_selected_identity(ServerPreSharedKey),
ClientKeyShare = get_key_shares(ClientKeyShare0),
{Ref,Maybe} = maybe(),
@@ -845,6 +874,8 @@ do_wait_sh(#server_hello{cipher_suite = SelectedCipherSuite,
%% Go to state 'start' if server replies with 'HelloRetryRequest'.
Maybe(maybe_hello_retry_request(ServerHello, State0)),
+ %% Resumption and PSK
+ State1 = handle_resumption(State0, SelectedIdentity),
ServerKeyShare = get_key_shares(ServerKeyShare0),
Maybe(validate_cipher_suite(SelectedCipherSuite, ClientCiphers)),
@@ -856,18 +887,24 @@ do_wait_sh(#server_hello{cipher_suite = SelectedCipherSuite,
{_, ClientPrivateKey} = get_client_private_key([SelectedGroup], ClientKeyShare),
%% Update state
- State1 = update_start_state(State0,
+ State2 = update_start_state(State1,
#{cipher => SelectedCipherSuite,
key_share => ClientKeyShare0,
session_id => SessionId,
group => SelectedGroup,
peer_public_key => ServerPublicKey}),
- State2 = calculate_handshake_secrets(ServerPublicKey, ClientPrivateKey, SelectedGroup, State1),
+ #state{connection_states = ConnectionStates} = State2,
+ #{security_parameters := SecParamsR} =
+ ssl_record:pending_connection_state(ConnectionStates, read),
+ #security_parameters{prf_algorithm = HKDFAlgo} = SecParamsR,
- State3 = ssl_record:step_encryption_state(State2),
+ PSK = Maybe(get_pre_shared_key(SessionTickets, UseTicket, HKDFAlgo, SelectedIdentity)),
+ State3 = calculate_handshake_secrets(ServerPublicKey, ClientPrivateKey, SelectedGroup,
+ PSK, State2),
+ State4 = ssl_record:step_encryption_state(State3),
- {State3, wait_ee}
+ {State4, wait_ee}
catch
{Ref, {State, StateName, ServerHello}} ->
@@ -890,9 +927,12 @@ do_wait_ee(#encrypted_extensions{extensions = Extensions}, State0) ->
ALPNProtocol0 = maps:get(alpn, Extensions, undefined),
ALPNProtocol = get_alpn(ALPNProtocol0),
- {Ref,_Maybe} = maybe(),
+ {Ref, Maybe} = maybe(),
try
+ %% Go to state 'wait_finished' if using PSK.
+ Maybe(maybe_resumption(State0)),
+
%% Update state
#state{handshake_env = HsEnv} = State0,
State1 = State0#state{handshake_env = HsEnv#handshake_env{alpn = ALPNProtocol}},
@@ -908,7 +948,9 @@ do_wait_ee(#encrypted_extensions{extensions = Extensions}, State0) ->
{Ref, {insufficient_security, no_suitable_signature_algorithm}} ->
?ALERT_REC(?FATAL, ?INSUFFICIENT_SECURITY, "No suitable signature algorithm");
{Ref, {insufficient_security, no_suitable_public_key}} ->
- ?ALERT_REC(?FATAL, ?INSUFFICIENT_SECURITY, no_suitable_public_key)
+ ?ALERT_REC(?FATAL, ?INSUFFICIENT_SECURITY, no_suitable_public_key);
+ {Ref, {State, StateName}} ->
+ {State, StateName}
end.
@@ -974,6 +1016,19 @@ maybe_hello_retry_request(_, _) ->
ok.
+maybe_resumption(#state{handshake_env = #handshake_env{resumption = true}} = State) ->
+ {error, {State, wait_finished}};
+maybe_resumption(_) ->
+ ok.
+
+
+handle_resumption(State, undefined) ->
+ State;
+handle_resumption(#state{handshake_env = HSEnv0} = State, _) ->
+ HSEnv = HSEnv0#handshake_env{resumption = true},
+ State#state{handshake_env = HSEnv}.
+
+
maybe_queue_cert_cert_cv(#state{client_certificate_requested = false} = State) ->
{ok, State};
maybe_queue_cert_cert_cv(#state{connection_states = _ConnectionStates0,
@@ -1054,7 +1109,7 @@ compare_verify_data(_, _) ->
send_hello_retry_request(#state{connection_states = ConnectionStates0} = State0,
no_suitable_key, KeyShare, SessionId) ->
- ServerHello = server_hello(hello_retry_request, SessionId, KeyShare, ConnectionStates0),
+ ServerHello = server_hello(hello_retry_request, SessionId, KeyShare, undefined, ConnectionStates0),
{State1, _} = tls_connection:send_handshake(ServerHello, State0),
%% Update handshake history
@@ -1065,16 +1120,72 @@ send_hello_retry_request(State0, _, _, _) ->
%% Suitable key found.
{ok, {State0, negotiated}}.
+session_resumption({#state{ssl_options = #{session_tickets := disabled}} = State, negotiated}, _) ->
+ {ok, {State, negotiated}};
+session_resumption({#state{ssl_options = #{session_tickets := Tickets}} = State, negotiated}, undefined)
+ when Tickets =/= disabled ->
+ {ok, {State, negotiated}};
+session_resumption({#state{ssl_options = #{session_tickets := Tickets}} = State0, negotiated}, PSK)
+ when Tickets =/= disabled ->
+ State = handle_resumption(State0, ok),
+ {ok, {State, negotiated, PSK}}.
-maybe_send_certificate_request(State, #{verify := verify_none}) ->
+
+%% Do not send CR during session resumption
+maybe_send_certificate_request(State, _, PSK) when PSK =/= undefined ->
+ {State, wait_finished};
+maybe_send_certificate_request(State, #{verify := verify_none}, _) ->
{State, wait_finished};
maybe_send_certificate_request(State, #{verify := verify_peer,
signature_algs := SignAlgs,
- signature_algs_cert := SignAlgsCert}) ->
+ signature_algs_cert := SignAlgsCert}, _) ->
CertificateRequest = certificate_request(SignAlgs, SignAlgsCert),
{tls_connection:queue_handshake(CertificateRequest, State), wait_cert}.
+maybe_send_certificate(State, PSK) when PSK =/= undefined ->
+ {ok, State};
+maybe_send_certificate(#state{session = #session{own_certificate = OwnCert},
+ static_env = #static_env{
+ cert_db = CertDbHandle,
+ cert_db_ref = CertDbRef}} = State, _) ->
+ case certificate(OwnCert, CertDbHandle, CertDbRef, <<>>, server) of
+ {ok, Certificate} ->
+ {ok, tls_connection:queue_handshake(Certificate, State)};
+ Error ->
+ Error
+ end.
+
+
+maybe_send_certificate_verify(State, PSK) when PSK =/= undefined ->
+ {ok, State};
+maybe_send_certificate_verify(#state{session = #session{sign_alg = SignatureScheme},
+ connection_env = #connection_env{
+ private_key = CertPrivateKey}} = State, _) ->
+ case certificate_verify(CertPrivateKey, SignatureScheme, State, server) of
+ {ok, CertificateVerify} ->
+ {ok, tls_connection:queue_handshake(CertificateVerify, State)};
+ Error ->
+ Error
+ end.
+
+
+maybe_send_session_ticket(#state{ssl_options = #{session_tickets := disabled}} = State, _) ->
+ %% Do nothing!
+ State;
+maybe_send_session_ticket(State, 0) ->
+ State;
+maybe_send_session_ticket(#state{connection_states = ConnectionStates,
+ static_env = #static_env{trackers = Trackers}} = State0, N) ->
+ Tracker = proplists:get_value(session_tickets_tracker, Trackers),
+ #{security_parameters := SecParamsR} =
+ ssl_record:current_connection_state(ConnectionStates, read),
+ #security_parameters{prf_algorithm = HKDF,
+ resumption_master_secret = RMS} = SecParamsR,
+ Ticket = tls_server_session_ticket:new(Tracker, HKDF, RMS),
+ {State, _} = tls_connection:send_handshake(Ticket, State0),
+ maybe_send_session_ticket(State, N - 1).
+
process_certificate_request(#certificate_request_1_3{},
#state{session = #session{own_certificate = undefined}} = State) ->
{ok, {State#state{client_certificate_requested = true}, wait_cert}};
@@ -1186,6 +1297,7 @@ validate_certificate_chain(Certs, CertDbHandle, CertDbRef,
verify_fun := VerifyFun,
customize_hostname_check := CustomizeHostnameCheck,
crl_check := CrlCheck,
+ log_level := LogLevel,
depth := Depth} = SslOptions,
CRLDbHandle, Role, Host) ->
ServerName = ssl_handshake:server_name(ServerNameIndication, Host, Role),
@@ -1198,7 +1310,7 @@ validate_certificate_chain(Certs, CertDbHandle, CertDbRef,
ssl_handshake:validation_fun_and_state(VerifyFun, Role,
CertDbHandle, CertDbRef, ServerName,
CustomizeHostnameCheck,
- CrlCheck, CRLDbHandle, CertPath),
+ CrlCheck, CRLDbHandle, CertPath, LogLevel),
Options = [{max_path_length, Depth},
{verify_fun, ValidationFunAndState}],
%% TODO: Validate if Certificate is using a supported signature algorithm
@@ -1271,7 +1383,7 @@ message_hash(ClientHello1, HKDFAlgo) ->
crypto:hash(HKDFAlgo, ClientHello1)].
-calculate_handshake_secrets(PublicKey, PrivateKey, SelectedGroup,
+calculate_handshake_secrets(PublicKey, PrivateKey, SelectedGroup, PSK,
#state{connection_states = ConnectionStates,
handshake_env =
#handshake_env{
@@ -1280,9 +1392,6 @@ calculate_handshake_secrets(PublicKey, PrivateKey, SelectedGroup,
ssl_record:pending_connection_state(ConnectionStates, read),
#security_parameters{prf_algorithm = HKDFAlgo,
cipher_suite = CipherSuite} = SecParamsR,
-
- %% Calculate handshake_secret
- PSK = binary:copy(<<0>>, ssl_cipher:hash_size(HKDFAlgo)),
EarlySecret = tls_v1:key_schedule(early_secret, HKDFAlgo , {psk, PSK}),
IKM = calculate_shared_secret(PublicKey, PrivateKey, SelectedGroup),
@@ -1305,11 +1414,63 @@ calculate_handshake_secrets(PublicKey, PrivateKey, SelectedGroup,
ReadFinishedKey = tls_v1:finished_key(ClientHSTrafficSecret, HKDFAlgo),
WriteFinishedKey = tls_v1:finished_key(ServerHSTrafficSecret, HKDFAlgo),
- update_pending_connection_states(State0, HandshakeSecret,
+ update_pending_connection_states(State0, HandshakeSecret, undefined,
ReadKey, ReadIV, ReadFinishedKey,
WriteKey, WriteIV, WriteFinishedKey).
+%% Server
+get_pre_shared_key(undefined, HKDFAlgo) ->
+ binary:copy(<<0>>, ssl_cipher:hash_size(HKDFAlgo));
+get_pre_shared_key({_, PSK}, _) ->
+ PSK.
+%%
+%% Client
+%% Server initiates a full handshake
+get_pre_shared_key(_, _, HKDFAlgo, undefined) ->
+ {ok, binary:copy(<<0>>, ssl_cipher:hash_size(HKDFAlgo))};
+%% Session resumption not configured
+get_pre_shared_key(undefined, _, HKDFAlgo, _) ->
+ {ok, binary:copy(<<0>>, ssl_cipher:hash_size(HKDFAlgo))};
+get_pre_shared_key(_, undefined, HKDFAlgo, _) ->
+ {ok, binary:copy(<<0>>, ssl_cipher:hash_size(HKDFAlgo))};
+%% Session resumption
+get_pre_shared_key(enabled = SessionTickets, UseTicket, HKDFAlgo, SelectedIdentity) ->
+ TicketData = get_ticket_data(self(), SessionTickets, UseTicket),
+ case choose_psk(TicketData, SelectedIdentity) of
+ undefined -> %% full handshake, default PSK
+ {ok, binary:copy(<<0>>, ssl_cipher:hash_size(HKDFAlgo))};
+ illegal_parameter ->
+ {error, illegal_parameter};
+ {_, PSK} ->
+ {ok, PSK}
+ end;
+get_pre_shared_key(auto = SessionTickets, UseTicket, HKDFAlgo, SelectedIdentity) ->
+ TicketData = get_ticket_data(self(), SessionTickets, UseTicket),
+ case choose_psk(TicketData, SelectedIdentity) of
+ undefined -> %% full handshake, default PSK
+ tls_client_ticket_store:unlock_tickets(self(), UseTicket),
+ {ok, binary:copy(<<0>>, ssl_cipher:hash_size(HKDFAlgo))};
+ illegal_parameter ->
+ tls_client_ticket_store:unlock_tickets(self(), UseTicket),
+ {error, illegal_parameter};
+ {Key, PSK} ->
+ tls_client_ticket_store:remove_tickets([Key]), %% Remove single-use ticket
+ tls_client_ticket_store:unlock_tickets(self(), UseTicket -- [Key]),
+ {ok, PSK}
+ end.
+
+
+choose_psk(undefined, _) ->
+ undefined;
+choose_psk([], _) ->
+ illegal_parameter;
+choose_psk([{Key, SelectedIdentity, _, PSK, _, _}|_], SelectedIdentity) ->
+ {Key, PSK};
+choose_psk([_|T], SelectedIdentity) ->
+ choose_psk(T, SelectedIdentity).
+
+
calculate_traffic_secrets(#state{
static_env = #static_env{role = Role},
connection_states = ConnectionStates,
@@ -1339,7 +1500,7 @@ calculate_traffic_secrets(#state{
{ReadKey, ReadIV} = tls_v1:calculate_traffic_keys(HKDFAlgo, Cipher, ClientAppTrafficSecret0),
{WriteKey, WriteIV} = tls_v1:calculate_traffic_keys(HKDFAlgo, Cipher, ServerAppTrafficSecret0),
- update_pending_connection_states(State0, MasterSecret,
+ update_pending_connection_states(State0, MasterSecret, undefined,
ReadKey, ReadIV, undefined,
WriteKey, WriteIV, undefined).
@@ -1374,17 +1535,35 @@ calculate_shared_secret(OthersKey, MyKey = #'ECPrivateKey'{}, _Group)
public_key:compute_key(Point, MyKey).
+maybe_calculate_resumption_master_secret(#state{ssl_options = #{session_tickets := disabled}} = State) ->
+ State;
+maybe_calculate_resumption_master_secret(#state{
+ ssl_options = #{session_tickets := SessionTickets},
+ connection_states = ConnectionStates,
+ handshake_env =
+ #handshake_env{
+ tls_handshake_history = HHistory}} = State)
+ when SessionTickets =/= disabled ->
+ #{security_parameters := SecParamsR} =
+ ssl_record:pending_connection_state(ConnectionStates, read),
+ #security_parameters{master_secret = MasterSecret,
+ prf_algorithm = HKDFAlgo} = SecParamsR,
+ {Messages0, _} = HHistory,
+ RMS = tls_v1:resumption_master_secret(HKDFAlgo, MasterSecret, lists:reverse(Messages0)),
+ update_resumption_master_secret(State, RMS).
+
+
update_pending_connection_states(#state{
static_env = #static_env{role = server},
connection_states =
CS = #{pending_read := PendingRead0,
pending_write := PendingWrite0}} = State,
- HandshakeSecret,
+ HandshakeSecret, ResumptionMasterSecret,
ReadKey, ReadIV, ReadFinishedKey,
WriteKey, WriteIV, WriteFinishedKey) ->
- PendingRead = update_connection_state(PendingRead0, HandshakeSecret,
+ PendingRead = update_connection_state(PendingRead0, HandshakeSecret, ResumptionMasterSecret,
ReadKey, ReadIV, ReadFinishedKey),
- PendingWrite = update_connection_state(PendingWrite0, HandshakeSecret,
+ PendingWrite = update_connection_state(PendingWrite0, HandshakeSecret, ResumptionMasterSecret,
WriteKey, WriteIV, WriteFinishedKey),
State#state{connection_states = CS#{pending_read => PendingRead,
pending_write => PendingWrite}};
@@ -1393,22 +1572,23 @@ update_pending_connection_states(#state{
connection_states =
CS = #{pending_read := PendingRead0,
pending_write := PendingWrite0}} = State,
- HandshakeSecret,
+ HandshakeSecret, ResumptionMasterSecret,
ReadKey, ReadIV, ReadFinishedKey,
WriteKey, WriteIV, WriteFinishedKey) ->
- PendingRead = update_connection_state(PendingRead0, HandshakeSecret,
+ PendingRead = update_connection_state(PendingRead0, HandshakeSecret, ResumptionMasterSecret,
WriteKey, WriteIV, WriteFinishedKey),
- PendingWrite = update_connection_state(PendingWrite0, HandshakeSecret,
+ PendingWrite = update_connection_state(PendingWrite0, HandshakeSecret, ResumptionMasterSecret,
ReadKey, ReadIV, ReadFinishedKey),
State#state{connection_states = CS#{pending_read => PendingRead,
pending_write => PendingWrite}}.
update_connection_state(ConnectionState = #{security_parameters := SecurityParameters0},
- HandshakeSecret, Key, IV, FinishedKey) ->
+ HandshakeSecret, ResumptionMasterSecret, Key, IV, FinishedKey) ->
%% Store secret
SecurityParameters = SecurityParameters0#security_parameters{
- master_secret = HandshakeSecret},
+ master_secret = HandshakeSecret,
+ resumption_master_secret = ResumptionMasterSecret},
ConnectionState#{security_parameters => SecurityParameters,
cipher_state => cipher_init(Key, IV, FinishedKey)}.
@@ -1451,6 +1631,21 @@ update_start_state(#state{connection_states = ConnectionStates0,
connection_env = CEnv#connection_env{negotiated_version = {3,4}}}.
+update_resumption_master_secret(#state{connection_states = ConnectionStates0} = State,
+ ResumptionMasterSecret) ->
+ #{security_parameters := SecParamsR0} = PendingRead =
+ maps:get(pending_read, ConnectionStates0),
+ #{security_parameters := SecParamsW0} = PendingWrite =
+ maps:get(pending_write, ConnectionStates0),
+
+ SecParamsR = SecParamsR0#security_parameters{resumption_master_secret = ResumptionMasterSecret},
+ SecParamsW = SecParamsW0#security_parameters{resumption_master_secret = ResumptionMasterSecret},
+ ConnectionStates =
+ ConnectionStates0#{pending_read => PendingRead#{security_parameters => SecParamsR},
+ pending_write => PendingWrite#{security_parameters => SecParamsW}},
+ State#state{connection_states = ConnectionStates}.
+
+
cipher_init(Key, IV, FinishedKey) ->
#cipher_state{key = Key,
iv = IV,
@@ -1882,6 +2077,42 @@ get_key_shares(#key_share_client_hello{client_shares = ClientShares}) ->
get_key_shares(#key_share_server_hello{server_share = ServerShare}) ->
ServerShare.
+get_selected_identity(undefined) ->
+ undefined;
+get_selected_identity(#pre_shared_key_server_hello{selected_identity = SelectedIdentity}) ->
+ SelectedIdentity.
+
+get_offered_psks(Extensions) ->
+ PSK = maps:get(pre_shared_key, Extensions, undefined),
+ case PSK of
+ undefined ->
+ undefined;
+ #pre_shared_key_client_hello{offered_psks = OfferedPSKs} ->
+ OfferedPSKs
+ end.
+
+
+%% Prior to accepting PSK key establishment, the server MUST validate
+%% the corresponding binder value (see Section 4.2.11.2 below). If this
+%% value is not present or does not validate, the server MUST abort the
+%% handshake. Servers SHOULD NOT attempt to validate multiple binders;
+%% rather, they SHOULD select a single PSK and validate solely the
+%% binder that corresponds to that PSK.
+%%
+%% If no acceptable PSKs are found, the server SHOULD perform a non-PSK
+%% handshake if possible.
+handle_pre_shared_key(_, undefined, _) ->
+ {ok, undefined};
+handle_pre_shared_key(#state{ssl_options = #{session_tickets := disabled}}, _, _) ->
+ {ok, undefined};
+handle_pre_shared_key(#state{ssl_options = #{session_tickets := Tickets},
+ handshake_env = #handshake_env{tls_handshake_history = {HHistory, _}},
+ static_env = #static_env{trackers = Trackers}},
+ OfferedPreSharedKeys, Cipher) when Tickets =/= disabled ->
+ Tracker = proplists:get_value(session_tickets_tracker, Trackers),
+ #{prf := CipherHash} = ssl_cipher_format:suite_bin_to_map(Cipher),
+ tls_server_session_ticket:use(Tracker, OfferedPreSharedKeys, CipherHash, HHistory).
+
get_selected_group(#key_share_hello_retry_request{selected_group = SelectedGroup}) ->
SelectedGroup.
@@ -1901,3 +2132,195 @@ maybe() ->
throw({Ref,Reason})
end,
{Ref,Ok}.
+
+
+%% If the handshake includes a HelloRetryRequest, the initial
+%% ClientHello and HelloRetryRequest are included in the transcript
+%% along with the new ClientHello. For instance, if the client sends
+%% ClientHello1, its binder will be computed over:
+%%
+%% Transcript-Hash(Truncate(ClientHello1))
+%%
+%% Where Truncate() removes the binders list from the ClientHello.
+%%
+%% If the server responds with a HelloRetryRequest and the client then
+%% sends ClientHello2, its binder will be computed over:
+%%
+%% Transcript-Hash(ClientHello1,
+%% HelloRetryRequest,
+%% Truncate(ClientHello2))
+%%
+%% The full ClientHello1/ClientHello2 is included in all other handshake
+%% hash computations. Note that in the first flight,
+%% Truncate(ClientHello1) is hashed directly, but in the second flight,
+%% ClientHello1 is hashed and then reinjected as a "message_hash"
+%% message, as described in Section 4.4.1.
+maybe_add_binders(Hello, undefined, _) ->
+ Hello;
+maybe_add_binders(Hello0, TicketData, Version) when Version =:= {3,4} ->
+ HelloBin0 = tls_handshake:encode_handshake(Hello0, Version),
+ HelloBin1 = iolist_to_binary(HelloBin0),
+ Truncated = truncate_client_hello(HelloBin1),
+ Binders = create_binders([Truncated], TicketData),
+ update_binders(Hello0, Binders);
+maybe_add_binders(Hello, _, Version) when Version =< {3,3} ->
+ Hello.
+%%
+%% HelloRetryRequest
+maybe_add_binders(Hello, _, undefined, _) ->
+ Hello;
+maybe_add_binders(Hello0, {[HRR,MessageHash|_], _}, TicketData, Version) when Version =:= {3,4} ->
+ HelloBin0 = tls_handshake:encode_handshake(Hello0, Version),
+ HelloBin1 = iolist_to_binary(HelloBin0),
+ Truncated = truncate_client_hello(HelloBin1),
+ Binders = create_binders([MessageHash,HRR,Truncated], TicketData),
+ update_binders(Hello0, Binders);
+maybe_add_binders(Hello, _, _, Version) when Version =< {3,3} ->
+ Hello.
+
+
+create_binders(Context, TicketData) ->
+ create_binders(Context, TicketData, []).
+%%
+create_binders(_, [], Acc) ->
+ lists:reverse(Acc);
+create_binders(Context, [{_, _, _, PSK, _, HKDF}|T], Acc) ->
+ FinishedKey = calculate_finished_key(PSK, HKDF),
+ Binder = calculate_binder(FinishedKey, HKDF, Context),
+ create_binders(Context, T, [Binder|Acc]).
+
+
+%% Removes the binders list from the ClientHello.
+%% opaque PskBinderEntry<32..255>;
+%%
+%% struct {
+%% PskIdentity identities<7..2^16-1>;
+%% PskBinderEntry binders<33..2^16-1>;
+%% } OfferedPsks;
+truncate_client_hello(HelloBin0) ->
+ HelloBin1 = remove_binders(HelloBin0),
+ {Truncated, _} = split_binary(HelloBin1, size(HelloBin1) - 2),
+ Truncated.
+
+
+remove_binders(Binary0) ->
+ OrigSize = byte_size(Binary0),
+ HashSize256 = ssl_cipher:hash_size(sha256),
+ HashSize384 = ssl_cipher:hash_size(sha384),
+ HashSize512 = ssl_cipher:hash_size(sha512),
+
+ NewSize256 = OrigSize - HashSize256 - 1,
+ NewSize384 = OrigSize - HashSize384 - 1,
+ NewSize512 = OrigSize - HashSize512 - 1,
+ case Binary0 of
+ <<Binary:NewSize256/binary,?BYTE(HashSize256),_:HashSize256/binary>> ->
+ remove_binders(Binary);
+ <<Binary:NewSize384/binary,?BYTE(HashSize384),_:HashSize384/binary>> ->
+ remove_binders(Binary);
+ <<Binary:NewSize512/binary,?BYTE(HashSize512),_:HashSize512/binary>> ->
+ remove_binders(Binary);
+ Else ->
+ Else
+ end.
+
+
+%% The PskBinderEntry is computed in the same way as the Finished
+%% message (Section 4.4.4) but with the BaseKey being the binder_key
+%% derived via the key schedule from the corresponding PSK which is
+%% being offered (see Section 7.1).
+calculate_finished_key(PSK, HKDFAlgo) ->
+ EarlySecret = tls_v1:key_schedule(early_secret, HKDFAlgo , {psk, PSK}),
+ PRK = tls_v1:resumption_binder_key(HKDFAlgo, EarlySecret),
+ tls_v1:finished_key(PRK, HKDFAlgo).
+
+
+calculate_binder(BinderKey, HKDF, Truncated) ->
+ tls_v1:finished_verify_data(BinderKey, HKDF, [Truncated]).
+
+
+update_binders(#client_hello{extensions =
+ #{pre_shared_key := PreSharedKey0} = Extensions0} = Hello, Binders) ->
+ #pre_shared_key_client_hello{
+ offered_psks =
+ #offered_psks{identities = Identities}} = PreSharedKey0,
+
+ PreSharedKey =
+ #pre_shared_key_client_hello{
+ offered_psks =
+ #offered_psks{identities = Identities,
+ binders = Binders}},
+
+ Extensions = Extensions0#{pre_shared_key => PreSharedKey},
+ Hello#client_hello{extensions = Extensions}.
+
+%% Configure a suitable session ticket
+maybe_automatic_session_resumption(#state{
+ ssl_options = #{versions := [Version|_],
+ ciphers := UserSuites,
+ session_tickets := SessionTickets} = SslOpts0
+ } = State0)
+ when Version >= {3,4} andalso
+ SessionTickets =:= auto ->
+ AvailableCipherSuites = ssl_handshake:available_suites(UserSuites, Version),
+ HashAlgos = cipher_hash_algos(AvailableCipherSuites),
+ UseTicket = tls_client_ticket_store:find_ticket(self(), HashAlgos),
+ tls_client_ticket_store:lock_tickets(self(), [UseTicket]),
+ State = State0#state{ssl_options = SslOpts0#{use_ticket => [UseTicket]}},
+ {[UseTicket], State};
+maybe_automatic_session_resumption(#state{
+ ssl_options = #{use_ticket := UseTicket}
+ } = State) ->
+ {UseTicket, State}.
+
+
+cipher_hash_algos(Ciphers) ->
+ Fun = fun(Cipher) ->
+ #{prf := Hash} = ssl_cipher_format:suite_bin_to_map(Cipher),
+ Hash
+ end,
+ lists:map(Fun, Ciphers).
+
+
+get_ticket_data(_, undefined, _) ->
+ undefined;
+get_ticket_data(_, _, undefined) ->
+ undefined;
+get_ticket_data(_, enabled, UseTicket) ->
+ process_user_tickets(UseTicket);
+get_ticket_data(Pid, auto, UseTicket) ->
+ tls_client_ticket_store:get_tickets(Pid, UseTicket).
+
+
+process_user_tickets(UseTicket) ->
+ process_user_tickets(UseTicket, [], 0).
+%%
+process_user_tickets([], Acc, _) ->
+ lists:reverse(Acc);
+process_user_tickets([H|T], Acc, N) ->
+ #{hkdf := HKDF,
+ sni := _SNI,
+ psk := PSK,
+ timestamp := Timestamp,
+ ticket := NewSessionTicket} = erlang:binary_to_term(H),
+ #new_session_ticket{
+ ticket_lifetime = _LifeTime,
+ ticket_age_add = AgeAdd,
+ ticket_nonce = Nonce,
+ ticket = Ticket,
+ extensions = _Extensions
+ } = NewSessionTicket,
+ TicketAge = erlang:system_time(seconds) - Timestamp,
+ ObfuscatedTicketAge = obfuscate_ticket_age(TicketAge, AgeAdd),
+ Identity = #psk_identity{
+ identity = Ticket,
+ obfuscated_ticket_age = ObfuscatedTicketAge},
+ process_user_tickets(T, [{undefined, N, Identity, PSK, Nonce, HKDF}|Acc], N + 1).
+
+
+%% The "obfuscated_ticket_age"
+%% field of each PskIdentity contains an obfuscated version of the
+%% ticket age formed by taking the age in milliseconds and adding the
+%% "ticket_age_add" value that was included with the ticket
+%% (see Section 4.6.1), modulo 2^32.
+obfuscate_ticket_age(TicketAge, AgeAdd) ->
+ (TicketAge + AgeAdd) rem round(math:pow(2,32)).
diff --git a/lib/ssl/src/tls_handshake_1_3.hrl b/lib/ssl/src/tls_handshake_1_3.hrl
index eb85f216c8..cb28ca78f6 100644
--- a/lib/ssl/src/tls_handshake_1_3.hrl
+++ b/lib/ssl/src/tls_handshake_1_3.hrl
@@ -254,8 +254,10 @@
-type tls_handshake_1_3() :: #encrypted_extensions{} |
#certificate_request_1_3{} |
#certificate_1_3{} |
- #certificate_verify_1_3{}.
+ #certificate_verify_1_3{} |
+ #new_session_ticket{}.
-export_type([tls_handshake_1_3/0]).
+
-endif. % -ifdef(tls_handshake_1_3).
diff --git a/lib/ssl/src/tls_record.erl b/lib/ssl/src/tls_record.erl
index cfd75076b3..e8040b461d 100644
--- a/lib/ssl/src/tls_record.erl
+++ b/lib/ssl/src/tls_record.erl
@@ -391,7 +391,7 @@ is_acceptable_version(_,_) ->
-spec hello_version([tls_version()]) -> tls_version().
hello_version([Highest|_]) when Highest >= {3,3} ->
- Highest;
+ {3,3};
hello_version(Versions) ->
lowest_protocol_version(Versions).
diff --git a/lib/ssl/src/tls_sender.erl b/lib/ssl/src/tls_sender.erl
index d0604565e3..50811ef3dd 100644
--- a/lib/ssl/src/tls_sender.erl
+++ b/lib/ssl/src/tls_sender.erl
@@ -43,7 +43,7 @@
role,
socket,
socket_options,
- tracker,
+ trackers,
transport_cb,
negotiated_version,
renegotiate_at,
@@ -200,7 +200,7 @@ init({call, From}, {Pid, #{current_write := WriteState,
role := Role,
socket := Socket,
socket_options := SockOpts,
- tracker := Tracker,
+ trackers := Trackers,
transport_cb := Transport,
negotiated_version := Version,
renegotiate_at := RenegotiateAt,
@@ -214,7 +214,7 @@ init({call, From}, {Pid, #{current_write := WriteState,
role = Role,
socket = Socket,
socket_options = SockOpts,
- tracker = Tracker,
+ trackers = Trackers,
transport_cb = Transport,
negotiated_version = Version,
renegotiate_at = RenegotiateAt,
@@ -255,8 +255,8 @@ connection({call, From}, dist_get_tls_socket,
#data{static = #static{transport_cb = Transport,
socket = Socket,
connection_pid = Pid,
- tracker = Tracker}} = StateData) ->
- TLSSocket = tls_connection:socket([Pid, self()], Transport, Socket, Tracker),
+ trackers = Trackers}} = StateData) ->
+ TLSSocket = tls_connection:socket([Pid, self()], Transport, Socket, Trackers),
{next_state, ?FUNCTION_NAME, StateData, [{reply, From, {ok, TLSSocket}}]};
connection({call, From}, {dist_handshake_complete, _Node, DHandle},
#data{static = #static{connection_pid = Pid} = Static} = StateData) ->
@@ -394,16 +394,13 @@ handle_common(
info, {'DOWN', Monitor, _, _, _},
#data{static = #static{connection_monitor = Monitor}} = StateData) ->
{stop, normal, StateData};
-handle_common(info, Msg, _) ->
- Report =
- io_lib:format("TLS sender: Got unexpected info: ~p ~n", [Msg]),
- error_logger:info_report(Report),
+handle_common(info, Msg, #data{static = #static{log_level = Level}}) ->
+ ssl_logger:log(info, Level, #{event => "TLS sender recived unexpected info",
+ reason => [{message, Msg}]}, ?LOCATION),
keep_state_and_data;
-handle_common(Type, Msg, _) ->
- Report =
- io_lib:format(
- "TLS sender: Got unexpected event: ~p ~n", [{Type,Msg}]),
- error_logger:error_report(Report),
+handle_common(Type, Msg, #data{static = #static{log_level = Level}}) ->
+ ssl_logger:log(error, Level, #{event => "TLS sender recived unexpected event",
+ reason => [{type, Type}, {message, Msg}]}, ?LOCATION),
keep_state_and_data.
send_tls_alert(#alert{} = Alert,
diff --git a/lib/ssl/src/tls_server_session_ticket.erl b/lib/ssl/src/tls_server_session_ticket.erl
new file mode 100644
index 0000000000..e30205f4b8
--- /dev/null
+++ b/lib/ssl/src/tls_server_session_ticket.erl
@@ -0,0 +1,391 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2007-2019. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+%%----------------------------------------------------------------------
+%% Purpose: Handle server side TLS-1.3 session ticket storage
+%%----------------------------------------------------------------------
+
+-module(tls_server_session_ticket).
+-behaviour(gen_server).
+
+-include("tls_handshake_1_3.hrl").
+-include("ssl_internal.hrl").
+-include("ssl_alert.hrl").
+-include("ssl_cipher.hrl").
+
+%% API
+-export([start_link/3,
+ new/3,
+ use/4
+ ]).
+
+%% gen_server callbacks
+-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
+ terminate/2, code_change/3, format_status/2]).
+
+-define(SERVER, ?MODULE).
+
+-record(state, {
+ stateless,
+ stateful,
+ nonce,
+ lifetime
+ }).
+
+%%%===================================================================
+%%% API
+%%%===================================================================
+-spec start_link(atom(), integer(), tuple()) -> {ok, Pid :: pid()} |
+ {error, Error :: {already_started, pid()}} |
+ {error, Error :: term()} |
+ ignore.
+start_link(Mode, Lifetime, AntiReplay) ->
+ gen_server:start_link(?MODULE, [Mode, Lifetime, AntiReplay], []).
+
+new(Pid, Prf, MasterSecret) ->
+ gen_server:call(Pid, {new_session_ticket, Prf, MasterSecret}, infinity).
+
+use(Pid, Identifiers, Prf, HandshakeHist) ->
+ gen_server:call(Pid, {use_ticket, Identifiers, Prf, HandshakeHist},
+ infinity).
+
+%%%===================================================================
+%%% gen_server callbacks
+%%%===================================================================
+
+-spec init(Args :: term()) -> {ok, State :: term()}.
+init(Args) ->
+ process_flag(trap_exit, true),
+ State = inital_state(Args),
+ {ok, State}.
+
+-spec handle_call(Request :: term(), From :: {pid(), term()}, State :: term()) ->
+ {reply, Reply :: term(), NewState :: term()} .
+handle_call({new_session_ticket, Prf, MasterSecret}, _From,
+ #state{nonce = Nonce,
+ lifetime = LifeTime,
+ stateful = #{}} = State0) ->
+ Id = stateful_psk_id(),
+ PSK = tls_v1:pre_shared_key(MasterSecret, ticket_nonce(Nonce), Prf),
+ SessionTicket = new_session_ticket(Id, Nonce, LifeTime),
+ State = stateful_ticket_store(Id, SessionTicket, Prf, PSK, State0),
+ {reply, SessionTicket, State};
+handle_call({new_session_ticket, Prf, MasterSecret}, _From,
+ #state{nonce = Nonce,
+ stateless = #{}} = State) ->
+ BaseSessionTicket = new_session_ticket_base(State),
+ SessionTicket = generate_statless_ticket(BaseSessionTicket, Prf,
+ MasterSecret, State),
+ {reply, SessionTicket, State#state{nonce = Nonce+1}};
+handle_call({use_ticket, Identifiers, Prf, HandshakeHist}, _From,
+ #state{stateful = #{}} = State0) ->
+ {Result, State} = stateful_use(Identifiers, Prf,
+ HandshakeHist, State0),
+ {reply, Result, State};
+handle_call({use_ticket, Identifiers, Prf, HandshakeHist}, _From,
+ #state{stateless = #{}} = State0) ->
+ {Result, State} = stateless_use(Identifiers, Prf,
+ HandshakeHist, State0),
+ {reply, Result, State}.
+
+-spec handle_cast(Request :: term(), State :: term()) ->
+ {noreply, NewState :: term()}.
+handle_cast(_Request, State) ->
+ {noreply, State}.
+
+-spec handle_info(Info :: timeout() | term(), State :: term()) ->
+ {noreply, NewState :: term()}.
+handle_info(rotate_bloom_filters,
+ #state{stateless = #{bloom_filter := BloomFilter0,
+ window := Window} = Stateless} = State) ->
+ BloomFilter = tls_bloom_filter:rotate(BloomFilter0),
+ erlang:send_after(Window * 1000, self(), rotate_bloom_filters),
+ {noreply, State#state{stateless = Stateless#{bloom_filter => BloomFilter}}};
+handle_info(_Info, State) ->
+ {noreply, State}.
+
+-spec terminate(Reason :: normal | shutdown | {shutdown, term()} | term(),
+ State :: term()) -> any().
+terminate(_Reason, _State) ->
+ ok.
+
+-spec code_change(OldVsn :: term() | {down, term()},
+ State :: term(),
+ Extra :: term()) -> {ok, NewState :: term()} |
+ {error, Reason :: term()}.
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
+
+
+-spec format_status(Opt :: normal | terminate,
+ Status :: list()) -> Status :: term().
+format_status(_Opt, Status) ->
+ Status.
+%%%===================================================================
+%%% Internal functions
+%%%===================================================================
+
+inital_state([stateless, Lifetime, undefined]) ->
+ #state{nonce = 0,
+ stateless = #{seed => {crypto:strong_rand_bytes(16),
+ crypto:strong_rand_bytes(32)},
+ window => undefined},
+ lifetime = Lifetime
+ };
+inital_state([stateless, Lifetime, {Window, K, M}]) ->
+ erlang:send_after(Window * 1000, self(), rotate_bloom_filters),
+ #state{nonce = 0,
+ stateless = #{bloom_filter => tls_bloom_filter:new(K, M),
+ seed => {crypto:strong_rand_bytes(16),
+ crypto:strong_rand_bytes(32)},
+ window => Window},
+ lifetime = Lifetime
+ };
+inital_state([stateful, Lifetime|_]) ->
+ %% statfeful servers replay
+ %% protection is that it saves
+ %% all valid tickets
+ #state{lifetime = Lifetime,
+ nonce = 0,
+ stateful = #{db => stateful_store(),
+ max => 1000,
+ ref_index => #{}
+ }
+ }.
+
+ticket_age_add() ->
+ MaxTicketAge = 7 * 24 * 3600,
+ IntMax = round(math:pow(2,32)) - 1,
+ MaxAgeAdd = IntMax - MaxTicketAge,
+ <<?UINT32(I)>> = crypto:strong_rand_bytes(4),
+ case I > MaxAgeAdd of
+ true ->
+ I - MaxTicketAge;
+ false ->
+ I
+ end.
+
+ticket_nonce(I) ->
+ <<?UINT64(I)>>.
+
+new_session_ticket_base(#state{nonce = Nonce,
+ lifetime = Lifetime}) ->
+ new_session_ticket(undefined, Nonce, Lifetime).
+
+new_session_ticket(Id, Nonce, Lifetime) ->
+ TicketAgeAdd = ticket_age_add(),
+ #new_session_ticket{
+ ticket = Id,
+ ticket_lifetime = Lifetime,
+ ticket_age_add = TicketAgeAdd,
+ ticket_nonce = ticket_nonce(Nonce),
+ extensions = #{}
+ }.
+
+
+validate_binder(Binder, HandshakeHist, PSK, Prf, AlertDetail) ->
+ case tls_handshake_1_3:is_valid_binder(Binder, HandshakeHist, PSK, Prf) of
+ true ->
+ true;
+ false ->
+ {error, ?ALERT_REC(?FATAL, ?ILLEGAL_PARAMETER, AlertDetail)}
+ end.
+
+%%%===================================================================
+%%% Stateful store
+%%%===================================================================
+
+stateful_store() ->
+ gb_trees:empty().
+
+stateful_ticket_store(Ref, NewSessionTicket, Hash, Psk,
+ #state{nonce = Nonce,
+ stateful = #{db := Tree0,
+ max := Max,
+ ref_index := Index0} = Stateful}
+ = State0) ->
+ Id = erlang:monotonic_time(),
+ StatefulTicket = {NewSessionTicket, Hash, Psk},
+ case gb_trees:size(Tree0) of
+ Max ->
+ %% Trow away oldes ticket
+ {_, {#new_session_ticket{ticket = OldRef},_,_}, Tree1}
+ = gb_trees:take_smallest(Tree0),
+ Tree = gb_trees:insert(Id, StatefulTicket, Tree1),
+ Index = maps:without([OldRef], Index0),
+ State0#state{nonce = Nonce+1, stateful =
+ Stateful#{db => Tree,
+ ref_index => Index#{Ref => Id}}};
+ _ ->
+ Tree = gb_trees:insert(Id, StatefulTicket, Tree0),
+ State0#state{nonce = Nonce+1, stateful =
+ Stateful#{db => Tree,
+ ref_index => Index0#{Ref => Id}}}
+ end.
+
+stateful_use(#offered_psks{
+ identities = Identities,
+ binders = Binders
+ }, Prf, HandshakeHist, State) ->
+ stateful_use(Identities, Binders, Prf, HandshakeHist, 0, State).
+
+stateful_use([], [], _, _, _, State) ->
+ {{ok, undefined}, State};
+stateful_use([#psk_identity{identity = Ref} | Refs], [Binder | Binders],
+ Prf, HandshakeHist, Index,
+ #state{stateful = #{db := Tree0,
+ ref_index := RefIndex0} = Stateful} = State) ->
+ try maps:get(Ref, RefIndex0) of
+ Key ->
+ case stateful_usable_ticket(Key, Prf, Binder,
+ HandshakeHist, Tree0) of
+ true ->
+ RefIndex = maps:without([Ref], RefIndex0),
+ {{_,_, PSK}, Tree} = gb_trees:take(Key, Tree0),
+ {{ok, {Index, PSK}},
+ State#state{stateful = Stateful#{db => Tree,
+ ref_index => RefIndex}}};
+ false ->
+ stateful_use(Refs, Binders, Prf,
+ HandshakeHist, Index + 1, State);
+ {error, _} = Error ->
+ {Error, State}
+ end
+ catch
+ _:{badkey, Ref} ->
+ stateful_use(Refs, Binders, Prf, HandshakeHist, Index + 1, State)
+ end.
+
+stateful_usable_ticket(Key, Prf, Binder, HandshakeHist, Tree) ->
+ case gb_trees:lookup(Key, Tree) of
+ none ->
+ false;
+ {value, {NewSessionTicket, Prf, PSK}} ->
+ case stateful_living_ticket(Key, NewSessionTicket) of
+ true ->
+ validate_binder(Binder, HandshakeHist, PSK, Prf, stateful);
+ _ ->
+ false
+ end;
+ _ ->
+ false
+ end.
+
+stateful_living_ticket(TimeStamp,
+ #new_session_ticket{ticket_lifetime = LifeTime}) ->
+ Now = erlang:monotonic_time(),
+ Lived = erlang:convert_time_unit(Now-TimeStamp, native, seconds),
+ Lived < LifeTime.
+
+
+stateful_psk_id() ->
+ term_to_binary(make_ref()).
+
+%%%===================================================================
+%%% Stateless ticket
+%%%===================================================================
+generate_statless_ticket(#new_session_ticket{ticket_nonce = Nonce,
+ ticket_age_add = TicketAgeAdd,
+ ticket_lifetime = Lifetime}
+ = Ticket, Prf, MasterSecret,
+ #state{stateless = #{seed := {IV, Shard}}}) ->
+ PSK = tls_v1:pre_shared_key(MasterSecret, Nonce, Prf),
+ Timestamp = erlang:system_time(second),
+ Encrypted = ssl_cipher:encrypt_ticket(#stateless_ticket{
+ hash = Prf,
+ pre_shared_key = PSK,
+ ticket_age_add = TicketAgeAdd,
+ lifetime = Lifetime,
+ timestamp = Timestamp
+ }, Shard, IV),
+ Ticket#new_session_ticket{ticket = Encrypted}.
+
+stateless_use(#offered_psks{
+ identities = Identities,
+ binders = Binders
+ }, Prf, HandshakeHist, State) ->
+ stateless_use(Identities, Binders, Prf, HandshakeHist, 0, State).
+
+stateless_use([], [], _, _, _, State) ->
+ {{ok, undefined}, State};
+stateless_use([#psk_identity{identity = Encrypted,
+ obfuscated_ticket_age = ObfAge} | Ids],
+ [Binder | Binders], Prf, HandshakeHist, Index,
+ #state{stateless = #{seed := {IV, Shard},
+ window := Window}} = State) ->
+ case ssl_cipher:decrypt_ticket(Encrypted, Shard, IV) of
+ #stateless_ticket{hash = Prf,
+ pre_shared_key = PSK} = Ticket ->
+ case statless_usable_ticket(Ticket, ObfAge, Binder,
+ HandshakeHist, Window) of
+ true ->
+ stateless_anti_replay(Index, PSK, Binder, State);
+ false ->
+ stateless_use(Ids, Binders, Prf, HandshakeHist,
+ Index+1, State);
+ {error, _} = Error ->
+ {Error, State}
+ end;
+ _ ->
+ stateless_use(Ids, Binders, Prf, HandshakeHist, Index+1, State)
+ end.
+
+statless_usable_ticket(#stateless_ticket{hash = Prf,
+ ticket_age_add = TicketAgeAdd,
+ lifetime = Lifetime,
+ timestamp = Timestamp,
+ pre_shared_key = PSK}, ObfAge,
+ Binder, HandshakeHist, Window) ->
+ case stateless_living_ticket(ObfAge, TicketAgeAdd, Lifetime,
+ Timestamp, Window) of
+ true ->
+ validate_binder(Binder, HandshakeHist, PSK, Prf, stateless);
+ false ->
+ false
+ end.
+
+stateless_living_ticket(0, _, _, _, _) ->
+ true;
+stateless_living_ticket(ObfAge, TicketAgeAdd, Lifetime, Timestamp, Window) ->
+ ReportedAge = ObfAge - TicketAgeAdd,
+ RealAge = erlang:system_time(second) - Timestamp,
+ (ReportedAge =< Lifetime)
+ andalso (RealAge =< Lifetime)
+ andalso (in_window(RealAge, Window)).
+
+in_window(_, undefined) ->
+ true;
+in_window(Age, {Window, _, _}) ->
+ Age =< Window.
+
+stateless_anti_replay(Index, PSK, Binder,
+ #state{stateless = #{bloom_filter := BloomFilter0}
+ = Stateless} = State) ->
+ case tls_bloom_filter:contains(BloomFilter0, Binder) of
+ true ->
+ %%possible_replay
+ {{ok, undefined}, State};
+ false ->
+ BloomFilter = tls_bloom_filter:add_elem(BloomFilter0, Binder),
+ {{ok, {Index, PSK}},
+ State#state{stateless = Stateless#{bloom_filter => BloomFilter}}}
+ end;
+stateless_anti_replay(Index, PSK, _, State) ->
+ {{ok, {Index, PSK}}, State}.
diff --git a/lib/ssl/src/tls_server_session_ticket_sup.erl b/lib/ssl/src/tls_server_session_ticket_sup.erl
new file mode 100644
index 0000000000..739491cf1e
--- /dev/null
+++ b/lib/ssl/src/tls_server_session_ticket_sup.erl
@@ -0,0 +1,72 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2014-2016. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+%%
+%%----------------------------------------------------------------------
+%% Purpose: Supervisor for a listen options tracker
+%%----------------------------------------------------------------------
+-module(tls_server_session_ticket_sup).
+
+-behaviour(supervisor).
+
+%% API
+-export([start_link/0, start_link_dist/0]).
+-export([start_child/1, start_child_dist/1]).
+
+%% Supervisor callback
+-export([init/1]).
+
+%%%=========================================================================
+%%% API
+%%%=========================================================================
+start_link() ->
+ supervisor:start_link({local, tracker_name(normal)}, ?MODULE, []).
+
+start_link_dist() ->
+ supervisor:start_link({local, tracker_name(dist)}, ?MODULE, []).
+
+start_child(Args) ->
+ supervisor:start_child(tracker_name(normal), Args).
+
+start_child_dist(Args) ->
+ supervisor:start_child(tracker_name(dist), Args).
+
+%%%=========================================================================
+%%% Supervisor callback
+%%%=========================================================================
+init(_O) ->
+ RestartStrategy = simple_one_for_one,
+ MaxR = 0,
+ MaxT = 3600,
+
+ Name = undefined, % As simple_one_for_one is used.
+ StartFunc = {tls_server_session_ticket, start_link, []},
+ Restart = temporary, % E.g. should not be restarted
+ Shutdown = 4000,
+ Modules = [tls_server_session_ticket],
+ Type = worker,
+
+ ChildSpec = {Name, StartFunc, Restart, Shutdown, Type, Modules},
+ {ok, {{RestartStrategy, MaxR, MaxT}, [ChildSpec]}}.
+
+tracker_name(normal) ->
+ ?MODULE;
+tracker_name(dist) ->
+ list_to_atom(atom_to_list(?MODULE) ++ "dist").
diff --git a/lib/ssl/src/tls_server_sup.erl b/lib/ssl/src/tls_server_sup.erl
new file mode 100644
index 0000000000..7834589206
--- /dev/null
+++ b/lib/ssl/src/tls_server_sup.erl
@@ -0,0 +1,77 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2019-2019. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+%%
+
+-module(tls_server_sup).
+
+-behaviour(supervisor).
+
+%% API
+-export([start_link/0]).
+
+%% Supervisor callback
+-export([init/1]).
+
+%%%=========================================================================
+%%% API
+%%%=========================================================================
+
+-spec start_link() -> {ok, pid()} | ignore | {error, term()}.
+
+start_link() ->
+ supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+%%%=========================================================================
+%%% Supervisor callback
+%%%=========================================================================
+
+init([]) ->
+ ListenTracker = listen_options_tracker_child_spec(),
+ SessionTracker = tls_server_session_child_spec(),
+
+ {ok, {{one_for_all, 10, 3600}, [ListenTracker,
+ SessionTracker
+ ]}}.
+
+
+%%--------------------------------------------------------------------
+%%% Internal functions
+%%--------------------------------------------------------------------
+
+%% Handles emulated options so that they inherited by the accept
+%% socket, even when setopts is performed on the listen socket
+listen_options_tracker_child_spec() ->
+ Name = tls_socket,
+ StartFunc = {ssl_listen_tracker_sup, start_link, []},
+ Restart = permanent,
+ Shutdown = 4000,
+ Modules = [ssl_listen_tracker_sup],
+ Type = supervisor,
+ {Name, StartFunc, Restart, Shutdown, Type, Modules}.
+
+tls_server_session_child_spec() ->
+ Name = tls_server_session_ticket,
+ StartFunc = {tls_server_session_ticket_sup, start_link, []},
+ Restart = permanent,
+ Shutdown = 4000,
+ Modules = [tls_server_session_ticket_sup],
+ Type = supervisor,
+ {Name, StartFunc, Restart, Shutdown, Type, Modules}.
diff --git a/lib/ssl/src/tls_socket.erl b/lib/ssl/src/tls_socket.erl
index acd907905c..031665bfe8 100644
--- a/lib/ssl/src/tls_socket.erl
+++ b/lib/ssl/src/tls_socket.erl
@@ -24,14 +24,39 @@
-include("ssl_internal.hrl").
-include("ssl_api.hrl").
--export([send/3, listen/3, accept/3, socket/5, connect/4, upgrade/3,
- setopts/3, getopts/3, getstat/3, peername/2, sockname/2, port/2]).
--export([split_options/1, get_socket_opts/3]).
--export([emulated_options/0, emulated_options/1, internal_inet_values/0, default_inet_values/0,
- init/1, start_link/3, terminate/2, inherit_tracker/3,
- emulated_socket_options/2, get_emulated_opts/1,
- set_emulated_opts/2, get_all_opts/1, handle_call/3, handle_cast/2,
- handle_info/2, code_change/3]).
+-export([send/3,
+ listen/3,
+ accept/3,
+ socket/5,
+ connect/4,
+ upgrade/3,
+ setopts/3,
+ getopts/3,
+ getstat/3,
+ peername/2,
+ sockname/2,
+ port/2]).
+
+-export([split_options/1,
+ get_socket_opts/3]).
+
+-export([emulated_options/0,
+ emulated_options/1,
+ internal_inet_values/0,
+ default_inet_values/0,
+ init/1,
+ start_link/3,
+ terminate/2,
+ inherit_tracker/3,
+ emulated_socket_options/2,
+ get_emulated_opts/1,
+ set_emulated_opts/2,
+ get_all_opts/1,
+ handle_call/3,
+ handle_cast/2,
+ handle_info/2,
+ code_change/3]).
+
-export([update_active_n/2]).
-record(state, {
@@ -52,8 +77,11 @@ listen(Transport, Port, #config{transport_info = {Transport, _, _, _, _},
case Transport:listen(Port, Options ++ internal_inet_values()) of
{ok, ListenSocket} ->
{ok, Tracker} = inherit_tracker(ListenSocket, EmOpts, SslOpts),
- Socket = #sslsocket{pid = {ListenSocket, Config#config{emulated = Tracker}}},
- check_active_n(EmOpts, Socket),
+ %% TODO not hard code
+ {ok, SessionHandler} = session_tickets_tracker(7200, SslOpts),
+ Trackers = [{option_tracker, Tracker}, {session_tickets_tracker, SessionHandler}],
+ Socket = #sslsocket{pid = {ListenSocket, Config#config{trackers = Trackers}}},
+ check_active_n(EmOpts, Socket),
{ok, Socket};
Err = {error, _} ->
Err
@@ -62,17 +90,18 @@ listen(Transport, Port, #config{transport_info = {Transport, _, _, _, _},
accept(ListenSocket, #config{transport_info = {Transport,_,_,_,_} = CbInfo,
connection_cb = ConnectionCb,
ssl = SslOpts,
- emulated = Tracker}, Timeout) ->
+ trackers = Trackers}, Timeout) ->
case Transport:accept(ListenSocket, Timeout) of
{ok, Socket} ->
- {ok, EmOpts} = get_emulated_opts(Tracker),
+ Tracker = proplists:get_value(option_tracker, Trackers),
+ {ok, EmOpts} = get_emulated_opts(Tracker),
{ok, Port} = tls_socket:port(Transport, Socket),
{ok, Sender} = tls_sender:start(),
ConnArgs = [server, Sender, "localhost", Port, Socket,
- {SslOpts, emulated_socket_options(EmOpts, #socket_options{}), Tracker}, self(), CbInfo],
+ {SslOpts, emulated_socket_options(EmOpts, #socket_options{}), Trackers}, self(), CbInfo],
case tls_connection_sup:start_child(ConnArgs) of
{ok, Pid} ->
- ssl_connection:socket_control(ConnectionCb, Socket, [Pid, Sender], Transport, Tracker);
+ ssl_connection:socket_control(ConnectionCb, Socket, [Pid, Sender], Transport, Trackers);
{error, Reason} ->
{error, Reason}
end;
@@ -116,17 +145,19 @@ connect(Address, Port,
{error, {options, {socket_options, UserOpts}}}
end.
-socket(Pids, Transport, Socket, ConnectionCb, Tracker) ->
+socket(Pids, Transport, Socket, ConnectionCb, Trackers) ->
#sslsocket{pid = Pids,
%% "The name "fd" is keept for backwards compatibility
- fd = {Transport, Socket, ConnectionCb, Tracker}}.
-setopts(gen_tcp, Socket = #sslsocket{pid = {ListenSocket, #config{emulated = Tracker}}}, Options) ->
+ fd = {Transport, Socket, ConnectionCb, Trackers}}.
+setopts(gen_tcp, Socket = #sslsocket{pid = {ListenSocket, #config{trackers = Trackers}}}, Options) ->
+ Tracker = proplists:get_value(option_tracker, Trackers),
{SockOpts, EmulatedOpts} = split_options(Options),
ok = set_emulated_opts(Tracker, EmulatedOpts),
check_active_n(EmulatedOpts, Socket),
inet:setopts(ListenSocket, SockOpts);
setopts(_, Socket = #sslsocket{pid = {ListenSocket, #config{transport_info = {Transport,_,_,_,_},
- emulated = Tracker}}}, Options) ->
+ trackers = Trackers}}}, Options) ->
+ Tracker = proplists:get_value(option_tracker, Trackers),
{SockOpts, EmulatedOpts} = split_options(Options),
ok = set_emulated_opts(Tracker, EmulatedOpts),
check_active_n(EmulatedOpts, Socket),
@@ -137,7 +168,8 @@ setopts(gen_tcp, Socket, Options) ->
setopts(Transport, Socket, Options) ->
Transport:setopts(Socket, Options).
-check_active_n(EmulatedOpts, Socket = #sslsocket{pid = {_, #config{emulated = Tracker}}}) ->
+check_active_n(EmulatedOpts, Socket = #sslsocket{pid = {_, #config{trackers = Trackers}}}) ->
+ Tracker = proplists:get_value(option_tracker, Trackers),
%% We check the resulting options to send an ssl_passive message if necessary.
case proplists:lookup(active, EmulatedOpts) of
%% The provided value is out of bound.
@@ -162,12 +194,14 @@ check_active_n(EmulatedOpts, Socket = #sslsocket{pid = {_, #config{emulated = Tr
ok
end.
-getopts(gen_tcp, #sslsocket{pid = {ListenSocket, #config{emulated = Tracker}}}, Options) ->
+getopts(gen_tcp, #sslsocket{pid = {ListenSocket, #config{trackers = Trackers}}}, Options) ->
+ Tracker = proplists:get_value(option_tracker, Trackers),
{SockOptNames, EmulatedOptNames} = split_options(Options),
EmulatedOpts = get_emulated_opts(Tracker, EmulatedOptNames),
SocketOpts = get_socket_opts(ListenSocket, SockOptNames, inet),
{ok, EmulatedOpts ++ SocketOpts};
-getopts(Transport, #sslsocket{pid = {ListenSocket, #config{emulated = Tracker}}}, Options) ->
+getopts(Transport, #sslsocket{pid = {ListenSocket, #config{trackers = Trackers}}}, Options) ->
+ Tracker = proplists:get_value(option_tracker, Trackers),
{SockOptNames, EmulatedOptNames} = split_options(Options),
EmulatedOpts = get_emulated_opts(Tracker, EmulatedOptNames),
SocketOpts = get_socket_opts(ListenSocket, SockOptNames, Transport),
@@ -215,6 +249,17 @@ inherit_tracker(ListenSocket, EmOpts, #{erl_dist := false} = SslOpts) ->
inherit_tracker(ListenSocket, EmOpts, #{erl_dist := true} = SslOpts) ->
ssl_listen_tracker_sup:start_child_dist([ListenSocket, EmOpts, SslOpts]).
+session_tickets_tracker(_, #{erl_dist := false,
+ session_tickets := disabled}) ->
+ {ok, disabled};
+session_tickets_tracker(Lifetime, #{erl_dist := false,
+ session_tickets := Mode,
+ anti_replay := AntiReplay}) ->
+ tls_server_session_ticket_sup:start_child([Mode, Lifetime, AntiReplay]);
+session_tickets_tracker(Lifetime, #{erl_dist := true, session_tickets := Mode}) ->
+ tls_server_session_ticket_sup:start_child_dist([Mode, Lifetime]).
+
+
get_emulated_opts(TrackerPid) ->
call(TrackerPid, get_emulated_opts).
set_emulated_opts(TrackerPid, InetValues) ->
diff --git a/lib/ssl/src/tls_sup.erl b/lib/ssl/src/tls_sup.erl
new file mode 100644
index 0000000000..25c1db0272
--- /dev/null
+++ b/lib/ssl/src/tls_sup.erl
@@ -0,0 +1,76 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2019-2019. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+%%
+
+-module(tls_sup).
+
+-behaviour(supervisor).
+
+%% API
+-export([start_link/0]).
+
+%% Supervisor callback
+-export([init/1]).
+
+%%%=========================================================================
+%%% API
+%%%=========================================================================
+
+-spec start_link() -> {ok, pid()} | ignore | {error, term()}.
+
+start_link() ->
+ supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+%%%=========================================================================
+%%% Supervisor callback
+%%%=========================================================================
+
+init([]) ->
+
+ TLSConnetionManager = tls_connection_manager_child_spec(),
+ ServerInstanceSup = server_instance_child_spec(),
+
+ {ok, {{one_for_one, 10, 3600}, [TLSConnetionManager,
+ ServerInstanceSup
+ ]}}.
+
+
+%%--------------------------------------------------------------------
+%%% Internal functions
+%%--------------------------------------------------------------------
+
+tls_connection_manager_child_spec() ->
+ Name = tls_connection,
+ StartFunc = {tls_connection_sup, start_link, []},
+ Restart = permanent,
+ Shutdown = 4000,
+ Modules = [tls_connection_sup],
+ Type = supervisor,
+ {Name, StartFunc, Restart, Shutdown, Type, Modules}.
+
+server_instance_child_spec() ->
+ Name = tls_server_sup,
+ StartFunc = {tls_server_sup, start_link, []},
+ Restart = permanent,
+ Shutdown = 4000,
+ Modules = [tls_server_sup],
+ Type = supervisor,
+ {Name, StartFunc, Restart, Shutdown, Type, Modules}.
diff --git a/lib/ssl/src/tls_v1.erl b/lib/ssl/src/tls_v1.erl
index f7c8c770ae..381793c65d 100644
--- a/lib/ssl/src/tls_v1.erl
+++ b/lib/ssl/src/tls_v1.erl
@@ -44,7 +44,7 @@
client_application_traffic_secret_0/3, server_application_traffic_secret_0/3,
exporter_master_secret/3, resumption_master_secret/3,
update_traffic_secret/2, calculate_traffic_keys/3,
- transcript_hash/2, finished_key/2, finished_verify_data/3]).
+ transcript_hash/2, finished_key/2, finished_verify_data/3, pre_shared_key/3]).
-type named_curve() :: sect571r1 | sect571k1 | secp521r1 | brainpoolP512r1 |
sect409k1 | sect409r1 | brainpoolP384r1 | secp384r1 |
@@ -393,6 +393,15 @@ finished_verify_data(FinishedKey, HKDFAlgo, Messages) ->
THash = tls_v1:transcript_hash(Context, HKDFAlgo),
tls_v1:hmac_hash(HKDFAlgo, FinishedKey, THash).
+-spec pre_shared_key(binary(), binary(), atom()) -> binary().
+pre_shared_key(RMS, Nonce, Algo) ->
+ %% The PSK associated with the ticket is computed as:
+ %%
+ %% HKDF-Expand-Label(resumption_master_secret,
+ %% "resumption", ticket_nonce, Hash.length)
+ ssl_cipher:hash_size(Algo),
+ hkdf_expand_label(RMS, <<"resumption">>, Nonce, ssl_cipher:hash_size(Algo), Algo).
+
%% The next-generation application_traffic_secret is computed as:
%%
%% application_traffic_secret_N+1 =
diff --git a/lib/ssl/test/Makefile b/lib/ssl/test/Makefile
index ec0addac59..cb52a6d3d5 100644
--- a/lib/ssl/test/Makefile
+++ b/lib/ssl/test/Makefile
@@ -43,7 +43,8 @@ MODULES = \
ssl_dist_test_lib \
ssl_api_SUITE\
tls_api_SUITE\
- ssl_basic_SUITE \
+ dtls_api_SUITE\
+ ssl_basic_SUITE \
ssl_bench_SUITE \
ssl_cipher_SUITE \
ssl_cipher_suite_SUITE \
@@ -71,6 +72,7 @@ MODULES = \
ssl_pem_cache_SUITE \
ssl_session_SUITE \
ssl_session_cache_SUITE \
+ ssl_session_ticket_SUITE \
openssl_session_SUITE \
ssl_ECC_SUITE \
ssl_ECC_openssl_SUITE \
diff --git a/lib/ssl/test/dtls_api_SUITE.erl b/lib/ssl/test/dtls_api_SUITE.erl
new file mode 100644
index 0000000000..37130abcbf
--- /dev/null
+++ b/lib/ssl/test/dtls_api_SUITE.erl
@@ -0,0 +1,131 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2019-2019. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+%%
+-module(dtls_api_SUITE).
+
+%% Note: This directive should only be used in test suites.
+-compile(export_all).
+
+all() ->
+ [
+ {group, 'dtlsv1.2'},
+ {group, 'dtlsv1'}
+ ].
+
+groups() ->
+ [
+ {'dtlsv1.2', [], api_tests()},
+ {'dtlsv1', [], api_tests()}
+ ].
+
+api_tests() ->
+ [
+ dtls_listen_owner_dies
+ ].
+
+init_per_suite(Config0) ->
+ catch crypto:stop(),
+ try crypto:start() of
+ ok ->
+ ssl_test_lib:clean_start(),
+ ssl_test_lib:make_rsa_cert(Config0)
+ catch _:_ ->
+ {skip, "Crypto did not start"}
+ end.
+
+end_per_suite(_Config) ->
+ ssl:stop(),
+ application:unload(ssl),
+ application:stop(crypto).
+
+
+init_per_group(GroupName, Config) ->
+ case ssl_test_lib:is_tls_version(GroupName) of
+ true ->
+ case ssl_test_lib:sufficient_crypto_support(GroupName) of
+ true ->
+ ssl_test_lib:init_tls_version(GroupName, Config);
+ false ->
+ {skip, "Missing crypto support"}
+ end;
+ _ ->
+ ssl:start(),
+ Config
+ end.
+
+end_per_group(GroupName, Config) ->
+ case ssl_test_lib:is_tls_version(GroupName) of
+ true ->
+ ssl_test_lib:clean_tls_version(Config);
+ false ->
+ Config
+ end.
+
+init_per_testcase(_TestCase, Config) ->
+ ssl_test_lib:ct_log_supported_protocol_versions(Config),
+ ct:timetrap({seconds, 10}),
+ Config.
+
+end_per_testcase(_TestCase, Config) ->
+ Config.
+
+%%--------------------------------------------------------------------
+%% Test Cases --------------------------------------------------------
+%%--------------------------------------------------------------------
+
+dtls_listen_owner_dies() ->
+ [{doc, "Test that you can start new DTLS 'listner' if old owner dies"}].
+
+dtls_listen_owner_dies(Config) when is_list(Config) ->
+ ClientOpts = ssl_test_lib:ssl_options(client_rsa_opts, Config),
+ ServerOpts = ssl_test_lib:ssl_options(server_rsa_opts, Config),
+ {_, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+
+ Port = ssl_test_lib:inet_port(ServerNode),
+ Test = self(),
+ Pid = spawn(fun() -> {ok, _} =
+ ssl:listen(Port, [{protocol, dtls} | ServerOpts]),
+ {error, _} = ssl:listen(Port, [{protocol, dtls} | ServerOpts]),
+ Test ! {self(), listened}
+ end),
+ receive
+ {Pid, listened} ->
+ ok
+ end,
+ {ok, LSocket} = ssl:listen(Port, [{protocol, dtls} | ServerOpts]),
+ spawn(fun() ->
+ {ok, ASocket} = ssl:transport_accept(LSocket),
+ Result0 = ssl:handshake(ASocket),
+ receive
+ {ssl, Socket, "from client"} ->
+ ssl:send(Socket, "from server"),
+ ssl:close(Socket)
+ end
+ end),
+ {ok, Client} = ssl:connect(Hostname, Port, ClientOpts),
+
+ ssl:send(Client, "from client"),
+ receive
+ {ssl, Client, "from server"} ->
+ ssl:close(Client)
+ end.
+
+
diff --git a/lib/ssl/test/make_certs.erl b/lib/ssl/test/make_certs.erl
index 76bf0fa895..70f718cb12 100644
--- a/lib/ssl/test/make_certs.erl
+++ b/lib/ssl/test/make_certs.erl
@@ -33,6 +33,7 @@
v2_crls = true,
ecc_certs = false,
issuing_distribution_point = false,
+ crldp_crlissuer = false,
crl_port = 8000,
openssl_cmd = "openssl",
hostname = "host.example.com"}).
@@ -66,6 +67,8 @@ make_config([{ecc_certs, Bool}|T], C) when is_boolean(Bool) ->
make_config(T, C#config{ecc_certs = Bool});
make_config([{issuing_distribution_point, Bool}|T], C) when is_boolean(Bool) ->
make_config(T, C#config{issuing_distribution_point = Bool});
+make_config([{crldp_crlissuer, Bool}|T], C) when is_boolean(Bool) ->
+ make_config(T, C#config{crldp_crlissuer = Bool});
make_config([{openssl_cmd, Cmd}|T], C) when is_list(Cmd) ->
make_config(T, C#config{openssl_cmd = Cmd});
make_config([{hostname, Hostname}|T], C) when is_list(Hostname) ->
@@ -485,6 +488,87 @@ ca_cnf(
ca_cnf(
Root,
#config{
+ crldp_crlissuer = true,
+ hostname = Hostname} = C) ->
+ ["# Purpose: Configuration for CAs.\n"
+ "\n"
+ "ROOTDIR = " ++ Root ++ "\n"
+ "default_ca = ca\n"
+ "\n"
+
+ "[ca]\n"
+ "dir = $ROOTDIR/", C#config.commonName, "\n"
+ "certs = $dir/certs\n"
+ "crl_dir = $dir/crl\n"
+ "database = $dir/index.txt\n"
+ "new_certs_dir = $dir/newcerts\n"
+ "certificate = $dir/cert.pem\n"
+ "serial = $dir/serial\n"
+ "crl = $dir/crl.pem\n",
+ ["crlnumber = $dir/crlnumber\n" || C#config.v2_crls],
+ "private_key = $dir/private/key.pem\n"
+ "RANDFILE = $dir/private/RAND\n"
+ "\n"
+ "x509_extensions = user_cert\n",
+ ["crl_extensions = crl_ext\n" || C#config.v2_crls],
+ "unique_subject = no\n"
+ "default_days = 3600\n"
+ "default_md = sha1\n"
+ "preserve = no\n"
+ "policy = policy_match\n"
+ "\n"
+
+ "[policy_match]\n"
+ "commonName = supplied\n"
+ "organizationalUnitName = optional\n"
+ "organizationName = match\n"
+ "countryName = match\n"
+ "localityName = match\n"
+ "emailAddress = supplied\n"
+ "\n"
+
+ "[crl_ext]\n"
+ "authorityKeyIdentifier=keyid:always,issuer:always\n",
+
+ "[user_cert]\n"
+ "basicConstraints = CA:false\n"
+ "keyUsage = nonRepudiation, digitalSignature, keyEncipherment\n"
+ "subjectKeyIdentifier = hash\n"
+ "authorityKeyIdentifier = keyid,issuer:always\n"
+ "subjectAltName = DNS.1:" ++ Hostname ++ "\n"
+ "issuerAltName = issuer:copy\n"
+ "crlDistributionPoints=crl_section\n"
+
+ "[crl_section]\n"
+ "fullname=URI:http://localhost/",C#config.commonName,"/crl.pem\n"
+ "CRLissuer=dirName:issuer_sect\n"
+
+ "[issuer_sect]\n"
+ "C=UK\n"
+ "O=Organisation\n"
+ "CN=Some Name\n"
+
+ "[user_cert_digital_signature_only]\n"
+ "basicConstraints = CA:false\n"
+ "keyUsage = digitalSignature\n"
+ "subjectKeyIdentifier = hash\n"
+ "authorityKeyIdentifier = keyid,issuer:always\n"
+ "subjectAltName = DNS.1:" ++ Hostname ++ "\n"
+ "issuerAltName = issuer:copy\n"
+ "\n"
+
+ "[ca_cert]\n"
+ "basicConstraints = critical,CA:true\n"
+ "keyUsage = cRLSign, keyCertSign\n"
+ "subjectKeyIdentifier = hash\n"
+ "authorityKeyIdentifier = keyid:always,issuer:always\n"
+ "subjectAltName = email:copy\n"
+ "issuerAltName = issuer:copy\n"
+ ];
+
+ca_cnf(
+ Root,
+ #config{
issuing_distribution_point = false,
hostname = Hostname
} = C) ->
diff --git a/lib/ssl/test/openssl_npn_SUITE.erl b/lib/ssl/test/openssl_npn_SUITE.erl
index ed3d81eba7..7322e228bd 100644
--- a/lib/ssl/test/openssl_npn_SUITE.erl
+++ b/lib/ssl/test/openssl_npn_SUITE.erl
@@ -74,6 +74,7 @@ init_per_suite(Config0) ->
try crypto:start() of
ok ->
ssl_test_lib:clean_start(),
+ ssl:clear_pem_cache(),
ssl_test_lib:make_rsa_cert(Config0)
catch _:_ ->
{skip, "Crypto did not start"}
diff --git a/lib/ssl/test/openssl_session_SUITE.erl b/lib/ssl/test/openssl_session_SUITE.erl
index 7c129633da..6f74408cb4 100644
--- a/lib/ssl/test/openssl_session_SUITE.erl
+++ b/lib/ssl/test/openssl_session_SUITE.erl
@@ -129,7 +129,21 @@ init_per_testcase(reuse_session_erlang_client, Config) ->
application:set_env(ssl, session_lifetime, ?EXPIRE),
ssl:start(),
Config;
-
+init_per_testcase(reuse_session_erlang_server, Config) ->
+ Version = ssl_test_lib:protocol_version(Config),
+ case ssl_test_lib:is_dtls_version(Version) of
+ true ->
+ case ssl_test_lib:openssl_sane_dtls_session_reuse() of
+ true ->
+ ct:timetrap({seconds, 10}),
+ Config;
+ false ->
+ {skip, "Broken OpenSSL DTLS session reuse"}
+ end;
+ false ->
+ ct:timetrap({seconds, 10}),
+ Config
+ end;
init_per_testcase(TestCase, Config) ->
ct:timetrap({seconds, 10}),
Config.
diff --git a/lib/ssl/test/openssl_tls_1_3_version_SUITE.erl b/lib/ssl/test/openssl_tls_1_3_version_SUITE.erl
index 8a2692ec1d..443236f166 100644
--- a/lib/ssl/test/openssl_tls_1_3_version_SUITE.erl
+++ b/lib/ssl/test/openssl_tls_1_3_version_SUITE.erl
@@ -51,7 +51,7 @@ cert_groups() ->
{group, ecdsa}].
tests() ->
- [tls13_client_tls12_server,
+ [%%tls13_client_tls12_server, %% Not testable with current openssl s_client
%%tls13_client_with_ext_tls12_server,
tls12_client_tls13_server].
@@ -127,6 +127,10 @@ end_per_group(GroupName, Config) ->
%% Test Cases --------------------------------------------------------
%%--------------------------------------------------------------------
+%% openssl s_client cannot be configured to support both TLS 1.3 and TLS 1.2.
+%% In its ClientHello the supported_versions extension contains only one element
+%% [{3,4}] that the server does not accept if it is configured to not support
+%% TLS 1.3.
tls13_client_tls12_server() ->
[{doc,"Test that a TLS 1.3 client can connect to a TLS 1.2 server."}].
@@ -159,11 +163,13 @@ tls13_client_tls12_server(Config) when is_list(Config) ->
%% ssl_test_lib:basic_test(ClientOpts, ServerOpts, Config).
-
+
+
+%% TODO: wrong version of TLS is configured for the client
tls12_client_tls13_server() ->
[{doc,"Test that a TLS 1.2 client can connect to a TLS 1.3 server."}].
-tls12_client_tls13_server(Config) when is_list(Config) ->
+tls12_client_tls13_server(Config) when is_list(Config) ->
ClientOpts = [{versions,
['tlsv1.1', 'tlsv1.2']} | ssl_test_lib:ssl_options(client_cert_opts, Config)],
ServerOpts = [{versions,
diff --git a/lib/ssl/test/property_test/ssl_eqc_handshake.erl b/lib/ssl/test/property_test/ssl_eqc_handshake.erl
index 2ceb540e15..9ae267a2d3 100644
--- a/lib/ssl/test/property_test/ssl_eqc_handshake.erl
+++ b/lib/ssl/test/property_test/ssl_eqc_handshake.erl
@@ -863,9 +863,9 @@ psk_identities(N, Acc) ->
psk_identities(N - 1, [psk_identity()|Acc]).
psk_identity() ->
- Len = rand:uniform(32),
+ Len = 8 + rand:uniform(8),
Identity = crypto:strong_rand_bytes(Len),
- Age = crypto:strong_rand_bytes(4),
+ <<?UINT32(Age)>> = crypto:strong_rand_bytes(4),
#psk_identity{
identity = Identity,
obfuscated_ticket_age = Age}.
diff --git a/lib/ssl/test/ssl_alert_SUITE.erl b/lib/ssl/test/ssl_alert_SUITE.erl
index cc0b636580..a5b9fe9b0e 100644
--- a/lib/ssl/test/ssl_alert_SUITE.erl
+++ b/lib/ssl/test/ssl_alert_SUITE.erl
@@ -49,7 +49,7 @@ end_per_testcase(_TestCase, Config) ->
%% Test Cases --------------------------------------------------------
%%--------------------------------------------------------------------
alerts() ->
- [{doc, "Test ssl_alert:alert_txt/1"}].
+ [{doc, "Test ssl_alert formating code"}].
alerts(Config) when is_list(Config) ->
Descriptions = [?CLOSE_NOTIFY, ?UNEXPECTED_MESSAGE, ?BAD_RECORD_MAC,
?DECRYPTION_FAILED_RESERVED, ?RECORD_OVERFLOW, ?DECOMPRESSION_FAILURE,
@@ -66,7 +66,9 @@ alerts(Config) when is_list(Config) ->
Alerts = [?ALERT_REC(?WARNING, ?CLOSE_NOTIFY) |
[?ALERT_REC(?FATAL, Desc) || Desc <- Descriptions]],
lists:foreach(fun(Alert) ->
- try ssl_alert:alert_txt(Alert)
+ try
+ ssl_alert:reason_code(Alert, server, "TLS", cipher),
+ ssl_alert:reason_code(Alert, client, "TLS", hello)
catch
C:E:T ->
ct:fail({unexpected, {C, E, T}})
@@ -78,8 +80,9 @@ alert_details() ->
alert_details(Config) when is_list(Config) ->
Unique = make_ref(),
UniqueStr = lists:flatten(io_lib:format("~w", [Unique])),
- Alert = ?ALERT_REC(?WARNING, ?CLOSE_NOTIFY, Unique),
- case string:str(ssl_alert:alert_txt(Alert), UniqueStr) of
+ Alert = ?ALERT_REC(?WARNING, ?INTERNAL_ERROR, Unique),
+ {tls_alert, {_, Txt}} = ssl_alert:reason_code(Alert#alert{role=server}, server, "TLS", cipher),
+ case string:str(Txt, UniqueStr) of
0 ->
ct:fail(error_details_missing);
_ ->
@@ -90,11 +93,16 @@ alert_details(Config) when is_list(Config) ->
alert_details_not_too_big() ->
[{doc, "Test that ssl_alert:alert_txt/1 limits printed depth of extended error description"}].
alert_details_not_too_big(Config) when is_list(Config) ->
- Reason = lists:duplicate(10, lists:duplicate(10, lists:duplicate(10, {some, data}))),
- Alert = ?ALERT_REC(?WARNING, ?CLOSE_NOTIFY, Reason),
- case length(ssl_alert:alert_txt(Alert)) < 1000 of
+ Reason = ssl:cipher_suites(all, 'tlsv1.2'),
+ ReasonText = lists:flatten(io_lib:format("~p", [Reason])),
+ Alert = ?ALERT_REC(?FATAL, ?HANDSHAKE_FAILURE, Reason),
+ PrefixLen =
+ length("TLS server: In state cipher at ssl_handshake.erl:1710 generated SERVER ALERT: Fatal - Handshake Failure"),
+ {tls_alert, {_, Txt}} = ssl_alert:reason_code(Alert#alert{role=server, where = #{file => "ssl_handshake.erl",
+ line => 1710}}, server, "TLS", cipher),
+ case byte_size(term_to_binary(Txt)) < (byte_size(term_to_binary(ReasonText)) - PrefixLen) of
true ->
- ok;
+ ct:pal("~s", [Txt]);
false ->
ct:fail(ssl_alert_text_too_big)
end.
diff --git a/lib/ssl/test/ssl_api_SUITE.erl b/lib/ssl/test/ssl_api_SUITE.erl
index c0f23cce58..d2fe83a58e 100644
--- a/lib/ssl/test/ssl_api_SUITE.erl
+++ b/lib/ssl/test/ssl_api_SUITE.erl
@@ -44,17 +44,22 @@ all() ->
groups() ->
[
- {'tlsv1.3', [], ((gen_api_tests() ++ tls13_group() ++ handshake_paus_tests()) -- [dh_params, honor_server_cipher_order, honor_client_cipher_order,
- new_options_in_handshake])
+ {'tlsv1.3', [], ((gen_api_tests() ++ tls13_group() ++ handshake_paus_tests()) --
+ [dh_params, honor_server_cipher_order, honor_client_cipher_order,
+ new_options_in_handshake, handshake_continue_tls13_client])
++ (since_1_2() -- [conf_signature_algs])},
{'tlsv1.2', [], gen_api_tests() ++ since_1_2() ++ handshake_paus_tests() ++ pre_1_3()},
{'tlsv1.1', [], gen_api_tests() ++ handshake_paus_tests() ++ pre_1_3()},
{'tlsv1', [], gen_api_tests() ++ handshake_paus_tests() ++ pre_1_3() ++ beast_mitigation_test()},
{'sslv3', [], (gen_api_tests() -- [new_options_in_handshake]) ++ beast_mitigation_test() ++ pre_1_3()},
- {'dtlsv1.2', [], (gen_api_tests() -- [invalid_keyfile, invalid_certfile, invalid_cacertfile,
- invalid_options, new_options_in_handshake]) ++ handshake_paus_tests() ++ pre_1_3()},
- {'dtlsv1', [], (gen_api_tests() -- [invalid_keyfile, invalid_certfile, invalid_cacertfile,
- invalid_options, new_options_in_handshake]) ++ handshake_paus_tests() ++ pre_1_3()}
+ {'dtlsv1.2', [], (gen_api_tests() --
+ [invalid_keyfile, invalid_certfile, invalid_cacertfile,
+ invalid_options, new_options_in_handshake]) ++
+ handshake_paus_tests() -- [handshake_continue_tls13_client] ++ pre_1_3()},
+ {'dtlsv1', [], (gen_api_tests() --
+ [invalid_keyfile, invalid_certfile, invalid_cacertfile,
+ invalid_options, new_options_in_handshake]) ++
+ handshake_paus_tests() -- [handshake_continue_tls13_client] ++ pre_1_3()}
].
since_1_2() ->
@@ -102,7 +107,9 @@ gen_api_tests() ->
invalid_cacertfile,
invalid_keyfile,
options_not_proplist,
- invalid_options
+ invalid_options,
+ cb_info,
+ log_alert
].
handshake_paus_tests() ->
@@ -110,7 +117,8 @@ handshake_paus_tests() ->
handshake_continue,
handshake_continue_timeout,
hello_client_cancel,
- hello_server_cancel
+ hello_server_cancel,
+ handshake_continue_tls13_client
].
%% Only relevant for SSL 3.0 and TLS 1.1
@@ -435,7 +443,8 @@ handshake_continue(Config) when is_list(Config) ->
Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
{from, self()},
{mfa, {ssl_test_lib, send_recv_result_active, []}},
- {options, ssl_test_lib:ssl_options([{reuseaddr, true},
+ {options, ssl_test_lib:ssl_options([{reuseaddr, true},
+ {log_level, debug},
{verify, verify_peer},
{handshake, hello} | ServerOpts
],
@@ -460,6 +469,69 @@ handshake_continue(Config) when is_list(Config) ->
ssl_test_lib:close(Server),
ssl_test_lib:close(Client).
+%%--------------------------------------------------------------------
+handshake_continue_tls13_client() ->
+ [{doc, "Test API function ssl:handshake_continue/3 with fixed TLS 1.3 client"}].
+handshake_continue_tls13_client(Config) when is_list(Config) ->
+ ClientOpts = ssl_test_lib:ssl_options(client_rsa_opts, Config),
+ ServerOpts = ssl_test_lib:ssl_options(server_rsa_opts, Config),
+ {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+
+ Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
+ {from, self()},
+ {mfa, {ssl_test_lib, send_recv_result_active, []}},
+ {options, ssl_test_lib:ssl_options([{reuseaddr, true},
+ {log_level, debug},
+ {verify, verify_peer},
+ {handshake, hello} | ServerOpts
+ ],
+ Config)},
+ {continue_options, proplists:delete(reuseaddr, ServerOpts)}
+ ]),
+
+ Port = ssl_test_lib:inet_port(Server),
+
+ DummyTicket =
+ <<131,116,0,0,0,5,100,0,4,104,107,100,102,100,0,6,115,104,97,51,
+ 56,52,100,0,3,112,115,107,109,0,0,0,48,150,90,38,127,26,12,5,
+ 228,180,235,229,214,215,27,236,149,182,82,14,140,50,81,0,150,
+ 248,152,180,193,207,80,52,107,196,200,2,77,4,96,140,65,239,205,
+ 224,125,129,179,147,103,100,0,3,115,110,105,107,0,25,112,114,
+ 111,117,100,102,111,111,116,46,111,116,112,46,101,114,105,99,
+ 115,115,111,110,46,115,101,100,0,6,116,105,99,107,101,116,104,6,
+ 100,0,18,110,101,119,95,115,101,115,115,105,111,110,95,116,105,
+ 99,107,101,116,98,0,0,28,32,98,127,110,83,249,109,0,0,0,8,0,0,0,
+ 0,0,0,0,5,109,0,0,0,113,112,154,74,26,27,0,111,147,51,110,216,
+ 43,45,4,100,215,152,195,118,96,22,34,1,184,170,42,166,238,109,
+ 187,138,196,147,102,205,116,83,241,174,227,232,156,148,60,153,3,
+ 175,128,115,192,36,103,191,239,58,222,192,172,190,239,92,8,131,
+ 195,0,217,187,222,143,104,6,86,53,93,27,218,198,205,138,223,202,
+ 11,55,168,104,6,219,228,217,157,37,52,205,252,165,135,167,116,
+ 216,172,231,222,189,84,97,0,8,106,108,88,47,114,48,116,0,0,0,0,
+ 100,0,9,116,105,109,101,115,116,97,109,112,98,93,205,0,44>>,
+
+ %% Send dummy session ticket to trigger sending of pre_shared_key and
+ %% psk_key_exchange_modes extensions.
+ Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
+ {host, Hostname},
+ {from, self()},
+ {mfa, {ssl_test_lib, send_recv_result_active, []}},
+ {options, ssl_test_lib:ssl_options([{handshake, hello},
+ {session_tickets, enabled},
+ {use_ticket, [DummyTicket]},
+ {versions, ['tlsv1.3',
+ 'tlsv1.2',
+ 'tlsv1.1',
+ 'tlsv1']},
+ {verify, verify_peer} | ClientOpts
+ ],
+ Config)},
+ {continue_options, proplists:delete(reuseaddr, ClientOpts)}]),
+
+ ssl_test_lib:check_result(Server, ok, Client, ok),
+
+ ssl_test_lib:close(Server),
+ ssl_test_lib:close(Client).
%%------------------------------------------------------------------
handshake_continue_timeout() ->
@@ -1538,6 +1610,60 @@ default_reject_anonymous(Config) when is_list(Config) ->
ssl_test_lib:check_server_alert(Server, Client, insufficient_security).
%%-------------------------------------------------------------------
+cb_info() ->
+ [{doc,"Test that we can set cb_info."}].
+
+cb_info(Config) when is_list(Config) ->
+ ClientOpts = ssl_test_lib:ssl_options(client_rsa_opts, Config),
+ ServerOpts = ssl_test_lib:ssl_options(server_rsa_opts, Config),
+ Protocol = proplists:get_value(protocol, Config, tls),
+ CbInfo =
+ case Protocol of
+ tls ->
+ {cb_info, {gen_tcp, tcp, tcp_closed, tcp_error}};
+ dtls ->
+ {cb_info, {gen_udp, udp, udp_closed, udp_error}}
+ end,
+ {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+ Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
+ {from, self()},
+ {mfa, {ssl_test_lib, send_recv_result_active, []}},
+ {options, [CbInfo | ServerOpts]}]),
+ Port = ssl_test_lib:inet_port(Server),
+
+ Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
+ {host, Hostname},
+ {from, self()},
+ {mfa, {ssl_test_lib, send_recv_result_active, []}},
+ {options, [CbInfo | ClientOpts]}]),
+
+ ssl_test_lib:check_result(Server, ok, Client, ok).
+
+%%-------------------------------------------------------------------
+log_alert() ->
+ [{doc,"Test that we can set log_alert."}].
+
+log_alert(Config) when is_list(Config) ->
+ ClientOpts = ssl_test_lib:ssl_options(client_rsa_opts, Config),
+ ServerOpts = ssl_test_lib:ssl_options(server_rsa_opts, Config),
+
+ {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+ Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
+ {from, self()},
+ {mfa, {ssl_test_lib, send_recv_result_active, []}},
+ {options, [{log_alert, false} | ServerOpts]}]),
+ Port = ssl_test_lib:inet_port(Server),
+
+ Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
+ {host, Hostname},
+ {from, self()},
+ {mfa, {ssl_test_lib, send_recv_result_active, []}},
+ {options, [{log_alert, false} | ClientOpts]}]),
+
+ ssl_test_lib:check_result(Server, ok, Client, ok).
+
+
+%%-------------------------------------------------------------------
%% Note that these test only test that the options are valid to set. As application data
%% is a stream you can not test that the send acctually splits it up as when it arrives
%% again at the user layer it may be concatenated. But COVER can show that the split up
diff --git a/lib/ssl/test/ssl_crl_SUITE.erl b/lib/ssl/test/ssl_crl_SUITE.erl
index b2fd3874a8..47d4b04d90 100644
--- a/lib/ssl/test/ssl_crl_SUITE.erl
+++ b/lib/ssl/test/ssl_crl_SUITE.erl
@@ -42,7 +42,8 @@ groups() ->
{check_true, [], [{group, v2_crl},
{group, v1_crl},
{group, idp_crl},
- {group, crl_hash_dir}]},
+ {group, crl_hash_dir},
+ {group, crl_verify_crldp_crlissuer}]},
{check_peer, [], [{group, v2_crl},
{group, v1_crl},
{group, idp_crl},
@@ -54,7 +55,8 @@ groups() ->
{v2_crl, [], basic_tests()},
{v1_crl, [], basic_tests()},
{idp_crl, [], basic_tests()},
- {crl_hash_dir, [], basic_tests() ++ crl_hash_dir_tests()}].
+ {crl_hash_dir, [], basic_tests() ++ crl_hash_dir_tests()},
+ {crl_verify_crldp_crlissuer, [], [crl_verify_valid]}].
basic_tests() ->
[crl_verify_valid, crl_verify_revoked, crl_verify_no_crl].
@@ -108,8 +110,8 @@ init_per_group(Group, Config0) ->
CertDir = filename:join(proplists:get_value(priv_dir, Config0), Group),
{CertOpts, Config} = init_certs(CertDir, Group, Config0),
{ok, _} = make_certs:all(DataDir, CertDir, CertOpts),
- CrlCacheOpts = case Group of
- crl_hash_dir ->
+ CrlCacheOpts = case need_hash_dir(Group) of
+ true ->
CrlDir = filename:join(CertDir, "crls"),
%% Copy CRLs to their hashed filenames.
%% Find the hashes with 'openssl crl -noout -hash -in crl.pem'.
@@ -462,8 +464,17 @@ is_idp(idp_crl) ->
is_idp(_) ->
false.
+need_hash_dir(crl_hash_dir) ->
+ true;
+need_hash_dir(crl_verify_crldp_crlissuer) ->
+ true;
+need_hash_dir(_) ->
+ false.
+
init_certs(_,v1_crl, Config) ->
{[{v2_crls, false}], Config};
+init_certs(_,crl_verify_crldp_crlissuer , Config) ->
+ {[{crldp_crlissuer, true}], Config};
init_certs(_, idp_crl, Config) ->
Port = proplists:get_value(httpd_port, Config),
{[{crl_port,Port},
diff --git a/lib/ssl/test/ssl_dist_SUITE.erl b/lib/ssl/test/ssl_dist_SUITE.erl
index 7cfb2ac0c5..be3d7c2dfe 100644
--- a/lib/ssl/test/ssl_dist_SUITE.erl
+++ b/lib/ssl/test/ssl_dist_SUITE.erl
@@ -116,7 +116,6 @@ basic_test(NH1, NH2, _) ->
Node1 = NH1#node_handle.nodename,
Node2 = NH2#node_handle.nodename,
pong = apply_on_ssl_node(NH1, fun () -> net_adm:ping(Node2) end),
-
[Node2] = apply_on_ssl_node(NH1, fun () -> nodes() end),
[Node1] = apply_on_ssl_node(NH2, fun () -> nodes() end),
diff --git a/lib/ssl/test/ssl_handshake_SUITE.erl b/lib/ssl/test/ssl_handshake_SUITE.erl
index e4a2ebb583..dd84d732c1 100644
--- a/lib/ssl/test/ssl_handshake_SUITE.erl
+++ b/lib/ssl/test/ssl_handshake_SUITE.erl
@@ -28,6 +28,7 @@
-include("ssl_alert.hrl").
-include("ssl_handshake.hrl").
-include("ssl_internal.hrl").
+-include("ssl_record.hrl").
-include("tls_handshake.hrl").
-include_lib("public_key/include/public_key.hrl").
@@ -106,7 +107,7 @@ decode_hello_handshake(_Config) ->
Version = {3, 0},
{Records, _Buffer} = tls_handshake:get_tls_handshake(Version, HelloPacket, <<>>,
- ssl:options_to_map(#ssl_options{})),
+ default_options_map()),
{Hello, _Data} = hd(Records),
Extensions = Hello#server_hello.extensions,
@@ -274,3 +275,7 @@ is_supported(Hash) ->
Algos = crypto:supports(),
Hashs = proplists:get_value(hashs, Algos),
lists:member(Hash, Hashs).
+
+default_options_map() ->
+ Fun = fun (_Key, {Default, _}) -> Default end,
+ maps:map(Fun, ?RULES).
diff --git a/lib/ssl/test/ssl_npn_SUITE.erl b/lib/ssl/test/ssl_npn_SUITE.erl
index 8a76a3a82b..1f794075c1 100644
--- a/lib/ssl/test/ssl_npn_SUITE.erl
+++ b/lib/ssl/test/ssl_npn_SUITE.erl
@@ -68,7 +68,8 @@ init_per_suite(Config0) ->
catch crypto:stop(),
try crypto:start() of
ok ->
- ssl_test_lib:clean_start(),
+ ssl_test_lib:clean_start(),
+ ssl:clear_pem_cache(),
Config = ssl_test_lib:make_rsa_cert(Config0),
ssl_test_lib:cert_options(Config)
catch _:_ ->
diff --git a/lib/ssl/test/ssl_npn_hello_SUITE.erl b/lib/ssl/test/ssl_npn_hello_SUITE.erl
index e098190ece..68c3962b2c 100644
--- a/lib/ssl/test/ssl_npn_hello_SUITE.erl
+++ b/lib/ssl/test/ssl_npn_hello_SUITE.erl
@@ -72,7 +72,7 @@ encode_and_decode_client_hello_test(Config) ->
Version = ssl_test_lib:protocol_version(Config),
{[{DecodedHandshakeMessage, _Raw}], _} =
tls_handshake:get_tls_handshake(Version, list_to_binary(HandShakeData), <<>>,
- ssl:options_to_map(#ssl_options{})),
+ default_options_map()),
Extensions = DecodedHandshakeMessage#client_hello.extensions,
#{next_protocol_negotiation := undefined} = Extensions.
%%--------------------------------------------------------------------
@@ -81,7 +81,7 @@ encode_and_decode_npn_client_hello_test(Config) ->
Version = ssl_test_lib:protocol_version(Config),
{[{DecodedHandshakeMessage, _Raw}], _} =
tls_handshake:get_tls_handshake(Version, list_to_binary(HandShakeData), <<>>,
- ssl:options_to_map(#ssl_options{})),
+ default_options_map()),
Extensions = DecodedHandshakeMessage#client_hello.extensions,
#{next_protocol_negotiation := #next_protocol_negotiation{extension_data = <<>>}} = Extensions.
%%--------------------------------------------------------------------
@@ -90,7 +90,7 @@ encode_and_decode_server_hello_test(Config) ->
Version = ssl_test_lib:protocol_version(Config),
{[{DecodedHandshakeMessage, _Raw}], _} =
tls_handshake:get_tls_handshake(Version, list_to_binary(HandShakeData), <<>>,
- ssl:options_to_map(#ssl_options{})),
+ default_options_map()),
Extensions = DecodedHandshakeMessage#server_hello.extensions,
#{next_protocol_negotiation := undefined} = Extensions.
@@ -100,7 +100,7 @@ encode_and_decode_npn_server_hello_test(Config) ->
Version = ssl_test_lib:protocol_version(Config),
{[{DecodedHandshakeMessage, _Raw}], _} =
tls_handshake:get_tls_handshake(Version, list_to_binary(HandShakeData), <<>>,
- ssl:options_to_map(#ssl_options{})),
+ default_options_map()),
Extensions = DecodedHandshakeMessage#server_hello.extensions,
ct:log("~p ~n", [Extensions]),
#{next_protocol_negotiation := #next_protocol_negotiation{extension_data = <<6, "spdy/2">>}} = Extensions.
@@ -153,3 +153,7 @@ create_connection_states() ->
current_read => #{secure_renegotiation => false
}
}.
+
+default_options_map() ->
+ Fun = fun (_Key, {Default, _}) -> Default end,
+ maps:map(Fun, ?RULES).
diff --git a/lib/ssl/test/ssl_packet_SUITE.erl b/lib/ssl/test/ssl_packet_SUITE.erl
index 6d26b2df33..b79a51f02a 100644
--- a/lib/ssl/test/ssl_packet_SUITE.erl
+++ b/lib/ssl/test/ssl_packet_SUITE.erl
@@ -860,11 +860,11 @@ server_http_decode(Socket, HttpResponse) ->
Other4 -> exit({?LINE, Other4})
end,
assert_packet_opt(Socket, http),
- ok = ssl:send(Socket, HttpResponse),
+ spawn(fun() -> ssl:send(Socket, HttpResponse) end),
ok.
client_http_decode(Socket, HttpRequest) ->
- ok = ssl:send(Socket, HttpRequest),
+ spawn(fun() -> ssl:send(Socket, HttpRequest) end),
receive
{ssl, Socket, {http_response, {1,1}, 200, "OK"}} -> ok;
Other1 -> exit({?LINE, Other1})
@@ -922,7 +922,7 @@ packet_http_decode_list(Config) when is_list(Config) ->
client_http_decode_list(Socket, HttpRequest) ->
- ok = ssl:send(Socket, HttpRequest),
+ spawn(fun() -> ssl:send(Socket, HttpRequest) end),
receive
{ssl, Socket, {http_response, {1,1}, 200, "OK"}} -> ok;
Other1 -> exit({?LINE, Other1})
@@ -1001,13 +1001,13 @@ server_http_bin_decode(Socket, HttpResponse, Count) when Count > 0 ->
Other4 -> exit({?LINE, Other4})
end,
assert_packet_opt(Socket, http_bin),
- ok = ssl:send(Socket, HttpResponse),
+ spawn(fun() -> ssl:send(Socket, HttpResponse) end),
server_http_bin_decode(Socket, HttpResponse, Count - 1);
server_http_bin_decode(_, _, _) ->
ok.
client_http_bin_decode(Socket, HttpRequest, Count) when Count > 0 ->
- ok = ssl:send(Socket, HttpRequest),
+ spawn(fun() -> ssl:send(Socket, HttpRequest) end),
receive
{ssl, Socket, {http_response, {1,1}, 200, <<"OK">>}} -> ok;
Other1 -> exit({?LINE, Other1})
@@ -1085,7 +1085,7 @@ server_http_decode_error(Socket, HttpResponse) ->
{ok, http_eoh} = ssl:recv(Socket, 0),
assert_packet_opt(Socket, http),
- ok = ssl:send(Socket, HttpResponse),
+ spawn(fun() -> ssl:send(Socket, HttpResponse) end),
ok.
%%--------------------------------------------------------------------
packet_httph_active() ->
@@ -2009,13 +2009,14 @@ packet(Config, Data, Send, Recv, Quantity, Packet, Active) ->
Server = ssl_test_lib:start_server([{node, ClientNode}, {port, 0},
{from, self()},
{mfa, {?MODULE, Send ,[Data, Quantity]}},
- {options, [{packet, Packet} | ServerOpts]}]),
+ {options, [{packet, Packet}, {nodelay, true}| ServerOpts]}]),
Port = ssl_test_lib:inet_port(Server),
Client = ssl_test_lib:start_client([{node, ServerNode}, {port, Port},
{host, Hostname},
{from, self()},
{mfa, {?MODULE, Recv, [Data, Quantity]}},
{options, [{active, Active},
+ {nodelay, true},
{packet, Packet} |
ClientOpts]}]),
@@ -2048,7 +2049,7 @@ passive_recv_packet(Socket, _, 0) ->
{other, Other, ssl:connection_information(Socket, [session_id, cipher_suite]), 0}
end;
passive_recv_packet(Socket, Data, N) ->
- case ssl:recv(Socket, 0) of
+ case ssl:recv(Socket, 0, 5000) of
{ok, Data} ->
passive_recv_packet(Socket, Data, N-1);
Other ->
@@ -2108,18 +2109,10 @@ active_once_packet(Socket,_, 0) ->
end;
active_once_packet(Socket, Data, N) ->
receive
- {ssl, Socket, Byte} when length(Byte) == 1 ->
- ssl:setopts(Socket, [{active, once}]),
- receive
- {ssl, Socket, _} ->
- ssl:setopts(Socket, [{active, once}]),
- active_once_packet(Socket, Data, N-1)
- end;
{ssl, Socket, Data} ->
- ok
- end,
- ssl:setopts(Socket, [{active, once}]),
- active_once_packet(Socket, Data, N-1).
+ ssl:setopts(Socket, [{active, once}]),
+ active_once_packet(Socket, Data, N-1)
+ end.
active_raw(Socket, Data, N) ->
active_raw(Socket, (length(Data) * N)).
@@ -2140,11 +2133,6 @@ active_packet(Socket, _, 0) ->
end;
active_packet(Socket, Data, N) ->
receive
- {ssl, Socket, Byte} when length(Byte) == 1 ->
- receive
- {ssl, Socket, _} ->
- active_packet(Socket, Data, N -1)
- end;
{ssl, Socket, Data} ->
active_packet(Socket, Data, N -1);
Other ->
@@ -2164,7 +2152,8 @@ server_packet_decode(Socket, Packet) ->
{ssl, Socket, Packet} -> ok;
Other2 -> exit({?LINE, Other2})
end,
- ok = ssl:send(Socket, Packet).
+ spawn(fun() -> ssl:send(Socket, Packet) end),
+ ok.
client_packet_decode(Socket, Packet) when is_binary(Packet)->
<<P1:10/binary, P2/binary>> = Packet,
@@ -2173,14 +2162,12 @@ client_packet_decode(Socket, [Head | Tail] = Packet) ->
client_packet_decode(Socket, [Head], Tail, Packet).
client_packet_decode(Socket, P1, P2, Packet) ->
- ct:log("Packet: ~p ~n", [Packet]),
- ok = ssl:send(Socket, P1),
- ok = ssl:send(Socket, P2),
+ spawn(fun() -> ssl:send(Socket, P1), ssl:send(Socket, P2) end),
receive
{ssl, Socket, Packet} -> ok;
Other1 -> exit({?LINE, Other1})
end,
- ok = ssl:send(Socket, Packet),
+ spawn(fun() -> ssl:send(Socket, Packet) end),
receive
{ssl, Socket, Packet} -> ok;
Other2 -> exit({?LINE, Other2})
@@ -2193,10 +2180,11 @@ server_header_decode_active(Socket, Packet, Result) ->
{ssl, Socket, Other1} ->
check_header_result(Result, Other1)
end,
- ok = ssl:send(Socket, Packet).
+ spawn(fun() -> ssl:send(Socket, Packet) end),
+ ok.
client_header_decode_active(Socket, Packet, Result) ->
- ok = ssl:send(Socket, Packet),
+ spawn(fun() -> ssl:send(Socket, Packet) end),
receive
{ssl, Socket, Result} ->
ok;
@@ -2211,11 +2199,11 @@ server_header_decode_passive(Socket, Packet, Result) ->
{ok, Other} ->
check_header_result(Result, Other)
end,
- ok = ssl:send(Socket, Packet).
+ spawn(fun() -> ssl:send(Socket, Packet) end),
+ ok.
client_header_decode_passive(Socket, Packet, Result) ->
- ok = ssl:send(Socket, Packet),
-
+ spawn(fun() -> ssl:send(Socket, Packet) end),
case ssl:recv(Socket, 0) of
{ok, Result} ->
ok;
@@ -2253,7 +2241,8 @@ server_line_packet_decode(Socket, L1, L2, Packet) ->
{ssl, Socket, L2} -> ok;
Other2 -> exit({?LINE, Other2})
end,
- ok = ssl:send(Socket, Packet).
+ spawn(fun() -> ssl:send(Socket, Packet) end),
+ ok.
client_line_packet_decode(Socket, Packet) when is_binary(Packet)->
<<P1:10/binary, P2/binary>> = Packet,
@@ -2264,8 +2253,7 @@ client_line_packet_decode(Socket, [Head | Tail] = Packet) ->
client_line_packet_decode(Socket, [Head], Tail, L1 ++ "\n", L2 ++ "\n").
client_line_packet_decode(Socket, P1, P2, L1, L2) ->
- ok = ssl:send(Socket, P1),
- ok = ssl:send(Socket, P2),
+ spawn(fun() -> ssl:send(Socket, P1), ssl:send(Socket, P2) end),
receive
{ssl, Socket, L1} -> ok;
Other1 -> exit({?LINE, Other1})
@@ -2305,11 +2293,11 @@ client_reject_packet_opt(Config, PacketOpt) ->
send_switch_packet(SslSocket, Data, NextPacket) ->
- ssl:send(SslSocket, Data),
+ spawn(fun() -> ssl:send(SslSocket, Data) end),
receive
{ssl, SslSocket, "Hello World"} ->
ssl:setopts(SslSocket, [{packet, NextPacket}]),
- ssl:send(SslSocket, Data),
+ spawn(fun() -> ssl:send(SslSocket, Data) end),
receive
{ssl, SslSocket, "Hello World"} ->
ok
@@ -2318,10 +2306,11 @@ send_switch_packet(SslSocket, Data, NextPacket) ->
recv_switch_packet(SslSocket, Data, NextPacket) ->
receive
{ssl, SslSocket, "Hello World"} ->
- ssl:send(SslSocket, Data),
+ spawn(fun() -> ssl:send(SslSocket, Data) end),
ssl:setopts(SslSocket, [{packet, NextPacket}]),
receive
{ssl, SslSocket, "Hello World"} ->
- ssl:send(SslSocket, Data)
+ spawn(fun() -> ssl:send(SslSocket, Data) end),
+ ok
end
end.
diff --git a/lib/ssl/test/ssl_payload_SUITE.erl b/lib/ssl/test/ssl_payload_SUITE.erl
index 2d0ffd03d7..91043408b7 100644
--- a/lib/ssl/test/ssl_payload_SUITE.erl
+++ b/lib/ssl/test/ssl_payload_SUITE.erl
@@ -776,7 +776,7 @@ echo_recv(_Socket, 0) ->
ok;
echo_recv(Socket, Size) ->
{ok, Data} = ssl:recv(Socket, 0),
- ok = ssl:send(Socket, Data),
+ spawn(fun() -> ssl:send(Socket, Data) end),
echo_recv(Socket, Size - byte_size(Data)).
@@ -785,7 +785,7 @@ echo_recv_chunk(_Socket, _, 0) ->
ok;
echo_recv_chunk(Socket, ChunkSize, Size) ->
{ok, Data} = ssl:recv(Socket, ChunkSize),
- ok = ssl:send(Socket, Data),
+ spawn(fun() -> ssl:send(Socket, Data) end),
echo_recv_chunk(Socket, ChunkSize, Size - ChunkSize).
@@ -795,7 +795,7 @@ echo_active_once(_Socket, 0) ->
echo_active_once(Socket, Size) ->
receive
{ssl, Socket, Data} ->
- ok = ssl:send(Socket, Data),
+ spawn(fun() -> ssl:send(Socket, Data) end),
NewSize = Size - byte_size(Data),
ssl:setopts(Socket, [{active, once}]),
echo_active_once(Socket, NewSize)
@@ -807,7 +807,7 @@ echo_active(_Socket, 0) ->
echo_active(Socket, Size) ->
receive
{ssl, Socket, Data} ->
- ok = ssl:send(Socket, Data),
+ spawn(fun() -> ssl:send(Socket, Data) end),
echo_active(Socket, Size - byte_size(Data))
end.
diff --git a/lib/ssl/test/ssl_session_cache_SUITE.erl b/lib/ssl/test/ssl_session_cache_SUITE.erl
index 553c2d247b..f3b1c38d2e 100644
--- a/lib/ssl/test/ssl_session_cache_SUITE.erl
+++ b/lib/ssl/test/ssl_session_cache_SUITE.erl
@@ -225,15 +225,9 @@ session_cleanup(Config) when is_list(Config) ->
%% Make sure session has expired and been cleaned up
check_timer(SessionTimer),
- ct:sleep(?DELAY *2), %% Delay time + some extra time
-
- {ServerDelayTimer, ClientDelayTimer} = get_delay_timers(),
-
- check_timer(ServerDelayTimer),
- check_timer(ClientDelayTimer),
-
+
ct:sleep(?SLEEP), %% Make sure clean has had time to run
-
+
undefined = ssl_session_cache:lookup(ClientCache, {{Hostname, Port}, Id}),
undefined = ssl_session_cache:lookup(ServerCache, {Port, Id}),
@@ -524,24 +518,6 @@ check_timer(Timer) ->
ct:sleep(Int),
check_timer(Timer)
end.
-
-get_delay_timers() ->
- {status, _, _, StatusInfo} = sys:get_status(whereis(ssl_manager)),
- [_, _,_, _, Prop] = StatusInfo,
- State = ssl_test_lib:state(Prop),
- case element(8, State) of
- {undefined, undefined} ->
- ct:sleep(?SLEEP),
- get_delay_timers();
- {undefined, _} ->
- ct:sleep(?SLEEP),
- get_delay_timers();
- {_, undefined} ->
- ct:sleep(?SLEEP),
- get_delay_timers();
- DelayTimers ->
- DelayTimers
- end.
wait_for_server() ->
ct:sleep(100).
diff --git a/lib/ssl/test/ssl_session_ticket_SUITE.erl b/lib/ssl/test/ssl_session_ticket_SUITE.erl
new file mode 100644
index 0000000000..83e8e3214d
--- /dev/null
+++ b/lib/ssl/test/ssl_session_ticket_SUITE.erl
@@ -0,0 +1,722 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2007-2019. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+%%
+-module(ssl_session_ticket_SUITE).
+
+%% Note: This directive should only be used in test suites.
+-compile(export_all).
+
+-include("tls_handshake.hrl").
+
+-include_lib("common_test/include/ct.hrl").
+
+-define(SLEEP, 500).
+
+
+%%--------------------------------------------------------------------
+%% Common Test interface functions -----------------------------------
+%%--------------------------------------------------------------------
+all() ->
+ [
+ {group, 'tlsv1.3'}
+ ].
+
+groups() ->
+ [{'tlsv1.3', [], [{group, stateful}, {group, stateless}, {group, openssl_server}]},
+ {openssl_server, [], [erlang_client_openssl_server_basic,
+ erlang_client_openssl_server_hrr,
+ erlang_client_openssl_server_hrr_multiple_tickets
+ ]},
+ {stateful, [], session_tests()},
+ {stateless, [], session_tests()}].
+
+session_tests() ->
+ [erlang_client_erlang_server_basic,
+ openssl_client_erlang_server_basic,
+ erlang_client_erlang_server_hrr,
+ openssl_client_erlang_server_hrr,
+ erlang_client_erlang_server_multiple_tickets,
+ erlang_client_erlang_server_multiple_tickets_2hash].
+
+init_per_suite(Config0) ->
+ catch crypto:stop(),
+ try crypto:start() of
+ ok ->
+ ssl_test_lib:clean_start(),
+ ssl_test_lib:make_rsa_cert(Config0)
+ catch _:_ ->
+ {skip, "Crypto did not start"}
+ end.
+
+end_per_suite(_Config) ->
+ ssl:stop(),
+ application:stop(crypto).
+
+init_per_group(stateful, Config) ->
+ [{server_ticket_mode, stateful} | proplists:delete(server_ticket_mode, Config)];
+init_per_group(stateless, Config) ->
+ [{server_ticket_mode, stateless} | proplists:delete(server_ticket_mode, Config)];
+init_per_group(GroupName, Config) ->
+ ssl_test_lib:clean_tls_version(Config),
+ case ssl_test_lib:is_tls_version(GroupName) andalso ssl_test_lib:sufficient_crypto_support(GroupName) of
+ true ->
+ ssl_test_lib:init_tls_version(GroupName, Config);
+ _ ->
+ case ssl_test_lib:sufficient_crypto_support(GroupName) of
+ true ->
+ ssl:start(),
+ Config;
+ false ->
+ {skip, "Missing crypto support"}
+ end
+ end.
+
+end_per_group(GroupName, Config) ->
+ case ssl_test_lib:is_tls_version(GroupName) of
+ true ->
+ ssl_test_lib:clean_tls_version(Config);
+ false ->
+ Config
+ end.
+
+init_per_testcase(_, Config) ->
+ ssl:stop(),
+ application:load(ssl),
+ ssl:start(),
+ ct:timetrap({seconds, 15}),
+ Config.
+
+end_per_testcase(_TestCase, Config) ->
+ Config.
+
+%%--------------------------------------------------------------------
+%% Test Cases --------------------------------------------------------
+%%--------------------------------------------------------------------
+
+
+erlang_client_erlang_server_basic() ->
+ [{doc,"Test session resumption with session tickets (erlang client - erlang server)"}].
+erlang_client_erlang_server_basic(Config) when is_list(Config) ->
+ ClientOpts0 = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config),
+ ServerOpts0 = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config),
+ {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+ ServerTicketMode = proplists:get_value(server_ticket_mode, Config),
+
+ %% Configure session tickets
+ ClientOpts = [{session_tickets, auto}, {log_level, debug},
+ {versions, ['tlsv1.2','tlsv1.3']}|ClientOpts0],
+ ServerOpts = [{session_tickets, ServerTicketMode}, {log_level, debug},
+ {versions, ['tlsv1.2','tlsv1.3']}|ServerOpts0],
+
+ Server0 =
+ ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
+ {from, self()},
+ {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [false]}},
+ {options, ServerOpts}]),
+ Port0 = ssl_test_lib:inet_port(Server0),
+
+ %% Store ticket from first connection
+ Client0 = ssl_test_lib:start_client([{node, ClientNode},
+ {port, Port0}, {host, Hostname},
+ {mfa, {ssl_test_lib, %% Full handshake
+ verify_active_session_resumption,
+ [false]}},
+ {from, self()}, {options, ClientOpts}]),
+ ssl_test_lib:check_result(Server0, ok, Client0, ok),
+
+ Server0 ! {listen, {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [true]}}},
+
+ %% Wait for session ticket
+ ct:sleep(100),
+
+ ssl_test_lib:close(Client0),
+
+ %% Use ticket
+ Client1 = ssl_test_lib:start_client([{node, ClientNode},
+ {port, Port0}, {host, Hostname},
+ {mfa, {ssl_test_lib, %% Short handshake
+ verify_active_session_resumption,
+ [true]}},
+ {from, self()}, {options, ClientOpts}]),
+ ssl_test_lib:check_result(Server0, ok, Client1, ok),
+
+ process_flag(trap_exit, false),
+ ssl_test_lib:close(Server0),
+ ssl_test_lib:close(Client1).
+
+
+erlang_client_openssl_server_basic() ->
+ [{doc,"Test session resumption with session tickets (erlang client - openssl server)"}].
+erlang_client_openssl_server_basic(Config) when is_list(Config) ->
+ process_flag(trap_exit, true),
+ ClientOpts0 = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config),
+ ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config),
+ {ClientNode, _, Hostname} = ssl_test_lib:run_where(Config),
+
+ Version = 'tlsv1.3',
+ Port = ssl_test_lib:inet_port(node()),
+ CertFile = proplists:get_value(certfile, ServerOpts),
+ CACertFile = proplists:get_value(cacertfile, ServerOpts),
+ KeyFile = proplists:get_value(keyfile, ServerOpts),
+
+ %% Configure session tickets
+ ClientOpts = [{session_tickets, auto}, {log_level, debug},
+ {versions, ['tlsv1.2','tlsv1.3']}|ClientOpts0],
+
+ Exe = "openssl",
+ Args = ["s_server", "-accept", integer_to_list(Port), ssl_test_lib:version_flag(Version),
+ "-cert", CertFile,"-key", KeyFile, "-CAfile", CACertFile, "-msg", "-debug"],
+
+ OpensslPort = ssl_test_lib:portable_open_port(Exe, Args),
+
+ ssl_test_lib:wait_for_openssl_server(Port, proplists:get_value(protocol, Config)),
+
+ %% Store ticket from first connection
+ Client0 = ssl_test_lib:start_client([{node, ClientNode},
+ {port, Port}, {host, Hostname},
+ {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [false, no_reply]}},
+ {from, self()}, {options, ClientOpts}]),
+ %% Wait for session ticket
+ ct:sleep(100),
+
+ %% Close previous connection as s_server can only handle one at a time
+ ssl_test_lib:close(Client0),
+
+ %% Use ticket
+ Client1 = ssl_test_lib:start_client([{node, ClientNode},
+ {port, Port}, {host, Hostname},
+ {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [true, no_reply]}},
+ {from, self()},
+ {options, ClientOpts}]),
+ process_flag(trap_exit, false),
+
+ %% Clean close down! Server needs to be closed first !!
+ ssl_test_lib:close_port(OpensslPort),
+ ssl_test_lib:close(Client1).
+
+
+openssl_client_erlang_server_basic() ->
+ [{doc,"Test session resumption with session tickets (openssl client - erlang server)"}].
+openssl_client_erlang_server_basic(Config) when is_list(Config) ->
+ ServerOpts0 = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config),
+ {_, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+ TicketFile0 = filename:join([proplists:get_value(priv_dir, Config), "session_ticket0"]),
+ TicketFile1 = filename:join([proplists:get_value(priv_dir, Config), "session_ticket1"]),
+ ServerTicketMode = proplists:get_value(server_ticket_mode, Config),
+
+ Data = "Hello world",
+
+ %% Configure session tickets
+ ServerOpts = [{session_tickets, ServerTicketMode}, {log_level, debug},
+ {versions, ['tlsv1.2','tlsv1.3']}|ServerOpts0],
+
+ Server0 =
+ ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
+ {from, self()},
+ {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [false]}},
+ {options, ServerOpts}]),
+
+ Version = 'tlsv1.3',
+ Port0 = ssl_test_lib:inet_port(Server0),
+
+ Exe = "openssl",
+ Args0 = ["s_client", "-connect", ssl_test_lib:hostname_format(Hostname)
+ ++ ":" ++ integer_to_list(Port0),
+ ssl_test_lib:version_flag(Version),
+ "-sess_out", TicketFile0],
+
+ OpenSslPort0 = ssl_test_lib:portable_open_port(Exe, Args0),
+
+ true = port_command(OpenSslPort0, Data),
+
+ ssl_test_lib:check_result(Server0, ok),
+
+ Server0 ! {listen, {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [true]}}},
+
+ %% Wait for session ticket
+ ct:sleep(100),
+
+ Args1 = ["s_client", "-connect", ssl_test_lib:hostname_format(Hostname)
+ ++ ":" ++ integer_to_list(Port0),
+ ssl_test_lib:version_flag(Version),
+ "-sess_in", TicketFile0,
+ "-sess_out", TicketFile1],
+
+ OpenSslPort1 = ssl_test_lib:portable_open_port(Exe, Args1),
+
+ true = port_command(OpenSslPort1, Data),
+
+ ssl_test_lib:check_result(Server0, ok),
+
+ %% Clean close down! Server needs to be closed first !!
+ ssl_test_lib:close(Server0),
+ ssl_test_lib:close_port(OpenSslPort0),
+ ssl_test_lib:close_port(OpenSslPort1).
+
+
+erlang_client_erlang_server_hrr() ->
+ [{doc,"Test session resumption with session tickets and hello_retry_request (erlang client - erlang server)"}].
+erlang_client_erlang_server_hrr(Config) when is_list(Config) ->
+ ClientOpts0 = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config),
+ ServerOpts0 = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config),
+ {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+ ServerTicketMode = proplists:get_value(server_ticket_mode, Config),
+
+ %% Configure session tickets
+ ClientOpts = [{session_tickets, auto}, {log_level, debug},
+ {versions, ['tlsv1.2','tlsv1.3']},
+ {supported_groups,[secp256r1, x25519]}|ClientOpts0],
+ ServerOpts = [{session_tickets, ServerTicketMode}, {log_level, debug},
+ {versions, ['tlsv1.2','tlsv1.3']},
+ {supported_groups, [x448, x25519]}|ServerOpts0],
+
+ Server0 =
+ ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
+ {from, self()},
+ {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [false]}},
+ {options, ServerOpts}]),
+ Port0 = ssl_test_lib:inet_port(Server0),
+
+ %% Store ticket from first connection
+ Client0 = ssl_test_lib:start_client([{node, ClientNode},
+ {port, Port0}, {host, Hostname},
+ {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [false]}},
+ {from, self()}, {options, ClientOpts}]),
+ ssl_test_lib:check_result(Server0, ok, Client0, ok),
+
+ Server0 ! {listen, {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [true]}}},
+
+ %% Wait for session ticket
+ ct:sleep(100),
+
+ ssl_test_lib:close(Client0),
+
+ %% Use ticket
+ Client1 = ssl_test_lib:start_client([{node, ClientNode},
+ {port, Port0}, {host, Hostname},
+ {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [true]}},
+ {from, self()}, {options, ClientOpts}]),
+ ssl_test_lib:check_result(Server0, ok, Client1, ok),
+
+ process_flag(trap_exit, false),
+ ssl_test_lib:close(Server0),
+ ssl_test_lib:close(Client1).
+
+
+erlang_client_openssl_server_hrr() ->
+ [{doc,"Test session resumption with session tickets and hello_retry_request (erlang client - openssl server)"}].
+erlang_client_openssl_server_hrr(Config) when is_list(Config) ->
+ process_flag(trap_exit, true),
+ ClientOpts0 = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config),
+ ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config),
+ {ClientNode, _, Hostname} = ssl_test_lib:run_where(Config),
+
+ Version = 'tlsv1.3',
+ Port = ssl_test_lib:inet_port(node()),
+ CertFile = proplists:get_value(certfile, ServerOpts),
+ CACertFile = proplists:get_value(cacertfile, ServerOpts),
+ KeyFile = proplists:get_value(keyfile, ServerOpts),
+
+ %% Configure session tickets
+ ClientOpts = [{session_tickets, auto}, {log_level, debug},
+ {versions, ['tlsv1.2','tlsv1.3']},
+ {supported_groups,[secp256r1, x25519]}|ClientOpts0],
+
+ Exe = "openssl",
+ Args = ["s_server", "-accept", integer_to_list(Port), ssl_test_lib:version_flag(Version),
+ "-cert", CertFile,
+ "-key", KeyFile,
+ "-CAfile", CACertFile,
+ "-groups", "X448:X25519",
+ "-msg", "-debug"],
+
+ OpensslPort = ssl_test_lib:portable_open_port(Exe, Args),
+
+ ssl_test_lib:wait_for_openssl_server(Port, proplists:get_value(protocol, Config)),
+
+ %% Store ticket from first connection
+ Client0 = ssl_test_lib:start_client([{node, ClientNode},
+ {port, Port}, {host, Hostname},
+ {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [false, no_reply]}},
+ {from, self()}, {options, ClientOpts}]),
+ %% Wait for session ticket
+ ct:sleep(100),
+
+ %% Close previous connection as s_server can only handle one at a time
+ ssl_test_lib:close(Client0),
+
+ %% Use ticket
+ Client1 = ssl_test_lib:start_client([{node, ClientNode},
+ {port, Port}, {host, Hostname},
+ {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [true, no_reply]}},
+ {from, self()},
+ {options, ClientOpts}]),
+ process_flag(trap_exit, false),
+
+ %% Clean close down! Server needs to be closed first !!
+ ssl_test_lib:close_port(OpensslPort),
+ ssl_test_lib:close(Client1).
+
+
+openssl_client_erlang_server_hrr() ->
+ [{doc,"Test session resumption with session tickets and hello_retry_request (openssl client - erlang server)"}].
+openssl_client_erlang_server_hrr(Config) when is_list(Config) ->
+ ServerOpts0 = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config),
+ {_, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+ TicketFile0 = filename:join([proplists:get_value(priv_dir, Config), "session_ticket0"]),
+ TicketFile1 = filename:join([proplists:get_value(priv_dir, Config), "session_ticket1"]),
+ ServerTicketMode = proplists:get_value(server_ticket_mode, Config),
+
+ Data = "Hello world",
+
+ %% Configure session tickets
+ ServerOpts = [{session_tickets, ServerTicketMode}, {log_level, debug},
+ {versions, ['tlsv1.2','tlsv1.3']},
+ {supported_groups,[x448, x25519]}|ServerOpts0],
+
+ Server0 =
+ ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
+ {from, self()},
+ {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [false]}},
+ {options, ServerOpts}]),
+
+ Version = 'tlsv1.3',
+ Port0 = ssl_test_lib:inet_port(Server0),
+
+ Exe = "openssl",
+ Args0 = ["s_client", "-connect", ssl_test_lib:hostname_format(Hostname)
+ ++ ":" ++ integer_to_list(Port0),
+ ssl_test_lib:version_flag(Version),
+ "-groups", "P-256:X25519",
+ "-sess_out", TicketFile0],
+
+ OpenSslPort0 = ssl_test_lib:portable_open_port(Exe, Args0),
+
+ true = port_command(OpenSslPort0, Data),
+
+ ssl_test_lib:check_result(Server0, ok),
+
+ Server0 ! {listen, {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [true]}}},
+
+ %% Wait for session ticket
+ ct:sleep(100),
+
+ Args1 = ["s_client", "-connect", ssl_test_lib:hostname_format(Hostname)
+ ++ ":" ++ integer_to_list(Port0),
+ ssl_test_lib:version_flag(Version),
+ "-groups", "P-256:X25519",
+ "-sess_in", TicketFile0,
+ "-sess_out", TicketFile1],
+
+ OpenSslPort1 = ssl_test_lib:portable_open_port(Exe, Args1),
+
+ true = port_command(OpenSslPort1, Data),
+
+ ssl_test_lib:check_result(Server0, ok),
+
+ %% Clean close down! Server needs to be closed first !!
+ ssl_test_lib:close(Server0),
+ ssl_test_lib:close_port(OpenSslPort0),
+ ssl_test_lib:close_port(OpenSslPort1).
+
+
+erlang_client_erlang_server_multiple_tickets() ->
+ [{doc,"Test session resumption with multiple session tickets (erlang client - erlang server)"}].
+erlang_client_erlang_server_multiple_tickets(Config) when is_list(Config) ->
+ ClientOpts0 = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config),
+ ServerOpts0 = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config),
+ {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+ ServerTicketMode = proplists:get_value(server_ticket_mode, Config),
+
+ %% Configure session tickets
+ ClientOpts = [{session_tickets, enabled}, {log_level, debug},
+ {versions, ['tlsv1.2','tlsv1.3']}|ClientOpts0],
+ ServerOpts = [{session_tickets, ServerTicketMode}, {log_level, debug},
+ {versions, ['tlsv1.2','tlsv1.3']}|ServerOpts0],
+
+ Server0 =
+ ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
+ {from, self()},
+ {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [false]}},
+ {options, ServerOpts}]),
+ Port0 = ssl_test_lib:inet_port(Server0),
+
+ %% Store ticket from first connection
+ Client0 = ssl_test_lib:start_client([{node, ClientNode},
+ {port, Port0}, {host, Hostname},
+ {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [false, wait_reply, {tickets, 3}]}},
+ {from, self()}, {options, ClientOpts}]),
+
+ Tickets0 = ssl_test_lib:check_tickets(Client0),
+
+ ct:pal("Received tickets: ~p~n", [Tickets0]),
+
+ ssl_test_lib:check_result(Server0, ok),
+
+ Server0 ! {listen, {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [true]}}},
+
+ ssl_test_lib:close(Client0),
+
+ %% Use ticket
+ Client1 = ssl_test_lib:start_client([{node, ClientNode},
+ {port, Port0}, {host, Hostname},
+ {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [true, wait_reply, no_tickets]}},
+ {from, self()},
+ {options, [{use_ticket, Tickets0}|ClientOpts]}]),
+
+ ssl_test_lib:check_result(Server0, ok, Client1, ok),
+
+ process_flag(trap_exit, false),
+ ssl_test_lib:close(Server0),
+ ssl_test_lib:close(Client1).
+
+
+erlang_client_openssl_server_hrr_multiple_tickets() ->
+ [{doc,"Test session resumption with multiple session tickets and hello_retry_request (erlang client - openssl server)"}].
+erlang_client_openssl_server_hrr_multiple_tickets(Config) when is_list(Config) ->
+ process_flag(trap_exit, true),
+ ClientOpts0 = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config),
+ ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config),
+ {ClientNode, _, Hostname} = ssl_test_lib:run_where(Config),
+
+ Version = 'tlsv1.3',
+ Port = ssl_test_lib:inet_port(node()),
+ CertFile = proplists:get_value(certfile, ServerOpts),
+ CACertFile = proplists:get_value(cacertfile, ServerOpts),
+ KeyFile = proplists:get_value(keyfile, ServerOpts),
+
+ %% Configure session tickets
+ ClientOpts = [{session_tickets, enabled}, {log_level, debug},
+ {versions, ['tlsv1.2','tlsv1.3']},
+ {supported_groups,[secp256r1, x25519]}|ClientOpts0],
+
+ Exe = "openssl",
+ Args = ["s_server", "-accept", integer_to_list(Port), ssl_test_lib:version_flag(Version),
+ "-cert", CertFile,
+ "-key", KeyFile,
+ "-CAfile", CACertFile,
+ "-groups", "X448:X25519",
+ "-msg", "-debug"],
+
+ OpensslPort = ssl_test_lib:portable_open_port(Exe, Args),
+
+ ssl_test_lib:wait_for_openssl_server(Port, proplists:get_value(protocol, Config)),
+
+ %% Store ticket from first connection
+ Client0 = ssl_test_lib:start_client([{node, ClientNode},
+ {port, Port}, {host, Hostname},
+ {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [false, no_reply, {tickets, 2}]}},
+ {from, self()}, {options, ClientOpts}]),
+
+ Tickets0 = ssl_test_lib:check_tickets(Client0),
+
+ ct:pal("Received tickets: ~p~n", [Tickets0]),
+
+ %% Close previous connection as s_server can only handle one at a time
+ ssl_test_lib:close(Client0),
+
+ %% Use tickets
+ Client1 = ssl_test_lib:start_client([{node, ClientNode},
+ {port, Port}, {host, Hostname},
+ {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [true, no_reply, no_tickets]}},
+ {from, self()},
+ {options, [{use_ticket, Tickets0}|ClientOpts]}]),
+
+ process_flag(trap_exit, false),
+
+ %% Clean close down! Server needs to be closed first !!
+ ssl_test_lib:close_port(OpensslPort),
+ ssl_test_lib:close(Client1).
+
+
+erlang_client_erlang_server_multiple_tickets_2hash() ->
+ [{doc,"Test session resumption with multiple session tickets with 2 different hash algorithms (erlang client - erlang server)"}].
+erlang_client_erlang_server_multiple_tickets_2hash(Config) when is_list(Config) ->
+ ClientOpts0 = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config),
+ ServerOpts0 = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config),
+ {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+ ServerTicketMode = proplists:get_value(server_ticket_mode, Config),
+
+ %% Configure session tickets
+ ClientOpts = [{session_tickets, enabled}, {log_level, debug},
+ {versions, ['tlsv1.2','tlsv1.3']}|ClientOpts0],
+ ServerOpts = [{session_tickets, ServerTicketMode}, {log_level, debug},
+ {versions, ['tlsv1.2','tlsv1.3']}|ServerOpts0],
+
+ Server0 =
+ ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
+ {from, self()},
+ {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [false]}},
+ {options, ServerOpts}]),
+ Port0 = ssl_test_lib:inet_port(Server0),
+
+ %% Get tickets using sha256
+ Client0 = ssl_test_lib:start_client([{node, ClientNode},
+ {port, Port0}, {host, Hostname},
+ {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [false, wait_reply, {tickets, 3}]}},
+ {from, self()},
+ {options, [{ciphers, [#{key_exchange => any,
+ cipher => aes_128_gcm,
+ mac => aead,
+ prf => sha256}]}| ClientOpts]}]),
+
+ Tickets0 = ssl_test_lib:check_tickets(Client0),
+
+ ct:pal("Received tickets: ~p~n", [Tickets0]),
+
+ ssl_test_lib:check_result(Server0, ok),
+
+ Server0 ! {listen, {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [false]}}},
+
+ ssl_test_lib:close(Client0),
+
+ %% Get tickets using sha384
+ Client1 = ssl_test_lib:start_client([{node, ClientNode},
+ {port, Port0}, {host, Hostname},
+ {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [false, wait_reply, {tickets, 3}]}},
+ {from, self()},
+ {options, [{ciphers, [#{key_exchange => any,
+ cipher => aes_256_gcm,
+ mac => aead,
+ prf => sha384}]}| ClientOpts]}]),
+
+ Tickets1 = ssl_test_lib:check_tickets(Client1),
+
+ ct:pal("Received tickets: ~p~n", [Tickets1]),
+
+ ssl_test_lib:check_result(Server0, ok),
+
+ Server0 ! {listen, {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [true]}}},
+
+ ssl_test_lib:close(Client1),
+
+ %% Use tickets for handshake (server chooses TLS_AES_256_GCM_SHA384 cipher suite)
+ Client2 = ssl_test_lib:start_client([{node, ClientNode},
+ {port, Port0}, {host, Hostname},
+ {mfa, {ssl_test_lib, %% Short handshake
+ verify_active_session_resumption,
+ [true]}},
+ {from, self()},
+ {options, [{use_ticket, Tickets0 ++ Tickets1}|ClientOpts]}]),
+ ssl_test_lib:check_result(Server0, ok, Client2, ok),
+
+ Server0 ! {listen, {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [true]}}},
+
+ ssl_test_lib:close(Client2),
+
+ %% Use tickets for handshake (client chooses TLS_CHACHA20_POLY1305_SHA256 cipher suite)
+ Client3 = ssl_test_lib:start_client([{node, ClientNode},
+ {port, Port0}, {host, Hostname},
+ {mfa, {ssl_test_lib, %% Short handshake
+ verify_active_session_resumption,
+ [true]}},
+ {from, self()},
+ {options, [{ciphers, [#{key_exchange => any,
+ cipher => chacha20_poly1305,
+ mac => aead,
+ prf => sha256}]},
+ {use_ticket, Tickets0 ++ Tickets1}|ClientOpts]}]),
+ ssl_test_lib:check_result(Server0, ok, Client3, ok),
+
+ Server0 ! {listen, {mfa, {ssl_test_lib,
+ verify_active_session_resumption,
+ [false]}}},
+
+ ssl_test_lib:close(Client3),
+
+ %% Use tickets (created using sha384) for handshake (client chooses
+ %% TLS_CHACHA20_POLY1305_SHA256 cipher suite).
+ %% Session resumption should fail as chosen cipher suite uses different hash algorithms
+ %% than those supplied by the selected tickets.
+ Client4 = ssl_test_lib:start_client([{node, ClientNode},
+ {port, Port0}, {host, Hostname},
+ {mfa, {ssl_test_lib, %% Short handshake
+ verify_active_session_resumption,
+ [false]}},
+ {from, self()},
+ {options, [{ciphers, [#{key_exchange => any,
+ cipher => chacha20_poly1305,
+ mac => aead,
+ prf => sha256}]},
+ {use_ticket, Tickets1}|ClientOpts]}]),
+ ssl_test_lib:check_result(Server0, ok, Client4, ok),
+
+ ssl_test_lib:close(Client4),
+
+ process_flag(trap_exit, false),
+ ssl_test_lib:close(Server0).
+
+
+%%--------------------------------------------------------------------
+%% Internal functions ------------------------------------------------
+%%--------------------------------------------------------------------
diff --git a/lib/ssl/test/ssl_test_lib.erl b/lib/ssl/test/ssl_test_lib.erl
index cb528f185a..6218857e05 100644
--- a/lib/ssl/test/ssl_test_lib.erl
+++ b/lib/ssl/test/ssl_test_lib.erl
@@ -120,9 +120,7 @@ do_run_server(ListenSocket, AcceptSocket, Opts) ->
ct:log("~p:~p~nServer closing ~p ~n", [?MODULE,?LINE, self()]),
Result = Transport:close(AcceptSocket),
Result1 = Transport:close(ListenSocket),
- ct:log("~p:~p~nResult ~p : ~p ~n", [?MODULE,?LINE, Result, Result1]);
- {ssl_closed, _} ->
- ok
+ ct:log("~p:~p~nResult ~p : ~p ~n", [?MODULE,?LINE, Result, Result1])
end.
%%% To enable to test with s_client -reconnect
@@ -537,13 +535,17 @@ check_server_alert(Pid, Alert) ->
check_server_txt(STxt),
ok;
{Pid, {error, closed}} ->
- ok
+ ok;
+ {Pid, {ok, _}} ->
+ ct:fail("Successful connection during negative test.")
end.
check_server_alert(Server, Client, Alert) ->
receive
{Server, {error, {tls_alert, {Alert, STxt}}}} ->
check_server_txt(STxt),
- check_client_alert(Client, Alert)
+ check_client_alert(Client, Alert);
+ {Server, {ok, _}} ->
+ ct:fail("Successful connection during negative test.")
end.
check_client_alert(Pid, Alert) ->
receive
@@ -554,7 +556,9 @@ check_client_alert(Pid, Alert) ->
check_client_txt(CTxt),
ok;
{Pid, {error, closed}} ->
- ok
+ ok;
+ {Pid, {ok, _}} ->
+ ct:fail("Successful connection during negative test.")
end.
check_client_alert(Server, Client, Alert) ->
receive
@@ -565,7 +569,9 @@ check_client_alert(Server, Client, Alert) ->
check_client_txt(CTxt),
ok;
{Client, {error, closed}} ->
- ok
+ ok;
+ {Client, {ok, _}} ->
+ ct:fail("Successful connection during negative test.")
end.
check_server_txt("TLS server" ++ _) ->
ok;
@@ -1832,6 +1838,7 @@ state([{data,[{"StateData", State}]} | _]) -> %% gen_fsm
state([_ | Rest]) ->
state(Rest).
+%% TODO: DTLS considered tls version in this use maybe rename
is_tls_version('dtlsv1.2') ->
true;
is_tls_version('dtlsv1') ->
@@ -1849,6 +1856,13 @@ is_tls_version('sslv3') ->
is_tls_version(_) ->
false.
+is_dtls_version('dtlsv1.2') ->
+ true;
+is_dtls_version('dtlsv1') ->
+ true;
+is_dtls_version(_) ->
+ false.
+
init_tls_version(Version, Config)
when Version == 'dtlsv1.2'; Version == 'dtlsv1' ->
ssl:stop(),
@@ -1936,6 +1950,69 @@ send_recv_result_active_once(Socket) ->
ssl:send(Socket, Data),
active_once_recv_list(Socket, length(Data)).
+verify_active_session_resumption(Socket, SessionResumption) ->
+ verify_active_session_resumption(Socket, SessionResumption, wait_reply, no_tickets).
+%%
+verify_active_session_resumption(Socket, SessionResumption, WaitReply) ->
+ verify_active_session_resumption(Socket, SessionResumption, WaitReply, no_tickets).
+%%
+verify_active_session_resumption(Socket, SessionResumption, WaitForReply, TicketOption) ->
+ case ssl:connection_information(Socket, [session_resumption]) of
+ {ok, [{session_resumption, SessionResumption}]} ->
+ Msg = boolean_to_log_msg(SessionResumption),
+ ct:log("~p:~p~nSession resumption verified! (expected ~p, got ~p)!",
+ [?MODULE, ?LINE, Msg, Msg]);
+ {ok, [{session_resumption, Got0}]} ->
+ Expected = boolean_to_log_msg(SessionResumption),
+ Got = boolean_to_log_msg(Got0),
+ ct:fail("~p:~p~nFailed to verify session resumption! (expected ~p, got ~p)",
+ [?MODULE, ?LINE, Expected, Got])
+ end,
+
+ Data = "Hello world",
+ ssl:send(Socket, Data),
+ case WaitForReply of
+ wait_reply ->
+ Data = active_recv(Socket, length(Data));
+ no_reply ->
+ ok;
+ Else1 ->
+ ct:fail("~p:~p~nFaulty parameter: ~p", [?MODULE, ?LINE, Else1])
+ end,
+ case TicketOption of
+ {tickets, N} ->
+ receive_tickets(N);
+ no_tickets ->
+ ok;
+ Else2 ->
+ ct:fail("~p:~p~nFaulty parameter: ~p", [?MODULE, ?LINE, Else2])
+ end.
+
+boolean_to_log_msg(true) ->
+ "OK";
+boolean_to_log_msg(false) ->
+ "FAIL".
+
+receive_tickets(N) ->
+ receive_tickets(N, []).
+%%
+receive_tickets(0, Acc) ->
+ Acc;
+receive_tickets(N, Acc) ->
+ receive
+ {ssl, session_ticket, {_, Ticket}} ->
+ receive_tickets(N - 1, [Ticket|Acc])
+ end.
+
+check_tickets(Client) ->
+ receive
+ {Client, Tickets} ->
+ Tickets
+ after
+ 5000 ->
+ ct:fail("~p:~p~nNo tickets received!", [?MODULE, ?LINE])
+ end.
+
active_recv(Socket, N) ->
active_recv(Socket, N, []).
@@ -2219,7 +2296,7 @@ openssl_allows_client_renegotaite(Config) ->
case os:cmd("openssl version") of
"OpenSSL 1.1" ++ _ ->
{skip, "OpenSSL does not allow client renegotiation"};
- "LibreSSL 2" ++ _ ->
+ "LibreSSL" ++ _ ->
{skip, "LibreSSL does not allow client renegotiation"};
_ ->
Config
@@ -2795,6 +2872,18 @@ openssl_sane_dtls_alpn() ->
case os:cmd("openssl version") of
"OpenSSL 1.1.0g" ++ _ ->
false;
+ "OpenSSL 1.1.1 " ++ _ ->
+ false;
+ "OpenSSL 1.1.1a" ++ _ ->
+ false;
+ _->
+ openssl_sane_dtls()
+ end.
+
+openssl_sane_dtls_session_reuse() ->
+ case os:cmd("openssl version") of
+ "OpenSSL 1.1.1 " ++ _ ->
+ false;
"OpenSSL 1.1.1a" ++ _ ->
false;
_->
diff --git a/lib/ssl/test/tls_1_3_record_SUITE.erl b/lib/ssl/test/tls_1_3_record_SUITE.erl
index 5df8853b1b..26d7694e16 100644
--- a/lib/ssl/test/tls_1_3_record_SUITE.erl
+++ b/lib/ssl/test/tls_1_3_record_SUITE.erl
@@ -26,13 +26,15 @@
-include_lib("common_test/include/ct.hrl").
-include_lib("ssl/src/tls_record.hrl").
-include_lib("ssl/src/tls_handshake.hrl").
+-include_lib("ssl/src/tls_handshake_1_3.hrl").
-include_lib("ssl/src/ssl_cipher.hrl").
-include_lib("ssl/src/ssl_internal.hrl").
all() ->
[encode_decode,
finished_verify_data,
- '1_RTT_handshake'].
+ '1_RTT_handshake',
+ '0_RTT_handshake'].
init_per_suite(Config) ->
catch crypto:stop(),
@@ -79,7 +81,7 @@ encode_decode(_Config) ->
<<128,229,186,211,62,127,182,20,62,166,233,23,135,64,121,
3,104,251,214,161,253,31,3,2,232,37,8,221,189,72,64,218,
121,41,112,148,254,34,68,164,228,60,161,201,132,55,56,
- 157>>},
+ 157>>}, undefined,
undefined,
<<92,24,205,75,244,60,136,212,250,32,214,20,37,3,213,87,61,207,
147,61,168,145,177,118,160,153,33,53,48,108,191,174>>,
@@ -105,7 +107,7 @@ encode_decode(_Config) ->
<<128,229,186,211,62,127,182,20,62,166,233,23,135,64,121,
3,104,251,214,161,253,31,3,2,232,37,8,221,189,72,64,218,
121,41,112,148,254,34,68,164,228,60,161,201,132,55,56,
- 157>>},
+ 157>>}, undefined,
undefined,
<<92,24,205,75,244,60,136,212,250,32,214,20,37,3,213,87,61,207,
147,61,168,145,177,118,160,153,33,53,48,108,191,174>>,
@@ -735,6 +737,22 @@ encode_decode(_Config) ->
SAPTrafficSecret =
tls_v1:server_application_traffic_secret_0(HKDFAlgo, {master_secret, MasterSecret}, CHSF),
+ %% Resumption master secret from '0-RTT'
+ %%
+ %% {server} generate resumption secret "tls13 resumption":
+ %%
+ %% PRK (32 octets): 7d f2 35 f2 03 1d 2a 05 12 87 d0 2b 02 41 b0 bf
+ %% da f8 6c c8 56 23 1f 2d 5a ba 46 c4 34 ec 19 6c
+ %%
+ RMS = hexstr2bin("7d f2 35 f2 03 1d 2a 05 12 87 d0 2b 02 41 b0 bf
+ da f8 6c c8 56 23 1f 2d 5a ba 46 c4 34 ec 19 6c"),
+
+ %% Verify calculation of resumption master secret that is used to create
+ %% the pre shared key in '0-RTT'.
+ Temp = tls_v1:resumption_master_secret(HKDFAlgo, {master_secret, MasterSecret}, CHSF),
+ erlang:display({rms, RMS}),
+ erlang:display({new_rms, Temp}),
+
%% {server} derive secret "tls13 exp master":
%%
%% PRK (32 octets): 18 df 06 84 3d 13 a0 8b f2 a4 49 84 4c 5f 8a 47
@@ -783,7 +801,7 @@ encode_decode(_Config) ->
%% PRK = SAPTrafficsecret
%% key info = WriteKeyInfo
- %% iv info = WrtieIVInfo
+ %% iv info = WriteIVInfo
SWKey =
hexstr2bin("9f 02 28 3b 6c 9c 07 ef c2 6b b9 f2 ac 92 e3 56"),
@@ -815,7 +833,449 @@ encode_decode(_Config) ->
SRIV =
hexstr2bin("5b d3 c7 1b 83 6e 0b 76 bb 73 26 5f"),
- {SRKey, SRIV} = tls_v1:calculate_traffic_keys(HKDFAlgo, Cipher, CHSTrafficSecret).
+ {SRKey, SRIV} = tls_v1:calculate_traffic_keys(HKDFAlgo, Cipher, CHSTrafficSecret),
+
+ %% {client} calculate finished "tls13 finished":
+ %%
+ %% PRK (32 octets): b3 ed db 12 6e 06 7f 35 a7 80 b3 ab f4 5e 2d 8f
+ %% 3b 1a 95 07 38 f5 2e 96 00 74 6a 0e 27 a5 5a 21
+ %%
+ %% hash (0 octets): (empty)
+ %%
+ %% info (18 octets): 00 20 0e 74 6c 73 31 33 20 66 69 6e 69 73 68 65
+ %% 64 00
+ %%
+ %% expanded (32 octets): b8 0a d0 10 15 fb 2f 0b d6 5f f7 d4 da 5d
+ %% 6b f8 3f 84 82 1d 1f 87 fd c7 d3 c7 5b 5a 7b 42 d9 c4
+ %%
+ %% finished (32 octets): a8 ec 43 6d 67 76 34 ae 52 5a c1 fc eb e1
+ %% 1a 03 9e c1 76 94 fa c6 e9 85 27 b6 42 f2 ed d5 ce 61
+
+ %% PRK = CHSTrafficsecret
+ %% info = FInfo
+ CFExpanded =
+ hexstr2bin("b8 0a d0 10 15 fb 2f 0b d6 5f f7 d4 da 5d
+ 6b f8 3f 84 82 1d 1f 87 fd c7 d3 c7 5b 5a 7b 42 d9 c4"),
+
+ CFinishedVerifyData =
+ hexstr2bin("a8 ec 43 6d 67 76 34 ae 52 5a c1 fc eb e1
+ 1a 03 9e c1 76 94 fa c6 e9 85 27 b6 42 f2 ed d5 ce 61"),
+
+ MessageHistory1 = [FinishedHSBin,
+ CertificateVerify,
+ Certificate,
+ EncryptedExtensions,
+ ServerHello,
+ ClientHello],
+
+ CFExpanded = tls_v1:finished_key(CHSTrafficSecret, HKDFAlgo),
+ CFinishedVerifyData = tls_v1:finished_verify_data(CFExpanded, HKDFAlgo, MessageHistory1),
+
+ %% {client} construct a Finished handshake message:
+ %%
+ %% Finished (36 octets): 14 00 00 20 a8 ec 43 6d 67 76 34 ae 52 5a
+ %% c1 fc eb e1 1a 03 9e c1 76 94 fa c6 e9 85 27 b6 42 f2 ed d5 ce
+ %% 61
+ CFinishedBin =
+ hexstr2bin("14 00 00 20 a8 ec 43 6d 67 76 34 ae 52 5a
+ c1 fc eb e1 1a 03 9e c1 76 94 fa c6 e9 85 27 b6 42 f2 ed d5 ce
+ 61"),
+
+ CFinished = #finished{verify_data = CFinishedVerifyData},
+
+ CFinishedIOList = tls_handshake:encode_handshake(CFinished, {3,4}),
+ CFinishedBin = iolist_to_binary(CFinishedIOList),
+
+ %% {client} derive write traffic keys for application data:
+ %%
+ %% PRK (32 octets): 9e 40 64 6c e7 9a 7f 9d c0 5a f8 88 9b ce 65 52
+ %% 87 5a fa 0b 06 df 00 87 f7 92 eb b7 c1 75 04 a5
+ %%
+ %% key info (13 octets): 00 10 09 74 6c 73 31 33 20 6b 65 79 00
+ %%
+ %% key expanded (16 octets): 17 42 2d da 59 6e d5 d9 ac d8 90 e3 c6
+ %% 3f 50 51
+ %%
+ %% iv info (12 octets): 00 0c 08 74 6c 73 31 33 20 69 76 00
+ %%
+ %% iv expanded (12 octets): 5b 78 92 3d ee 08 57 90 33 e5 23 d9
+
+ %% PRK = CAPTrafficsecret
+ %% key info = WriteKeyInfo
+ %% iv info = WriteIVInfo
+
+ CWKey =
+ hexstr2bin("17 42 2d da 59 6e d5 d9 ac d8 90 e3 c6 3f 50 51"),
+
+ CWIV =
+ hexstr2bin("5b 78 92 3d ee 08 57 90 33 e5 23 d9"),
+
+ {CWKey, CWIV} = tls_v1:calculate_traffic_keys(HKDFAlgo, Cipher, CAPTrafficSecret),
+
+ %% {client} derive secret "tls13 res master":
+ %%
+ %% PRK (32 octets): 18 df 06 84 3d 13 a0 8b f2 a4 49 84 4c 5f 8a 47
+ %% 80 01 bc 4d 4c 62 79 84 d5 a4 1d a8 d0 40 29 19
+ %%
+ %% hash (32 octets): 20 91 45 a9 6e e8 e2 a1 22 ff 81 00 47 cc 95 26
+ %% 84 65 8d 60 49 e8 64 29 42 6d b8 7c 54 ad 14 3d
+ %%
+ %% info (52 octets): 00 20 10 74 6c 73 31 33 20 72 65 73 20 6d 61 73
+ %% 74 65 72 20 20 91 45 a9 6e e8 e2 a1 22 ff 81 00 47 cc 95 26 84
+ %% 65 8d 60 49 e8 64 29 42 6d b8 7c 54 ad 14 3d
+ %%
+ %% expanded (32 octets): 7d f2 35 f2 03 1d 2a 05 12 87 d0 2b 02 41
+ %% b0 bf da f8 6c c8 56 23 1f 2d 5a ba 46 c4 34 ec 19 6c
+
+ %% PRK = MasterSecret
+
+ CRMHash = hexstr2bin("20 91 45 a9 6e e8 e2 a1 22 ff 81 00 47 cc 95 26
+ 84 65 8d 60 49 e8 64 29 42 6d b8 7c 54 ad 14 3d"),
+
+ CRMInfo = hexstr2bin(" 00 20 10 74 6c 73 31 33 20 72 65 73 20 6d 61 73
+ 74 65 72 20 20 91 45 a9 6e e8 e2 a1 22 ff 81 00 47 cc 95 26 84
+ 65 8d 60 49 e8 64 29 42 6d b8 7c 54 ad 14 3d"),
+
+ ResumptionMasterSecret = hexstr2bin("7d f2 35 f2 03 1d 2a 05 12 87 d0 2b 02 41
+ b0 bf da f8 6c c8 56 23 1f 2d 5a ba 46 c4 34 ec 19 6c"),
+
+ CHCF = <<ClientHello/binary,
+ ServerHello/binary,
+ EncryptedExtensions/binary,
+ Certificate/binary,
+ CertificateVerify/binary,
+ FinishedHSBin/binary,
+ CFinishedBin/binary>>,
+
+ MessageHistory3 = [ClientHello,
+ ServerHello,
+ EncryptedExtensions,
+ Certificate,
+ CertificateVerify,
+ FinishedHSBin,
+ CFinishedBin
+ ],
+
+ CRMHash = crypto:hash(HKDFAlgo, CHCF),
+
+ CRMInfo =
+ tls_v1:create_info(<<"res master">>, CRMHash, ssl_cipher:hash_size(HKDFAlgo)),
+
+ ResumptionMasterSecret =
+ tls_v1:resumption_master_secret(HKDFAlgo, {master_secret, MasterSecret}, MessageHistory3),
+ ok.
+
+%%--------------------------------------------------------------------
+'0_RTT_handshake'() ->
+ [{doc,"Test TLS 1.3 0-RTT Handshake"}].
+
+'0_RTT_handshake'(_Config) ->
+ HKDFAlgo = sha256,
+
+ %% {server} generate resumption secret "tls13 resumption":
+ %%
+ %% PRK (32 octets): 7d f2 35 f2 03 1d 2a 05 12 87 d0 2b 02 41 b0 bf
+ %% da f8 6c c8 56 23 1f 2d 5a ba 46 c4 34 ec 19 6c
+ %%
+ %% hash (2 octets): 00 00
+ %%
+ %% info (22 octets): 00 20 10 74 6c 73 31 33 20 72 65 73 75 6d 70 74
+ %% 69 6f 6e 02 00 00
+ %%
+ %% expanded (32 octets): 4e cd 0e b6 ec 3b 4d 87 f5 d6 02 8f 92 2c
+ %% a4 c5 85 1a 27 7f d4 13 11 c9 e6 2d 2c 94 92 e1 c4 f3
+ %%
+ %% {server} construct a NewSessionTicket handshake message:
+ %%
+ %% NewSessionTicket (205 octets): 04 00 00 c9 00 00 00 1e fa d6 aa
+ %% c5 02 00 00 00 b2 2c 03 5d 82 93 59 ee 5f f7 af 4e c9 00 00 00
+ %% 00 26 2a 64 94 dc 48 6d 2c 8a 34 cb 33 fa 90 bf 1b 00 70 ad 3c
+ %% 49 88 83 c9 36 7c 09 a2 be 78 5a bc 55 cd 22 60 97 a3 a9 82 11
+ %% 72 83 f8 2a 03 a1 43 ef d3 ff 5d d3 6d 64 e8 61 be 7f d6 1d 28
+ %% 27 db 27 9c ce 14 50 77 d4 54 a3 66 4d 4e 6d a4 d2 9e e0 37 25
+ %% a6 a4 da fc d0 fc 67 d2 ae a7 05 29 51 3e 3d a2 67 7f a5 90 6c
+ %% 5b 3f 7d 8f 92 f2 28 bd a4 0d da 72 14 70 f9 fb f2 97 b5 ae a6
+ %% 17 64 6f ac 5c 03 27 2e 97 07 27 c6 21 a7 91 41 ef 5f 7d e6 50
+ %% 5e 5b fb c3 88 e9 33 43 69 40 93 93 4a e4 d3 57 00 08 00 2a 00
+ %% 04 00 00 04 00
+ ResPRK =
+ hexstr2bin("7d f2 35 f2 03 1d 2a 05 12 87 d0 2b 02 41 b0 bf
+ da f8 6c c8 56 23 1f 2d 5a ba 46 c4 34 ec 19 6c"),
+
+ _ResHash = hexstr2bin("00 00"),
+
+ _ResInfo = hexstr2bin("00 20 10 74 6c 73 31 33 20 72 65 73 75 6d 70 74
+ 69 6f 6e 02 00 00"),
+
+ ResExpanded =
+ hexstr2bin("4e cd 0e b6 ec 3b 4d 87 f5 d6 02 8f 92 2c
+ a4 c5 85 1a 27 7f d4 13 11 c9 e6 2d 2c 94 92 e1 c4 f3"),
+
+ NewSessionTicket =
+ hexstr2bin("04 00 00 c9 00 00 00 1e fa d6 aa
+ c5 02 00 00 00 b2 2c 03 5d 82 93 59 ee 5f f7 af 4e c9 00 00 00
+ 00 26 2a 64 94 dc 48 6d 2c 8a 34 cb 33 fa 90 bf 1b 00 70 ad 3c
+ 49 88 83 c9 36 7c 09 a2 be 78 5a bc 55 cd 22 60 97 a3 a9 82 11
+ 72 83 f8 2a 03 a1 43 ef d3 ff 5d d3 6d 64 e8 61 be 7f d6 1d 28
+ 27 db 27 9c ce 14 50 77 d4 54 a3 66 4d 4e 6d a4 d2 9e e0 37 25
+ a6 a4 da fc d0 fc 67 d2 ae a7 05 29 51 3e 3d a2 67 7f a5 90 6c
+ 5b 3f 7d 8f 92 f2 28 bd a4 0d da 72 14 70 f9 fb f2 97 b5 ae a6
+ 17 64 6f ac 5c 03 27 2e 97 07 27 c6 21 a7 91 41 ef 5f 7d e6 50
+ 5e 5b fb c3 88 e9 33 43 69 40 93 93 4a e4 d3 57 00 08 00 2a 00
+ 04 00 00 04 00"),
+ <<?BYTE(NWT), ?UINT24(_), TicketBody/binary>> = NewSessionTicket,
+ #new_session_ticket{
+ ticket_lifetime = _LifeTime,
+ ticket_age_add = _AgeAdd,
+ ticket_nonce = Nonce,
+ ticket = Ticket,
+ extensions = _Extensions
+ } = tls_handshake:decode_handshake({3,4}, NWT, TicketBody),
+
+ %% ResPRK = resumption master secret
+ ResExpanded = tls_v1:pre_shared_key(ResPRK, Nonce, HKDFAlgo),
+
+ %% {client} create an ephemeral x25519 key pair:
+ %%
+ %% private key (32 octets): bf f9 11 88 28 38 46 dd 6a 21 34 ef 71
+ %% 80 ca 2b 0b 14 fb 10 dc e7 07 b5 09 8c 0d dd c8 13 b2 df
+ %%
+ %% public key (32 octets): e4 ff b6 8a c0 5f 8d 96 c9 9d a2 66 98 34
+ %% 6c 6b e1 64 82 ba dd da fe 05 1a 66 b4 f1 8d 66 8f 0b
+ %%
+ %% {client} extract secret "early":
+ %%
+ %% salt: 0 (all zero octets)
+ %%
+ %% IKM (32 octets): 4e cd 0e b6 ec 3b 4d 87 f5 d6 02 8f 92 2c a4 c5
+ %% 85 1a 27 7f d4 13 11 c9 e6 2d 2c 94 92 e1 c4 f3
+ %%
+ %% secret (32 octets): 9b 21 88 e9 b2 fc 6d 64 d7 1d c3 29 90 0e 20
+ %% bb 41 91 50 00 f6 78 aa 83 9c bb 79 7c b7 d8 33 2c
+ %%
+
+ PSK = hexstr2bin("4e cd 0e b6 ec 3b 4d 87 f5 d6 02 8f 92 2c a4 c5
+ 85 1a 27 7f d4 13 11 c9 e6 2d 2c 94 92 e1 c4 f3"),
+ PSK = ResExpanded,
+ EarlySecret = hexstr2bin("9b 21 88 e9 b2 fc 6d 64 d7 1d c3 29 90 0e 20
+ bb 41 91 50 00 f6 78 aa 83 9c bb 79 7c b7 d8 33 2c"),
+
+ {early_secret, EarlySecret} = tls_v1:key_schedule(early_secret, HKDFAlgo, {psk, PSK}),
+
+ %% {client} construct a ClientHello handshake message:
+ %%
+ %% ClientHello (477 octets): 01 00 01 fc 03 03 1b c3 ce b6 bb e3 9c
+ %% ff 93 83 55 b5 a5 0a db 6d b2 1b 7a 6a f6 49 d7 b4 bc 41 9d 78
+ %% 76 48 7d 95 00 00 06 13 01 13 03 13 02 01 00 01 cd 00 00 00 0b
+ %% 00 09 00 00 06 73 65 72 76 65 72 ff 01 00 01 00 00 0a 00 14 00
+ %% 12 00 1d 00 17 00 18 00 19 01 00 01 01 01 02 01 03 01 04 00 33
+ %% 00 26 00 24 00 1d 00 20 e4 ff b6 8a c0 5f 8d 96 c9 9d a2 66 98
+ %% 34 6c 6b e1 64 82 ba dd da fe 05 1a 66 b4 f1 8d 66 8f 0b 00 2a
+ %% 00 00 00 2b 00 03 02 03 04 00 0d 00 20 00 1e 04 03 05 03 06 03
+ %% 02 03 08 04 08 05 08 06 04 01 05 01 06 01 02 01 04 02 05 02 06
+ %% 02 02 02 00 2d 00 02 01 01 00 1c 00 02 40 01 00 15 00 57 00 00
+ %% 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ %% 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ %% 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ %% 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ %% 00 00 29 00 dd 00 b8 00 b2 2c 03 5d 82 93 59 ee 5f f7 af 4e c9
+ %% 00 00 00 00 26 2a 64 94 dc 48 6d 2c 8a 34 cb 33 fa 90 bf 1b 00
+ %% 70 ad 3c 49 88 83 c9 36 7c 09 a2 be 78 5a bc 55 cd 22 60 97 a3
+ %% a9 82 11 72 83 f8 2a 03 a1 43 ef d3 ff 5d d3 6d 64 e8 61 be 7f
+ %% d6 1d 28 27 db 27 9c ce 14 50 77 d4 54 a3 66 4d 4e 6d a4 d2 9e
+ %% e0 37 25 a6 a4 da fc d0 fc 67 d2 ae a7 05 29 51 3e 3d a2 67 7f
+ %% a5 90 6c 5b 3f 7d 8f 92 f2 28 bd a4 0d da 72 14 70 f9 fb f2 97
+ %% b5 ae a6 17 64 6f ac 5c 03 27 2e 97 07 27 c6 21 a7 91 41 ef 5f
+ %% 7d e6 50 5e 5b fb c3 88 e9 33 43 69 40 93 93 4a e4 d3 57 fa d6
+ %% aa cb
+ %%
+ ClientHello =
+ hexstr2bin("01 00 01 fc 03 03 1b c3 ce b6 bb e3 9c
+ ff 93 83 55 b5 a5 0a db 6d b2 1b 7a 6a f6 49 d7 b4 bc 41 9d 78
+ 76 48 7d 95 00 00 06 13 01 13 03 13 02 01 00 01 cd 00 00 00 0b
+ 00 09 00 00 06 73 65 72 76 65 72 ff 01 00 01 00 00 0a 00 14 00
+ 12 00 1d 00 17 00 18 00 19 01 00 01 01 01 02 01 03 01 04 00 33
+ 00 26 00 24 00 1d 00 20 e4 ff b6 8a c0 5f 8d 96 c9 9d a2 66 98
+ 34 6c 6b e1 64 82 ba dd da fe 05 1a 66 b4 f1 8d 66 8f 0b 00 2a
+ 00 00 00 2b 00 03 02 03 04 00 0d 00 20 00 1e 04 03 05 03 06 03
+ 02 03 08 04 08 05 08 06 04 01 05 01 06 01 02 01 04 02 05 02 06
+ 02 02 02 00 2d 00 02 01 01 00 1c 00 02 40 01 00 15 00 57 00 00
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ 00 00 29 00 dd 00 b8 00 b2 2c 03 5d 82 93 59 ee 5f f7 af 4e c9
+ 00 00 00 00 26 2a 64 94 dc 48 6d 2c 8a 34 cb 33 fa 90 bf 1b 00
+ 70 ad 3c 49 88 83 c9 36 7c 09 a2 be 78 5a bc 55 cd 22 60 97 a3
+ a9 82 11 72 83 f8 2a 03 a1 43 ef d3 ff 5d d3 6d 64 e8 61 be 7f
+ d6 1d 28 27 db 27 9c ce 14 50 77 d4 54 a3 66 4d 4e 6d a4 d2 9e
+ e0 37 25 a6 a4 da fc d0 fc 67 d2 ae a7 05 29 51 3e 3d a2 67 7f
+ a5 90 6c 5b 3f 7d 8f 92 f2 28 bd a4 0d da 72 14 70 f9 fb f2 97
+ b5 ae a6 17 64 6f ac 5c 03 27 2e 97 07 27 c6 21 a7 91 41 ef 5f
+ 7d e6 50 5e 5b fb c3 88 e9 33 43 69 40 93 93 4a e4 d3 57 fa d6
+ aa cb"),
+
+ %% {client} calculate PSK binder:
+ %%
+ %% ClientHello prefix (477 octets): 01 00 01 fc 03 03 1b c3 ce b6 bb
+ %% e3 9c ff 93 83 55 b5 a5 0a db 6d b2 1b 7a 6a f6 49 d7 b4 bc 41
+ %% 9d 78 76 48 7d 95 00 00 06 13 01 13 03 13 02 01 00 01 cd 00 00
+ %% 00 0b 00 09 00 00 06 73 65 72 76 65 72 ff 01 00 01 00 00 0a 00
+ %% 14 00 12 00 1d 00 17 00 18 00 19 01 00 01 01 01 02 01 03 01 04
+ %% 00 33 00 26 00 24 00 1d 00 20 e4 ff b6 8a c0 5f 8d 96 c9 9d a2
+ %% 66 98 34 6c 6b e1 64 82 ba dd da fe 05 1a 66 b4 f1 8d 66 8f 0b
+ %% 00 2a 00 00 00 2b 00 03 02 03 04 00 0d 00 20 00 1e 04 03 05 03
+ %% 06 03 02 03 08 04 08 05 08 06 04 01 05 01 06 01 02 01 04 02 05
+ %% 02 06 02 02 02 00 2d 00 02 01 01 00 1c 00 02 40 01 00 15 00 57
+ %% 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ %% 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ %% 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ %% 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ %% 00 00 00 00 29 00 dd 00 b8 00 b2 2c 03 5d 82 93 59 ee 5f f7 af
+ %% 4e c9 00 00 00 00 26 2a 64 94 dc 48 6d 2c 8a 34 cb 33 fa 90 bf
+ %% 1b 00 70 ad 3c 49 88 83 c9 36 7c 09 a2 be 78 5a bc 55 cd 22 60
+ %% 97 a3 a9 82 11 72 83 f8 2a 03 a1 43 ef d3 ff 5d d3 6d 64 e8 61
+ %% be 7f d6 1d 28 27 db 27 9c ce 14 50 77 d4 54 a3 66 4d 4e 6d a4
+ %% d2 9e e0 37 25 a6 a4 da fc d0 fc 67 d2 ae a7 05 29 51 3e 3d a2
+ %% 67 7f a5 90 6c 5b 3f 7d 8f 92 f2 28 bd a4 0d da 72 14 70 f9 fb
+ %% f2 97 b5 ae a6 17 64 6f ac 5c 03 27 2e 97 07 27 c6 21 a7 91 41
+ %% ef 5f 7d e6 50 5e 5b fb c3 88 e9 33 43 69 40 93 93 4a e4 d3 57
+ %% fa d6 aa cb
+ %%
+ %% binder hash (32 octets): 63 22 4b 2e 45 73 f2 d3 45 4c a8 4b 9d
+ %% 00 9a 04 f6 be 9e 05 71 1a 83 96 47 3a ef a0 1e 92 4a 14
+ %%
+ %% PRK (32 octets): 69 fe 13 1a 3b ba d5 d6 3c 64 ee bc c3 0e 39 5b
+ %% 9d 81 07 72 6a 13 d0 74 e3 89 db c8 a4 e4 72 56
+ %%
+ %% hash (0 octets): (empty)
+ %%
+ %% info (18 octets): 00 20 0e 74 6c 73 31 33 20 66 69 6e 69 73 68 65
+ %% 64 00
+ %%
+ %% expanded (32 octets): 55 88 67 3e 72 cb 59 c8 7d 22 0c af fe 94
+ %% f2 de a9 a3 b1 60 9f 7d 50 e9 0a 48 22 7d b9 ed 7e aa
+ %%
+ %% finished (32 octets): 3a dd 4f b2 d8 fd f8 22 a0 ca 3c f7 67 8e
+ %% f5 e8 8d ae 99 01 41 c5 92 4d 57 bb 6f a3 1b 9e 5f 9d
+ BinderHash =
+ hexstr2bin("63 22 4b 2e 45 73 f2 d3 45 4c a8 4b 9d
+ 00 9a 04 f6 be 9e 05 71 1a 83 96 47 3a ef a0 1e 92 4a 14"),
+
+ %% Part of derive_secret/4
+ BinderHash = crypto:hash(HKDFAlgo, [ClientHello]),
+
+ PRK = hexstr2bin("69 fe 13 1a 3b ba d5 d6 3c 64 ee bc c3 0e 39 5b
+ 9d 81 07 72 6a 13 d0 74 e3 89 db c8 a4 e4 72 56"),
+
+ PRK = tls_v1:resumption_binder_key(HKDFAlgo, {early_secret, EarlySecret}),
+
+ Expanded =
+ hexstr2bin("55 88 67 3e 72 cb 59 c8 7d 22 0c af fe 94
+ f2 de a9 a3 b1 60 9f 7d 50 e9 0a 48 22 7d b9 ed 7e aa"),
+
+ Expanded = tls_v1:finished_key(PRK, HKDFAlgo),
+
+ Finished = hexstr2bin("3a dd 4f b2 d8 fd f8 22 a0 ca 3c f7 67 8e
+ f5 e8 8d ae 99 01 41 c5 92 4d 57 bb 6f a3 1b 9e 5f 9d"),
+
+ Finished = tls_v1:finished_verify_data(Expanded, HKDFAlgo, [ClientHello]),
+
+ %% {client} send handshake record:
+ %%
+ %% payload (512 octets): 01 00 01 fc 03 03 1b c3 ce b6 bb e3 9c ff
+ %% 93 83 55 b5 a5 0a db 6d b2 1b 7a 6a f6 49 d7 b4 bc 41 9d 78 76
+ %% 48 7d 95 00 00 06 13 01 13 03 13 02 01 00 01 cd 00 00 00 0b 00
+ %% 09 00 00 06 73 65 72 76 65 72 ff 01 00 01 00 00 0a 00 14 00 12
+ %% 00 1d 00 17 00 18 00 19 01 00 01 01 01 02 01 03 01 04 00 33 00
+ %% 26 00 24 00 1d 00 20 e4 ff b6 8a c0 5f 8d 96 c9 9d a2 66 98 34
+ %% 6c 6b e1 64 82 ba dd da fe 05 1a 66 b4 f1 8d 66 8f 0b 00 2a 00
+ %% 00 00 2b 00 03 02 03 04 00 0d 00 20 00 1e 04 03 05 03 06 03 02
+ %% 03 08 04 08 05 08 06 04 01 05 01 06 01 02 01 04 02 05 02 06 02
+ %% 02 02 00 2d 00 02 01 01 00 1c 00 02 40 01 00 15 00 57 00 00 00
+ %% 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ %% 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ %% 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ %% 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ %% 00 29 00 dd 00 b8 00 b2 2c 03 5d 82 93 59 ee 5f f7 af 4e c9 00
+ %% 00 00 00 26 2a 64 94 dc 48 6d 2c 8a 34 cb 33 fa 90 bf 1b 00 70
+ %% ad 3c 49 88 83 c9 36 7c 09 a2 be 78 5a bc 55 cd 22 60 97 a3 a9
+ %% 82 11 72 83 f8 2a 03 a1 43 ef d3 ff 5d d3 6d 64 e8 61 be 7f d6
+ %% 1d 28 27 db 27 9c ce 14 50 77 d4 54 a3 66 4d 4e 6d a4 d2 9e e0
+ %% 37 25 a6 a4 da fc d0 fc 67 d2 ae a7 05 29 51 3e 3d a2 67 7f a5
+ %% 90 6c 5b 3f 7d 8f 92 f2 28 bd a4 0d da 72 14 70 f9 fb f2 97 b5
+ %% ae a6 17 64 6f ac 5c 03 27 2e 97 07 27 c6 21 a7 91 41 ef 5f 7d
+ %% e6 50 5e 5b fb c3 88 e9 33 43 69 40 93 93 4a e4 d3 57 fa d6 aa
+ %% cb 00 21 20 3a dd 4f b2 d8 fd f8 22 a0 ca 3c f7 67 8e f5 e8 8d
+ %% ae 99 01 41 c5 92 4d 57 bb 6f a3 1b 9e 5f 9d
+ %%
+ %% complete record (517 octets): 16 03 01 02 00 01 00 01 fc 03 03 1b
+ %% c3 ce b6 bb e3 9c ff 93 83 55 b5 a5 0a db 6d b2 1b 7a 6a f6 49
+ %% d7 b4 bc 41 9d 78 76 48 7d 95 00 00 06 13 01 13 03 13 02 01 00
+ %% 01 cd 00 00 00 0b 00 09 00 00 06 73 65 72 76 65 72 ff 01 00 01
+ %% 00 00 0a 00 14 00 12 00 1d 00 17 00 18 00 19 01 00 01 01 01 02
+ %% 01 03 01 04 00 33 00 26 00 24 00 1d 00 20 e4 ff b6 8a c0 5f 8d
+ %% 96 c9 9d a2 66 98 34 6c 6b e1 64 82 ba dd da fe 05 1a 66 b4 f1
+ %% 8d 66 8f 0b 00 2a 00 00 00 2b 00 03 02 03 04 00 0d 00 20 00 1e
+ %% 04 03 05 03 06 03 02 03 08 04 08 05 08 06 04 01 05 01 06 01 02
+ %% 01 04 02 05 02 06 02 02 02 00 2d 00 02 01 01 00 1c 00 02 40 01
+ %% 00 15 00 57 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ %% 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ %% 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ %% 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ %% 00 00 00 00 00 00 00 00 29 00 dd 00 b8 00 b2 2c 03 5d 82 93 59
+ %% ee 5f f7 af 4e c9 00 00 00 00 26 2a 64 94 dc 48 6d 2c 8a 34 cb
+ %% 33 fa 90 bf 1b 00 70 ad 3c 49 88 83 c9 36 7c 09 a2 be 78 5a bc
+ %% 55 cd 22 60 97 a3 a9 82 11 72 83 f8 2a 03 a1 43 ef d3 ff 5d d3
+ %% 6d 64 e8 61 be 7f d6 1d 28 27 db 27 9c ce 14 50 77 d4 54 a3 66
+ %% 4d 4e 6d a4 d2 9e e0 37 25 a6 a4 da fc d0 fc 67 d2 ae a7 05 29
+ %% 51 3e 3d a2 67 7f a5 90 6c 5b 3f 7d 8f 92 f2 28 bd a4 0d da 72
+ %% 14 70 f9 fb f2 97 b5 ae a6 17 64 6f ac 5c 03 27 2e 97 07 27 c6
+ %% 21 a7 91 41 ef 5f 7d e6 50 5e 5b fb c3 88 e9 33 43 69 40 93 93
+ %% 4a e4 d3 57 fa d6 aa cb 00 21 20 3a dd 4f b2 d8 fd f8 22 a0 ca
+ %% 3c f7 67 8e f5 e8 8d ae 99 01 41 c5 92 4d 57 bb 6f a3 1b 9e 5f
+ %% 9d
+ ClientHelloRecord =
+ hexstr2bin("01 00 01 fc 03 03 1b c3 ce b6 bb e3 9c ff
+ 93 83 55 b5 a5 0a db 6d b2 1b 7a 6a f6 49 d7 b4 bc 41 9d 78 76
+ 48 7d 95 00 00 06 13 01 13 03 13 02 01 00 01 cd 00 00 00 0b 00
+ 09 00 00 06 73 65 72 76 65 72 ff 01 00 01 00 00 0a 00 14 00 12
+ 00 1d 00 17 00 18 00 19 01 00 01 01 01 02 01 03 01 04 00 33 00
+ 26 00 24 00 1d 00 20 e4 ff b6 8a c0 5f 8d 96 c9 9d a2 66 98 34
+ 6c 6b e1 64 82 ba dd da fe 05 1a 66 b4 f1 8d 66 8f 0b 00 2a 00
+ 00 00 2b 00 03 02 03 04 00 0d 00 20 00 1e 04 03 05 03 06 03 02
+ 03 08 04 08 05 08 06 04 01 05 01 06 01 02 01 04 02 05 02 06 02
+ 02 02 00 2d 00 02 01 01 00 1c 00 02 40 01 00 15 00 57 00 00 00
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ 00 29 00 dd 00 b8 00 b2 2c 03 5d 82 93 59 ee 5f f7 af 4e c9 00
+ 00 00 00 26 2a 64 94 dc 48 6d 2c 8a 34 cb 33 fa 90 bf 1b 00 70
+ ad 3c 49 88 83 c9 36 7c 09 a2 be 78 5a bc 55 cd 22 60 97 a3 a9
+ 82 11 72 83 f8 2a 03 a1 43 ef d3 ff 5d d3 6d 64 e8 61 be 7f d6
+ 1d 28 27 db 27 9c ce 14 50 77 d4 54 a3 66 4d 4e 6d a4 d2 9e e0
+ 37 25 a6 a4 da fc d0 fc 67 d2 ae a7 05 29 51 3e 3d a2 67 7f a5
+ 90 6c 5b 3f 7d 8f 92 f2 28 bd a4 0d da 72 14 70 f9 fb f2 97 b5
+ ae a6 17 64 6f ac 5c 03 27 2e 97 07 27 c6 21 a7 91 41 ef 5f 7d
+ e6 50 5e 5b fb c3 88 e9 33 43 69 40 93 93 4a e4 d3 57 fa d6 aa
+ cb 00 21 20 3a dd 4f b2 d8 fd f8 22 a0 ca 3c f7 67 8e f5 e8 8d
+ ae 99 01 41 c5 92 4d 57 bb 6f a3 1b 9e 5f 9d"),
+
+ <<?BYTE(CH), ?UINT24(_Length), ClientHelloBody/binary>> = ClientHelloRecord,
+ #client_hello{extensions = #{pre_shared_key := PreSharedKey}} =
+ tls_handshake:decode_handshake({3,4}, CH, ClientHelloBody),
+
+ #pre_shared_key_client_hello{
+ offered_psks = #offered_psks{
+ identities = [Identity],
+ binders = [_Binders]}} = PreSharedKey,
+
+ #psk_identity{
+ identity = Ticket} = Identity,
+
+ ok.
+
%%--------------------------------------------------------------------
finished_verify_data() ->
diff --git a/lib/ssl/test/tls_1_3_version_SUITE.erl b/lib/ssl/test/tls_1_3_version_SUITE.erl
index f0b224d4e5..e0ac53e0f9 100644
--- a/lib/ssl/test/tls_1_3_version_SUITE.erl
+++ b/lib/ssl/test/tls_1_3_version_SUITE.erl
@@ -50,8 +50,14 @@ cert_groups() ->
tests() ->
[tls13_client_tls12_server,
tls13_client_with_ext_tls12_server,
- tls12_client_tls13_server].
-
+ tls12_client_tls13_server,
+ tls_client_tls10_server,
+ tls_client_tls11_server,
+ tls_client_tls12_server,
+ tls10_client_tls_server,
+ tls11_client_tls_server,
+ tls12_client_tls_server].
+
init_per_suite(Config) ->
catch crypto:stop(),
try crypto:start() of
@@ -150,4 +156,63 @@ tls12_client_tls13_server(Config) when is_list(Config) ->
ServerOpts = [{versions,
['tlsv1.3', 'tlsv1.2']} | ssl_test_lib:ssl_options(server_cert_opts, Config)],
ssl_test_lib:basic_test(ClientOpts, ServerOpts, Config).
-
+
+tls_client_tls10_server() ->
+ [{doc,"Test that a TLS 1.0-1.3 client can connect to a TLS 1.0 server."}].
+tls_client_tls10_server(Config) when is_list(Config) ->
+ ClientOpts = [{versions,
+ ['tlsv1', 'tlsv1.1', 'tlsv1.2', 'tlsv1.3']} |
+ ssl_test_lib:ssl_options(client_cert_opts, Config)],
+ ServerOpts = [{versions,
+ ['tlsv1']} | ssl_test_lib:ssl_options(server_cert_opts, Config)],
+ ssl_test_lib:basic_test(ClientOpts, ServerOpts, Config).
+
+tls_client_tls11_server() ->
+ [{doc,"Test that a TLS 1.0-1.3 client can connect to a TLS 1.1 server."}].
+tls_client_tls11_server(Config) when is_list(Config) ->
+ ClientOpts = [{versions,
+ ['tlsv1', 'tlsv1.1', 'tlsv1.2', 'tlsv1.3']} |
+ ssl_test_lib:ssl_options(client_cert_opts, Config)],
+ ServerOpts = [{versions,
+ ['tlsv1.1']} | ssl_test_lib:ssl_options(server_cert_opts, Config)],
+ ssl_test_lib:basic_test(ClientOpts, ServerOpts, Config).
+
+tls_client_tls12_server() ->
+ [{doc,"Test that a TLS 1.0-1.3 client can connect to a TLS 1.2 server."}].
+tls_client_tls12_server(Config) when is_list(Config) ->
+ ClientOpts = [{versions,
+ ['tlsv1', 'tlsv1.1', 'tlsv1.2', 'tlsv1.3']} |
+ ssl_test_lib:ssl_options(client_cert_opts, Config)],
+ ServerOpts = [{versions,
+ ['tlsv1.2']} | ssl_test_lib:ssl_options(server_cert_opts, Config)],
+ ssl_test_lib:basic_test(ClientOpts, ServerOpts, Config).
+
+tls10_client_tls_server() ->
+ [{doc,"Test that a TLS 1.0 client can connect to a TLS 1.0-1.3 server."}].
+tls10_client_tls_server(Config) when is_list(Config) ->
+ ClientOpts = [{versions,
+ ['tlsv1']} | ssl_test_lib:ssl_options(client_cert_opts, Config)],
+ ServerOpts = [{versions,
+ ['tlsv1','tlsv1.1', 'tlsv1.2', 'tlsv1.3']} |
+ ssl_test_lib:ssl_options(server_cert_opts, Config)],
+ ssl_test_lib:basic_test(ClientOpts, ServerOpts, Config).
+
+tls11_client_tls_server() ->
+ [{doc,"Test that a TLS 1.1 client can connect to a TLS 1.0-1.3 server."}].
+tls11_client_tls_server(Config) when is_list(Config) ->
+ ClientOpts = [{versions,
+ ['tlsv1.1']} | ssl_test_lib:ssl_options(client_cert_opts, Config)],
+ ServerOpts = [{versions,
+ ['tlsv1','tlsv1.1', 'tlsv1.2', 'tlsv1.3']} |
+ ssl_test_lib:ssl_options(server_cert_opts, Config)],
+ ssl_test_lib:basic_test(ClientOpts, ServerOpts, Config).
+
+tls12_client_tls_server() ->
+ [{doc,"Test that a TLS 1.2 client can connect to a TLS 1.0-1.3 server."}].
+tls12_client_tls_server(Config) when is_list(Config) ->
+ ClientOpts = [{versions,
+ ['tlsv1.2']} | ssl_test_lib:ssl_options(client_cert_opts, Config)],
+ ServerOpts = [{versions,
+ ['tlsv1','tlsv1.1', 'tlsv1.2', 'tlsv1.3']} |
+ ssl_test_lib:ssl_options(server_cert_opts, Config)],
+ ssl_test_lib:basic_test(ClientOpts, ServerOpts, Config).
diff --git a/lib/stdlib/doc/src/erl_tar.xml b/lib/stdlib/doc/src/erl_tar.xml
index ea8173748a..b062c5cef3 100644
--- a/lib/stdlib/doc/src/erl_tar.xml
+++ b/lib/stdlib/doc/src/erl_tar.xml
@@ -125,24 +125,25 @@
</list>
</section>
+ <datatypes>
+ <datatype>
+ <name name="name_in_archive"/>
+ </datatype>
+ <datatype>
+ <name name="open_type"/>
+ </datatype>
+ <datatype>
+ <name name="tar_descriptor"/>
+ </datatype>
+ </datatypes>
+
<funcs>
<func>
- <name since="">add(TarDescriptor, Filename, Options) -> RetValue</name>
+ <name name="add" arity="3" since=""/>
+ <name name="add" arity="4" since=""/>
<fsummary>Add a file to an open tar file.</fsummary>
- <type>
- <v>TarDescriptor = term()</v>
- <v>FilenameOrBin = filename()|binary()</v>
- <v>NameInArchive = filename()</v>
- <v>Filename = filename()|{NameInArchive,FilenameOrBin}</v>
- <v>Options = [Option]</v>
- <v>Option = dereference|verbose|{chunks,ChunkSize}</v>
- <v>|{atime,non_neg_integer()}|{mtime,non_neg_integer()}</v>
- <v>|{ctime,non_neg_integer()}|{uid,non_neg_integer()}</v>
- <v>|{gid,non_neg_integer()}</v>
- <v>ChunkSize = positive_integer()</v>
- <v>RetValue = ok|{error,{Filename,Reason}}</v>
- <v>Reason = term()</v>
- </type>
+ <type name="add_type"/>
+ <type name="add_opt"/>
<desc>
<p>Adds a file to a tar file that has been opened for writing by
<seealso marker="#open/2"><c>open/1</c></seealso>.</p>
@@ -211,33 +212,8 @@
</func>
<func>
- <name since="">add(TarDescriptor, FilenameOrBin, NameInArchive, Options) ->
- RetValue </name>
- <fsummary>Add a file to an open tar file.</fsummary>
- <type>
- <v>TarDescriptor = term()</v>
- <v>FilenameOrBin = filename()|binary()</v>
- <v>Filename = filename()</v>
- <v>NameInArchive = filename()</v>
- <v>Options = [Option]</v>
- <v>Option = dereference|verbose</v>
- <v>RetValue = ok|{error,{Filename,Reason}}</v>
- <v>Reason = term()</v>
- </type>
- <desc>
- <p>Adds a file to a tar file that has been opened for writing by
- <seealso marker="#open/2"><c>open/2</c></seealso>. This function
- accepts the same options as
- <seealso marker="#add/3"><c>add/3</c></seealso>.</p>
- </desc>
- </func>
-
- <func>
- <name since="">close(TarDescriptor)</name>
+ <name name="close" arity="1" since=""/>
<fsummary>Close an open tar file.</fsummary>
- <type>
- <v>TarDescriptor = term()</v>
- </type>
<desc>
<p>Closes a tar file
opened by <seealso marker="#open/2"><c>open/2</c></seealso>.</p>
@@ -245,17 +221,9 @@
</func>
<func>
- <name since="">create(Name, FileList) ->RetValue </name>
+ <name name="create" arity="2" since=""/>
<fsummary>Create a tar archive.</fsummary>
- <type>
- <v>Name = filename()</v>
- <v>FileList = [Filename|{NameInArchive, FilenameOrBin}]</v>
- <v>FilenameOrBin = filename()|binary()</v>
- <v>Filename = filename()</v>
- <v>NameInArchive = filename()</v>
- <v>RetValue = ok|{error,{Name,Reason}}</v>
- <v>Reason = term()</v>
- </type>
+ <type name="filelist"/>
<desc>
<p>Creates a tar file and archives the files whose names are specified
in <c>FileList</c> into it. The files can either be read from disk
@@ -264,19 +232,10 @@
</func>
<func>
- <name since="">create(Name, FileList, OptionList)</name>
+ <name name="create" arity="3" since=""/>
<fsummary>Create a tar archive with options.</fsummary>
- <type>
- <v>Name = filename()</v>
- <v>FileList = [Filename|{NameInArchive, FilenameOrBin}]</v>
- <v>FilenameOrBin = filename()|binary()</v>
- <v>Filename = filename()</v>
- <v>NameInArchive = filename()</v>
- <v>OptionList = [Option]</v>
- <v>Option = compressed|cooked|dereference|verbose</v>
- <v>RetValue = ok|{error,{Name,Reason}}</v>
- <v>Reason = term()</v>
- </type>
+ <type name="filelist"/>
+ <type name="create_opt"/>
<desc>
<p>Creates a tar file and archives the files whose names are specified
in <c>FileList</c> into it. The files can either be read from disk
@@ -315,14 +274,8 @@
</func>
<func>
- <name since="">extract(Name) -> RetValue</name>
+ <name name="extract" arity="1" since=""/>
<fsummary>Extract all files from a tar file.</fsummary>
- <type>
- <v>Name = filename() | {binary,binary()} | {file,Fd}</v>
- <v>Fd = file_descriptor()</v>
- <v>RetValue = ok|{error,{Name,Reason}}</v>
- <v>Reason = term()</v>
- </type>
<desc>
<p>Extracts all files from a tar archive.</p>
<p>If argument <c>Name</c> is specified as <c>{binary,Binary}</c>,
@@ -339,20 +292,9 @@
</func>
<func>
- <name since="">extract(Name, OptionList)</name>
+ <name name="extract" arity="2" since=""/>
<fsummary>Extract files from a tar file.</fsummary>
- <type>
- <v>Name = filename() | {binary,binary()} | {file,Fd}</v>
- <v>Fd = file_descriptor()</v>
- <v>OptionList = [Option]</v>
- <v>Option = {cwd,Cwd}|{files,FileList}|keep_old_files|verbose|memory</v>
- <v>Cwd = [dirname()]</v>
- <v>FileList = [filename()]</v>
- <v>RetValue = ok|MemoryRetValue|{error,{Name,Reason}}</v>
- <v>MemoryRetValue = {ok, [{NameInArchive,binary()}]}</v>
- <v>NameInArchive = filename()</v>
- <v>Reason = term()</v>
- </type>
+ <type name="extract_opt"/>
<desc>
<p>Extracts files from a tar archive.</p>
<p>If argument <c>Name</c> is specified as <c>{binary,Binary}</c>,
@@ -411,11 +353,8 @@
</func>
<func>
- <name since="">format_error(Reason) -> string()</name>
+ <name name="format_error" arity="1" since=""/>
<fsummary>Convert error term to a readable string.</fsummary>
- <type>
- <v>Reason = term()</v>
- </type>
<desc>
<p>Converts an error reason term to a human-readable error message
string.</p>
@@ -423,24 +362,11 @@
</func>
<func>
- <name since="OTP 17.4">init(UserPrivate, AccessMode, Fun) ->
- {ok,TarDescriptor} | {error,Reason}</name>
+ <name name="init" arity="3" since="OTP 17.4"/>
<fsummary>Create a <c>TarDescriptor</c> used in subsequent tar operations
when defining own low-level storage access functions.</fsummary>
- <type>
- <v>UserPrivate = term()</v>
- <v>AccessMode = [write] | [read]</v>
- <v>Fun when AccessMode is [write] =
- fun(write, {UserPrivate,DataToWrite})->...;
- (position,{UserPrivate,Position})->...;
- (close, UserPrivate)->... end</v>
- <v>Fun when AccessMode is [read] =
- fun(read2, {UserPrivate,Size})->...;
- (position,{UserPrivate,Position})->...;
- (close, UserPrivate)->... end</v>
- <v>TarDescriptor = term()</v>
- <v>Reason = term()</v>
- </type>
+ <type name="user_data"/>
+ <type name="file_op"/>
<desc>
<p>The <c>Fun</c> is the definition of what to do when the different
storage operations functions are to be called from the higher tar
@@ -448,33 +374,33 @@
<c>close/1</c>).</p>
<p>The <c>Fun</c> is called when the tar function wants to do a
low-level operation, like writing a block to a file. The <c>Fun</c>
- is called as <c>Fun(Op, {UserPrivate,Parameters...})</c>, where
- <c>Op</c> is the operation name, <c>UserPrivate</c> is the term
+ is called as <c>Fun(Op, {UserData,Parameters...})</c>, where
+ <c>Op</c> is the operation name, <c>UserData</c> is the term
passed as the first argument to <c>init/1</c> and
<c>Parameters...</c> are the data added by the tar function to be
passed down to the storage handling function.</p>
- <p>Parameter <c>UserPrivate</c> is typically the result of opening a
+ <p>Parameter <c>UserData</c> is typically the result of opening a
low-level structure like a file descriptor or an SFTP channel id.
The different <c>Fun</c> clauses operate on that very term.</p>
<p>The following are the fun clauses parameter lists:</p>
<taglist>
- <tag><c>(write, {UserPrivate,DataToWrite})</c></tag>
+ <tag><c>(write, {UserData,DataToWrite})</c></tag>
<item>
- <p>Writes term <c>DataToWrite</c> using <c>UserPrivate</c>.</p>
+ <p>Writes term <c>DataToWrite</c> using <c>UserData</c>.</p>
</item>
- <tag><c>(close, UserPrivate)</c></tag>
+ <tag><c>(close, UserData)</c></tag>
<item>
<p>Closes the access.</p>
</item>
- <tag><c>(read2, {UserPrivate,Size})</c></tag>
+ <tag><c>(read2, {UserData,Size})</c></tag>
<item>
- <p>Reads using <c>UserPrivate</c> but only <c>Size</c> bytes.
+ <p>Reads using <c>UserData</c> but only <c>Size</c> bytes.
Notice that there is only an arity-2 read function, not an arity-1
function.</p>
</item>
- <tag><c>(position,{UserPrivate,Position})</c></tag>
+ <tag><c>(position,{UserData,Position})</c></tag>
<item>
- <p>Sets the position of <c>UserPrivate</c> as defined for files in
+ <p>Sets the position of <c>UserData</c> as defined for files in
<seealso marker="kernel:file#position-2">
<c>file:position/2</c></seealso></p>
</item>
@@ -501,7 +427,7 @@ erl_tar:add(TarDesc, SomeValueIwantToAdd, FileNameInTarFile),
erl_tar:close(TarDesc)</code>
<p>When the <c>erl_tar</c> core wants to, for example, write a piece
of <c>Data</c>, it would call
- <c>ExampleFun(write, {UserPrivate,Data})</c>.</p>
+ <c>ExampleFun(write, {UserData,Data})</c>.</p>
<note>
<p>This example with the <c>file</c> module operations is
not necessary to use directly, as that is what function
@@ -518,16 +444,8 @@ erl_tar:close(TarDesc)</code>
</func>
<func>
- <name since="">open(Name, OpenModeList) -> RetValue</name>
+ <name name="open" arity="2" since=""/>
<fsummary>Open a tar file for writing.</fsummary>
- <type>
- <v>Name = filename()</v>
- <v>OpenModeList = [OpenMode]</v>
- <v>Mode = write|compressed|cooked</v>
- <v>RetValue = {ok,TarDescriptor}|{error,{Name,Reason}}</v>
- <v>TarDescriptor = term()</v>
- <v>Reason = term()</v>
- </type>
<desc>
<p>Creates a tar file for writing (any existing file with the same
name is truncated).</p>
@@ -565,36 +483,24 @@ erl_tar:close(TarDesc)</code>
</func>
<func>
- <name since="">table(Name) -> RetValue</name>
- <fsummary>Retrieve the name of all files in a tar file.</fsummary>
- <type>
- <v>Name = filename()|{binary,binary()}|{file,file_descriptor()}</v>
- <v>RetValue = {ok,[string()]}|{error,{Name,Reason}}</v>
- <v>Reason = term()</v>
- </type>
- <desc>
- <p>Retrieves the names of all files in the tar file <c>Name</c>.</p>
- </desc>
- </func>
-
- <func>
- <name since="">table(Name, Options)</name>
+ <name name="table" arity="1" since=""/>
+ <name name="table" arity="2" since=""/>
<fsummary>Retrieve name and information of all files in a tar file.
</fsummary>
- <type>
- <v>Name = filename()|{binary,binary()}|{file,file_descriptor()}</v>
- </type>
+ <type name="tar_entry"/>
+ <type name="tar_time"/>
+ <type name="typeflag"/>
+ <type name="mode"/>
+ <type name="uid"/>
+ <type name="gid"/>
<desc>
<p>Retrieves the names of all files in the tar file <c>Name</c>.</p>
</desc>
</func>
<func>
- <name since="">t(Name)</name>
+ <name name="t" arity="1" since=""/>
<fsummary>Print the name of each file in a tar file.</fsummary>
- <type>
- <v>Name = filename()|{binary,binary()}|{file,file_descriptor()}</v>
- </type>
<desc>
<p>Prints the names of all files in the tar file <c>Name</c> to the
Erlang shell (similar to "<c>tar&nbsp;t</c>").</p>
@@ -602,12 +508,9 @@ erl_tar:close(TarDesc)</code>
</func>
<func>
- <name since="">tt(Name)</name>
+ <name name="tt" arity="1" since=""/>
<fsummary>Print name and information for each file in a tar file.
</fsummary>
- <type>
- <v>Name = filename()|{binary,binary()}|{file,file_descriptor()}</v>
- </type>
<desc>
<p>Prints names and information about all files in the tar file
<c>Name</c> to the Erlang shell (similar to "<c>tar&nbsp;tv</c>").</p>
diff --git a/lib/stdlib/doc/src/proplists.xml b/lib/stdlib/doc/src/proplists.xml
index 4465103469..deb24e4366 100644
--- a/lib/stdlib/doc/src/proplists.xml
+++ b/lib/stdlib/doc/src/proplists.xml
@@ -346,7 +346,7 @@ split([{c, 2}, {e, 1}, a, {c, 3, 4}, d, {b, 5}, b], [a, b, c])</code>
<c>K1</c> such that <c>{K1, K2}</c> occurs in
<c><anno>Negations</anno></c>: if the entry was
<c>{K1, true}</c>, it is replaced with <c>{K2, false}</c>, otherwise
- with <c>{K2, true}</c>, thus changing the name of the option and
+ with <c>K2</c>, thus changing the name of the option and
simultaneously negating the value specified by
<seealso marker="#get_bool/2">
<c>get_bool(Key, <anno>ListIn</anno>)</c></seealso>.
@@ -355,7 +355,7 @@ split([{c, 2}, {e, 1}, a, {c, 3, 4}, d, {b, 5}, b], [a, b, c])</code>
<p>For example, <c>substitute_negations([{no_foo, foo}], L)</c>
replaces any atom <c>no_foo</c> or tuple
<c>{no_foo, true}</c> in <c>L</c> with <c>{foo, false}</c>,
- and any other tuple <c>{no_foo, ...}</c> with <c>{foo, true}</c>.</p>
+ and any other tuple <c>{no_foo, ...}</c> with <c>foo</c>.</p>
<p>See also
<seealso marker="#get_bool/2"><c>get_bool/2</c></seealso>,
<seealso marker="#normalize/2"><c>normalize/2</c></seealso>,
diff --git a/lib/stdlib/src/binary.erl b/lib/stdlib/src/binary.erl
index 52b9fedc9c..da70d96817 100644
--- a/lib/stdlib/src/binary.erl
+++ b/lib/stdlib/src/binary.erl
@@ -141,7 +141,7 @@ last(_) ->
erlang:nif_error(undef).
-spec list_to_bin(ByteList) -> binary() when
- ByteList :: iodata().
+ ByteList :: iolist().
list_to_bin(_) ->
erlang:nif_error(undef).
diff --git a/lib/stdlib/src/erl_lint.erl b/lib/stdlib/src/erl_lint.erl
index 0cd0aef124..54b0fbd999 100644
--- a/lib/stdlib/src/erl_lint.erl
+++ b/lib/stdlib/src/erl_lint.erl
@@ -556,6 +556,9 @@ start(File, Opts) ->
{unused_function,
bool_option(warn_unused_function, nowarn_unused_function,
true, Opts)},
+ {unused_type,
+ bool_option(warn_unused_type, nowarn_unused_type,
+ true, Opts)},
{bif_clash,
bool_option(warn_bif_clash, nowarn_bif_clash,
true, Opts)},
@@ -3150,7 +3153,13 @@ add_missing_spec_warnings(Forms, St0, Type) ->
add_warning(L, {missing_spec,FA}, St)
end, St0, Warns).
-check_unused_types(Forms, #lint{usage=Usage, types=Ts, exp_types=ExpTs}=St) ->
+check_unused_types(Forms, St) ->
+ case is_warn_enabled(unused_type, St) of
+ true -> check_unused_types_1(Forms, St);
+ false -> St
+ end.
+
+check_unused_types_1(Forms, #lint{usage=Usage, types=Ts, exp_types=ExpTs}=St) ->
case [File || {attribute,_L,file,{File,_Line}} <- Forms] of
[FirstFile|_] ->
D = Usage#usage.used_types,
@@ -3371,9 +3380,11 @@ handle_comprehension(E, Qs, Vt0, St0) ->
Vt3 = vtmerge(vtsubtract(Vt2, Uvt), Uvt),
%% Don't export local variables.
Vt4 = vtold(Vt3, Vt0),
- %% Forget about old variables which were not used.
- Vt5 = vt_no_unused(Vt4),
- {Vt5,St}.
+ %% Forget about old variables which were not used as well as unsafe
+ %% variables, preventing them from being marked as used and bound by
+ %% icrt_export/4.
+ Vt = vt_no_unsafe(vt_no_unused(Vt4)),
+ {Vt, St}.
%% lc_quals(Qualifiers, ImportVarTable, State) ->
%% {VarTable,ShadowedVarTable,State}
diff --git a/lib/stdlib/src/erl_tar.erl b/lib/stdlib/src/erl_tar.erl
index 7064fcacfa..591aea2f83 100644
--- a/lib/stdlib/src/erl_tar.erl
+++ b/lib/stdlib/src/erl_tar.erl
@@ -79,17 +79,18 @@ format_error(Term) ->
lists:flatten(io_lib:format("~tp", [Term])).
%% Initializes a new reader given a custom file handle and I/O wrappers
--spec init(handle(), write | read, file_op()) -> {ok, reader()} | {error, badarg}.
-init(Handle, AccessMode, Fun) when is_function(Fun, 2) ->
- Reader = #reader{handle=Handle,access=AccessMode,func=Fun},
+-spec init(UserData :: user_data(), write | read, file_op()) ->
+ {ok, tar_descriptor()} | {error, badarg}.
+init(UserData, AccessMode, Fun) when is_function(Fun, 2) ->
+ Reader = #reader{handle=UserData,access=AccessMode,func=Fun},
{ok, Pos, Reader2} = do_position(Reader, {cur, 0}),
{ok, Reader2#reader{pos=Pos}};
-init(_Handle, _AccessMode, _Fun) ->
+init(_UserData, _AccessMode, _Fun) ->
{error, badarg}.
%%%================================================================
%% Extracts all files from the tar file Name.
--spec extract(open_handle()) -> ok | {error, term()}.
+-spec extract(Open :: open_type()) -> ok | {error, term()}.
extract(Name) ->
extract(Name, []).
@@ -102,10 +103,10 @@ extract(Name) ->
%% - {files, ListOfFilesToExtract}: Only extract ListOfFilesToExtract
%% - verbose: Prints verbose information about the extraction,
%% - {cwd, AbsoluteDir}: Sets the current working directory for the extraction
--spec extract(open_handle(), [extract_opt()]) ->
- ok
- | {ok, [{string(), binary()}]}
- | {error, term()}.
+-spec extract(Open :: open_type(), [extract_opt()]) ->
+ {ok, [{string(), binary()}]} |
+ {error, term()} |
+ ok.
extract({binary, Bin}, Opts) when is_list(Opts) ->
do_extract({binary, Bin}, Opts);
extract({file, Fd}, Opts) when is_list(Opts) ->
@@ -165,7 +166,6 @@ check_extract(Name, #read_opts{files=Files}) ->
%%%================================================================
%% The following table functions produce a list of information about
%% the files contained in the archive.
--type filename() :: string().
-type typeflag() :: regular | link | symlink |
char | block | directory |
fifo | reserved | unknown.
@@ -173,23 +173,23 @@ check_extract(Name, #read_opts{files=Files}) ->
-type uid() :: non_neg_integer().
-type gid() :: non_neg_integer().
--type tar_entry() :: {filename(),
- typeflag(),
- non_neg_integer(),
- tar_time(),
- mode(),
- uid(),
- gid()}.
+-type tar_entry() :: {Name :: name_in_archive(),
+ Type :: typeflag(),
+ Size :: non_neg_integer(),
+ MTime :: tar_time(),
+ Mode :: mode(),
+ Uid :: uid(),
+ Gid :: gid()}.
%% Returns a list of names of the files in the tar file Name.
--spec table(open_handle()) -> {ok, [string()]} | {error, term()}.
+-spec table(Open :: open_type()) -> {ok, [name_in_archive()]} | {error, term()}.
table(Name) ->
table(Name, []).
%% Returns a list of names of the files in the tar file Name.
%% Options accepted: compressed, verbose, cooked.
--spec table(open_handle(), [compressed | verbose | cooked]) ->
- {ok, [string() | tar_entry()]} | {error, term()}.
+-spec table(Open :: open_type(), [compressed | verbose | cooked]) ->
+ {ok, [name_in_archive() | tar_entry()]} | {error, term()}.
table(Name, Opts) when is_list(Opts) ->
foldl_read(Name, fun table1/4, [], table_opts(Opts)).
@@ -239,7 +239,7 @@ t(Name) when is_list(Name); is_binary(Name) ->
end.
%% Prints verbose information about each file in the archive
--spec tt(open_handle()) -> ok | {error, term()}.
+-spec tt(open_type()) -> ok | {error, term()}.
tt(Name) ->
case table(Name, [verbose]) of
{ok, List} ->
@@ -301,11 +301,11 @@ month(12) -> "Dec".
%%%================================================================
%% The open function with friends is to keep the file and binary api of this module
--type open_handle() :: file:filename()
+-type open_type() :: file:filename_all()
| {binary, binary()}
- | {file, term()}.
--spec open(open_handle(), [write | compressed | cooked]) ->
- {ok, reader()} | {error, term()}.
+ | {file, file:io_device()}.
+-spec open(Open :: open_type(), [write | compressed | cooked]) ->
+ {ok, tar_descriptor()} | {error, term()}.
open({binary, Bin}, Mode) when is_binary(Bin) ->
do_open({binary, Bin}, Mode);
open({file, Fd}, Mode) ->
@@ -375,7 +375,7 @@ file_op(close, Fd) ->
file:close(Fd).
%% Closes a tar archive.
--spec close(reader()) -> ok | {error, term()}.
+-spec close(TarDescriptor :: tar_descriptor()) -> ok | {error, term()}.
close(#reader{access=read}=Reader) ->
ok = do_close(Reader);
close(#reader{access=write}=Reader) ->
@@ -396,13 +396,13 @@ pad_file(#reader{pos=Pos}=Reader) ->
%% Creation/modification of tar archives
%% Creates a tar file Name containing the given files.
--spec create(file:filename(), filelist()) -> ok | {error, {string(), term()}}.
+-spec create(file:filename_all(), filelist()) -> ok | {error, {string(), term()}}.
create(Name, FileList) when is_list(Name); is_binary(Name) ->
create(Name, FileList, []).
%% Creates a tar archive Name containing the given files.
%% Accepted options: verbose, compressed, cooked
--spec create(file:filename(), filelist(), [create_opt()]) ->
+-spec create(file:filename_all(), filelist(), [create_opt()]) ->
ok | {error, term()} | {error, {string(), term()}}.
create(Name, FileList, Options) when is_list(Name); is_binary(Name) ->
Mode = lists:filter(fun(X) -> (X=:=compressed) or (X=:=cooked)
@@ -434,10 +434,12 @@ do_create(TarFile, [Name|Rest], Opts) ->
end.
%% Adds a file to a tape archive.
--type add_type() :: string()
- | {string(), string()}
- | {string(), binary()}.
--spec add(reader(), add_type(), [add_opt()]) -> ok | {error, term()}.
+-type add_type() :: name_in_archive()
+ | {name_in_archive(), file:filename_all()}.
+-spec add(TarDescriptor, AddType, Options) -> ok | {error, term()} when
+ TarDescriptor :: tar_descriptor(),
+ AddType :: add_type(),
+ Options :: [add_opt()].
add(Reader, {NameInArchive, Name}, Opts)
when is_list(NameInArchive), is_list(Name) ->
do_add(Reader, Name, NameInArchive, Opts);
@@ -447,9 +449,12 @@ add(Reader, {NameInArchive, Bin}, Opts)
add(Reader, Name, Opts) when is_list(Name) ->
do_add(Reader, Name, Name, Opts).
-
--spec add(reader(), string() | binary(), string(), [add_opt()]) ->
- ok | {error, term()}.
+-spec add(TarDescriptor, Filename, NameInArchive, Options) ->
+ ok | {error, term()} when
+ TarDescriptor :: tar_descriptor(),
+ Filename :: file:filename_all(),
+ NameInArchive :: name_in_archive(),
+ Options :: [add_opt()].
add(Reader, NameOrBin, NameInArchive, Options)
when is_list(NameOrBin); is_binary(NameOrBin),
is_list(NameInArchive), is_list(Options) ->
@@ -1140,8 +1145,8 @@ validate_sparse_entries([#sparse_entry{}=Entry|Rest], RealSize, I, LastOffset) -
validate_sparse_entries(Rest, RealSize, I+1, Offset+NumBytes).
--spec parse_sparse_map(header_gnu(), reader_type()) ->
- {[sparse_entry()], reader_type()}.
+-spec parse_sparse_map(header_gnu(), descriptor_type()) ->
+ {[sparse_entry()], descriptor_type()}.
parse_sparse_map(#header_gnu{sparse=Sparse}, Reader)
when Sparse#sparse_array.is_extended ->
parse_sparse_map(Sparse, Reader, []);
@@ -1899,7 +1904,7 @@ read_sparse_hole(#sparse_file_reader{pos=Pos}=Reader, Offset, Len) ->
num_bytes=NumBytes,
pos=Pos+N2}}.
--spec do_close(reader()) -> ok | {error, term()}.
+-spec do_close(tar_descriptor()) -> ok | {error, term()}.
do_close(#reader{handle=Handle,func=Fun}) when is_function(Fun,2) ->
Fun(close,Handle).
diff --git a/lib/stdlib/src/erl_tar.hrl b/lib/stdlib/src/erl_tar.hrl
index 5d6cecbb66..44f9adb8f6 100644
--- a/lib/stdlib/src/erl_tar.hrl
+++ b/lib/stdlib/src/erl_tar.hrl
@@ -48,8 +48,10 @@
{uid, non_neg_integer()} |
{gid, non_neg_integer()}.
+-type name_in_archive() :: string().
+
-type extract_opt() :: {cwd, string()} |
- {files, [string()]} |
+ {files, [name_in_archive()]} |
compressed |
cooked |
memory |
@@ -62,21 +64,20 @@
verbose.
-type filelist() :: [file:filename() |
- {string(), binary()} |
- {string(), file:filename()}].
+ {name_in_archive(), file:filename_all()}].
-type tar_time() :: non_neg_integer().
%% The tar header, once fully parsed.
-record(tar_header, {
- name = "" :: string(), %% name of header file entry
+ name = "" :: name_in_archive(), %% name of header file entry
mode = 8#100644 :: non_neg_integer(), %% permission and mode bits
uid = 0 :: non_neg_integer(), %% user id of owner
gid = 0 :: non_neg_integer(), %% group id of owner
size = 0 :: non_neg_integer(), %% length in bytes
mtime :: tar_time(), %% modified time
typeflag :: char(), %% type of header entry
- linkname = "" :: string(), %% target name of link
+ linkname = "" :: name_in_archive(), %% target name of link
uname = "" :: string(), %% user name of owner
gname = "" :: string(), %% group name of owner
devmajor = 0 :: non_neg_integer(), %% major number of character or block device
@@ -157,16 +158,18 @@
%% The overall tar reader, it holds the low-level file handle,
%% its access, position, and the I/O primitives wrapper.
-record(reader, {
- handle :: file:io_device() | term(),
+ handle :: user_data(),
access :: read | write | ram,
pos = 0 :: non_neg_integer(),
func :: file_op()
}).
--type reader() :: #reader{}.
+-opaque tar_descriptor() :: #reader{}.
+-export_type([tar_descriptor/0]).
+
%% A reader for a regular file within the tar archive,
%% It tracks its current state relative to that file.
-record(reg_file_reader, {
- handle :: reader(),
+ handle :: tar_descriptor(),
num_bytes = 0,
pos = 0,
size = 0
@@ -175,7 +178,7 @@
%% A reader for a sparse file within the tar archive,
%% It tracks its current state relative to that file.
-record(sparse_file_reader, {
- handle :: reader(),
+ handle :: tar_descriptor(),
num_bytes = 0, %% bytes remaining
pos = 0, %% pos
size = 0, %% total size of file
@@ -184,13 +187,13 @@
-type sparse_file_reader() :: #sparse_file_reader{}.
%% Types for the readers
--type reader_type() :: reader() | reg_file_reader() | sparse_file_reader().
--type handle() :: file:io_device() | term().
+-type descriptor_type() :: tar_descriptor() | reg_file_reader() | sparse_file_reader().
+-type user_data() :: term().
%% Type for the I/O primitive wrapper function
-type file_op() :: fun((write | close | read2 | position,
- {handle(), iodata()} | handle() | {handle(), non_neg_integer()}
- | {handle(), non_neg_integer()}) ->
+ {user_data(), iodata()} | user_data() | {user_data(), non_neg_integer()}
+ | {user_data(), non_neg_integer()}) ->
ok | eof | {ok, string() | binary()} | {ok, non_neg_integer()}
| {error, term()}).
diff --git a/lib/stdlib/src/pool.erl b/lib/stdlib/src/pool.erl
index 599be55607..c859cf407f 100644
--- a/lib/stdlib/src/pool.erl
+++ b/lib/stdlib/src/pool.erl
@@ -101,9 +101,7 @@ pspawn(M, F, A) ->
Fun :: atom(),
Args :: [term()].
pspawn_link(M, F, A) ->
- P = pspawn(M, F, A),
- link(P),
- P.
+ spawn_link(get_node(), M, F, A).
start_nodes([], _, _) -> [];
start_nodes([Host|Tail], Name, Args) ->
@@ -149,9 +147,9 @@ handle_call({attach, Node}, _From, Nodes) ->
{reply, attached, Nodes++[{999999,Node}]}
end;
handle_call({spawn, Gl, M, F, A}, _From, Nodes) ->
- [{Load,N}|Tail] = Nodes,
+ {reply, N, NewNodes} = handle_call(get_node, _From, Nodes),
Pid = spawn(N, pool, do_spawn, [Gl, M, F, A]),
- {reply, Pid, Tail++[{Load+1, N}]};
+ {reply, Pid, NewNodes};
handle_call(stop, _From, Nodes) ->
%% clean up in terminate/2
{stop, normal, stopped, Nodes}.
@@ -205,7 +203,7 @@ statistic_collector() ->
statistic_collector(0) -> exit(normal);
statistic_collector(I) ->
- sleep(300),
+ timer:sleep(300),
case global:whereis_name(pool_master) of
undefined ->
statistic_collector(I-1);
@@ -216,7 +214,7 @@ statistic_collector(I) ->
%% Do not tell the master about our load if it has not changed
stat_loop(M, Old) ->
- sleep(2000),
+ timer:sleep(2000),
case statistics(run_queue) of
Old ->
stat_loop(M, Old);
@@ -224,5 +222,3 @@ stat_loop(M, Old) ->
M ! {node(), load, NewLoad}, %% async
stat_loop(M, NewLoad)
end.
-
-sleep(I) -> receive after I -> ok end.
diff --git a/lib/stdlib/src/proplists.erl b/lib/stdlib/src/proplists.erl
index 340dfdcac9..3ce68887ae 100644
--- a/lib/stdlib/src/proplists.erl
+++ b/lib/stdlib/src/proplists.erl
@@ -410,8 +410,8 @@ substitute_aliases_1([], P) ->
%% associated with some key <code>K1</code> such that <code>{K1,
%% K2}</code> occurs in <code>Negations</code>, then if the entry was
%% <code>{K1, true}</code> it will be replaced with <code>{K2,
-%% false}</code>, otherwise it will be replaced with <code>{K2,
-%% true}</code>, thus changing the name of the option and simultaneously
+%% false}</code>, otherwise it will be replaced with <code>K2</code>,
+%% thus changing the name of the option and simultaneously
%% negating the value given by <code>get_bool(ListIn)</code>. If the same
%% <code>K1</code> occurs more than once in <code>Negations</code>, only
%% the first occurrence is used.
@@ -419,8 +419,7 @@ substitute_aliases_1([], P) ->
%% <p>Example: <code>substitute_negations([{no_foo, foo}], L)</code>
%% will replace any atom <code>no_foo</code> or tuple <code>{no_foo,
%% true}</code> in <code>L</code> with <code>{foo, false}</code>, and
-%% any other tuple <code>{no_foo, ...}</code> with <code>{foo,
-%% true}</code>.</p>
+%% any other tuple <code>{no_foo, ...}</code> with <code>foo</code.</p>
%%
%% @see get_bool/2
%% @see substitute_aliases/2
diff --git a/lib/stdlib/src/stdlib.app.src b/lib/stdlib/src/stdlib.app.src
index 5b7d2218c7..882676e59b 100644
--- a/lib/stdlib/src/stdlib.app.src
+++ b/lib/stdlib/src/stdlib.app.src
@@ -108,7 +108,7 @@
dets]},
{applications, [kernel]},
{env, []},
- {runtime_dependencies, ["sasl-3.0","kernel-6.0","erts-10.5","crypto-3.3",
+ {runtime_dependencies, ["sasl-3.0","kernel-6.0","erts-@OTP-16052@","crypto-3.3",
"compiler-5.0"]}
]}.
diff --git a/lib/stdlib/test/Makefile b/lib/stdlib/test/Makefile
index 712b1b92fb..7f7a0834ba 100644
--- a/lib/stdlib/test/Makefile
+++ b/lib/stdlib/test/Makefile
@@ -55,7 +55,9 @@ MODULES= \
log_mf_h_SUITE \
math_SUITE \
ms_transform_SUITE \
+ pool_SUITE \
proc_lib_SUITE \
+ proplists_SUITE \
qlc_SUITE \
queue_SUITE \
rand_SUITE \
diff --git a/lib/stdlib/test/beam_lib_SUITE.erl b/lib/stdlib/test/beam_lib_SUITE.erl
index 4b2694320e..1c89c1e828 100644
--- a/lib/stdlib/test/beam_lib_SUITE.erl
+++ b/lib/stdlib/test/beam_lib_SUITE.erl
@@ -891,7 +891,7 @@ simple_file(File, Module, F) ->
ok = file:write_file(File, B).
run_if_crypto_works(Test) ->
- try begin crypto:start(), crypto:info(), crypto:stop(), ok end of
+ try begin crypto:start(), crypto:stop(), ok end of
ok ->
Test()
catch
diff --git a/lib/stdlib/test/erl_lint_SUITE.erl b/lib/stdlib/test/erl_lint_SUITE.erl
index e7882e0daf..38d07249fd 100644
--- a/lib/stdlib/test/erl_lint_SUITE.erl
+++ b/lib/stdlib/test/erl_lint_SUITE.erl
@@ -68,7 +68,8 @@
non_latin1_module/1, otp_14323/1,
stacktrace_syntax/1,
otp_14285/1, otp_14378/1,
- external_funs/1,otp_15456/1,otp_15563/1]).
+ external_funs/1,otp_15456/1,otp_15563/1,
+ unused_type/1]).
suite() ->
[{ct_hooks,[ts_install_cth]},
@@ -90,7 +91,7 @@ all() ->
otp_11851, otp_11879, otp_13230,
record_errors, otp_11879_cont, non_latin1_module, otp_14323,
stacktrace_syntax, otp_14285, otp_14378, external_funs,
- otp_15456, otp_15563].
+ otp_15456, otp_15563, unused_type].
groups() ->
[{unused_vars_warn, [],
@@ -921,7 +922,30 @@ unused_function(Config) when is_list(Config) ->
[] = run(Config, Ts),
ok.
-
+
+%% Test warnings for unused types
+unused_type(Config) when is_list(Config) ->
+ Ts = [{func1,
+ <<"-type foo() :: term().">>,
+ {[]}, %Tuple indicates no export_all
+ {warnings,[{1,erl_lint,{unused_type,{foo,0}}}]}},
+
+ %% Turn off warnings for unused types.
+ {func2,
+ <<"-type foo() :: term().">>,
+ {[nowarn_unused_type]}, %Tuple indicates no export_all
+ []},
+
+ %% Turn off warnings for unused types using a -compile() directive.
+ {func3,
+ <<"-compile(nowarn_unused_type).
+ -type foo() :: term().">>,
+ {[]}, %Tuple indicates no export_all
+ []}],
+
+ [] = run(Config, Ts),
+ ok.
+
%% OTP-4671. Errors for unsafe variables.
unsafe_vars(Config) when is_list(Config) ->
Ts = [{unsafe1,
@@ -1018,7 +1042,27 @@ unsafe_vars(Config) when is_list(Config) ->
{errors,[{24,erl_lint,{unsafe_var,'A',{'catch',4}}},
{24,erl_lint,{unsafe_var,'B',{'case',2}}},
{24,erl_lint,{unsafe_var,'D',{'case',2}}}],
- []}}
+ []}},
+ {unsafe_comprehension,
+ <<"foo() ->
+ case node() of
+ P when is_tuple(P) ->
+ P;
+ _ ->
+ ok
+ end,
+ Y = try
+ ok
+ catch _C:_R ->
+ [1 || _ <- []]
+ end,
+ case Y of
+ P ->
+ P
+ end.
+ ">>,
+ [],
+ {errors,[{14,erl_lint,{unsafe_var,'P',{'case',2}}}],[]}}
],
[] = run(Config, Ts),
ok.
diff --git a/lib/stdlib/test/escript_SUITE.erl b/lib/stdlib/test/escript_SUITE.erl
index 8ffd01f2b2..031aeaa527 100644
--- a/lib/stdlib/test/escript_SUITE.erl
+++ b/lib/stdlib/test/escript_SUITE.erl
@@ -980,7 +980,8 @@ do_run(Dir, Cmd, Expected0) ->
io:format("Run: ~p\n", [Cmd]),
Expected = iolist_to_binary(expected_output(Expected0, Dir)),
- Env = [{"PATH",Dir++":"++os:getenv("PATH")}],
+ Env = [{"PATH",Dir++":"++os:getenv("PATH")},
+ {"ERL_FLAGS",false},{"ERL_AFLAGS",false}],
Port = open_port({spawn,Cmd}, [exit_status,eof,in,{env,Env}]),
Res = get_data(Port, []),
receive
diff --git a/lib/stdlib/test/pool_SUITE.erl b/lib/stdlib/test/pool_SUITE.erl
new file mode 100644
index 0000000000..ead4cd58ca
--- /dev/null
+++ b/lib/stdlib/test/pool_SUITE.erl
@@ -0,0 +1,95 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1996-2018. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(pool_SUITE).
+
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
+-export([basic/1, link_race/1, echo/1]).
+
+suite() -> [{ct_hooks,[{ts_install_cth,[{nodenames, 1}]}]}].
+
+all() ->
+ [basic, link_race].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+basic(Config) ->
+
+ {ok, Node, PoolNode} = init_pool(pool_SUITE_basic, basic, Config),
+
+ Node = rpc:call(Node, pool, get_node, []),
+ PoolNode = rpc:call(Node, pool, get_node, []),
+
+ do_echo(Node),
+ do_echo(Node),
+
+ test_server:stop_node(Node),
+ ok.
+
+link_race(Config) ->
+
+ {ok, Node, PoolNode} = init_pool(pool_SUITE_basic, basic, Config),
+
+ Node = rpc:call(Node, pool, get_node, []),
+ PoolNode = rpc:call(Node, pool, get_node, []),
+
+ rpc:call(Node, pool, pspawn_link, [erlang, is_atom, [?MODULE]]),
+
+ test_server:stop_node(Node),
+ ok.
+
+do_echo(Node) ->
+ EchoPid = rpc:call(Node, pool, pspawn, [?MODULE, echo, [self()]]),
+ Ref = EchoPid ! make_ref(),
+ receive Ref -> ok after 1000 -> ct:fail(receive M -> M after 0 -> timeout end) end.
+
+echo(Parent) ->
+ receive Msg ->
+ Parent ! Msg
+ end.
+
+
+init_pool(Proxy, Name, Config) ->
+ PrivDir = proplists:get_value(priv_dir, Config),
+ [Slave] = proplists:get_value(nodenames, Config),
+ {ok, Node} = test_server:start_node(Proxy, slave, []),
+ {ok, Hostname} = inet:gethostname(),
+ file:write_file(filename:join(PrivDir,".hosts.erlang"),"'"++Hostname++"'.\n"),
+ ok = rpc:call(Node, file, set_cwd, [PrivDir]),
+
+ [PoolNode] = rpc:call(Node, pool, start, [Name]),
+
+ Nodes = rpc:call(Node, pool, get_nodes, []),
+ [rpc:call(N, code, add_patha, [filename:dirname(code:which(?MODULE))]) || N <- Nodes],
+
+ {ok, Node, PoolNode}.
diff --git a/lib/stdlib/test/proplists_SUITE.erl b/lib/stdlib/test/proplists_SUITE.erl
new file mode 100644
index 0000000000..600fb8845e
--- /dev/null
+++ b/lib/stdlib/test/proplists_SUITE.erl
@@ -0,0 +1,80 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2019. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+-module(proplists_SUITE).
+
+-export([all/0, suite/0,groups/0, init_per_suite/1, end_per_suite/1,
+ init_per_group/2, end_per_group/2,
+ init_per_testcase/2, end_per_testcase/2,
+ examples/1]).
+
+init_per_testcase(_Case, Config) ->
+ Config.
+
+end_per_testcase(_Case, _Config) ->
+ ok.
+
+suite() ->
+ [{ct_hooks,[ts_install_cth]},
+ {timetrap,{minutes,5}}].
+
+all() ->
+ [examples].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+%% Test all examples in the documentation.
+
+examples(_Config) ->
+ [1,2,3,4] = proplists:append_values(a, [{a, [1,2]}, {b, 0}, {a, 3}, {c, -1}, {a, [4]}]),
+
+ ExpandRes = [fie, bar, baz, fum],
+ ExpandRes = proplists:expand([{foo, [bar, baz]}], [fie, foo, fum]),
+ ExpandRes = proplists:expand([{{foo, true}, [bar, baz]}], [fie, foo, fum]),
+ ExpandRes = proplists:expand([{{foo, false}, [bar, baz]}], [fie, {foo, false}, fum]),
+
+ [{foo, false}, fie, foo, fum] = proplists:expand([{{foo, true}, [bar, baz]}],
+ [{foo, false}, fie, foo, fum]),
+
+ {[[a], [{b, 5}, b],[{c, 2}, {c, 3, 4}]], [{e, 1}, d]} =
+ proplists:split([{c, 2}, {e, 1}, a, {c, 3, 4}, d, {b, 5}, b], [a, b, c]),
+
+ ColorList = [{color, red}, {colour, green}, color, colour],
+ ColorListRes = [{colour, red}, {colour, green}, colour, colour],
+ ColorListRes = proplists:substitute_aliases([{color, colour}], ColorList),
+
+ NegList = [no_foo, {no_foo, true}, {no_foo, false}, {no_foo, any}, foo],
+ NegListRes = [{foo, false}, {foo, false}, foo, foo, foo],
+ NegListRes = proplists:substitute_negations([{no_foo, foo}], NegList),
+
+ ok.
diff --git a/lib/stdlib/test/stdlib_SUITE.erl b/lib/stdlib/test/stdlib_SUITE.erl
index d55635a735..0b7510c305 100644
--- a/lib/stdlib/test/stdlib_SUITE.erl
+++ b/lib/stdlib/test/stdlib_SUITE.erl
@@ -22,12 +22,11 @@
%%%-----------------------------------------------------------------
-module(stdlib_SUITE).
-include_lib("common_test/include/ct.hrl").
+-export([all/0, suite/0, init_per_suite/1, end_per_suite/1,
+ init_per_group/2, end_per_group/2,
+ init_per_testcase/2, end_per_testcase/2,
+ app_test/1, appup_test/1, assert_test/1]).
--compile(export_all).
-
-%%
-%% all/1
-%%
suite() -> [{ct_hooks,[ts_install_cth]}].
all() ->
diff --git a/lib/stdlib/test/unicode_SUITE.erl b/lib/stdlib/test/unicode_SUITE.erl
index e01ba3fbb0..ada79dbe65 100644
--- a/lib/stdlib/test/unicode_SUITE.erl
+++ b/lib/stdlib/test/unicode_SUITE.erl
@@ -34,7 +34,8 @@
ex_binaries_errors_utf16_big/1,
ex_binaries_errors_utf32_little/1,
ex_binaries_errors_utf32_big/1,
- normalize/1
+ normalize/1,
+ huge_illegal_code_points/1
]).
suite() ->
@@ -47,7 +48,8 @@ all() ->
latin1, exceptions,
binaries_errors_limit,
normalize,
- {group,binaries_errors}].
+ {group,binaries_errors},
+ huge_illegal_code_points].
groups() ->
[{binaries_errors,[parallel],
@@ -1024,6 +1026,26 @@ normalize(_) ->
ok.
+huge_illegal_code_points(Config) when is_list(Config) ->
+ LargeList = lists:duplicate(1024, $x),
+ Pre = ["ok part", [[LargeList]]],
+ Post = ["error tail", [[LargeList]]],
+ huge_illegal_code_points_aux(Pre, 1 bsl 27, Post),
+ huge_illegal_code_points_aux(Pre, 1 bsl 28, Post),
+ huge_illegal_code_points_aux(Pre, 1 bsl 32, Post),
+ huge_illegal_code_points_aux(Pre, 1 bsl 59, Post),
+ huge_illegal_code_points_aux(Pre, 1 bsl 60, Post),
+ huge_illegal_code_points_aux(Pre, 1 bsl 64, Post),
+ ok.
+
+huge_illegal_code_points_aux(Pre, Error, Post) ->
+ ErrorList = [Error|Post],
+ In = [Pre | ErrorList],
+ FlatPre = lists:flatten(Pre),
+ {error, FlatPre, ErrorList} = unicode:characters_to_list(In),
+ BinPre = list_to_binary(FlatPre),
+ {error, BinPre, ErrorList} = unicode:characters_to_binary(In),
+ ok.
%%
%% Diverse utilities
diff --git a/lib/syntax_tools/doc/src/notes.xml b/lib/syntax_tools/doc/src/notes.xml
index 31b3e45016..9963ac41ae 100644
--- a/lib/syntax_tools/doc/src/notes.xml
+++ b/lib/syntax_tools/doc/src/notes.xml
@@ -157,6 +157,22 @@
</section>
</section>
+<section><title>Syntax_Tools 2.1.4.2</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p> Add missing calls to <c>erl_syntax:unwrap/1</c>. The
+ nodes concerned represent names and values of maps and
+ map types. </p>
+ <p>
+ Own Id: OTP-16012 Aux Id: PR-2348 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Syntax_Tools 2.1.4.1</title>
<section><title>Fixed Bugs and Malfunctions</title>
<list>
diff --git a/lib/tools/emacs/erlang-eunit.el b/lib/tools/emacs/erlang-eunit.el
index 53543d7b01..52c5783806 100644
--- a/lib/tools/emacs/erlang-eunit.el
+++ b/lib/tools/emacs/erlang-eunit.el
@@ -22,7 +22,7 @@
;;; Author: Klas Johansson
(eval-when-compile
- (require 'cl))
+ (require 'cl-lib))
(require 'erlang)
(defvar erlang-eunit-src-candidate-dirs '("../src" ".")
@@ -319,7 +319,7 @@ With prefix arg, compiles for debug and runs tests with the verbose flag set."
;; instead of possibly several: one for each file to compile,
;; for instance for both x.erl and x_tests.erl.
(save-some-buffers erlang-eunit-autosave)
- (flet ((save-some-buffers (&optional any) nil))
+ (cl-letf (((symbol-function 'save-some-buffers) #'ignore))
;; Compilation of the source file is mandatory (the file must
;; exist, otherwise the procedure is aborted). Compilation of the
diff --git a/lib/tools/emacs/erlang-flymake.el b/lib/tools/emacs/erlang-flymake.el
index 0b7936a81f..4e4da51e7a 100644
--- a/lib/tools/emacs/erlang-flymake.el
+++ b/lib/tools/emacs/erlang-flymake.el
@@ -22,7 +22,7 @@
(require 'flymake)
(eval-when-compile
- (require 'cl))
+ (require 'cl-lib))
(defvar erlang-flymake-command
"erlc"
@@ -68,7 +68,7 @@ check on newline and when there are no changes)."
(defun erlang-flymake-init ()
(let* ((temp-file
- (flet ((flymake-get-temp-dir () (erlang-flymake-temp-dir)))
+ (cl-letf (((symbol-function 'flymake-get-temp-dir) #'erlang-flymake-temp-dir))
(flymake-init-create-temp-buffer-copy
'flymake-create-temp-with-folder-structure)))
(code-dir-opts
diff --git a/lib/tools/emacs/erlang.el b/lib/tools/emacs/erlang.el
index 0b3a2319e2..429471a0e0 100644
--- a/lib/tools/emacs/erlang.el
+++ b/lib/tools/emacs/erlang.el
@@ -4,8 +4,8 @@
;; Author: Anders Lindgren
;; Keywords: erlang, languages, processes
;; Date: 2011-12-11
-;; Version: 2.8.2
-;; Package-Requires: ((emacs "24.1"))
+;; Version: 2.8.3
+;; Package-Requires: ((emacs "24.3"))
;; %CopyrightBegin%
;;
@@ -87,15 +87,27 @@
"The Erlang programming language."
:group 'languages)
-(defconst erlang-version "2.8.2"
+(defconst erlang-version "2.8.3"
"The version number of Erlang mode.")
(defcustom erlang-root-dir nil
- "The directory where the Erlang system is installed.
-The name should not contain the trailing slash.
+ "The directory where the Erlang man pages are installed. The
+name should not contain a trailing slash.
Should this variable be nil, no manual pages will show up in the
-Erlang mode menu."
+Erlang mode menu unless man pages have been downloaded by Erlang
+mode (see below).
+
+You can download the Erlang man pages automatically by placing
+the following lines in your Emacs init file or by executing the
+Emacs command `M-x erlang-man-download-ask RET' (the download URL
+can be customized with the Emacs variable
+erlang-man-download-url):
+
+ (require 'erlang)
+ (erlang-man-download)
+
+"
:group 'erlang
:type '(restricted-sexp :match-alternatives (stringp 'nil))
:safe (lambda (val) (or (eq nil val) (stringp val))))
@@ -1058,6 +1070,7 @@ behaviour.")
(define-key map "\C-c\C-y" 'erlang-clone-arguments)
(define-key map "\C-c\C-a" 'erlang-align-arrows)
(define-key map "\C-c\C-z" 'erlang-shell-display)
+ (define-key map "\C-c\C-d" 'erlang-man-function-no-prompt)
map)
"Keymap used in Erlang mode.")
(defvar erlang-mode-abbrev-table nil
@@ -1880,7 +1893,8 @@ the location of the manual pages."
()
(setq erlang-menu-man-items
'(nil
- ("Man - Function" erlang-man-function)))
+ ("Man - Function" erlang-man-function)
+ ("Man - Function Under Cursor" erlang-man-function-no-prompt)))
(if erlang-man-dirs
(setq erlang-menu-man-items
(append erlang-menu-man-items
@@ -1914,8 +1928,7 @@ The format is described in the documentation of `erlang-man-dirs'."
(while dir-list
(setq dir (cond ((nth 2 (car dir-list))
;; Relative to `erlang-root-dir'.
- (and (stringp erlang-root-dir)
- (erlang-man-dir (nth 1 (car dir-list)))))
+ (erlang-man-dir (nth 1 (car dir-list)) t))
(t
;; Absolute
(nth 1 (car dir-list)))))
@@ -1933,8 +1946,93 @@ The format is described in the documentation of `erlang-man-dirs'."
'(("Man Pages"
(("Error! Why?" erlang-man-describe-error)))))))
-(defun erlang-man-dir (subdir)
- (concat erlang-root-dir "/lib/erlang/" subdir))
+
+(defcustom erlang-man-download-url "http://erlang.org/download/otp_doc_man_22.1.tar.gz"
+ "The URL from which the erlang-man-download function will
+ download Erlang man pages ")
+
+(defun erlang-man-user-local-emacs-dir ()
+ "Returns the directory where man pages that are downloaded by
+the functions erlang-man-download and erlang-man-download-ask are
+stored."
+ (concat (file-name-as-directory (locate-user-emacs-file "cache"))
+ (file-name-as-directory "erlang_mode_man_pages"))
+ )
+
+(defun erlang-man-download (&optional download-url-param)
+ "Downloads the Erlang man pages into the
+\"cache/erlang_mode_man_pages\" subdirectory under the user's
+Emacs directory, if the man pages haven't been downloaded
+already. The URL from which the man pages are downloaded can be
+configured with the variable \"erlang-man-download-url\""
+ (interactive)
+ (let* ((download-url (or download-url-param erlang-man-download-url))
+ (downloaded-man-dir (erlang-man-user-local-emacs-dir))
+ (downloaded-man-url-file (concat
+ (file-name-as-directory downloaded-man-dir)
+ "erlang_man_download_url")))
+ (if (and (file-exists-p downloaded-man-url-file)
+ (string= download-url (with-temp-buffer
+ (insert-file-contents downloaded-man-url-file)
+ (buffer-string))))
+ downloaded-man-dir
+ (let ((man-file (concat (file-name-as-directory downloaded-man-dir) "man.tar.gz")))
+ (message "Downloading: %s to %s" download-url man-file)
+ (require 'url)
+ (mkdir downloaded-man-dir t)
+ (url-copy-file download-url man-file t)
+ ;; Write the download URL to a file so that future calls to
+ ;; erlang-man-download can check if the man cache should be
+ ;; updated
+ (write-region download-url nil downloaded-man-url-file)
+ ;; url-copy-file unpacks the zip archive (at least on my
+ ;; system) but this behavior is undocumented so do a tar with
+ ;; the z flag as well
+ (message "Note that %s will only be unpacked automatically if your system has the tar tool in its path" man-file)
+ (shell-command (format "tar -x -z -f %s -C %s" man-file downloaded-man-dir))
+ (message "The error message above can be ignored if everything works fine")
+ (message "Unpacking man pages using the command \"%s\""
+ (format "tar -x -f %s -C %s" man-file downloaded-man-dir))
+ (shell-command (format "tar -x -f %s -C %s" man-file downloaded-man-dir))
+ (message "Restarting erlang-mode")
+ (erlang-mode)
+ downloaded-man-dir
+ )
+ )
+ )
+ )
+
+(defun erlang-man-download-ask (&optional subdir)
+ "Downloads the Erlang man pages into the
+\"cache/erlang_mode_man_pages\" subdirectory under the user's
+Emacs directory, if the man pages haven't been downloaded
+already. This function ask the user to confirm before downloading
+and lets the user edit the download URL. The function
+erlang-man-download downloads the man pages without prompting the
+user."
+ (interactive)
+ (if (y-or-n-p "Could not find Erlang man pages on your system. Do you want to download them?")
+ (let ((download-url (read-string "URL to download man pages from: " erlang-man-download-url)))
+ (concat (directory-file-name (erlang-man-download download-url)) (or subdir "")))))
+
+
+(defun erlang-man-dir (subdir &optional no-download)
+ (let ((default-man-dir (if erlang-root-dir
+ (concat (directory-file-name (concat
+ (file-name-as-directory erlang-root-dir)
+ (file-name-as-directory "lib")
+ (file-name-as-directory "erlang")))
+ subdir)))
+ (alt-man-dir (if erlang-root-dir
+ (concat (directory-file-name erlang-root-dir) subdir)))
+ (downloaded-man-dir (erlang-man-user-local-emacs-dir)))
+ (if (and erlang-root-dir (file-directory-p default-man-dir))
+ default-man-dir
+ (if (and erlang-root-dir (file-directory-p alt-man-dir))
+ alt-man-dir
+ (if (file-directory-p (concat (directory-file-name downloaded-man-dir) subdir))
+ (concat (directory-file-name downloaded-man-dir) subdir)
+ (and (not no-download) (erlang-man-download-ask subdir)))))))
;; Should the menu be to long, let's split it into a number of
;; smaller menus. Warning, this code contains beautiful
@@ -2043,31 +2141,23 @@ This function is aware of imported functions."
;; chosen to keep it since it provides a very useful functionality
;; which is not possible to achieve using a clean approach.
;; / AndersL
+;;
+;; The previous hack seems to have broken in Emacs 25. This is fixed
+;; by trying to find the function in the man buffer a few times with a
+;; delay in between (see function
+;; erlang-man-repeated-search-for-function). This fix is also a hack
+;; but it should be quite robust and will work even if the function
+;; that erlang-man-function-display-man-page tries to hook into
+;; disappears or changes.
(defvar erlang-man-function-name nil
"Name of function for last `erlang-man-function' call.
Used for communication between `erlang-man-function' and the
patch to `Man-notify-when-ready'.")
-(defun erlang-man-function (&optional name)
- "Find manual page for NAME, where NAME is module:function.
-The entry for `function' is displayed.
-
-This function is aware of imported functions."
- (interactive
- (list (let* ((default (erlang-default-function-or-module))
- (input (read-string
- (format
- "Manual entry for `module:func' or `module'%s: "
- (if default
- (format " (default %s)" default)
- "")))))
- (if (string= input "")
- default
- input))))
- (require 'man)
- (setq name (or name
- (erlang-default-function-or-module)))
+(defun erlang-man-function-display-man-page (name)
+ "Helper function for erlang-man-function. Displays the man page
+ text for the Erlang function named name if it can be found."
(let ((modname nil)
(funcname nil))
(cond ((string-match ":" name)
@@ -2078,7 +2168,7 @@ This function is aware of imported functions."
(when (or (null modname) (string= modname ""))
(error "No Erlang module name given"))
(cond ((fboundp 'Man-notify-when-ready)
- ;; Emacs 19: The man command could possibly start an
+ ;; From Emacs 19: The man command could possibly start an
;; asynchronous process, i.e. we must hook ourselves into
;; the system to be activated when the man-process
;; terminates.
@@ -2093,9 +2183,92 @@ This function is aware of imported functions."
(t
(erlang-man-module modname)
(when funcname
- (erlang-man-find-function (current-buffer) funcname))))))
+ (erlang-man-repeated-search-for-function nil
+ funcname
+ modname))))))
+
+(defun erlang-man-function (&optional name)
+ "Find manual page for NAME, where NAME is module:function.
+The entry for `function' is displayed.
+
+This function is aware of imported functions."
+ (interactive
+ (list (let* ((default (erlang-default-function-or-module))
+ (input (read-string
+ (format
+ "Manual entry for `module:func' or `module'%s: "
+ (if default
+ (format " (default %s)" default)
+ "")))))
+ (if (string= input "")
+ default
+ input))))
+ (require 'man)
+ (setq name (or name
+ (erlang-default-function-or-module)))
+ (erlang-man-function-display-man-page name))
+(defun erlang-man-function-no-prompt ()
+ "Find manual page for the function under the cursor.
+The man entry for `function' is displayed. This function
+provides the same functionality as erlang-man-function except for
+that it does not ask the user to confirm the function name before
+opening the man page for the function."
+ (interactive)
+ (let ((name (erlang-default-function-or-module)))
+ (if name
+ (erlang-man-function name)
+ (error "No function name under the cursor"))))
+
+(defun erlang-man-repeated-search-for-function (man-buffer
+ function-name
+ &optional
+ module-name)
+ "This function tries to scroll MAN-BUFFER to the documentation
+of function FUNCTION-NAME. The function will try again a few
+times if the documentation for FUNCTION-NAME can't be found. This
+is necessary as the man page is loaded asynchronously from Emacs
+19 and the correct function to hook into depends on the Emacs
+version. The function will automatically try to find the correct
+buffer from the list of opened buffers if MAN-BUFFER is nil. The
+optional parameter MODULE-NAME will make the search for the
+buffer more accurate."
+ (let* ((time-between-attempts 0.5)
+ (max-wait-time 5.1)
+ (search-for-function
+ (lambda (self
+ time-waited
+ time-between-attempts
+ max-wait-time
+ man-buffer
+ function-name
+ module-name
+ )
+ (when (and (not (erlang-man-find-function man-buffer function-name module-name))
+ (<= (+ time-waited time-between-attempts)
+ max-wait-time))
+ (message "Finding function %s..." function-name)
+ ; Call this function again later
+ (run-at-time time-between-attempts nil
+ self
+ self
+ (+ time-waited time-between-attempts)
+ time-between-attempts
+ max-wait-time
+ man-buffer
+ function-name
+ module-name)
+ ))))
+ (funcall search-for-function
+ search-for-function
+ 0.0
+ time-between-attempts
+ max-wait-time
+ man-buffer
+ function-name
+ module-name)))
+
;; Should the defadvice be at the top level, the package `advice' would
;; be required. Now it is only required when this functionality
;; is used. (Emacs 19 specific.)
@@ -2118,25 +2291,57 @@ command is executed asynchronously."
"Set point at the documentation of the function name in
`erlang-man-function-name' when the man page is displayed."
(if erlang-man-function-name
- (erlang-man-find-function (ad-get-arg 0) erlang-man-function-name))
- (setq erlang-man-function-name nil)))
-
-
-(defun erlang-man-find-function (buf func)
- "Find manual page for function in `erlang-man-function-name' in buffer BUF."
- (if func
- (let ((win (get-buffer-window buf)))
- (if win
- (progn
- (set-buffer buf)
- (goto-char (point-min))
- (if (re-search-forward
- (concat "^[ \t]+" func " ?(")
- (point-max) t)
- (progn
- (forward-word -1)
- (set-window-point win (point)))
- (message "Could not find function `%s'" func)))))))
+ (erlang-man-repeated-search-for-function (ad-get-arg 0)
+ erlang-man-function-name)
+ (setq erlang-man-function-name nil))))
+
+
+
+
+(defun erlang-man-find-function (buf func &optional module-name)
+ "Find manual page for function `erlang-man-function-name' in buffer BUF.
+The function will automatically try to find the correct buffer among the
+opened buffers if BUF is nil. The optional parameter MODULE-NAME will make
+the search for the buffer more accurate."
+ (let ((buffer (or buf
+ (progn
+ ; find buffer containing man page
+ (require 'cl-lib)
+ (car (cl-remove-if-not (lambda (buf)
+ (string-match
+ (or module-name "")
+ (format "%s" buf)))
+ (cl-remove-if-not
+ (lambda (buf)
+ (string-match
+ "[Mm][Aa][Nn]"
+ (format "%s" buf)))
+ (buffer-list))))))))
+ (if (and func buffer)
+ (let ((win (get-buffer-window buffer)))
+ (if win
+ (progn
+ (set-buffer buffer)
+ (goto-char (point-min))
+ (if (re-search-forward
+ (concat "^[ \t]*\\([a-z0-9_]*[ \t]*:\\)?[ \t]*" func "[ \t]*([A-Za-z0-9 \t:,_()]*)[ \t]*->")
+ (point-max) t)
+ (progn
+ (forward-word -1)
+ (set-window-point win (point))
+ (message "Found documentation for function `%s'" func)
+ t)
+ (if (re-search-forward
+ (concat "^[ \t]*\\([a-z0-9_]*[ \t]*:\\)?[ \t]*" func "[ \t]*\(")
+ (point-max) t)
+ (progn
+ (forward-word -1)
+ (set-window-point win (point))
+ (message "Found documentation for function `%s'" func)
+ t)
+ (progn
+ (message "Could not find function `%s'" func)
+ nil)))))))))
(defvar erlang-man-file-regexp
"\\(.*\\)/man[^/]*/\\([^.]+\\)\\.\\([124-9]\\|3\\(erl\\)?\\)\\(\\.gz\\)?$")
@@ -2175,8 +2380,19 @@ the site init file:
For example:
(setq erlang-root-dir \"/usr/local/erlang\")
-After installing the line, kill and restart Emacs, or restart Erlang
-mode with the command `M-x erlang-mode RET'.")))
+Alternatively, you can download the Erlang man pages
+automatically by placing the following lines in your Emacs init
+file or by executing the Emacs command `M-x
+erlang-man-download-ask RET' (the download URL can be customized
+with the Emacs variable erlang-man-download-url):
+
+ (require 'erlang)
+ (erlang-man-download)
+
+After installing the line/lines in your Emacs init file or after
+running the command `M-x erlang-man-download-ask RET', kill and
+restart Emacs, or restart Erlang mode with the command `M-x
+erlang-mode RET'.")))
;; Skeleton code:
@@ -2679,8 +2895,9 @@ Value is list (stack token-start token-type in-what)."
(if stack
(forward-char 1)
(forward-char 6)
- (skip-chars-forward "^(\n")
(erlang-push (list 'spec (point) (current-column)) stack)
+ (skip-chars-forward "^(\n")
+ (erlang-push (list 'spec_arg (point) (current-column)) stack)
))
;; Type spec delimiter
@@ -2797,7 +3014,7 @@ Return nil if inside string, t if in a comment."
(t
(erlang-indent-to-first-element stack-top 2))))
- ((memq (car stack-top) '(icr fun spec))
+ ((memq (car stack-top) '(icr fun spec_arg))
;; The default indentation is the column of the option
;; directly following the keyword. (This does not apply to
;; `case'.) Should no option be on the same line, the
@@ -2844,10 +3061,11 @@ Return nil if inside string, t if in a comment."
((eq (car stack-top) '->)
;; If in fun definition use standard indent level not double
;;(if (not (eq (car (car (cdr stack))) 'fun))
- ;; Removed it made multi clause fun's look too bad
- (setq off (+ erlang-indent-level (if (not erlang-icr-indent)
- erlang-indent-level
- erlang-icr-indent)))))
+ ;; Removed it made multi clause Named fun's look too bad
+ (setq off (+ erlang-indent-level
+ (if (not erlang-icr-indent)
+ erlang-indent-level
+ erlang-icr-indent)))))
(let ((base (erlang-indent-find-base stack indent-point off skip)))
;; Special cases
(goto-char indent-point)
@@ -2873,6 +3091,10 @@ Return nil if inside string, t if in a comment."
(erlang-caddr (car stack))
0)))
(t (erlang-indent-standard indent-point token base 'nil))))) ;; old catch
+ ;; Indent result types
+ ((eq (car (car (cdr stack))) 'spec_arg)
+ (setq base (+ (erlang-caddr (car (last stack))) erlang-indent-level))
+ (erlang-indent-standard indent-point token base 'nil))
(t
(erlang-indent-standard indent-point token base 'nil)
))))
diff --git a/lib/tools/test/emacs_SUITE_data/type_specs b/lib/tools/test/emacs_SUITE_data/type_specs
index e71841cc7a..f9b15d7914 100644
--- a/lib/tools/test/emacs_SUITE_data/type_specs
+++ b/lib/tools/test/emacs_SUITE_data/type_specs
@@ -71,11 +71,14 @@
-spec t1(FooBar :: t99()) -> t99();
(t2()) -> t2();
(t4()) -> t4() when is_subtype(t4(), t24);
- (t23()) -> t23() when is_subtype(t23(), atom()),
- is_subtype(t23(), t14());
- (t24()) -> t24() when is_subtype(t24(), atom()),
- is_subtype(t24(), t14()),
- is_subtype(t24(), t4()).
+ (t23()) ->
+ t23() when is_subtype(t23(), atom()),
+ is_subtype(t23(), t14());
+ (t24()) ->
+ t24() when
+ is_subtype(t24(), atom()),
+ is_subtype(t24(), t14()),
+ is_subtype(t24(), t4()).
-spec over(I :: integer()) -> R1 :: foo:typen();
(A :: atom()) -> R2 :: foo:atomen();
@@ -83,23 +86,24 @@
-spec mod:t2() -> any().
--spec handle_cast(Cast :: {'exchange', node(), [[name(),...]]}
- | {'del_member', name(), pid()},
- #state{}) -> {'noreply', #state{}}.
+-spec handle_cast(
+ Cast :: {'exchange', node(), [[name(),...]]}
+ | {'del_member', name(), pid()},
+ #state{}) -> {'noreply', #state{}}.
-spec handle_cast(Cast ::
{'exchange', node(), [[name(),...]]}
| {'del_member', name(), pid()},
#state{}) ->
- {'noreply', #state{}}. %% left to col 10?
+ {'noreply', #state{}}.
-spec all(fun((T) -> boolean()), List :: [T]) ->
- boolean() when is_subtype(T, term()). % (*)
+ boolean() when is_subtype(T, term()). % (*)
-spec get_closest_pid(term()) ->
- Return :: pid() %% left to col 10?
- | {'error', {'no_process', term()}} %% left to col 10?
- | {'no_such_group', term()}. %% left to col 10?
+ Return :: pid()
+ | {'error', {'no_process', term()}} %% left to col 10?
+ | {'no_such_group', term()}. %% left to col 10?
-spec add( X :: integer()
, Y :: integer()
diff --git a/lib/wx/api_gen/wx_extra/added_func.h b/lib/wx/api_gen/wx_extra/added_func.h
index 28fecbf454..6ceed571f0 100644
--- a/lib/wx/api_gen/wx_extra/added_func.h
+++ b/lib/wx/api_gen/wx_extra/added_func.h
@@ -50,3 +50,11 @@ class wxDisplay {
// get the resolution of this monitor in pixels per inch
wxSize GetPPI() const;
};
+
+class wxMenuBar {
+ public:
+ // MacSpecific API
+ wxMenu *OSXGetAppleMenu() const { return m_appleMenu; }
+ static void SetAutoWindowMenu( bool enable ) { s_macAutoWindowMenu = enable ; }
+ static bool GetAutoWindowMenu() { return s_macAutoWindowMenu ; }
+}
diff --git a/lib/wx/api_gen/wxapi.conf b/lib/wx/api_gen/wxapi.conf
index 9707fedf67..c870f7afd6 100644
--- a/lib/wx/api_gen/wxapi.conf
+++ b/lib/wx/api_gen/wxapi.conf
@@ -161,6 +161,7 @@
'GetVirtualSize','GetWindowStyleFlag','GetWindowVariant','HasCapture','HasScrollbar',
'HasTransparentBackground','Hide','InheritAttributes','InitDialog',
'InvalidateBestSize','IsEnabled','IsExposed','IsRetained','IsShown','IsTopLevel',
+ 'IsShownOnScreen',
'Layout','LineDown','LineUp','Lower','MakeModal','Move','MoveAfterInTabOrder',
'MoveBeforeInTabOrder','Navigate',%'OnInternalIdle',
'PageDown','PageUp',
@@ -189,7 +190,7 @@
{'SetTransparent', [{test_if, "wxCHECK_VERSION(2,8,12)"}]},
{'CanSetTransparent', [{test_if, "wxCHECK_VERSION(2,8,12)"}]},
{'IsDoubleBuffered', [{test_if, "wxCHECK_VERSION(3,0,0)"}]},
- {'SetDoubleBuffered', [{test_if, "wxCHECK_VERSION(3,0,0) && !defined(__WXMAC__)"}]},
+ {'SetDoubleBuffered', [{test_if, "wxCHECK_VERSION(3,0,0) || (defined(__WXMAC__) && wxCHECK_VERSION(3,1,0))"}]},
{'GetContentScaleFactor', [{test_if, "wxCHECK_VERSION(2,9,5)"}]}
]}.
@@ -483,6 +484,9 @@
'wxMenuBar','~wxMenuBar','Append','Check','Enable','EnableTop',
'FindMenu', 'FindMenuItem',{'FindItem', [{"menu",skip}]},'GetHelpString',
'GetLabel','GetLabelTop','GetMenu','GetMenuCount','Insert','IsChecked',
+ {'SetAutoWindowMenu', [{test_if, "wxCHECK_VERSION(3,0,0) && defined(__WXMAC__)"}]},
+ {'GetAutoWindowMenu', [{test_if, "wxCHECK_VERSION(3,0,0) && defined(__WXMAC__)"}]},
+ {'OSXGetAppleMenu', [{test_if, "wxCHECK_VERSION(3,0,0) && defined(__WXMAC__)"}]},
'IsEnabled',%'Refresh',
'Remove','Replace','SetHelpString',
'SetLabel','SetLabelTop']}.
diff --git a/lib/wx/c_src/gen/wxe_funcs.cpp b/lib/wx/c_src/gen/wxe_funcs.cpp
index 32e4bf855b..309d1c8f45 100644
--- a/lib/wx/c_src/gen/wxe_funcs.cpp
+++ b/lib/wx/c_src/gen/wxe_funcs.cpp
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2008-2018. All Rights Reserved.
+ * Copyright Ericsson AB 2008-2019. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -846,6 +846,13 @@ case wxWindow_IsTopLevel: { // wxWindow::IsTopLevel
rt.addBool(Result);
break;
}
+case wxWindow_IsShownOnScreen: { // wxWindow::IsShownOnScreen
+ wxWindow *This = (wxWindow *) getPtr(bp,memenv); bp += 4;
+ if(!This) throw wxe_badarg(0);
+ bool Result = This->IsShownOnScreen();
+ rt.addBool(Result);
+ break;
+}
case wxWindow_Layout: { // wxWindow::Layout
wxWindow *This = (wxWindow *) getPtr(bp,memenv); bp += 4;
if(!This) throw wxe_badarg(0);
@@ -1707,7 +1714,7 @@ case wxWindow_IsDoubleBuffered: { // wxWindow::IsDoubleBuffered
break;
}
#endif
-#if wxCHECK_VERSION(3,0,0) && !defined(__WXMAC__)
+#if wxCHECK_VERSION(3,0,0) || (defined(__WXMAC__) && wxCHECK_VERSION(3,1,0))
case wxWindow_SetDoubleBuffered: { // wxWindow::SetDoubleBuffered
wxWindow *This = (wxWindow *) getPtr(bp,memenv); bp += 4;
bool * on = (bool *) bp; bp += 4;
@@ -7336,6 +7343,29 @@ case wxMenuBar_IsChecked: { // wxMenuBar::IsChecked
rt.addBool(Result);
break;
}
+#if wxCHECK_VERSION(3,0,0) && defined(__WXMAC__)
+case wxMenuBar_SetAutoWindowMenu: { // wxMenuBar::SetAutoWindowMenu
+ bool * enable = (bool *) bp; bp += 4;
+ wxMenuBar::SetAutoWindowMenu(*enable);
+ break;
+}
+#endif
+#if wxCHECK_VERSION(3,0,0) && defined(__WXMAC__)
+case wxMenuBar_GetAutoWindowMenu: { // wxMenuBar::GetAutoWindowMenu
+ bool Result = wxMenuBar::GetAutoWindowMenu();
+ rt.addBool(Result);
+ break;
+}
+#endif
+#if wxCHECK_VERSION(3,0,0) && defined(__WXMAC__)
+case wxMenuBar_OSXGetAppleMenu: { // wxMenuBar::OSXGetAppleMenu
+ wxMenuBar *This = (wxMenuBar *) getPtr(bp,memenv); bp += 4;
+ if(!This) throw wxe_badarg(0);
+ wxMenu * Result = (wxMenu*)This->OSXGetAppleMenu();
+ rt.addRef(getRef((void *)Result,memenv), "wxMenu");
+ break;
+}
+#endif
case wxMenuBar_IsEnabled_1: { // wxMenuBar::IsEnabled
wxMenuBar *This = (wxMenuBar *) getPtr(bp,memenv); bp += 4;
int * itemid = (int *) bp; bp += 4;
diff --git a/lib/wx/c_src/gen/wxe_macros.h b/lib/wx/c_src/gen/wxe_macros.h
index c23e8a83bd..9e8df1c259 100644
--- a/lib/wx/c_src/gen/wxe_macros.h
+++ b/lib/wx/c_src/gen/wxe_macros.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2008-2018. All Rights Reserved.
+ * Copyright Ericsson AB 2008-2019. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -163,3286 +163,3290 @@
#define wxWindow_IsRetained 198
#define wxWindow_IsShown 199
#define wxWindow_IsTopLevel 200
-#define wxWindow_Layout 201
-#define wxWindow_LineDown 202
-#define wxWindow_LineUp 203
-#define wxWindow_Lower 204
-#define wxWindow_MakeModal 205
-#define wxWindow_Move_3 206
-#define wxWindow_Move_2 207
-#define wxWindow_MoveAfterInTabOrder 208
-#define wxWindow_MoveBeforeInTabOrder 209
-#define wxWindow_Navigate 210
-#define wxWindow_PageDown 211
-#define wxWindow_PageUp 212
-#define wxWindow_PopEventHandler 213
-#define wxWindow_PopupMenu_2 214
-#define wxWindow_PopupMenu_3 215
-#define wxWindow_Raise 216
-#define wxWindow_Refresh 217
-#define wxWindow_RefreshRect 218
-#define wxWindow_ReleaseMouse 219
-#define wxWindow_RemoveChild 220
-#define wxWindow_Reparent 221
-#define wxWindow_ScreenToClient_2 222
-#define wxWindow_ScreenToClient_1 223
-#define wxWindow_ScrollLines 225
-#define wxWindow_ScrollPages 227
-#define wxWindow_ScrollWindow 228
-#define wxWindow_SetAcceleratorTable 229
-#define wxWindow_SetAutoLayout 230
-#define wxWindow_SetBackgroundColour 231
-#define wxWindow_SetBackgroundStyle 232
-#define wxWindow_SetCaret 233
-#define wxWindow_SetClientSize_2 234
-#define wxWindow_SetClientSize_1_0 235
-#define wxWindow_SetClientSize_1_1 236
-#define wxWindow_SetContainingSizer 237
-#define wxWindow_SetCursor 238
-#define wxWindow_SetMaxSize 239
-#define wxWindow_SetMinSize 240
-#define wxWindow_SetOwnBackgroundColour 241
-#define wxWindow_SetOwnFont 242
-#define wxWindow_SetOwnForegroundColour 243
-#define wxWindow_SetDropTarget 244
-#define wxWindow_SetExtraStyle 245
-#define wxWindow_SetFocus 246
-#define wxWindow_SetFocusFromKbd 247
-#define wxWindow_SetFont 248
-#define wxWindow_SetForegroundColour 249
-#define wxWindow_SetHelpText 250
-#define wxWindow_SetId 251
-#define wxWindow_SetLabel 253
-#define wxWindow_SetName 254
-#define wxWindow_SetPalette 255
-#define wxWindow_SetScrollbar 256
-#define wxWindow_SetScrollPos 257
-#define wxWindow_SetSize_5 258
-#define wxWindow_SetSize_2_0 259
-#define wxWindow_SetSize_1 260
-#define wxWindow_SetSize_2_1 261
-#define wxWindow_SetSizeHints_3 262
-#define wxWindow_SetSizeHints_2 263
-#define wxWindow_SetSizer 264
-#define wxWindow_SetSizerAndFit 265
-#define wxWindow_SetThemeEnabled 266
-#define wxWindow_SetToolTip_1_0 267
-#define wxWindow_SetToolTip_1_1 268
-#define wxWindow_SetVirtualSize_1 269
-#define wxWindow_SetVirtualSize_2 270
-#define wxWindow_SetVirtualSizeHints_3 271
-#define wxWindow_SetVirtualSizeHints_2 272
-#define wxWindow_SetWindowStyle 273
-#define wxWindow_SetWindowStyleFlag 274
-#define wxWindow_SetWindowVariant 275
-#define wxWindow_ShouldInheritColours 276
-#define wxWindow_Show 277
-#define wxWindow_Thaw 278
-#define wxWindow_TransferDataFromWindow 279
-#define wxWindow_TransferDataToWindow 280
-#define wxWindow_Update 281
-#define wxWindow_UpdateWindowUI 282
-#define wxWindow_Validate 283
-#define wxWindow_WarpPointer 284
-#define wxWindow_SetTransparent 285
-#define wxWindow_CanSetTransparent 286
-#define wxWindow_IsDoubleBuffered 287
-#define wxWindow_SetDoubleBuffered 288
-#define wxWindow_GetContentScaleFactor 289
-#define wxTopLevelWindow_GetIcon 290
-#define wxTopLevelWindow_GetIcons 291
-#define wxTopLevelWindow_GetTitle 292
-#define wxTopLevelWindow_IsActive 293
-#define wxTopLevelWindow_Iconize 294
-#define wxTopLevelWindow_IsFullScreen 295
-#define wxTopLevelWindow_IsIconized 296
-#define wxTopLevelWindow_IsMaximized 297
-#define wxTopLevelWindow_Maximize 298
-#define wxTopLevelWindow_RequestUserAttention 299
-#define wxTopLevelWindow_SetIcon 300
-#define wxTopLevelWindow_SetIcons 301
-#define wxTopLevelWindow_CenterOnScreen 302
-#define wxTopLevelWindow_CentreOnScreen 303
-#define wxTopLevelWindow_SetShape 305
-#define wxTopLevelWindow_SetTitle 306
-#define wxTopLevelWindow_ShowFullScreen 307
-#define wxFrame_new_4 309
-#define wxFrame_new_0 310
-#define wxFrame_destruct 312
-#define wxFrame_Create 313
-#define wxFrame_CreateStatusBar 314
-#define wxFrame_CreateToolBar 315
-#define wxFrame_GetClientAreaOrigin 316
-#define wxFrame_GetMenuBar 317
-#define wxFrame_GetStatusBar 318
-#define wxFrame_GetStatusBarPane 319
-#define wxFrame_GetToolBar 320
-#define wxFrame_ProcessCommand 321
-#define wxFrame_SendSizeEvent 322
-#define wxFrame_SetMenuBar 323
-#define wxFrame_SetStatusBar 324
-#define wxFrame_SetStatusBarPane 325
-#define wxFrame_SetStatusText 326
-#define wxFrame_SetStatusWidths 327
-#define wxFrame_SetToolBar 328
-#define wxMiniFrame_new_0 329
-#define wxMiniFrame_new_4 330
-#define wxMiniFrame_Create 331
-#define wxMiniFrame_destroy 332
-#define wxSplashScreen_new_0 333
-#define wxSplashScreen_new_6 334
-#define wxSplashScreen_destruct 335
-#define wxSplashScreen_GetSplashStyle 336
-#define wxSplashScreen_GetTimeout 337
-#define wxPanel_new_0 338
-#define wxPanel_new_6 339
-#define wxPanel_new_2 340
-#define wxPanel_destruct 341
-#define wxPanel_InitDialog 342
-#define wxPanel_SetFocusIgnoringChildren 343
-#define wxScrolledWindow_new_0 344
-#define wxScrolledWindow_new_2 345
-#define wxScrolledWindow_destruct 346
-#define wxScrolledWindow_CalcScrolledPosition_4 347
-#define wxScrolledWindow_CalcScrolledPosition_1 348
-#define wxScrolledWindow_CalcUnscrolledPosition_4 349
-#define wxScrolledWindow_CalcUnscrolledPosition_1 350
-#define wxScrolledWindow_EnableScrolling 351
-#define wxScrolledWindow_GetScrollPixelsPerUnit 352
-#define wxScrolledWindow_GetViewStart 353
-#define wxScrolledWindow_DoPrepareDC 354
-#define wxScrolledWindow_PrepareDC 355
-#define wxScrolledWindow_Scroll 356
-#define wxScrolledWindow_SetScrollbars 357
-#define wxScrolledWindow_SetScrollRate 358
-#define wxScrolledWindow_SetTargetWindow 359
-#define wxSashWindow_new_0 360
-#define wxSashWindow_new_2 361
-#define wxSashWindow_destruct 362
-#define wxSashWindow_GetSashVisible 363
-#define wxSashWindow_GetMaximumSizeX 364
-#define wxSashWindow_GetMaximumSizeY 365
-#define wxSashWindow_GetMinimumSizeX 366
-#define wxSashWindow_GetMinimumSizeY 367
-#define wxSashWindow_SetMaximumSizeX 368
-#define wxSashWindow_SetMaximumSizeY 369
-#define wxSashWindow_SetMinimumSizeX 370
-#define wxSashWindow_SetMinimumSizeY 371
-#define wxSashWindow_SetSashVisible 372
-#define wxSashLayoutWindow_new_0 373
-#define wxSashLayoutWindow_new_2 374
-#define wxSashLayoutWindow_Create 375
-#define wxSashLayoutWindow_GetAlignment 376
-#define wxSashLayoutWindow_GetOrientation 377
-#define wxSashLayoutWindow_SetAlignment 378
-#define wxSashLayoutWindow_SetDefaultSize 379
-#define wxSashLayoutWindow_SetOrientation 380
-#define wxSashLayoutWindow_destroy 381
-#define wxGrid_new_0 382
-#define wxGrid_new_3 383
-#define wxGrid_new_4 384
-#define wxGrid_destruct 385
-#define wxGrid_AppendCols 386
-#define wxGrid_AppendRows 387
-#define wxGrid_AutoSize 388
-#define wxGrid_AutoSizeColumn 389
-#define wxGrid_AutoSizeColumns 390
-#define wxGrid_AutoSizeRow 391
-#define wxGrid_AutoSizeRows 392
-#define wxGrid_BeginBatch 393
-#define wxGrid_BlockToDeviceRect 394
-#define wxGrid_CanDragColSize 395
-#define wxGrid_CanDragRowSize 396
-#define wxGrid_CanDragGridSize 397
-#define wxGrid_CanEnableCellControl 398
-#define wxGrid_CellToRect_2 399
-#define wxGrid_CellToRect_1 400
-#define wxGrid_ClearGrid 401
-#define wxGrid_ClearSelection 402
-#define wxGrid_CreateGrid 403
-#define wxGrid_DeleteCols 404
-#define wxGrid_DeleteRows 405
-#define wxGrid_DisableCellEditControl 406
-#define wxGrid_DisableDragColSize 407
-#define wxGrid_DisableDragGridSize 408
-#define wxGrid_DisableDragRowSize 409
-#define wxGrid_EnableCellEditControl 410
-#define wxGrid_EnableDragColSize 411
-#define wxGrid_EnableDragGridSize 412
-#define wxGrid_EnableDragRowSize 413
-#define wxGrid_EnableEditing 414
-#define wxGrid_EnableGridLines 415
-#define wxGrid_EndBatch 416
-#define wxGrid_Fit 417
-#define wxGrid_ForceRefresh 418
-#define wxGrid_GetBatchCount 419
-#define wxGrid_GetCellAlignment 420
-#define wxGrid_GetCellBackgroundColour 421
-#define wxGrid_GetCellEditor 422
-#define wxGrid_GetCellFont 423
-#define wxGrid_GetCellRenderer 424
-#define wxGrid_GetCellTextColour 425
-#define wxGrid_GetCellValue_2 426
-#define wxGrid_GetCellValue_1 427
-#define wxGrid_GetColLabelAlignment 428
-#define wxGrid_GetColLabelSize 429
-#define wxGrid_GetColLabelValue 430
-#define wxGrid_GetColMinimalAcceptableWidth 431
-#define wxGrid_GetDefaultCellAlignment 432
-#define wxGrid_GetDefaultCellBackgroundColour 433
-#define wxGrid_GetDefaultCellFont 434
-#define wxGrid_GetDefaultCellTextColour 435
-#define wxGrid_GetDefaultColLabelSize 436
-#define wxGrid_GetDefaultColSize 437
-#define wxGrid_GetDefaultEditor 438
-#define wxGrid_GetDefaultEditorForCell_2 439
-#define wxGrid_GetDefaultEditorForCell_1 440
-#define wxGrid_GetDefaultEditorForType 441
-#define wxGrid_GetDefaultRenderer 442
-#define wxGrid_GetDefaultRendererForCell 443
-#define wxGrid_GetDefaultRendererForType 444
-#define wxGrid_GetDefaultRowLabelSize 445
-#define wxGrid_GetDefaultRowSize 446
-#define wxGrid_GetGridCursorCol 447
-#define wxGrid_GetGridCursorRow 448
-#define wxGrid_GetGridLineColour 449
-#define wxGrid_GridLinesEnabled 450
-#define wxGrid_GetLabelBackgroundColour 451
-#define wxGrid_GetLabelFont 452
-#define wxGrid_GetLabelTextColour 453
-#define wxGrid_GetNumberCols 454
-#define wxGrid_GetNumberRows 455
-#define wxGrid_GetOrCreateCellAttr 456
-#define wxGrid_GetRowMinimalAcceptableHeight 457
-#define wxGrid_GetRowLabelAlignment 458
-#define wxGrid_GetRowLabelSize 459
-#define wxGrid_GetRowLabelValue 460
-#define wxGrid_GetRowSize 461
-#define wxGrid_GetScrollLineX 462
-#define wxGrid_GetScrollLineY 463
-#define wxGrid_GetSelectedCells 464
-#define wxGrid_GetSelectedCols 465
-#define wxGrid_GetSelectedRows 466
-#define wxGrid_GetSelectionBackground 467
-#define wxGrid_GetSelectionBlockTopLeft 468
-#define wxGrid_GetSelectionBlockBottomRight 469
-#define wxGrid_GetSelectionForeground 470
-#define wxGrid_GetViewWidth 471
-#define wxGrid_GetGridWindow 472
-#define wxGrid_GetGridRowLabelWindow 473
-#define wxGrid_GetGridColLabelWindow 474
-#define wxGrid_GetGridCornerLabelWindow 475
-#define wxGrid_HideCellEditControl 476
-#define wxGrid_InsertCols 477
-#define wxGrid_InsertRows 478
-#define wxGrid_IsCellEditControlEnabled 479
-#define wxGrid_IsCurrentCellReadOnly 480
-#define wxGrid_IsEditable 481
-#define wxGrid_IsInSelection_2 482
-#define wxGrid_IsInSelection_1 483
-#define wxGrid_IsReadOnly 484
-#define wxGrid_IsSelection 485
-#define wxGrid_IsVisible_3 486
-#define wxGrid_IsVisible_2 487
-#define wxGrid_MakeCellVisible_2 488
-#define wxGrid_MakeCellVisible_1 489
-#define wxGrid_MoveCursorDown 490
-#define wxGrid_MoveCursorLeft 491
-#define wxGrid_MoveCursorRight 492
-#define wxGrid_MoveCursorUp 493
-#define wxGrid_MoveCursorDownBlock 494
-#define wxGrid_MoveCursorLeftBlock 495
-#define wxGrid_MoveCursorRightBlock 496
-#define wxGrid_MoveCursorUpBlock 497
-#define wxGrid_MovePageDown 498
-#define wxGrid_MovePageUp 499
-#define wxGrid_RegisterDataType 500
-#define wxGrid_SaveEditControlValue 501
-#define wxGrid_SelectAll 502
-#define wxGrid_SelectBlock_5 503
-#define wxGrid_SelectBlock_3 504
-#define wxGrid_SelectCol 505
-#define wxGrid_SelectRow 506
-#define wxGrid_SetCellAlignment_4 507
-#define wxGrid_SetCellAlignment_3 508
-#define wxGrid_SetCellAlignment_1 509
-#define wxGrid_SetCellBackgroundColour_3_0 510
-#define wxGrid_SetCellBackgroundColour_1 511
-#define wxGrid_SetCellBackgroundColour_3_1 512
-#define wxGrid_SetCellEditor 513
-#define wxGrid_SetCellFont 514
-#define wxGrid_SetCellRenderer 515
-#define wxGrid_SetCellTextColour_3_0 516
-#define wxGrid_SetCellTextColour_3_1 517
-#define wxGrid_SetCellTextColour_1 518
-#define wxGrid_SetCellValue_3_0 519
-#define wxGrid_SetCellValue_2 520
-#define wxGrid_SetCellValue_3_1 521
-#define wxGrid_SetColAttr 522
-#define wxGrid_SetColFormatBool 523
-#define wxGrid_SetColFormatNumber 524
-#define wxGrid_SetColFormatFloat 525
-#define wxGrid_SetColFormatCustom 526
-#define wxGrid_SetColLabelAlignment 527
-#define wxGrid_SetColLabelSize 528
-#define wxGrid_SetColLabelValue 529
-#define wxGrid_SetColMinimalWidth 530
-#define wxGrid_SetColMinimalAcceptableWidth 531
-#define wxGrid_SetColSize 532
-#define wxGrid_SetDefaultCellAlignment 533
-#define wxGrid_SetDefaultCellBackgroundColour 534
-#define wxGrid_SetDefaultCellFont 535
-#define wxGrid_SetDefaultCellTextColour 536
-#define wxGrid_SetDefaultEditor 537
-#define wxGrid_SetDefaultRenderer 538
-#define wxGrid_SetDefaultColSize 539
-#define wxGrid_SetDefaultRowSize 540
-#define wxGrid_SetGridCursor 541
-#define wxGrid_SetGridLineColour 542
-#define wxGrid_SetLabelBackgroundColour 543
-#define wxGrid_SetLabelFont 544
-#define wxGrid_SetLabelTextColour 545
-#define wxGrid_SetMargins 546
-#define wxGrid_SetReadOnly 547
-#define wxGrid_SetRowAttr 548
-#define wxGrid_SetRowLabelAlignment 549
-#define wxGrid_SetRowLabelSize 550
-#define wxGrid_SetRowLabelValue 551
-#define wxGrid_SetRowMinimalHeight 552
-#define wxGrid_SetRowMinimalAcceptableHeight 553
-#define wxGrid_SetRowSize 554
-#define wxGrid_SetScrollLineX 555
-#define wxGrid_SetScrollLineY 556
-#define wxGrid_SetSelectionBackground 557
-#define wxGrid_SetSelectionForeground 558
-#define wxGrid_SetSelectionMode 559
-#define wxGrid_ShowCellEditControl 560
-#define wxGrid_XToCol 561
-#define wxGrid_XToEdgeOfCol 562
-#define wxGrid_YToEdgeOfRow 563
-#define wxGrid_YToRow 564
-#define wxGridCellRenderer_Draw 565
-#define wxGridCellRenderer_GetBestSize 566
-#define wxGridCellEditor_Create 567
-#define wxGridCellEditor_IsCreated 568
-#define wxGridCellEditor_SetSize 569
-#define wxGridCellEditor_Show 570
-#define wxGridCellEditor_PaintBackground 571
-#define wxGridCellEditor_BeginEdit 572
-#define wxGridCellEditor_EndEdit 573
-#define wxGridCellEditor_Reset 574
-#define wxGridCellEditor_StartingKey 575
-#define wxGridCellEditor_StartingClick 576
-#define wxGridCellEditor_HandleReturn 577
-#define wxGridCellBoolRenderer_new 578
-#define wxGridCellBoolRenderer_destroy 579
-#define wxGridCellBoolEditor_new 580
-#define wxGridCellBoolEditor_IsTrueValue 581
-#define wxGridCellBoolEditor_UseStringValues 582
-#define wxGridCellBoolEditor_destroy 583
-#define wxGridCellFloatRenderer_new 584
-#define wxGridCellFloatRenderer_GetPrecision 585
-#define wxGridCellFloatRenderer_GetWidth 586
-#define wxGridCellFloatRenderer_SetParameters 587
-#define wxGridCellFloatRenderer_SetPrecision 588
-#define wxGridCellFloatRenderer_SetWidth 589
-#define wxGridCellFloatRenderer_destroy 590
-#define wxGridCellFloatEditor_new 591
-#define wxGridCellFloatEditor_SetParameters 592
-#define wxGridCellFloatEditor_destroy 593
-#define wxGridCellStringRenderer_new 594
-#define wxGridCellStringRenderer_destroy 595
-#define wxGridCellTextEditor_new 596
-#define wxGridCellTextEditor_SetParameters 597
-#define wxGridCellTextEditor_destroy 598
-#define wxGridCellChoiceEditor_new 600
-#define wxGridCellChoiceEditor_SetParameters 601
-#define wxGridCellChoiceEditor_destroy 602
-#define wxGridCellNumberRenderer_new 603
-#define wxGridCellNumberRenderer_destroy 604
-#define wxGridCellNumberEditor_new 605
-#define wxGridCellNumberEditor_GetValue 606
-#define wxGridCellNumberEditor_SetParameters 607
-#define wxGridCellNumberEditor_destroy 608
-#define wxGridCellAttr_SetTextColour 609
-#define wxGridCellAttr_SetBackgroundColour 610
-#define wxGridCellAttr_SetFont 611
-#define wxGridCellAttr_SetAlignment 612
-#define wxGridCellAttr_SetReadOnly 613
-#define wxGridCellAttr_SetRenderer 614
-#define wxGridCellAttr_SetEditor 615
-#define wxGridCellAttr_HasTextColour 616
-#define wxGridCellAttr_HasBackgroundColour 617
-#define wxGridCellAttr_HasFont 618
-#define wxGridCellAttr_HasAlignment 619
-#define wxGridCellAttr_HasRenderer 620
-#define wxGridCellAttr_HasEditor 621
-#define wxGridCellAttr_GetTextColour 622
-#define wxGridCellAttr_GetBackgroundColour 623
-#define wxGridCellAttr_GetFont 624
-#define wxGridCellAttr_GetAlignment 625
-#define wxGridCellAttr_GetRenderer 626
-#define wxGridCellAttr_GetEditor 627
-#define wxGridCellAttr_IsReadOnly 628
-#define wxGridCellAttr_SetDefAttr 629
-#define wxDC_Blit 630
-#define wxDC_CalcBoundingBox 631
-#define wxDC_Clear 632
-#define wxDC_ComputeScaleAndOrigin 633
-#define wxDC_CrossHair 634
-#define wxDC_DestroyClippingRegion 635
-#define wxDC_DeviceToLogicalX 636
-#define wxDC_DeviceToLogicalXRel 637
-#define wxDC_DeviceToLogicalY 638
-#define wxDC_DeviceToLogicalYRel 639
-#define wxDC_DrawArc 640
-#define wxDC_DrawBitmap 641
-#define wxDC_DrawCheckMark 642
-#define wxDC_DrawCircle 643
-#define wxDC_DrawEllipse_2 645
-#define wxDC_DrawEllipse_1 646
-#define wxDC_DrawEllipticArc 647
-#define wxDC_DrawIcon 648
-#define wxDC_DrawLabel 649
-#define wxDC_DrawLine 650
-#define wxDC_DrawLines 651
-#define wxDC_DrawPolygon 653
-#define wxDC_DrawPoint 655
-#define wxDC_DrawRectangle_2 657
-#define wxDC_DrawRectangle_1 658
-#define wxDC_DrawRotatedText 659
-#define wxDC_DrawRoundedRectangle_3 661
-#define wxDC_DrawRoundedRectangle_2 662
-#define wxDC_DrawText 663
-#define wxDC_EndDoc 664
-#define wxDC_EndPage 665
-#define wxDC_FloodFill 666
-#define wxDC_GetBackground 667
-#define wxDC_GetBackgroundMode 668
-#define wxDC_GetBrush 669
-#define wxDC_GetCharHeight 670
-#define wxDC_GetCharWidth 671
-#define wxDC_GetClippingBox 672
-#define wxDC_GetFont 674
-#define wxDC_GetLayoutDirection 675
-#define wxDC_GetLogicalFunction 676
-#define wxDC_GetMapMode 677
-#define wxDC_GetMultiLineTextExtent_4 678
-#define wxDC_GetMultiLineTextExtent_1 679
-#define wxDC_GetPartialTextExtents 680
-#define wxDC_GetPen 681
-#define wxDC_GetPixel 682
-#define wxDC_GetPPI 683
-#define wxDC_GetSize 685
-#define wxDC_GetSizeMM 687
-#define wxDC_GetTextBackground 688
-#define wxDC_GetTextExtent_4 689
-#define wxDC_GetTextExtent_1 690
-#define wxDC_GetTextForeground 692
-#define wxDC_GetUserScale 693
-#define wxDC_GradientFillConcentric_3 694
-#define wxDC_GradientFillConcentric_4 695
-#define wxDC_GradientFillLinear 696
-#define wxDC_LogicalToDeviceX 697
-#define wxDC_LogicalToDeviceXRel 698
-#define wxDC_LogicalToDeviceY 699
-#define wxDC_LogicalToDeviceYRel 700
-#define wxDC_MaxX 701
-#define wxDC_MaxY 702
-#define wxDC_MinX 703
-#define wxDC_MinY 704
-#define wxDC_IsOk 705
-#define wxDC_ResetBoundingBox 706
-#define wxDC_SetAxisOrientation 707
-#define wxDC_SetBackground 708
-#define wxDC_SetBackgroundMode 709
-#define wxDC_SetBrush 710
-#define wxDC_SetClippingRegion_2 712
-#define wxDC_SetClippingRegion_1_1 713
-#define wxDC_SetClippingRegion_1_0 714
-#define wxDC_SetDeviceOrigin 715
-#define wxDC_SetFont 716
-#define wxDC_SetLayoutDirection 717
-#define wxDC_SetLogicalFunction 718
-#define wxDC_SetMapMode 719
-#define wxDC_SetPalette 720
-#define wxDC_SetPen 721
-#define wxDC_SetTextBackground 722
-#define wxDC_SetTextForeground 723
-#define wxDC_SetUserScale 724
-#define wxDC_StartDoc 725
-#define wxDC_StartPage 726
-#define wxMirrorDC_new 727
-#define wxMirrorDC_destroy 728
-#define wxScreenDC_new 729
-#define wxScreenDC_destruct 730
-#define wxPostScriptDC_new_0 731
-#define wxPostScriptDC_new_1 732
-#define wxPostScriptDC_destruct 733
-#define wxPostScriptDC_SetResolution 734
-#define wxPostScriptDC_GetResolution 735
-#define wxWindowDC_new_0 736
-#define wxWindowDC_new_1 737
-#define wxWindowDC_destruct 738
-#define wxClientDC_new_0 739
-#define wxClientDC_new_1 740
-#define wxClientDC_destroy 741
-#define wxPaintDC_new_0 742
-#define wxPaintDC_new_1 743
-#define wxPaintDC_destroy 744
-#define wxMemoryDC_new_1_0 746
-#define wxMemoryDC_new_1_1 747
-#define wxMemoryDC_new_0 748
-#define wxMemoryDC_destruct 750
-#define wxMemoryDC_SelectObject 751
-#define wxMemoryDC_SelectObjectAsSource 752
-#define wxBufferedDC_new_0 753
-#define wxBufferedDC_new_2 754
-#define wxBufferedDC_new_3 755
-#define wxBufferedDC_destruct 756
-#define wxBufferedDC_Init_2 757
-#define wxBufferedDC_Init_3 758
-#define wxBufferedPaintDC_new_3 759
-#define wxBufferedPaintDC_new_2 760
-#define wxBufferedPaintDC_destruct 761
-#define wxGraphicsObject_destruct 762
-#define wxGraphicsObject_GetRenderer 763
-#define wxGraphicsObject_IsNull 764
-#define wxGraphicsContext_destruct 765
-#define wxGraphicsContext_Create_1_1 766
-#define wxGraphicsContext_Create_1_0 767
-#define wxGraphicsContext_Create_0 768
-#define wxGraphicsContext_CreatePen 769
-#define wxGraphicsContext_CreateBrush 770
-#define wxGraphicsContext_CreateRadialGradientBrush 771
-#define wxGraphicsContext_CreateLinearGradientBrush 772
-#define wxGraphicsContext_CreateFont 773
-#define wxGraphicsContext_CreateMatrix 774
-#define wxGraphicsContext_CreatePath 775
-#define wxGraphicsContext_Clip_1 776
-#define wxGraphicsContext_Clip_4 777
-#define wxGraphicsContext_ResetClip 778
-#define wxGraphicsContext_DrawBitmap 779
-#define wxGraphicsContext_DrawEllipse 780
-#define wxGraphicsContext_DrawIcon 781
-#define wxGraphicsContext_DrawLines 782
-#define wxGraphicsContext_DrawPath 783
-#define wxGraphicsContext_DrawRectangle 784
-#define wxGraphicsContext_DrawRoundedRectangle 785
-#define wxGraphicsContext_DrawText_3 786
-#define wxGraphicsContext_DrawText_4_0 787
-#define wxGraphicsContext_DrawText_4_1 788
-#define wxGraphicsContext_DrawText_5 789
-#define wxGraphicsContext_FillPath 790
-#define wxGraphicsContext_StrokePath 791
-#define wxGraphicsContext_GetPartialTextExtents 792
-#define wxGraphicsContext_GetTextExtent 793
-#define wxGraphicsContext_Rotate 794
-#define wxGraphicsContext_Scale 795
-#define wxGraphicsContext_Translate 796
-#define wxGraphicsContext_GetTransform 797
-#define wxGraphicsContext_SetTransform 798
-#define wxGraphicsContext_ConcatTransform 799
-#define wxGraphicsContext_SetBrush_1_1 800
-#define wxGraphicsContext_SetBrush_1_0 801
-#define wxGraphicsContext_SetFont_1 802
-#define wxGraphicsContext_SetFont_2 803
-#define wxGraphicsContext_SetPen_1_0 804
-#define wxGraphicsContext_SetPen_1_1 805
-#define wxGraphicsContext_StrokeLine 806
-#define wxGraphicsContext_StrokeLines 807
-#define wxGraphicsMatrix_Concat 809
-#define wxGraphicsMatrix_Get 811
-#define wxGraphicsMatrix_Invert 812
-#define wxGraphicsMatrix_IsEqual 813
-#define wxGraphicsMatrix_IsIdentity 815
-#define wxGraphicsMatrix_Rotate 816
-#define wxGraphicsMatrix_Scale 817
-#define wxGraphicsMatrix_Translate 818
-#define wxGraphicsMatrix_Set 819
-#define wxGraphicsMatrix_TransformPoint 820
-#define wxGraphicsMatrix_TransformDistance 821
-#define wxGraphicsPath_MoveToPoint_2 822
-#define wxGraphicsPath_MoveToPoint_1 823
-#define wxGraphicsPath_AddArc_6 824
-#define wxGraphicsPath_AddArc_5 825
-#define wxGraphicsPath_AddArcToPoint 826
-#define wxGraphicsPath_AddCircle 827
-#define wxGraphicsPath_AddCurveToPoint_6 828
-#define wxGraphicsPath_AddCurveToPoint_3 829
-#define wxGraphicsPath_AddEllipse 830
-#define wxGraphicsPath_AddLineToPoint_2 831
-#define wxGraphicsPath_AddLineToPoint_1 832
-#define wxGraphicsPath_AddPath 833
-#define wxGraphicsPath_AddQuadCurveToPoint 834
-#define wxGraphicsPath_AddRectangle 835
-#define wxGraphicsPath_AddRoundedRectangle 836
-#define wxGraphicsPath_CloseSubpath 837
-#define wxGraphicsPath_Contains_3 838
-#define wxGraphicsPath_Contains_2 839
-#define wxGraphicsPath_GetBox 841
-#define wxGraphicsPath_GetCurrentPoint 843
-#define wxGraphicsPath_Transform 844
-#define wxGraphicsRenderer_GetDefaultRenderer 845
-#define wxGraphicsRenderer_CreateContext_1_1 846
-#define wxGraphicsRenderer_CreateContext_1_0 847
-#define wxGraphicsRenderer_CreatePen 848
-#define wxGraphicsRenderer_CreateBrush 849
-#define wxGraphicsRenderer_CreateLinearGradientBrush 850
-#define wxGraphicsRenderer_CreateRadialGradientBrush 851
-#define wxGraphicsRenderer_CreateFont 852
-#define wxGraphicsRenderer_CreateMatrix 853
-#define wxGraphicsRenderer_CreatePath 854
-#define wxMenuBar_new_1 856
-#define wxMenuBar_new_0 858
-#define wxMenuBar_destruct 860
-#define wxMenuBar_Append 861
-#define wxMenuBar_Check 862
-#define wxMenuBar_Enable_2 863
-#define wxMenuBar_Enable_1 864
-#define wxMenuBar_EnableTop 865
-#define wxMenuBar_FindMenu 866
-#define wxMenuBar_FindMenuItem 867
-#define wxMenuBar_FindItem 868
-#define wxMenuBar_GetHelpString 869
-#define wxMenuBar_GetLabel_1 870
-#define wxMenuBar_GetLabel_0 871
-#define wxMenuBar_GetLabelTop 872
-#define wxMenuBar_GetMenu 873
-#define wxMenuBar_GetMenuCount 874
-#define wxMenuBar_Insert 875
-#define wxMenuBar_IsChecked 876
-#define wxMenuBar_IsEnabled_1 877
-#define wxMenuBar_IsEnabled_0 878
-#define wxMenuBar_Remove 879
-#define wxMenuBar_Replace 880
-#define wxMenuBar_SetHelpString 881
-#define wxMenuBar_SetLabel_2 882
-#define wxMenuBar_SetLabel_1 883
-#define wxMenuBar_SetLabelTop 884
-#define wxControl_GetLabel 885
-#define wxControl_SetLabel 886
-#define wxControlWithItems_Append_1 887
-#define wxControlWithItems_Append_2 888
-#define wxControlWithItems_appendStrings_1 889
-#define wxControlWithItems_Clear 890
-#define wxControlWithItems_Delete 891
-#define wxControlWithItems_FindString 892
-#define wxControlWithItems_getClientData 893
-#define wxControlWithItems_setClientData 894
-#define wxControlWithItems_GetCount 895
-#define wxControlWithItems_GetSelection 896
-#define wxControlWithItems_GetString 897
-#define wxControlWithItems_GetStringSelection 898
-#define wxControlWithItems_Insert_2 899
-#define wxControlWithItems_Insert_3 900
-#define wxControlWithItems_IsEmpty 901
-#define wxControlWithItems_Select 902
-#define wxControlWithItems_SetSelection 903
-#define wxControlWithItems_SetString 904
-#define wxControlWithItems_SetStringSelection 905
-#define wxMenu_new_2 908
-#define wxMenu_new_1 909
-#define wxMenu_destruct 911
-#define wxMenu_Append_3 912
-#define wxMenu_Append_1 913
-#define wxMenu_Append_4_0 914
-#define wxMenu_Append_4_1 915
-#define wxMenu_AppendCheckItem 916
-#define wxMenu_AppendRadioItem 917
-#define wxMenu_AppendSeparator 918
-#define wxMenu_Break 919
-#define wxMenu_Check 920
-#define wxMenu_Delete_1_0 921
-#define wxMenu_Delete_1_1 922
-#define wxMenu_Destroy_1_0 923
-#define wxMenu_Destroy_1_1 924
-#define wxMenu_Enable 925
-#define wxMenu_FindItem_1 926
-#define wxMenu_FindItem_2 927
-#define wxMenu_FindItemByPosition 928
-#define wxMenu_GetHelpString 929
-#define wxMenu_GetLabel 930
-#define wxMenu_GetMenuItemCount 931
-#define wxMenu_GetMenuItems 932
-#define wxMenu_GetTitle 934
-#define wxMenu_Insert_2 935
-#define wxMenu_Insert_3 936
-#define wxMenu_Insert_5_1 937
-#define wxMenu_Insert_5_0 938
-#define wxMenu_InsertCheckItem 939
-#define wxMenu_InsertRadioItem 940
-#define wxMenu_InsertSeparator 941
-#define wxMenu_IsChecked 942
-#define wxMenu_IsEnabled 943
-#define wxMenu_Prepend_1 944
-#define wxMenu_Prepend_2 945
-#define wxMenu_Prepend_4_1 946
-#define wxMenu_Prepend_4_0 947
-#define wxMenu_PrependCheckItem 948
-#define wxMenu_PrependRadioItem 949
-#define wxMenu_PrependSeparator 950
-#define wxMenu_Remove_1_0 951
-#define wxMenu_Remove_1_1 952
-#define wxMenu_SetHelpString 953
-#define wxMenu_SetLabel 954
-#define wxMenu_SetTitle 955
-#define wxMenuItem_new 956
-#define wxMenuItem_destruct 958
-#define wxMenuItem_Check 959
-#define wxMenuItem_Enable 960
-#define wxMenuItem_GetBitmap 961
-#define wxMenuItem_GetHelp 962
-#define wxMenuItem_GetId 963
-#define wxMenuItem_GetKind 964
-#define wxMenuItem_GetLabel 965
-#define wxMenuItem_GetLabelFromText 966
-#define wxMenuItem_GetMenu 967
-#define wxMenuItem_GetText 968
-#define wxMenuItem_GetSubMenu 969
-#define wxMenuItem_IsCheckable 970
-#define wxMenuItem_IsChecked 971
-#define wxMenuItem_IsEnabled 972
-#define wxMenuItem_IsSeparator 973
-#define wxMenuItem_IsSubMenu 974
-#define wxMenuItem_SetBitmap 975
-#define wxMenuItem_SetHelp 976
-#define wxMenuItem_SetMenu 977
-#define wxMenuItem_SetSubMenu 978
-#define wxMenuItem_SetText 979
-#define wxToolBar_AddControl 980
-#define wxToolBar_AddSeparator 981
-#define wxToolBar_AddTool_5 982
-#define wxToolBar_AddTool_4_0 983
-#define wxToolBar_AddTool_1 984
-#define wxToolBar_AddTool_4_1 985
-#define wxToolBar_AddTool_3 986
-#define wxToolBar_AddTool_6 987
-#define wxToolBar_AddCheckTool 988
-#define wxToolBar_AddRadioTool 989
-#define wxToolBar_AddStretchableSpace 990
-#define wxToolBar_InsertStretchableSpace 991
-#define wxToolBar_DeleteTool 992
-#define wxToolBar_DeleteToolByPos 993
-#define wxToolBar_EnableTool 994
-#define wxToolBar_FindById 995
-#define wxToolBar_FindControl 996
-#define wxToolBar_FindToolForPosition 997
-#define wxToolBar_GetToolSize 998
-#define wxToolBar_GetToolBitmapSize 999
-#define wxToolBar_GetMargins 1000
-#define wxToolBar_GetToolEnabled 1001
-#define wxToolBar_GetToolLongHelp 1002
-#define wxToolBar_GetToolPacking 1003
-#define wxToolBar_GetToolPos 1004
-#define wxToolBar_GetToolSeparation 1005
-#define wxToolBar_GetToolShortHelp 1006
-#define wxToolBar_GetToolState 1007
-#define wxToolBar_InsertControl 1008
-#define wxToolBar_InsertSeparator 1009
-#define wxToolBar_InsertTool_5 1010
-#define wxToolBar_InsertTool_2 1011
-#define wxToolBar_InsertTool_4 1012
-#define wxToolBar_Realize 1013
-#define wxToolBar_RemoveTool 1014
-#define wxToolBar_SetMargins 1015
-#define wxToolBar_SetToolBitmapSize 1016
-#define wxToolBar_SetToolLongHelp 1017
-#define wxToolBar_SetToolPacking 1018
-#define wxToolBar_SetToolShortHelp 1019
-#define wxToolBar_SetToolSeparation 1020
-#define wxToolBar_ToggleTool 1021
-#define wxStatusBar_new_0 1023
-#define wxStatusBar_new_2 1024
-#define wxStatusBar_destruct 1026
-#define wxStatusBar_Create 1027
-#define wxStatusBar_GetFieldRect 1028
-#define wxStatusBar_GetFieldsCount 1029
-#define wxStatusBar_GetStatusText 1030
-#define wxStatusBar_PopStatusText 1031
-#define wxStatusBar_PushStatusText 1032
-#define wxStatusBar_SetFieldsCount 1033
-#define wxStatusBar_SetMinHeight 1034
-#define wxStatusBar_SetStatusText 1035
-#define wxStatusBar_SetStatusWidths 1036
-#define wxStatusBar_SetStatusStyles 1037
-#define wxBitmap_new_0 1038
-#define wxBitmap_new_3 1039
-#define wxBitmap_new_4 1040
-#define wxBitmap_new_2_0 1041
-#define wxBitmap_new_2_1 1042
-#define wxBitmap_destruct 1043
-#define wxBitmap_ConvertToImage 1044
-#define wxBitmap_CopyFromIcon 1045
-#define wxBitmap_Create 1046
-#define wxBitmap_GetDepth 1047
-#define wxBitmap_GetHeight 1048
-#define wxBitmap_GetPalette 1049
-#define wxBitmap_GetMask 1050
-#define wxBitmap_GetWidth 1051
-#define wxBitmap_GetSubBitmap 1052
-#define wxBitmap_LoadFile 1053
-#define wxBitmap_Ok 1054
-#define wxBitmap_SaveFile 1055
-#define wxBitmap_SetDepth 1056
-#define wxBitmap_SetHeight 1057
-#define wxBitmap_SetMask 1058
-#define wxBitmap_SetPalette 1059
-#define wxBitmap_SetWidth 1060
-#define wxIcon_new_0 1061
-#define wxIcon_new_2 1062
-#define wxIcon_new_1 1063
-#define wxIcon_CopyFromBitmap 1064
-#define wxIcon_destroy 1065
-#define wxIconBundle_new_0 1066
-#define wxIconBundle_new_2 1067
-#define wxIconBundle_new_1_0 1068
-#define wxIconBundle_new_1_1 1069
-#define wxIconBundle_destruct 1070
-#define wxIconBundle_AddIcon_2 1071
-#define wxIconBundle_AddIcon_1 1072
-#define wxIconBundle_GetIcon_1_1 1073
-#define wxIconBundle_GetIcon_1_0 1074
-#define wxCursor_new_0 1075
-#define wxCursor_new_1_0 1076
-#define wxCursor_new_1_1 1077
-#define wxCursor_new_4 1078
-#define wxCursor_destruct 1079
-#define wxCursor_Ok 1080
-#define wxMask_new_0 1081
-#define wxMask_new_2_1 1082
-#define wxMask_new_2_0 1083
-#define wxMask_new_1 1084
-#define wxMask_destruct 1085
-#define wxMask_Create_2_1 1086
-#define wxMask_Create_2_0 1087
-#define wxMask_Create_1 1088
-#define wxImage_new_0 1089
-#define wxImage_new_3_0 1090
-#define wxImage_new_4 1091
-#define wxImage_new_5 1092
-#define wxImage_new_2 1093
-#define wxImage_new_3_1 1094
-#define wxImage_Blur 1095
-#define wxImage_BlurHorizontal 1096
-#define wxImage_BlurVertical 1097
-#define wxImage_ConvertAlphaToMask 1098
-#define wxImage_ConvertToGreyscale 1099
-#define wxImage_ConvertToMono 1100
-#define wxImage_Copy 1101
-#define wxImage_Create_3 1102
-#define wxImage_Create_4 1103
-#define wxImage_Create_5 1104
-#define wxImage_Destroy 1105
-#define wxImage_FindFirstUnusedColour 1106
-#define wxImage_GetImageExtWildcard 1107
-#define wxImage_GetAlpha_2 1108
-#define wxImage_GetAlpha_0 1109
-#define wxImage_GetBlue 1110
-#define wxImage_GetData 1111
-#define wxImage_GetGreen 1112
-#define wxImage_GetImageCount 1113
-#define wxImage_GetHeight 1114
-#define wxImage_GetMaskBlue 1115
-#define wxImage_GetMaskGreen 1116
-#define wxImage_GetMaskRed 1117
-#define wxImage_GetOrFindMaskColour 1118
-#define wxImage_GetPalette 1119
-#define wxImage_GetRed 1120
-#define wxImage_GetSubImage 1121
-#define wxImage_GetWidth 1122
-#define wxImage_HasAlpha 1123
-#define wxImage_HasMask 1124
-#define wxImage_GetOption 1125
-#define wxImage_GetOptionInt 1126
-#define wxImage_HasOption 1127
-#define wxImage_InitAlpha 1128
-#define wxImage_InitStandardHandlers 1129
-#define wxImage_IsTransparent 1130
-#define wxImage_LoadFile_2 1131
-#define wxImage_LoadFile_3 1132
-#define wxImage_Ok 1133
-#define wxImage_RemoveHandler 1134
-#define wxImage_Mirror 1135
-#define wxImage_Replace 1136
-#define wxImage_Rescale 1137
-#define wxImage_Resize 1138
-#define wxImage_Rotate 1139
-#define wxImage_RotateHue 1140
-#define wxImage_Rotate90 1141
-#define wxImage_SaveFile_1 1142
-#define wxImage_SaveFile_2_0 1143
-#define wxImage_SaveFile_2_1 1144
-#define wxImage_Scale 1145
-#define wxImage_Size 1146
-#define wxImage_SetAlpha_3 1147
-#define wxImage_SetAlpha_2 1148
-#define wxImage_SetData_2 1149
-#define wxImage_SetData_4 1150
-#define wxImage_SetMask 1151
-#define wxImage_SetMaskColour 1152
-#define wxImage_SetMaskFromImage 1153
-#define wxImage_SetOption_2_1 1154
-#define wxImage_SetOption_2_0 1155
-#define wxImage_SetPalette 1156
-#define wxImage_SetRGB_5 1157
-#define wxImage_SetRGB_4 1158
-#define wxImage_destroy 1159
-#define wxBrush_new_0 1160
-#define wxBrush_new_2 1161
-#define wxBrush_new_1 1162
-#define wxBrush_destruct 1164
-#define wxBrush_GetColour 1165
-#define wxBrush_GetStipple 1166
-#define wxBrush_GetStyle 1167
-#define wxBrush_IsHatch 1168
-#define wxBrush_IsOk 1169
-#define wxBrush_SetColour_1 1170
-#define wxBrush_SetColour_3 1171
-#define wxBrush_SetStipple 1172
-#define wxBrush_SetStyle 1173
-#define wxPen_new_0 1174
-#define wxPen_new_2 1175
-#define wxPen_destruct 1176
-#define wxPen_GetCap 1177
-#define wxPen_GetColour 1178
-#define wxPen_GetJoin 1179
-#define wxPen_GetStyle 1180
-#define wxPen_GetWidth 1181
-#define wxPen_IsOk 1182
-#define wxPen_SetCap 1183
-#define wxPen_SetColour_1 1184
-#define wxPen_SetColour_3 1185
-#define wxPen_SetJoin 1186
-#define wxPen_SetStyle 1187
-#define wxPen_SetWidth 1188
-#define wxRegion_new_0 1189
-#define wxRegion_new_4 1190
-#define wxRegion_new_2 1191
-#define wxRegion_new_1_1 1192
-#define wxRegion_new_1_0 1194
-#define wxRegion_destruct 1196
-#define wxRegion_Clear 1197
-#define wxRegion_Contains_2 1198
-#define wxRegion_Contains_1_0 1199
-#define wxRegion_Contains_4 1200
-#define wxRegion_Contains_1_1 1201
-#define wxRegion_ConvertToBitmap 1202
-#define wxRegion_GetBox 1203
-#define wxRegion_Intersect_4 1204
-#define wxRegion_Intersect_1_1 1205
-#define wxRegion_Intersect_1_0 1206
-#define wxRegion_IsEmpty 1207
-#define wxRegion_Subtract_4 1208
-#define wxRegion_Subtract_1_1 1209
-#define wxRegion_Subtract_1_0 1210
-#define wxRegion_Offset_2 1211
-#define wxRegion_Offset_1 1212
-#define wxRegion_Union_4 1213
-#define wxRegion_Union_1_2 1214
-#define wxRegion_Union_1_1 1215
-#define wxRegion_Union_1_0 1216
-#define wxRegion_Union_3 1217
-#define wxRegion_Xor_4 1218
-#define wxRegion_Xor_1_1 1219
-#define wxRegion_Xor_1_0 1220
-#define wxAcceleratorTable_new_0 1221
-#define wxAcceleratorTable_new_2 1222
-#define wxAcceleratorTable_destruct 1223
-#define wxAcceleratorTable_Ok 1224
-#define wxAcceleratorEntry_new_1_0 1225
-#define wxAcceleratorEntry_new_1_1 1226
-#define wxAcceleratorEntry_GetCommand 1227
-#define wxAcceleratorEntry_GetFlags 1228
-#define wxAcceleratorEntry_GetKeyCode 1229
-#define wxAcceleratorEntry_Set 1230
-#define wxAcceleratorEntry_destroy 1231
-#define wxCaret_new_3 1236
-#define wxCaret_new_2 1237
-#define wxCaret_destruct 1239
-#define wxCaret_Create_3 1240
-#define wxCaret_Create_2 1241
-#define wxCaret_GetBlinkTime 1242
-#define wxCaret_GetPosition 1244
-#define wxCaret_GetSize 1246
-#define wxCaret_GetWindow 1247
-#define wxCaret_Hide 1248
-#define wxCaret_IsOk 1249
-#define wxCaret_IsVisible 1250
-#define wxCaret_Move_2 1251
-#define wxCaret_Move_1 1252
-#define wxCaret_SetBlinkTime 1253
-#define wxCaret_SetSize_2 1254
-#define wxCaret_SetSize_1 1255
-#define wxCaret_Show 1256
-#define wxSizer_Add_2_1 1257
-#define wxSizer_Add_2_0 1258
-#define wxSizer_Add_3 1259
-#define wxSizer_Add_2_3 1260
-#define wxSizer_Add_2_2 1261
-#define wxSizer_AddSpacer 1262
-#define wxSizer_AddStretchSpacer 1263
-#define wxSizer_CalcMin 1264
-#define wxSizer_Clear 1265
-#define wxSizer_Detach_1_2 1266
-#define wxSizer_Detach_1_1 1267
-#define wxSizer_Detach_1_0 1268
-#define wxSizer_Fit 1269
-#define wxSizer_FitInside 1270
-#define wxSizer_GetChildren 1271
-#define wxSizer_GetItem_2_1 1272
-#define wxSizer_GetItem_2_0 1273
-#define wxSizer_GetItem_1 1274
-#define wxSizer_GetSize 1275
-#define wxSizer_GetPosition 1276
-#define wxSizer_GetMinSize 1277
-#define wxSizer_Hide_2_0 1278
-#define wxSizer_Hide_2_1 1279
-#define wxSizer_Hide_1 1280
-#define wxSizer_Insert_3_1 1281
-#define wxSizer_Insert_3_0 1282
-#define wxSizer_Insert_4 1283
-#define wxSizer_Insert_3_3 1284
-#define wxSizer_Insert_3_2 1285
-#define wxSizer_Insert_2 1286
-#define wxSizer_InsertSpacer 1287
-#define wxSizer_InsertStretchSpacer 1288
-#define wxSizer_IsShown_1_2 1289
-#define wxSizer_IsShown_1_1 1290
-#define wxSizer_IsShown_1_0 1291
-#define wxSizer_Layout 1292
-#define wxSizer_Prepend_2_1 1293
-#define wxSizer_Prepend_2_0 1294
-#define wxSizer_Prepend_3 1295
-#define wxSizer_Prepend_2_3 1296
-#define wxSizer_Prepend_2_2 1297
-#define wxSizer_Prepend_1 1298
-#define wxSizer_PrependSpacer 1299
-#define wxSizer_PrependStretchSpacer 1300
-#define wxSizer_RecalcSizes 1301
-#define wxSizer_Remove_1_1 1302
-#define wxSizer_Remove_1_0 1303
-#define wxSizer_Replace_3_1 1304
-#define wxSizer_Replace_3_0 1305
-#define wxSizer_Replace_2 1306
-#define wxSizer_SetDimension 1307
-#define wxSizer_SetMinSize_2 1308
-#define wxSizer_SetMinSize_1 1309
-#define wxSizer_SetItemMinSize_3_2 1310
-#define wxSizer_SetItemMinSize_2_2 1311
-#define wxSizer_SetItemMinSize_3_1 1312
-#define wxSizer_SetItemMinSize_2_1 1313
-#define wxSizer_SetItemMinSize_3_0 1314
-#define wxSizer_SetItemMinSize_2_0 1315
-#define wxSizer_SetSizeHints 1316
-#define wxSizer_SetVirtualSizeHints 1317
-#define wxSizer_Show_2_2 1318
-#define wxSizer_Show_2_1 1319
-#define wxSizer_Show_2_0 1320
-#define wxSizer_Show_1 1321
-#define wxSizerFlags_new 1322
-#define wxSizerFlags_Align 1323
-#define wxSizerFlags_Border_2 1324
-#define wxSizerFlags_Border_1 1325
-#define wxSizerFlags_Center 1326
-#define wxSizerFlags_Centre 1327
-#define wxSizerFlags_Expand 1328
-#define wxSizerFlags_Left 1329
-#define wxSizerFlags_Proportion 1330
-#define wxSizerFlags_Right 1331
-#define wxSizerFlags_destroy 1332
-#define wxSizerItem_new_5_1 1333
-#define wxSizerItem_new_2_1 1334
-#define wxSizerItem_new_5_0 1335
-#define wxSizerItem_new_2_0 1336
-#define wxSizerItem_new_6 1337
-#define wxSizerItem_new_3 1338
-#define wxSizerItem_new_0 1339
-#define wxSizerItem_destruct 1340
-#define wxSizerItem_CalcMin 1341
-#define wxSizerItem_DeleteWindows 1342
-#define wxSizerItem_DetachSizer 1343
-#define wxSizerItem_GetBorder 1344
-#define wxSizerItem_GetFlag 1345
-#define wxSizerItem_GetMinSize 1346
-#define wxSizerItem_GetPosition 1347
-#define wxSizerItem_GetProportion 1348
-#define wxSizerItem_GetRatio 1349
-#define wxSizerItem_GetRect 1350
-#define wxSizerItem_GetSize 1351
-#define wxSizerItem_GetSizer 1352
-#define wxSizerItem_GetSpacer 1353
-#define wxSizerItem_GetUserData 1354
-#define wxSizerItem_GetWindow 1355
-#define wxSizerItem_IsSizer 1356
-#define wxSizerItem_IsShown 1357
-#define wxSizerItem_IsSpacer 1358
-#define wxSizerItem_IsWindow 1359
-#define wxSizerItem_SetBorder 1360
-#define wxSizerItem_SetDimension 1361
-#define wxSizerItem_SetFlag 1362
-#define wxSizerItem_SetInitSize 1363
-#define wxSizerItem_SetMinSize_1 1364
-#define wxSizerItem_SetMinSize_2 1365
-#define wxSizerItem_SetProportion 1366
-#define wxSizerItem_SetRatio_2 1367
-#define wxSizerItem_SetRatio_1_1 1368
-#define wxSizerItem_SetRatio_1_0 1369
-#define wxSizerItem_SetSizer 1370
-#define wxSizerItem_SetSpacer_1 1371
-#define wxSizerItem_SetSpacer_2 1372
-#define wxSizerItem_SetWindow 1373
-#define wxSizerItem_Show 1374
-#define wxBoxSizer_new 1375
-#define wxBoxSizer_GetOrientation 1376
-#define wxBoxSizer_destroy 1377
-#define wxStaticBoxSizer_new_2 1378
-#define wxStaticBoxSizer_new_3 1379
-#define wxStaticBoxSizer_GetStaticBox 1380
-#define wxStaticBoxSizer_destroy 1381
-#define wxGridSizer_new_4 1382
-#define wxGridSizer_new_2 1383
-#define wxGridSizer_GetCols 1384
-#define wxGridSizer_GetHGap 1385
-#define wxGridSizer_GetRows 1386
-#define wxGridSizer_GetVGap 1387
-#define wxGridSizer_SetCols 1388
-#define wxGridSizer_SetHGap 1389
-#define wxGridSizer_SetRows 1390
-#define wxGridSizer_SetVGap 1391
-#define wxGridSizer_destroy 1392
-#define wxFlexGridSizer_new_4 1393
-#define wxFlexGridSizer_new_2 1394
-#define wxFlexGridSizer_AddGrowableCol 1395
-#define wxFlexGridSizer_AddGrowableRow 1396
-#define wxFlexGridSizer_GetFlexibleDirection 1397
-#define wxFlexGridSizer_GetNonFlexibleGrowMode 1398
-#define wxFlexGridSizer_RemoveGrowableCol 1399
-#define wxFlexGridSizer_RemoveGrowableRow 1400
-#define wxFlexGridSizer_SetFlexibleDirection 1401
-#define wxFlexGridSizer_SetNonFlexibleGrowMode 1402
-#define wxFlexGridSizer_destroy 1403
-#define wxGridBagSizer_new 1404
-#define wxGridBagSizer_Add_3_2 1405
-#define wxGridBagSizer_Add_3_1 1406
-#define wxGridBagSizer_Add_4 1407
-#define wxGridBagSizer_Add_1_0 1408
-#define wxGridBagSizer_Add_2_1 1409
-#define wxGridBagSizer_Add_2_0 1410
-#define wxGridBagSizer_Add_3_0 1411
-#define wxGridBagSizer_Add_1_1 1412
-#define wxGridBagSizer_CalcMin 1413
-#define wxGridBagSizer_CheckForIntersection_2 1414
-#define wxGridBagSizer_CheckForIntersection_3 1415
-#define wxGridBagSizer_FindItem_1_1 1416
-#define wxGridBagSizer_FindItem_1_0 1417
-#define wxGridBagSizer_FindItemAtPoint 1418
-#define wxGridBagSizer_FindItemAtPosition 1419
-#define wxGridBagSizer_FindItemWithData 1420
-#define wxGridBagSizer_GetCellSize 1421
-#define wxGridBagSizer_GetEmptyCellSize 1422
-#define wxGridBagSizer_GetItemPosition_1_2 1423
-#define wxGridBagSizer_GetItemPosition_1_1 1424
-#define wxGridBagSizer_GetItemPosition_1_0 1425
-#define wxGridBagSizer_GetItemSpan_1_2 1426
-#define wxGridBagSizer_GetItemSpan_1_1 1427
-#define wxGridBagSizer_GetItemSpan_1_0 1428
-#define wxGridBagSizer_SetEmptyCellSize 1429
-#define wxGridBagSizer_SetItemPosition_2_2 1430
-#define wxGridBagSizer_SetItemPosition_2_1 1431
-#define wxGridBagSizer_SetItemPosition_2_0 1432
-#define wxGridBagSizer_SetItemSpan_2_2 1433
-#define wxGridBagSizer_SetItemSpan_2_1 1434
-#define wxGridBagSizer_SetItemSpan_2_0 1435
-#define wxGridBagSizer_destroy 1436
-#define wxStdDialogButtonSizer_new 1437
-#define wxStdDialogButtonSizer_AddButton 1438
-#define wxStdDialogButtonSizer_Realize 1439
-#define wxStdDialogButtonSizer_SetAffirmativeButton 1440
-#define wxStdDialogButtonSizer_SetCancelButton 1441
-#define wxStdDialogButtonSizer_SetNegativeButton 1442
-#define wxStdDialogButtonSizer_destroy 1443
-#define wxFont_new_0 1444
-#define wxFont_new_1 1445
-#define wxFont_new_5 1446
-#define wxFont_destruct 1448
-#define wxFont_IsFixedWidth 1449
-#define wxFont_GetDefaultEncoding 1450
-#define wxFont_GetFaceName 1451
-#define wxFont_GetFamily 1452
-#define wxFont_GetNativeFontInfoDesc 1453
-#define wxFont_GetNativeFontInfoUserDesc 1454
-#define wxFont_GetPointSize 1455
-#define wxFont_GetStyle 1456
-#define wxFont_GetUnderlined 1457
-#define wxFont_GetWeight 1458
-#define wxFont_Ok 1459
-#define wxFont_SetDefaultEncoding 1460
-#define wxFont_SetFaceName 1461
-#define wxFont_SetFamily 1462
-#define wxFont_SetPointSize 1463
-#define wxFont_SetStyle 1464
-#define wxFont_SetUnderlined 1465
-#define wxFont_SetWeight 1466
-#define wxToolTip_Enable 1467
-#define wxToolTip_SetDelay 1468
-#define wxToolTip_new 1469
-#define wxToolTip_SetTip 1470
-#define wxToolTip_GetTip 1471
-#define wxToolTip_GetWindow 1472
-#define wxToolTip_destroy 1473
-#define wxButton_new_3 1475
-#define wxButton_new_0 1476
-#define wxButton_destruct 1477
-#define wxButton_Create 1478
-#define wxButton_GetDefaultSize 1479
-#define wxButton_SetDefault 1480
-#define wxButton_SetLabel 1481
-#define wxBitmapButton_new_4 1483
-#define wxBitmapButton_new_0 1484
-#define wxBitmapButton_Create 1485
-#define wxBitmapButton_GetBitmapDisabled 1486
-#define wxBitmapButton_GetBitmapFocus 1488
-#define wxBitmapButton_GetBitmapLabel 1490
-#define wxBitmapButton_GetBitmapSelected 1492
-#define wxBitmapButton_SetBitmapDisabled 1494
-#define wxBitmapButton_SetBitmapFocus 1495
-#define wxBitmapButton_SetBitmapLabel 1496
-#define wxBitmapButton_SetBitmapSelected 1497
-#define wxBitmapButton_destroy 1498
-#define wxToggleButton_new_0 1499
-#define wxToggleButton_new_4 1500
-#define wxToggleButton_Create 1501
-#define wxToggleButton_GetValue 1502
-#define wxToggleButton_SetValue 1503
-#define wxToggleButton_destroy 1504
-#define wxCalendarCtrl_new_0 1505
-#define wxCalendarCtrl_new_3 1506
-#define wxCalendarCtrl_Create 1507
-#define wxCalendarCtrl_destruct 1508
-#define wxCalendarCtrl_SetDate 1509
-#define wxCalendarCtrl_GetDate 1510
-#define wxCalendarCtrl_EnableYearChange 1511
-#define wxCalendarCtrl_EnableMonthChange 1512
-#define wxCalendarCtrl_EnableHolidayDisplay 1513
-#define wxCalendarCtrl_SetHeaderColours 1514
-#define wxCalendarCtrl_GetHeaderColourFg 1515
-#define wxCalendarCtrl_GetHeaderColourBg 1516
-#define wxCalendarCtrl_SetHighlightColours 1517
-#define wxCalendarCtrl_GetHighlightColourFg 1518
-#define wxCalendarCtrl_GetHighlightColourBg 1519
-#define wxCalendarCtrl_SetHolidayColours 1520
-#define wxCalendarCtrl_GetHolidayColourFg 1521
-#define wxCalendarCtrl_GetHolidayColourBg 1522
-#define wxCalendarCtrl_GetAttr 1523
-#define wxCalendarCtrl_SetAttr 1524
-#define wxCalendarCtrl_SetHoliday 1525
-#define wxCalendarCtrl_ResetAttr 1526
-#define wxCalendarCtrl_HitTest 1527
-#define wxCalendarDateAttr_new_0 1528
-#define wxCalendarDateAttr_new_2_1 1529
-#define wxCalendarDateAttr_new_2_0 1530
-#define wxCalendarDateAttr_SetTextColour 1531
-#define wxCalendarDateAttr_SetBackgroundColour 1532
-#define wxCalendarDateAttr_SetBorderColour 1533
-#define wxCalendarDateAttr_SetFont 1534
-#define wxCalendarDateAttr_SetBorder 1535
-#define wxCalendarDateAttr_SetHoliday 1536
-#define wxCalendarDateAttr_HasTextColour 1537
-#define wxCalendarDateAttr_HasBackgroundColour 1538
-#define wxCalendarDateAttr_HasBorderColour 1539
-#define wxCalendarDateAttr_HasFont 1540
-#define wxCalendarDateAttr_HasBorder 1541
-#define wxCalendarDateAttr_IsHoliday 1542
-#define wxCalendarDateAttr_GetTextColour 1543
-#define wxCalendarDateAttr_GetBackgroundColour 1544
-#define wxCalendarDateAttr_GetBorderColour 1545
-#define wxCalendarDateAttr_GetFont 1546
-#define wxCalendarDateAttr_GetBorder 1547
-#define wxCalendarDateAttr_destroy 1548
-#define wxCheckBox_new_4 1550
-#define wxCheckBox_new_0 1551
-#define wxCheckBox_Create 1552
-#define wxCheckBox_GetValue 1553
-#define wxCheckBox_Get3StateValue 1554
-#define wxCheckBox_Is3rdStateAllowedForUser 1555
-#define wxCheckBox_Is3State 1556
-#define wxCheckBox_IsChecked 1557
-#define wxCheckBox_SetValue 1558
-#define wxCheckBox_Set3StateValue 1559
-#define wxCheckBox_destroy 1560
-#define wxCheckListBox_new_0 1561
-#define wxCheckListBox_new_3 1563
-#define wxCheckListBox_Check 1564
-#define wxCheckListBox_IsChecked 1565
-#define wxCheckListBox_destroy 1566
-#define wxChoice_new_3 1569
-#define wxChoice_new_0 1570
-#define wxChoice_destruct 1572
-#define wxChoice_Create 1574
-#define wxChoice_Delete 1575
-#define wxChoice_GetColumns 1576
-#define wxChoice_SetColumns 1577
-#define wxComboBox_new_0 1578
-#define wxComboBox_new_3 1580
-#define wxComboBox_destruct 1581
-#define wxComboBox_Create 1583
-#define wxComboBox_CanCopy 1584
-#define wxComboBox_CanCut 1585
-#define wxComboBox_CanPaste 1586
-#define wxComboBox_CanRedo 1587
-#define wxComboBox_CanUndo 1588
-#define wxComboBox_Copy 1589
-#define wxComboBox_Cut 1590
-#define wxComboBox_GetInsertionPoint 1591
-#define wxComboBox_GetLastPosition 1592
-#define wxComboBox_GetValue 1593
-#define wxComboBox_Paste 1594
-#define wxComboBox_Redo 1595
-#define wxComboBox_Replace 1596
-#define wxComboBox_Remove 1597
-#define wxComboBox_SetInsertionPoint 1598
-#define wxComboBox_SetInsertionPointEnd 1599
-#define wxComboBox_SetSelection_1 1600
-#define wxComboBox_SetSelection_2 1601
-#define wxComboBox_SetValue 1602
-#define wxComboBox_Undo 1603
-#define wxGauge_new_0 1604
-#define wxGauge_new_4 1605
-#define wxGauge_Create 1606
-#define wxGauge_GetRange 1607
-#define wxGauge_GetValue 1608
-#define wxGauge_IsVertical 1609
-#define wxGauge_SetRange 1610
-#define wxGauge_SetValue 1611
-#define wxGauge_Pulse 1612
-#define wxGauge_destroy 1613
-#define wxGenericDirCtrl_new_0 1614
-#define wxGenericDirCtrl_new_2 1615
-#define wxGenericDirCtrl_destruct 1616
-#define wxGenericDirCtrl_Create 1617
-#define wxGenericDirCtrl_Init 1618
-#define wxGenericDirCtrl_CollapseTree 1619
-#define wxGenericDirCtrl_ExpandPath 1620
-#define wxGenericDirCtrl_GetDefaultPath 1621
-#define wxGenericDirCtrl_GetPath 1622
-#define wxGenericDirCtrl_GetFilePath 1623
-#define wxGenericDirCtrl_GetFilter 1624
-#define wxGenericDirCtrl_GetFilterIndex 1625
-#define wxGenericDirCtrl_GetRootId 1626
-#define wxGenericDirCtrl_GetTreeCtrl 1627
-#define wxGenericDirCtrl_ReCreateTree 1628
-#define wxGenericDirCtrl_SetDefaultPath 1629
-#define wxGenericDirCtrl_SetFilter 1630
-#define wxGenericDirCtrl_SetFilterIndex 1631
-#define wxGenericDirCtrl_SetPath 1632
-#define wxStaticBox_new_4 1634
-#define wxStaticBox_new_0 1635
-#define wxStaticBox_Create 1636
-#define wxStaticBox_destroy 1637
-#define wxStaticLine_new_2 1639
-#define wxStaticLine_new_0 1640
-#define wxStaticLine_destruct 1641
-#define wxStaticLine_Create 1642
-#define wxStaticLine_IsVertical 1643
-#define wxStaticLine_GetDefaultSize 1644
-#define wxListBox_new_3 1647
-#define wxListBox_new_0 1648
-#define wxListBox_destruct 1650
-#define wxListBox_Create 1652
-#define wxListBox_Deselect 1653
-#define wxListBox_GetSelections 1654
-#define wxListBox_InsertItems 1655
-#define wxListBox_IsSelected 1656
-#define wxListBox_Set 1657
-#define wxListBox_HitTest 1658
-#define wxListBox_SetFirstItem_1_0 1659
-#define wxListBox_SetFirstItem_1_1 1660
-#define wxListCtrl_new_0 1661
-#define wxListCtrl_new_2 1662
-#define wxListCtrl_Arrange 1663
-#define wxListCtrl_AssignImageList 1664
-#define wxListCtrl_ClearAll 1665
-#define wxListCtrl_Create 1666
-#define wxListCtrl_DeleteAllItems 1667
-#define wxListCtrl_DeleteColumn 1668
-#define wxListCtrl_DeleteItem 1669
-#define wxListCtrl_EditLabel 1670
-#define wxListCtrl_EnsureVisible 1671
-#define wxListCtrl_FindItem_3_0 1672
-#define wxListCtrl_FindItem_3_1 1673
-#define wxListCtrl_GetColumn 1674
-#define wxListCtrl_GetColumnCount 1675
-#define wxListCtrl_GetColumnWidth 1676
-#define wxListCtrl_GetCountPerPage 1677
-#define wxListCtrl_GetEditControl 1678
-#define wxListCtrl_GetImageList 1679
-#define wxListCtrl_GetItem 1680
-#define wxListCtrl_GetItemBackgroundColour 1681
-#define wxListCtrl_GetItemCount 1682
-#define wxListCtrl_GetItemData 1683
-#define wxListCtrl_GetItemFont 1684
-#define wxListCtrl_GetItemPosition 1685
-#define wxListCtrl_GetItemRect 1686
-#define wxListCtrl_GetItemSpacing 1687
-#define wxListCtrl_GetItemState 1688
-#define wxListCtrl_GetItemText 1689
-#define wxListCtrl_GetItemTextColour 1690
-#define wxListCtrl_GetNextItem 1691
-#define wxListCtrl_GetSelectedItemCount 1692
-#define wxListCtrl_GetTextColour 1693
-#define wxListCtrl_GetTopItem 1694
-#define wxListCtrl_GetViewRect 1695
-#define wxListCtrl_HitTest 1696
-#define wxListCtrl_InsertColumn_2 1697
-#define wxListCtrl_InsertColumn_3 1698
-#define wxListCtrl_InsertItem_1 1699
-#define wxListCtrl_InsertItem_2_1 1700
-#define wxListCtrl_InsertItem_2_0 1701
-#define wxListCtrl_InsertItem_3 1702
-#define wxListCtrl_RefreshItem 1703
-#define wxListCtrl_RefreshItems 1704
-#define wxListCtrl_ScrollList 1705
-#define wxListCtrl_SetBackgroundColour 1706
-#define wxListCtrl_SetColumn 1707
-#define wxListCtrl_SetColumnWidth 1708
-#define wxListCtrl_SetImageList 1709
-#define wxListCtrl_SetItem_1 1710
-#define wxListCtrl_SetItem_4 1711
-#define wxListCtrl_SetItemBackgroundColour 1712
-#define wxListCtrl_SetItemCount 1713
-#define wxListCtrl_SetItemData 1714
-#define wxListCtrl_SetItemFont 1715
-#define wxListCtrl_SetItemImage 1716
-#define wxListCtrl_SetItemColumnImage 1717
-#define wxListCtrl_SetItemPosition 1718
-#define wxListCtrl_SetItemState 1719
-#define wxListCtrl_SetItemText 1720
-#define wxListCtrl_SetItemTextColour 1721
-#define wxListCtrl_SetSingleStyle 1722
-#define wxListCtrl_SetTextColour 1723
-#define wxListCtrl_SetWindowStyleFlag 1724
-#define wxListCtrl_SortItems 1725
-#define wxListCtrl_destroy 1726
-#define wxListView_ClearColumnImage 1727
-#define wxListView_Focus 1728
-#define wxListView_GetFirstSelected 1729
-#define wxListView_GetFocusedItem 1730
-#define wxListView_GetNextSelected 1731
-#define wxListView_IsSelected 1732
-#define wxListView_Select 1733
-#define wxListView_SetColumnImage 1734
-#define wxListItem_new_0 1735
-#define wxListItem_new_1 1736
-#define wxListItem_destruct 1737
-#define wxListItem_Clear 1738
-#define wxListItem_GetAlign 1739
-#define wxListItem_GetBackgroundColour 1740
-#define wxListItem_GetColumn 1741
-#define wxListItem_GetFont 1742
-#define wxListItem_GetId 1743
-#define wxListItem_GetImage 1744
-#define wxListItem_GetMask 1745
-#define wxListItem_GetState 1746
-#define wxListItem_GetText 1747
-#define wxListItem_GetTextColour 1748
-#define wxListItem_GetWidth 1749
-#define wxListItem_SetAlign 1750
-#define wxListItem_SetBackgroundColour 1751
-#define wxListItem_SetColumn 1752
-#define wxListItem_SetFont 1753
-#define wxListItem_SetId 1754
-#define wxListItem_SetImage 1755
-#define wxListItem_SetMask 1756
-#define wxListItem_SetState 1757
-#define wxListItem_SetStateMask 1758
-#define wxListItem_SetText 1759
-#define wxListItem_SetTextColour 1760
-#define wxListItem_SetWidth 1761
-#define wxListItemAttr_new_0 1762
-#define wxListItemAttr_new_3 1763
-#define wxListItemAttr_GetBackgroundColour 1764
-#define wxListItemAttr_GetFont 1765
-#define wxListItemAttr_GetTextColour 1766
-#define wxListItemAttr_HasBackgroundColour 1767
-#define wxListItemAttr_HasFont 1768
-#define wxListItemAttr_HasTextColour 1769
-#define wxListItemAttr_SetBackgroundColour 1770
-#define wxListItemAttr_SetFont 1771
-#define wxListItemAttr_SetTextColour 1772
-#define wxListItemAttr_destroy 1773
-#define wxImageList_new_0 1774
-#define wxImageList_new_3 1775
-#define wxImageList_Add_1 1776
-#define wxImageList_Add_2_0 1777
-#define wxImageList_Add_2_1 1778
-#define wxImageList_Create 1779
-#define wxImageList_Draw 1781
-#define wxImageList_GetBitmap 1782
-#define wxImageList_GetIcon 1783
-#define wxImageList_GetImageCount 1784
-#define wxImageList_GetSize 1785
-#define wxImageList_Remove 1786
-#define wxImageList_RemoveAll 1787
-#define wxImageList_Replace_2 1788
-#define wxImageList_Replace_3 1789
-#define wxImageList_destroy 1790
-#define wxTextAttr_new_0 1791
-#define wxTextAttr_new_2 1792
-#define wxTextAttr_GetAlignment 1793
-#define wxTextAttr_GetBackgroundColour 1794
-#define wxTextAttr_GetFont 1795
-#define wxTextAttr_GetLeftIndent 1796
-#define wxTextAttr_GetLeftSubIndent 1797
-#define wxTextAttr_GetRightIndent 1798
-#define wxTextAttr_GetTabs 1799
-#define wxTextAttr_GetTextColour 1800
-#define wxTextAttr_HasBackgroundColour 1801
-#define wxTextAttr_HasFont 1802
-#define wxTextAttr_HasTextColour 1803
-#define wxTextAttr_GetFlags 1804
-#define wxTextAttr_IsDefault 1805
-#define wxTextAttr_SetAlignment 1806
-#define wxTextAttr_SetBackgroundColour 1807
-#define wxTextAttr_SetFlags 1808
-#define wxTextAttr_SetFont 1809
-#define wxTextAttr_SetLeftIndent 1810
-#define wxTextAttr_SetRightIndent 1811
-#define wxTextAttr_SetTabs 1812
-#define wxTextAttr_SetTextColour 1813
-#define wxTextAttr_destroy 1814
-#define wxTextCtrl_new_3 1816
-#define wxTextCtrl_new_0 1817
-#define wxTextCtrl_destruct 1819
-#define wxTextCtrl_AppendText 1820
-#define wxTextCtrl_CanCopy 1821
-#define wxTextCtrl_CanCut 1822
-#define wxTextCtrl_CanPaste 1823
-#define wxTextCtrl_CanRedo 1824
-#define wxTextCtrl_CanUndo 1825
-#define wxTextCtrl_Clear 1826
-#define wxTextCtrl_Copy 1827
-#define wxTextCtrl_Create 1828
-#define wxTextCtrl_Cut 1829
-#define wxTextCtrl_DiscardEdits 1830
-#define wxTextCtrl_ChangeValue 1831
-#define wxTextCtrl_EmulateKeyPress 1832
-#define wxTextCtrl_GetDefaultStyle 1833
-#define wxTextCtrl_GetInsertionPoint 1834
-#define wxTextCtrl_GetLastPosition 1835
-#define wxTextCtrl_GetLineLength 1836
-#define wxTextCtrl_GetLineText 1837
-#define wxTextCtrl_GetNumberOfLines 1838
-#define wxTextCtrl_GetRange 1839
-#define wxTextCtrl_GetSelection 1840
-#define wxTextCtrl_GetStringSelection 1841
-#define wxTextCtrl_GetStyle 1842
-#define wxTextCtrl_GetValue 1843
-#define wxTextCtrl_IsEditable 1844
-#define wxTextCtrl_IsModified 1845
-#define wxTextCtrl_IsMultiLine 1846
-#define wxTextCtrl_IsSingleLine 1847
-#define wxTextCtrl_LoadFile 1848
-#define wxTextCtrl_MarkDirty 1849
-#define wxTextCtrl_Paste 1850
-#define wxTextCtrl_PositionToXY 1851
-#define wxTextCtrl_Redo 1852
-#define wxTextCtrl_Remove 1853
-#define wxTextCtrl_Replace 1854
-#define wxTextCtrl_SaveFile 1855
-#define wxTextCtrl_SetDefaultStyle 1856
-#define wxTextCtrl_SetEditable 1857
-#define wxTextCtrl_SetInsertionPoint 1858
-#define wxTextCtrl_SetInsertionPointEnd 1859
-#define wxTextCtrl_SetMaxLength 1861
-#define wxTextCtrl_SetSelection 1862
-#define wxTextCtrl_SetStyle 1863
-#define wxTextCtrl_SetValue 1864
-#define wxTextCtrl_ShowPosition 1865
-#define wxTextCtrl_Undo 1866
-#define wxTextCtrl_WriteText 1867
-#define wxTextCtrl_XYToPosition 1868
-#define wxNotebook_new_0 1871
-#define wxNotebook_new_3 1872
-#define wxNotebook_destruct 1873
-#define wxNotebook_AddPage 1874
-#define wxNotebook_AdvanceSelection 1875
-#define wxNotebook_AssignImageList 1876
-#define wxNotebook_Create 1877
-#define wxNotebook_DeleteAllPages 1878
-#define wxNotebook_DeletePage 1879
-#define wxNotebook_RemovePage 1880
-#define wxNotebook_GetCurrentPage 1881
-#define wxNotebook_GetImageList 1882
-#define wxNotebook_GetPage 1884
-#define wxNotebook_GetPageCount 1885
-#define wxNotebook_GetPageImage 1886
-#define wxNotebook_GetPageText 1887
-#define wxNotebook_GetRowCount 1888
-#define wxNotebook_GetSelection 1889
-#define wxNotebook_GetThemeBackgroundColour 1890
-#define wxNotebook_HitTest 1892
-#define wxNotebook_InsertPage 1894
-#define wxNotebook_SetImageList 1895
-#define wxNotebook_SetPadding 1896
-#define wxNotebook_SetPageSize 1897
-#define wxNotebook_SetPageImage 1898
-#define wxNotebook_SetPageText 1899
-#define wxNotebook_SetSelection 1900
-#define wxNotebook_ChangeSelection 1901
-#define wxChoicebook_new_0 1902
-#define wxChoicebook_new_3 1903
-#define wxChoicebook_AddPage 1904
-#define wxChoicebook_AdvanceSelection 1905
-#define wxChoicebook_AssignImageList 1906
-#define wxChoicebook_Create 1907
-#define wxChoicebook_DeleteAllPages 1908
-#define wxChoicebook_DeletePage 1909
-#define wxChoicebook_RemovePage 1910
-#define wxChoicebook_GetCurrentPage 1911
-#define wxChoicebook_GetImageList 1912
-#define wxChoicebook_GetPage 1914
-#define wxChoicebook_GetPageCount 1915
-#define wxChoicebook_GetPageImage 1916
-#define wxChoicebook_GetPageText 1917
-#define wxChoicebook_GetSelection 1918
-#define wxChoicebook_HitTest 1919
-#define wxChoicebook_InsertPage 1920
-#define wxChoicebook_SetImageList 1921
-#define wxChoicebook_SetPageSize 1922
-#define wxChoicebook_SetPageImage 1923
-#define wxChoicebook_SetPageText 1924
-#define wxChoicebook_SetSelection 1925
-#define wxChoicebook_ChangeSelection 1926
-#define wxChoicebook_destroy 1927
-#define wxToolbook_new_0 1928
-#define wxToolbook_new_3 1929
-#define wxToolbook_AddPage 1930
-#define wxToolbook_AdvanceSelection 1931
-#define wxToolbook_AssignImageList 1932
-#define wxToolbook_Create 1933
-#define wxToolbook_DeleteAllPages 1934
-#define wxToolbook_DeletePage 1935
-#define wxToolbook_RemovePage 1936
-#define wxToolbook_GetCurrentPage 1937
-#define wxToolbook_GetImageList 1938
-#define wxToolbook_GetPage 1940
-#define wxToolbook_GetPageCount 1941
-#define wxToolbook_GetPageImage 1942
-#define wxToolbook_GetPageText 1943
-#define wxToolbook_GetSelection 1944
-#define wxToolbook_HitTest 1946
-#define wxToolbook_InsertPage 1947
-#define wxToolbook_SetImageList 1948
-#define wxToolbook_SetPageSize 1949
-#define wxToolbook_SetPageImage 1950
-#define wxToolbook_SetPageText 1951
-#define wxToolbook_SetSelection 1952
-#define wxToolbook_ChangeSelection 1953
-#define wxToolbook_destroy 1954
-#define wxListbook_new_0 1955
-#define wxListbook_new_3 1956
-#define wxListbook_AddPage 1957
-#define wxListbook_AdvanceSelection 1958
-#define wxListbook_AssignImageList 1959
-#define wxListbook_Create 1960
-#define wxListbook_DeleteAllPages 1961
-#define wxListbook_DeletePage 1962
-#define wxListbook_RemovePage 1963
-#define wxListbook_GetCurrentPage 1964
-#define wxListbook_GetImageList 1965
-#define wxListbook_GetPage 1967
-#define wxListbook_GetPageCount 1968
-#define wxListbook_GetPageImage 1969
-#define wxListbook_GetPageText 1970
-#define wxListbook_GetSelection 1971
-#define wxListbook_HitTest 1973
-#define wxListbook_InsertPage 1974
-#define wxListbook_SetImageList 1975
-#define wxListbook_SetPageSize 1976
-#define wxListbook_SetPageImage 1977
-#define wxListbook_SetPageText 1978
-#define wxListbook_SetSelection 1979
-#define wxListbook_ChangeSelection 1980
-#define wxListbook_destroy 1981
-#define wxTreebook_new_0 1982
-#define wxTreebook_new_3 1983
-#define wxTreebook_AddPage 1984
-#define wxTreebook_AdvanceSelection 1985
-#define wxTreebook_AssignImageList 1986
-#define wxTreebook_Create 1987
-#define wxTreebook_DeleteAllPages 1988
-#define wxTreebook_DeletePage 1989
-#define wxTreebook_RemovePage 1990
-#define wxTreebook_GetCurrentPage 1991
-#define wxTreebook_GetImageList 1992
-#define wxTreebook_GetPage 1994
-#define wxTreebook_GetPageCount 1995
-#define wxTreebook_GetPageImage 1996
-#define wxTreebook_GetPageText 1997
-#define wxTreebook_GetSelection 1998
-#define wxTreebook_ExpandNode 1999
-#define wxTreebook_IsNodeExpanded 2000
-#define wxTreebook_HitTest 2002
-#define wxTreebook_InsertPage 2003
-#define wxTreebook_InsertSubPage 2004
-#define wxTreebook_SetImageList 2005
-#define wxTreebook_SetPageSize 2006
-#define wxTreebook_SetPageImage 2007
-#define wxTreebook_SetPageText 2008
-#define wxTreebook_SetSelection 2009
-#define wxTreebook_ChangeSelection 2010
-#define wxTreebook_destroy 2011
-#define wxTreeCtrl_new_2 2014
-#define wxTreeCtrl_new_0 2015
-#define wxTreeCtrl_destruct 2017
-#define wxTreeCtrl_AddRoot 2018
-#define wxTreeCtrl_AppendItem 2019
-#define wxTreeCtrl_AssignImageList 2020
-#define wxTreeCtrl_AssignStateImageList 2021
-#define wxTreeCtrl_Collapse 2022
-#define wxTreeCtrl_CollapseAndReset 2023
-#define wxTreeCtrl_Create 2024
-#define wxTreeCtrl_Delete 2025
-#define wxTreeCtrl_DeleteAllItems 2026
-#define wxTreeCtrl_DeleteChildren 2027
-#define wxTreeCtrl_EditLabel 2028
-#define wxTreeCtrl_EnsureVisible 2029
-#define wxTreeCtrl_Expand 2030
-#define wxTreeCtrl_GetBoundingRect 2031
-#define wxTreeCtrl_GetChildrenCount 2033
-#define wxTreeCtrl_GetCount 2034
-#define wxTreeCtrl_GetEditControl 2035
-#define wxTreeCtrl_GetFirstChild 2036
-#define wxTreeCtrl_GetNextChild 2037
-#define wxTreeCtrl_GetFirstVisibleItem 2038
-#define wxTreeCtrl_GetImageList 2039
-#define wxTreeCtrl_GetIndent 2040
-#define wxTreeCtrl_GetItemBackgroundColour 2041
-#define wxTreeCtrl_GetItemData 2042
-#define wxTreeCtrl_GetItemFont 2043
-#define wxTreeCtrl_GetItemImage_1 2044
-#define wxTreeCtrl_GetItemImage_2 2045
-#define wxTreeCtrl_GetItemText 2046
-#define wxTreeCtrl_GetItemTextColour 2047
-#define wxTreeCtrl_GetLastChild 2048
-#define wxTreeCtrl_GetNextSibling 2049
-#define wxTreeCtrl_GetNextVisible 2050
-#define wxTreeCtrl_GetItemParent 2051
-#define wxTreeCtrl_GetPrevSibling 2052
-#define wxTreeCtrl_GetPrevVisible 2053
-#define wxTreeCtrl_GetRootItem 2054
-#define wxTreeCtrl_GetSelection 2055
-#define wxTreeCtrl_GetSelections 2056
-#define wxTreeCtrl_GetStateImageList 2057
-#define wxTreeCtrl_HitTest 2058
-#define wxTreeCtrl_InsertItem 2060
-#define wxTreeCtrl_IsBold 2061
-#define wxTreeCtrl_IsExpanded 2062
-#define wxTreeCtrl_IsSelected 2063
-#define wxTreeCtrl_IsVisible 2064
-#define wxTreeCtrl_ItemHasChildren 2065
-#define wxTreeCtrl_IsTreeItemIdOk 2066
-#define wxTreeCtrl_PrependItem 2067
-#define wxTreeCtrl_ScrollTo 2068
-#define wxTreeCtrl_SelectItem_1 2069
-#define wxTreeCtrl_SelectItem_2 2070
-#define wxTreeCtrl_SetIndent 2071
-#define wxTreeCtrl_SetImageList 2072
-#define wxTreeCtrl_SetItemBackgroundColour 2073
-#define wxTreeCtrl_SetItemBold 2074
-#define wxTreeCtrl_SetItemData 2075
-#define wxTreeCtrl_SetItemDropHighlight 2076
-#define wxTreeCtrl_SetItemFont 2077
-#define wxTreeCtrl_SetItemHasChildren 2078
-#define wxTreeCtrl_SetItemImage_2 2079
-#define wxTreeCtrl_SetItemImage_3 2080
-#define wxTreeCtrl_SetItemText 2081
-#define wxTreeCtrl_SetItemTextColour 2082
-#define wxTreeCtrl_SetStateImageList 2083
-#define wxTreeCtrl_SetWindowStyle 2084
-#define wxTreeCtrl_SortChildren 2085
-#define wxTreeCtrl_Toggle 2086
-#define wxTreeCtrl_ToggleItemSelection 2087
-#define wxTreeCtrl_Unselect 2088
-#define wxTreeCtrl_UnselectAll 2089
-#define wxTreeCtrl_UnselectItem 2090
-#define wxScrollBar_new_0 2091
-#define wxScrollBar_new_3 2092
-#define wxScrollBar_destruct 2093
-#define wxScrollBar_Create 2094
-#define wxScrollBar_GetRange 2095
-#define wxScrollBar_GetPageSize 2096
-#define wxScrollBar_GetThumbPosition 2097
-#define wxScrollBar_GetThumbSize 2098
-#define wxScrollBar_SetThumbPosition 2099
-#define wxScrollBar_SetScrollbar 2100
-#define wxSpinButton_new_2 2102
-#define wxSpinButton_new_0 2103
-#define wxSpinButton_Create 2104
-#define wxSpinButton_GetMax 2105
-#define wxSpinButton_GetMin 2106
-#define wxSpinButton_GetValue 2107
-#define wxSpinButton_SetRange 2108
-#define wxSpinButton_SetValue 2109
-#define wxSpinButton_destroy 2110
-#define wxSpinCtrl_new_0 2111
-#define wxSpinCtrl_new_2 2112
-#define wxSpinCtrl_Create 2114
-#define wxSpinCtrl_SetValue_1_1 2117
-#define wxSpinCtrl_SetValue_1_0 2118
-#define wxSpinCtrl_GetValue 2120
-#define wxSpinCtrl_SetRange 2122
-#define wxSpinCtrl_SetSelection 2123
-#define wxSpinCtrl_GetMin 2125
-#define wxSpinCtrl_GetMax 2127
-#define wxSpinCtrl_destroy 2128
-#define wxStaticText_new_0 2129
-#define wxStaticText_new_4 2130
-#define wxStaticText_Create 2131
-#define wxStaticText_GetLabel 2132
-#define wxStaticText_SetLabel 2133
-#define wxStaticText_Wrap 2134
-#define wxStaticText_destroy 2135
-#define wxStaticBitmap_new_0 2136
-#define wxStaticBitmap_new_4 2137
-#define wxStaticBitmap_Create 2138
-#define wxStaticBitmap_GetBitmap 2139
-#define wxStaticBitmap_SetBitmap 2140
-#define wxStaticBitmap_destroy 2141
-#define wxRadioBox_new 2142
-#define wxRadioBox_destruct 2144
-#define wxRadioBox_Create 2145
-#define wxRadioBox_Enable_2 2146
-#define wxRadioBox_Enable_1 2147
-#define wxRadioBox_GetSelection 2148
-#define wxRadioBox_GetString 2149
-#define wxRadioBox_SetSelection 2150
-#define wxRadioBox_Show_2 2151
-#define wxRadioBox_Show_1 2152
-#define wxRadioBox_GetColumnCount 2153
-#define wxRadioBox_GetItemHelpText 2154
-#define wxRadioBox_GetItemToolTip 2155
-#define wxRadioBox_GetItemFromPoint 2157
-#define wxRadioBox_GetRowCount 2158
-#define wxRadioBox_IsItemEnabled 2159
-#define wxRadioBox_IsItemShown 2160
-#define wxRadioBox_SetItemHelpText 2161
-#define wxRadioBox_SetItemToolTip 2162
-#define wxRadioButton_new_0 2163
-#define wxRadioButton_new_4 2164
-#define wxRadioButton_Create 2165
-#define wxRadioButton_GetValue 2166
-#define wxRadioButton_SetValue 2167
-#define wxRadioButton_destroy 2168
-#define wxSlider_new_6 2170
-#define wxSlider_new_0 2171
-#define wxSlider_Create 2172
-#define wxSlider_GetLineSize 2173
-#define wxSlider_GetMax 2174
-#define wxSlider_GetMin 2175
-#define wxSlider_GetPageSize 2176
-#define wxSlider_GetThumbLength 2177
-#define wxSlider_GetValue 2178
-#define wxSlider_SetLineSize 2179
-#define wxSlider_SetPageSize 2180
-#define wxSlider_SetRange 2181
-#define wxSlider_SetThumbLength 2182
-#define wxSlider_SetValue 2183
-#define wxSlider_destroy 2184
-#define wxDialog_new_4 2186
-#define wxDialog_new_0 2187
-#define wxDialog_destruct 2189
-#define wxDialog_Create 2190
-#define wxDialog_CreateButtonSizer 2191
-#define wxDialog_CreateStdDialogButtonSizer 2192
-#define wxDialog_EndModal 2193
-#define wxDialog_GetAffirmativeId 2194
-#define wxDialog_GetReturnCode 2195
-#define wxDialog_IsModal 2196
-#define wxDialog_SetAffirmativeId 2197
-#define wxDialog_SetReturnCode 2198
-#define wxDialog_Show 2199
-#define wxDialog_ShowModal 2200
-#define wxColourDialog_new_0 2201
-#define wxColourDialog_new_2 2202
-#define wxColourDialog_destruct 2203
-#define wxColourDialog_Create 2204
-#define wxColourDialog_GetColourData 2205
-#define wxColourData_new_0 2206
-#define wxColourData_new_1 2207
-#define wxColourData_destruct 2208
-#define wxColourData_GetChooseFull 2209
-#define wxColourData_GetColour 2210
-#define wxColourData_GetCustomColour 2212
-#define wxColourData_SetChooseFull 2213
-#define wxColourData_SetColour 2214
-#define wxColourData_SetCustomColour 2215
-#define wxPalette_new_0 2216
-#define wxPalette_new_4 2217
-#define wxPalette_destruct 2219
-#define wxPalette_Create 2220
-#define wxPalette_GetColoursCount 2221
-#define wxPalette_GetPixel 2222
-#define wxPalette_GetRGB 2223
-#define wxPalette_IsOk 2224
-#define wxDirDialog_new 2228
-#define wxDirDialog_destruct 2229
-#define wxDirDialog_GetPath 2230
-#define wxDirDialog_GetMessage 2231
-#define wxDirDialog_SetMessage 2232
-#define wxDirDialog_SetPath 2233
-#define wxFileDialog_new 2237
-#define wxFileDialog_destruct 2238
-#define wxFileDialog_GetDirectory 2239
-#define wxFileDialog_GetFilename 2240
-#define wxFileDialog_GetFilenames 2241
-#define wxFileDialog_GetFilterIndex 2242
-#define wxFileDialog_GetMessage 2243
-#define wxFileDialog_GetPath 2244
-#define wxFileDialog_GetPaths 2245
-#define wxFileDialog_GetWildcard 2246
-#define wxFileDialog_SetDirectory 2247
-#define wxFileDialog_SetFilename 2248
-#define wxFileDialog_SetFilterIndex 2249
-#define wxFileDialog_SetMessage 2250
-#define wxFileDialog_SetPath 2251
-#define wxFileDialog_SetWildcard 2252
-#define wxPickerBase_SetInternalMargin 2253
-#define wxPickerBase_GetInternalMargin 2254
-#define wxPickerBase_SetTextCtrlProportion 2255
-#define wxPickerBase_SetPickerCtrlProportion 2256
-#define wxPickerBase_GetTextCtrlProportion 2257
-#define wxPickerBase_GetPickerCtrlProportion 2258
-#define wxPickerBase_HasTextCtrl 2259
-#define wxPickerBase_GetTextCtrl 2260
-#define wxPickerBase_IsTextCtrlGrowable 2261
-#define wxPickerBase_SetPickerCtrlGrowable 2262
-#define wxPickerBase_SetTextCtrlGrowable 2263
-#define wxPickerBase_IsPickerCtrlGrowable 2264
-#define wxFilePickerCtrl_new_0 2265
-#define wxFilePickerCtrl_new_3 2266
-#define wxFilePickerCtrl_Create 2267
-#define wxFilePickerCtrl_GetPath 2268
-#define wxFilePickerCtrl_SetPath 2269
-#define wxFilePickerCtrl_destroy 2270
-#define wxDirPickerCtrl_new_0 2271
-#define wxDirPickerCtrl_new_3 2272
-#define wxDirPickerCtrl_Create 2273
-#define wxDirPickerCtrl_GetPath 2274
-#define wxDirPickerCtrl_SetPath 2275
-#define wxDirPickerCtrl_destroy 2276
-#define wxColourPickerCtrl_new_0 2277
-#define wxColourPickerCtrl_new_3 2278
-#define wxColourPickerCtrl_Create 2279
-#define wxColourPickerCtrl_GetColour 2280
-#define wxColourPickerCtrl_SetColour_1_1 2281
-#define wxColourPickerCtrl_SetColour_1_0 2282
-#define wxColourPickerCtrl_destroy 2283
-#define wxDatePickerCtrl_new_0 2284
-#define wxDatePickerCtrl_new_3 2285
-#define wxDatePickerCtrl_GetRange 2286
-#define wxDatePickerCtrl_GetValue 2287
-#define wxDatePickerCtrl_SetRange 2288
-#define wxDatePickerCtrl_SetValue 2289
-#define wxDatePickerCtrl_destroy 2290
-#define wxFontPickerCtrl_new_0 2291
-#define wxFontPickerCtrl_new_3 2292
-#define wxFontPickerCtrl_Create 2293
-#define wxFontPickerCtrl_GetSelectedFont 2294
-#define wxFontPickerCtrl_SetSelectedFont 2295
-#define wxFontPickerCtrl_GetMaxPointSize 2296
-#define wxFontPickerCtrl_SetMaxPointSize 2297
-#define wxFontPickerCtrl_destroy 2298
-#define wxFindReplaceDialog_new_0 2301
-#define wxFindReplaceDialog_new_4 2302
-#define wxFindReplaceDialog_destruct 2303
-#define wxFindReplaceDialog_Create 2304
-#define wxFindReplaceDialog_GetData 2305
-#define wxFindReplaceData_new_0 2306
-#define wxFindReplaceData_new_1 2307
-#define wxFindReplaceData_GetFindString 2308
-#define wxFindReplaceData_GetReplaceString 2309
-#define wxFindReplaceData_GetFlags 2310
-#define wxFindReplaceData_SetFlags 2311
-#define wxFindReplaceData_SetFindString 2312
-#define wxFindReplaceData_SetReplaceString 2313
-#define wxFindReplaceData_destroy 2314
-#define wxMultiChoiceDialog_new_0 2315
-#define wxMultiChoiceDialog_new_5 2317
-#define wxMultiChoiceDialog_GetSelections 2318
-#define wxMultiChoiceDialog_SetSelections 2319
-#define wxMultiChoiceDialog_destroy 2320
-#define wxSingleChoiceDialog_new_0 2321
-#define wxSingleChoiceDialog_new_5 2323
-#define wxSingleChoiceDialog_GetSelection 2324
-#define wxSingleChoiceDialog_GetStringSelection 2325
-#define wxSingleChoiceDialog_SetSelection 2326
-#define wxSingleChoiceDialog_destroy 2327
-#define wxTextEntryDialog_new 2328
-#define wxTextEntryDialog_GetValue 2329
-#define wxTextEntryDialog_SetValue 2330
-#define wxTextEntryDialog_destroy 2331
-#define wxPasswordEntryDialog_new 2332
-#define wxPasswordEntryDialog_destroy 2333
-#define wxFontData_new_0 2334
-#define wxFontData_new_1 2335
-#define wxFontData_destruct 2336
-#define wxFontData_EnableEffects 2337
-#define wxFontData_GetAllowSymbols 2338
-#define wxFontData_GetColour 2339
-#define wxFontData_GetChosenFont 2340
-#define wxFontData_GetEnableEffects 2341
-#define wxFontData_GetInitialFont 2342
-#define wxFontData_GetShowHelp 2343
-#define wxFontData_SetAllowSymbols 2344
-#define wxFontData_SetChosenFont 2345
-#define wxFontData_SetColour 2346
-#define wxFontData_SetInitialFont 2347
-#define wxFontData_SetRange 2348
-#define wxFontData_SetShowHelp 2349
-#define wxFontDialog_new_0 2353
-#define wxFontDialog_new_2 2355
-#define wxFontDialog_Create 2357
-#define wxFontDialog_GetFontData 2358
-#define wxFontDialog_destroy 2360
-#define wxProgressDialog_new 2361
-#define wxProgressDialog_destruct 2362
-#define wxProgressDialog_Resume 2363
-#define wxProgressDialog_Update_2 2364
-#define wxProgressDialog_Update_0 2365
-#define wxMessageDialog_new 2366
-#define wxMessageDialog_destruct 2367
-#define wxPageSetupDialog_new 2368
-#define wxPageSetupDialog_destruct 2369
-#define wxPageSetupDialog_GetPageSetupData 2370
-#define wxPageSetupDialog_ShowModal 2371
-#define wxPageSetupDialogData_new_0 2372
-#define wxPageSetupDialogData_new_1_0 2373
-#define wxPageSetupDialogData_new_1_1 2374
-#define wxPageSetupDialogData_destruct 2375
-#define wxPageSetupDialogData_EnableHelp 2376
-#define wxPageSetupDialogData_EnableMargins 2377
-#define wxPageSetupDialogData_EnableOrientation 2378
-#define wxPageSetupDialogData_EnablePaper 2379
-#define wxPageSetupDialogData_EnablePrinter 2380
-#define wxPageSetupDialogData_GetDefaultMinMargins 2381
-#define wxPageSetupDialogData_GetEnableMargins 2382
-#define wxPageSetupDialogData_GetEnableOrientation 2383
-#define wxPageSetupDialogData_GetEnablePaper 2384
-#define wxPageSetupDialogData_GetEnablePrinter 2385
-#define wxPageSetupDialogData_GetEnableHelp 2386
-#define wxPageSetupDialogData_GetDefaultInfo 2387
-#define wxPageSetupDialogData_GetMarginTopLeft 2388
-#define wxPageSetupDialogData_GetMarginBottomRight 2389
-#define wxPageSetupDialogData_GetMinMarginTopLeft 2390
-#define wxPageSetupDialogData_GetMinMarginBottomRight 2391
-#define wxPageSetupDialogData_GetPaperId 2392
-#define wxPageSetupDialogData_GetPaperSize 2393
-#define wxPageSetupDialogData_GetPrintData 2395
-#define wxPageSetupDialogData_IsOk 2396
-#define wxPageSetupDialogData_SetDefaultInfo 2397
-#define wxPageSetupDialogData_SetDefaultMinMargins 2398
-#define wxPageSetupDialogData_SetMarginTopLeft 2399
-#define wxPageSetupDialogData_SetMarginBottomRight 2400
-#define wxPageSetupDialogData_SetMinMarginTopLeft 2401
-#define wxPageSetupDialogData_SetMinMarginBottomRight 2402
-#define wxPageSetupDialogData_SetPaperId 2403
-#define wxPageSetupDialogData_SetPaperSize_1_1 2404
-#define wxPageSetupDialogData_SetPaperSize_1_0 2405
-#define wxPageSetupDialogData_SetPrintData 2406
-#define wxPrintDialog_new_2_0 2407
-#define wxPrintDialog_new_2_1 2408
-#define wxPrintDialog_destruct 2409
-#define wxPrintDialog_GetPrintDialogData 2410
-#define wxPrintDialog_GetPrintDC 2411
-#define wxPrintDialogData_new_0 2412
-#define wxPrintDialogData_new_1_1 2413
-#define wxPrintDialogData_new_1_0 2414
-#define wxPrintDialogData_destruct 2415
-#define wxPrintDialogData_EnableHelp 2416
-#define wxPrintDialogData_EnablePageNumbers 2417
-#define wxPrintDialogData_EnablePrintToFile 2418
-#define wxPrintDialogData_EnableSelection 2419
-#define wxPrintDialogData_GetAllPages 2420
-#define wxPrintDialogData_GetCollate 2421
-#define wxPrintDialogData_GetFromPage 2422
-#define wxPrintDialogData_GetMaxPage 2423
-#define wxPrintDialogData_GetMinPage 2424
-#define wxPrintDialogData_GetNoCopies 2425
-#define wxPrintDialogData_GetPrintData 2426
-#define wxPrintDialogData_GetPrintToFile 2427
-#define wxPrintDialogData_GetSelection 2428
-#define wxPrintDialogData_GetToPage 2429
-#define wxPrintDialogData_IsOk 2430
-#define wxPrintDialogData_SetCollate 2431
-#define wxPrintDialogData_SetFromPage 2432
-#define wxPrintDialogData_SetMaxPage 2433
-#define wxPrintDialogData_SetMinPage 2434
-#define wxPrintDialogData_SetNoCopies 2435
-#define wxPrintDialogData_SetPrintData 2436
-#define wxPrintDialogData_SetPrintToFile 2437
-#define wxPrintDialogData_SetSelection 2438
-#define wxPrintDialogData_SetToPage 2439
-#define wxPrintData_new_0 2440
-#define wxPrintData_new_1 2441
-#define wxPrintData_destruct 2442
-#define wxPrintData_GetCollate 2443
-#define wxPrintData_GetBin 2444
-#define wxPrintData_GetColour 2445
-#define wxPrintData_GetDuplex 2446
-#define wxPrintData_GetNoCopies 2447
-#define wxPrintData_GetOrientation 2448
-#define wxPrintData_GetPaperId 2449
-#define wxPrintData_GetPrinterName 2450
-#define wxPrintData_GetQuality 2451
-#define wxPrintData_IsOk 2452
-#define wxPrintData_SetBin 2453
-#define wxPrintData_SetCollate 2454
-#define wxPrintData_SetColour 2455
-#define wxPrintData_SetDuplex 2456
-#define wxPrintData_SetNoCopies 2457
-#define wxPrintData_SetOrientation 2458
-#define wxPrintData_SetPaperId 2459
-#define wxPrintData_SetPrinterName 2460
-#define wxPrintData_SetQuality 2461
-#define wxPrintPreview_new_2 2464
-#define wxPrintPreview_new_3 2465
-#define wxPrintPreview_destruct 2467
-#define wxPrintPreview_GetCanvas 2468
-#define wxPrintPreview_GetCurrentPage 2469
-#define wxPrintPreview_GetFrame 2470
-#define wxPrintPreview_GetMaxPage 2471
-#define wxPrintPreview_GetMinPage 2472
-#define wxPrintPreview_GetPrintout 2473
-#define wxPrintPreview_GetPrintoutForPrinting 2474
-#define wxPrintPreview_IsOk 2475
-#define wxPrintPreview_PaintPage 2476
-#define wxPrintPreview_Print 2477
-#define wxPrintPreview_RenderPage 2478
-#define wxPrintPreview_SetCanvas 2479
-#define wxPrintPreview_SetCurrentPage 2480
-#define wxPrintPreview_SetFrame 2481
-#define wxPrintPreview_SetPrintout 2482
-#define wxPrintPreview_SetZoom 2483
-#define wxPreviewFrame_new 2484
-#define wxPreviewFrame_destruct 2485
-#define wxPreviewFrame_CreateControlBar 2486
-#define wxPreviewFrame_CreateCanvas 2487
-#define wxPreviewFrame_Initialize 2488
-#define wxPreviewFrame_OnCloseWindow 2489
-#define wxPreviewControlBar_new 2490
-#define wxPreviewControlBar_destruct 2491
-#define wxPreviewControlBar_CreateButtons 2492
-#define wxPreviewControlBar_GetPrintPreview 2493
-#define wxPreviewControlBar_GetZoomControl 2494
-#define wxPreviewControlBar_SetZoomControl 2495
-#define wxPrinter_new 2497
-#define wxPrinter_CreateAbortWindow 2498
-#define wxPrinter_GetAbort 2499
-#define wxPrinter_GetLastError 2500
-#define wxPrinter_GetPrintDialogData 2501
-#define wxPrinter_Print 2502
-#define wxPrinter_PrintDialog 2503
-#define wxPrinter_ReportError 2504
-#define wxPrinter_Setup 2505
-#define wxPrinter_destroy 2506
-#define wxXmlResource_new_1 2507
-#define wxXmlResource_new_2 2508
-#define wxXmlResource_destruct 2509
-#define wxXmlResource_AttachUnknownControl 2510
-#define wxXmlResource_ClearHandlers 2511
-#define wxXmlResource_CompareVersion 2512
-#define wxXmlResource_Get 2513
-#define wxXmlResource_GetFlags 2514
-#define wxXmlResource_GetVersion 2515
-#define wxXmlResource_GetXRCID 2516
-#define wxXmlResource_InitAllHandlers 2517
-#define wxXmlResource_Load 2518
-#define wxXmlResource_LoadBitmap 2519
-#define wxXmlResource_LoadDialog_2 2520
-#define wxXmlResource_LoadDialog_3 2521
-#define wxXmlResource_LoadFrame_2 2522
-#define wxXmlResource_LoadFrame_3 2523
-#define wxXmlResource_LoadIcon 2524
-#define wxXmlResource_LoadMenu 2525
-#define wxXmlResource_LoadMenuBar_2 2526
-#define wxXmlResource_LoadMenuBar_1 2527
-#define wxXmlResource_LoadPanel_2 2528
-#define wxXmlResource_LoadPanel_3 2529
-#define wxXmlResource_LoadToolBar 2530
-#define wxXmlResource_Set 2531
-#define wxXmlResource_SetFlags 2532
-#define wxXmlResource_Unload 2533
-#define wxXmlResource_xrcctrl 2534
-#define wxHtmlEasyPrinting_new 2535
-#define wxHtmlEasyPrinting_destruct 2536
-#define wxHtmlEasyPrinting_GetPrintData 2537
-#define wxHtmlEasyPrinting_GetPageSetupData 2538
-#define wxHtmlEasyPrinting_PreviewFile 2539
-#define wxHtmlEasyPrinting_PreviewText 2540
-#define wxHtmlEasyPrinting_PrintFile 2541
-#define wxHtmlEasyPrinting_PrintText 2542
-#define wxHtmlEasyPrinting_PageSetup 2543
-#define wxHtmlEasyPrinting_SetFonts 2544
-#define wxHtmlEasyPrinting_SetHeader 2545
-#define wxHtmlEasyPrinting_SetFooter 2546
-#define wxGLCanvas_new_2 2548
-#define wxGLCanvas_new_3_1 2549
-#define wxGLCanvas_new_3_0 2550
-#define wxGLCanvas_GetContext 2551
-#define wxGLCanvas_SetCurrent 2553
-#define wxGLCanvas_SwapBuffers 2554
-#define wxGLCanvas_destroy 2555
-#define wxAuiManager_new 2556
-#define wxAuiManager_destruct 2557
-#define wxAuiManager_AddPane_2_1 2558
-#define wxAuiManager_AddPane_3 2559
-#define wxAuiManager_AddPane_2_0 2560
-#define wxAuiManager_DetachPane 2561
-#define wxAuiManager_GetAllPanes 2562
-#define wxAuiManager_GetArtProvider 2563
-#define wxAuiManager_GetDockSizeConstraint 2564
-#define wxAuiManager_GetFlags 2565
-#define wxAuiManager_GetManagedWindow 2566
-#define wxAuiManager_GetManager 2567
-#define wxAuiManager_GetPane_1_1 2568
-#define wxAuiManager_GetPane_1_0 2569
-#define wxAuiManager_HideHint 2570
-#define wxAuiManager_InsertPane 2571
-#define wxAuiManager_LoadPaneInfo 2572
-#define wxAuiManager_LoadPerspective 2573
-#define wxAuiManager_SavePaneInfo 2574
-#define wxAuiManager_SavePerspective 2575
-#define wxAuiManager_SetArtProvider 2576
-#define wxAuiManager_SetDockSizeConstraint 2577
-#define wxAuiManager_SetFlags 2578
-#define wxAuiManager_SetManagedWindow 2579
-#define wxAuiManager_ShowHint 2580
-#define wxAuiManager_UnInit 2581
-#define wxAuiManager_Update 2582
-#define wxAuiPaneInfo_new_0 2583
-#define wxAuiPaneInfo_new_1 2584
-#define wxAuiPaneInfo_destruct 2585
-#define wxAuiPaneInfo_BestSize_1 2586
-#define wxAuiPaneInfo_BestSize_2 2587
-#define wxAuiPaneInfo_Bottom 2588
-#define wxAuiPaneInfo_BottomDockable 2589
-#define wxAuiPaneInfo_Caption 2590
-#define wxAuiPaneInfo_CaptionVisible 2591
-#define wxAuiPaneInfo_Centre 2592
-#define wxAuiPaneInfo_CentrePane 2593
-#define wxAuiPaneInfo_CloseButton 2594
-#define wxAuiPaneInfo_DefaultPane 2595
-#define wxAuiPaneInfo_DestroyOnClose 2596
-#define wxAuiPaneInfo_Direction 2597
-#define wxAuiPaneInfo_Dock 2598
-#define wxAuiPaneInfo_Dockable 2599
-#define wxAuiPaneInfo_Fixed 2600
-#define wxAuiPaneInfo_Float 2601
-#define wxAuiPaneInfo_Floatable 2602
-#define wxAuiPaneInfo_FloatingPosition_1 2603
-#define wxAuiPaneInfo_FloatingPosition_2 2604
-#define wxAuiPaneInfo_FloatingSize_1 2605
-#define wxAuiPaneInfo_FloatingSize_2 2606
-#define wxAuiPaneInfo_Gripper 2607
-#define wxAuiPaneInfo_GripperTop 2608
-#define wxAuiPaneInfo_HasBorder 2609
-#define wxAuiPaneInfo_HasCaption 2610
-#define wxAuiPaneInfo_HasCloseButton 2611
-#define wxAuiPaneInfo_HasFlag 2612
-#define wxAuiPaneInfo_HasGripper 2613
-#define wxAuiPaneInfo_HasGripperTop 2614
-#define wxAuiPaneInfo_HasMaximizeButton 2615
-#define wxAuiPaneInfo_HasMinimizeButton 2616
-#define wxAuiPaneInfo_HasPinButton 2617
-#define wxAuiPaneInfo_Hide 2618
-#define wxAuiPaneInfo_IsBottomDockable 2619
-#define wxAuiPaneInfo_IsDocked 2620
-#define wxAuiPaneInfo_IsFixed 2621
-#define wxAuiPaneInfo_IsFloatable 2622
-#define wxAuiPaneInfo_IsFloating 2623
-#define wxAuiPaneInfo_IsLeftDockable 2624
-#define wxAuiPaneInfo_IsMovable 2625
-#define wxAuiPaneInfo_IsOk 2626
-#define wxAuiPaneInfo_IsResizable 2627
-#define wxAuiPaneInfo_IsRightDockable 2628
-#define wxAuiPaneInfo_IsShown 2629
-#define wxAuiPaneInfo_IsToolbar 2630
-#define wxAuiPaneInfo_IsTopDockable 2631
-#define wxAuiPaneInfo_Layer 2632
-#define wxAuiPaneInfo_Left 2633
-#define wxAuiPaneInfo_LeftDockable 2634
-#define wxAuiPaneInfo_MaxSize_1 2635
-#define wxAuiPaneInfo_MaxSize_2 2636
-#define wxAuiPaneInfo_MaximizeButton 2637
-#define wxAuiPaneInfo_MinSize_1 2638
-#define wxAuiPaneInfo_MinSize_2 2639
-#define wxAuiPaneInfo_MinimizeButton 2640
-#define wxAuiPaneInfo_Movable 2641
-#define wxAuiPaneInfo_Name 2642
-#define wxAuiPaneInfo_PaneBorder 2643
-#define wxAuiPaneInfo_PinButton 2644
-#define wxAuiPaneInfo_Position 2645
-#define wxAuiPaneInfo_Resizable 2646
-#define wxAuiPaneInfo_Right 2647
-#define wxAuiPaneInfo_RightDockable 2648
-#define wxAuiPaneInfo_Row 2649
-#define wxAuiPaneInfo_SafeSet 2650
-#define wxAuiPaneInfo_SetFlag 2651
-#define wxAuiPaneInfo_Show 2652
-#define wxAuiPaneInfo_ToolbarPane 2653
-#define wxAuiPaneInfo_Top 2654
-#define wxAuiPaneInfo_TopDockable 2655
-#define wxAuiPaneInfo_Window 2656
-#define wxAuiPaneInfo_GetWindow 2657
-#define wxAuiPaneInfo_GetFrame 2658
-#define wxAuiPaneInfo_GetDirection 2659
-#define wxAuiPaneInfo_GetLayer 2660
-#define wxAuiPaneInfo_GetRow 2661
-#define wxAuiPaneInfo_GetPosition 2662
-#define wxAuiPaneInfo_GetFloatingPosition 2663
-#define wxAuiPaneInfo_GetFloatingSize 2664
-#define wxAuiNotebook_new_0 2665
-#define wxAuiNotebook_new_2 2666
-#define wxAuiNotebook_AddPage 2667
-#define wxAuiNotebook_Create 2668
-#define wxAuiNotebook_DeletePage 2669
-#define wxAuiNotebook_GetArtProvider 2670
-#define wxAuiNotebook_GetPage 2671
-#define wxAuiNotebook_GetPageBitmap 2672
-#define wxAuiNotebook_GetPageCount 2673
-#define wxAuiNotebook_GetPageIndex 2674
-#define wxAuiNotebook_GetPageText 2675
-#define wxAuiNotebook_GetSelection 2676
-#define wxAuiNotebook_InsertPage 2677
-#define wxAuiNotebook_RemovePage 2678
-#define wxAuiNotebook_SetArtProvider 2679
-#define wxAuiNotebook_SetFont 2680
-#define wxAuiNotebook_SetPageBitmap 2681
-#define wxAuiNotebook_SetPageText 2682
-#define wxAuiNotebook_SetSelection 2683
-#define wxAuiNotebook_SetTabCtrlHeight 2684
-#define wxAuiNotebook_SetUniformBitmapSize 2685
-#define wxAuiNotebook_destroy 2686
-#define wxAuiTabArt_SetFlags 2687
-#define wxAuiTabArt_SetMeasuringFont 2688
-#define wxAuiTabArt_SetNormalFont 2689
-#define wxAuiTabArt_SetSelectedFont 2690
-#define wxAuiTabArt_SetColour 2691
-#define wxAuiTabArt_SetActiveColour 2692
-#define wxAuiDockArt_GetColour 2693
-#define wxAuiDockArt_GetFont 2694
-#define wxAuiDockArt_GetMetric 2695
-#define wxAuiDockArt_SetColour 2696
-#define wxAuiDockArt_SetFont 2697
-#define wxAuiDockArt_SetMetric 2698
-#define wxAuiSimpleTabArt_new 2699
-#define wxAuiSimpleTabArt_destroy 2700
-#define wxMDIParentFrame_new_0 2701
-#define wxMDIParentFrame_new_4 2702
-#define wxMDIParentFrame_destruct 2703
-#define wxMDIParentFrame_ActivateNext 2704
-#define wxMDIParentFrame_ActivatePrevious 2705
-#define wxMDIParentFrame_ArrangeIcons 2706
-#define wxMDIParentFrame_Cascade 2707
-#define wxMDIParentFrame_Create 2708
-#define wxMDIParentFrame_GetActiveChild 2709
-#define wxMDIParentFrame_GetClientWindow 2710
-#define wxMDIParentFrame_Tile 2711
-#define wxMDIChildFrame_new_0 2712
-#define wxMDIChildFrame_new_4 2713
-#define wxMDIChildFrame_destruct 2714
-#define wxMDIChildFrame_Activate 2715
-#define wxMDIChildFrame_Create 2716
-#define wxMDIChildFrame_Maximize 2717
-#define wxMDIChildFrame_Restore 2718
-#define wxMDIClientWindow_new_0 2719
-#define wxMDIClientWindow_new_2 2720
-#define wxMDIClientWindow_destruct 2721
-#define wxMDIClientWindow_CreateClient 2722
-#define wxLayoutAlgorithm_new 2723
-#define wxLayoutAlgorithm_LayoutFrame 2724
-#define wxLayoutAlgorithm_LayoutMDIFrame 2725
-#define wxLayoutAlgorithm_LayoutWindow 2726
-#define wxLayoutAlgorithm_destroy 2727
-#define wxEvent_GetId 2728
-#define wxEvent_GetSkipped 2729
-#define wxEvent_GetTimestamp 2730
-#define wxEvent_IsCommandEvent 2731
-#define wxEvent_ResumePropagation 2732
-#define wxEvent_ShouldPropagate 2733
-#define wxEvent_Skip 2734
-#define wxEvent_StopPropagation 2735
-#define wxCommandEvent_getClientData 2736
-#define wxCommandEvent_GetExtraLong 2737
-#define wxCommandEvent_GetInt 2738
-#define wxCommandEvent_GetSelection 2739
-#define wxCommandEvent_GetString 2740
-#define wxCommandEvent_IsChecked 2741
-#define wxCommandEvent_IsSelection 2742
-#define wxCommandEvent_SetInt 2743
-#define wxCommandEvent_SetString 2744
-#define wxScrollEvent_GetOrientation 2745
-#define wxScrollEvent_GetPosition 2746
-#define wxScrollWinEvent_GetOrientation 2747
-#define wxScrollWinEvent_GetPosition 2748
-#define wxMouseEvent_AltDown 2749
-#define wxMouseEvent_Button 2750
-#define wxMouseEvent_ButtonDClick 2751
-#define wxMouseEvent_ButtonDown 2752
-#define wxMouseEvent_ButtonUp 2753
-#define wxMouseEvent_CmdDown 2754
-#define wxMouseEvent_ControlDown 2755
-#define wxMouseEvent_Dragging 2756
-#define wxMouseEvent_Entering 2757
-#define wxMouseEvent_GetButton 2758
-#define wxMouseEvent_GetPosition 2761
-#define wxMouseEvent_GetLogicalPosition 2762
-#define wxMouseEvent_GetLinesPerAction 2763
-#define wxMouseEvent_GetWheelRotation 2764
-#define wxMouseEvent_GetWheelDelta 2765
-#define wxMouseEvent_GetX 2766
-#define wxMouseEvent_GetY 2767
-#define wxMouseEvent_IsButton 2768
-#define wxMouseEvent_IsPageScroll 2769
-#define wxMouseEvent_Leaving 2770
-#define wxMouseEvent_LeftDClick 2771
-#define wxMouseEvent_LeftDown 2772
-#define wxMouseEvent_LeftIsDown 2773
-#define wxMouseEvent_LeftUp 2774
-#define wxMouseEvent_MetaDown 2775
-#define wxMouseEvent_MiddleDClick 2776
-#define wxMouseEvent_MiddleDown 2777
-#define wxMouseEvent_MiddleIsDown 2778
-#define wxMouseEvent_MiddleUp 2779
-#define wxMouseEvent_Moving 2780
-#define wxMouseEvent_RightDClick 2781
-#define wxMouseEvent_RightDown 2782
-#define wxMouseEvent_RightIsDown 2783
-#define wxMouseEvent_RightUp 2784
-#define wxMouseEvent_ShiftDown 2785
-#define wxSetCursorEvent_GetCursor 2786
-#define wxSetCursorEvent_GetX 2787
-#define wxSetCursorEvent_GetY 2788
-#define wxSetCursorEvent_HasCursor 2789
-#define wxSetCursorEvent_SetCursor 2790
-#define wxKeyEvent_AltDown 2791
-#define wxKeyEvent_CmdDown 2792
-#define wxKeyEvent_ControlDown 2793
-#define wxKeyEvent_GetKeyCode 2794
-#define wxKeyEvent_GetModifiers 2795
-#define wxKeyEvent_GetPosition 2798
-#define wxKeyEvent_GetRawKeyCode 2799
-#define wxKeyEvent_GetRawKeyFlags 2800
-#define wxKeyEvent_GetUnicodeKey 2801
-#define wxKeyEvent_GetX 2802
-#define wxKeyEvent_GetY 2803
-#define wxKeyEvent_HasModifiers 2804
-#define wxKeyEvent_MetaDown 2805
-#define wxKeyEvent_ShiftDown 2806
-#define wxSizeEvent_GetSize 2807
-#define wxMoveEvent_GetPosition 2808
-#define wxEraseEvent_GetDC 2809
-#define wxFocusEvent_GetWindow 2810
-#define wxChildFocusEvent_GetWindow 2811
-#define wxMenuEvent_GetMenu 2812
-#define wxMenuEvent_GetMenuId 2813
-#define wxMenuEvent_IsPopup 2814
-#define wxCloseEvent_CanVeto 2815
-#define wxCloseEvent_GetLoggingOff 2816
-#define wxCloseEvent_SetCanVeto 2817
-#define wxCloseEvent_SetLoggingOff 2818
-#define wxCloseEvent_Veto 2819
-#define wxShowEvent_SetShow 2820
-#define wxShowEvent_GetShow 2821
-#define wxIconizeEvent_Iconized 2822
-#define wxJoystickEvent_ButtonDown 2823
-#define wxJoystickEvent_ButtonIsDown 2824
-#define wxJoystickEvent_ButtonUp 2825
-#define wxJoystickEvent_GetButtonChange 2826
-#define wxJoystickEvent_GetButtonState 2827
-#define wxJoystickEvent_GetJoystick 2828
-#define wxJoystickEvent_GetPosition 2829
-#define wxJoystickEvent_GetZPosition 2830
-#define wxJoystickEvent_IsButton 2831
-#define wxJoystickEvent_IsMove 2832
-#define wxJoystickEvent_IsZMove 2833
-#define wxUpdateUIEvent_CanUpdate 2834
-#define wxUpdateUIEvent_Check 2835
-#define wxUpdateUIEvent_Enable 2836
-#define wxUpdateUIEvent_Show 2837
-#define wxUpdateUIEvent_GetChecked 2838
-#define wxUpdateUIEvent_GetEnabled 2839
-#define wxUpdateUIEvent_GetShown 2840
-#define wxUpdateUIEvent_GetSetChecked 2841
-#define wxUpdateUIEvent_GetSetEnabled 2842
-#define wxUpdateUIEvent_GetSetShown 2843
-#define wxUpdateUIEvent_GetSetText 2844
-#define wxUpdateUIEvent_GetText 2845
-#define wxUpdateUIEvent_GetMode 2846
-#define wxUpdateUIEvent_GetUpdateInterval 2847
-#define wxUpdateUIEvent_ResetUpdateTime 2848
-#define wxUpdateUIEvent_SetMode 2849
-#define wxUpdateUIEvent_SetText 2850
-#define wxUpdateUIEvent_SetUpdateInterval 2851
-#define wxMouseCaptureChangedEvent_GetCapturedWindow 2852
-#define wxPaletteChangedEvent_SetChangedWindow 2853
-#define wxPaletteChangedEvent_GetChangedWindow 2854
-#define wxQueryNewPaletteEvent_SetPaletteRealized 2855
-#define wxQueryNewPaletteEvent_GetPaletteRealized 2856
-#define wxNavigationKeyEvent_GetDirection 2857
-#define wxNavigationKeyEvent_SetDirection 2858
-#define wxNavigationKeyEvent_IsWindowChange 2859
-#define wxNavigationKeyEvent_SetWindowChange 2860
-#define wxNavigationKeyEvent_IsFromTab 2861
-#define wxNavigationKeyEvent_SetFromTab 2862
-#define wxNavigationKeyEvent_GetCurrentFocus 2863
-#define wxNavigationKeyEvent_SetCurrentFocus 2864
-#define wxHelpEvent_GetOrigin 2865
-#define wxHelpEvent_GetPosition 2866
-#define wxHelpEvent_SetOrigin 2867
-#define wxHelpEvent_SetPosition 2868
-#define wxContextMenuEvent_GetPosition 2869
-#define wxContextMenuEvent_SetPosition 2870
-#define wxIdleEvent_CanSend 2871
-#define wxIdleEvent_GetMode 2872
-#define wxIdleEvent_RequestMore 2873
-#define wxIdleEvent_MoreRequested 2874
-#define wxIdleEvent_SetMode 2875
-#define wxGridEvent_AltDown 2876
-#define wxGridEvent_ControlDown 2877
-#define wxGridEvent_GetCol 2878
-#define wxGridEvent_GetPosition 2879
-#define wxGridEvent_GetRow 2880
-#define wxGridEvent_MetaDown 2881
-#define wxGridEvent_Selecting 2882
-#define wxGridEvent_ShiftDown 2883
-#define wxNotifyEvent_Allow 2884
-#define wxNotifyEvent_IsAllowed 2885
-#define wxNotifyEvent_Veto 2886
-#define wxSashEvent_GetEdge 2887
-#define wxSashEvent_GetDragRect 2888
-#define wxSashEvent_GetDragStatus 2889
-#define wxListEvent_GetCacheFrom 2890
-#define wxListEvent_GetCacheTo 2891
-#define wxListEvent_GetKeyCode 2892
-#define wxListEvent_GetIndex 2893
-#define wxListEvent_GetColumn 2894
-#define wxListEvent_GetPoint 2895
-#define wxListEvent_GetLabel 2896
-#define wxListEvent_GetText 2897
-#define wxListEvent_GetImage 2898
-#define wxListEvent_GetData 2899
-#define wxListEvent_GetMask 2900
-#define wxListEvent_GetItem 2901
-#define wxListEvent_IsEditCancelled 2902
-#define wxDateEvent_GetDate 2903
-#define wxCalendarEvent_GetWeekDay 2904
-#define wxFileDirPickerEvent_GetPath 2905
-#define wxColourPickerEvent_GetColour 2906
-#define wxFontPickerEvent_GetFont 2907
-#define wxStyledTextEvent_GetPosition 2908
-#define wxStyledTextEvent_GetKey 2909
-#define wxStyledTextEvent_GetModifiers 2910
-#define wxStyledTextEvent_GetModificationType 2911
-#define wxStyledTextEvent_GetText 2912
-#define wxStyledTextEvent_GetLength 2913
-#define wxStyledTextEvent_GetLinesAdded 2914
-#define wxStyledTextEvent_GetLine 2915
-#define wxStyledTextEvent_GetFoldLevelNow 2916
-#define wxStyledTextEvent_GetFoldLevelPrev 2917
-#define wxStyledTextEvent_GetMargin 2918
-#define wxStyledTextEvent_GetMessage 2919
-#define wxStyledTextEvent_GetWParam 2920
-#define wxStyledTextEvent_GetLParam 2921
-#define wxStyledTextEvent_GetListType 2922
-#define wxStyledTextEvent_GetX 2923
-#define wxStyledTextEvent_GetY 2924
-#define wxStyledTextEvent_GetDragText 2925
-#define wxStyledTextEvent_GetDragAllowMove 2926
-#define wxStyledTextEvent_GetDragResult 2927
-#define wxStyledTextEvent_GetShift 2928
-#define wxStyledTextEvent_GetControl 2929
-#define wxStyledTextEvent_GetAlt 2930
-#define utils_wxGetKeyState 2931
-#define utils_wxGetMousePosition 2932
-#define utils_wxGetMouseState 2933
-#define utils_wxSetDetectableAutoRepeat 2934
-#define utils_wxBell 2935
-#define utils_wxFindMenuItemId 2936
-#define utils_wxGenericFindWindowAtPoint 2937
-#define utils_wxFindWindowAtPoint 2938
-#define utils_wxBeginBusyCursor 2939
-#define utils_wxEndBusyCursor 2940
-#define utils_wxIsBusy 2941
-#define utils_wxShutdown 2942
-#define utils_wxShell 2943
-#define utils_wxLaunchDefaultBrowser 2944
-#define utils_wxGetEmailAddress 2945
-#define utils_wxGetUserId 2946
-#define utils_wxGetHomeDir 2947
-#define utils_wxNewId 2948
-#define utils_wxRegisterId 2949
-#define utils_wxGetCurrentId 2950
-#define utils_wxGetOsDescription 2951
-#define utils_wxIsPlatformLittleEndian 2952
-#define utils_wxIsPlatform64Bit 2953
-#define gdicmn_wxDisplaySize 2954
-#define gdicmn_wxSetCursor 2955
-#define wxPrintout_new 2956
-#define wxPrintout_destruct 2957
-#define wxPrintout_GetDC 2958
-#define wxPrintout_GetPageSizeMM 2959
-#define wxPrintout_GetPageSizePixels 2960
-#define wxPrintout_GetPaperRectPixels 2961
-#define wxPrintout_GetPPIPrinter 2962
-#define wxPrintout_GetPPIScreen 2963
-#define wxPrintout_GetTitle 2964
-#define wxPrintout_IsPreview 2965
-#define wxPrintout_FitThisSizeToPaper 2966
-#define wxPrintout_FitThisSizeToPage 2967
-#define wxPrintout_FitThisSizeToPageMargins 2968
-#define wxPrintout_MapScreenSizeToPaper 2969
-#define wxPrintout_MapScreenSizeToPage 2970
-#define wxPrintout_MapScreenSizeToPageMargins 2971
-#define wxPrintout_MapScreenSizeToDevice 2972
-#define wxPrintout_GetLogicalPaperRect 2973
-#define wxPrintout_GetLogicalPageRect 2974
-#define wxPrintout_GetLogicalPageMarginsRect 2975
-#define wxPrintout_SetLogicalOrigin 2976
-#define wxPrintout_OffsetLogicalOrigin 2977
-#define wxStyledTextCtrl_new_2 2978
-#define wxStyledTextCtrl_new_0 2979
-#define wxStyledTextCtrl_destruct 2980
-#define wxStyledTextCtrl_Create 2981
-#define wxStyledTextCtrl_AddText 2982
-#define wxStyledTextCtrl_AddStyledText 2983
-#define wxStyledTextCtrl_InsertText 2984
-#define wxStyledTextCtrl_ClearAll 2985
-#define wxStyledTextCtrl_ClearDocumentStyle 2986
-#define wxStyledTextCtrl_GetLength 2987
-#define wxStyledTextCtrl_GetCharAt 2988
-#define wxStyledTextCtrl_GetCurrentPos 2989
-#define wxStyledTextCtrl_GetAnchor 2990
-#define wxStyledTextCtrl_GetStyleAt 2991
-#define wxStyledTextCtrl_Redo 2992
-#define wxStyledTextCtrl_SetUndoCollection 2993
-#define wxStyledTextCtrl_SelectAll 2994
-#define wxStyledTextCtrl_SetSavePoint 2995
-#define wxStyledTextCtrl_GetStyledText 2996
-#define wxStyledTextCtrl_CanRedo 2997
-#define wxStyledTextCtrl_MarkerLineFromHandle 2998
-#define wxStyledTextCtrl_MarkerDeleteHandle 2999
-#define wxStyledTextCtrl_GetUndoCollection 3000
-#define wxStyledTextCtrl_GetViewWhiteSpace 3001
-#define wxStyledTextCtrl_SetViewWhiteSpace 3002
-#define wxStyledTextCtrl_PositionFromPoint 3003
-#define wxStyledTextCtrl_PositionFromPointClose 3004
-#define wxStyledTextCtrl_GotoLine 3005
-#define wxStyledTextCtrl_GotoPos 3006
-#define wxStyledTextCtrl_SetAnchor 3007
-#define wxStyledTextCtrl_GetCurLine 3008
-#define wxStyledTextCtrl_GetEndStyled 3009
-#define wxStyledTextCtrl_ConvertEOLs 3010
-#define wxStyledTextCtrl_GetEOLMode 3011
-#define wxStyledTextCtrl_SetEOLMode 3012
-#define wxStyledTextCtrl_StartStyling 3013
-#define wxStyledTextCtrl_SetStyling 3014
-#define wxStyledTextCtrl_GetBufferedDraw 3015
-#define wxStyledTextCtrl_SetBufferedDraw 3016
-#define wxStyledTextCtrl_SetTabWidth 3017
-#define wxStyledTextCtrl_GetTabWidth 3018
-#define wxStyledTextCtrl_SetCodePage 3019
-#define wxStyledTextCtrl_MarkerDefine 3020
-#define wxStyledTextCtrl_MarkerSetForeground 3021
-#define wxStyledTextCtrl_MarkerSetBackground 3022
-#define wxStyledTextCtrl_MarkerAdd 3023
-#define wxStyledTextCtrl_MarkerDelete 3024
-#define wxStyledTextCtrl_MarkerDeleteAll 3025
-#define wxStyledTextCtrl_MarkerGet 3026
-#define wxStyledTextCtrl_MarkerNext 3027
-#define wxStyledTextCtrl_MarkerPrevious 3028
-#define wxStyledTextCtrl_MarkerDefineBitmap 3029
-#define wxStyledTextCtrl_MarkerAddSet 3030
-#define wxStyledTextCtrl_MarkerSetAlpha 3031
-#define wxStyledTextCtrl_SetMarginType 3032
-#define wxStyledTextCtrl_GetMarginType 3033
-#define wxStyledTextCtrl_SetMarginWidth 3034
-#define wxStyledTextCtrl_GetMarginWidth 3035
-#define wxStyledTextCtrl_SetMarginMask 3036
-#define wxStyledTextCtrl_GetMarginMask 3037
-#define wxStyledTextCtrl_SetMarginSensitive 3038
-#define wxStyledTextCtrl_GetMarginSensitive 3039
-#define wxStyledTextCtrl_StyleClearAll 3040
-#define wxStyledTextCtrl_StyleSetForeground 3041
-#define wxStyledTextCtrl_StyleSetBackground 3042
-#define wxStyledTextCtrl_StyleSetBold 3043
-#define wxStyledTextCtrl_StyleSetItalic 3044
-#define wxStyledTextCtrl_StyleSetSize 3045
-#define wxStyledTextCtrl_StyleSetFaceName 3046
-#define wxStyledTextCtrl_StyleSetEOLFilled 3047
-#define wxStyledTextCtrl_StyleResetDefault 3048
-#define wxStyledTextCtrl_StyleSetUnderline 3049
-#define wxStyledTextCtrl_StyleSetCase 3050
-#define wxStyledTextCtrl_StyleSetHotSpot 3051
-#define wxStyledTextCtrl_SetSelForeground 3052
-#define wxStyledTextCtrl_SetSelBackground 3053
-#define wxStyledTextCtrl_GetSelAlpha 3054
-#define wxStyledTextCtrl_SetSelAlpha 3055
-#define wxStyledTextCtrl_SetCaretForeground 3056
-#define wxStyledTextCtrl_CmdKeyAssign 3057
-#define wxStyledTextCtrl_CmdKeyClear 3058
-#define wxStyledTextCtrl_CmdKeyClearAll 3059
-#define wxStyledTextCtrl_SetStyleBytes 3060
-#define wxStyledTextCtrl_StyleSetVisible 3061
-#define wxStyledTextCtrl_GetCaretPeriod 3062
-#define wxStyledTextCtrl_SetCaretPeriod 3063
-#define wxStyledTextCtrl_SetWordChars 3064
-#define wxStyledTextCtrl_BeginUndoAction 3065
-#define wxStyledTextCtrl_EndUndoAction 3066
-#define wxStyledTextCtrl_IndicatorSetStyle 3067
-#define wxStyledTextCtrl_IndicatorGetStyle 3068
-#define wxStyledTextCtrl_IndicatorSetForeground 3069
-#define wxStyledTextCtrl_IndicatorGetForeground 3070
-#define wxStyledTextCtrl_SetWhitespaceForeground 3071
-#define wxStyledTextCtrl_SetWhitespaceBackground 3072
-#define wxStyledTextCtrl_GetStyleBits 3073
-#define wxStyledTextCtrl_SetLineState 3074
-#define wxStyledTextCtrl_GetLineState 3075
-#define wxStyledTextCtrl_GetMaxLineState 3076
-#define wxStyledTextCtrl_GetCaretLineVisible 3077
-#define wxStyledTextCtrl_SetCaretLineVisible 3078
-#define wxStyledTextCtrl_GetCaretLineBackground 3079
-#define wxStyledTextCtrl_SetCaretLineBackground 3080
-#define wxStyledTextCtrl_AutoCompShow 3081
-#define wxStyledTextCtrl_AutoCompCancel 3082
-#define wxStyledTextCtrl_AutoCompActive 3083
-#define wxStyledTextCtrl_AutoCompPosStart 3084
-#define wxStyledTextCtrl_AutoCompComplete 3085
-#define wxStyledTextCtrl_AutoCompStops 3086
-#define wxStyledTextCtrl_AutoCompSetSeparator 3087
-#define wxStyledTextCtrl_AutoCompGetSeparator 3088
-#define wxStyledTextCtrl_AutoCompSelect 3089
-#define wxStyledTextCtrl_AutoCompSetCancelAtStart 3090
-#define wxStyledTextCtrl_AutoCompGetCancelAtStart 3091
-#define wxStyledTextCtrl_AutoCompSetFillUps 3092
-#define wxStyledTextCtrl_AutoCompSetChooseSingle 3093
-#define wxStyledTextCtrl_AutoCompGetChooseSingle 3094
-#define wxStyledTextCtrl_AutoCompSetIgnoreCase 3095
-#define wxStyledTextCtrl_AutoCompGetIgnoreCase 3096
-#define wxStyledTextCtrl_UserListShow 3097
-#define wxStyledTextCtrl_AutoCompSetAutoHide 3098
-#define wxStyledTextCtrl_AutoCompGetAutoHide 3099
-#define wxStyledTextCtrl_AutoCompSetDropRestOfWord 3100
-#define wxStyledTextCtrl_AutoCompGetDropRestOfWord 3101
-#define wxStyledTextCtrl_RegisterImage 3102
-#define wxStyledTextCtrl_ClearRegisteredImages 3103
-#define wxStyledTextCtrl_AutoCompGetTypeSeparator 3104
-#define wxStyledTextCtrl_AutoCompSetTypeSeparator 3105
-#define wxStyledTextCtrl_AutoCompSetMaxWidth 3106
-#define wxStyledTextCtrl_AutoCompGetMaxWidth 3107
-#define wxStyledTextCtrl_AutoCompSetMaxHeight 3108
-#define wxStyledTextCtrl_AutoCompGetMaxHeight 3109
-#define wxStyledTextCtrl_SetIndent 3110
-#define wxStyledTextCtrl_GetIndent 3111
-#define wxStyledTextCtrl_SetUseTabs 3112
-#define wxStyledTextCtrl_GetUseTabs 3113
-#define wxStyledTextCtrl_SetLineIndentation 3114
-#define wxStyledTextCtrl_GetLineIndentation 3115
-#define wxStyledTextCtrl_GetLineIndentPosition 3116
-#define wxStyledTextCtrl_GetColumn 3117
-#define wxStyledTextCtrl_SetUseHorizontalScrollBar 3118
-#define wxStyledTextCtrl_GetUseHorizontalScrollBar 3119
-#define wxStyledTextCtrl_SetIndentationGuides 3120
-#define wxStyledTextCtrl_GetIndentationGuides 3121
-#define wxStyledTextCtrl_SetHighlightGuide 3122
-#define wxStyledTextCtrl_GetHighlightGuide 3123
-#define wxStyledTextCtrl_GetLineEndPosition 3124
-#define wxStyledTextCtrl_GetCodePage 3125
-#define wxStyledTextCtrl_GetCaretForeground 3126
-#define wxStyledTextCtrl_GetReadOnly 3127
-#define wxStyledTextCtrl_SetCurrentPos 3128
-#define wxStyledTextCtrl_SetSelectionStart 3129
-#define wxStyledTextCtrl_GetSelectionStart 3130
-#define wxStyledTextCtrl_SetSelectionEnd 3131
-#define wxStyledTextCtrl_GetSelectionEnd 3132
-#define wxStyledTextCtrl_SetPrintMagnification 3133
-#define wxStyledTextCtrl_GetPrintMagnification 3134
-#define wxStyledTextCtrl_SetPrintColourMode 3135
-#define wxStyledTextCtrl_GetPrintColourMode 3136
-#define wxStyledTextCtrl_FindText 3137
-#define wxStyledTextCtrl_FormatRange 3138
-#define wxStyledTextCtrl_GetFirstVisibleLine 3139
-#define wxStyledTextCtrl_GetLine 3140
-#define wxStyledTextCtrl_GetLineCount 3141
-#define wxStyledTextCtrl_SetMarginLeft 3142
-#define wxStyledTextCtrl_GetMarginLeft 3143
-#define wxStyledTextCtrl_SetMarginRight 3144
-#define wxStyledTextCtrl_GetMarginRight 3145
-#define wxStyledTextCtrl_GetModify 3146
-#define wxStyledTextCtrl_SetSelection 3147
-#define wxStyledTextCtrl_GetSelectedText 3148
-#define wxStyledTextCtrl_GetTextRange 3149
-#define wxStyledTextCtrl_HideSelection 3150
-#define wxStyledTextCtrl_LineFromPosition 3151
-#define wxStyledTextCtrl_PositionFromLine 3152
-#define wxStyledTextCtrl_LineScroll 3153
-#define wxStyledTextCtrl_EnsureCaretVisible 3154
-#define wxStyledTextCtrl_ReplaceSelection 3155
-#define wxStyledTextCtrl_SetReadOnly 3156
-#define wxStyledTextCtrl_CanPaste 3157
-#define wxStyledTextCtrl_CanUndo 3158
-#define wxStyledTextCtrl_EmptyUndoBuffer 3159
-#define wxStyledTextCtrl_Undo 3160
-#define wxStyledTextCtrl_Cut 3161
-#define wxStyledTextCtrl_Copy 3162
-#define wxStyledTextCtrl_Paste 3163
-#define wxStyledTextCtrl_Clear 3164
-#define wxStyledTextCtrl_SetText 3165
-#define wxStyledTextCtrl_GetText 3166
-#define wxStyledTextCtrl_GetTextLength 3167
-#define wxStyledTextCtrl_GetOvertype 3168
-#define wxStyledTextCtrl_SetCaretWidth 3169
-#define wxStyledTextCtrl_GetCaretWidth 3170
-#define wxStyledTextCtrl_SetTargetStart 3171
-#define wxStyledTextCtrl_GetTargetStart 3172
-#define wxStyledTextCtrl_SetTargetEnd 3173
-#define wxStyledTextCtrl_GetTargetEnd 3174
-#define wxStyledTextCtrl_ReplaceTarget 3175
-#define wxStyledTextCtrl_SearchInTarget 3176
-#define wxStyledTextCtrl_SetSearchFlags 3177
-#define wxStyledTextCtrl_GetSearchFlags 3178
-#define wxStyledTextCtrl_CallTipShow 3179
-#define wxStyledTextCtrl_CallTipCancel 3180
-#define wxStyledTextCtrl_CallTipActive 3181
-#define wxStyledTextCtrl_CallTipPosAtStart 3182
-#define wxStyledTextCtrl_CallTipSetHighlight 3183
-#define wxStyledTextCtrl_CallTipSetBackground 3184
-#define wxStyledTextCtrl_CallTipSetForeground 3185
-#define wxStyledTextCtrl_CallTipSetForegroundHighlight 3186
-#define wxStyledTextCtrl_CallTipUseStyle 3187
-#define wxStyledTextCtrl_VisibleFromDocLine 3188
-#define wxStyledTextCtrl_DocLineFromVisible 3189
-#define wxStyledTextCtrl_WrapCount 3190
-#define wxStyledTextCtrl_SetFoldLevel 3191
-#define wxStyledTextCtrl_GetFoldLevel 3192
-#define wxStyledTextCtrl_GetLastChild 3193
-#define wxStyledTextCtrl_GetFoldParent 3194
-#define wxStyledTextCtrl_ShowLines 3195
-#define wxStyledTextCtrl_HideLines 3196
-#define wxStyledTextCtrl_GetLineVisible 3197
-#define wxStyledTextCtrl_SetFoldExpanded 3198
-#define wxStyledTextCtrl_GetFoldExpanded 3199
-#define wxStyledTextCtrl_ToggleFold 3200
-#define wxStyledTextCtrl_EnsureVisible 3201
-#define wxStyledTextCtrl_SetFoldFlags 3202
-#define wxStyledTextCtrl_EnsureVisibleEnforcePolicy 3203
-#define wxStyledTextCtrl_SetTabIndents 3204
-#define wxStyledTextCtrl_GetTabIndents 3205
-#define wxStyledTextCtrl_SetBackSpaceUnIndents 3206
-#define wxStyledTextCtrl_GetBackSpaceUnIndents 3207
-#define wxStyledTextCtrl_SetMouseDwellTime 3208
-#define wxStyledTextCtrl_GetMouseDwellTime 3209
-#define wxStyledTextCtrl_WordStartPosition 3210
-#define wxStyledTextCtrl_WordEndPosition 3211
-#define wxStyledTextCtrl_SetWrapMode 3212
-#define wxStyledTextCtrl_GetWrapMode 3213
-#define wxStyledTextCtrl_SetWrapVisualFlags 3214
-#define wxStyledTextCtrl_GetWrapVisualFlags 3215
-#define wxStyledTextCtrl_SetWrapVisualFlagsLocation 3216
-#define wxStyledTextCtrl_GetWrapVisualFlagsLocation 3217
-#define wxStyledTextCtrl_SetWrapStartIndent 3218
-#define wxStyledTextCtrl_GetWrapStartIndent 3219
-#define wxStyledTextCtrl_SetLayoutCache 3220
-#define wxStyledTextCtrl_GetLayoutCache 3221
-#define wxStyledTextCtrl_SetScrollWidth 3222
-#define wxStyledTextCtrl_GetScrollWidth 3223
-#define wxStyledTextCtrl_TextWidth 3224
-#define wxStyledTextCtrl_GetEndAtLastLine 3225
-#define wxStyledTextCtrl_TextHeight 3226
-#define wxStyledTextCtrl_SetUseVerticalScrollBar 3227
-#define wxStyledTextCtrl_GetUseVerticalScrollBar 3228
-#define wxStyledTextCtrl_AppendText 3229
-#define wxStyledTextCtrl_GetTwoPhaseDraw 3230
-#define wxStyledTextCtrl_SetTwoPhaseDraw 3231
-#define wxStyledTextCtrl_TargetFromSelection 3232
-#define wxStyledTextCtrl_LinesJoin 3233
-#define wxStyledTextCtrl_LinesSplit 3234
-#define wxStyledTextCtrl_SetFoldMarginColour 3235
-#define wxStyledTextCtrl_SetFoldMarginHiColour 3236
-#define wxStyledTextCtrl_LineDown 3237
-#define wxStyledTextCtrl_LineDownExtend 3238
-#define wxStyledTextCtrl_LineUp 3239
-#define wxStyledTextCtrl_LineUpExtend 3240
-#define wxStyledTextCtrl_CharLeft 3241
-#define wxStyledTextCtrl_CharLeftExtend 3242
-#define wxStyledTextCtrl_CharRight 3243
-#define wxStyledTextCtrl_CharRightExtend 3244
-#define wxStyledTextCtrl_WordLeft 3245
-#define wxStyledTextCtrl_WordLeftExtend 3246
-#define wxStyledTextCtrl_WordRight 3247
-#define wxStyledTextCtrl_WordRightExtend 3248
-#define wxStyledTextCtrl_Home 3249
-#define wxStyledTextCtrl_HomeExtend 3250
-#define wxStyledTextCtrl_LineEnd 3251
-#define wxStyledTextCtrl_LineEndExtend 3252
-#define wxStyledTextCtrl_DocumentStart 3253
-#define wxStyledTextCtrl_DocumentStartExtend 3254
-#define wxStyledTextCtrl_DocumentEnd 3255
-#define wxStyledTextCtrl_DocumentEndExtend 3256
-#define wxStyledTextCtrl_PageUp 3257
-#define wxStyledTextCtrl_PageUpExtend 3258
-#define wxStyledTextCtrl_PageDown 3259
-#define wxStyledTextCtrl_PageDownExtend 3260
-#define wxStyledTextCtrl_EditToggleOvertype 3261
-#define wxStyledTextCtrl_Cancel 3262
-#define wxStyledTextCtrl_DeleteBack 3263
-#define wxStyledTextCtrl_Tab 3264
-#define wxStyledTextCtrl_BackTab 3265
-#define wxStyledTextCtrl_NewLine 3266
-#define wxStyledTextCtrl_FormFeed 3267
-#define wxStyledTextCtrl_VCHome 3268
-#define wxStyledTextCtrl_VCHomeExtend 3269
-#define wxStyledTextCtrl_ZoomIn 3270
-#define wxStyledTextCtrl_ZoomOut 3271
-#define wxStyledTextCtrl_DelWordLeft 3272
-#define wxStyledTextCtrl_DelWordRight 3273
-#define wxStyledTextCtrl_LineCut 3274
-#define wxStyledTextCtrl_LineDelete 3275
-#define wxStyledTextCtrl_LineTranspose 3276
-#define wxStyledTextCtrl_LineDuplicate 3277
-#define wxStyledTextCtrl_LowerCase 3278
-#define wxStyledTextCtrl_UpperCase 3279
-#define wxStyledTextCtrl_LineScrollDown 3280
-#define wxStyledTextCtrl_LineScrollUp 3281
-#define wxStyledTextCtrl_DeleteBackNotLine 3282
-#define wxStyledTextCtrl_HomeDisplay 3283
-#define wxStyledTextCtrl_HomeDisplayExtend 3284
-#define wxStyledTextCtrl_LineEndDisplay 3285
-#define wxStyledTextCtrl_LineEndDisplayExtend 3286
-#define wxStyledTextCtrl_HomeWrapExtend 3287
-#define wxStyledTextCtrl_LineEndWrap 3288
-#define wxStyledTextCtrl_LineEndWrapExtend 3289
-#define wxStyledTextCtrl_VCHomeWrap 3290
-#define wxStyledTextCtrl_VCHomeWrapExtend 3291
-#define wxStyledTextCtrl_LineCopy 3292
-#define wxStyledTextCtrl_MoveCaretInsideView 3293
-#define wxStyledTextCtrl_LineLength 3294
-#define wxStyledTextCtrl_BraceHighlight 3295
-#define wxStyledTextCtrl_BraceBadLight 3296
-#define wxStyledTextCtrl_BraceMatch 3297
-#define wxStyledTextCtrl_GetViewEOL 3298
-#define wxStyledTextCtrl_SetViewEOL 3299
-#define wxStyledTextCtrl_SetModEventMask 3300
-#define wxStyledTextCtrl_GetEdgeColumn 3301
-#define wxStyledTextCtrl_SetEdgeColumn 3302
-#define wxStyledTextCtrl_SetEdgeMode 3303
-#define wxStyledTextCtrl_GetEdgeMode 3304
-#define wxStyledTextCtrl_GetEdgeColour 3305
-#define wxStyledTextCtrl_SetEdgeColour 3306
-#define wxStyledTextCtrl_SearchAnchor 3307
-#define wxStyledTextCtrl_SearchNext 3308
-#define wxStyledTextCtrl_SearchPrev 3309
-#define wxStyledTextCtrl_LinesOnScreen 3310
-#define wxStyledTextCtrl_UsePopUp 3311
-#define wxStyledTextCtrl_SelectionIsRectangle 3312
-#define wxStyledTextCtrl_SetZoom 3313
-#define wxStyledTextCtrl_GetZoom 3314
-#define wxStyledTextCtrl_GetModEventMask 3315
-#define wxStyledTextCtrl_SetSTCFocus 3316
-#define wxStyledTextCtrl_GetSTCFocus 3317
-#define wxStyledTextCtrl_SetStatus 3318
-#define wxStyledTextCtrl_GetStatus 3319
-#define wxStyledTextCtrl_SetMouseDownCaptures 3320
-#define wxStyledTextCtrl_GetMouseDownCaptures 3321
-#define wxStyledTextCtrl_SetSTCCursor 3322
-#define wxStyledTextCtrl_GetSTCCursor 3323
-#define wxStyledTextCtrl_SetControlCharSymbol 3324
-#define wxStyledTextCtrl_GetControlCharSymbol 3325
-#define wxStyledTextCtrl_WordPartLeft 3326
-#define wxStyledTextCtrl_WordPartLeftExtend 3327
-#define wxStyledTextCtrl_WordPartRight 3328
-#define wxStyledTextCtrl_WordPartRightExtend 3329
-#define wxStyledTextCtrl_SetVisiblePolicy 3330
-#define wxStyledTextCtrl_DelLineLeft 3331
-#define wxStyledTextCtrl_DelLineRight 3332
-#define wxStyledTextCtrl_GetXOffset 3333
-#define wxStyledTextCtrl_ChooseCaretX 3334
-#define wxStyledTextCtrl_SetXCaretPolicy 3335
-#define wxStyledTextCtrl_SetYCaretPolicy 3336
-#define wxStyledTextCtrl_GetPrintWrapMode 3337
-#define wxStyledTextCtrl_SetHotspotActiveForeground 3338
-#define wxStyledTextCtrl_SetHotspotActiveBackground 3339
-#define wxStyledTextCtrl_SetHotspotActiveUnderline 3340
-#define wxStyledTextCtrl_SetHotspotSingleLine 3341
-#define wxStyledTextCtrl_ParaDownExtend 3342
-#define wxStyledTextCtrl_ParaUp 3343
-#define wxStyledTextCtrl_ParaUpExtend 3344
-#define wxStyledTextCtrl_PositionBefore 3345
-#define wxStyledTextCtrl_PositionAfter 3346
-#define wxStyledTextCtrl_CopyRange 3347
-#define wxStyledTextCtrl_CopyText 3348
-#define wxStyledTextCtrl_SetSelectionMode 3349
-#define wxStyledTextCtrl_GetSelectionMode 3350
-#define wxStyledTextCtrl_LineDownRectExtend 3351
-#define wxStyledTextCtrl_LineUpRectExtend 3352
-#define wxStyledTextCtrl_CharLeftRectExtend 3353
-#define wxStyledTextCtrl_CharRightRectExtend 3354
-#define wxStyledTextCtrl_HomeRectExtend 3355
-#define wxStyledTextCtrl_VCHomeRectExtend 3356
-#define wxStyledTextCtrl_LineEndRectExtend 3357
-#define wxStyledTextCtrl_PageUpRectExtend 3358
-#define wxStyledTextCtrl_PageDownRectExtend 3359
-#define wxStyledTextCtrl_StutteredPageUp 3360
-#define wxStyledTextCtrl_StutteredPageUpExtend 3361
-#define wxStyledTextCtrl_StutteredPageDown 3362
-#define wxStyledTextCtrl_StutteredPageDownExtend 3363
-#define wxStyledTextCtrl_WordLeftEnd 3364
-#define wxStyledTextCtrl_WordLeftEndExtend 3365
-#define wxStyledTextCtrl_WordRightEnd 3366
-#define wxStyledTextCtrl_WordRightEndExtend 3367
-#define wxStyledTextCtrl_SetWhitespaceChars 3368
-#define wxStyledTextCtrl_SetCharsDefault 3369
-#define wxStyledTextCtrl_AutoCompGetCurrent 3370
-#define wxStyledTextCtrl_Allocate 3371
-#define wxStyledTextCtrl_FindColumn 3372
-#define wxStyledTextCtrl_GetCaretSticky 3373
-#define wxStyledTextCtrl_SetCaretSticky 3374
-#define wxStyledTextCtrl_ToggleCaretSticky 3375
-#define wxStyledTextCtrl_SetPasteConvertEndings 3376
-#define wxStyledTextCtrl_GetPasteConvertEndings 3377
-#define wxStyledTextCtrl_SelectionDuplicate 3378
-#define wxStyledTextCtrl_SetCaretLineBackAlpha 3379
-#define wxStyledTextCtrl_GetCaretLineBackAlpha 3380
-#define wxStyledTextCtrl_StartRecord 3381
-#define wxStyledTextCtrl_StopRecord 3382
-#define wxStyledTextCtrl_SetLexer 3383
-#define wxStyledTextCtrl_GetLexer 3384
-#define wxStyledTextCtrl_Colourise 3385
-#define wxStyledTextCtrl_SetProperty 3386
-#define wxStyledTextCtrl_SetKeyWords 3387
-#define wxStyledTextCtrl_SetLexerLanguage 3388
-#define wxStyledTextCtrl_GetProperty 3389
-#define wxStyledTextCtrl_GetStyleBitsNeeded 3390
-#define wxStyledTextCtrl_GetCurrentLine 3391
-#define wxStyledTextCtrl_StyleSetSpec 3392
-#define wxStyledTextCtrl_StyleSetFont 3393
-#define wxStyledTextCtrl_StyleSetFontAttr 3394
-#define wxStyledTextCtrl_StyleSetCharacterSet 3395
-#define wxStyledTextCtrl_StyleSetFontEncoding 3396
-#define wxStyledTextCtrl_CmdKeyExecute 3397
-#define wxStyledTextCtrl_SetMargins 3398
-#define wxStyledTextCtrl_GetSelection 3399
-#define wxStyledTextCtrl_PointFromPosition 3400
-#define wxStyledTextCtrl_ScrollToLine 3401
-#define wxStyledTextCtrl_ScrollToColumn 3402
-#define wxStyledTextCtrl_SetVScrollBar 3403
-#define wxStyledTextCtrl_SetHScrollBar 3404
-#define wxStyledTextCtrl_GetLastKeydownProcessed 3405
-#define wxStyledTextCtrl_SetLastKeydownProcessed 3406
-#define wxStyledTextCtrl_SaveFile 3407
-#define wxStyledTextCtrl_LoadFile 3408
-#define wxStyledTextCtrl_DoDragOver 3409
-#define wxStyledTextCtrl_DoDropText 3410
-#define wxStyledTextCtrl_GetUseAntiAliasing 3411
-#define wxStyledTextCtrl_AddTextRaw 3412
-#define wxStyledTextCtrl_InsertTextRaw 3413
-#define wxStyledTextCtrl_GetCurLineRaw 3414
-#define wxStyledTextCtrl_GetLineRaw 3415
-#define wxStyledTextCtrl_GetSelectedTextRaw 3416
-#define wxStyledTextCtrl_GetTextRangeRaw 3417
-#define wxStyledTextCtrl_SetTextRaw 3418
-#define wxStyledTextCtrl_GetTextRaw 3419
-#define wxStyledTextCtrl_AppendTextRaw 3420
-#define wxArtProvider_GetBitmap 3421
-#define wxArtProvider_GetIcon 3422
-#define wxTreeEvent_GetKeyCode 3423
-#define wxTreeEvent_GetItem 3424
-#define wxTreeEvent_GetKeyEvent 3425
-#define wxTreeEvent_GetLabel 3426
-#define wxTreeEvent_GetOldItem 3427
-#define wxTreeEvent_GetPoint 3428
-#define wxTreeEvent_IsEditCancelled 3429
-#define wxTreeEvent_SetToolTip 3430
-#define wxNotebookEvent_GetOldSelection 3431
-#define wxNotebookEvent_GetSelection 3432
-#define wxNotebookEvent_SetOldSelection 3433
-#define wxNotebookEvent_SetSelection 3434
-#define wxFileDataObject_new 3435
-#define wxFileDataObject_AddFile 3436
-#define wxFileDataObject_GetFilenames 3437
-#define wxFileDataObject_destroy 3438
-#define wxTextDataObject_new 3439
-#define wxTextDataObject_GetTextLength 3440
-#define wxTextDataObject_GetText 3441
-#define wxTextDataObject_SetText 3442
-#define wxTextDataObject_destroy 3443
-#define wxBitmapDataObject_new_1_1 3444
-#define wxBitmapDataObject_new_1_0 3445
-#define wxBitmapDataObject_GetBitmap 3446
-#define wxBitmapDataObject_SetBitmap 3447
-#define wxBitmapDataObject_destroy 3448
-#define wxClipboard_new 3450
-#define wxClipboard_destruct 3451
-#define wxClipboard_AddData 3452
-#define wxClipboard_Clear 3453
-#define wxClipboard_Close 3454
-#define wxClipboard_Flush 3455
-#define wxClipboard_GetData 3456
-#define wxClipboard_IsOpened 3457
-#define wxClipboard_Open 3458
-#define wxClipboard_SetData 3459
-#define wxClipboard_UsePrimarySelection 3461
-#define wxClipboard_IsSupported 3462
-#define wxClipboard_Get 3463
-#define wxSpinEvent_GetPosition 3464
-#define wxSpinEvent_SetPosition 3465
-#define wxSplitterWindow_new_0 3466
-#define wxSplitterWindow_new_2 3467
-#define wxSplitterWindow_destruct 3468
-#define wxSplitterWindow_Create 3469
-#define wxSplitterWindow_GetMinimumPaneSize 3470
-#define wxSplitterWindow_GetSashGravity 3471
-#define wxSplitterWindow_GetSashPosition 3472
-#define wxSplitterWindow_GetSplitMode 3473
-#define wxSplitterWindow_GetWindow1 3474
-#define wxSplitterWindow_GetWindow2 3475
-#define wxSplitterWindow_Initialize 3476
-#define wxSplitterWindow_IsSplit 3477
-#define wxSplitterWindow_ReplaceWindow 3478
-#define wxSplitterWindow_SetSashGravity 3479
-#define wxSplitterWindow_SetSashPosition 3480
-#define wxSplitterWindow_SetSashSize 3481
-#define wxSplitterWindow_SetMinimumPaneSize 3482
-#define wxSplitterWindow_SetSplitMode 3483
-#define wxSplitterWindow_SplitHorizontally 3484
-#define wxSplitterWindow_SplitVertically 3485
-#define wxSplitterWindow_Unsplit 3486
-#define wxSplitterWindow_UpdateSize 3487
-#define wxSplitterEvent_GetSashPosition 3488
-#define wxSplitterEvent_GetX 3489
-#define wxSplitterEvent_GetY 3490
-#define wxSplitterEvent_GetWindowBeingRemoved 3491
-#define wxSplitterEvent_SetSashPosition 3492
-#define wxHtmlWindow_new_0 3493
-#define wxHtmlWindow_new_2 3494
-#define wxHtmlWindow_AppendToPage 3495
-#define wxHtmlWindow_GetOpenedAnchor 3496
-#define wxHtmlWindow_GetOpenedPage 3497
-#define wxHtmlWindow_GetOpenedPageTitle 3498
-#define wxHtmlWindow_GetRelatedFrame 3499
-#define wxHtmlWindow_HistoryBack 3500
-#define wxHtmlWindow_HistoryCanBack 3501
-#define wxHtmlWindow_HistoryCanForward 3502
-#define wxHtmlWindow_HistoryClear 3503
-#define wxHtmlWindow_HistoryForward 3504
-#define wxHtmlWindow_LoadFile 3505
-#define wxHtmlWindow_LoadPage 3506
-#define wxHtmlWindow_SelectAll 3507
-#define wxHtmlWindow_SelectionToText 3508
-#define wxHtmlWindow_SelectLine 3509
-#define wxHtmlWindow_SelectWord 3510
-#define wxHtmlWindow_SetBorders 3511
-#define wxHtmlWindow_SetFonts 3512
-#define wxHtmlWindow_SetPage 3513
-#define wxHtmlWindow_SetRelatedFrame 3514
-#define wxHtmlWindow_SetRelatedStatusBar 3515
-#define wxHtmlWindow_ToText 3516
-#define wxHtmlWindow_destroy 3517
-#define wxHtmlLinkEvent_GetLinkInfo 3518
-#define wxSystemSettings_GetColour 3519
-#define wxSystemSettings_GetFont 3520
-#define wxSystemSettings_GetMetric 3521
-#define wxSystemSettings_GetScreenType 3522
-#define wxSystemOptions_GetOption 3523
-#define wxSystemOptions_GetOptionInt 3524
-#define wxSystemOptions_HasOption 3525
-#define wxSystemOptions_IsFalse 3526
-#define wxSystemOptions_SetOption_2_1 3527
-#define wxSystemOptions_SetOption_2_0 3528
-#define wxAuiNotebookEvent_SetSelection 3529
-#define wxAuiNotebookEvent_GetSelection 3530
-#define wxAuiNotebookEvent_SetOldSelection 3531
-#define wxAuiNotebookEvent_GetOldSelection 3532
-#define wxAuiNotebookEvent_SetDragSource 3533
-#define wxAuiNotebookEvent_GetDragSource 3534
-#define wxAuiManagerEvent_SetManager 3535
-#define wxAuiManagerEvent_GetManager 3536
-#define wxAuiManagerEvent_SetPane 3537
-#define wxAuiManagerEvent_GetPane 3538
-#define wxAuiManagerEvent_SetButton 3539
-#define wxAuiManagerEvent_GetButton 3540
-#define wxAuiManagerEvent_SetDC 3541
-#define wxAuiManagerEvent_GetDC 3542
-#define wxAuiManagerEvent_Veto 3543
-#define wxAuiManagerEvent_GetVeto 3544
-#define wxAuiManagerEvent_SetCanVeto 3545
-#define wxAuiManagerEvent_CanVeto 3546
-#define wxLogNull_new 3547
-#define wxLogNull_destroy 3548
-#define wxTaskBarIcon_new 3549
-#define wxTaskBarIcon_destruct 3550
-#define wxTaskBarIcon_PopupMenu 3551
-#define wxTaskBarIcon_RemoveIcon 3552
-#define wxTaskBarIcon_SetIcon 3553
-#define wxLocale_new_0 3554
-#define wxLocale_new_2 3556
-#define wxLocale_destruct 3557
-#define wxLocale_Init 3559
-#define wxLocale_AddCatalog_1 3560
-#define wxLocale_AddCatalog_3 3561
-#define wxLocale_AddCatalogLookupPathPrefix 3562
-#define wxLocale_GetCanonicalName 3563
-#define wxLocale_GetLanguage 3564
-#define wxLocale_GetLanguageName 3565
-#define wxLocale_GetLocale 3566
-#define wxLocale_GetName 3567
-#define wxLocale_GetString_2 3568
-#define wxLocale_GetString_4 3569
-#define wxLocale_GetHeaderValue 3570
-#define wxLocale_GetSysName 3571
-#define wxLocale_GetSystemEncoding 3572
-#define wxLocale_GetSystemEncodingName 3573
-#define wxLocale_GetSystemLanguage 3574
-#define wxLocale_IsLoaded 3575
-#define wxLocale_IsOk 3576
-#define wxActivateEvent_GetActive 3577
-#define wxPopupWindow_new_2 3579
-#define wxPopupWindow_new_0 3580
-#define wxPopupWindow_destruct 3582
-#define wxPopupWindow_Create 3583
-#define wxPopupWindow_Position 3584
-#define wxPopupTransientWindow_new_0 3585
-#define wxPopupTransientWindow_new_2 3586
-#define wxPopupTransientWindow_destruct 3587
-#define wxPopupTransientWindow_Popup 3588
-#define wxPopupTransientWindow_Dismiss 3589
-#define wxOverlay_new 3590
-#define wxOverlay_destruct 3591
-#define wxOverlay_Reset 3592
-#define wxDCOverlay_new_6 3593
-#define wxDCOverlay_new_2 3594
-#define wxDCOverlay_destruct 3595
-#define wxDCOverlay_Clear 3596
-#define wxDropFilesEvent_GetPosition 3597
-#define wxDropFilesEvent_GetNumberOfFiles 3598
-#define wxDropFilesEvent_GetFiles 3599
-#define wxDisplay_new 3600
-#define wxDisplay_destruct 3601
-#define wxDisplay_IsOk 3602
-#define wxDisplay_GetClientArea 3603
-#define wxDisplay_GetGeometry 3604
-#define wxDisplay_GetName 3605
-#define wxDisplay_IsPrimary 3606
-#define wxDisplay_GetCount 3607
-#define wxDisplay_GetFromPoint 3608
-#define wxDisplay_GetFromWindow 3609
-#define wxDisplay_GetPPI 3610
-#define wxGCDC_new_1 3611
-#define wxGCDC_new_0 3612
-#define wxGCDC_destruct 3613
-#define wxGCDC_GetGraphicsContext 3614
-#define wxGCDC_SetGraphicsContext 3615
+#define wxWindow_IsShownOnScreen 201
+#define wxWindow_Layout 202
+#define wxWindow_LineDown 203
+#define wxWindow_LineUp 204
+#define wxWindow_Lower 205
+#define wxWindow_MakeModal 206
+#define wxWindow_Move_3 207
+#define wxWindow_Move_2 208
+#define wxWindow_MoveAfterInTabOrder 209
+#define wxWindow_MoveBeforeInTabOrder 210
+#define wxWindow_Navigate 211
+#define wxWindow_PageDown 212
+#define wxWindow_PageUp 213
+#define wxWindow_PopEventHandler 214
+#define wxWindow_PopupMenu_2 215
+#define wxWindow_PopupMenu_3 216
+#define wxWindow_Raise 217
+#define wxWindow_Refresh 218
+#define wxWindow_RefreshRect 219
+#define wxWindow_ReleaseMouse 220
+#define wxWindow_RemoveChild 221
+#define wxWindow_Reparent 222
+#define wxWindow_ScreenToClient_2 223
+#define wxWindow_ScreenToClient_1 224
+#define wxWindow_ScrollLines 226
+#define wxWindow_ScrollPages 228
+#define wxWindow_ScrollWindow 229
+#define wxWindow_SetAcceleratorTable 230
+#define wxWindow_SetAutoLayout 231
+#define wxWindow_SetBackgroundColour 232
+#define wxWindow_SetBackgroundStyle 233
+#define wxWindow_SetCaret 234
+#define wxWindow_SetClientSize_2 235
+#define wxWindow_SetClientSize_1_0 236
+#define wxWindow_SetClientSize_1_1 237
+#define wxWindow_SetContainingSizer 238
+#define wxWindow_SetCursor 239
+#define wxWindow_SetMaxSize 240
+#define wxWindow_SetMinSize 241
+#define wxWindow_SetOwnBackgroundColour 242
+#define wxWindow_SetOwnFont 243
+#define wxWindow_SetOwnForegroundColour 244
+#define wxWindow_SetDropTarget 245
+#define wxWindow_SetExtraStyle 246
+#define wxWindow_SetFocus 247
+#define wxWindow_SetFocusFromKbd 248
+#define wxWindow_SetFont 249
+#define wxWindow_SetForegroundColour 250
+#define wxWindow_SetHelpText 251
+#define wxWindow_SetId 252
+#define wxWindow_SetLabel 254
+#define wxWindow_SetName 255
+#define wxWindow_SetPalette 256
+#define wxWindow_SetScrollbar 257
+#define wxWindow_SetScrollPos 258
+#define wxWindow_SetSize_5 259
+#define wxWindow_SetSize_2_0 260
+#define wxWindow_SetSize_1 261
+#define wxWindow_SetSize_2_1 262
+#define wxWindow_SetSizeHints_3 263
+#define wxWindow_SetSizeHints_2 264
+#define wxWindow_SetSizer 265
+#define wxWindow_SetSizerAndFit 266
+#define wxWindow_SetThemeEnabled 267
+#define wxWindow_SetToolTip_1_0 268
+#define wxWindow_SetToolTip_1_1 269
+#define wxWindow_SetVirtualSize_1 270
+#define wxWindow_SetVirtualSize_2 271
+#define wxWindow_SetVirtualSizeHints_3 272
+#define wxWindow_SetVirtualSizeHints_2 273
+#define wxWindow_SetWindowStyle 274
+#define wxWindow_SetWindowStyleFlag 275
+#define wxWindow_SetWindowVariant 276
+#define wxWindow_ShouldInheritColours 277
+#define wxWindow_Show 278
+#define wxWindow_Thaw 279
+#define wxWindow_TransferDataFromWindow 280
+#define wxWindow_TransferDataToWindow 281
+#define wxWindow_Update 282
+#define wxWindow_UpdateWindowUI 283
+#define wxWindow_Validate 284
+#define wxWindow_WarpPointer 285
+#define wxWindow_SetTransparent 286
+#define wxWindow_CanSetTransparent 287
+#define wxWindow_IsDoubleBuffered 288
+#define wxWindow_SetDoubleBuffered 289
+#define wxWindow_GetContentScaleFactor 290
+#define wxTopLevelWindow_GetIcon 291
+#define wxTopLevelWindow_GetIcons 292
+#define wxTopLevelWindow_GetTitle 293
+#define wxTopLevelWindow_IsActive 294
+#define wxTopLevelWindow_Iconize 295
+#define wxTopLevelWindow_IsFullScreen 296
+#define wxTopLevelWindow_IsIconized 297
+#define wxTopLevelWindow_IsMaximized 298
+#define wxTopLevelWindow_Maximize 299
+#define wxTopLevelWindow_RequestUserAttention 300
+#define wxTopLevelWindow_SetIcon 301
+#define wxTopLevelWindow_SetIcons 302
+#define wxTopLevelWindow_CenterOnScreen 303
+#define wxTopLevelWindow_CentreOnScreen 304
+#define wxTopLevelWindow_SetShape 306
+#define wxTopLevelWindow_SetTitle 307
+#define wxTopLevelWindow_ShowFullScreen 308
+#define wxFrame_new_4 310
+#define wxFrame_new_0 311
+#define wxFrame_destruct 313
+#define wxFrame_Create 314
+#define wxFrame_CreateStatusBar 315
+#define wxFrame_CreateToolBar 316
+#define wxFrame_GetClientAreaOrigin 317
+#define wxFrame_GetMenuBar 318
+#define wxFrame_GetStatusBar 319
+#define wxFrame_GetStatusBarPane 320
+#define wxFrame_GetToolBar 321
+#define wxFrame_ProcessCommand 322
+#define wxFrame_SendSizeEvent 323
+#define wxFrame_SetMenuBar 324
+#define wxFrame_SetStatusBar 325
+#define wxFrame_SetStatusBarPane 326
+#define wxFrame_SetStatusText 327
+#define wxFrame_SetStatusWidths 328
+#define wxFrame_SetToolBar 329
+#define wxMiniFrame_new_0 330
+#define wxMiniFrame_new_4 331
+#define wxMiniFrame_Create 332
+#define wxMiniFrame_destroy 333
+#define wxSplashScreen_new_0 334
+#define wxSplashScreen_new_6 335
+#define wxSplashScreen_destruct 336
+#define wxSplashScreen_GetSplashStyle 337
+#define wxSplashScreen_GetTimeout 338
+#define wxPanel_new_0 339
+#define wxPanel_new_6 340
+#define wxPanel_new_2 341
+#define wxPanel_destruct 342
+#define wxPanel_InitDialog 343
+#define wxPanel_SetFocusIgnoringChildren 344
+#define wxScrolledWindow_new_0 345
+#define wxScrolledWindow_new_2 346
+#define wxScrolledWindow_destruct 347
+#define wxScrolledWindow_CalcScrolledPosition_4 348
+#define wxScrolledWindow_CalcScrolledPosition_1 349
+#define wxScrolledWindow_CalcUnscrolledPosition_4 350
+#define wxScrolledWindow_CalcUnscrolledPosition_1 351
+#define wxScrolledWindow_EnableScrolling 352
+#define wxScrolledWindow_GetScrollPixelsPerUnit 353
+#define wxScrolledWindow_GetViewStart 354
+#define wxScrolledWindow_DoPrepareDC 355
+#define wxScrolledWindow_PrepareDC 356
+#define wxScrolledWindow_Scroll 357
+#define wxScrolledWindow_SetScrollbars 358
+#define wxScrolledWindow_SetScrollRate 359
+#define wxScrolledWindow_SetTargetWindow 360
+#define wxSashWindow_new_0 361
+#define wxSashWindow_new_2 362
+#define wxSashWindow_destruct 363
+#define wxSashWindow_GetSashVisible 364
+#define wxSashWindow_GetMaximumSizeX 365
+#define wxSashWindow_GetMaximumSizeY 366
+#define wxSashWindow_GetMinimumSizeX 367
+#define wxSashWindow_GetMinimumSizeY 368
+#define wxSashWindow_SetMaximumSizeX 369
+#define wxSashWindow_SetMaximumSizeY 370
+#define wxSashWindow_SetMinimumSizeX 371
+#define wxSashWindow_SetMinimumSizeY 372
+#define wxSashWindow_SetSashVisible 373
+#define wxSashLayoutWindow_new_0 374
+#define wxSashLayoutWindow_new_2 375
+#define wxSashLayoutWindow_Create 376
+#define wxSashLayoutWindow_GetAlignment 377
+#define wxSashLayoutWindow_GetOrientation 378
+#define wxSashLayoutWindow_SetAlignment 379
+#define wxSashLayoutWindow_SetDefaultSize 380
+#define wxSashLayoutWindow_SetOrientation 381
+#define wxSashLayoutWindow_destroy 382
+#define wxGrid_new_0 383
+#define wxGrid_new_3 384
+#define wxGrid_new_4 385
+#define wxGrid_destruct 386
+#define wxGrid_AppendCols 387
+#define wxGrid_AppendRows 388
+#define wxGrid_AutoSize 389
+#define wxGrid_AutoSizeColumn 390
+#define wxGrid_AutoSizeColumns 391
+#define wxGrid_AutoSizeRow 392
+#define wxGrid_AutoSizeRows 393
+#define wxGrid_BeginBatch 394
+#define wxGrid_BlockToDeviceRect 395
+#define wxGrid_CanDragColSize 396
+#define wxGrid_CanDragRowSize 397
+#define wxGrid_CanDragGridSize 398
+#define wxGrid_CanEnableCellControl 399
+#define wxGrid_CellToRect_2 400
+#define wxGrid_CellToRect_1 401
+#define wxGrid_ClearGrid 402
+#define wxGrid_ClearSelection 403
+#define wxGrid_CreateGrid 404
+#define wxGrid_DeleteCols 405
+#define wxGrid_DeleteRows 406
+#define wxGrid_DisableCellEditControl 407
+#define wxGrid_DisableDragColSize 408
+#define wxGrid_DisableDragGridSize 409
+#define wxGrid_DisableDragRowSize 410
+#define wxGrid_EnableCellEditControl 411
+#define wxGrid_EnableDragColSize 412
+#define wxGrid_EnableDragGridSize 413
+#define wxGrid_EnableDragRowSize 414
+#define wxGrid_EnableEditing 415
+#define wxGrid_EnableGridLines 416
+#define wxGrid_EndBatch 417
+#define wxGrid_Fit 418
+#define wxGrid_ForceRefresh 419
+#define wxGrid_GetBatchCount 420
+#define wxGrid_GetCellAlignment 421
+#define wxGrid_GetCellBackgroundColour 422
+#define wxGrid_GetCellEditor 423
+#define wxGrid_GetCellFont 424
+#define wxGrid_GetCellRenderer 425
+#define wxGrid_GetCellTextColour 426
+#define wxGrid_GetCellValue_2 427
+#define wxGrid_GetCellValue_1 428
+#define wxGrid_GetColLabelAlignment 429
+#define wxGrid_GetColLabelSize 430
+#define wxGrid_GetColLabelValue 431
+#define wxGrid_GetColMinimalAcceptableWidth 432
+#define wxGrid_GetDefaultCellAlignment 433
+#define wxGrid_GetDefaultCellBackgroundColour 434
+#define wxGrid_GetDefaultCellFont 435
+#define wxGrid_GetDefaultCellTextColour 436
+#define wxGrid_GetDefaultColLabelSize 437
+#define wxGrid_GetDefaultColSize 438
+#define wxGrid_GetDefaultEditor 439
+#define wxGrid_GetDefaultEditorForCell_2 440
+#define wxGrid_GetDefaultEditorForCell_1 441
+#define wxGrid_GetDefaultEditorForType 442
+#define wxGrid_GetDefaultRenderer 443
+#define wxGrid_GetDefaultRendererForCell 444
+#define wxGrid_GetDefaultRendererForType 445
+#define wxGrid_GetDefaultRowLabelSize 446
+#define wxGrid_GetDefaultRowSize 447
+#define wxGrid_GetGridCursorCol 448
+#define wxGrid_GetGridCursorRow 449
+#define wxGrid_GetGridLineColour 450
+#define wxGrid_GridLinesEnabled 451
+#define wxGrid_GetLabelBackgroundColour 452
+#define wxGrid_GetLabelFont 453
+#define wxGrid_GetLabelTextColour 454
+#define wxGrid_GetNumberCols 455
+#define wxGrid_GetNumberRows 456
+#define wxGrid_GetOrCreateCellAttr 457
+#define wxGrid_GetRowMinimalAcceptableHeight 458
+#define wxGrid_GetRowLabelAlignment 459
+#define wxGrid_GetRowLabelSize 460
+#define wxGrid_GetRowLabelValue 461
+#define wxGrid_GetRowSize 462
+#define wxGrid_GetScrollLineX 463
+#define wxGrid_GetScrollLineY 464
+#define wxGrid_GetSelectedCells 465
+#define wxGrid_GetSelectedCols 466
+#define wxGrid_GetSelectedRows 467
+#define wxGrid_GetSelectionBackground 468
+#define wxGrid_GetSelectionBlockTopLeft 469
+#define wxGrid_GetSelectionBlockBottomRight 470
+#define wxGrid_GetSelectionForeground 471
+#define wxGrid_GetViewWidth 472
+#define wxGrid_GetGridWindow 473
+#define wxGrid_GetGridRowLabelWindow 474
+#define wxGrid_GetGridColLabelWindow 475
+#define wxGrid_GetGridCornerLabelWindow 476
+#define wxGrid_HideCellEditControl 477
+#define wxGrid_InsertCols 478
+#define wxGrid_InsertRows 479
+#define wxGrid_IsCellEditControlEnabled 480
+#define wxGrid_IsCurrentCellReadOnly 481
+#define wxGrid_IsEditable 482
+#define wxGrid_IsInSelection_2 483
+#define wxGrid_IsInSelection_1 484
+#define wxGrid_IsReadOnly 485
+#define wxGrid_IsSelection 486
+#define wxGrid_IsVisible_3 487
+#define wxGrid_IsVisible_2 488
+#define wxGrid_MakeCellVisible_2 489
+#define wxGrid_MakeCellVisible_1 490
+#define wxGrid_MoveCursorDown 491
+#define wxGrid_MoveCursorLeft 492
+#define wxGrid_MoveCursorRight 493
+#define wxGrid_MoveCursorUp 494
+#define wxGrid_MoveCursorDownBlock 495
+#define wxGrid_MoveCursorLeftBlock 496
+#define wxGrid_MoveCursorRightBlock 497
+#define wxGrid_MoveCursorUpBlock 498
+#define wxGrid_MovePageDown 499
+#define wxGrid_MovePageUp 500
+#define wxGrid_RegisterDataType 501
+#define wxGrid_SaveEditControlValue 502
+#define wxGrid_SelectAll 503
+#define wxGrid_SelectBlock_5 504
+#define wxGrid_SelectBlock_3 505
+#define wxGrid_SelectCol 506
+#define wxGrid_SelectRow 507
+#define wxGrid_SetCellAlignment_4 508
+#define wxGrid_SetCellAlignment_3 509
+#define wxGrid_SetCellAlignment_1 510
+#define wxGrid_SetCellBackgroundColour_3_0 511
+#define wxGrid_SetCellBackgroundColour_1 512
+#define wxGrid_SetCellBackgroundColour_3_1 513
+#define wxGrid_SetCellEditor 514
+#define wxGrid_SetCellFont 515
+#define wxGrid_SetCellRenderer 516
+#define wxGrid_SetCellTextColour_3_0 517
+#define wxGrid_SetCellTextColour_3_1 518
+#define wxGrid_SetCellTextColour_1 519
+#define wxGrid_SetCellValue_3_0 520
+#define wxGrid_SetCellValue_2 521
+#define wxGrid_SetCellValue_3_1 522
+#define wxGrid_SetColAttr 523
+#define wxGrid_SetColFormatBool 524
+#define wxGrid_SetColFormatNumber 525
+#define wxGrid_SetColFormatFloat 526
+#define wxGrid_SetColFormatCustom 527
+#define wxGrid_SetColLabelAlignment 528
+#define wxGrid_SetColLabelSize 529
+#define wxGrid_SetColLabelValue 530
+#define wxGrid_SetColMinimalWidth 531
+#define wxGrid_SetColMinimalAcceptableWidth 532
+#define wxGrid_SetColSize 533
+#define wxGrid_SetDefaultCellAlignment 534
+#define wxGrid_SetDefaultCellBackgroundColour 535
+#define wxGrid_SetDefaultCellFont 536
+#define wxGrid_SetDefaultCellTextColour 537
+#define wxGrid_SetDefaultEditor 538
+#define wxGrid_SetDefaultRenderer 539
+#define wxGrid_SetDefaultColSize 540
+#define wxGrid_SetDefaultRowSize 541
+#define wxGrid_SetGridCursor 542
+#define wxGrid_SetGridLineColour 543
+#define wxGrid_SetLabelBackgroundColour 544
+#define wxGrid_SetLabelFont 545
+#define wxGrid_SetLabelTextColour 546
+#define wxGrid_SetMargins 547
+#define wxGrid_SetReadOnly 548
+#define wxGrid_SetRowAttr 549
+#define wxGrid_SetRowLabelAlignment 550
+#define wxGrid_SetRowLabelSize 551
+#define wxGrid_SetRowLabelValue 552
+#define wxGrid_SetRowMinimalHeight 553
+#define wxGrid_SetRowMinimalAcceptableHeight 554
+#define wxGrid_SetRowSize 555
+#define wxGrid_SetScrollLineX 556
+#define wxGrid_SetScrollLineY 557
+#define wxGrid_SetSelectionBackground 558
+#define wxGrid_SetSelectionForeground 559
+#define wxGrid_SetSelectionMode 560
+#define wxGrid_ShowCellEditControl 561
+#define wxGrid_XToCol 562
+#define wxGrid_XToEdgeOfCol 563
+#define wxGrid_YToEdgeOfRow 564
+#define wxGrid_YToRow 565
+#define wxGridCellRenderer_Draw 566
+#define wxGridCellRenderer_GetBestSize 567
+#define wxGridCellEditor_Create 568
+#define wxGridCellEditor_IsCreated 569
+#define wxGridCellEditor_SetSize 570
+#define wxGridCellEditor_Show 571
+#define wxGridCellEditor_PaintBackground 572
+#define wxGridCellEditor_BeginEdit 573
+#define wxGridCellEditor_EndEdit 574
+#define wxGridCellEditor_Reset 575
+#define wxGridCellEditor_StartingKey 576
+#define wxGridCellEditor_StartingClick 577
+#define wxGridCellEditor_HandleReturn 578
+#define wxGridCellBoolRenderer_new 579
+#define wxGridCellBoolRenderer_destroy 580
+#define wxGridCellBoolEditor_new 581
+#define wxGridCellBoolEditor_IsTrueValue 582
+#define wxGridCellBoolEditor_UseStringValues 583
+#define wxGridCellBoolEditor_destroy 584
+#define wxGridCellFloatRenderer_new 585
+#define wxGridCellFloatRenderer_GetPrecision 586
+#define wxGridCellFloatRenderer_GetWidth 587
+#define wxGridCellFloatRenderer_SetParameters 588
+#define wxGridCellFloatRenderer_SetPrecision 589
+#define wxGridCellFloatRenderer_SetWidth 590
+#define wxGridCellFloatRenderer_destroy 591
+#define wxGridCellFloatEditor_new 592
+#define wxGridCellFloatEditor_SetParameters 593
+#define wxGridCellFloatEditor_destroy 594
+#define wxGridCellStringRenderer_new 595
+#define wxGridCellStringRenderer_destroy 596
+#define wxGridCellTextEditor_new 597
+#define wxGridCellTextEditor_SetParameters 598
+#define wxGridCellTextEditor_destroy 599
+#define wxGridCellChoiceEditor_new 601
+#define wxGridCellChoiceEditor_SetParameters 602
+#define wxGridCellChoiceEditor_destroy 603
+#define wxGridCellNumberRenderer_new 604
+#define wxGridCellNumberRenderer_destroy 605
+#define wxGridCellNumberEditor_new 606
+#define wxGridCellNumberEditor_GetValue 607
+#define wxGridCellNumberEditor_SetParameters 608
+#define wxGridCellNumberEditor_destroy 609
+#define wxGridCellAttr_SetTextColour 610
+#define wxGridCellAttr_SetBackgroundColour 611
+#define wxGridCellAttr_SetFont 612
+#define wxGridCellAttr_SetAlignment 613
+#define wxGridCellAttr_SetReadOnly 614
+#define wxGridCellAttr_SetRenderer 615
+#define wxGridCellAttr_SetEditor 616
+#define wxGridCellAttr_HasTextColour 617
+#define wxGridCellAttr_HasBackgroundColour 618
+#define wxGridCellAttr_HasFont 619
+#define wxGridCellAttr_HasAlignment 620
+#define wxGridCellAttr_HasRenderer 621
+#define wxGridCellAttr_HasEditor 622
+#define wxGridCellAttr_GetTextColour 623
+#define wxGridCellAttr_GetBackgroundColour 624
+#define wxGridCellAttr_GetFont 625
+#define wxGridCellAttr_GetAlignment 626
+#define wxGridCellAttr_GetRenderer 627
+#define wxGridCellAttr_GetEditor 628
+#define wxGridCellAttr_IsReadOnly 629
+#define wxGridCellAttr_SetDefAttr 630
+#define wxDC_Blit 631
+#define wxDC_CalcBoundingBox 632
+#define wxDC_Clear 633
+#define wxDC_ComputeScaleAndOrigin 634
+#define wxDC_CrossHair 635
+#define wxDC_DestroyClippingRegion 636
+#define wxDC_DeviceToLogicalX 637
+#define wxDC_DeviceToLogicalXRel 638
+#define wxDC_DeviceToLogicalY 639
+#define wxDC_DeviceToLogicalYRel 640
+#define wxDC_DrawArc 641
+#define wxDC_DrawBitmap 642
+#define wxDC_DrawCheckMark 643
+#define wxDC_DrawCircle 644
+#define wxDC_DrawEllipse_2 646
+#define wxDC_DrawEllipse_1 647
+#define wxDC_DrawEllipticArc 648
+#define wxDC_DrawIcon 649
+#define wxDC_DrawLabel 650
+#define wxDC_DrawLine 651
+#define wxDC_DrawLines 652
+#define wxDC_DrawPolygon 654
+#define wxDC_DrawPoint 656
+#define wxDC_DrawRectangle_2 658
+#define wxDC_DrawRectangle_1 659
+#define wxDC_DrawRotatedText 660
+#define wxDC_DrawRoundedRectangle_3 662
+#define wxDC_DrawRoundedRectangle_2 663
+#define wxDC_DrawText 664
+#define wxDC_EndDoc 665
+#define wxDC_EndPage 666
+#define wxDC_FloodFill 667
+#define wxDC_GetBackground 668
+#define wxDC_GetBackgroundMode 669
+#define wxDC_GetBrush 670
+#define wxDC_GetCharHeight 671
+#define wxDC_GetCharWidth 672
+#define wxDC_GetClippingBox 673
+#define wxDC_GetFont 675
+#define wxDC_GetLayoutDirection 676
+#define wxDC_GetLogicalFunction 677
+#define wxDC_GetMapMode 678
+#define wxDC_GetMultiLineTextExtent_4 679
+#define wxDC_GetMultiLineTextExtent_1 680
+#define wxDC_GetPartialTextExtents 681
+#define wxDC_GetPen 682
+#define wxDC_GetPixel 683
+#define wxDC_GetPPI 684
+#define wxDC_GetSize 686
+#define wxDC_GetSizeMM 688
+#define wxDC_GetTextBackground 689
+#define wxDC_GetTextExtent_4 690
+#define wxDC_GetTextExtent_1 691
+#define wxDC_GetTextForeground 693
+#define wxDC_GetUserScale 694
+#define wxDC_GradientFillConcentric_3 695
+#define wxDC_GradientFillConcentric_4 696
+#define wxDC_GradientFillLinear 697
+#define wxDC_LogicalToDeviceX 698
+#define wxDC_LogicalToDeviceXRel 699
+#define wxDC_LogicalToDeviceY 700
+#define wxDC_LogicalToDeviceYRel 701
+#define wxDC_MaxX 702
+#define wxDC_MaxY 703
+#define wxDC_MinX 704
+#define wxDC_MinY 705
+#define wxDC_IsOk 706
+#define wxDC_ResetBoundingBox 707
+#define wxDC_SetAxisOrientation 708
+#define wxDC_SetBackground 709
+#define wxDC_SetBackgroundMode 710
+#define wxDC_SetBrush 711
+#define wxDC_SetClippingRegion_2 713
+#define wxDC_SetClippingRegion_1_1 714
+#define wxDC_SetClippingRegion_1_0 715
+#define wxDC_SetDeviceOrigin 716
+#define wxDC_SetFont 717
+#define wxDC_SetLayoutDirection 718
+#define wxDC_SetLogicalFunction 719
+#define wxDC_SetMapMode 720
+#define wxDC_SetPalette 721
+#define wxDC_SetPen 722
+#define wxDC_SetTextBackground 723
+#define wxDC_SetTextForeground 724
+#define wxDC_SetUserScale 725
+#define wxDC_StartDoc 726
+#define wxDC_StartPage 727
+#define wxMirrorDC_new 728
+#define wxMirrorDC_destroy 729
+#define wxScreenDC_new 730
+#define wxScreenDC_destruct 731
+#define wxPostScriptDC_new_0 732
+#define wxPostScriptDC_new_1 733
+#define wxPostScriptDC_destruct 734
+#define wxPostScriptDC_SetResolution 735
+#define wxPostScriptDC_GetResolution 736
+#define wxWindowDC_new_0 737
+#define wxWindowDC_new_1 738
+#define wxWindowDC_destruct 739
+#define wxClientDC_new_0 740
+#define wxClientDC_new_1 741
+#define wxClientDC_destroy 742
+#define wxPaintDC_new_0 743
+#define wxPaintDC_new_1 744
+#define wxPaintDC_destroy 745
+#define wxMemoryDC_new_1_0 747
+#define wxMemoryDC_new_1_1 748
+#define wxMemoryDC_new_0 749
+#define wxMemoryDC_destruct 751
+#define wxMemoryDC_SelectObject 752
+#define wxMemoryDC_SelectObjectAsSource 753
+#define wxBufferedDC_new_0 754
+#define wxBufferedDC_new_2 755
+#define wxBufferedDC_new_3 756
+#define wxBufferedDC_destruct 757
+#define wxBufferedDC_Init_2 758
+#define wxBufferedDC_Init_3 759
+#define wxBufferedPaintDC_new_3 760
+#define wxBufferedPaintDC_new_2 761
+#define wxBufferedPaintDC_destruct 762
+#define wxGraphicsObject_destruct 763
+#define wxGraphicsObject_GetRenderer 764
+#define wxGraphicsObject_IsNull 765
+#define wxGraphicsContext_destruct 766
+#define wxGraphicsContext_Create_1_1 767
+#define wxGraphicsContext_Create_1_0 768
+#define wxGraphicsContext_Create_0 769
+#define wxGraphicsContext_CreatePen 770
+#define wxGraphicsContext_CreateBrush 771
+#define wxGraphicsContext_CreateRadialGradientBrush 772
+#define wxGraphicsContext_CreateLinearGradientBrush 773
+#define wxGraphicsContext_CreateFont 774
+#define wxGraphicsContext_CreateMatrix 775
+#define wxGraphicsContext_CreatePath 776
+#define wxGraphicsContext_Clip_1 777
+#define wxGraphicsContext_Clip_4 778
+#define wxGraphicsContext_ResetClip 779
+#define wxGraphicsContext_DrawBitmap 780
+#define wxGraphicsContext_DrawEllipse 781
+#define wxGraphicsContext_DrawIcon 782
+#define wxGraphicsContext_DrawLines 783
+#define wxGraphicsContext_DrawPath 784
+#define wxGraphicsContext_DrawRectangle 785
+#define wxGraphicsContext_DrawRoundedRectangle 786
+#define wxGraphicsContext_DrawText_3 787
+#define wxGraphicsContext_DrawText_4_0 788
+#define wxGraphicsContext_DrawText_4_1 789
+#define wxGraphicsContext_DrawText_5 790
+#define wxGraphicsContext_FillPath 791
+#define wxGraphicsContext_StrokePath 792
+#define wxGraphicsContext_GetPartialTextExtents 793
+#define wxGraphicsContext_GetTextExtent 794
+#define wxGraphicsContext_Rotate 795
+#define wxGraphicsContext_Scale 796
+#define wxGraphicsContext_Translate 797
+#define wxGraphicsContext_GetTransform 798
+#define wxGraphicsContext_SetTransform 799
+#define wxGraphicsContext_ConcatTransform 800
+#define wxGraphicsContext_SetBrush_1_1 801
+#define wxGraphicsContext_SetBrush_1_0 802
+#define wxGraphicsContext_SetFont_1 803
+#define wxGraphicsContext_SetFont_2 804
+#define wxGraphicsContext_SetPen_1_0 805
+#define wxGraphicsContext_SetPen_1_1 806
+#define wxGraphicsContext_StrokeLine 807
+#define wxGraphicsContext_StrokeLines 808
+#define wxGraphicsMatrix_Concat 810
+#define wxGraphicsMatrix_Get 812
+#define wxGraphicsMatrix_Invert 813
+#define wxGraphicsMatrix_IsEqual 814
+#define wxGraphicsMatrix_IsIdentity 816
+#define wxGraphicsMatrix_Rotate 817
+#define wxGraphicsMatrix_Scale 818
+#define wxGraphicsMatrix_Translate 819
+#define wxGraphicsMatrix_Set 820
+#define wxGraphicsMatrix_TransformPoint 821
+#define wxGraphicsMatrix_TransformDistance 822
+#define wxGraphicsPath_MoveToPoint_2 823
+#define wxGraphicsPath_MoveToPoint_1 824
+#define wxGraphicsPath_AddArc_6 825
+#define wxGraphicsPath_AddArc_5 826
+#define wxGraphicsPath_AddArcToPoint 827
+#define wxGraphicsPath_AddCircle 828
+#define wxGraphicsPath_AddCurveToPoint_6 829
+#define wxGraphicsPath_AddCurveToPoint_3 830
+#define wxGraphicsPath_AddEllipse 831
+#define wxGraphicsPath_AddLineToPoint_2 832
+#define wxGraphicsPath_AddLineToPoint_1 833
+#define wxGraphicsPath_AddPath 834
+#define wxGraphicsPath_AddQuadCurveToPoint 835
+#define wxGraphicsPath_AddRectangle 836
+#define wxGraphicsPath_AddRoundedRectangle 837
+#define wxGraphicsPath_CloseSubpath 838
+#define wxGraphicsPath_Contains_3 839
+#define wxGraphicsPath_Contains_2 840
+#define wxGraphicsPath_GetBox 842
+#define wxGraphicsPath_GetCurrentPoint 844
+#define wxGraphicsPath_Transform 845
+#define wxGraphicsRenderer_GetDefaultRenderer 846
+#define wxGraphicsRenderer_CreateContext_1_1 847
+#define wxGraphicsRenderer_CreateContext_1_0 848
+#define wxGraphicsRenderer_CreatePen 849
+#define wxGraphicsRenderer_CreateBrush 850
+#define wxGraphicsRenderer_CreateLinearGradientBrush 851
+#define wxGraphicsRenderer_CreateRadialGradientBrush 852
+#define wxGraphicsRenderer_CreateFont 853
+#define wxGraphicsRenderer_CreateMatrix 854
+#define wxGraphicsRenderer_CreatePath 855
+#define wxMenuBar_new_1 857
+#define wxMenuBar_new_0 859
+#define wxMenuBar_destruct 861
+#define wxMenuBar_Append 862
+#define wxMenuBar_Check 863
+#define wxMenuBar_Enable_2 864
+#define wxMenuBar_Enable_1 865
+#define wxMenuBar_EnableTop 866
+#define wxMenuBar_FindMenu 867
+#define wxMenuBar_FindMenuItem 868
+#define wxMenuBar_FindItem 869
+#define wxMenuBar_GetHelpString 870
+#define wxMenuBar_GetLabel_1 871
+#define wxMenuBar_GetLabel_0 872
+#define wxMenuBar_GetLabelTop 873
+#define wxMenuBar_GetMenu 874
+#define wxMenuBar_GetMenuCount 875
+#define wxMenuBar_Insert 876
+#define wxMenuBar_IsChecked 877
+#define wxMenuBar_SetAutoWindowMenu 878
+#define wxMenuBar_GetAutoWindowMenu 879
+#define wxMenuBar_OSXGetAppleMenu 880
+#define wxMenuBar_IsEnabled_1 881
+#define wxMenuBar_IsEnabled_0 882
+#define wxMenuBar_Remove 883
+#define wxMenuBar_Replace 884
+#define wxMenuBar_SetHelpString 885
+#define wxMenuBar_SetLabel_2 886
+#define wxMenuBar_SetLabel_1 887
+#define wxMenuBar_SetLabelTop 888
+#define wxControl_GetLabel 889
+#define wxControl_SetLabel 890
+#define wxControlWithItems_Append_1 891
+#define wxControlWithItems_Append_2 892
+#define wxControlWithItems_appendStrings_1 893
+#define wxControlWithItems_Clear 894
+#define wxControlWithItems_Delete 895
+#define wxControlWithItems_FindString 896
+#define wxControlWithItems_getClientData 897
+#define wxControlWithItems_setClientData 898
+#define wxControlWithItems_GetCount 899
+#define wxControlWithItems_GetSelection 900
+#define wxControlWithItems_GetString 901
+#define wxControlWithItems_GetStringSelection 902
+#define wxControlWithItems_Insert_2 903
+#define wxControlWithItems_Insert_3 904
+#define wxControlWithItems_IsEmpty 905
+#define wxControlWithItems_Select 906
+#define wxControlWithItems_SetSelection 907
+#define wxControlWithItems_SetString 908
+#define wxControlWithItems_SetStringSelection 909
+#define wxMenu_new_2 912
+#define wxMenu_new_1 913
+#define wxMenu_destruct 915
+#define wxMenu_Append_3 916
+#define wxMenu_Append_1 917
+#define wxMenu_Append_4_0 918
+#define wxMenu_Append_4_1 919
+#define wxMenu_AppendCheckItem 920
+#define wxMenu_AppendRadioItem 921
+#define wxMenu_AppendSeparator 922
+#define wxMenu_Break 923
+#define wxMenu_Check 924
+#define wxMenu_Delete_1_0 925
+#define wxMenu_Delete_1_1 926
+#define wxMenu_Destroy_1_0 927
+#define wxMenu_Destroy_1_1 928
+#define wxMenu_Enable 929
+#define wxMenu_FindItem_1 930
+#define wxMenu_FindItem_2 931
+#define wxMenu_FindItemByPosition 932
+#define wxMenu_GetHelpString 933
+#define wxMenu_GetLabel 934
+#define wxMenu_GetMenuItemCount 935
+#define wxMenu_GetMenuItems 936
+#define wxMenu_GetTitle 938
+#define wxMenu_Insert_2 939
+#define wxMenu_Insert_3 940
+#define wxMenu_Insert_5_1 941
+#define wxMenu_Insert_5_0 942
+#define wxMenu_InsertCheckItem 943
+#define wxMenu_InsertRadioItem 944
+#define wxMenu_InsertSeparator 945
+#define wxMenu_IsChecked 946
+#define wxMenu_IsEnabled 947
+#define wxMenu_Prepend_1 948
+#define wxMenu_Prepend_2 949
+#define wxMenu_Prepend_4_1 950
+#define wxMenu_Prepend_4_0 951
+#define wxMenu_PrependCheckItem 952
+#define wxMenu_PrependRadioItem 953
+#define wxMenu_PrependSeparator 954
+#define wxMenu_Remove_1_0 955
+#define wxMenu_Remove_1_1 956
+#define wxMenu_SetHelpString 957
+#define wxMenu_SetLabel 958
+#define wxMenu_SetTitle 959
+#define wxMenuItem_new 960
+#define wxMenuItem_destruct 962
+#define wxMenuItem_Check 963
+#define wxMenuItem_Enable 964
+#define wxMenuItem_GetBitmap 965
+#define wxMenuItem_GetHelp 966
+#define wxMenuItem_GetId 967
+#define wxMenuItem_GetKind 968
+#define wxMenuItem_GetLabel 969
+#define wxMenuItem_GetLabelFromText 970
+#define wxMenuItem_GetMenu 971
+#define wxMenuItem_GetText 972
+#define wxMenuItem_GetSubMenu 973
+#define wxMenuItem_IsCheckable 974
+#define wxMenuItem_IsChecked 975
+#define wxMenuItem_IsEnabled 976
+#define wxMenuItem_IsSeparator 977
+#define wxMenuItem_IsSubMenu 978
+#define wxMenuItem_SetBitmap 979
+#define wxMenuItem_SetHelp 980
+#define wxMenuItem_SetMenu 981
+#define wxMenuItem_SetSubMenu 982
+#define wxMenuItem_SetText 983
+#define wxToolBar_AddControl 984
+#define wxToolBar_AddSeparator 985
+#define wxToolBar_AddTool_5 986
+#define wxToolBar_AddTool_4_0 987
+#define wxToolBar_AddTool_1 988
+#define wxToolBar_AddTool_4_1 989
+#define wxToolBar_AddTool_3 990
+#define wxToolBar_AddTool_6 991
+#define wxToolBar_AddCheckTool 992
+#define wxToolBar_AddRadioTool 993
+#define wxToolBar_AddStretchableSpace 994
+#define wxToolBar_InsertStretchableSpace 995
+#define wxToolBar_DeleteTool 996
+#define wxToolBar_DeleteToolByPos 997
+#define wxToolBar_EnableTool 998
+#define wxToolBar_FindById 999
+#define wxToolBar_FindControl 1000
+#define wxToolBar_FindToolForPosition 1001
+#define wxToolBar_GetToolSize 1002
+#define wxToolBar_GetToolBitmapSize 1003
+#define wxToolBar_GetMargins 1004
+#define wxToolBar_GetToolEnabled 1005
+#define wxToolBar_GetToolLongHelp 1006
+#define wxToolBar_GetToolPacking 1007
+#define wxToolBar_GetToolPos 1008
+#define wxToolBar_GetToolSeparation 1009
+#define wxToolBar_GetToolShortHelp 1010
+#define wxToolBar_GetToolState 1011
+#define wxToolBar_InsertControl 1012
+#define wxToolBar_InsertSeparator 1013
+#define wxToolBar_InsertTool_5 1014
+#define wxToolBar_InsertTool_2 1015
+#define wxToolBar_InsertTool_4 1016
+#define wxToolBar_Realize 1017
+#define wxToolBar_RemoveTool 1018
+#define wxToolBar_SetMargins 1019
+#define wxToolBar_SetToolBitmapSize 1020
+#define wxToolBar_SetToolLongHelp 1021
+#define wxToolBar_SetToolPacking 1022
+#define wxToolBar_SetToolShortHelp 1023
+#define wxToolBar_SetToolSeparation 1024
+#define wxToolBar_ToggleTool 1025
+#define wxStatusBar_new_0 1027
+#define wxStatusBar_new_2 1028
+#define wxStatusBar_destruct 1030
+#define wxStatusBar_Create 1031
+#define wxStatusBar_GetFieldRect 1032
+#define wxStatusBar_GetFieldsCount 1033
+#define wxStatusBar_GetStatusText 1034
+#define wxStatusBar_PopStatusText 1035
+#define wxStatusBar_PushStatusText 1036
+#define wxStatusBar_SetFieldsCount 1037
+#define wxStatusBar_SetMinHeight 1038
+#define wxStatusBar_SetStatusText 1039
+#define wxStatusBar_SetStatusWidths 1040
+#define wxStatusBar_SetStatusStyles 1041
+#define wxBitmap_new_0 1042
+#define wxBitmap_new_3 1043
+#define wxBitmap_new_4 1044
+#define wxBitmap_new_2_0 1045
+#define wxBitmap_new_2_1 1046
+#define wxBitmap_destruct 1047
+#define wxBitmap_ConvertToImage 1048
+#define wxBitmap_CopyFromIcon 1049
+#define wxBitmap_Create 1050
+#define wxBitmap_GetDepth 1051
+#define wxBitmap_GetHeight 1052
+#define wxBitmap_GetPalette 1053
+#define wxBitmap_GetMask 1054
+#define wxBitmap_GetWidth 1055
+#define wxBitmap_GetSubBitmap 1056
+#define wxBitmap_LoadFile 1057
+#define wxBitmap_Ok 1058
+#define wxBitmap_SaveFile 1059
+#define wxBitmap_SetDepth 1060
+#define wxBitmap_SetHeight 1061
+#define wxBitmap_SetMask 1062
+#define wxBitmap_SetPalette 1063
+#define wxBitmap_SetWidth 1064
+#define wxIcon_new_0 1065
+#define wxIcon_new_2 1066
+#define wxIcon_new_1 1067
+#define wxIcon_CopyFromBitmap 1068
+#define wxIcon_destroy 1069
+#define wxIconBundle_new_0 1070
+#define wxIconBundle_new_2 1071
+#define wxIconBundle_new_1_0 1072
+#define wxIconBundle_new_1_1 1073
+#define wxIconBundle_destruct 1074
+#define wxIconBundle_AddIcon_2 1075
+#define wxIconBundle_AddIcon_1 1076
+#define wxIconBundle_GetIcon_1_1 1077
+#define wxIconBundle_GetIcon_1_0 1078
+#define wxCursor_new_0 1079
+#define wxCursor_new_1_0 1080
+#define wxCursor_new_1_1 1081
+#define wxCursor_new_4 1082
+#define wxCursor_destruct 1083
+#define wxCursor_Ok 1084
+#define wxMask_new_0 1085
+#define wxMask_new_2_1 1086
+#define wxMask_new_2_0 1087
+#define wxMask_new_1 1088
+#define wxMask_destruct 1089
+#define wxMask_Create_2_1 1090
+#define wxMask_Create_2_0 1091
+#define wxMask_Create_1 1092
+#define wxImage_new_0 1093
+#define wxImage_new_3_0 1094
+#define wxImage_new_4 1095
+#define wxImage_new_5 1096
+#define wxImage_new_2 1097
+#define wxImage_new_3_1 1098
+#define wxImage_Blur 1099
+#define wxImage_BlurHorizontal 1100
+#define wxImage_BlurVertical 1101
+#define wxImage_ConvertAlphaToMask 1102
+#define wxImage_ConvertToGreyscale 1103
+#define wxImage_ConvertToMono 1104
+#define wxImage_Copy 1105
+#define wxImage_Create_3 1106
+#define wxImage_Create_4 1107
+#define wxImage_Create_5 1108
+#define wxImage_Destroy 1109
+#define wxImage_FindFirstUnusedColour 1110
+#define wxImage_GetImageExtWildcard 1111
+#define wxImage_GetAlpha_2 1112
+#define wxImage_GetAlpha_0 1113
+#define wxImage_GetBlue 1114
+#define wxImage_GetData 1115
+#define wxImage_GetGreen 1116
+#define wxImage_GetImageCount 1117
+#define wxImage_GetHeight 1118
+#define wxImage_GetMaskBlue 1119
+#define wxImage_GetMaskGreen 1120
+#define wxImage_GetMaskRed 1121
+#define wxImage_GetOrFindMaskColour 1122
+#define wxImage_GetPalette 1123
+#define wxImage_GetRed 1124
+#define wxImage_GetSubImage 1125
+#define wxImage_GetWidth 1126
+#define wxImage_HasAlpha 1127
+#define wxImage_HasMask 1128
+#define wxImage_GetOption 1129
+#define wxImage_GetOptionInt 1130
+#define wxImage_HasOption 1131
+#define wxImage_InitAlpha 1132
+#define wxImage_InitStandardHandlers 1133
+#define wxImage_IsTransparent 1134
+#define wxImage_LoadFile_2 1135
+#define wxImage_LoadFile_3 1136
+#define wxImage_Ok 1137
+#define wxImage_RemoveHandler 1138
+#define wxImage_Mirror 1139
+#define wxImage_Replace 1140
+#define wxImage_Rescale 1141
+#define wxImage_Resize 1142
+#define wxImage_Rotate 1143
+#define wxImage_RotateHue 1144
+#define wxImage_Rotate90 1145
+#define wxImage_SaveFile_1 1146
+#define wxImage_SaveFile_2_0 1147
+#define wxImage_SaveFile_2_1 1148
+#define wxImage_Scale 1149
+#define wxImage_Size 1150
+#define wxImage_SetAlpha_3 1151
+#define wxImage_SetAlpha_2 1152
+#define wxImage_SetData_2 1153
+#define wxImage_SetData_4 1154
+#define wxImage_SetMask 1155
+#define wxImage_SetMaskColour 1156
+#define wxImage_SetMaskFromImage 1157
+#define wxImage_SetOption_2_1 1158
+#define wxImage_SetOption_2_0 1159
+#define wxImage_SetPalette 1160
+#define wxImage_SetRGB_5 1161
+#define wxImage_SetRGB_4 1162
+#define wxImage_destroy 1163
+#define wxBrush_new_0 1164
+#define wxBrush_new_2 1165
+#define wxBrush_new_1 1166
+#define wxBrush_destruct 1168
+#define wxBrush_GetColour 1169
+#define wxBrush_GetStipple 1170
+#define wxBrush_GetStyle 1171
+#define wxBrush_IsHatch 1172
+#define wxBrush_IsOk 1173
+#define wxBrush_SetColour_1 1174
+#define wxBrush_SetColour_3 1175
+#define wxBrush_SetStipple 1176
+#define wxBrush_SetStyle 1177
+#define wxPen_new_0 1178
+#define wxPen_new_2 1179
+#define wxPen_destruct 1180
+#define wxPen_GetCap 1181
+#define wxPen_GetColour 1182
+#define wxPen_GetJoin 1183
+#define wxPen_GetStyle 1184
+#define wxPen_GetWidth 1185
+#define wxPen_IsOk 1186
+#define wxPen_SetCap 1187
+#define wxPen_SetColour_1 1188
+#define wxPen_SetColour_3 1189
+#define wxPen_SetJoin 1190
+#define wxPen_SetStyle 1191
+#define wxPen_SetWidth 1192
+#define wxRegion_new_0 1193
+#define wxRegion_new_4 1194
+#define wxRegion_new_2 1195
+#define wxRegion_new_1_1 1196
+#define wxRegion_new_1_0 1198
+#define wxRegion_destruct 1200
+#define wxRegion_Clear 1201
+#define wxRegion_Contains_2 1202
+#define wxRegion_Contains_1_0 1203
+#define wxRegion_Contains_4 1204
+#define wxRegion_Contains_1_1 1205
+#define wxRegion_ConvertToBitmap 1206
+#define wxRegion_GetBox 1207
+#define wxRegion_Intersect_4 1208
+#define wxRegion_Intersect_1_1 1209
+#define wxRegion_Intersect_1_0 1210
+#define wxRegion_IsEmpty 1211
+#define wxRegion_Subtract_4 1212
+#define wxRegion_Subtract_1_1 1213
+#define wxRegion_Subtract_1_0 1214
+#define wxRegion_Offset_2 1215
+#define wxRegion_Offset_1 1216
+#define wxRegion_Union_4 1217
+#define wxRegion_Union_1_2 1218
+#define wxRegion_Union_1_1 1219
+#define wxRegion_Union_1_0 1220
+#define wxRegion_Union_3 1221
+#define wxRegion_Xor_4 1222
+#define wxRegion_Xor_1_1 1223
+#define wxRegion_Xor_1_0 1224
+#define wxAcceleratorTable_new_0 1225
+#define wxAcceleratorTable_new_2 1226
+#define wxAcceleratorTable_destruct 1227
+#define wxAcceleratorTable_Ok 1228
+#define wxAcceleratorEntry_new_1_0 1229
+#define wxAcceleratorEntry_new_1_1 1230
+#define wxAcceleratorEntry_GetCommand 1231
+#define wxAcceleratorEntry_GetFlags 1232
+#define wxAcceleratorEntry_GetKeyCode 1233
+#define wxAcceleratorEntry_Set 1234
+#define wxAcceleratorEntry_destroy 1235
+#define wxCaret_new_3 1240
+#define wxCaret_new_2 1241
+#define wxCaret_destruct 1243
+#define wxCaret_Create_3 1244
+#define wxCaret_Create_2 1245
+#define wxCaret_GetBlinkTime 1246
+#define wxCaret_GetPosition 1248
+#define wxCaret_GetSize 1250
+#define wxCaret_GetWindow 1251
+#define wxCaret_Hide 1252
+#define wxCaret_IsOk 1253
+#define wxCaret_IsVisible 1254
+#define wxCaret_Move_2 1255
+#define wxCaret_Move_1 1256
+#define wxCaret_SetBlinkTime 1257
+#define wxCaret_SetSize_2 1258
+#define wxCaret_SetSize_1 1259
+#define wxCaret_Show 1260
+#define wxSizer_Add_2_1 1261
+#define wxSizer_Add_2_0 1262
+#define wxSizer_Add_3 1263
+#define wxSizer_Add_2_3 1264
+#define wxSizer_Add_2_2 1265
+#define wxSizer_AddSpacer 1266
+#define wxSizer_AddStretchSpacer 1267
+#define wxSizer_CalcMin 1268
+#define wxSizer_Clear 1269
+#define wxSizer_Detach_1_2 1270
+#define wxSizer_Detach_1_1 1271
+#define wxSizer_Detach_1_0 1272
+#define wxSizer_Fit 1273
+#define wxSizer_FitInside 1274
+#define wxSizer_GetChildren 1275
+#define wxSizer_GetItem_2_1 1276
+#define wxSizer_GetItem_2_0 1277
+#define wxSizer_GetItem_1 1278
+#define wxSizer_GetSize 1279
+#define wxSizer_GetPosition 1280
+#define wxSizer_GetMinSize 1281
+#define wxSizer_Hide_2_0 1282
+#define wxSizer_Hide_2_1 1283
+#define wxSizer_Hide_1 1284
+#define wxSizer_Insert_3_1 1285
+#define wxSizer_Insert_3_0 1286
+#define wxSizer_Insert_4 1287
+#define wxSizer_Insert_3_3 1288
+#define wxSizer_Insert_3_2 1289
+#define wxSizer_Insert_2 1290
+#define wxSizer_InsertSpacer 1291
+#define wxSizer_InsertStretchSpacer 1292
+#define wxSizer_IsShown_1_2 1293
+#define wxSizer_IsShown_1_1 1294
+#define wxSizer_IsShown_1_0 1295
+#define wxSizer_Layout 1296
+#define wxSizer_Prepend_2_1 1297
+#define wxSizer_Prepend_2_0 1298
+#define wxSizer_Prepend_3 1299
+#define wxSizer_Prepend_2_3 1300
+#define wxSizer_Prepend_2_2 1301
+#define wxSizer_Prepend_1 1302
+#define wxSizer_PrependSpacer 1303
+#define wxSizer_PrependStretchSpacer 1304
+#define wxSizer_RecalcSizes 1305
+#define wxSizer_Remove_1_1 1306
+#define wxSizer_Remove_1_0 1307
+#define wxSizer_Replace_3_1 1308
+#define wxSizer_Replace_3_0 1309
+#define wxSizer_Replace_2 1310
+#define wxSizer_SetDimension 1311
+#define wxSizer_SetMinSize_2 1312
+#define wxSizer_SetMinSize_1 1313
+#define wxSizer_SetItemMinSize_3_2 1314
+#define wxSizer_SetItemMinSize_2_2 1315
+#define wxSizer_SetItemMinSize_3_1 1316
+#define wxSizer_SetItemMinSize_2_1 1317
+#define wxSizer_SetItemMinSize_3_0 1318
+#define wxSizer_SetItemMinSize_2_0 1319
+#define wxSizer_SetSizeHints 1320
+#define wxSizer_SetVirtualSizeHints 1321
+#define wxSizer_Show_2_2 1322
+#define wxSizer_Show_2_1 1323
+#define wxSizer_Show_2_0 1324
+#define wxSizer_Show_1 1325
+#define wxSizerFlags_new 1326
+#define wxSizerFlags_Align 1327
+#define wxSizerFlags_Border_2 1328
+#define wxSizerFlags_Border_1 1329
+#define wxSizerFlags_Center 1330
+#define wxSizerFlags_Centre 1331
+#define wxSizerFlags_Expand 1332
+#define wxSizerFlags_Left 1333
+#define wxSizerFlags_Proportion 1334
+#define wxSizerFlags_Right 1335
+#define wxSizerFlags_destroy 1336
+#define wxSizerItem_new_5_1 1337
+#define wxSizerItem_new_2_1 1338
+#define wxSizerItem_new_5_0 1339
+#define wxSizerItem_new_2_0 1340
+#define wxSizerItem_new_6 1341
+#define wxSizerItem_new_3 1342
+#define wxSizerItem_new_0 1343
+#define wxSizerItem_destruct 1344
+#define wxSizerItem_CalcMin 1345
+#define wxSizerItem_DeleteWindows 1346
+#define wxSizerItem_DetachSizer 1347
+#define wxSizerItem_GetBorder 1348
+#define wxSizerItem_GetFlag 1349
+#define wxSizerItem_GetMinSize 1350
+#define wxSizerItem_GetPosition 1351
+#define wxSizerItem_GetProportion 1352
+#define wxSizerItem_GetRatio 1353
+#define wxSizerItem_GetRect 1354
+#define wxSizerItem_GetSize 1355
+#define wxSizerItem_GetSizer 1356
+#define wxSizerItem_GetSpacer 1357
+#define wxSizerItem_GetUserData 1358
+#define wxSizerItem_GetWindow 1359
+#define wxSizerItem_IsSizer 1360
+#define wxSizerItem_IsShown 1361
+#define wxSizerItem_IsSpacer 1362
+#define wxSizerItem_IsWindow 1363
+#define wxSizerItem_SetBorder 1364
+#define wxSizerItem_SetDimension 1365
+#define wxSizerItem_SetFlag 1366
+#define wxSizerItem_SetInitSize 1367
+#define wxSizerItem_SetMinSize_1 1368
+#define wxSizerItem_SetMinSize_2 1369
+#define wxSizerItem_SetProportion 1370
+#define wxSizerItem_SetRatio_2 1371
+#define wxSizerItem_SetRatio_1_1 1372
+#define wxSizerItem_SetRatio_1_0 1373
+#define wxSizerItem_SetSizer 1374
+#define wxSizerItem_SetSpacer_1 1375
+#define wxSizerItem_SetSpacer_2 1376
+#define wxSizerItem_SetWindow 1377
+#define wxSizerItem_Show 1378
+#define wxBoxSizer_new 1379
+#define wxBoxSizer_GetOrientation 1380
+#define wxBoxSizer_destroy 1381
+#define wxStaticBoxSizer_new_2 1382
+#define wxStaticBoxSizer_new_3 1383
+#define wxStaticBoxSizer_GetStaticBox 1384
+#define wxStaticBoxSizer_destroy 1385
+#define wxGridSizer_new_4 1386
+#define wxGridSizer_new_2 1387
+#define wxGridSizer_GetCols 1388
+#define wxGridSizer_GetHGap 1389
+#define wxGridSizer_GetRows 1390
+#define wxGridSizer_GetVGap 1391
+#define wxGridSizer_SetCols 1392
+#define wxGridSizer_SetHGap 1393
+#define wxGridSizer_SetRows 1394
+#define wxGridSizer_SetVGap 1395
+#define wxGridSizer_destroy 1396
+#define wxFlexGridSizer_new_4 1397
+#define wxFlexGridSizer_new_2 1398
+#define wxFlexGridSizer_AddGrowableCol 1399
+#define wxFlexGridSizer_AddGrowableRow 1400
+#define wxFlexGridSizer_GetFlexibleDirection 1401
+#define wxFlexGridSizer_GetNonFlexibleGrowMode 1402
+#define wxFlexGridSizer_RemoveGrowableCol 1403
+#define wxFlexGridSizer_RemoveGrowableRow 1404
+#define wxFlexGridSizer_SetFlexibleDirection 1405
+#define wxFlexGridSizer_SetNonFlexibleGrowMode 1406
+#define wxFlexGridSizer_destroy 1407
+#define wxGridBagSizer_new 1408
+#define wxGridBagSizer_Add_3_2 1409
+#define wxGridBagSizer_Add_3_1 1410
+#define wxGridBagSizer_Add_4 1411
+#define wxGridBagSizer_Add_1_0 1412
+#define wxGridBagSizer_Add_2_1 1413
+#define wxGridBagSizer_Add_2_0 1414
+#define wxGridBagSizer_Add_3_0 1415
+#define wxGridBagSizer_Add_1_1 1416
+#define wxGridBagSizer_CalcMin 1417
+#define wxGridBagSizer_CheckForIntersection_2 1418
+#define wxGridBagSizer_CheckForIntersection_3 1419
+#define wxGridBagSizer_FindItem_1_1 1420
+#define wxGridBagSizer_FindItem_1_0 1421
+#define wxGridBagSizer_FindItemAtPoint 1422
+#define wxGridBagSizer_FindItemAtPosition 1423
+#define wxGridBagSizer_FindItemWithData 1424
+#define wxGridBagSizer_GetCellSize 1425
+#define wxGridBagSizer_GetEmptyCellSize 1426
+#define wxGridBagSizer_GetItemPosition_1_2 1427
+#define wxGridBagSizer_GetItemPosition_1_1 1428
+#define wxGridBagSizer_GetItemPosition_1_0 1429
+#define wxGridBagSizer_GetItemSpan_1_2 1430
+#define wxGridBagSizer_GetItemSpan_1_1 1431
+#define wxGridBagSizer_GetItemSpan_1_0 1432
+#define wxGridBagSizer_SetEmptyCellSize 1433
+#define wxGridBagSizer_SetItemPosition_2_2 1434
+#define wxGridBagSizer_SetItemPosition_2_1 1435
+#define wxGridBagSizer_SetItemPosition_2_0 1436
+#define wxGridBagSizer_SetItemSpan_2_2 1437
+#define wxGridBagSizer_SetItemSpan_2_1 1438
+#define wxGridBagSizer_SetItemSpan_2_0 1439
+#define wxGridBagSizer_destroy 1440
+#define wxStdDialogButtonSizer_new 1441
+#define wxStdDialogButtonSizer_AddButton 1442
+#define wxStdDialogButtonSizer_Realize 1443
+#define wxStdDialogButtonSizer_SetAffirmativeButton 1444
+#define wxStdDialogButtonSizer_SetCancelButton 1445
+#define wxStdDialogButtonSizer_SetNegativeButton 1446
+#define wxStdDialogButtonSizer_destroy 1447
+#define wxFont_new_0 1448
+#define wxFont_new_1 1449
+#define wxFont_new_5 1450
+#define wxFont_destruct 1452
+#define wxFont_IsFixedWidth 1453
+#define wxFont_GetDefaultEncoding 1454
+#define wxFont_GetFaceName 1455
+#define wxFont_GetFamily 1456
+#define wxFont_GetNativeFontInfoDesc 1457
+#define wxFont_GetNativeFontInfoUserDesc 1458
+#define wxFont_GetPointSize 1459
+#define wxFont_GetStyle 1460
+#define wxFont_GetUnderlined 1461
+#define wxFont_GetWeight 1462
+#define wxFont_Ok 1463
+#define wxFont_SetDefaultEncoding 1464
+#define wxFont_SetFaceName 1465
+#define wxFont_SetFamily 1466
+#define wxFont_SetPointSize 1467
+#define wxFont_SetStyle 1468
+#define wxFont_SetUnderlined 1469
+#define wxFont_SetWeight 1470
+#define wxToolTip_Enable 1471
+#define wxToolTip_SetDelay 1472
+#define wxToolTip_new 1473
+#define wxToolTip_SetTip 1474
+#define wxToolTip_GetTip 1475
+#define wxToolTip_GetWindow 1476
+#define wxToolTip_destroy 1477
+#define wxButton_new_3 1479
+#define wxButton_new_0 1480
+#define wxButton_destruct 1481
+#define wxButton_Create 1482
+#define wxButton_GetDefaultSize 1483
+#define wxButton_SetDefault 1484
+#define wxButton_SetLabel 1485
+#define wxBitmapButton_new_4 1487
+#define wxBitmapButton_new_0 1488
+#define wxBitmapButton_Create 1489
+#define wxBitmapButton_GetBitmapDisabled 1490
+#define wxBitmapButton_GetBitmapFocus 1492
+#define wxBitmapButton_GetBitmapLabel 1494
+#define wxBitmapButton_GetBitmapSelected 1496
+#define wxBitmapButton_SetBitmapDisabled 1498
+#define wxBitmapButton_SetBitmapFocus 1499
+#define wxBitmapButton_SetBitmapLabel 1500
+#define wxBitmapButton_SetBitmapSelected 1501
+#define wxBitmapButton_destroy 1502
+#define wxToggleButton_new_0 1503
+#define wxToggleButton_new_4 1504
+#define wxToggleButton_Create 1505
+#define wxToggleButton_GetValue 1506
+#define wxToggleButton_SetValue 1507
+#define wxToggleButton_destroy 1508
+#define wxCalendarCtrl_new_0 1509
+#define wxCalendarCtrl_new_3 1510
+#define wxCalendarCtrl_Create 1511
+#define wxCalendarCtrl_destruct 1512
+#define wxCalendarCtrl_SetDate 1513
+#define wxCalendarCtrl_GetDate 1514
+#define wxCalendarCtrl_EnableYearChange 1515
+#define wxCalendarCtrl_EnableMonthChange 1516
+#define wxCalendarCtrl_EnableHolidayDisplay 1517
+#define wxCalendarCtrl_SetHeaderColours 1518
+#define wxCalendarCtrl_GetHeaderColourFg 1519
+#define wxCalendarCtrl_GetHeaderColourBg 1520
+#define wxCalendarCtrl_SetHighlightColours 1521
+#define wxCalendarCtrl_GetHighlightColourFg 1522
+#define wxCalendarCtrl_GetHighlightColourBg 1523
+#define wxCalendarCtrl_SetHolidayColours 1524
+#define wxCalendarCtrl_GetHolidayColourFg 1525
+#define wxCalendarCtrl_GetHolidayColourBg 1526
+#define wxCalendarCtrl_GetAttr 1527
+#define wxCalendarCtrl_SetAttr 1528
+#define wxCalendarCtrl_SetHoliday 1529
+#define wxCalendarCtrl_ResetAttr 1530
+#define wxCalendarCtrl_HitTest 1531
+#define wxCalendarDateAttr_new_0 1532
+#define wxCalendarDateAttr_new_2_1 1533
+#define wxCalendarDateAttr_new_2_0 1534
+#define wxCalendarDateAttr_SetTextColour 1535
+#define wxCalendarDateAttr_SetBackgroundColour 1536
+#define wxCalendarDateAttr_SetBorderColour 1537
+#define wxCalendarDateAttr_SetFont 1538
+#define wxCalendarDateAttr_SetBorder 1539
+#define wxCalendarDateAttr_SetHoliday 1540
+#define wxCalendarDateAttr_HasTextColour 1541
+#define wxCalendarDateAttr_HasBackgroundColour 1542
+#define wxCalendarDateAttr_HasBorderColour 1543
+#define wxCalendarDateAttr_HasFont 1544
+#define wxCalendarDateAttr_HasBorder 1545
+#define wxCalendarDateAttr_IsHoliday 1546
+#define wxCalendarDateAttr_GetTextColour 1547
+#define wxCalendarDateAttr_GetBackgroundColour 1548
+#define wxCalendarDateAttr_GetBorderColour 1549
+#define wxCalendarDateAttr_GetFont 1550
+#define wxCalendarDateAttr_GetBorder 1551
+#define wxCalendarDateAttr_destroy 1552
+#define wxCheckBox_new_4 1554
+#define wxCheckBox_new_0 1555
+#define wxCheckBox_Create 1556
+#define wxCheckBox_GetValue 1557
+#define wxCheckBox_Get3StateValue 1558
+#define wxCheckBox_Is3rdStateAllowedForUser 1559
+#define wxCheckBox_Is3State 1560
+#define wxCheckBox_IsChecked 1561
+#define wxCheckBox_SetValue 1562
+#define wxCheckBox_Set3StateValue 1563
+#define wxCheckBox_destroy 1564
+#define wxCheckListBox_new_0 1565
+#define wxCheckListBox_new_3 1567
+#define wxCheckListBox_Check 1568
+#define wxCheckListBox_IsChecked 1569
+#define wxCheckListBox_destroy 1570
+#define wxChoice_new_3 1573
+#define wxChoice_new_0 1574
+#define wxChoice_destruct 1576
+#define wxChoice_Create 1578
+#define wxChoice_Delete 1579
+#define wxChoice_GetColumns 1580
+#define wxChoice_SetColumns 1581
+#define wxComboBox_new_0 1582
+#define wxComboBox_new_3 1584
+#define wxComboBox_destruct 1585
+#define wxComboBox_Create 1587
+#define wxComboBox_CanCopy 1588
+#define wxComboBox_CanCut 1589
+#define wxComboBox_CanPaste 1590
+#define wxComboBox_CanRedo 1591
+#define wxComboBox_CanUndo 1592
+#define wxComboBox_Copy 1593
+#define wxComboBox_Cut 1594
+#define wxComboBox_GetInsertionPoint 1595
+#define wxComboBox_GetLastPosition 1596
+#define wxComboBox_GetValue 1597
+#define wxComboBox_Paste 1598
+#define wxComboBox_Redo 1599
+#define wxComboBox_Replace 1600
+#define wxComboBox_Remove 1601
+#define wxComboBox_SetInsertionPoint 1602
+#define wxComboBox_SetInsertionPointEnd 1603
+#define wxComboBox_SetSelection_1 1604
+#define wxComboBox_SetSelection_2 1605
+#define wxComboBox_SetValue 1606
+#define wxComboBox_Undo 1607
+#define wxGauge_new_0 1608
+#define wxGauge_new_4 1609
+#define wxGauge_Create 1610
+#define wxGauge_GetRange 1611
+#define wxGauge_GetValue 1612
+#define wxGauge_IsVertical 1613
+#define wxGauge_SetRange 1614
+#define wxGauge_SetValue 1615
+#define wxGauge_Pulse 1616
+#define wxGauge_destroy 1617
+#define wxGenericDirCtrl_new_0 1618
+#define wxGenericDirCtrl_new_2 1619
+#define wxGenericDirCtrl_destruct 1620
+#define wxGenericDirCtrl_Create 1621
+#define wxGenericDirCtrl_Init 1622
+#define wxGenericDirCtrl_CollapseTree 1623
+#define wxGenericDirCtrl_ExpandPath 1624
+#define wxGenericDirCtrl_GetDefaultPath 1625
+#define wxGenericDirCtrl_GetPath 1626
+#define wxGenericDirCtrl_GetFilePath 1627
+#define wxGenericDirCtrl_GetFilter 1628
+#define wxGenericDirCtrl_GetFilterIndex 1629
+#define wxGenericDirCtrl_GetRootId 1630
+#define wxGenericDirCtrl_GetTreeCtrl 1631
+#define wxGenericDirCtrl_ReCreateTree 1632
+#define wxGenericDirCtrl_SetDefaultPath 1633
+#define wxGenericDirCtrl_SetFilter 1634
+#define wxGenericDirCtrl_SetFilterIndex 1635
+#define wxGenericDirCtrl_SetPath 1636
+#define wxStaticBox_new_4 1638
+#define wxStaticBox_new_0 1639
+#define wxStaticBox_Create 1640
+#define wxStaticBox_destroy 1641
+#define wxStaticLine_new_2 1643
+#define wxStaticLine_new_0 1644
+#define wxStaticLine_destruct 1645
+#define wxStaticLine_Create 1646
+#define wxStaticLine_IsVertical 1647
+#define wxStaticLine_GetDefaultSize 1648
+#define wxListBox_new_3 1651
+#define wxListBox_new_0 1652
+#define wxListBox_destruct 1654
+#define wxListBox_Create 1656
+#define wxListBox_Deselect 1657
+#define wxListBox_GetSelections 1658
+#define wxListBox_InsertItems 1659
+#define wxListBox_IsSelected 1660
+#define wxListBox_Set 1661
+#define wxListBox_HitTest 1662
+#define wxListBox_SetFirstItem_1_0 1663
+#define wxListBox_SetFirstItem_1_1 1664
+#define wxListCtrl_new_0 1665
+#define wxListCtrl_new_2 1666
+#define wxListCtrl_Arrange 1667
+#define wxListCtrl_AssignImageList 1668
+#define wxListCtrl_ClearAll 1669
+#define wxListCtrl_Create 1670
+#define wxListCtrl_DeleteAllItems 1671
+#define wxListCtrl_DeleteColumn 1672
+#define wxListCtrl_DeleteItem 1673
+#define wxListCtrl_EditLabel 1674
+#define wxListCtrl_EnsureVisible 1675
+#define wxListCtrl_FindItem_3_0 1676
+#define wxListCtrl_FindItem_3_1 1677
+#define wxListCtrl_GetColumn 1678
+#define wxListCtrl_GetColumnCount 1679
+#define wxListCtrl_GetColumnWidth 1680
+#define wxListCtrl_GetCountPerPage 1681
+#define wxListCtrl_GetEditControl 1682
+#define wxListCtrl_GetImageList 1683
+#define wxListCtrl_GetItem 1684
+#define wxListCtrl_GetItemBackgroundColour 1685
+#define wxListCtrl_GetItemCount 1686
+#define wxListCtrl_GetItemData 1687
+#define wxListCtrl_GetItemFont 1688
+#define wxListCtrl_GetItemPosition 1689
+#define wxListCtrl_GetItemRect 1690
+#define wxListCtrl_GetItemSpacing 1691
+#define wxListCtrl_GetItemState 1692
+#define wxListCtrl_GetItemText 1693
+#define wxListCtrl_GetItemTextColour 1694
+#define wxListCtrl_GetNextItem 1695
+#define wxListCtrl_GetSelectedItemCount 1696
+#define wxListCtrl_GetTextColour 1697
+#define wxListCtrl_GetTopItem 1698
+#define wxListCtrl_GetViewRect 1699
+#define wxListCtrl_HitTest 1700
+#define wxListCtrl_InsertColumn_2 1701
+#define wxListCtrl_InsertColumn_3 1702
+#define wxListCtrl_InsertItem_1 1703
+#define wxListCtrl_InsertItem_2_1 1704
+#define wxListCtrl_InsertItem_2_0 1705
+#define wxListCtrl_InsertItem_3 1706
+#define wxListCtrl_RefreshItem 1707
+#define wxListCtrl_RefreshItems 1708
+#define wxListCtrl_ScrollList 1709
+#define wxListCtrl_SetBackgroundColour 1710
+#define wxListCtrl_SetColumn 1711
+#define wxListCtrl_SetColumnWidth 1712
+#define wxListCtrl_SetImageList 1713
+#define wxListCtrl_SetItem_1 1714
+#define wxListCtrl_SetItem_4 1715
+#define wxListCtrl_SetItemBackgroundColour 1716
+#define wxListCtrl_SetItemCount 1717
+#define wxListCtrl_SetItemData 1718
+#define wxListCtrl_SetItemFont 1719
+#define wxListCtrl_SetItemImage 1720
+#define wxListCtrl_SetItemColumnImage 1721
+#define wxListCtrl_SetItemPosition 1722
+#define wxListCtrl_SetItemState 1723
+#define wxListCtrl_SetItemText 1724
+#define wxListCtrl_SetItemTextColour 1725
+#define wxListCtrl_SetSingleStyle 1726
+#define wxListCtrl_SetTextColour 1727
+#define wxListCtrl_SetWindowStyleFlag 1728
+#define wxListCtrl_SortItems 1729
+#define wxListCtrl_destroy 1730
+#define wxListView_ClearColumnImage 1731
+#define wxListView_Focus 1732
+#define wxListView_GetFirstSelected 1733
+#define wxListView_GetFocusedItem 1734
+#define wxListView_GetNextSelected 1735
+#define wxListView_IsSelected 1736
+#define wxListView_Select 1737
+#define wxListView_SetColumnImage 1738
+#define wxListItem_new_0 1739
+#define wxListItem_new_1 1740
+#define wxListItem_destruct 1741
+#define wxListItem_Clear 1742
+#define wxListItem_GetAlign 1743
+#define wxListItem_GetBackgroundColour 1744
+#define wxListItem_GetColumn 1745
+#define wxListItem_GetFont 1746
+#define wxListItem_GetId 1747
+#define wxListItem_GetImage 1748
+#define wxListItem_GetMask 1749
+#define wxListItem_GetState 1750
+#define wxListItem_GetText 1751
+#define wxListItem_GetTextColour 1752
+#define wxListItem_GetWidth 1753
+#define wxListItem_SetAlign 1754
+#define wxListItem_SetBackgroundColour 1755
+#define wxListItem_SetColumn 1756
+#define wxListItem_SetFont 1757
+#define wxListItem_SetId 1758
+#define wxListItem_SetImage 1759
+#define wxListItem_SetMask 1760
+#define wxListItem_SetState 1761
+#define wxListItem_SetStateMask 1762
+#define wxListItem_SetText 1763
+#define wxListItem_SetTextColour 1764
+#define wxListItem_SetWidth 1765
+#define wxListItemAttr_new_0 1766
+#define wxListItemAttr_new_3 1767
+#define wxListItemAttr_GetBackgroundColour 1768
+#define wxListItemAttr_GetFont 1769
+#define wxListItemAttr_GetTextColour 1770
+#define wxListItemAttr_HasBackgroundColour 1771
+#define wxListItemAttr_HasFont 1772
+#define wxListItemAttr_HasTextColour 1773
+#define wxListItemAttr_SetBackgroundColour 1774
+#define wxListItemAttr_SetFont 1775
+#define wxListItemAttr_SetTextColour 1776
+#define wxListItemAttr_destroy 1777
+#define wxImageList_new_0 1778
+#define wxImageList_new_3 1779
+#define wxImageList_Add_1 1780
+#define wxImageList_Add_2_0 1781
+#define wxImageList_Add_2_1 1782
+#define wxImageList_Create 1783
+#define wxImageList_Draw 1785
+#define wxImageList_GetBitmap 1786
+#define wxImageList_GetIcon 1787
+#define wxImageList_GetImageCount 1788
+#define wxImageList_GetSize 1789
+#define wxImageList_Remove 1790
+#define wxImageList_RemoveAll 1791
+#define wxImageList_Replace_2 1792
+#define wxImageList_Replace_3 1793
+#define wxImageList_destroy 1794
+#define wxTextAttr_new_0 1795
+#define wxTextAttr_new_2 1796
+#define wxTextAttr_GetAlignment 1797
+#define wxTextAttr_GetBackgroundColour 1798
+#define wxTextAttr_GetFont 1799
+#define wxTextAttr_GetLeftIndent 1800
+#define wxTextAttr_GetLeftSubIndent 1801
+#define wxTextAttr_GetRightIndent 1802
+#define wxTextAttr_GetTabs 1803
+#define wxTextAttr_GetTextColour 1804
+#define wxTextAttr_HasBackgroundColour 1805
+#define wxTextAttr_HasFont 1806
+#define wxTextAttr_HasTextColour 1807
+#define wxTextAttr_GetFlags 1808
+#define wxTextAttr_IsDefault 1809
+#define wxTextAttr_SetAlignment 1810
+#define wxTextAttr_SetBackgroundColour 1811
+#define wxTextAttr_SetFlags 1812
+#define wxTextAttr_SetFont 1813
+#define wxTextAttr_SetLeftIndent 1814
+#define wxTextAttr_SetRightIndent 1815
+#define wxTextAttr_SetTabs 1816
+#define wxTextAttr_SetTextColour 1817
+#define wxTextAttr_destroy 1818
+#define wxTextCtrl_new_3 1820
+#define wxTextCtrl_new_0 1821
+#define wxTextCtrl_destruct 1823
+#define wxTextCtrl_AppendText 1824
+#define wxTextCtrl_CanCopy 1825
+#define wxTextCtrl_CanCut 1826
+#define wxTextCtrl_CanPaste 1827
+#define wxTextCtrl_CanRedo 1828
+#define wxTextCtrl_CanUndo 1829
+#define wxTextCtrl_Clear 1830
+#define wxTextCtrl_Copy 1831
+#define wxTextCtrl_Create 1832
+#define wxTextCtrl_Cut 1833
+#define wxTextCtrl_DiscardEdits 1834
+#define wxTextCtrl_ChangeValue 1835
+#define wxTextCtrl_EmulateKeyPress 1836
+#define wxTextCtrl_GetDefaultStyle 1837
+#define wxTextCtrl_GetInsertionPoint 1838
+#define wxTextCtrl_GetLastPosition 1839
+#define wxTextCtrl_GetLineLength 1840
+#define wxTextCtrl_GetLineText 1841
+#define wxTextCtrl_GetNumberOfLines 1842
+#define wxTextCtrl_GetRange 1843
+#define wxTextCtrl_GetSelection 1844
+#define wxTextCtrl_GetStringSelection 1845
+#define wxTextCtrl_GetStyle 1846
+#define wxTextCtrl_GetValue 1847
+#define wxTextCtrl_IsEditable 1848
+#define wxTextCtrl_IsModified 1849
+#define wxTextCtrl_IsMultiLine 1850
+#define wxTextCtrl_IsSingleLine 1851
+#define wxTextCtrl_LoadFile 1852
+#define wxTextCtrl_MarkDirty 1853
+#define wxTextCtrl_Paste 1854
+#define wxTextCtrl_PositionToXY 1855
+#define wxTextCtrl_Redo 1856
+#define wxTextCtrl_Remove 1857
+#define wxTextCtrl_Replace 1858
+#define wxTextCtrl_SaveFile 1859
+#define wxTextCtrl_SetDefaultStyle 1860
+#define wxTextCtrl_SetEditable 1861
+#define wxTextCtrl_SetInsertionPoint 1862
+#define wxTextCtrl_SetInsertionPointEnd 1863
+#define wxTextCtrl_SetMaxLength 1865
+#define wxTextCtrl_SetSelection 1866
+#define wxTextCtrl_SetStyle 1867
+#define wxTextCtrl_SetValue 1868
+#define wxTextCtrl_ShowPosition 1869
+#define wxTextCtrl_Undo 1870
+#define wxTextCtrl_WriteText 1871
+#define wxTextCtrl_XYToPosition 1872
+#define wxNotebook_new_0 1875
+#define wxNotebook_new_3 1876
+#define wxNotebook_destruct 1877
+#define wxNotebook_AddPage 1878
+#define wxNotebook_AdvanceSelection 1879
+#define wxNotebook_AssignImageList 1880
+#define wxNotebook_Create 1881
+#define wxNotebook_DeleteAllPages 1882
+#define wxNotebook_DeletePage 1883
+#define wxNotebook_RemovePage 1884
+#define wxNotebook_GetCurrentPage 1885
+#define wxNotebook_GetImageList 1886
+#define wxNotebook_GetPage 1888
+#define wxNotebook_GetPageCount 1889
+#define wxNotebook_GetPageImage 1890
+#define wxNotebook_GetPageText 1891
+#define wxNotebook_GetRowCount 1892
+#define wxNotebook_GetSelection 1893
+#define wxNotebook_GetThemeBackgroundColour 1894
+#define wxNotebook_HitTest 1896
+#define wxNotebook_InsertPage 1898
+#define wxNotebook_SetImageList 1899
+#define wxNotebook_SetPadding 1900
+#define wxNotebook_SetPageSize 1901
+#define wxNotebook_SetPageImage 1902
+#define wxNotebook_SetPageText 1903
+#define wxNotebook_SetSelection 1904
+#define wxNotebook_ChangeSelection 1905
+#define wxChoicebook_new_0 1906
+#define wxChoicebook_new_3 1907
+#define wxChoicebook_AddPage 1908
+#define wxChoicebook_AdvanceSelection 1909
+#define wxChoicebook_AssignImageList 1910
+#define wxChoicebook_Create 1911
+#define wxChoicebook_DeleteAllPages 1912
+#define wxChoicebook_DeletePage 1913
+#define wxChoicebook_RemovePage 1914
+#define wxChoicebook_GetCurrentPage 1915
+#define wxChoicebook_GetImageList 1916
+#define wxChoicebook_GetPage 1918
+#define wxChoicebook_GetPageCount 1919
+#define wxChoicebook_GetPageImage 1920
+#define wxChoicebook_GetPageText 1921
+#define wxChoicebook_GetSelection 1922
+#define wxChoicebook_HitTest 1923
+#define wxChoicebook_InsertPage 1924
+#define wxChoicebook_SetImageList 1925
+#define wxChoicebook_SetPageSize 1926
+#define wxChoicebook_SetPageImage 1927
+#define wxChoicebook_SetPageText 1928
+#define wxChoicebook_SetSelection 1929
+#define wxChoicebook_ChangeSelection 1930
+#define wxChoicebook_destroy 1931
+#define wxToolbook_new_0 1932
+#define wxToolbook_new_3 1933
+#define wxToolbook_AddPage 1934
+#define wxToolbook_AdvanceSelection 1935
+#define wxToolbook_AssignImageList 1936
+#define wxToolbook_Create 1937
+#define wxToolbook_DeleteAllPages 1938
+#define wxToolbook_DeletePage 1939
+#define wxToolbook_RemovePage 1940
+#define wxToolbook_GetCurrentPage 1941
+#define wxToolbook_GetImageList 1942
+#define wxToolbook_GetPage 1944
+#define wxToolbook_GetPageCount 1945
+#define wxToolbook_GetPageImage 1946
+#define wxToolbook_GetPageText 1947
+#define wxToolbook_GetSelection 1948
+#define wxToolbook_HitTest 1950
+#define wxToolbook_InsertPage 1951
+#define wxToolbook_SetImageList 1952
+#define wxToolbook_SetPageSize 1953
+#define wxToolbook_SetPageImage 1954
+#define wxToolbook_SetPageText 1955
+#define wxToolbook_SetSelection 1956
+#define wxToolbook_ChangeSelection 1957
+#define wxToolbook_destroy 1958
+#define wxListbook_new_0 1959
+#define wxListbook_new_3 1960
+#define wxListbook_AddPage 1961
+#define wxListbook_AdvanceSelection 1962
+#define wxListbook_AssignImageList 1963
+#define wxListbook_Create 1964
+#define wxListbook_DeleteAllPages 1965
+#define wxListbook_DeletePage 1966
+#define wxListbook_RemovePage 1967
+#define wxListbook_GetCurrentPage 1968
+#define wxListbook_GetImageList 1969
+#define wxListbook_GetPage 1971
+#define wxListbook_GetPageCount 1972
+#define wxListbook_GetPageImage 1973
+#define wxListbook_GetPageText 1974
+#define wxListbook_GetSelection 1975
+#define wxListbook_HitTest 1977
+#define wxListbook_InsertPage 1978
+#define wxListbook_SetImageList 1979
+#define wxListbook_SetPageSize 1980
+#define wxListbook_SetPageImage 1981
+#define wxListbook_SetPageText 1982
+#define wxListbook_SetSelection 1983
+#define wxListbook_ChangeSelection 1984
+#define wxListbook_destroy 1985
+#define wxTreebook_new_0 1986
+#define wxTreebook_new_3 1987
+#define wxTreebook_AddPage 1988
+#define wxTreebook_AdvanceSelection 1989
+#define wxTreebook_AssignImageList 1990
+#define wxTreebook_Create 1991
+#define wxTreebook_DeleteAllPages 1992
+#define wxTreebook_DeletePage 1993
+#define wxTreebook_RemovePage 1994
+#define wxTreebook_GetCurrentPage 1995
+#define wxTreebook_GetImageList 1996
+#define wxTreebook_GetPage 1998
+#define wxTreebook_GetPageCount 1999
+#define wxTreebook_GetPageImage 2000
+#define wxTreebook_GetPageText 2001
+#define wxTreebook_GetSelection 2002
+#define wxTreebook_ExpandNode 2003
+#define wxTreebook_IsNodeExpanded 2004
+#define wxTreebook_HitTest 2006
+#define wxTreebook_InsertPage 2007
+#define wxTreebook_InsertSubPage 2008
+#define wxTreebook_SetImageList 2009
+#define wxTreebook_SetPageSize 2010
+#define wxTreebook_SetPageImage 2011
+#define wxTreebook_SetPageText 2012
+#define wxTreebook_SetSelection 2013
+#define wxTreebook_ChangeSelection 2014
+#define wxTreebook_destroy 2015
+#define wxTreeCtrl_new_2 2018
+#define wxTreeCtrl_new_0 2019
+#define wxTreeCtrl_destruct 2021
+#define wxTreeCtrl_AddRoot 2022
+#define wxTreeCtrl_AppendItem 2023
+#define wxTreeCtrl_AssignImageList 2024
+#define wxTreeCtrl_AssignStateImageList 2025
+#define wxTreeCtrl_Collapse 2026
+#define wxTreeCtrl_CollapseAndReset 2027
+#define wxTreeCtrl_Create 2028
+#define wxTreeCtrl_Delete 2029
+#define wxTreeCtrl_DeleteAllItems 2030
+#define wxTreeCtrl_DeleteChildren 2031
+#define wxTreeCtrl_EditLabel 2032
+#define wxTreeCtrl_EnsureVisible 2033
+#define wxTreeCtrl_Expand 2034
+#define wxTreeCtrl_GetBoundingRect 2035
+#define wxTreeCtrl_GetChildrenCount 2037
+#define wxTreeCtrl_GetCount 2038
+#define wxTreeCtrl_GetEditControl 2039
+#define wxTreeCtrl_GetFirstChild 2040
+#define wxTreeCtrl_GetNextChild 2041
+#define wxTreeCtrl_GetFirstVisibleItem 2042
+#define wxTreeCtrl_GetImageList 2043
+#define wxTreeCtrl_GetIndent 2044
+#define wxTreeCtrl_GetItemBackgroundColour 2045
+#define wxTreeCtrl_GetItemData 2046
+#define wxTreeCtrl_GetItemFont 2047
+#define wxTreeCtrl_GetItemImage_1 2048
+#define wxTreeCtrl_GetItemImage_2 2049
+#define wxTreeCtrl_GetItemText 2050
+#define wxTreeCtrl_GetItemTextColour 2051
+#define wxTreeCtrl_GetLastChild 2052
+#define wxTreeCtrl_GetNextSibling 2053
+#define wxTreeCtrl_GetNextVisible 2054
+#define wxTreeCtrl_GetItemParent 2055
+#define wxTreeCtrl_GetPrevSibling 2056
+#define wxTreeCtrl_GetPrevVisible 2057
+#define wxTreeCtrl_GetRootItem 2058
+#define wxTreeCtrl_GetSelection 2059
+#define wxTreeCtrl_GetSelections 2060
+#define wxTreeCtrl_GetStateImageList 2061
+#define wxTreeCtrl_HitTest 2062
+#define wxTreeCtrl_InsertItem 2064
+#define wxTreeCtrl_IsBold 2065
+#define wxTreeCtrl_IsExpanded 2066
+#define wxTreeCtrl_IsSelected 2067
+#define wxTreeCtrl_IsVisible 2068
+#define wxTreeCtrl_ItemHasChildren 2069
+#define wxTreeCtrl_IsTreeItemIdOk 2070
+#define wxTreeCtrl_PrependItem 2071
+#define wxTreeCtrl_ScrollTo 2072
+#define wxTreeCtrl_SelectItem_1 2073
+#define wxTreeCtrl_SelectItem_2 2074
+#define wxTreeCtrl_SetIndent 2075
+#define wxTreeCtrl_SetImageList 2076
+#define wxTreeCtrl_SetItemBackgroundColour 2077
+#define wxTreeCtrl_SetItemBold 2078
+#define wxTreeCtrl_SetItemData 2079
+#define wxTreeCtrl_SetItemDropHighlight 2080
+#define wxTreeCtrl_SetItemFont 2081
+#define wxTreeCtrl_SetItemHasChildren 2082
+#define wxTreeCtrl_SetItemImage_2 2083
+#define wxTreeCtrl_SetItemImage_3 2084
+#define wxTreeCtrl_SetItemText 2085
+#define wxTreeCtrl_SetItemTextColour 2086
+#define wxTreeCtrl_SetStateImageList 2087
+#define wxTreeCtrl_SetWindowStyle 2088
+#define wxTreeCtrl_SortChildren 2089
+#define wxTreeCtrl_Toggle 2090
+#define wxTreeCtrl_ToggleItemSelection 2091
+#define wxTreeCtrl_Unselect 2092
+#define wxTreeCtrl_UnselectAll 2093
+#define wxTreeCtrl_UnselectItem 2094
+#define wxScrollBar_new_0 2095
+#define wxScrollBar_new_3 2096
+#define wxScrollBar_destruct 2097
+#define wxScrollBar_Create 2098
+#define wxScrollBar_GetRange 2099
+#define wxScrollBar_GetPageSize 2100
+#define wxScrollBar_GetThumbPosition 2101
+#define wxScrollBar_GetThumbSize 2102
+#define wxScrollBar_SetThumbPosition 2103
+#define wxScrollBar_SetScrollbar 2104
+#define wxSpinButton_new_2 2106
+#define wxSpinButton_new_0 2107
+#define wxSpinButton_Create 2108
+#define wxSpinButton_GetMax 2109
+#define wxSpinButton_GetMin 2110
+#define wxSpinButton_GetValue 2111
+#define wxSpinButton_SetRange 2112
+#define wxSpinButton_SetValue 2113
+#define wxSpinButton_destroy 2114
+#define wxSpinCtrl_new_0 2115
+#define wxSpinCtrl_new_2 2116
+#define wxSpinCtrl_Create 2118
+#define wxSpinCtrl_SetValue_1_1 2121
+#define wxSpinCtrl_SetValue_1_0 2122
+#define wxSpinCtrl_GetValue 2124
+#define wxSpinCtrl_SetRange 2126
+#define wxSpinCtrl_SetSelection 2127
+#define wxSpinCtrl_GetMin 2129
+#define wxSpinCtrl_GetMax 2131
+#define wxSpinCtrl_destroy 2132
+#define wxStaticText_new_0 2133
+#define wxStaticText_new_4 2134
+#define wxStaticText_Create 2135
+#define wxStaticText_GetLabel 2136
+#define wxStaticText_SetLabel 2137
+#define wxStaticText_Wrap 2138
+#define wxStaticText_destroy 2139
+#define wxStaticBitmap_new_0 2140
+#define wxStaticBitmap_new_4 2141
+#define wxStaticBitmap_Create 2142
+#define wxStaticBitmap_GetBitmap 2143
+#define wxStaticBitmap_SetBitmap 2144
+#define wxStaticBitmap_destroy 2145
+#define wxRadioBox_new 2146
+#define wxRadioBox_destruct 2148
+#define wxRadioBox_Create 2149
+#define wxRadioBox_Enable_2 2150
+#define wxRadioBox_Enable_1 2151
+#define wxRadioBox_GetSelection 2152
+#define wxRadioBox_GetString 2153
+#define wxRadioBox_SetSelection 2154
+#define wxRadioBox_Show_2 2155
+#define wxRadioBox_Show_1 2156
+#define wxRadioBox_GetColumnCount 2157
+#define wxRadioBox_GetItemHelpText 2158
+#define wxRadioBox_GetItemToolTip 2159
+#define wxRadioBox_GetItemFromPoint 2161
+#define wxRadioBox_GetRowCount 2162
+#define wxRadioBox_IsItemEnabled 2163
+#define wxRadioBox_IsItemShown 2164
+#define wxRadioBox_SetItemHelpText 2165
+#define wxRadioBox_SetItemToolTip 2166
+#define wxRadioButton_new_0 2167
+#define wxRadioButton_new_4 2168
+#define wxRadioButton_Create 2169
+#define wxRadioButton_GetValue 2170
+#define wxRadioButton_SetValue 2171
+#define wxRadioButton_destroy 2172
+#define wxSlider_new_6 2174
+#define wxSlider_new_0 2175
+#define wxSlider_Create 2176
+#define wxSlider_GetLineSize 2177
+#define wxSlider_GetMax 2178
+#define wxSlider_GetMin 2179
+#define wxSlider_GetPageSize 2180
+#define wxSlider_GetThumbLength 2181
+#define wxSlider_GetValue 2182
+#define wxSlider_SetLineSize 2183
+#define wxSlider_SetPageSize 2184
+#define wxSlider_SetRange 2185
+#define wxSlider_SetThumbLength 2186
+#define wxSlider_SetValue 2187
+#define wxSlider_destroy 2188
+#define wxDialog_new_4 2190
+#define wxDialog_new_0 2191
+#define wxDialog_destruct 2193
+#define wxDialog_Create 2194
+#define wxDialog_CreateButtonSizer 2195
+#define wxDialog_CreateStdDialogButtonSizer 2196
+#define wxDialog_EndModal 2197
+#define wxDialog_GetAffirmativeId 2198
+#define wxDialog_GetReturnCode 2199
+#define wxDialog_IsModal 2200
+#define wxDialog_SetAffirmativeId 2201
+#define wxDialog_SetReturnCode 2202
+#define wxDialog_Show 2203
+#define wxDialog_ShowModal 2204
+#define wxColourDialog_new_0 2205
+#define wxColourDialog_new_2 2206
+#define wxColourDialog_destruct 2207
+#define wxColourDialog_Create 2208
+#define wxColourDialog_GetColourData 2209
+#define wxColourData_new_0 2210
+#define wxColourData_new_1 2211
+#define wxColourData_destruct 2212
+#define wxColourData_GetChooseFull 2213
+#define wxColourData_GetColour 2214
+#define wxColourData_GetCustomColour 2216
+#define wxColourData_SetChooseFull 2217
+#define wxColourData_SetColour 2218
+#define wxColourData_SetCustomColour 2219
+#define wxPalette_new_0 2220
+#define wxPalette_new_4 2221
+#define wxPalette_destruct 2223
+#define wxPalette_Create 2224
+#define wxPalette_GetColoursCount 2225
+#define wxPalette_GetPixel 2226
+#define wxPalette_GetRGB 2227
+#define wxPalette_IsOk 2228
+#define wxDirDialog_new 2232
+#define wxDirDialog_destruct 2233
+#define wxDirDialog_GetPath 2234
+#define wxDirDialog_GetMessage 2235
+#define wxDirDialog_SetMessage 2236
+#define wxDirDialog_SetPath 2237
+#define wxFileDialog_new 2241
+#define wxFileDialog_destruct 2242
+#define wxFileDialog_GetDirectory 2243
+#define wxFileDialog_GetFilename 2244
+#define wxFileDialog_GetFilenames 2245
+#define wxFileDialog_GetFilterIndex 2246
+#define wxFileDialog_GetMessage 2247
+#define wxFileDialog_GetPath 2248
+#define wxFileDialog_GetPaths 2249
+#define wxFileDialog_GetWildcard 2250
+#define wxFileDialog_SetDirectory 2251
+#define wxFileDialog_SetFilename 2252
+#define wxFileDialog_SetFilterIndex 2253
+#define wxFileDialog_SetMessage 2254
+#define wxFileDialog_SetPath 2255
+#define wxFileDialog_SetWildcard 2256
+#define wxPickerBase_SetInternalMargin 2257
+#define wxPickerBase_GetInternalMargin 2258
+#define wxPickerBase_SetTextCtrlProportion 2259
+#define wxPickerBase_SetPickerCtrlProportion 2260
+#define wxPickerBase_GetTextCtrlProportion 2261
+#define wxPickerBase_GetPickerCtrlProportion 2262
+#define wxPickerBase_HasTextCtrl 2263
+#define wxPickerBase_GetTextCtrl 2264
+#define wxPickerBase_IsTextCtrlGrowable 2265
+#define wxPickerBase_SetPickerCtrlGrowable 2266
+#define wxPickerBase_SetTextCtrlGrowable 2267
+#define wxPickerBase_IsPickerCtrlGrowable 2268
+#define wxFilePickerCtrl_new_0 2269
+#define wxFilePickerCtrl_new_3 2270
+#define wxFilePickerCtrl_Create 2271
+#define wxFilePickerCtrl_GetPath 2272
+#define wxFilePickerCtrl_SetPath 2273
+#define wxFilePickerCtrl_destroy 2274
+#define wxDirPickerCtrl_new_0 2275
+#define wxDirPickerCtrl_new_3 2276
+#define wxDirPickerCtrl_Create 2277
+#define wxDirPickerCtrl_GetPath 2278
+#define wxDirPickerCtrl_SetPath 2279
+#define wxDirPickerCtrl_destroy 2280
+#define wxColourPickerCtrl_new_0 2281
+#define wxColourPickerCtrl_new_3 2282
+#define wxColourPickerCtrl_Create 2283
+#define wxColourPickerCtrl_GetColour 2284
+#define wxColourPickerCtrl_SetColour_1_1 2285
+#define wxColourPickerCtrl_SetColour_1_0 2286
+#define wxColourPickerCtrl_destroy 2287
+#define wxDatePickerCtrl_new_0 2288
+#define wxDatePickerCtrl_new_3 2289
+#define wxDatePickerCtrl_GetRange 2290
+#define wxDatePickerCtrl_GetValue 2291
+#define wxDatePickerCtrl_SetRange 2292
+#define wxDatePickerCtrl_SetValue 2293
+#define wxDatePickerCtrl_destroy 2294
+#define wxFontPickerCtrl_new_0 2295
+#define wxFontPickerCtrl_new_3 2296
+#define wxFontPickerCtrl_Create 2297
+#define wxFontPickerCtrl_GetSelectedFont 2298
+#define wxFontPickerCtrl_SetSelectedFont 2299
+#define wxFontPickerCtrl_GetMaxPointSize 2300
+#define wxFontPickerCtrl_SetMaxPointSize 2301
+#define wxFontPickerCtrl_destroy 2302
+#define wxFindReplaceDialog_new_0 2305
+#define wxFindReplaceDialog_new_4 2306
+#define wxFindReplaceDialog_destruct 2307
+#define wxFindReplaceDialog_Create 2308
+#define wxFindReplaceDialog_GetData 2309
+#define wxFindReplaceData_new_0 2310
+#define wxFindReplaceData_new_1 2311
+#define wxFindReplaceData_GetFindString 2312
+#define wxFindReplaceData_GetReplaceString 2313
+#define wxFindReplaceData_GetFlags 2314
+#define wxFindReplaceData_SetFlags 2315
+#define wxFindReplaceData_SetFindString 2316
+#define wxFindReplaceData_SetReplaceString 2317
+#define wxFindReplaceData_destroy 2318
+#define wxMultiChoiceDialog_new_0 2319
+#define wxMultiChoiceDialog_new_5 2321
+#define wxMultiChoiceDialog_GetSelections 2322
+#define wxMultiChoiceDialog_SetSelections 2323
+#define wxMultiChoiceDialog_destroy 2324
+#define wxSingleChoiceDialog_new_0 2325
+#define wxSingleChoiceDialog_new_5 2327
+#define wxSingleChoiceDialog_GetSelection 2328
+#define wxSingleChoiceDialog_GetStringSelection 2329
+#define wxSingleChoiceDialog_SetSelection 2330
+#define wxSingleChoiceDialog_destroy 2331
+#define wxTextEntryDialog_new 2332
+#define wxTextEntryDialog_GetValue 2333
+#define wxTextEntryDialog_SetValue 2334
+#define wxTextEntryDialog_destroy 2335
+#define wxPasswordEntryDialog_new 2336
+#define wxPasswordEntryDialog_destroy 2337
+#define wxFontData_new_0 2338
+#define wxFontData_new_1 2339
+#define wxFontData_destruct 2340
+#define wxFontData_EnableEffects 2341
+#define wxFontData_GetAllowSymbols 2342
+#define wxFontData_GetColour 2343
+#define wxFontData_GetChosenFont 2344
+#define wxFontData_GetEnableEffects 2345
+#define wxFontData_GetInitialFont 2346
+#define wxFontData_GetShowHelp 2347
+#define wxFontData_SetAllowSymbols 2348
+#define wxFontData_SetChosenFont 2349
+#define wxFontData_SetColour 2350
+#define wxFontData_SetInitialFont 2351
+#define wxFontData_SetRange 2352
+#define wxFontData_SetShowHelp 2353
+#define wxFontDialog_new_0 2357
+#define wxFontDialog_new_2 2359
+#define wxFontDialog_Create 2361
+#define wxFontDialog_GetFontData 2362
+#define wxFontDialog_destroy 2364
+#define wxProgressDialog_new 2365
+#define wxProgressDialog_destruct 2366
+#define wxProgressDialog_Resume 2367
+#define wxProgressDialog_Update_2 2368
+#define wxProgressDialog_Update_0 2369
+#define wxMessageDialog_new 2370
+#define wxMessageDialog_destruct 2371
+#define wxPageSetupDialog_new 2372
+#define wxPageSetupDialog_destruct 2373
+#define wxPageSetupDialog_GetPageSetupData 2374
+#define wxPageSetupDialog_ShowModal 2375
+#define wxPageSetupDialogData_new_0 2376
+#define wxPageSetupDialogData_new_1_0 2377
+#define wxPageSetupDialogData_new_1_1 2378
+#define wxPageSetupDialogData_destruct 2379
+#define wxPageSetupDialogData_EnableHelp 2380
+#define wxPageSetupDialogData_EnableMargins 2381
+#define wxPageSetupDialogData_EnableOrientation 2382
+#define wxPageSetupDialogData_EnablePaper 2383
+#define wxPageSetupDialogData_EnablePrinter 2384
+#define wxPageSetupDialogData_GetDefaultMinMargins 2385
+#define wxPageSetupDialogData_GetEnableMargins 2386
+#define wxPageSetupDialogData_GetEnableOrientation 2387
+#define wxPageSetupDialogData_GetEnablePaper 2388
+#define wxPageSetupDialogData_GetEnablePrinter 2389
+#define wxPageSetupDialogData_GetEnableHelp 2390
+#define wxPageSetupDialogData_GetDefaultInfo 2391
+#define wxPageSetupDialogData_GetMarginTopLeft 2392
+#define wxPageSetupDialogData_GetMarginBottomRight 2393
+#define wxPageSetupDialogData_GetMinMarginTopLeft 2394
+#define wxPageSetupDialogData_GetMinMarginBottomRight 2395
+#define wxPageSetupDialogData_GetPaperId 2396
+#define wxPageSetupDialogData_GetPaperSize 2397
+#define wxPageSetupDialogData_GetPrintData 2399
+#define wxPageSetupDialogData_IsOk 2400
+#define wxPageSetupDialogData_SetDefaultInfo 2401
+#define wxPageSetupDialogData_SetDefaultMinMargins 2402
+#define wxPageSetupDialogData_SetMarginTopLeft 2403
+#define wxPageSetupDialogData_SetMarginBottomRight 2404
+#define wxPageSetupDialogData_SetMinMarginTopLeft 2405
+#define wxPageSetupDialogData_SetMinMarginBottomRight 2406
+#define wxPageSetupDialogData_SetPaperId 2407
+#define wxPageSetupDialogData_SetPaperSize_1_1 2408
+#define wxPageSetupDialogData_SetPaperSize_1_0 2409
+#define wxPageSetupDialogData_SetPrintData 2410
+#define wxPrintDialog_new_2_0 2411
+#define wxPrintDialog_new_2_1 2412
+#define wxPrintDialog_destruct 2413
+#define wxPrintDialog_GetPrintDialogData 2414
+#define wxPrintDialog_GetPrintDC 2415
+#define wxPrintDialogData_new_0 2416
+#define wxPrintDialogData_new_1_1 2417
+#define wxPrintDialogData_new_1_0 2418
+#define wxPrintDialogData_destruct 2419
+#define wxPrintDialogData_EnableHelp 2420
+#define wxPrintDialogData_EnablePageNumbers 2421
+#define wxPrintDialogData_EnablePrintToFile 2422
+#define wxPrintDialogData_EnableSelection 2423
+#define wxPrintDialogData_GetAllPages 2424
+#define wxPrintDialogData_GetCollate 2425
+#define wxPrintDialogData_GetFromPage 2426
+#define wxPrintDialogData_GetMaxPage 2427
+#define wxPrintDialogData_GetMinPage 2428
+#define wxPrintDialogData_GetNoCopies 2429
+#define wxPrintDialogData_GetPrintData 2430
+#define wxPrintDialogData_GetPrintToFile 2431
+#define wxPrintDialogData_GetSelection 2432
+#define wxPrintDialogData_GetToPage 2433
+#define wxPrintDialogData_IsOk 2434
+#define wxPrintDialogData_SetCollate 2435
+#define wxPrintDialogData_SetFromPage 2436
+#define wxPrintDialogData_SetMaxPage 2437
+#define wxPrintDialogData_SetMinPage 2438
+#define wxPrintDialogData_SetNoCopies 2439
+#define wxPrintDialogData_SetPrintData 2440
+#define wxPrintDialogData_SetPrintToFile 2441
+#define wxPrintDialogData_SetSelection 2442
+#define wxPrintDialogData_SetToPage 2443
+#define wxPrintData_new_0 2444
+#define wxPrintData_new_1 2445
+#define wxPrintData_destruct 2446
+#define wxPrintData_GetCollate 2447
+#define wxPrintData_GetBin 2448
+#define wxPrintData_GetColour 2449
+#define wxPrintData_GetDuplex 2450
+#define wxPrintData_GetNoCopies 2451
+#define wxPrintData_GetOrientation 2452
+#define wxPrintData_GetPaperId 2453
+#define wxPrintData_GetPrinterName 2454
+#define wxPrintData_GetQuality 2455
+#define wxPrintData_IsOk 2456
+#define wxPrintData_SetBin 2457
+#define wxPrintData_SetCollate 2458
+#define wxPrintData_SetColour 2459
+#define wxPrintData_SetDuplex 2460
+#define wxPrintData_SetNoCopies 2461
+#define wxPrintData_SetOrientation 2462
+#define wxPrintData_SetPaperId 2463
+#define wxPrintData_SetPrinterName 2464
+#define wxPrintData_SetQuality 2465
+#define wxPrintPreview_new_2 2468
+#define wxPrintPreview_new_3 2469
+#define wxPrintPreview_destruct 2471
+#define wxPrintPreview_GetCanvas 2472
+#define wxPrintPreview_GetCurrentPage 2473
+#define wxPrintPreview_GetFrame 2474
+#define wxPrintPreview_GetMaxPage 2475
+#define wxPrintPreview_GetMinPage 2476
+#define wxPrintPreview_GetPrintout 2477
+#define wxPrintPreview_GetPrintoutForPrinting 2478
+#define wxPrintPreview_IsOk 2479
+#define wxPrintPreview_PaintPage 2480
+#define wxPrintPreview_Print 2481
+#define wxPrintPreview_RenderPage 2482
+#define wxPrintPreview_SetCanvas 2483
+#define wxPrintPreview_SetCurrentPage 2484
+#define wxPrintPreview_SetFrame 2485
+#define wxPrintPreview_SetPrintout 2486
+#define wxPrintPreview_SetZoom 2487
+#define wxPreviewFrame_new 2488
+#define wxPreviewFrame_destruct 2489
+#define wxPreviewFrame_CreateControlBar 2490
+#define wxPreviewFrame_CreateCanvas 2491
+#define wxPreviewFrame_Initialize 2492
+#define wxPreviewFrame_OnCloseWindow 2493
+#define wxPreviewControlBar_new 2494
+#define wxPreviewControlBar_destruct 2495
+#define wxPreviewControlBar_CreateButtons 2496
+#define wxPreviewControlBar_GetPrintPreview 2497
+#define wxPreviewControlBar_GetZoomControl 2498
+#define wxPreviewControlBar_SetZoomControl 2499
+#define wxPrinter_new 2501
+#define wxPrinter_CreateAbortWindow 2502
+#define wxPrinter_GetAbort 2503
+#define wxPrinter_GetLastError 2504
+#define wxPrinter_GetPrintDialogData 2505
+#define wxPrinter_Print 2506
+#define wxPrinter_PrintDialog 2507
+#define wxPrinter_ReportError 2508
+#define wxPrinter_Setup 2509
+#define wxPrinter_destroy 2510
+#define wxXmlResource_new_1 2511
+#define wxXmlResource_new_2 2512
+#define wxXmlResource_destruct 2513
+#define wxXmlResource_AttachUnknownControl 2514
+#define wxXmlResource_ClearHandlers 2515
+#define wxXmlResource_CompareVersion 2516
+#define wxXmlResource_Get 2517
+#define wxXmlResource_GetFlags 2518
+#define wxXmlResource_GetVersion 2519
+#define wxXmlResource_GetXRCID 2520
+#define wxXmlResource_InitAllHandlers 2521
+#define wxXmlResource_Load 2522
+#define wxXmlResource_LoadBitmap 2523
+#define wxXmlResource_LoadDialog_2 2524
+#define wxXmlResource_LoadDialog_3 2525
+#define wxXmlResource_LoadFrame_2 2526
+#define wxXmlResource_LoadFrame_3 2527
+#define wxXmlResource_LoadIcon 2528
+#define wxXmlResource_LoadMenu 2529
+#define wxXmlResource_LoadMenuBar_2 2530
+#define wxXmlResource_LoadMenuBar_1 2531
+#define wxXmlResource_LoadPanel_2 2532
+#define wxXmlResource_LoadPanel_3 2533
+#define wxXmlResource_LoadToolBar 2534
+#define wxXmlResource_Set 2535
+#define wxXmlResource_SetFlags 2536
+#define wxXmlResource_Unload 2537
+#define wxXmlResource_xrcctrl 2538
+#define wxHtmlEasyPrinting_new 2539
+#define wxHtmlEasyPrinting_destruct 2540
+#define wxHtmlEasyPrinting_GetPrintData 2541
+#define wxHtmlEasyPrinting_GetPageSetupData 2542
+#define wxHtmlEasyPrinting_PreviewFile 2543
+#define wxHtmlEasyPrinting_PreviewText 2544
+#define wxHtmlEasyPrinting_PrintFile 2545
+#define wxHtmlEasyPrinting_PrintText 2546
+#define wxHtmlEasyPrinting_PageSetup 2547
+#define wxHtmlEasyPrinting_SetFonts 2548
+#define wxHtmlEasyPrinting_SetHeader 2549
+#define wxHtmlEasyPrinting_SetFooter 2550
+#define wxGLCanvas_new_2 2552
+#define wxGLCanvas_new_3_1 2553
+#define wxGLCanvas_new_3_0 2554
+#define wxGLCanvas_GetContext 2555
+#define wxGLCanvas_SetCurrent 2557
+#define wxGLCanvas_SwapBuffers 2558
+#define wxGLCanvas_destroy 2559
+#define wxAuiManager_new 2560
+#define wxAuiManager_destruct 2561
+#define wxAuiManager_AddPane_2_1 2562
+#define wxAuiManager_AddPane_3 2563
+#define wxAuiManager_AddPane_2_0 2564
+#define wxAuiManager_DetachPane 2565
+#define wxAuiManager_GetAllPanes 2566
+#define wxAuiManager_GetArtProvider 2567
+#define wxAuiManager_GetDockSizeConstraint 2568
+#define wxAuiManager_GetFlags 2569
+#define wxAuiManager_GetManagedWindow 2570
+#define wxAuiManager_GetManager 2571
+#define wxAuiManager_GetPane_1_1 2572
+#define wxAuiManager_GetPane_1_0 2573
+#define wxAuiManager_HideHint 2574
+#define wxAuiManager_InsertPane 2575
+#define wxAuiManager_LoadPaneInfo 2576
+#define wxAuiManager_LoadPerspective 2577
+#define wxAuiManager_SavePaneInfo 2578
+#define wxAuiManager_SavePerspective 2579
+#define wxAuiManager_SetArtProvider 2580
+#define wxAuiManager_SetDockSizeConstraint 2581
+#define wxAuiManager_SetFlags 2582
+#define wxAuiManager_SetManagedWindow 2583
+#define wxAuiManager_ShowHint 2584
+#define wxAuiManager_UnInit 2585
+#define wxAuiManager_Update 2586
+#define wxAuiPaneInfo_new_0 2587
+#define wxAuiPaneInfo_new_1 2588
+#define wxAuiPaneInfo_destruct 2589
+#define wxAuiPaneInfo_BestSize_1 2590
+#define wxAuiPaneInfo_BestSize_2 2591
+#define wxAuiPaneInfo_Bottom 2592
+#define wxAuiPaneInfo_BottomDockable 2593
+#define wxAuiPaneInfo_Caption 2594
+#define wxAuiPaneInfo_CaptionVisible 2595
+#define wxAuiPaneInfo_Centre 2596
+#define wxAuiPaneInfo_CentrePane 2597
+#define wxAuiPaneInfo_CloseButton 2598
+#define wxAuiPaneInfo_DefaultPane 2599
+#define wxAuiPaneInfo_DestroyOnClose 2600
+#define wxAuiPaneInfo_Direction 2601
+#define wxAuiPaneInfo_Dock 2602
+#define wxAuiPaneInfo_Dockable 2603
+#define wxAuiPaneInfo_Fixed 2604
+#define wxAuiPaneInfo_Float 2605
+#define wxAuiPaneInfo_Floatable 2606
+#define wxAuiPaneInfo_FloatingPosition_1 2607
+#define wxAuiPaneInfo_FloatingPosition_2 2608
+#define wxAuiPaneInfo_FloatingSize_1 2609
+#define wxAuiPaneInfo_FloatingSize_2 2610
+#define wxAuiPaneInfo_Gripper 2611
+#define wxAuiPaneInfo_GripperTop 2612
+#define wxAuiPaneInfo_HasBorder 2613
+#define wxAuiPaneInfo_HasCaption 2614
+#define wxAuiPaneInfo_HasCloseButton 2615
+#define wxAuiPaneInfo_HasFlag 2616
+#define wxAuiPaneInfo_HasGripper 2617
+#define wxAuiPaneInfo_HasGripperTop 2618
+#define wxAuiPaneInfo_HasMaximizeButton 2619
+#define wxAuiPaneInfo_HasMinimizeButton 2620
+#define wxAuiPaneInfo_HasPinButton 2621
+#define wxAuiPaneInfo_Hide 2622
+#define wxAuiPaneInfo_IsBottomDockable 2623
+#define wxAuiPaneInfo_IsDocked 2624
+#define wxAuiPaneInfo_IsFixed 2625
+#define wxAuiPaneInfo_IsFloatable 2626
+#define wxAuiPaneInfo_IsFloating 2627
+#define wxAuiPaneInfo_IsLeftDockable 2628
+#define wxAuiPaneInfo_IsMovable 2629
+#define wxAuiPaneInfo_IsOk 2630
+#define wxAuiPaneInfo_IsResizable 2631
+#define wxAuiPaneInfo_IsRightDockable 2632
+#define wxAuiPaneInfo_IsShown 2633
+#define wxAuiPaneInfo_IsToolbar 2634
+#define wxAuiPaneInfo_IsTopDockable 2635
+#define wxAuiPaneInfo_Layer 2636
+#define wxAuiPaneInfo_Left 2637
+#define wxAuiPaneInfo_LeftDockable 2638
+#define wxAuiPaneInfo_MaxSize_1 2639
+#define wxAuiPaneInfo_MaxSize_2 2640
+#define wxAuiPaneInfo_MaximizeButton 2641
+#define wxAuiPaneInfo_MinSize_1 2642
+#define wxAuiPaneInfo_MinSize_2 2643
+#define wxAuiPaneInfo_MinimizeButton 2644
+#define wxAuiPaneInfo_Movable 2645
+#define wxAuiPaneInfo_Name 2646
+#define wxAuiPaneInfo_PaneBorder 2647
+#define wxAuiPaneInfo_PinButton 2648
+#define wxAuiPaneInfo_Position 2649
+#define wxAuiPaneInfo_Resizable 2650
+#define wxAuiPaneInfo_Right 2651
+#define wxAuiPaneInfo_RightDockable 2652
+#define wxAuiPaneInfo_Row 2653
+#define wxAuiPaneInfo_SafeSet 2654
+#define wxAuiPaneInfo_SetFlag 2655
+#define wxAuiPaneInfo_Show 2656
+#define wxAuiPaneInfo_ToolbarPane 2657
+#define wxAuiPaneInfo_Top 2658
+#define wxAuiPaneInfo_TopDockable 2659
+#define wxAuiPaneInfo_Window 2660
+#define wxAuiPaneInfo_GetWindow 2661
+#define wxAuiPaneInfo_GetFrame 2662
+#define wxAuiPaneInfo_GetDirection 2663
+#define wxAuiPaneInfo_GetLayer 2664
+#define wxAuiPaneInfo_GetRow 2665
+#define wxAuiPaneInfo_GetPosition 2666
+#define wxAuiPaneInfo_GetFloatingPosition 2667
+#define wxAuiPaneInfo_GetFloatingSize 2668
+#define wxAuiNotebook_new_0 2669
+#define wxAuiNotebook_new_2 2670
+#define wxAuiNotebook_AddPage 2671
+#define wxAuiNotebook_Create 2672
+#define wxAuiNotebook_DeletePage 2673
+#define wxAuiNotebook_GetArtProvider 2674
+#define wxAuiNotebook_GetPage 2675
+#define wxAuiNotebook_GetPageBitmap 2676
+#define wxAuiNotebook_GetPageCount 2677
+#define wxAuiNotebook_GetPageIndex 2678
+#define wxAuiNotebook_GetPageText 2679
+#define wxAuiNotebook_GetSelection 2680
+#define wxAuiNotebook_InsertPage 2681
+#define wxAuiNotebook_RemovePage 2682
+#define wxAuiNotebook_SetArtProvider 2683
+#define wxAuiNotebook_SetFont 2684
+#define wxAuiNotebook_SetPageBitmap 2685
+#define wxAuiNotebook_SetPageText 2686
+#define wxAuiNotebook_SetSelection 2687
+#define wxAuiNotebook_SetTabCtrlHeight 2688
+#define wxAuiNotebook_SetUniformBitmapSize 2689
+#define wxAuiNotebook_destroy 2690
+#define wxAuiTabArt_SetFlags 2691
+#define wxAuiTabArt_SetMeasuringFont 2692
+#define wxAuiTabArt_SetNormalFont 2693
+#define wxAuiTabArt_SetSelectedFont 2694
+#define wxAuiTabArt_SetColour 2695
+#define wxAuiTabArt_SetActiveColour 2696
+#define wxAuiDockArt_GetColour 2697
+#define wxAuiDockArt_GetFont 2698
+#define wxAuiDockArt_GetMetric 2699
+#define wxAuiDockArt_SetColour 2700
+#define wxAuiDockArt_SetFont 2701
+#define wxAuiDockArt_SetMetric 2702
+#define wxAuiSimpleTabArt_new 2703
+#define wxAuiSimpleTabArt_destroy 2704
+#define wxMDIParentFrame_new_0 2705
+#define wxMDIParentFrame_new_4 2706
+#define wxMDIParentFrame_destruct 2707
+#define wxMDIParentFrame_ActivateNext 2708
+#define wxMDIParentFrame_ActivatePrevious 2709
+#define wxMDIParentFrame_ArrangeIcons 2710
+#define wxMDIParentFrame_Cascade 2711
+#define wxMDIParentFrame_Create 2712
+#define wxMDIParentFrame_GetActiveChild 2713
+#define wxMDIParentFrame_GetClientWindow 2714
+#define wxMDIParentFrame_Tile 2715
+#define wxMDIChildFrame_new_0 2716
+#define wxMDIChildFrame_new_4 2717
+#define wxMDIChildFrame_destruct 2718
+#define wxMDIChildFrame_Activate 2719
+#define wxMDIChildFrame_Create 2720
+#define wxMDIChildFrame_Maximize 2721
+#define wxMDIChildFrame_Restore 2722
+#define wxMDIClientWindow_new_0 2723
+#define wxMDIClientWindow_new_2 2724
+#define wxMDIClientWindow_destruct 2725
+#define wxMDIClientWindow_CreateClient 2726
+#define wxLayoutAlgorithm_new 2727
+#define wxLayoutAlgorithm_LayoutFrame 2728
+#define wxLayoutAlgorithm_LayoutMDIFrame 2729
+#define wxLayoutAlgorithm_LayoutWindow 2730
+#define wxLayoutAlgorithm_destroy 2731
+#define wxEvent_GetId 2732
+#define wxEvent_GetSkipped 2733
+#define wxEvent_GetTimestamp 2734
+#define wxEvent_IsCommandEvent 2735
+#define wxEvent_ResumePropagation 2736
+#define wxEvent_ShouldPropagate 2737
+#define wxEvent_Skip 2738
+#define wxEvent_StopPropagation 2739
+#define wxCommandEvent_getClientData 2740
+#define wxCommandEvent_GetExtraLong 2741
+#define wxCommandEvent_GetInt 2742
+#define wxCommandEvent_GetSelection 2743
+#define wxCommandEvent_GetString 2744
+#define wxCommandEvent_IsChecked 2745
+#define wxCommandEvent_IsSelection 2746
+#define wxCommandEvent_SetInt 2747
+#define wxCommandEvent_SetString 2748
+#define wxScrollEvent_GetOrientation 2749
+#define wxScrollEvent_GetPosition 2750
+#define wxScrollWinEvent_GetOrientation 2751
+#define wxScrollWinEvent_GetPosition 2752
+#define wxMouseEvent_AltDown 2753
+#define wxMouseEvent_Button 2754
+#define wxMouseEvent_ButtonDClick 2755
+#define wxMouseEvent_ButtonDown 2756
+#define wxMouseEvent_ButtonUp 2757
+#define wxMouseEvent_CmdDown 2758
+#define wxMouseEvent_ControlDown 2759
+#define wxMouseEvent_Dragging 2760
+#define wxMouseEvent_Entering 2761
+#define wxMouseEvent_GetButton 2762
+#define wxMouseEvent_GetPosition 2765
+#define wxMouseEvent_GetLogicalPosition 2766
+#define wxMouseEvent_GetLinesPerAction 2767
+#define wxMouseEvent_GetWheelRotation 2768
+#define wxMouseEvent_GetWheelDelta 2769
+#define wxMouseEvent_GetX 2770
+#define wxMouseEvent_GetY 2771
+#define wxMouseEvent_IsButton 2772
+#define wxMouseEvent_IsPageScroll 2773
+#define wxMouseEvent_Leaving 2774
+#define wxMouseEvent_LeftDClick 2775
+#define wxMouseEvent_LeftDown 2776
+#define wxMouseEvent_LeftIsDown 2777
+#define wxMouseEvent_LeftUp 2778
+#define wxMouseEvent_MetaDown 2779
+#define wxMouseEvent_MiddleDClick 2780
+#define wxMouseEvent_MiddleDown 2781
+#define wxMouseEvent_MiddleIsDown 2782
+#define wxMouseEvent_MiddleUp 2783
+#define wxMouseEvent_Moving 2784
+#define wxMouseEvent_RightDClick 2785
+#define wxMouseEvent_RightDown 2786
+#define wxMouseEvent_RightIsDown 2787
+#define wxMouseEvent_RightUp 2788
+#define wxMouseEvent_ShiftDown 2789
+#define wxSetCursorEvent_GetCursor 2790
+#define wxSetCursorEvent_GetX 2791
+#define wxSetCursorEvent_GetY 2792
+#define wxSetCursorEvent_HasCursor 2793
+#define wxSetCursorEvent_SetCursor 2794
+#define wxKeyEvent_AltDown 2795
+#define wxKeyEvent_CmdDown 2796
+#define wxKeyEvent_ControlDown 2797
+#define wxKeyEvent_GetKeyCode 2798
+#define wxKeyEvent_GetModifiers 2799
+#define wxKeyEvent_GetPosition 2802
+#define wxKeyEvent_GetRawKeyCode 2803
+#define wxKeyEvent_GetRawKeyFlags 2804
+#define wxKeyEvent_GetUnicodeKey 2805
+#define wxKeyEvent_GetX 2806
+#define wxKeyEvent_GetY 2807
+#define wxKeyEvent_HasModifiers 2808
+#define wxKeyEvent_MetaDown 2809
+#define wxKeyEvent_ShiftDown 2810
+#define wxSizeEvent_GetSize 2811
+#define wxMoveEvent_GetPosition 2812
+#define wxEraseEvent_GetDC 2813
+#define wxFocusEvent_GetWindow 2814
+#define wxChildFocusEvent_GetWindow 2815
+#define wxMenuEvent_GetMenu 2816
+#define wxMenuEvent_GetMenuId 2817
+#define wxMenuEvent_IsPopup 2818
+#define wxCloseEvent_CanVeto 2819
+#define wxCloseEvent_GetLoggingOff 2820
+#define wxCloseEvent_SetCanVeto 2821
+#define wxCloseEvent_SetLoggingOff 2822
+#define wxCloseEvent_Veto 2823
+#define wxShowEvent_SetShow 2824
+#define wxShowEvent_GetShow 2825
+#define wxIconizeEvent_Iconized 2826
+#define wxJoystickEvent_ButtonDown 2827
+#define wxJoystickEvent_ButtonIsDown 2828
+#define wxJoystickEvent_ButtonUp 2829
+#define wxJoystickEvent_GetButtonChange 2830
+#define wxJoystickEvent_GetButtonState 2831
+#define wxJoystickEvent_GetJoystick 2832
+#define wxJoystickEvent_GetPosition 2833
+#define wxJoystickEvent_GetZPosition 2834
+#define wxJoystickEvent_IsButton 2835
+#define wxJoystickEvent_IsMove 2836
+#define wxJoystickEvent_IsZMove 2837
+#define wxUpdateUIEvent_CanUpdate 2838
+#define wxUpdateUIEvent_Check 2839
+#define wxUpdateUIEvent_Enable 2840
+#define wxUpdateUIEvent_Show 2841
+#define wxUpdateUIEvent_GetChecked 2842
+#define wxUpdateUIEvent_GetEnabled 2843
+#define wxUpdateUIEvent_GetShown 2844
+#define wxUpdateUIEvent_GetSetChecked 2845
+#define wxUpdateUIEvent_GetSetEnabled 2846
+#define wxUpdateUIEvent_GetSetShown 2847
+#define wxUpdateUIEvent_GetSetText 2848
+#define wxUpdateUIEvent_GetText 2849
+#define wxUpdateUIEvent_GetMode 2850
+#define wxUpdateUIEvent_GetUpdateInterval 2851
+#define wxUpdateUIEvent_ResetUpdateTime 2852
+#define wxUpdateUIEvent_SetMode 2853
+#define wxUpdateUIEvent_SetText 2854
+#define wxUpdateUIEvent_SetUpdateInterval 2855
+#define wxMouseCaptureChangedEvent_GetCapturedWindow 2856
+#define wxPaletteChangedEvent_SetChangedWindow 2857
+#define wxPaletteChangedEvent_GetChangedWindow 2858
+#define wxQueryNewPaletteEvent_SetPaletteRealized 2859
+#define wxQueryNewPaletteEvent_GetPaletteRealized 2860
+#define wxNavigationKeyEvent_GetDirection 2861
+#define wxNavigationKeyEvent_SetDirection 2862
+#define wxNavigationKeyEvent_IsWindowChange 2863
+#define wxNavigationKeyEvent_SetWindowChange 2864
+#define wxNavigationKeyEvent_IsFromTab 2865
+#define wxNavigationKeyEvent_SetFromTab 2866
+#define wxNavigationKeyEvent_GetCurrentFocus 2867
+#define wxNavigationKeyEvent_SetCurrentFocus 2868
+#define wxHelpEvent_GetOrigin 2869
+#define wxHelpEvent_GetPosition 2870
+#define wxHelpEvent_SetOrigin 2871
+#define wxHelpEvent_SetPosition 2872
+#define wxContextMenuEvent_GetPosition 2873
+#define wxContextMenuEvent_SetPosition 2874
+#define wxIdleEvent_CanSend 2875
+#define wxIdleEvent_GetMode 2876
+#define wxIdleEvent_RequestMore 2877
+#define wxIdleEvent_MoreRequested 2878
+#define wxIdleEvent_SetMode 2879
+#define wxGridEvent_AltDown 2880
+#define wxGridEvent_ControlDown 2881
+#define wxGridEvent_GetCol 2882
+#define wxGridEvent_GetPosition 2883
+#define wxGridEvent_GetRow 2884
+#define wxGridEvent_MetaDown 2885
+#define wxGridEvent_Selecting 2886
+#define wxGridEvent_ShiftDown 2887
+#define wxNotifyEvent_Allow 2888
+#define wxNotifyEvent_IsAllowed 2889
+#define wxNotifyEvent_Veto 2890
+#define wxSashEvent_GetEdge 2891
+#define wxSashEvent_GetDragRect 2892
+#define wxSashEvent_GetDragStatus 2893
+#define wxListEvent_GetCacheFrom 2894
+#define wxListEvent_GetCacheTo 2895
+#define wxListEvent_GetKeyCode 2896
+#define wxListEvent_GetIndex 2897
+#define wxListEvent_GetColumn 2898
+#define wxListEvent_GetPoint 2899
+#define wxListEvent_GetLabel 2900
+#define wxListEvent_GetText 2901
+#define wxListEvent_GetImage 2902
+#define wxListEvent_GetData 2903
+#define wxListEvent_GetMask 2904
+#define wxListEvent_GetItem 2905
+#define wxListEvent_IsEditCancelled 2906
+#define wxDateEvent_GetDate 2907
+#define wxCalendarEvent_GetWeekDay 2908
+#define wxFileDirPickerEvent_GetPath 2909
+#define wxColourPickerEvent_GetColour 2910
+#define wxFontPickerEvent_GetFont 2911
+#define wxStyledTextEvent_GetPosition 2912
+#define wxStyledTextEvent_GetKey 2913
+#define wxStyledTextEvent_GetModifiers 2914
+#define wxStyledTextEvent_GetModificationType 2915
+#define wxStyledTextEvent_GetText 2916
+#define wxStyledTextEvent_GetLength 2917
+#define wxStyledTextEvent_GetLinesAdded 2918
+#define wxStyledTextEvent_GetLine 2919
+#define wxStyledTextEvent_GetFoldLevelNow 2920
+#define wxStyledTextEvent_GetFoldLevelPrev 2921
+#define wxStyledTextEvent_GetMargin 2922
+#define wxStyledTextEvent_GetMessage 2923
+#define wxStyledTextEvent_GetWParam 2924
+#define wxStyledTextEvent_GetLParam 2925
+#define wxStyledTextEvent_GetListType 2926
+#define wxStyledTextEvent_GetX 2927
+#define wxStyledTextEvent_GetY 2928
+#define wxStyledTextEvent_GetDragText 2929
+#define wxStyledTextEvent_GetDragAllowMove 2930
+#define wxStyledTextEvent_GetDragResult 2931
+#define wxStyledTextEvent_GetShift 2932
+#define wxStyledTextEvent_GetControl 2933
+#define wxStyledTextEvent_GetAlt 2934
+#define utils_wxGetKeyState 2935
+#define utils_wxGetMousePosition 2936
+#define utils_wxGetMouseState 2937
+#define utils_wxSetDetectableAutoRepeat 2938
+#define utils_wxBell 2939
+#define utils_wxFindMenuItemId 2940
+#define utils_wxGenericFindWindowAtPoint 2941
+#define utils_wxFindWindowAtPoint 2942
+#define utils_wxBeginBusyCursor 2943
+#define utils_wxEndBusyCursor 2944
+#define utils_wxIsBusy 2945
+#define utils_wxShutdown 2946
+#define utils_wxShell 2947
+#define utils_wxLaunchDefaultBrowser 2948
+#define utils_wxGetEmailAddress 2949
+#define utils_wxGetUserId 2950
+#define utils_wxGetHomeDir 2951
+#define utils_wxNewId 2952
+#define utils_wxRegisterId 2953
+#define utils_wxGetCurrentId 2954
+#define utils_wxGetOsDescription 2955
+#define utils_wxIsPlatformLittleEndian 2956
+#define utils_wxIsPlatform64Bit 2957
+#define gdicmn_wxDisplaySize 2958
+#define gdicmn_wxSetCursor 2959
+#define wxPrintout_new 2960
+#define wxPrintout_destruct 2961
+#define wxPrintout_GetDC 2962
+#define wxPrintout_GetPageSizeMM 2963
+#define wxPrintout_GetPageSizePixels 2964
+#define wxPrintout_GetPaperRectPixels 2965
+#define wxPrintout_GetPPIPrinter 2966
+#define wxPrintout_GetPPIScreen 2967
+#define wxPrintout_GetTitle 2968
+#define wxPrintout_IsPreview 2969
+#define wxPrintout_FitThisSizeToPaper 2970
+#define wxPrintout_FitThisSizeToPage 2971
+#define wxPrintout_FitThisSizeToPageMargins 2972
+#define wxPrintout_MapScreenSizeToPaper 2973
+#define wxPrintout_MapScreenSizeToPage 2974
+#define wxPrintout_MapScreenSizeToPageMargins 2975
+#define wxPrintout_MapScreenSizeToDevice 2976
+#define wxPrintout_GetLogicalPaperRect 2977
+#define wxPrintout_GetLogicalPageRect 2978
+#define wxPrintout_GetLogicalPageMarginsRect 2979
+#define wxPrintout_SetLogicalOrigin 2980
+#define wxPrintout_OffsetLogicalOrigin 2981
+#define wxStyledTextCtrl_new_2 2982
+#define wxStyledTextCtrl_new_0 2983
+#define wxStyledTextCtrl_destruct 2984
+#define wxStyledTextCtrl_Create 2985
+#define wxStyledTextCtrl_AddText 2986
+#define wxStyledTextCtrl_AddStyledText 2987
+#define wxStyledTextCtrl_InsertText 2988
+#define wxStyledTextCtrl_ClearAll 2989
+#define wxStyledTextCtrl_ClearDocumentStyle 2990
+#define wxStyledTextCtrl_GetLength 2991
+#define wxStyledTextCtrl_GetCharAt 2992
+#define wxStyledTextCtrl_GetCurrentPos 2993
+#define wxStyledTextCtrl_GetAnchor 2994
+#define wxStyledTextCtrl_GetStyleAt 2995
+#define wxStyledTextCtrl_Redo 2996
+#define wxStyledTextCtrl_SetUndoCollection 2997
+#define wxStyledTextCtrl_SelectAll 2998
+#define wxStyledTextCtrl_SetSavePoint 2999
+#define wxStyledTextCtrl_GetStyledText 3000
+#define wxStyledTextCtrl_CanRedo 3001
+#define wxStyledTextCtrl_MarkerLineFromHandle 3002
+#define wxStyledTextCtrl_MarkerDeleteHandle 3003
+#define wxStyledTextCtrl_GetUndoCollection 3004
+#define wxStyledTextCtrl_GetViewWhiteSpace 3005
+#define wxStyledTextCtrl_SetViewWhiteSpace 3006
+#define wxStyledTextCtrl_PositionFromPoint 3007
+#define wxStyledTextCtrl_PositionFromPointClose 3008
+#define wxStyledTextCtrl_GotoLine 3009
+#define wxStyledTextCtrl_GotoPos 3010
+#define wxStyledTextCtrl_SetAnchor 3011
+#define wxStyledTextCtrl_GetCurLine 3012
+#define wxStyledTextCtrl_GetEndStyled 3013
+#define wxStyledTextCtrl_ConvertEOLs 3014
+#define wxStyledTextCtrl_GetEOLMode 3015
+#define wxStyledTextCtrl_SetEOLMode 3016
+#define wxStyledTextCtrl_StartStyling 3017
+#define wxStyledTextCtrl_SetStyling 3018
+#define wxStyledTextCtrl_GetBufferedDraw 3019
+#define wxStyledTextCtrl_SetBufferedDraw 3020
+#define wxStyledTextCtrl_SetTabWidth 3021
+#define wxStyledTextCtrl_GetTabWidth 3022
+#define wxStyledTextCtrl_SetCodePage 3023
+#define wxStyledTextCtrl_MarkerDefine 3024
+#define wxStyledTextCtrl_MarkerSetForeground 3025
+#define wxStyledTextCtrl_MarkerSetBackground 3026
+#define wxStyledTextCtrl_MarkerAdd 3027
+#define wxStyledTextCtrl_MarkerDelete 3028
+#define wxStyledTextCtrl_MarkerDeleteAll 3029
+#define wxStyledTextCtrl_MarkerGet 3030
+#define wxStyledTextCtrl_MarkerNext 3031
+#define wxStyledTextCtrl_MarkerPrevious 3032
+#define wxStyledTextCtrl_MarkerDefineBitmap 3033
+#define wxStyledTextCtrl_MarkerAddSet 3034
+#define wxStyledTextCtrl_MarkerSetAlpha 3035
+#define wxStyledTextCtrl_SetMarginType 3036
+#define wxStyledTextCtrl_GetMarginType 3037
+#define wxStyledTextCtrl_SetMarginWidth 3038
+#define wxStyledTextCtrl_GetMarginWidth 3039
+#define wxStyledTextCtrl_SetMarginMask 3040
+#define wxStyledTextCtrl_GetMarginMask 3041
+#define wxStyledTextCtrl_SetMarginSensitive 3042
+#define wxStyledTextCtrl_GetMarginSensitive 3043
+#define wxStyledTextCtrl_StyleClearAll 3044
+#define wxStyledTextCtrl_StyleSetForeground 3045
+#define wxStyledTextCtrl_StyleSetBackground 3046
+#define wxStyledTextCtrl_StyleSetBold 3047
+#define wxStyledTextCtrl_StyleSetItalic 3048
+#define wxStyledTextCtrl_StyleSetSize 3049
+#define wxStyledTextCtrl_StyleSetFaceName 3050
+#define wxStyledTextCtrl_StyleSetEOLFilled 3051
+#define wxStyledTextCtrl_StyleResetDefault 3052
+#define wxStyledTextCtrl_StyleSetUnderline 3053
+#define wxStyledTextCtrl_StyleSetCase 3054
+#define wxStyledTextCtrl_StyleSetHotSpot 3055
+#define wxStyledTextCtrl_SetSelForeground 3056
+#define wxStyledTextCtrl_SetSelBackground 3057
+#define wxStyledTextCtrl_GetSelAlpha 3058
+#define wxStyledTextCtrl_SetSelAlpha 3059
+#define wxStyledTextCtrl_SetCaretForeground 3060
+#define wxStyledTextCtrl_CmdKeyAssign 3061
+#define wxStyledTextCtrl_CmdKeyClear 3062
+#define wxStyledTextCtrl_CmdKeyClearAll 3063
+#define wxStyledTextCtrl_SetStyleBytes 3064
+#define wxStyledTextCtrl_StyleSetVisible 3065
+#define wxStyledTextCtrl_GetCaretPeriod 3066
+#define wxStyledTextCtrl_SetCaretPeriod 3067
+#define wxStyledTextCtrl_SetWordChars 3068
+#define wxStyledTextCtrl_BeginUndoAction 3069
+#define wxStyledTextCtrl_EndUndoAction 3070
+#define wxStyledTextCtrl_IndicatorSetStyle 3071
+#define wxStyledTextCtrl_IndicatorGetStyle 3072
+#define wxStyledTextCtrl_IndicatorSetForeground 3073
+#define wxStyledTextCtrl_IndicatorGetForeground 3074
+#define wxStyledTextCtrl_SetWhitespaceForeground 3075
+#define wxStyledTextCtrl_SetWhitespaceBackground 3076
+#define wxStyledTextCtrl_GetStyleBits 3077
+#define wxStyledTextCtrl_SetLineState 3078
+#define wxStyledTextCtrl_GetLineState 3079
+#define wxStyledTextCtrl_GetMaxLineState 3080
+#define wxStyledTextCtrl_GetCaretLineVisible 3081
+#define wxStyledTextCtrl_SetCaretLineVisible 3082
+#define wxStyledTextCtrl_GetCaretLineBackground 3083
+#define wxStyledTextCtrl_SetCaretLineBackground 3084
+#define wxStyledTextCtrl_AutoCompShow 3085
+#define wxStyledTextCtrl_AutoCompCancel 3086
+#define wxStyledTextCtrl_AutoCompActive 3087
+#define wxStyledTextCtrl_AutoCompPosStart 3088
+#define wxStyledTextCtrl_AutoCompComplete 3089
+#define wxStyledTextCtrl_AutoCompStops 3090
+#define wxStyledTextCtrl_AutoCompSetSeparator 3091
+#define wxStyledTextCtrl_AutoCompGetSeparator 3092
+#define wxStyledTextCtrl_AutoCompSelect 3093
+#define wxStyledTextCtrl_AutoCompSetCancelAtStart 3094
+#define wxStyledTextCtrl_AutoCompGetCancelAtStart 3095
+#define wxStyledTextCtrl_AutoCompSetFillUps 3096
+#define wxStyledTextCtrl_AutoCompSetChooseSingle 3097
+#define wxStyledTextCtrl_AutoCompGetChooseSingle 3098
+#define wxStyledTextCtrl_AutoCompSetIgnoreCase 3099
+#define wxStyledTextCtrl_AutoCompGetIgnoreCase 3100
+#define wxStyledTextCtrl_UserListShow 3101
+#define wxStyledTextCtrl_AutoCompSetAutoHide 3102
+#define wxStyledTextCtrl_AutoCompGetAutoHide 3103
+#define wxStyledTextCtrl_AutoCompSetDropRestOfWord 3104
+#define wxStyledTextCtrl_AutoCompGetDropRestOfWord 3105
+#define wxStyledTextCtrl_RegisterImage 3106
+#define wxStyledTextCtrl_ClearRegisteredImages 3107
+#define wxStyledTextCtrl_AutoCompGetTypeSeparator 3108
+#define wxStyledTextCtrl_AutoCompSetTypeSeparator 3109
+#define wxStyledTextCtrl_AutoCompSetMaxWidth 3110
+#define wxStyledTextCtrl_AutoCompGetMaxWidth 3111
+#define wxStyledTextCtrl_AutoCompSetMaxHeight 3112
+#define wxStyledTextCtrl_AutoCompGetMaxHeight 3113
+#define wxStyledTextCtrl_SetIndent 3114
+#define wxStyledTextCtrl_GetIndent 3115
+#define wxStyledTextCtrl_SetUseTabs 3116
+#define wxStyledTextCtrl_GetUseTabs 3117
+#define wxStyledTextCtrl_SetLineIndentation 3118
+#define wxStyledTextCtrl_GetLineIndentation 3119
+#define wxStyledTextCtrl_GetLineIndentPosition 3120
+#define wxStyledTextCtrl_GetColumn 3121
+#define wxStyledTextCtrl_SetUseHorizontalScrollBar 3122
+#define wxStyledTextCtrl_GetUseHorizontalScrollBar 3123
+#define wxStyledTextCtrl_SetIndentationGuides 3124
+#define wxStyledTextCtrl_GetIndentationGuides 3125
+#define wxStyledTextCtrl_SetHighlightGuide 3126
+#define wxStyledTextCtrl_GetHighlightGuide 3127
+#define wxStyledTextCtrl_GetLineEndPosition 3128
+#define wxStyledTextCtrl_GetCodePage 3129
+#define wxStyledTextCtrl_GetCaretForeground 3130
+#define wxStyledTextCtrl_GetReadOnly 3131
+#define wxStyledTextCtrl_SetCurrentPos 3132
+#define wxStyledTextCtrl_SetSelectionStart 3133
+#define wxStyledTextCtrl_GetSelectionStart 3134
+#define wxStyledTextCtrl_SetSelectionEnd 3135
+#define wxStyledTextCtrl_GetSelectionEnd 3136
+#define wxStyledTextCtrl_SetPrintMagnification 3137
+#define wxStyledTextCtrl_GetPrintMagnification 3138
+#define wxStyledTextCtrl_SetPrintColourMode 3139
+#define wxStyledTextCtrl_GetPrintColourMode 3140
+#define wxStyledTextCtrl_FindText 3141
+#define wxStyledTextCtrl_FormatRange 3142
+#define wxStyledTextCtrl_GetFirstVisibleLine 3143
+#define wxStyledTextCtrl_GetLine 3144
+#define wxStyledTextCtrl_GetLineCount 3145
+#define wxStyledTextCtrl_SetMarginLeft 3146
+#define wxStyledTextCtrl_GetMarginLeft 3147
+#define wxStyledTextCtrl_SetMarginRight 3148
+#define wxStyledTextCtrl_GetMarginRight 3149
+#define wxStyledTextCtrl_GetModify 3150
+#define wxStyledTextCtrl_SetSelection 3151
+#define wxStyledTextCtrl_GetSelectedText 3152
+#define wxStyledTextCtrl_GetTextRange 3153
+#define wxStyledTextCtrl_HideSelection 3154
+#define wxStyledTextCtrl_LineFromPosition 3155
+#define wxStyledTextCtrl_PositionFromLine 3156
+#define wxStyledTextCtrl_LineScroll 3157
+#define wxStyledTextCtrl_EnsureCaretVisible 3158
+#define wxStyledTextCtrl_ReplaceSelection 3159
+#define wxStyledTextCtrl_SetReadOnly 3160
+#define wxStyledTextCtrl_CanPaste 3161
+#define wxStyledTextCtrl_CanUndo 3162
+#define wxStyledTextCtrl_EmptyUndoBuffer 3163
+#define wxStyledTextCtrl_Undo 3164
+#define wxStyledTextCtrl_Cut 3165
+#define wxStyledTextCtrl_Copy 3166
+#define wxStyledTextCtrl_Paste 3167
+#define wxStyledTextCtrl_Clear 3168
+#define wxStyledTextCtrl_SetText 3169
+#define wxStyledTextCtrl_GetText 3170
+#define wxStyledTextCtrl_GetTextLength 3171
+#define wxStyledTextCtrl_GetOvertype 3172
+#define wxStyledTextCtrl_SetCaretWidth 3173
+#define wxStyledTextCtrl_GetCaretWidth 3174
+#define wxStyledTextCtrl_SetTargetStart 3175
+#define wxStyledTextCtrl_GetTargetStart 3176
+#define wxStyledTextCtrl_SetTargetEnd 3177
+#define wxStyledTextCtrl_GetTargetEnd 3178
+#define wxStyledTextCtrl_ReplaceTarget 3179
+#define wxStyledTextCtrl_SearchInTarget 3180
+#define wxStyledTextCtrl_SetSearchFlags 3181
+#define wxStyledTextCtrl_GetSearchFlags 3182
+#define wxStyledTextCtrl_CallTipShow 3183
+#define wxStyledTextCtrl_CallTipCancel 3184
+#define wxStyledTextCtrl_CallTipActive 3185
+#define wxStyledTextCtrl_CallTipPosAtStart 3186
+#define wxStyledTextCtrl_CallTipSetHighlight 3187
+#define wxStyledTextCtrl_CallTipSetBackground 3188
+#define wxStyledTextCtrl_CallTipSetForeground 3189
+#define wxStyledTextCtrl_CallTipSetForegroundHighlight 3190
+#define wxStyledTextCtrl_CallTipUseStyle 3191
+#define wxStyledTextCtrl_VisibleFromDocLine 3192
+#define wxStyledTextCtrl_DocLineFromVisible 3193
+#define wxStyledTextCtrl_WrapCount 3194
+#define wxStyledTextCtrl_SetFoldLevel 3195
+#define wxStyledTextCtrl_GetFoldLevel 3196
+#define wxStyledTextCtrl_GetLastChild 3197
+#define wxStyledTextCtrl_GetFoldParent 3198
+#define wxStyledTextCtrl_ShowLines 3199
+#define wxStyledTextCtrl_HideLines 3200
+#define wxStyledTextCtrl_GetLineVisible 3201
+#define wxStyledTextCtrl_SetFoldExpanded 3202
+#define wxStyledTextCtrl_GetFoldExpanded 3203
+#define wxStyledTextCtrl_ToggleFold 3204
+#define wxStyledTextCtrl_EnsureVisible 3205
+#define wxStyledTextCtrl_SetFoldFlags 3206
+#define wxStyledTextCtrl_EnsureVisibleEnforcePolicy 3207
+#define wxStyledTextCtrl_SetTabIndents 3208
+#define wxStyledTextCtrl_GetTabIndents 3209
+#define wxStyledTextCtrl_SetBackSpaceUnIndents 3210
+#define wxStyledTextCtrl_GetBackSpaceUnIndents 3211
+#define wxStyledTextCtrl_SetMouseDwellTime 3212
+#define wxStyledTextCtrl_GetMouseDwellTime 3213
+#define wxStyledTextCtrl_WordStartPosition 3214
+#define wxStyledTextCtrl_WordEndPosition 3215
+#define wxStyledTextCtrl_SetWrapMode 3216
+#define wxStyledTextCtrl_GetWrapMode 3217
+#define wxStyledTextCtrl_SetWrapVisualFlags 3218
+#define wxStyledTextCtrl_GetWrapVisualFlags 3219
+#define wxStyledTextCtrl_SetWrapVisualFlagsLocation 3220
+#define wxStyledTextCtrl_GetWrapVisualFlagsLocation 3221
+#define wxStyledTextCtrl_SetWrapStartIndent 3222
+#define wxStyledTextCtrl_GetWrapStartIndent 3223
+#define wxStyledTextCtrl_SetLayoutCache 3224
+#define wxStyledTextCtrl_GetLayoutCache 3225
+#define wxStyledTextCtrl_SetScrollWidth 3226
+#define wxStyledTextCtrl_GetScrollWidth 3227
+#define wxStyledTextCtrl_TextWidth 3228
+#define wxStyledTextCtrl_GetEndAtLastLine 3229
+#define wxStyledTextCtrl_TextHeight 3230
+#define wxStyledTextCtrl_SetUseVerticalScrollBar 3231
+#define wxStyledTextCtrl_GetUseVerticalScrollBar 3232
+#define wxStyledTextCtrl_AppendText 3233
+#define wxStyledTextCtrl_GetTwoPhaseDraw 3234
+#define wxStyledTextCtrl_SetTwoPhaseDraw 3235
+#define wxStyledTextCtrl_TargetFromSelection 3236
+#define wxStyledTextCtrl_LinesJoin 3237
+#define wxStyledTextCtrl_LinesSplit 3238
+#define wxStyledTextCtrl_SetFoldMarginColour 3239
+#define wxStyledTextCtrl_SetFoldMarginHiColour 3240
+#define wxStyledTextCtrl_LineDown 3241
+#define wxStyledTextCtrl_LineDownExtend 3242
+#define wxStyledTextCtrl_LineUp 3243
+#define wxStyledTextCtrl_LineUpExtend 3244
+#define wxStyledTextCtrl_CharLeft 3245
+#define wxStyledTextCtrl_CharLeftExtend 3246
+#define wxStyledTextCtrl_CharRight 3247
+#define wxStyledTextCtrl_CharRightExtend 3248
+#define wxStyledTextCtrl_WordLeft 3249
+#define wxStyledTextCtrl_WordLeftExtend 3250
+#define wxStyledTextCtrl_WordRight 3251
+#define wxStyledTextCtrl_WordRightExtend 3252
+#define wxStyledTextCtrl_Home 3253
+#define wxStyledTextCtrl_HomeExtend 3254
+#define wxStyledTextCtrl_LineEnd 3255
+#define wxStyledTextCtrl_LineEndExtend 3256
+#define wxStyledTextCtrl_DocumentStart 3257
+#define wxStyledTextCtrl_DocumentStartExtend 3258
+#define wxStyledTextCtrl_DocumentEnd 3259
+#define wxStyledTextCtrl_DocumentEndExtend 3260
+#define wxStyledTextCtrl_PageUp 3261
+#define wxStyledTextCtrl_PageUpExtend 3262
+#define wxStyledTextCtrl_PageDown 3263
+#define wxStyledTextCtrl_PageDownExtend 3264
+#define wxStyledTextCtrl_EditToggleOvertype 3265
+#define wxStyledTextCtrl_Cancel 3266
+#define wxStyledTextCtrl_DeleteBack 3267
+#define wxStyledTextCtrl_Tab 3268
+#define wxStyledTextCtrl_BackTab 3269
+#define wxStyledTextCtrl_NewLine 3270
+#define wxStyledTextCtrl_FormFeed 3271
+#define wxStyledTextCtrl_VCHome 3272
+#define wxStyledTextCtrl_VCHomeExtend 3273
+#define wxStyledTextCtrl_ZoomIn 3274
+#define wxStyledTextCtrl_ZoomOut 3275
+#define wxStyledTextCtrl_DelWordLeft 3276
+#define wxStyledTextCtrl_DelWordRight 3277
+#define wxStyledTextCtrl_LineCut 3278
+#define wxStyledTextCtrl_LineDelete 3279
+#define wxStyledTextCtrl_LineTranspose 3280
+#define wxStyledTextCtrl_LineDuplicate 3281
+#define wxStyledTextCtrl_LowerCase 3282
+#define wxStyledTextCtrl_UpperCase 3283
+#define wxStyledTextCtrl_LineScrollDown 3284
+#define wxStyledTextCtrl_LineScrollUp 3285
+#define wxStyledTextCtrl_DeleteBackNotLine 3286
+#define wxStyledTextCtrl_HomeDisplay 3287
+#define wxStyledTextCtrl_HomeDisplayExtend 3288
+#define wxStyledTextCtrl_LineEndDisplay 3289
+#define wxStyledTextCtrl_LineEndDisplayExtend 3290
+#define wxStyledTextCtrl_HomeWrapExtend 3291
+#define wxStyledTextCtrl_LineEndWrap 3292
+#define wxStyledTextCtrl_LineEndWrapExtend 3293
+#define wxStyledTextCtrl_VCHomeWrap 3294
+#define wxStyledTextCtrl_VCHomeWrapExtend 3295
+#define wxStyledTextCtrl_LineCopy 3296
+#define wxStyledTextCtrl_MoveCaretInsideView 3297
+#define wxStyledTextCtrl_LineLength 3298
+#define wxStyledTextCtrl_BraceHighlight 3299
+#define wxStyledTextCtrl_BraceBadLight 3300
+#define wxStyledTextCtrl_BraceMatch 3301
+#define wxStyledTextCtrl_GetViewEOL 3302
+#define wxStyledTextCtrl_SetViewEOL 3303
+#define wxStyledTextCtrl_SetModEventMask 3304
+#define wxStyledTextCtrl_GetEdgeColumn 3305
+#define wxStyledTextCtrl_SetEdgeColumn 3306
+#define wxStyledTextCtrl_SetEdgeMode 3307
+#define wxStyledTextCtrl_GetEdgeMode 3308
+#define wxStyledTextCtrl_GetEdgeColour 3309
+#define wxStyledTextCtrl_SetEdgeColour 3310
+#define wxStyledTextCtrl_SearchAnchor 3311
+#define wxStyledTextCtrl_SearchNext 3312
+#define wxStyledTextCtrl_SearchPrev 3313
+#define wxStyledTextCtrl_LinesOnScreen 3314
+#define wxStyledTextCtrl_UsePopUp 3315
+#define wxStyledTextCtrl_SelectionIsRectangle 3316
+#define wxStyledTextCtrl_SetZoom 3317
+#define wxStyledTextCtrl_GetZoom 3318
+#define wxStyledTextCtrl_GetModEventMask 3319
+#define wxStyledTextCtrl_SetSTCFocus 3320
+#define wxStyledTextCtrl_GetSTCFocus 3321
+#define wxStyledTextCtrl_SetStatus 3322
+#define wxStyledTextCtrl_GetStatus 3323
+#define wxStyledTextCtrl_SetMouseDownCaptures 3324
+#define wxStyledTextCtrl_GetMouseDownCaptures 3325
+#define wxStyledTextCtrl_SetSTCCursor 3326
+#define wxStyledTextCtrl_GetSTCCursor 3327
+#define wxStyledTextCtrl_SetControlCharSymbol 3328
+#define wxStyledTextCtrl_GetControlCharSymbol 3329
+#define wxStyledTextCtrl_WordPartLeft 3330
+#define wxStyledTextCtrl_WordPartLeftExtend 3331
+#define wxStyledTextCtrl_WordPartRight 3332
+#define wxStyledTextCtrl_WordPartRightExtend 3333
+#define wxStyledTextCtrl_SetVisiblePolicy 3334
+#define wxStyledTextCtrl_DelLineLeft 3335
+#define wxStyledTextCtrl_DelLineRight 3336
+#define wxStyledTextCtrl_GetXOffset 3337
+#define wxStyledTextCtrl_ChooseCaretX 3338
+#define wxStyledTextCtrl_SetXCaretPolicy 3339
+#define wxStyledTextCtrl_SetYCaretPolicy 3340
+#define wxStyledTextCtrl_GetPrintWrapMode 3341
+#define wxStyledTextCtrl_SetHotspotActiveForeground 3342
+#define wxStyledTextCtrl_SetHotspotActiveBackground 3343
+#define wxStyledTextCtrl_SetHotspotActiveUnderline 3344
+#define wxStyledTextCtrl_SetHotspotSingleLine 3345
+#define wxStyledTextCtrl_ParaDownExtend 3346
+#define wxStyledTextCtrl_ParaUp 3347
+#define wxStyledTextCtrl_ParaUpExtend 3348
+#define wxStyledTextCtrl_PositionBefore 3349
+#define wxStyledTextCtrl_PositionAfter 3350
+#define wxStyledTextCtrl_CopyRange 3351
+#define wxStyledTextCtrl_CopyText 3352
+#define wxStyledTextCtrl_SetSelectionMode 3353
+#define wxStyledTextCtrl_GetSelectionMode 3354
+#define wxStyledTextCtrl_LineDownRectExtend 3355
+#define wxStyledTextCtrl_LineUpRectExtend 3356
+#define wxStyledTextCtrl_CharLeftRectExtend 3357
+#define wxStyledTextCtrl_CharRightRectExtend 3358
+#define wxStyledTextCtrl_HomeRectExtend 3359
+#define wxStyledTextCtrl_VCHomeRectExtend 3360
+#define wxStyledTextCtrl_LineEndRectExtend 3361
+#define wxStyledTextCtrl_PageUpRectExtend 3362
+#define wxStyledTextCtrl_PageDownRectExtend 3363
+#define wxStyledTextCtrl_StutteredPageUp 3364
+#define wxStyledTextCtrl_StutteredPageUpExtend 3365
+#define wxStyledTextCtrl_StutteredPageDown 3366
+#define wxStyledTextCtrl_StutteredPageDownExtend 3367
+#define wxStyledTextCtrl_WordLeftEnd 3368
+#define wxStyledTextCtrl_WordLeftEndExtend 3369
+#define wxStyledTextCtrl_WordRightEnd 3370
+#define wxStyledTextCtrl_WordRightEndExtend 3371
+#define wxStyledTextCtrl_SetWhitespaceChars 3372
+#define wxStyledTextCtrl_SetCharsDefault 3373
+#define wxStyledTextCtrl_AutoCompGetCurrent 3374
+#define wxStyledTextCtrl_Allocate 3375
+#define wxStyledTextCtrl_FindColumn 3376
+#define wxStyledTextCtrl_GetCaretSticky 3377
+#define wxStyledTextCtrl_SetCaretSticky 3378
+#define wxStyledTextCtrl_ToggleCaretSticky 3379
+#define wxStyledTextCtrl_SetPasteConvertEndings 3380
+#define wxStyledTextCtrl_GetPasteConvertEndings 3381
+#define wxStyledTextCtrl_SelectionDuplicate 3382
+#define wxStyledTextCtrl_SetCaretLineBackAlpha 3383
+#define wxStyledTextCtrl_GetCaretLineBackAlpha 3384
+#define wxStyledTextCtrl_StartRecord 3385
+#define wxStyledTextCtrl_StopRecord 3386
+#define wxStyledTextCtrl_SetLexer 3387
+#define wxStyledTextCtrl_GetLexer 3388
+#define wxStyledTextCtrl_Colourise 3389
+#define wxStyledTextCtrl_SetProperty 3390
+#define wxStyledTextCtrl_SetKeyWords 3391
+#define wxStyledTextCtrl_SetLexerLanguage 3392
+#define wxStyledTextCtrl_GetProperty 3393
+#define wxStyledTextCtrl_GetStyleBitsNeeded 3394
+#define wxStyledTextCtrl_GetCurrentLine 3395
+#define wxStyledTextCtrl_StyleSetSpec 3396
+#define wxStyledTextCtrl_StyleSetFont 3397
+#define wxStyledTextCtrl_StyleSetFontAttr 3398
+#define wxStyledTextCtrl_StyleSetCharacterSet 3399
+#define wxStyledTextCtrl_StyleSetFontEncoding 3400
+#define wxStyledTextCtrl_CmdKeyExecute 3401
+#define wxStyledTextCtrl_SetMargins 3402
+#define wxStyledTextCtrl_GetSelection 3403
+#define wxStyledTextCtrl_PointFromPosition 3404
+#define wxStyledTextCtrl_ScrollToLine 3405
+#define wxStyledTextCtrl_ScrollToColumn 3406
+#define wxStyledTextCtrl_SetVScrollBar 3407
+#define wxStyledTextCtrl_SetHScrollBar 3408
+#define wxStyledTextCtrl_GetLastKeydownProcessed 3409
+#define wxStyledTextCtrl_SetLastKeydownProcessed 3410
+#define wxStyledTextCtrl_SaveFile 3411
+#define wxStyledTextCtrl_LoadFile 3412
+#define wxStyledTextCtrl_DoDragOver 3413
+#define wxStyledTextCtrl_DoDropText 3414
+#define wxStyledTextCtrl_GetUseAntiAliasing 3415
+#define wxStyledTextCtrl_AddTextRaw 3416
+#define wxStyledTextCtrl_InsertTextRaw 3417
+#define wxStyledTextCtrl_GetCurLineRaw 3418
+#define wxStyledTextCtrl_GetLineRaw 3419
+#define wxStyledTextCtrl_GetSelectedTextRaw 3420
+#define wxStyledTextCtrl_GetTextRangeRaw 3421
+#define wxStyledTextCtrl_SetTextRaw 3422
+#define wxStyledTextCtrl_GetTextRaw 3423
+#define wxStyledTextCtrl_AppendTextRaw 3424
+#define wxArtProvider_GetBitmap 3425
+#define wxArtProvider_GetIcon 3426
+#define wxTreeEvent_GetKeyCode 3427
+#define wxTreeEvent_GetItem 3428
+#define wxTreeEvent_GetKeyEvent 3429
+#define wxTreeEvent_GetLabel 3430
+#define wxTreeEvent_GetOldItem 3431
+#define wxTreeEvent_GetPoint 3432
+#define wxTreeEvent_IsEditCancelled 3433
+#define wxTreeEvent_SetToolTip 3434
+#define wxNotebookEvent_GetOldSelection 3435
+#define wxNotebookEvent_GetSelection 3436
+#define wxNotebookEvent_SetOldSelection 3437
+#define wxNotebookEvent_SetSelection 3438
+#define wxFileDataObject_new 3439
+#define wxFileDataObject_AddFile 3440
+#define wxFileDataObject_GetFilenames 3441
+#define wxFileDataObject_destroy 3442
+#define wxTextDataObject_new 3443
+#define wxTextDataObject_GetTextLength 3444
+#define wxTextDataObject_GetText 3445
+#define wxTextDataObject_SetText 3446
+#define wxTextDataObject_destroy 3447
+#define wxBitmapDataObject_new_1_1 3448
+#define wxBitmapDataObject_new_1_0 3449
+#define wxBitmapDataObject_GetBitmap 3450
+#define wxBitmapDataObject_SetBitmap 3451
+#define wxBitmapDataObject_destroy 3452
+#define wxClipboard_new 3454
+#define wxClipboard_destruct 3455
+#define wxClipboard_AddData 3456
+#define wxClipboard_Clear 3457
+#define wxClipboard_Close 3458
+#define wxClipboard_Flush 3459
+#define wxClipboard_GetData 3460
+#define wxClipboard_IsOpened 3461
+#define wxClipboard_Open 3462
+#define wxClipboard_SetData 3463
+#define wxClipboard_UsePrimarySelection 3465
+#define wxClipboard_IsSupported 3466
+#define wxClipboard_Get 3467
+#define wxSpinEvent_GetPosition 3468
+#define wxSpinEvent_SetPosition 3469
+#define wxSplitterWindow_new_0 3470
+#define wxSplitterWindow_new_2 3471
+#define wxSplitterWindow_destruct 3472
+#define wxSplitterWindow_Create 3473
+#define wxSplitterWindow_GetMinimumPaneSize 3474
+#define wxSplitterWindow_GetSashGravity 3475
+#define wxSplitterWindow_GetSashPosition 3476
+#define wxSplitterWindow_GetSplitMode 3477
+#define wxSplitterWindow_GetWindow1 3478
+#define wxSplitterWindow_GetWindow2 3479
+#define wxSplitterWindow_Initialize 3480
+#define wxSplitterWindow_IsSplit 3481
+#define wxSplitterWindow_ReplaceWindow 3482
+#define wxSplitterWindow_SetSashGravity 3483
+#define wxSplitterWindow_SetSashPosition 3484
+#define wxSplitterWindow_SetSashSize 3485
+#define wxSplitterWindow_SetMinimumPaneSize 3486
+#define wxSplitterWindow_SetSplitMode 3487
+#define wxSplitterWindow_SplitHorizontally 3488
+#define wxSplitterWindow_SplitVertically 3489
+#define wxSplitterWindow_Unsplit 3490
+#define wxSplitterWindow_UpdateSize 3491
+#define wxSplitterEvent_GetSashPosition 3492
+#define wxSplitterEvent_GetX 3493
+#define wxSplitterEvent_GetY 3494
+#define wxSplitterEvent_GetWindowBeingRemoved 3495
+#define wxSplitterEvent_SetSashPosition 3496
+#define wxHtmlWindow_new_0 3497
+#define wxHtmlWindow_new_2 3498
+#define wxHtmlWindow_AppendToPage 3499
+#define wxHtmlWindow_GetOpenedAnchor 3500
+#define wxHtmlWindow_GetOpenedPage 3501
+#define wxHtmlWindow_GetOpenedPageTitle 3502
+#define wxHtmlWindow_GetRelatedFrame 3503
+#define wxHtmlWindow_HistoryBack 3504
+#define wxHtmlWindow_HistoryCanBack 3505
+#define wxHtmlWindow_HistoryCanForward 3506
+#define wxHtmlWindow_HistoryClear 3507
+#define wxHtmlWindow_HistoryForward 3508
+#define wxHtmlWindow_LoadFile 3509
+#define wxHtmlWindow_LoadPage 3510
+#define wxHtmlWindow_SelectAll 3511
+#define wxHtmlWindow_SelectionToText 3512
+#define wxHtmlWindow_SelectLine 3513
+#define wxHtmlWindow_SelectWord 3514
+#define wxHtmlWindow_SetBorders 3515
+#define wxHtmlWindow_SetFonts 3516
+#define wxHtmlWindow_SetPage 3517
+#define wxHtmlWindow_SetRelatedFrame 3518
+#define wxHtmlWindow_SetRelatedStatusBar 3519
+#define wxHtmlWindow_ToText 3520
+#define wxHtmlWindow_destroy 3521
+#define wxHtmlLinkEvent_GetLinkInfo 3522
+#define wxSystemSettings_GetColour 3523
+#define wxSystemSettings_GetFont 3524
+#define wxSystemSettings_GetMetric 3525
+#define wxSystemSettings_GetScreenType 3526
+#define wxSystemOptions_GetOption 3527
+#define wxSystemOptions_GetOptionInt 3528
+#define wxSystemOptions_HasOption 3529
+#define wxSystemOptions_IsFalse 3530
+#define wxSystemOptions_SetOption_2_1 3531
+#define wxSystemOptions_SetOption_2_0 3532
+#define wxAuiNotebookEvent_SetSelection 3533
+#define wxAuiNotebookEvent_GetSelection 3534
+#define wxAuiNotebookEvent_SetOldSelection 3535
+#define wxAuiNotebookEvent_GetOldSelection 3536
+#define wxAuiNotebookEvent_SetDragSource 3537
+#define wxAuiNotebookEvent_GetDragSource 3538
+#define wxAuiManagerEvent_SetManager 3539
+#define wxAuiManagerEvent_GetManager 3540
+#define wxAuiManagerEvent_SetPane 3541
+#define wxAuiManagerEvent_GetPane 3542
+#define wxAuiManagerEvent_SetButton 3543
+#define wxAuiManagerEvent_GetButton 3544
+#define wxAuiManagerEvent_SetDC 3545
+#define wxAuiManagerEvent_GetDC 3546
+#define wxAuiManagerEvent_Veto 3547
+#define wxAuiManagerEvent_GetVeto 3548
+#define wxAuiManagerEvent_SetCanVeto 3549
+#define wxAuiManagerEvent_CanVeto 3550
+#define wxLogNull_new 3551
+#define wxLogNull_destroy 3552
+#define wxTaskBarIcon_new 3553
+#define wxTaskBarIcon_destruct 3554
+#define wxTaskBarIcon_PopupMenu 3555
+#define wxTaskBarIcon_RemoveIcon 3556
+#define wxTaskBarIcon_SetIcon 3557
+#define wxLocale_new_0 3558
+#define wxLocale_new_2 3560
+#define wxLocale_destruct 3561
+#define wxLocale_Init 3563
+#define wxLocale_AddCatalog_1 3564
+#define wxLocale_AddCatalog_3 3565
+#define wxLocale_AddCatalogLookupPathPrefix 3566
+#define wxLocale_GetCanonicalName 3567
+#define wxLocale_GetLanguage 3568
+#define wxLocale_GetLanguageName 3569
+#define wxLocale_GetLocale 3570
+#define wxLocale_GetName 3571
+#define wxLocale_GetString_2 3572
+#define wxLocale_GetString_4 3573
+#define wxLocale_GetHeaderValue 3574
+#define wxLocale_GetSysName 3575
+#define wxLocale_GetSystemEncoding 3576
+#define wxLocale_GetSystemEncodingName 3577
+#define wxLocale_GetSystemLanguage 3578
+#define wxLocale_IsLoaded 3579
+#define wxLocale_IsOk 3580
+#define wxActivateEvent_GetActive 3581
+#define wxPopupWindow_new_2 3583
+#define wxPopupWindow_new_0 3584
+#define wxPopupWindow_destruct 3586
+#define wxPopupWindow_Create 3587
+#define wxPopupWindow_Position 3588
+#define wxPopupTransientWindow_new_0 3589
+#define wxPopupTransientWindow_new_2 3590
+#define wxPopupTransientWindow_destruct 3591
+#define wxPopupTransientWindow_Popup 3592
+#define wxPopupTransientWindow_Dismiss 3593
+#define wxOverlay_new 3594
+#define wxOverlay_destruct 3595
+#define wxOverlay_Reset 3596
+#define wxDCOverlay_new_6 3597
+#define wxDCOverlay_new_2 3598
+#define wxDCOverlay_destruct 3599
+#define wxDCOverlay_Clear 3600
+#define wxDropFilesEvent_GetPosition 3601
+#define wxDropFilesEvent_GetNumberOfFiles 3602
+#define wxDropFilesEvent_GetFiles 3603
+#define wxDisplay_new 3604
+#define wxDisplay_destruct 3605
+#define wxDisplay_IsOk 3606
+#define wxDisplay_GetClientArea 3607
+#define wxDisplay_GetGeometry 3608
+#define wxDisplay_GetName 3609
+#define wxDisplay_IsPrimary 3610
+#define wxDisplay_GetCount 3611
+#define wxDisplay_GetFromPoint 3612
+#define wxDisplay_GetFromWindow 3613
+#define wxDisplay_GetPPI 3614
+#define wxGCDC_new_1 3615
+#define wxGCDC_new_0 3616
+#define wxGCDC_destruct 3617
+#define wxGCDC_GetGraphicsContext 3618
+#define wxGCDC_SetGraphicsContext 3619
diff --git a/lib/wx/src/gen/wxAuiNotebook.erl b/lib/wx/src/gen/wxAuiNotebook.erl
index adb90c224f..6dc0449d09 100644
--- a/lib/wx/src/gen/wxAuiNotebook.erl
+++ b/lib/wx/src/gen/wxAuiNotebook.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -54,26 +54,27 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
- setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
- setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
- setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
- setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,
- setThemeEnabled/2,setToolTip/2,setTransparent/2,setVirtualSize/2,
- setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4,
- setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,shouldInheritColours/1,
- show/1,show/2,thaw/1,transferDataFromWindow/1,transferDataToWindow/1,
- update/1,updateWindowUI/1,updateWindowUI/2,validate/1,warpPointer/3]).
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setForegroundColour/2,
+ setHelpText/2,setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,
+ setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,setPalette/2,
+ setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setSize/2,
+ setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4,
+ setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setThemeEnabled/2,
+ setToolTip/2,setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2,
+ setVirtualSizeHints/3,setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2,
+ setWindowVariant/2,shouldInheritColours/1,show/1,show/2,thaw/1,transferDataFromWindow/1,
+ transferDataToWindow/1,update/1,updateWindowUI/1,updateWindowUI/2,
+ validate/1,warpPointer/3]).
-export_type([wxAuiNotebook/0]).
%% @hidden
@@ -546,6 +547,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxBitmapButton.erl b/lib/wx/src/gen/wxBitmapButton.erl
index d0a810bdb9..28362711d2 100644
--- a/lib/wx/src/gen/wxBitmapButton.erl
+++ b/lib/wx/src/gen/wxBitmapButton.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -53,27 +53,27 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDefault/1,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,
- setFocus/1,setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,
- setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
- setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setScrollPos/3,
- setScrollPos/4,setScrollbar/5,setScrollbar/6,setSize/2,setSize/3,setSize/5,
- setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4,setSizer/2,
- setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setThemeEnabled/2,setToolTip/2,
- setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2,
- setVirtualSizeHints/3,setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2,
- setWindowVariant/2,shouldInheritColours/1,show/1,show/2,thaw/1,transferDataFromWindow/1,
- transferDataToWindow/1,update/1,updateWindowUI/1,updateWindowUI/2,
- validate/1,warpPointer/3]).
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDefault/1,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
+ setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
+ setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
+ setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,
+ setThemeEnabled/2,setToolTip/2,setTransparent/2,setVirtualSize/2,
+ setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4,
+ setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,shouldInheritColours/1,
+ show/1,show/2,thaw/1,transferDataFromWindow/1,transferDataToWindow/1,
+ update/1,updateWindowUI/1,updateWindowUI/2,validate/1,warpPointer/3]).
-export_type([wxBitmapButton/0]).
%% @hidden
@@ -429,6 +429,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxButton.erl b/lib/wx/src/gen/wxButton.erl
index f8e24beffa..a3f0143d72 100644
--- a/lib/wx/src/gen/wxButton.erl
+++ b/lib/wx/src/gen/wxButton.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -51,18 +51,19 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setMaxSize/2,
- setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setMaxSize/2,setMinSize/2,
+ setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,
@@ -378,6 +379,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxCalendarCtrl.erl b/lib/wx/src/gen/wxCalendarCtrl.erl
index bf033e9bc0..244aa8f7b9 100644
--- a/lib/wx/src/gen/wxCalendarCtrl.erl
+++ b/lib/wx/src/gen/wxCalendarCtrl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -55,17 +55,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -562,6 +563,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxCheckBox.erl b/lib/wx/src/gen/wxCheckBox.erl
index 5ed49d91b6..cc68ff96f3 100644
--- a/lib/wx/src/gen/wxCheckBox.erl
+++ b/lib/wx/src/gen/wxCheckBox.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -52,17 +52,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -415,6 +416,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxCheckListBox.erl b/lib/wx/src/gen/wxCheckListBox.erl
index ddef6a29e2..25e0844116 100644
--- a/lib/wx/src/gen/wxCheckListBox.erl
+++ b/lib/wx/src/gen/wxCheckListBox.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -56,8 +56,8 @@
hasTransparentBackground/1,hide/1,hitTest/2,inheritAttributes/1,initDialog/1,
insert/3,insert/4,insertItems/3,invalidateBestSize/1,isDoubleBuffered/1,
isEmpty/1,isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,
- isSelected/2,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,
- makeModal/1,makeModal/2,move/2,move/3,move/4,moveAfterInTabOrder/2,
+ isSelected/2,isShown/1,isShownOnScreen/1,isTopLevel/1,layout/1,lineDown/1,
+ lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,move/3,move/4,moveAfterInTabOrder/2,
moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,
popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,
raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,
@@ -421,6 +421,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxChoice.erl b/lib/wx/src/gen/wxChoice.erl
index 266a257442..7ae93cfdc5 100644
--- a/lib/wx/src/gen/wxChoice.erl
+++ b/lib/wx/src/gen/wxChoice.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -55,8 +55,8 @@
getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,
hide/1,inheritAttributes/1,initDialog/1,insert/3,insert/4,invalidateBestSize/1,
isDoubleBuffered/1,isEmpty/1,isEnabled/1,isExposed/2,isExposed/3,isExposed/5,
- isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,
- makeModal/1,makeModal/2,move/2,move/3,move/4,moveAfterInTabOrder/2,
+ isRetained/1,isShown/1,isShownOnScreen/1,isTopLevel/1,layout/1,lineDown/1,
+ lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,move/3,move/4,moveAfterInTabOrder/2,
moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,
popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,
raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,
@@ -436,6 +436,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxChoicebook.erl b/lib/wx/src/gen/wxChoicebook.erl
index c6e0941978..64cbe4c7a2 100644
--- a/lib/wx/src/gen/wxChoicebook.erl
+++ b/lib/wx/src/gen/wxChoicebook.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -55,17 +55,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -582,6 +583,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxColourDialog.erl b/lib/wx/src/gen/wxColourDialog.erl
index 936c0e5099..66f93f27dd 100644
--- a/lib/wx/src/gen/wxColourDialog.erl
+++ b/lib/wx/src/gen/wxColourDialog.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -55,19 +55,19 @@
hasTransparentBackground/1,hide/1,iconize/1,iconize/2,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isActive/1,isDoubleBuffered/1,isEnabled/1,
isExposed/2,isExposed/3,isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,
- isModal/1,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,
- lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3,
- move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2,
- pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1,
- requestUserAttention/2,screenToClient/1,screenToClient/2,scrollLines/2,
- scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,
- setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,
- setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
+ isModal/1,isRetained/1,isShown/1,isShownOnScreen/1,isTopLevel/1,layout/1,
+ lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,requestUserAttention/1,requestUserAttention/2,screenToClient/1,
+ screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
+ setAcceleratorTable/2,setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,
+ setBackgroundStyle/2,setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,
+ setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,
+ setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,
+ setIcons/2,setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setReturnCode/2,
setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -419,6 +419,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxColourPickerCtrl.erl b/lib/wx/src/gen/wxColourPickerCtrl.erl
index c97b194bc8..1126818063 100644
--- a/lib/wx/src/gen/wxColourPickerCtrl.erl
+++ b/lib/wx/src/gen/wxColourPickerCtrl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -53,10 +53,10 @@
hasCapture/1,hasScrollbar/2,hasTextCtrl/1,hasTransparentBackground/1,
hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,
isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isPickerCtrlGrowable/1,
- isRetained/1,isShown/1,isTextCtrlGrowable/1,isTopLevel/1,layout/1,
- lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,move/3,move/4,
- moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2,
- pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
+ isRetained/1,isShown/1,isShownOnScreen/1,isTextCtrlGrowable/1,isTopLevel/1,
+ layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
+ move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
+ navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
@@ -420,6 +420,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxComboBox.erl b/lib/wx/src/gen/wxComboBox.erl
index 9f8cf77445..9bb0e5544e 100644
--- a/lib/wx/src/gen/wxComboBox.erl
+++ b/lib/wx/src/gen/wxComboBox.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -57,8 +57,8 @@
getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,
hide/1,inheritAttributes/1,initDialog/1,insert/3,insert/4,invalidateBestSize/1,
isDoubleBuffered/1,isEmpty/1,isEnabled/1,isExposed/2,isExposed/3,isExposed/5,
- isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,
- makeModal/1,makeModal/2,move/2,move/3,move/4,moveAfterInTabOrder/2,
+ isRetained/1,isShown/1,isShownOnScreen/1,isTopLevel/1,layout/1,lineDown/1,
+ lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,move/3,move/4,moveAfterInTabOrder/2,
moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,
popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,
raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,
@@ -570,6 +570,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxControl.erl b/lib/wx/src/gen/wxControl.erl
index 6be7574d80..03f6e88e57 100644
--- a/lib/wx/src/gen/wxControl.erl
+++ b/lib/wx/src/gen/wxControl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -49,18 +49,19 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setMaxSize/2,
- setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setMaxSize/2,setMinSize/2,
+ setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,
@@ -295,6 +296,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxControlWithItems.erl b/lib/wx/src/gen/wxControlWithItems.erl
index 47ffa7dcba..308695bf75 100644
--- a/lib/wx/src/gen/wxControlWithItems.erl
+++ b/lib/wx/src/gen/wxControlWithItems.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -53,17 +53,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -477,6 +478,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxDatePickerCtrl.erl b/lib/wx/src/gen/wxDatePickerCtrl.erl
index 743169c58e..7b534a1a07 100644
--- a/lib/wx/src/gen/wxDatePickerCtrl.erl
+++ b/lib/wx/src/gen/wxDatePickerCtrl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -53,10 +53,10 @@
hasCapture/1,hasScrollbar/2,hasTextCtrl/1,hasTransparentBackground/1,
hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,
isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isPickerCtrlGrowable/1,
- isRetained/1,isShown/1,isTextCtrlGrowable/1,isTopLevel/1,layout/1,
- lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,move/3,move/4,
- moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2,
- pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
+ isRetained/1,isShown/1,isShownOnScreen/1,isTextCtrlGrowable/1,isTopLevel/1,
+ layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
+ move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
+ navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
@@ -396,6 +396,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxDialog.erl b/lib/wx/src/gen/wxDialog.erl
index 72f37df178..0d3d682829 100644
--- a/lib/wx/src/gen/wxDialog.erl
+++ b/lib/wx/src/gen/wxDialog.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -55,18 +55,19 @@
hide/1,iconize/1,iconize/2,inheritAttributes/1,initDialog/1,invalidateBestSize/1,
isActive/1,isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3,
isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1,
- isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,
- makeModal/2,maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2,
- moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,
- popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,
- raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,
- removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2,
- screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,
- scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,
- setBackgroundStyle/2,setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,
- setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,
- setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,
- setIcons/2,setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
+ isShown/1,isShownOnScreen/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,
+ lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3,
+ move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2,
+ pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
+ popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
+ refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1,
+ requestUserAttention/2,screenToClient/1,screenToClient/2,scrollLines/2,
+ scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,
+ setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,
+ setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
+ setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
+ setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,
+ setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setScrollPos/3,
setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,setSize/2,
setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4,
@@ -494,6 +495,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxDirDialog.erl b/lib/wx/src/gen/wxDirDialog.erl
index 5a2df9821a..f40448d422 100644
--- a/lib/wx/src/gen/wxDirDialog.erl
+++ b/lib/wx/src/gen/wxDirDialog.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -55,19 +55,19 @@
hasTransparentBackground/1,hide/1,iconize/1,iconize/2,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isActive/1,isDoubleBuffered/1,isEnabled/1,
isExposed/2,isExposed/3,isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,
- isModal/1,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,
- lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3,
- move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2,
- pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1,
- requestUserAttention/2,screenToClient/1,screenToClient/2,scrollLines/2,
- scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,
- setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,
- setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
+ isModal/1,isRetained/1,isShown/1,isShownOnScreen/1,isTopLevel/1,layout/1,
+ lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,requestUserAttention/1,requestUserAttention/2,screenToClient/1,
+ screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
+ setAcceleratorTable/2,setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,
+ setBackgroundStyle/2,setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,
+ setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,
+ setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,
+ setIcons/2,setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setReturnCode/2,
setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -427,6 +427,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxDirPickerCtrl.erl b/lib/wx/src/gen/wxDirPickerCtrl.erl
index 9bfff7d458..47adb46574 100644
--- a/lib/wx/src/gen/wxDirPickerCtrl.erl
+++ b/lib/wx/src/gen/wxDirPickerCtrl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -53,10 +53,10 @@
hasCapture/1,hasScrollbar/2,hasTextCtrl/1,hasTransparentBackground/1,
hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,
isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isPickerCtrlGrowable/1,
- isRetained/1,isShown/1,isTextCtrlGrowable/1,isTopLevel/1,layout/1,
- lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,move/3,move/4,
- moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2,
- pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
+ isRetained/1,isShown/1,isShownOnScreen/1,isTextCtrlGrowable/1,isTopLevel/1,
+ layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
+ move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
+ navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
@@ -413,6 +413,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxFileDialog.erl b/lib/wx/src/gen/wxFileDialog.erl
index 6032e38a16..15f188c8e8 100644
--- a/lib/wx/src/gen/wxFileDialog.erl
+++ b/lib/wx/src/gen/wxFileDialog.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -57,19 +57,19 @@
hasTransparentBackground/1,hide/1,iconize/1,iconize/2,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isActive/1,isDoubleBuffered/1,isEnabled/1,
isExposed/2,isExposed/3,isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,
- isModal/1,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,
- lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3,
- move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2,
- pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1,
- requestUserAttention/2,screenToClient/1,screenToClient/2,scrollLines/2,
- scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,
- setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,
- setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
+ isModal/1,isRetained/1,isShown/1,isShownOnScreen/1,isTopLevel/1,layout/1,
+ lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,requestUserAttention/1,requestUserAttention/2,screenToClient/1,
+ screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
+ setAcceleratorTable/2,setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,
+ setBackgroundStyle/2,setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,
+ setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,
+ setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,
+ setIcons/2,setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setReturnCode/2,
setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -520,6 +520,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxFilePickerCtrl.erl b/lib/wx/src/gen/wxFilePickerCtrl.erl
index 3b1943cbee..fec1b48fd6 100644
--- a/lib/wx/src/gen/wxFilePickerCtrl.erl
+++ b/lib/wx/src/gen/wxFilePickerCtrl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -53,10 +53,10 @@
hasCapture/1,hasScrollbar/2,hasTextCtrl/1,hasTransparentBackground/1,
hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,
isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isPickerCtrlGrowable/1,
- isRetained/1,isShown/1,isTextCtrlGrowable/1,isTopLevel/1,layout/1,
- lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,move/3,move/4,
- moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2,
- pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
+ isRetained/1,isShown/1,isShownOnScreen/1,isTextCtrlGrowable/1,isTopLevel/1,
+ layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
+ move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
+ navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
@@ -417,6 +417,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxFindReplaceDialog.erl b/lib/wx/src/gen/wxFindReplaceDialog.erl
index 9250c2fa2f..8c65c40830 100644
--- a/lib/wx/src/gen/wxFindReplaceDialog.erl
+++ b/lib/wx/src/gen/wxFindReplaceDialog.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -55,19 +55,19 @@
hasTransparentBackground/1,hide/1,iconize/1,iconize/2,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isActive/1,isDoubleBuffered/1,isEnabled/1,
isExposed/2,isExposed/3,isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,
- isModal/1,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,
- lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3,
- move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2,
- pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1,
- requestUserAttention/2,screenToClient/1,screenToClient/2,scrollLines/2,
- scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,
- setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,
- setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
+ isModal/1,isRetained/1,isShown/1,isShownOnScreen/1,isTopLevel/1,layout/1,
+ lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,requestUserAttention/1,requestUserAttention/2,screenToClient/1,
+ screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
+ setAcceleratorTable/2,setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,
+ setBackgroundStyle/2,setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,
+ setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,
+ setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,
+ setIcons/2,setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setReturnCode/2,
setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -423,6 +423,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxFontDialog.erl b/lib/wx/src/gen/wxFontDialog.erl
index 26010aa46b..cc33536ed7 100644
--- a/lib/wx/src/gen/wxFontDialog.erl
+++ b/lib/wx/src/gen/wxFontDialog.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -55,19 +55,19 @@
hasTransparentBackground/1,hide/1,iconize/1,iconize/2,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isActive/1,isDoubleBuffered/1,isEnabled/1,
isExposed/2,isExposed/3,isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,
- isModal/1,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,
- lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3,
- move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2,
- pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1,
- requestUserAttention/2,screenToClient/1,screenToClient/2,scrollLines/2,
- scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,
- setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,
- setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
+ isModal/1,isRetained/1,isShown/1,isShownOnScreen/1,isTopLevel/1,layout/1,
+ lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,requestUserAttention/1,requestUserAttention/2,screenToClient/1,
+ screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
+ setAcceleratorTable/2,setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,
+ setBackgroundStyle/2,setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,
+ setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,
+ setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,
+ setIcons/2,setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setReturnCode/2,
setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -395,6 +395,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxFontPickerCtrl.erl b/lib/wx/src/gen/wxFontPickerCtrl.erl
index d1234c5589..c3ac30c5ac 100644
--- a/lib/wx/src/gen/wxFontPickerCtrl.erl
+++ b/lib/wx/src/gen/wxFontPickerCtrl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -54,10 +54,10 @@
hasCapture/1,hasScrollbar/2,hasTextCtrl/1,hasTransparentBackground/1,
hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,
isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isPickerCtrlGrowable/1,
- isRetained/1,isShown/1,isTextCtrlGrowable/1,isTopLevel/1,layout/1,
- lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,move/3,move/4,
- moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2,
- pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
+ isRetained/1,isShown/1,isShownOnScreen/1,isTextCtrlGrowable/1,isTopLevel/1,
+ layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
+ move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
+ navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
@@ -426,6 +426,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxFrame.erl b/lib/wx/src/gen/wxFrame.erl
index 1dc6106bfa..b39705b34d 100644
--- a/lib/wx/src/gen/wxFrame.erl
+++ b/lib/wx/src/gen/wxFrame.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -57,18 +57,19 @@
hide/1,iconize/1,iconize/2,inheritAttributes/1,initDialog/1,invalidateBestSize/1,
isActive/1,isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3,
isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1,
- isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,
- makeModal/2,maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2,
- moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,
- popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,
- raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,
- removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2,
- screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,
- scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,
- setBackgroundStyle/2,setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,
- setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,
- setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,
- setIcons/2,setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
+ isShown/1,isShownOnScreen/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,
+ lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3,
+ move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2,
+ pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
+ popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
+ refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1,
+ requestUserAttention/2,screenToClient/1,screenToClient/2,scrollLines/2,
+ scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,
+ setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,
+ setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
+ setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
+ setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,
+ setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setScrollPos/3,
setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,setSize/2,
setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4,
@@ -575,6 +576,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxGLCanvas.erl b/lib/wx/src/gen/wxGLCanvas.erl
index 8a94d1df26..cfc5a71387 100644
--- a/lib/wx/src/gen/wxGLCanvas.erl
+++ b/lib/wx/src/gen/wxGLCanvas.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -49,17 +49,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -394,6 +395,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxGauge.erl b/lib/wx/src/gen/wxGauge.erl
index 40f7f120b0..67c228a889 100644
--- a/lib/wx/src/gen/wxGauge.erl
+++ b/lib/wx/src/gen/wxGauge.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -51,17 +51,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -402,6 +403,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxGenericDirCtrl.erl b/lib/wx/src/gen/wxGenericDirCtrl.erl
index 383d592269..637e723a22 100644
--- a/lib/wx/src/gen/wxGenericDirCtrl.erl
+++ b/lib/wx/src/gen/wxGenericDirCtrl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -53,17 +53,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -495,6 +496,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxGrid.erl b/lib/wx/src/gen/wxGrid.erl
index b8c94ab555..b768dc8078 100644
--- a/lib/wx/src/gen/wxGrid.erl
+++ b/lib/wx/src/gen/wxGrid.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -104,24 +104,25 @@
getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1,
hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,prepareDC/2,raise/1,refresh/1,refresh/2,
- refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,
- screenToClient/1,screenToClient/2,scroll/3,scrollLines/2,scrollPages/2,
- scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
- setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
- setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
- setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFocusIgnoringChildren/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
- setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
- setPalette/2,setScrollPos/3,setScrollPos/4,setScrollRate/3,setScrollbar/5,
- setScrollbar/6,setScrollbars/5,setScrollbars/6,setSize/2,setSize/3,
- setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4,setSizer/2,
- setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setTargetWindow/2,setThemeEnabled/2,
- setToolTip/2,setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,prepareDC/2,
+ raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,
+ removeChild/2,reparent/2,screenToClient/1,screenToClient/2,scroll/3,
+ scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,
+ setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,
+ setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
+ setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
+ setFocusIgnoringChildren/1,setFont/2,setForegroundColour/2,setHelpText/2,
+ setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
+ setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setScrollPos/3,
+ setScrollPos/4,setScrollRate/3,setScrollbar/5,setScrollbar/6,setScrollbars/5,
+ setScrollbars/6,setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,
+ setSizeHints/3,setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,
+ setSizerAndFit/3,setTargetWindow/2,setThemeEnabled/2,setToolTip/2,
+ setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2,
setVirtualSizeHints/3,setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2,
setWindowVariant/2,shouldInheritColours/1,show/1,show/2,thaw/1,transferDataFromWindow/1,
transferDataToWindow/1,update/1,updateWindowUI/1,updateWindowUI/2,
@@ -2358,6 +2359,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxHtmlWindow.erl b/lib/wx/src/gen/wxHtmlWindow.erl
index 7e3906b9a9..9253fd6535 100644
--- a/lib/wx/src/gen/wxHtmlWindow.erl
+++ b/lib/wx/src/gen/wxHtmlWindow.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -58,24 +58,25 @@
getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1,
hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,prepareDC/2,raise/1,refresh/1,refresh/2,
- refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,
- screenToClient/1,screenToClient/2,scroll/3,scrollLines/2,scrollPages/2,
- scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
- setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
- setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
- setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFocusIgnoringChildren/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
- setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
- setPalette/2,setScrollPos/3,setScrollPos/4,setScrollRate/3,setScrollbar/5,
- setScrollbar/6,setScrollbars/5,setScrollbars/6,setSize/2,setSize/3,
- setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4,setSizer/2,
- setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setTargetWindow/2,setThemeEnabled/2,
- setToolTip/2,setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,prepareDC/2,
+ raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,
+ removeChild/2,reparent/2,screenToClient/1,screenToClient/2,scroll/3,
+ scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,
+ setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,
+ setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
+ setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
+ setFocusIgnoringChildren/1,setFont/2,setForegroundColour/2,setHelpText/2,
+ setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
+ setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setScrollPos/3,
+ setScrollPos/4,setScrollRate/3,setScrollbar/5,setScrollbar/6,setScrollbars/5,
+ setScrollbars/6,setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,
+ setSizeHints/3,setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,
+ setSizerAndFit/3,setTargetWindow/2,setThemeEnabled/2,setToolTip/2,
+ setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2,
setVirtualSizeHints/3,setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2,
setWindowVariant/2,shouldInheritColours/1,show/1,show/2,thaw/1,transferDataFromWindow/1,
transferDataToWindow/1,update/1,updateWindowUI/1,updateWindowUI/2,
@@ -571,6 +572,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxListBox.erl b/lib/wx/src/gen/wxListBox.erl
index 86d8d41f36..8483510ec8 100644
--- a/lib/wx/src/gen/wxListBox.erl
+++ b/lib/wx/src/gen/wxListBox.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -55,8 +55,8 @@
getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,
hide/1,inheritAttributes/1,initDialog/1,insert/3,insert/4,invalidateBestSize/1,
isDoubleBuffered/1,isEmpty/1,isEnabled/1,isExposed/2,isExposed/3,isExposed/5,
- isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,
- makeModal/1,makeModal/2,move/2,move/3,move/4,moveAfterInTabOrder/2,
+ isRetained/1,isShown/1,isShownOnScreen/1,isTopLevel/1,layout/1,lineDown/1,
+ lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,move/3,move/4,moveAfterInTabOrder/2,
moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,
popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,
raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,
@@ -479,6 +479,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxListCtrl.erl b/lib/wx/src/gen/wxListCtrl.erl
index 10dc76f276..75646f0938 100644
--- a/lib/wx/src/gen/wxListCtrl.erl
+++ b/lib/wx/src/gen/wxListCtrl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -64,26 +64,27 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundStyle/2,setCaret/2,
- setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
- setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
- setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
- setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
- setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,
- setThemeEnabled/2,setToolTip/2,setTransparent/2,setVirtualSize/2,
- setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4,
- setWindowStyle/2,setWindowVariant/2,shouldInheritColours/1,show/1,
- show/2,thaw/1,transferDataFromWindow/1,transferDataToWindow/1,update/1,
- updateWindowUI/1,updateWindowUI/2,validate/1,warpPointer/3]).
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundStyle/2,setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,
+ setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,
+ setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setId/2,
+ setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
+ setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setScrollPos/3,
+ setScrollPos/4,setScrollbar/5,setScrollbar/6,setSize/2,setSize/3,setSize/5,
+ setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4,setSizer/2,
+ setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setThemeEnabled/2,setToolTip/2,
+ setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2,
+ setVirtualSizeHints/3,setVirtualSizeHints/4,setWindowStyle/2,setWindowVariant/2,
+ shouldInheritColours/1,show/1,show/2,thaw/1,transferDataFromWindow/1,
+ transferDataToWindow/1,update/1,updateWindowUI/1,updateWindowUI/2,
+ validate/1,warpPointer/3]).
-export_type([wxListCtrl/0]).
%% @hidden
@@ -1069,6 +1070,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxListView.erl b/lib/wx/src/gen/wxListView.erl
index adba629d5a..8af9b751c2 100644
--- a/lib/wx/src/gen/wxListView.erl
+++ b/lib/wx/src/gen/wxListView.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -51,17 +51,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -367,6 +368,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxListbook.erl b/lib/wx/src/gen/wxListbook.erl
index e2ea559587..be2bc62a43 100644
--- a/lib/wx/src/gen/wxListbook.erl
+++ b/lib/wx/src/gen/wxListbook.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -55,17 +55,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -582,6 +583,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxMDIChildFrame.erl b/lib/wx/src/gen/wxMDIChildFrame.erl
index 0d388c016a..1fa52d6fe3 100644
--- a/lib/wx/src/gen/wxMDIChildFrame.erl
+++ b/lib/wx/src/gen/wxMDIChildFrame.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -57,30 +57,31 @@
hasScrollbar/2,hasTransparentBackground/1,hide/1,iconize/1,iconize/2,
inheritAttributes/1,initDialog/1,invalidateBestSize/1,isActive/1,
isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3,isExposed/5,
- isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,processCommand/2,raise/1,refresh/1,
- refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
- reparent/2,requestUserAttention/1,requestUserAttention/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- sendSizeEvent/1,setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,
- setBackgroundStyle/2,setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,
- setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,
- setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,
- setIcons/2,setId/2,setLabel/2,setMaxSize/2,setMenuBar/2,setMinSize/2,
- setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
- setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
- setShape/2,setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
- setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,
- setStatusBar/2,setStatusBarPane/2,setStatusText/2,setStatusText/3,
- setStatusWidths/2,setThemeEnabled/2,setTitle/2,setToolBar/2,setToolTip/2,
- setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2,
- setVirtualSizeHints/3,setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2,
- setWindowVariant/2,shouldInheritColours/1,show/1,show/2,showFullScreen/2,
- showFullScreen/3,thaw/1,transferDataFromWindow/1,transferDataToWindow/1,
- update/1,updateWindowUI/1,updateWindowUI/2,validate/1,warpPointer/3]).
+ isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,processCommand/2,
+ raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,
+ removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2,
+ screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,
+ scrollWindow/4,sendSizeEvent/1,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,setId/2,setLabel/2,
+ setMaxSize/2,setMenuBar/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
+ setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setScrollPos/3,
+ setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,setSize/2,
+ setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4,
+ setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setStatusBar/2,
+ setStatusBarPane/2,setStatusText/2,setStatusText/3,setStatusWidths/2,
+ setThemeEnabled/2,setTitle/2,setToolBar/2,setToolTip/2,setTransparent/2,
+ setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,
+ setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,
+ shouldInheritColours/1,show/1,show/2,showFullScreen/2,showFullScreen/3,
+ thaw/1,transferDataFromWindow/1,transferDataToWindow/1,update/1,updateWindowUI/1,
+ updateWindowUI/2,validate/1,warpPointer/3]).
-export_type([wxMDIChildFrame/0]).
%% @hidden
@@ -475,6 +476,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxMDIClientWindow.erl b/lib/wx/src/gen/wxMDIClientWindow.erl
index 4fc080c64d..04f871d9ea 100644
--- a/lib/wx/src/gen/wxMDIClientWindow.erl
+++ b/lib/wx/src/gen/wxMDIClientWindow.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -49,17 +49,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -336,6 +337,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxMDIParentFrame.erl b/lib/wx/src/gen/wxMDIParentFrame.erl
index 59f24a1b40..9160a2a4be 100644
--- a/lib/wx/src/gen/wxMDIParentFrame.erl
+++ b/lib/wx/src/gen/wxMDIParentFrame.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -58,9 +58,9 @@
hasScrollbar/2,hasTransparentBackground/1,hide/1,iconize/1,iconize/2,
inheritAttributes/1,initDialog/1,invalidateBestSize/1,isActive/1,
isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3,isExposed/5,
- isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,maximize/1,
- maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,processCommand/2,
raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,
@@ -514,6 +514,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxMenuBar.erl b/lib/wx/src/gen/wxMenuBar.erl
index fa613c9f3b..5c3fa3892d 100644
--- a/lib/wx/src/gen/wxMenuBar.erl
+++ b/lib/wx/src/gen/wxMenuBar.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -30,10 +30,10 @@
-module(wxMenuBar).
-include("wxe.hrl").
-export([append/3,check/3,destroy/1,enable/1,enable/2,enable/3,enableTop/3,findItem/2,
- findMenu/2,findMenuItem/3,getHelpString/2,getLabel/1,getLabel/2,getLabelTop/2,
- getMenu/2,getMenuCount/1,insert/4,isChecked/2,isEnabled/1,isEnabled/2,
- new/0,new/1,remove/2,replace/4,setHelpString/3,setLabel/2,setLabel/3,
- setLabelTop/3]).
+ findMenu/2,findMenuItem/3,getAutoWindowMenu/0,getHelpString/2,getLabel/1,
+ getLabel/2,getLabelTop/2,getMenu/2,getMenuCount/1,insert/4,isChecked/2,
+ isEnabled/1,isEnabled/2,new/0,new/1,oSXGetAppleMenu/1,remove/2,replace/4,
+ setAutoWindowMenu/1,setHelpString/3,setLabel/2,setLabel/3,setLabelTop/3]).
%% inherited exports
-export([cacheBestSize/2,canSetTransparent/1,captureMouse/1,center/1,center/2,
@@ -53,8 +53,8 @@
getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1,hasScrollbar/2,
hasTransparentBackground/1,hide/1,inheritAttributes/1,initDialog/1,
invalidateBestSize/1,isDoubleBuffered/1,isExposed/2,isExposed/3,isExposed/5,
- isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,
- makeModal/1,makeModal/2,move/2,move/3,move/4,moveAfterInTabOrder/2,
+ isRetained/1,isShown/1,isShownOnScreen/1,isTopLevel/1,layout/1,lineDown/1,
+ lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,move/3,move/4,moveAfterInTabOrder/2,
moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,
popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,
raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,
@@ -256,6 +256,28 @@ isChecked(#wx_ref{type=ThisT,ref=ThisRef},Itemid)
wxe_util:call(?wxMenuBar_IsChecked,
<<ThisRef:32/?UI,Itemid:32/?UI>>).
+%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxmenubar.html#wxmenubarsetautowindowmenu">external documentation</a>.
+-spec setAutoWindowMenu(Enable) -> 'ok' when
+ Enable::boolean().
+setAutoWindowMenu(Enable)
+ when is_boolean(Enable) ->
+ wxe_util:cast(?wxMenuBar_SetAutoWindowMenu,
+ <<(wxe_util:from_bool(Enable)):32/?UI>>).
+
+%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxmenubar.html#wxmenubargetautowindowmenu">external documentation</a>.
+-spec getAutoWindowMenu() -> boolean().
+getAutoWindowMenu() ->
+ wxe_util:call(?wxMenuBar_GetAutoWindowMenu,
+ <<>>).
+
+%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxmenubar.html#wxmenubarosxgetapplemenu">external documentation</a>.
+-spec oSXGetAppleMenu(This) -> wxMenu:wxMenu() when
+ This::wxMenuBar().
+oSXGetAppleMenu(#wx_ref{type=ThisT,ref=ThisRef}) ->
+ ?CLASS(ThisT,wxMenuBar),
+ wxe_util:call(?wxMenuBar_OSXGetAppleMenu,
+ <<ThisRef:32/?UI>>).
+
%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxmenubar.html#wxmenubarisenabled">external documentation</a>.
-spec isEnabled(This) -> boolean() when
This::wxMenuBar().
@@ -539,6 +561,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxMessageDialog.erl b/lib/wx/src/gen/wxMessageDialog.erl
index a63f66741b..941e3ba667 100644
--- a/lib/wx/src/gen/wxMessageDialog.erl
+++ b/lib/wx/src/gen/wxMessageDialog.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -55,19 +55,19 @@
hasTransparentBackground/1,hide/1,iconize/1,iconize/2,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isActive/1,isDoubleBuffered/1,isEnabled/1,
isExposed/2,isExposed/3,isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,
- isModal/1,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,
- lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3,
- move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2,
- pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1,
- requestUserAttention/2,screenToClient/1,screenToClient/2,scrollLines/2,
- scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,
- setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,
- setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
+ isModal/1,isRetained/1,isShown/1,isShownOnScreen/1,isTopLevel/1,layout/1,
+ lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,requestUserAttention/1,requestUserAttention/2,screenToClient/1,
+ screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
+ setAcceleratorTable/2,setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,
+ setBackgroundStyle/2,setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,
+ setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,
+ setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,
+ setIcons/2,setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setReturnCode/2,
setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -388,6 +388,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxMiniFrame.erl b/lib/wx/src/gen/wxMiniFrame.erl
index 37dc2f2e04..d9f1fdb4de 100644
--- a/lib/wx/src/gen/wxMiniFrame.erl
+++ b/lib/wx/src/gen/wxMiniFrame.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -56,9 +56,9 @@
hasScrollbar/2,hasTransparentBackground/1,hide/1,iconize/1,iconize/2,
inheritAttributes/1,initDialog/1,invalidateBestSize/1,isActive/1,
isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3,isExposed/5,
- isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,maximize/1,
- maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,processCommand/2,
raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,
@@ -442,6 +442,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxMultiChoiceDialog.erl b/lib/wx/src/gen/wxMultiChoiceDialog.erl
index eef15d561e..837fe688cb 100644
--- a/lib/wx/src/gen/wxMultiChoiceDialog.erl
+++ b/lib/wx/src/gen/wxMultiChoiceDialog.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -55,19 +55,19 @@
hasTransparentBackground/1,hide/1,iconize/1,iconize/2,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isActive/1,isDoubleBuffered/1,isEnabled/1,
isExposed/2,isExposed/3,isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,
- isModal/1,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,
- lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3,
- move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2,
- pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1,
- requestUserAttention/2,screenToClient/1,screenToClient/2,scrollLines/2,
- scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,
- setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,
- setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
+ isModal/1,isRetained/1,isShown/1,isShownOnScreen/1,isTopLevel/1,layout/1,
+ lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,requestUserAttention/1,requestUserAttention/2,screenToClient/1,
+ screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
+ setAcceleratorTable/2,setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,
+ setBackgroundStyle/2,setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,
+ setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,
+ setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,
+ setIcons/2,setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setReturnCode/2,
setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -413,6 +413,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxNotebook.erl b/lib/wx/src/gen/wxNotebook.erl
index d7d1b0f87f..f30d6d4d7f 100644
--- a/lib/wx/src/gen/wxNotebook.erl
+++ b/lib/wx/src/gen/wxNotebook.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -55,17 +55,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -607,6 +608,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxPanel.erl b/lib/wx/src/gen/wxPanel.erl
index fc48d569af..49e93f33ba 100644
--- a/lib/wx/src/gen/wxPanel.erl
+++ b/lib/wx/src/gen/wxPanel.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -49,15 +49,15 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3,
- isExposed/5,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,
- lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,move/3,move/4,moveAfterInTabOrder/2,
- moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,
- popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,
- raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,
- removeChild/2,reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,
- scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,
- setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,
- setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
+ isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,isTopLevel/1,
+ layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
+ move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
+ navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
+ popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
+ refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
+ screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
+ setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
+ setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
@@ -355,6 +355,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxPasswordEntryDialog.erl b/lib/wx/src/gen/wxPasswordEntryDialog.erl
index 4667376783..a0e6e2df36 100644
--- a/lib/wx/src/gen/wxPasswordEntryDialog.erl
+++ b/lib/wx/src/gen/wxPasswordEntryDialog.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -57,28 +57,29 @@
inheritAttributes/1,initDialog/1,invalidateBestSize/1,isActive/1,
isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3,isExposed/5,
isFullScreen/1,isIconized/1,isMaximized/1,isModal/1,isRetained/1,isShown/1,
- isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
- maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
- navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
- popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
- refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
- reparent/2,requestUserAttention/1,requestUserAttention/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,
- setBackgroundStyle/2,setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,
- setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,
- setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,
- setIcons/2,setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
- setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setReturnCode/2,
- setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,
- setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
- setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,
- setThemeEnabled/2,setTitle/2,setToolTip/2,setTransparent/2,setValue/2,
- setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,
- setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,
- shouldInheritColours/1,show/1,show/2,showFullScreen/2,showFullScreen/3,
- showModal/1,thaw/1,transferDataFromWindow/1,transferDataToWindow/1,
- update/1,updateWindowUI/1,updateWindowUI/2,validate/1,warpPointer/3]).
+ isShownOnScreen/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,
+ makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2,
+ moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,
+ popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,
+ raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,
+ removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2,
+ screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,
+ scrollWindow/4,setAcceleratorTable/2,setAffirmativeId/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,setId/2,setLabel/2,
+ setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,
+ setOwnForegroundColour/2,setPalette/2,setReturnCode/2,setScrollPos/3,
+ setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,setSize/2,
+ setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4,
+ setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setThemeEnabled/2,
+ setTitle/2,setToolTip/2,setTransparent/2,setValue/2,setVirtualSize/2,
+ setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4,
+ setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,shouldInheritColours/1,
+ show/1,show/2,showFullScreen/2,showFullScreen/3,showModal/1,thaw/1,
+ transferDataFromWindow/1,transferDataToWindow/1,update/1,updateWindowUI/1,
+ updateWindowUI/2,validate/1,warpPointer/3]).
-export_type([wxPasswordEntryDialog/0]).
%% @hidden
@@ -397,6 +398,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxPickerBase.erl b/lib/wx/src/gen/wxPickerBase.erl
index 0ea3a36d33..e582441384 100644
--- a/lib/wx/src/gen/wxPickerBase.erl
+++ b/lib/wx/src/gen/wxPickerBase.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -53,17 +53,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -412,6 +413,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxPopupTransientWindow.erl b/lib/wx/src/gen/wxPopupTransientWindow.erl
index 6ec2fcae62..91c4755a23 100644
--- a/lib/wx/src/gen/wxPopupTransientWindow.erl
+++ b/lib/wx/src/gen/wxPopupTransientWindow.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -50,27 +50,27 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,position/3,raise/1,refresh/1,refresh/2,
- refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,
- screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,
- scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,
- setBackgroundStyle/2,setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,
- setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,
- setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setId/2,
- setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
- setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setScrollPos/3,
- setScrollPos/4,setScrollbar/5,setScrollbar/6,setSize/2,setSize/3,setSize/5,
- setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4,setSizer/2,
- setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setThemeEnabled/2,setToolTip/2,
- setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2,
- setVirtualSizeHints/3,setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2,
- setWindowVariant/2,shouldInheritColours/1,show/1,show/2,thaw/1,transferDataFromWindow/1,
- transferDataToWindow/1,update/1,updateWindowUI/1,updateWindowUI/2,
- validate/1,warpPointer/3]).
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,position/3,raise/1,
+ refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
+ setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
+ setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
+ setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,
+ setThemeEnabled/2,setToolTip/2,setTransparent/2,setVirtualSize/2,
+ setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4,
+ setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,shouldInheritColours/1,
+ show/1,show/2,thaw/1,transferDataFromWindow/1,transferDataToWindow/1,
+ update/1,updateWindowUI/1,updateWindowUI/2,validate/1,warpPointer/3]).
-export_type([wxPopupTransientWindow/0]).
%% @hidden
@@ -347,6 +347,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxPopupWindow.erl b/lib/wx/src/gen/wxPopupWindow.erl
index ddf1033841..e4e4b634b2 100644
--- a/lib/wx/src/gen/wxPopupWindow.erl
+++ b/lib/wx/src/gen/wxPopupWindow.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -49,17 +49,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -343,6 +344,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxPreviewCanvas.erl b/lib/wx/src/gen/wxPreviewCanvas.erl
index 4e869dd6f2..12422444cb 100644
--- a/lib/wx/src/gen/wxPreviewCanvas.erl
+++ b/lib/wx/src/gen/wxPreviewCanvas.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -53,24 +53,25 @@
getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1,
hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,prepareDC/2,raise/1,refresh/1,refresh/2,
- refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,
- screenToClient/1,screenToClient/2,scroll/3,scrollLines/2,scrollPages/2,
- scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
- setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
- setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
- setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFocusIgnoringChildren/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
- setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
- setPalette/2,setScrollPos/3,setScrollPos/4,setScrollRate/3,setScrollbar/5,
- setScrollbar/6,setScrollbars/5,setScrollbars/6,setSize/2,setSize/3,
- setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4,setSizer/2,
- setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setTargetWindow/2,setThemeEnabled/2,
- setToolTip/2,setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,prepareDC/2,
+ raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,
+ removeChild/2,reparent/2,screenToClient/1,screenToClient/2,scroll/3,
+ scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,
+ setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,
+ setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
+ setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
+ setFocusIgnoringChildren/1,setFont/2,setForegroundColour/2,setHelpText/2,
+ setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
+ setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setScrollPos/3,
+ setScrollPos/4,setScrollRate/3,setScrollbar/5,setScrollbar/6,setScrollbars/5,
+ setScrollbars/6,setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,
+ setSizeHints/3,setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,
+ setSizerAndFit/3,setTargetWindow/2,setThemeEnabled/2,setToolTip/2,
+ setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2,
setVirtualSizeHints/3,setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2,
setWindowVariant/2,shouldInheritColours/1,show/1,show/2,thaw/1,transferDataFromWindow/1,
transferDataToWindow/1,update/1,updateWindowUI/1,updateWindowUI/2,
@@ -321,6 +322,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxPreviewControlBar.erl b/lib/wx/src/gen/wxPreviewControlBar.erl
index cf17f40527..1ca4e9be39 100644
--- a/lib/wx/src/gen/wxPreviewControlBar.erl
+++ b/lib/wx/src/gen/wxPreviewControlBar.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -51,27 +51,27 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFocusIgnoringChildren/1,setFont/2,setForegroundColour/2,setHelpText/2,
- setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
- setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setScrollPos/3,
- setScrollPos/4,setScrollbar/5,setScrollbar/6,setSize/2,setSize/3,setSize/5,
- setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4,setSizer/2,
- setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setThemeEnabled/2,setToolTip/2,
- setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2,
- setVirtualSizeHints/3,setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2,
- setWindowVariant/2,shouldInheritColours/1,show/1,show/2,thaw/1,transferDataFromWindow/1,
- transferDataToWindow/1,update/1,updateWindowUI/1,updateWindowUI/2,
- validate/1,warpPointer/3]).
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFocusIgnoringChildren/1,
+ setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
+ setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
+ setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
+ setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,
+ setThemeEnabled/2,setToolTip/2,setTransparent/2,setVirtualSize/2,
+ setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4,
+ setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,shouldInheritColours/1,
+ show/1,show/2,thaw/1,transferDataFromWindow/1,transferDataToWindow/1,
+ update/1,updateWindowUI/1,updateWindowUI/2,validate/1,warpPointer/3]).
-export_type([wxPreviewControlBar/0]).
%% @hidden
@@ -353,6 +353,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxPreviewFrame.erl b/lib/wx/src/gen/wxPreviewFrame.erl
index 022b0cd46e..86c78f4629 100644
--- a/lib/wx/src/gen/wxPreviewFrame.erl
+++ b/lib/wx/src/gen/wxPreviewFrame.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -57,9 +57,9 @@
hasScrollbar/2,hasTransparentBackground/1,hide/1,iconize/1,iconize/2,
inheritAttributes/1,initDialog/1,invalidateBestSize/1,isActive/1,
isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3,isExposed/5,
- isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,maximize/1,
- maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,processCommand/2,
raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,
@@ -445,6 +445,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxPrintDialog.erl b/lib/wx/src/gen/wxPrintDialog.erl
index 4024036166..86a48eef98 100644
--- a/lib/wx/src/gen/wxPrintDialog.erl
+++ b/lib/wx/src/gen/wxPrintDialog.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -55,19 +55,19 @@
hasTransparentBackground/1,hide/1,iconize/1,iconize/2,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isActive/1,isDoubleBuffered/1,isEnabled/1,
isExposed/2,isExposed/3,isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,
- isModal/1,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,
- lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3,
- move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2,
- pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1,
- requestUserAttention/2,screenToClient/1,screenToClient/2,scrollLines/2,
- scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,
- setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,
- setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
+ isModal/1,isRetained/1,isShown/1,isShownOnScreen/1,isTopLevel/1,layout/1,
+ lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,requestUserAttention/1,requestUserAttention/2,screenToClient/1,
+ screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
+ setAcceleratorTable/2,setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,
+ setBackgroundStyle/2,setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,
+ setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,
+ setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,
+ setIcons/2,setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setReturnCode/2,
setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -410,6 +410,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxProgressDialog.erl b/lib/wx/src/gen/wxProgressDialog.erl
index a17cb0383a..b990e062bb 100644
--- a/lib/wx/src/gen/wxProgressDialog.erl
+++ b/lib/wx/src/gen/wxProgressDialog.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -55,19 +55,19 @@
hasTransparentBackground/1,hide/1,iconize/1,iconize/2,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isActive/1,isDoubleBuffered/1,isEnabled/1,
isExposed/2,isExposed/3,isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,
- isModal/1,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,
- lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3,
- move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2,
- pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1,
- requestUserAttention/2,screenToClient/1,screenToClient/2,scrollLines/2,
- scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,
- setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,
- setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
+ isModal/1,isRetained/1,isShown/1,isShownOnScreen/1,isTopLevel/1,layout/1,
+ lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,requestUserAttention/1,requestUserAttention/2,screenToClient/1,
+ screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
+ setAcceleratorTable/2,setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,
+ setBackgroundStyle/2,setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,
+ setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,
+ setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,
+ setIcons/2,setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setReturnCode/2,
setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -423,6 +423,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxRadioBox.erl b/lib/wx/src/gen/wxRadioBox.erl
index 13d3a496ac..cdb05ab3f7 100644
--- a/lib/wx/src/gen/wxRadioBox.erl
+++ b/lib/wx/src/gen/wxRadioBox.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -53,17 +53,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -543,6 +544,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxRadioButton.erl b/lib/wx/src/gen/wxRadioButton.erl
index b5635e8afe..84c2f7f533 100644
--- a/lib/wx/src/gen/wxRadioButton.erl
+++ b/lib/wx/src/gen/wxRadioButton.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -50,17 +50,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -370,6 +371,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxSashLayoutWindow.erl b/lib/wx/src/gen/wxSashLayoutWindow.erl
index a0e240b25d..c896334ea2 100644
--- a/lib/wx/src/gen/wxSashLayoutWindow.erl
+++ b/lib/wx/src/gen/wxSashLayoutWindow.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -53,17 +53,17 @@
getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,
hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,
isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,
- isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
- move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
- navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
- popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
- refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
- reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
- scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
- setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
- setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
- setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
- setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isShownOnScreen/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,
+ makeModal/1,makeModal/2,move/2,move/3,move/4,moveAfterInTabOrder/2,
+ moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,
+ popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,
+ raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,
+ removeChild/2,reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,
+ scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,
+ setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,
+ setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
+ setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
+ setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMaximumSizeX/2,setMaximumSizeY/2,setMinSize/2,setMinimumSizeX/2,
setMinimumSizeY/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,
setOwnForegroundColour/2,setPalette/2,setSashVisible/3,setScrollPos/3,
@@ -421,6 +421,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxSashWindow.erl b/lib/wx/src/gen/wxSashWindow.erl
index 5e66d79b11..b4fef6bfd6 100644
--- a/lib/wx/src/gen/wxSashWindow.erl
+++ b/lib/wx/src/gen/wxSashWindow.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -51,17 +51,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -408,6 +409,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxScrollBar.erl b/lib/wx/src/gen/wxScrollBar.erl
index a1138725cd..5604afabe9 100644
--- a/lib/wx/src/gen/wxScrollBar.erl
+++ b/lib/wx/src/gen/wxScrollBar.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -51,17 +51,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setSize/2,setSize/3,setSize/5,
setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4,setSizer/2,
@@ -410,6 +411,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxScrolledWindow.erl b/lib/wx/src/gen/wxScrolledWindow.erl
index e3f6122cfa..776bd20541 100644
--- a/lib/wx/src/gen/wxScrolledWindow.erl
+++ b/lib/wx/src/gen/wxScrolledWindow.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -53,27 +53,27 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFocusIgnoringChildren/1,setFont/2,setForegroundColour/2,setHelpText/2,
- setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
- setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setScrollPos/3,
- setScrollPos/4,setScrollbar/5,setScrollbar/6,setSize/2,setSize/3,setSize/5,
- setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4,setSizer/2,
- setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setThemeEnabled/2,setToolTip/2,
- setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2,
- setVirtualSizeHints/3,setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2,
- setWindowVariant/2,shouldInheritColours/1,show/1,show/2,thaw/1,transferDataFromWindow/1,
- transferDataToWindow/1,update/1,updateWindowUI/1,updateWindowUI/2,
- validate/1,warpPointer/3]).
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFocusIgnoringChildren/1,
+ setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
+ setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
+ setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
+ setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,
+ setThemeEnabled/2,setToolTip/2,setTransparent/2,setVirtualSize/2,
+ setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4,
+ setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,shouldInheritColours/1,
+ show/1,show/2,thaw/1,transferDataFromWindow/1,transferDataToWindow/1,
+ update/1,updateWindowUI/1,updateWindowUI/2,validate/1,warpPointer/3]).
-export_type([wxScrolledWindow/0]).
%% @hidden
@@ -460,6 +460,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxSingleChoiceDialog.erl b/lib/wx/src/gen/wxSingleChoiceDialog.erl
index 8b2991da4d..80d550179a 100644
--- a/lib/wx/src/gen/wxSingleChoiceDialog.erl
+++ b/lib/wx/src/gen/wxSingleChoiceDialog.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -55,19 +55,19 @@
hasTransparentBackground/1,hide/1,iconize/1,iconize/2,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isActive/1,isDoubleBuffered/1,isEnabled/1,
isExposed/2,isExposed/3,isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,
- isModal/1,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,
- lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3,
- move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2,
- pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1,
- requestUserAttention/2,screenToClient/1,screenToClient/2,scrollLines/2,
- scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,
- setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,
- setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
+ isModal/1,isRetained/1,isShown/1,isShownOnScreen/1,isTopLevel/1,layout/1,
+ lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,requestUserAttention/1,requestUserAttention/2,screenToClient/1,
+ screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
+ setAcceleratorTable/2,setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,
+ setBackgroundStyle/2,setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,
+ setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,
+ setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,
+ setIcons/2,setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setReturnCode/2,
setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -420,6 +420,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxSlider.erl b/lib/wx/src/gen/wxSlider.erl
index 7bdff00589..ff240c557f 100644
--- a/lib/wx/src/gen/wxSlider.erl
+++ b/lib/wx/src/gen/wxSlider.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -52,17 +52,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -446,6 +447,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxSpinButton.erl b/lib/wx/src/gen/wxSpinButton.erl
index 6c24176974..d11cc01d1c 100644
--- a/lib/wx/src/gen/wxSpinButton.erl
+++ b/lib/wx/src/gen/wxSpinButton.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -51,17 +51,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -394,6 +395,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxSpinCtrl.erl b/lib/wx/src/gen/wxSpinCtrl.erl
index c229b4caf1..0add59c402 100644
--- a/lib/wx/src/gen/wxSpinCtrl.erl
+++ b/lib/wx/src/gen/wxSpinCtrl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -51,17 +51,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -431,6 +432,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxSplashScreen.erl b/lib/wx/src/gen/wxSplashScreen.erl
index 9729b3529b..533af7935e 100644
--- a/lib/wx/src/gen/wxSplashScreen.erl
+++ b/lib/wx/src/gen/wxSplashScreen.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -56,9 +56,9 @@
hasScrollbar/2,hasTransparentBackground/1,hide/1,iconize/1,iconize/2,
inheritAttributes/1,initDialog/1,invalidateBestSize/1,isActive/1,
isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3,isExposed/5,
- isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,maximize/1,
- maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,processCommand/2,
raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,
@@ -431,6 +431,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxSplitterWindow.erl b/lib/wx/src/gen/wxSplitterWindow.erl
index fb2f355f43..e46ea7872b 100644
--- a/lib/wx/src/gen/wxSplitterWindow.erl
+++ b/lib/wx/src/gen/wxSplitterWindow.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -54,17 +54,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -559,6 +560,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxStaticBitmap.erl b/lib/wx/src/gen/wxStaticBitmap.erl
index 64d8cc4364..5003b4f538 100644
--- a/lib/wx/src/gen/wxStaticBitmap.erl
+++ b/lib/wx/src/gen/wxStaticBitmap.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -50,17 +50,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -366,6 +367,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxStaticBox.erl b/lib/wx/src/gen/wxStaticBox.erl
index 728c02e9e4..3673e9b486 100644
--- a/lib/wx/src/gen/wxStaticBox.erl
+++ b/lib/wx/src/gen/wxStaticBox.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -50,17 +50,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -349,6 +350,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxStaticLine.erl b/lib/wx/src/gen/wxStaticLine.erl
index 3c648b7746..3d5556c31a 100644
--- a/lib/wx/src/gen/wxStaticLine.erl
+++ b/lib/wx/src/gen/wxStaticLine.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -51,17 +51,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -366,6 +367,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxStaticText.erl b/lib/wx/src/gen/wxStaticText.erl
index 34216f975f..d5bd39cce5 100644
--- a/lib/wx/src/gen/wxStaticText.erl
+++ b/lib/wx/src/gen/wxStaticText.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -50,18 +50,19 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setMaxSize/2,
- setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setMaxSize/2,setMinSize/2,
+ setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,
@@ -372,6 +373,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxStatusBar.erl b/lib/wx/src/gen/wxStatusBar.erl
index 8d9f77c209..e3f7ec3662 100644
--- a/lib/wx/src/gen/wxStatusBar.erl
+++ b/lib/wx/src/gen/wxStatusBar.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -52,17 +52,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -496,6 +497,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxStyledTextCtrl.erl b/lib/wx/src/gen/wxStyledTextCtrl.erl
index 7e45245a72..42b200da4a 100644
--- a/lib/wx/src/gen/wxStyledTextCtrl.erl
+++ b/lib/wx/src/gen/wxStyledTextCtrl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -152,17 +152,17 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lower/1,makeModal/1,makeModal/2,move/2,move/3,move/4,moveAfterInTabOrder/2,
- moveBeforeInTabOrder/2,navigate/1,navigate/2,parent_class/1,popEventHandler/1,
- popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
- refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
- reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
- scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
- setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
- setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
- setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
- setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lower/1,makeModal/1,makeModal/2,move/2,move/3,
+ move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2,
+ parent_class/1,popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,
+ popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,
+ releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,screenToClient/2,
+ scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,
+ setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,
+ setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
+ setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
+ setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -4269,6 +4269,8 @@ lower(This) -> wxWindow:lower(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxTextCtrl.erl b/lib/wx/src/gen/wxTextCtrl.erl
index 3acc61ce02..1134f994ff 100644
--- a/lib/wx/src/gen/wxTextCtrl.erl
+++ b/lib/wx/src/gen/wxTextCtrl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -58,17 +58,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -796,6 +797,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxTextEntryDialog.erl b/lib/wx/src/gen/wxTextEntryDialog.erl
index c43a2d12b8..1a0552b5c8 100644
--- a/lib/wx/src/gen/wxTextEntryDialog.erl
+++ b/lib/wx/src/gen/wxTextEntryDialog.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -55,19 +55,19 @@
hasTransparentBackground/1,hide/1,iconize/1,iconize/2,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isActive/1,isDoubleBuffered/1,isEnabled/1,
isExposed/2,isExposed/3,isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,
- isModal/1,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,
- lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3,
- move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2,
- pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1,
- requestUserAttention/2,screenToClient/1,screenToClient/2,scrollLines/2,
- scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,
- setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,
- setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
+ isModal/1,isRetained/1,isShown/1,isShownOnScreen/1,isTopLevel/1,layout/1,
+ lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,requestUserAttention/1,requestUserAttention/2,screenToClient/1,
+ screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
+ setAcceleratorTable/2,setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,
+ setBackgroundStyle/2,setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,
+ setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,
+ setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,
+ setIcons/2,setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,
setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setReturnCode/2,
setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -408,6 +408,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxToggleButton.erl b/lib/wx/src/gen/wxToggleButton.erl
index b82ff4fe68..6a9cc93e5e 100644
--- a/lib/wx/src/gen/wxToggleButton.erl
+++ b/lib/wx/src/gen/wxToggleButton.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -50,17 +50,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -370,6 +371,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxToolBar.erl b/lib/wx/src/gen/wxToolBar.erl
index e2835bf7c4..896bec5a82 100644
--- a/lib/wx/src/gen/wxToolBar.erl
+++ b/lib/wx/src/gen/wxToolBar.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -59,17 +59,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -872,6 +873,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxToolbook.erl b/lib/wx/src/gen/wxToolbook.erl
index c22719680c..ff17cbbe17 100644
--- a/lib/wx/src/gen/wxToolbook.erl
+++ b/lib/wx/src/gen/wxToolbook.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -55,17 +55,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -582,6 +583,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxTopLevelWindow.erl b/lib/wx/src/gen/wxTopLevelWindow.erl
index 64713099f6..e7625cab77 100644
--- a/lib/wx/src/gen/wxTopLevelWindow.erl
+++ b/lib/wx/src/gen/wxTopLevelWindow.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -53,17 +53,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -502,6 +503,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxTreeCtrl.erl b/lib/wx/src/gen/wxTreeCtrl.erl
index 373cb4c77f..9cd1d8e0c6 100644
--- a/lib/wx/src/gen/wxTreeCtrl.erl
+++ b/lib/wx/src/gen/wxTreeCtrl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -71,17 +71,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -1142,6 +1143,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxTreebook.erl b/lib/wx/src/gen/wxTreebook.erl
index dc95730224..daa93368ce 100644
--- a/lib/wx/src/gen/wxTreebook.erl
+++ b/lib/wx/src/gen/wxTreebook.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -56,17 +56,18 @@
getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,
hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1,
initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,
- layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,
- move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,
- navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2,
- popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,
- refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,
- screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,
- setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,
- setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
- setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
- setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isShownOnScreen/1,
+ isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
+ move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
+ navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,
+ popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
+ refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
+ reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
+ scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
+ setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
+ setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
+ setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
+ setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -638,6 +639,8 @@ lineDown(This) -> wxWindow:lineDown(This).
%% @hidden
layout(This) -> wxWindow:layout(This).
%% @hidden
+isShownOnScreen(This) -> wxWindow:isShownOnScreen(This).
+%% @hidden
isTopLevel(This) -> wxWindow:isTopLevel(This).
%% @hidden
isShown(This) -> wxWindow:isShown(This).
diff --git a/lib/wx/src/gen/wxWindow.erl b/lib/wx/src/gen/wxWindow.erl
index 9ace4533c8..46fe81c345 100644
--- a/lib/wx/src/gen/wxWindow.erl
+++ b/lib/wx/src/gen/wxWindow.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -47,17 +47,17 @@
getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,
hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,
isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,
- isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,
- move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,
- navigate/1,navigate/2,new/0,new/2,new/3,pageDown/1,pageUp/1,popEventHandler/1,
- popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,
- refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,
- reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,
- scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,
- setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2,
- setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2,
- setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2,
- setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
+ isShownOnScreen/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,
+ makeModal/1,makeModal/2,move/2,move/3,move/4,moveAfterInTabOrder/2,
+ moveBeforeInTabOrder/2,navigate/1,navigate/2,new/0,new/2,new/3,pageDown/1,
+ pageUp/1,popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,
+ popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,
+ releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,screenToClient/2,
+ scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,
+ setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,
+ setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2,
+ setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,
+ setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2,
setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,
setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,
setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,
@@ -915,6 +915,14 @@ isTopLevel(#wx_ref{type=ThisT,ref=ThisRef}) ->
wxe_util:call(?wxWindow_IsTopLevel,
<<ThisRef:32/?UI>>).
+%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxwindow.html#wxwindowisshownonscreen">external documentation</a>.
+-spec isShownOnScreen(This) -> boolean() when
+ This::wxWindow().
+isShownOnScreen(#wx_ref{type=ThisT,ref=ThisRef}) ->
+ ?CLASS(ThisT,wxWindow),
+ wxe_util:call(?wxWindow_IsShownOnScreen,
+ <<ThisRef:32/?UI>>).
+
%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxwindow.html#wxwindowlayout">external documentation</a>.
-spec layout(This) -> boolean() when
This::wxWindow().
diff --git a/lib/wx/src/gen/wxe_debug.hrl b/lib/wx/src/gen/wxe_debug.hrl
index b64a1b4c61..449320a3d9 100644
--- a/lib/wx/src/gen/wxe_debug.hrl
+++ b/lib/wx/src/gen/wxe_debug.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -112,3287 +112,3291 @@ wxdebug_table() ->
{198, {wxWindow, isRetained, 0}},
{199, {wxWindow, isShown, 0}},
{200, {wxWindow, isTopLevel, 0}},
- {201, {wxWindow, layout, 0}},
- {202, {wxWindow, lineDown, 0}},
- {203, {wxWindow, lineUp, 0}},
- {204, {wxWindow, lower, 0}},
- {205, {wxWindow, makeModal, 1}},
- {206, {wxWindow, move_3, 3}},
- {207, {wxWindow, move_2, 2}},
- {208, {wxWindow, moveAfterInTabOrder, 1}},
- {209, {wxWindow, moveBeforeInTabOrder, 1}},
- {210, {wxWindow, navigate, 1}},
- {211, {wxWindow, pageDown, 0}},
- {212, {wxWindow, pageUp, 0}},
- {213, {wxWindow, popEventHandler, 1}},
- {214, {wxWindow, popupMenu_2, 2}},
- {215, {wxWindow, popupMenu_3, 3}},
- {216, {wxWindow, raise, 0}},
- {217, {wxWindow, refresh, 1}},
- {218, {wxWindow, refreshRect, 2}},
- {219, {wxWindow, releaseMouse, 0}},
- {220, {wxWindow, removeChild, 1}},
- {221, {wxWindow, reparent, 1}},
- {222, {wxWindow, screenToClient_2, 2}},
- {223, {wxWindow, screenToClient_1, 1}},
- {225, {wxWindow, scrollLines, 1}},
- {227, {wxWindow, scrollPages, 1}},
- {228, {wxWindow, scrollWindow, 3}},
- {229, {wxWindow, setAcceleratorTable, 1}},
- {230, {wxWindow, setAutoLayout, 1}},
- {231, {wxWindow, setBackgroundColour, 1}},
- {232, {wxWindow, setBackgroundStyle, 1}},
- {233, {wxWindow, setCaret, 1}},
- {234, {wxWindow, setClientSize_2, 2}},
- {235, {wxWindow, setClientSize_1_0, 1}},
- {236, {wxWindow, setClientSize_1_1, 1}},
- {237, {wxWindow, setContainingSizer, 1}},
- {238, {wxWindow, setCursor, 1}},
- {239, {wxWindow, setMaxSize, 1}},
- {240, {wxWindow, setMinSize, 1}},
- {241, {wxWindow, setOwnBackgroundColour, 1}},
- {242, {wxWindow, setOwnFont, 1}},
- {243, {wxWindow, setOwnForegroundColour, 1}},
- {244, {wxWindow, setDropTarget, 1}},
- {245, {wxWindow, setExtraStyle, 1}},
- {246, {wxWindow, setFocus, 0}},
- {247, {wxWindow, setFocusFromKbd, 0}},
- {248, {wxWindow, setFont, 1}},
- {249, {wxWindow, setForegroundColour, 1}},
- {250, {wxWindow, setHelpText, 1}},
- {251, {wxWindow, setId, 1}},
- {253, {wxWindow, setLabel, 1}},
- {254, {wxWindow, setName, 1}},
- {255, {wxWindow, setPalette, 1}},
- {256, {wxWindow, setScrollbar, 5}},
- {257, {wxWindow, setScrollPos, 3}},
- {258, {wxWindow, setSize_5, 5}},
- {259, {wxWindow, setSize_2_0, 2}},
- {260, {wxWindow, setSize_1, 1}},
- {261, {wxWindow, setSize_2_1, 2}},
- {262, {wxWindow, setSizeHints_3, 3}},
- {263, {wxWindow, setSizeHints_2, 2}},
- {264, {wxWindow, setSizer, 2}},
- {265, {wxWindow, setSizerAndFit, 2}},
- {266, {wxWindow, setThemeEnabled, 1}},
- {267, {wxWindow, setToolTip_1_0, 1}},
- {268, {wxWindow, setToolTip_1_1, 1}},
- {269, {wxWindow, setVirtualSize_1, 1}},
- {270, {wxWindow, setVirtualSize_2, 2}},
- {271, {wxWindow, setVirtualSizeHints_3, 3}},
- {272, {wxWindow, setVirtualSizeHints_2, 2}},
- {273, {wxWindow, setWindowStyle, 1}},
- {274, {wxWindow, setWindowStyleFlag, 1}},
- {275, {wxWindow, setWindowVariant, 1}},
- {276, {wxWindow, shouldInheritColours, 0}},
- {277, {wxWindow, show, 1}},
- {278, {wxWindow, thaw, 0}},
- {279, {wxWindow, transferDataFromWindow, 0}},
- {280, {wxWindow, transferDataToWindow, 0}},
- {281, {wxWindow, update, 0}},
- {282, {wxWindow, updateWindowUI, 1}},
- {283, {wxWindow, validate, 0}},
- {284, {wxWindow, warpPointer, 2}},
- {285, {wxWindow, setTransparent, 1}},
- {286, {wxWindow, canSetTransparent, 0}},
- {287, {wxWindow, isDoubleBuffered, 0}},
- {288, {wxWindow, setDoubleBuffered, 1}},
- {289, {wxWindow, getContentScaleFactor, 0}},
- {290, {wxTopLevelWindow, getIcon, 0}},
- {291, {wxTopLevelWindow, getIcons, 0}},
- {292, {wxTopLevelWindow, getTitle, 0}},
- {293, {wxTopLevelWindow, isActive, 0}},
- {294, {wxTopLevelWindow, iconize, 1}},
- {295, {wxTopLevelWindow, isFullScreen, 0}},
- {296, {wxTopLevelWindow, isIconized, 0}},
- {297, {wxTopLevelWindow, isMaximized, 0}},
- {298, {wxTopLevelWindow, maximize, 1}},
- {299, {wxTopLevelWindow, requestUserAttention, 1}},
- {300, {wxTopLevelWindow, setIcon, 1}},
- {301, {wxTopLevelWindow, setIcons, 1}},
- {302, {wxTopLevelWindow, centerOnScreen, 1}},
- {303, {wxTopLevelWindow, centreOnScreen, 1}},
- {305, {wxTopLevelWindow, setShape, 1}},
- {306, {wxTopLevelWindow, setTitle, 1}},
- {307, {wxTopLevelWindow, showFullScreen, 2}},
- {309, {wxFrame, new_4, 4}},
- {310, {wxFrame, new_0, 0}},
- {312, {wxFrame, destruct, 0}},
- {313, {wxFrame, create, 4}},
- {314, {wxFrame, createStatusBar, 1}},
- {315, {wxFrame, createToolBar, 1}},
- {316, {wxFrame, getClientAreaOrigin, 0}},
- {317, {wxFrame, getMenuBar, 0}},
- {318, {wxFrame, getStatusBar, 0}},
- {319, {wxFrame, getStatusBarPane, 0}},
- {320, {wxFrame, getToolBar, 0}},
- {321, {wxFrame, processCommand, 1}},
- {322, {wxFrame, sendSizeEvent, 0}},
- {323, {wxFrame, setMenuBar, 1}},
- {324, {wxFrame, setStatusBar, 1}},
- {325, {wxFrame, setStatusBarPane, 1}},
- {326, {wxFrame, setStatusText, 2}},
- {327, {wxFrame, setStatusWidths, 2}},
- {328, {wxFrame, setToolBar, 1}},
- {329, {wxMiniFrame, new_0, 0}},
- {330, {wxMiniFrame, new_4, 4}},
- {331, {wxMiniFrame, create, 4}},
- {332, {wxMiniFrame, 'Destroy', undefined}},
- {333, {wxSplashScreen, new_0, 0}},
- {334, {wxSplashScreen, new_6, 6}},
- {335, {wxSplashScreen, destruct, 0}},
- {336, {wxSplashScreen, getSplashStyle, 0}},
- {337, {wxSplashScreen, getTimeout, 0}},
- {338, {wxPanel, new_0, 0}},
- {339, {wxPanel, new_6, 6}},
- {340, {wxPanel, new_2, 2}},
- {341, {wxPanel, destruct, 0}},
- {342, {wxPanel, initDialog, 0}},
- {343, {wxPanel, setFocusIgnoringChildren, 0}},
- {344, {wxScrolledWindow, new_0, 0}},
- {345, {wxScrolledWindow, new_2, 2}},
- {346, {wxScrolledWindow, destruct, 0}},
- {347, {wxScrolledWindow, calcScrolledPosition_4, 4}},
- {348, {wxScrolledWindow, calcScrolledPosition_1, 1}},
- {349, {wxScrolledWindow, calcUnscrolledPosition_4, 4}},
- {350, {wxScrolledWindow, calcUnscrolledPosition_1, 1}},
- {351, {wxScrolledWindow, enableScrolling, 2}},
- {352, {wxScrolledWindow, getScrollPixelsPerUnit, 2}},
- {353, {wxScrolledWindow, getViewStart, 2}},
- {354, {wxScrolledWindow, doPrepareDC, 1}},
- {355, {wxScrolledWindow, prepareDC, 1}},
- {356, {wxScrolledWindow, scroll, 2}},
- {357, {wxScrolledWindow, setScrollbars, 5}},
- {358, {wxScrolledWindow, setScrollRate, 2}},
- {359, {wxScrolledWindow, setTargetWindow, 1}},
- {360, {wxSashWindow, new_0, 0}},
- {361, {wxSashWindow, new_2, 2}},
- {362, {wxSashWindow, destruct, 0}},
- {363, {wxSashWindow, getSashVisible, 1}},
- {364, {wxSashWindow, getMaximumSizeX, 0}},
- {365, {wxSashWindow, getMaximumSizeY, 0}},
- {366, {wxSashWindow, getMinimumSizeX, 0}},
- {367, {wxSashWindow, getMinimumSizeY, 0}},
- {368, {wxSashWindow, setMaximumSizeX, 1}},
- {369, {wxSashWindow, setMaximumSizeY, 1}},
- {370, {wxSashWindow, setMinimumSizeX, 1}},
- {371, {wxSashWindow, setMinimumSizeY, 1}},
- {372, {wxSashWindow, setSashVisible, 2}},
- {373, {wxSashLayoutWindow, new_0, 0}},
- {374, {wxSashLayoutWindow, new_2, 2}},
- {375, {wxSashLayoutWindow, create, 2}},
- {376, {wxSashLayoutWindow, getAlignment, 0}},
- {377, {wxSashLayoutWindow, getOrientation, 0}},
- {378, {wxSashLayoutWindow, setAlignment, 1}},
- {379, {wxSashLayoutWindow, setDefaultSize, 1}},
- {380, {wxSashLayoutWindow, setOrientation, 1}},
- {381, {wxSashLayoutWindow, 'Destroy', undefined}},
- {382, {wxGrid, new_0, 0}},
- {383, {wxGrid, new_3, 3}},
- {384, {wxGrid, new_4, 4}},
- {385, {wxGrid, destruct, 0}},
- {386, {wxGrid, appendCols, 1}},
- {387, {wxGrid, appendRows, 1}},
- {388, {wxGrid, autoSize, 0}},
- {389, {wxGrid, autoSizeColumn, 2}},
- {390, {wxGrid, autoSizeColumns, 1}},
- {391, {wxGrid, autoSizeRow, 2}},
- {392, {wxGrid, autoSizeRows, 1}},
- {393, {wxGrid, beginBatch, 0}},
- {394, {wxGrid, blockToDeviceRect, 2}},
- {395, {wxGrid, canDragColSize, 0}},
- {396, {wxGrid, canDragRowSize, 0}},
- {397, {wxGrid, canDragGridSize, 0}},
- {398, {wxGrid, canEnableCellControl, 0}},
- {399, {wxGrid, cellToRect_2, 2}},
- {400, {wxGrid, cellToRect_1, 1}},
- {401, {wxGrid, clearGrid, 0}},
- {402, {wxGrid, clearSelection, 0}},
- {403, {wxGrid, createGrid, 3}},
- {404, {wxGrid, deleteCols, 1}},
- {405, {wxGrid, deleteRows, 1}},
- {406, {wxGrid, disableCellEditControl, 0}},
- {407, {wxGrid, disableDragColSize, 0}},
- {408, {wxGrid, disableDragGridSize, 0}},
- {409, {wxGrid, disableDragRowSize, 0}},
- {410, {wxGrid, enableCellEditControl, 1}},
- {411, {wxGrid, enableDragColSize, 1}},
- {412, {wxGrid, enableDragGridSize, 1}},
- {413, {wxGrid, enableDragRowSize, 1}},
- {414, {wxGrid, enableEditing, 1}},
- {415, {wxGrid, enableGridLines, 1}},
- {416, {wxGrid, endBatch, 0}},
- {417, {wxGrid, fit, 0}},
- {418, {wxGrid, forceRefresh, 0}},
- {419, {wxGrid, getBatchCount, 0}},
- {420, {wxGrid, getCellAlignment, 4}},
- {421, {wxGrid, getCellBackgroundColour, 2}},
- {422, {wxGrid, getCellEditor, 2}},
- {423, {wxGrid, getCellFont, 2}},
- {424, {wxGrid, getCellRenderer, 2}},
- {425, {wxGrid, getCellTextColour, 2}},
- {426, {wxGrid, getCellValue_2, 2}},
- {427, {wxGrid, getCellValue_1, 1}},
- {428, {wxGrid, getColLabelAlignment, 2}},
- {429, {wxGrid, getColLabelSize, 0}},
- {430, {wxGrid, getColLabelValue, 1}},
- {431, {wxGrid, getColMinimalAcceptableWidth, 0}},
- {432, {wxGrid, getDefaultCellAlignment, 2}},
- {433, {wxGrid, getDefaultCellBackgroundColour, 0}},
- {434, {wxGrid, getDefaultCellFont, 0}},
- {435, {wxGrid, getDefaultCellTextColour, 0}},
- {436, {wxGrid, getDefaultColLabelSize, 0}},
- {437, {wxGrid, getDefaultColSize, 0}},
- {438, {wxGrid, getDefaultEditor, 0}},
- {439, {wxGrid, getDefaultEditorForCell_2, 2}},
- {440, {wxGrid, getDefaultEditorForCell_1, 1}},
- {441, {wxGrid, getDefaultEditorForType, 1}},
- {442, {wxGrid, getDefaultRenderer, 0}},
- {443, {wxGrid, getDefaultRendererForCell, 2}},
- {444, {wxGrid, getDefaultRendererForType, 1}},
- {445, {wxGrid, getDefaultRowLabelSize, 0}},
- {446, {wxGrid, getDefaultRowSize, 0}},
- {447, {wxGrid, getGridCursorCol, 0}},
- {448, {wxGrid, getGridCursorRow, 0}},
- {449, {wxGrid, getGridLineColour, 0}},
- {450, {wxGrid, gridLinesEnabled, 0}},
- {451, {wxGrid, getLabelBackgroundColour, 0}},
- {452, {wxGrid, getLabelFont, 0}},
- {453, {wxGrid, getLabelTextColour, 0}},
- {454, {wxGrid, getNumberCols, 0}},
- {455, {wxGrid, getNumberRows, 0}},
- {456, {wxGrid, getOrCreateCellAttr, 2}},
- {457, {wxGrid, getRowMinimalAcceptableHeight, 0}},
- {458, {wxGrid, getRowLabelAlignment, 2}},
- {459, {wxGrid, getRowLabelSize, 0}},
- {460, {wxGrid, getRowLabelValue, 1}},
- {461, {wxGrid, getRowSize, 1}},
- {462, {wxGrid, getScrollLineX, 0}},
- {463, {wxGrid, getScrollLineY, 0}},
- {464, {wxGrid, getSelectedCells, 0}},
- {465, {wxGrid, getSelectedCols, 0}},
- {466, {wxGrid, getSelectedRows, 0}},
- {467, {wxGrid, getSelectionBackground, 0}},
- {468, {wxGrid, getSelectionBlockTopLeft, 0}},
- {469, {wxGrid, getSelectionBlockBottomRight, 0}},
- {470, {wxGrid, getSelectionForeground, 0}},
- {471, {wxGrid, getViewWidth, 0}},
- {472, {wxGrid, getGridWindow, 0}},
- {473, {wxGrid, getGridRowLabelWindow, 0}},
- {474, {wxGrid, getGridColLabelWindow, 0}},
- {475, {wxGrid, getGridCornerLabelWindow, 0}},
- {476, {wxGrid, hideCellEditControl, 0}},
- {477, {wxGrid, insertCols, 1}},
- {478, {wxGrid, insertRows, 1}},
- {479, {wxGrid, isCellEditControlEnabled, 0}},
- {480, {wxGrid, isCurrentCellReadOnly, 0}},
- {481, {wxGrid, isEditable, 0}},
- {482, {wxGrid, isInSelection_2, 2}},
- {483, {wxGrid, isInSelection_1, 1}},
- {484, {wxGrid, isReadOnly, 2}},
- {485, {wxGrid, isSelection, 0}},
- {486, {wxGrid, isVisible_3, 3}},
- {487, {wxGrid, isVisible_2, 2}},
- {488, {wxGrid, makeCellVisible_2, 2}},
- {489, {wxGrid, makeCellVisible_1, 1}},
- {490, {wxGrid, moveCursorDown, 1}},
- {491, {wxGrid, moveCursorLeft, 1}},
- {492, {wxGrid, moveCursorRight, 1}},
- {493, {wxGrid, moveCursorUp, 1}},
- {494, {wxGrid, moveCursorDownBlock, 1}},
- {495, {wxGrid, moveCursorLeftBlock, 1}},
- {496, {wxGrid, moveCursorRightBlock, 1}},
- {497, {wxGrid, moveCursorUpBlock, 1}},
- {498, {wxGrid, movePageDown, 0}},
- {499, {wxGrid, movePageUp, 0}},
- {500, {wxGrid, registerDataType, 3}},
- {501, {wxGrid, saveEditControlValue, 0}},
- {502, {wxGrid, selectAll, 0}},
- {503, {wxGrid, selectBlock_5, 5}},
- {504, {wxGrid, selectBlock_3, 3}},
- {505, {wxGrid, selectCol, 2}},
- {506, {wxGrid, selectRow, 2}},
- {507, {wxGrid, setCellAlignment_4, 4}},
- {508, {wxGrid, setCellAlignment_3, 3}},
- {509, {wxGrid, setCellAlignment_1, 1}},
- {510, {wxGrid, setCellBackgroundColour_3_0, 3}},
- {511, {wxGrid, setCellBackgroundColour_1, 1}},
- {512, {wxGrid, setCellBackgroundColour_3_1, 3}},
- {513, {wxGrid, setCellEditor, 3}},
- {514, {wxGrid, setCellFont, 3}},
- {515, {wxGrid, setCellRenderer, 3}},
- {516, {wxGrid, setCellTextColour_3_0, 3}},
- {517, {wxGrid, setCellTextColour_3_1, 3}},
- {518, {wxGrid, setCellTextColour_1, 1}},
- {519, {wxGrid, setCellValue_3_0, 3}},
- {520, {wxGrid, setCellValue_2, 2}},
- {521, {wxGrid, setCellValue_3_1, 3}},
- {522, {wxGrid, setColAttr, 2}},
- {523, {wxGrid, setColFormatBool, 1}},
- {524, {wxGrid, setColFormatNumber, 1}},
- {525, {wxGrid, setColFormatFloat, 2}},
- {526, {wxGrid, setColFormatCustom, 2}},
- {527, {wxGrid, setColLabelAlignment, 2}},
- {528, {wxGrid, setColLabelSize, 1}},
- {529, {wxGrid, setColLabelValue, 2}},
- {530, {wxGrid, setColMinimalWidth, 2}},
- {531, {wxGrid, setColMinimalAcceptableWidth, 1}},
- {532, {wxGrid, setColSize, 2}},
- {533, {wxGrid, setDefaultCellAlignment, 2}},
- {534, {wxGrid, setDefaultCellBackgroundColour, 1}},
- {535, {wxGrid, setDefaultCellFont, 1}},
- {536, {wxGrid, setDefaultCellTextColour, 1}},
- {537, {wxGrid, setDefaultEditor, 1}},
- {538, {wxGrid, setDefaultRenderer, 1}},
- {539, {wxGrid, setDefaultColSize, 2}},
- {540, {wxGrid, setDefaultRowSize, 2}},
- {541, {wxGrid, setGridCursor, 2}},
- {542, {wxGrid, setGridLineColour, 1}},
- {543, {wxGrid, setLabelBackgroundColour, 1}},
- {544, {wxGrid, setLabelFont, 1}},
- {545, {wxGrid, setLabelTextColour, 1}},
- {546, {wxGrid, setMargins, 2}},
- {547, {wxGrid, setReadOnly, 3}},
- {548, {wxGrid, setRowAttr, 2}},
- {549, {wxGrid, setRowLabelAlignment, 2}},
- {550, {wxGrid, setRowLabelSize, 1}},
- {551, {wxGrid, setRowLabelValue, 2}},
- {552, {wxGrid, setRowMinimalHeight, 2}},
- {553, {wxGrid, setRowMinimalAcceptableHeight, 1}},
- {554, {wxGrid, setRowSize, 2}},
- {555, {wxGrid, setScrollLineX, 1}},
- {556, {wxGrid, setScrollLineY, 1}},
- {557, {wxGrid, setSelectionBackground, 1}},
- {558, {wxGrid, setSelectionForeground, 1}},
- {559, {wxGrid, setSelectionMode, 1}},
- {560, {wxGrid, showCellEditControl, 0}},
- {561, {wxGrid, xToCol, 2}},
- {562, {wxGrid, xToEdgeOfCol, 1}},
- {563, {wxGrid, yToEdgeOfRow, 1}},
- {564, {wxGrid, yToRow, 1}},
- {565, {wxGridCellRenderer, draw, 7}},
- {566, {wxGridCellRenderer, getBestSize, 5}},
- {567, {wxGridCellEditor, create, 3}},
- {568, {wxGridCellEditor, isCreated, 0}},
- {569, {wxGridCellEditor, setSize, 1}},
- {570, {wxGridCellEditor, show, 2}},
- {571, {wxGridCellEditor, paintBackground, 2}},
- {572, {wxGridCellEditor, beginEdit, 3}},
- {573, {wxGridCellEditor, endEdit, 3}},
- {574, {wxGridCellEditor, reset, 0}},
- {575, {wxGridCellEditor, startingKey, 1}},
- {576, {wxGridCellEditor, startingClick, 0}},
- {577, {wxGridCellEditor, handleReturn, 1}},
- {578, {wxGridCellBoolRenderer, new, 0}},
- {579, {wxGridCellBoolRenderer, 'Destroy', undefined}},
- {580, {wxGridCellBoolEditor, new, 0}},
- {581, {wxGridCellBoolEditor, isTrueValue, 1}},
- {582, {wxGridCellBoolEditor, useStringValues, 1}},
- {583, {wxGridCellBoolEditor, 'Destroy', undefined}},
- {584, {wxGridCellFloatRenderer, new, 1}},
- {585, {wxGridCellFloatRenderer, getPrecision, 0}},
- {586, {wxGridCellFloatRenderer, getWidth, 0}},
- {587, {wxGridCellFloatRenderer, setParameters, 1}},
- {588, {wxGridCellFloatRenderer, setPrecision, 1}},
- {589, {wxGridCellFloatRenderer, setWidth, 1}},
- {590, {wxGridCellFloatRenderer, 'Destroy', undefined}},
- {591, {wxGridCellFloatEditor, new, 1}},
- {592, {wxGridCellFloatEditor, setParameters, 1}},
- {593, {wxGridCellFloatEditor, 'Destroy', undefined}},
- {594, {wxGridCellStringRenderer, new, 0}},
- {595, {wxGridCellStringRenderer, 'Destroy', undefined}},
- {596, {wxGridCellTextEditor, new, 0}},
- {597, {wxGridCellTextEditor, setParameters, 1}},
- {598, {wxGridCellTextEditor, 'Destroy', undefined}},
- {600, {wxGridCellChoiceEditor, new, 2}},
- {601, {wxGridCellChoiceEditor, setParameters, 1}},
- {602, {wxGridCellChoiceEditor, 'Destroy', undefined}},
- {603, {wxGridCellNumberRenderer, new, 0}},
- {604, {wxGridCellNumberRenderer, 'Destroy', undefined}},
- {605, {wxGridCellNumberEditor, new, 1}},
- {606, {wxGridCellNumberEditor, getValue, 0}},
- {607, {wxGridCellNumberEditor, setParameters, 1}},
- {608, {wxGridCellNumberEditor, 'Destroy', undefined}},
- {609, {wxGridCellAttr, setTextColour, 1}},
- {610, {wxGridCellAttr, setBackgroundColour, 1}},
- {611, {wxGridCellAttr, setFont, 1}},
- {612, {wxGridCellAttr, setAlignment, 2}},
- {613, {wxGridCellAttr, setReadOnly, 1}},
- {614, {wxGridCellAttr, setRenderer, 1}},
- {615, {wxGridCellAttr, setEditor, 1}},
- {616, {wxGridCellAttr, hasTextColour, 0}},
- {617, {wxGridCellAttr, hasBackgroundColour, 0}},
- {618, {wxGridCellAttr, hasFont, 0}},
- {619, {wxGridCellAttr, hasAlignment, 0}},
- {620, {wxGridCellAttr, hasRenderer, 0}},
- {621, {wxGridCellAttr, hasEditor, 0}},
- {622, {wxGridCellAttr, getTextColour, 0}},
- {623, {wxGridCellAttr, getBackgroundColour, 0}},
- {624, {wxGridCellAttr, getFont, 0}},
- {625, {wxGridCellAttr, getAlignment, 2}},
- {626, {wxGridCellAttr, getRenderer, 3}},
- {627, {wxGridCellAttr, getEditor, 3}},
- {628, {wxGridCellAttr, isReadOnly, 0}},
- {629, {wxGridCellAttr, setDefAttr, 1}},
- {630, {wxDC, blit, 5}},
- {631, {wxDC, calcBoundingBox, 2}},
- {632, {wxDC, clear, 0}},
- {633, {wxDC, computeScaleAndOrigin, 0}},
- {634, {wxDC, crossHair, 1}},
- {635, {wxDC, destroyClippingRegion, 0}},
- {636, {wxDC, deviceToLogicalX, 1}},
- {637, {wxDC, deviceToLogicalXRel, 1}},
- {638, {wxDC, deviceToLogicalY, 1}},
- {639, {wxDC, deviceToLogicalYRel, 1}},
- {640, {wxDC, drawArc, 3}},
- {641, {wxDC, drawBitmap, 3}},
- {642, {wxDC, drawCheckMark, 1}},
- {643, {wxDC, drawCircle, 2}},
- {645, {wxDC, drawEllipse_2, 2}},
- {646, {wxDC, drawEllipse_1, 1}},
- {647, {wxDC, drawEllipticArc, 4}},
- {648, {wxDC, drawIcon, 2}},
- {649, {wxDC, drawLabel, 3}},
- {650, {wxDC, drawLine, 2}},
- {651, {wxDC, drawLines, 3}},
- {653, {wxDC, drawPolygon, 3}},
- {655, {wxDC, drawPoint, 1}},
- {657, {wxDC, drawRectangle_2, 2}},
- {658, {wxDC, drawRectangle_1, 1}},
- {659, {wxDC, drawRotatedText, 3}},
- {661, {wxDC, drawRoundedRectangle_3, 3}},
- {662, {wxDC, drawRoundedRectangle_2, 2}},
- {663, {wxDC, drawText, 2}},
- {664, {wxDC, endDoc, 0}},
- {665, {wxDC, endPage, 0}},
- {666, {wxDC, floodFill, 3}},
- {667, {wxDC, getBackground, 0}},
- {668, {wxDC, getBackgroundMode, 0}},
- {669, {wxDC, getBrush, 0}},
- {670, {wxDC, getCharHeight, 0}},
- {671, {wxDC, getCharWidth, 0}},
- {672, {wxDC, getClippingBox, 4}},
- {674, {wxDC, getFont, 0}},
- {675, {wxDC, getLayoutDirection, 0}},
- {676, {wxDC, getLogicalFunction, 0}},
- {677, {wxDC, getMapMode, 0}},
- {678, {wxDC, getMultiLineTextExtent_4, 4}},
- {679, {wxDC, getMultiLineTextExtent_1, 1}},
- {680, {wxDC, getPartialTextExtents, 2}},
- {681, {wxDC, getPen, 0}},
- {682, {wxDC, getPixel, 2}},
- {683, {wxDC, getPPI, 0}},
- {685, {wxDC, getSize, 0}},
- {687, {wxDC, getSizeMM, 0}},
- {688, {wxDC, getTextBackground, 0}},
- {689, {wxDC, getTextExtent_4, 4}},
- {690, {wxDC, getTextExtent_1, 1}},
- {692, {wxDC, getTextForeground, 0}},
- {693, {wxDC, getUserScale, 2}},
- {694, {wxDC, gradientFillConcentric_3, 3}},
- {695, {wxDC, gradientFillConcentric_4, 4}},
- {696, {wxDC, gradientFillLinear, 4}},
- {697, {wxDC, logicalToDeviceX, 1}},
- {698, {wxDC, logicalToDeviceXRel, 1}},
- {699, {wxDC, logicalToDeviceY, 1}},
- {700, {wxDC, logicalToDeviceYRel, 1}},
- {701, {wxDC, maxX, 0}},
- {702, {wxDC, maxY, 0}},
- {703, {wxDC, minX, 0}},
- {704, {wxDC, minY, 0}},
- {705, {wxDC, isOk, 0}},
- {706, {wxDC, resetBoundingBox, 0}},
- {707, {wxDC, setAxisOrientation, 2}},
- {708, {wxDC, setBackground, 1}},
- {709, {wxDC, setBackgroundMode, 1}},
- {710, {wxDC, setBrush, 1}},
- {712, {wxDC, setClippingRegion_2, 2}},
- {713, {wxDC, setClippingRegion_1_1, 1}},
- {714, {wxDC, setClippingRegion_1_0, 1}},
- {715, {wxDC, setDeviceOrigin, 2}},
- {716, {wxDC, setFont, 1}},
- {717, {wxDC, setLayoutDirection, 1}},
- {718, {wxDC, setLogicalFunction, 1}},
- {719, {wxDC, setMapMode, 1}},
- {720, {wxDC, setPalette, 1}},
- {721, {wxDC, setPen, 1}},
- {722, {wxDC, setTextBackground, 1}},
- {723, {wxDC, setTextForeground, 1}},
- {724, {wxDC, setUserScale, 2}},
- {725, {wxDC, startDoc, 1}},
- {726, {wxDC, startPage, 0}},
- {727, {wxMirrorDC, new, 2}},
- {728, {wxMirrorDC, 'Destroy', undefined}},
- {729, {wxScreenDC, new, 0}},
- {730, {wxScreenDC, destruct, 0}},
- {731, {wxPostScriptDC, new_0, 0}},
- {732, {wxPostScriptDC, new_1, 1}},
- {733, {wxPostScriptDC, destruct, 0}},
- {734, {wxPostScriptDC, setResolution, 1}},
- {735, {wxPostScriptDC, getResolution, 0}},
- {736, {wxWindowDC, new_0, 0}},
- {737, {wxWindowDC, new_1, 1}},
- {738, {wxWindowDC, destruct, 0}},
- {739, {wxClientDC, new_0, 0}},
- {740, {wxClientDC, new_1, 1}},
- {741, {wxClientDC, 'Destroy', undefined}},
- {742, {wxPaintDC, new_0, 0}},
- {743, {wxPaintDC, new_1, 1}},
- {744, {wxPaintDC, 'Destroy', undefined}},
- {746, {wxMemoryDC, new_1_0, 1}},
- {747, {wxMemoryDC, new_1_1, 1}},
- {748, {wxMemoryDC, new_0, 0}},
- {750, {wxMemoryDC, destruct, 0}},
- {751, {wxMemoryDC, selectObject, 1}},
- {752, {wxMemoryDC, selectObjectAsSource, 1}},
- {753, {wxBufferedDC, new_0, 0}},
- {754, {wxBufferedDC, new_2, 2}},
- {755, {wxBufferedDC, new_3, 3}},
- {756, {wxBufferedDC, destruct, 0}},
- {757, {wxBufferedDC, init_2, 2}},
- {758, {wxBufferedDC, init_3, 3}},
- {759, {wxBufferedPaintDC, new_3, 3}},
- {760, {wxBufferedPaintDC, new_2, 2}},
- {761, {wxBufferedPaintDC, destruct, 0}},
- {762, {wxGraphicsObject, destruct, 0}},
- {763, {wxGraphicsObject, getRenderer, 0}},
- {764, {wxGraphicsObject, isNull, 0}},
- {765, {wxGraphicsContext, destruct, 0}},
- {766, {wxGraphicsContext, create_1_1, 1}},
- {767, {wxGraphicsContext, create_1_0, 1}},
- {768, {wxGraphicsContext, create_0, 0}},
- {769, {wxGraphicsContext, createPen, 1}},
- {770, {wxGraphicsContext, createBrush, 1}},
- {771, {wxGraphicsContext, createRadialGradientBrush, 7}},
- {772, {wxGraphicsContext, createLinearGradientBrush, 6}},
- {773, {wxGraphicsContext, createFont, 2}},
- {774, {wxGraphicsContext, createMatrix, 1}},
- {775, {wxGraphicsContext, createPath, 0}},
- {776, {wxGraphicsContext, clip_1, 1}},
- {777, {wxGraphicsContext, clip_4, 4}},
- {778, {wxGraphicsContext, resetClip, 0}},
- {779, {wxGraphicsContext, drawBitmap, 5}},
- {780, {wxGraphicsContext, drawEllipse, 4}},
- {781, {wxGraphicsContext, drawIcon, 5}},
- {782, {wxGraphicsContext, drawLines, 3}},
- {783, {wxGraphicsContext, drawPath, 2}},
- {784, {wxGraphicsContext, drawRectangle, 4}},
- {785, {wxGraphicsContext, drawRoundedRectangle, 5}},
- {786, {wxGraphicsContext, drawText_3, 3}},
- {787, {wxGraphicsContext, drawText_4_0, 4}},
- {788, {wxGraphicsContext, drawText_4_1, 4}},
- {789, {wxGraphicsContext, drawText_5, 5}},
- {790, {wxGraphicsContext, fillPath, 2}},
- {791, {wxGraphicsContext, strokePath, 1}},
- {792, {wxGraphicsContext, getPartialTextExtents, 2}},
- {793, {wxGraphicsContext, getTextExtent, 5}},
- {794, {wxGraphicsContext, rotate, 1}},
- {795, {wxGraphicsContext, scale, 2}},
- {796, {wxGraphicsContext, translate, 2}},
- {797, {wxGraphicsContext, getTransform, 0}},
- {798, {wxGraphicsContext, setTransform, 1}},
- {799, {wxGraphicsContext, concatTransform, 1}},
- {800, {wxGraphicsContext, setBrush_1_1, 1}},
- {801, {wxGraphicsContext, setBrush_1_0, 1}},
- {802, {wxGraphicsContext, setFont_1, 1}},
- {803, {wxGraphicsContext, setFont_2, 2}},
- {804, {wxGraphicsContext, setPen_1_0, 1}},
- {805, {wxGraphicsContext, setPen_1_1, 1}},
- {806, {wxGraphicsContext, strokeLine, 4}},
- {807, {wxGraphicsContext, strokeLines, 2}},
- {809, {wxGraphicsMatrix, concat, 1}},
- {811, {wxGraphicsMatrix, get, 1}},
- {812, {wxGraphicsMatrix, invert, 0}},
- {813, {wxGraphicsMatrix, isEqual, 1}},
- {815, {wxGraphicsMatrix, isIdentity, 0}},
- {816, {wxGraphicsMatrix, rotate, 1}},
- {817, {wxGraphicsMatrix, scale, 2}},
- {818, {wxGraphicsMatrix, translate, 2}},
- {819, {wxGraphicsMatrix, set, 1}},
- {820, {wxGraphicsMatrix, transformPoint, 2}},
- {821, {wxGraphicsMatrix, transformDistance, 2}},
- {822, {wxGraphicsPath, moveToPoint_2, 2}},
- {823, {wxGraphicsPath, moveToPoint_1, 1}},
- {824, {wxGraphicsPath, addArc_6, 6}},
- {825, {wxGraphicsPath, addArc_5, 5}},
- {826, {wxGraphicsPath, addArcToPoint, 5}},
- {827, {wxGraphicsPath, addCircle, 3}},
- {828, {wxGraphicsPath, addCurveToPoint_6, 6}},
- {829, {wxGraphicsPath, addCurveToPoint_3, 3}},
- {830, {wxGraphicsPath, addEllipse, 4}},
- {831, {wxGraphicsPath, addLineToPoint_2, 2}},
- {832, {wxGraphicsPath, addLineToPoint_1, 1}},
- {833, {wxGraphicsPath, addPath, 1}},
- {834, {wxGraphicsPath, addQuadCurveToPoint, 4}},
- {835, {wxGraphicsPath, addRectangle, 4}},
- {836, {wxGraphicsPath, addRoundedRectangle, 5}},
- {837, {wxGraphicsPath, closeSubpath, 0}},
- {838, {wxGraphicsPath, contains_3, 3}},
- {839, {wxGraphicsPath, contains_2, 2}},
- {841, {wxGraphicsPath, getBox, 0}},
- {843, {wxGraphicsPath, getCurrentPoint, 0}},
- {844, {wxGraphicsPath, transform, 1}},
- {845, {wxGraphicsRenderer, getDefaultRenderer, 0}},
- {846, {wxGraphicsRenderer, createContext_1_1, 1}},
- {847, {wxGraphicsRenderer, createContext_1_0, 1}},
- {848, {wxGraphicsRenderer, createPen, 1}},
- {849, {wxGraphicsRenderer, createBrush, 1}},
- {850, {wxGraphicsRenderer, createLinearGradientBrush, 6}},
- {851, {wxGraphicsRenderer, createRadialGradientBrush, 7}},
- {852, {wxGraphicsRenderer, createFont, 2}},
- {853, {wxGraphicsRenderer, createMatrix, 1}},
- {854, {wxGraphicsRenderer, createPath, 0}},
- {856, {wxMenuBar, new_1, 1}},
- {858, {wxMenuBar, new_0, 0}},
- {860, {wxMenuBar, destruct, 0}},
- {861, {wxMenuBar, append, 2}},
- {862, {wxMenuBar, check, 2}},
- {863, {wxMenuBar, enable_2, 2}},
- {864, {wxMenuBar, enable_1, 1}},
- {865, {wxMenuBar, enableTop, 2}},
- {866, {wxMenuBar, findMenu, 1}},
- {867, {wxMenuBar, findMenuItem, 2}},
- {868, {wxMenuBar, findItem, 2}},
- {869, {wxMenuBar, getHelpString, 1}},
- {870, {wxMenuBar, getLabel_1, 1}},
- {871, {wxMenuBar, getLabel_0, 0}},
- {872, {wxMenuBar, getLabelTop, 1}},
- {873, {wxMenuBar, getMenu, 1}},
- {874, {wxMenuBar, getMenuCount, 0}},
- {875, {wxMenuBar, insert, 3}},
- {876, {wxMenuBar, isChecked, 1}},
- {877, {wxMenuBar, isEnabled_1, 1}},
- {878, {wxMenuBar, isEnabled_0, 0}},
- {879, {wxMenuBar, remove, 1}},
- {880, {wxMenuBar, replace, 3}},
- {881, {wxMenuBar, setHelpString, 2}},
- {882, {wxMenuBar, setLabel_2, 2}},
- {883, {wxMenuBar, setLabel_1, 1}},
- {884, {wxMenuBar, setLabelTop, 2}},
- {885, {wxControl, getLabel, 0}},
- {886, {wxControl, setLabel, 1}},
- {887, {wxControlWithItems, append_1, 1}},
- {888, {wxControlWithItems, append_2, 2}},
- {889, {wxControlWithItems, appendStrings_1, 1}},
- {890, {wxControlWithItems, clear, 0}},
- {891, {wxControlWithItems, delete, 1}},
- {892, {wxControlWithItems, findString, 2}},
- {893, {wxControlWithItems, getClientData, 1}},
- {894, {wxControlWithItems, setClientData, 2}},
- {895, {wxControlWithItems, getCount, 0}},
- {896, {wxControlWithItems, getSelection, 0}},
- {897, {wxControlWithItems, getString, 1}},
- {898, {wxControlWithItems, getStringSelection, 0}},
- {899, {wxControlWithItems, insert_2, 2}},
- {900, {wxControlWithItems, insert_3, 3}},
- {901, {wxControlWithItems, isEmpty, 0}},
- {902, {wxControlWithItems, select, 1}},
- {903, {wxControlWithItems, setSelection, 1}},
- {904, {wxControlWithItems, setString, 2}},
- {905, {wxControlWithItems, setStringSelection, 1}},
- {908, {wxMenu, new_2, 2}},
- {909, {wxMenu, new_1, 1}},
- {911, {wxMenu, destruct, 0}},
- {912, {wxMenu, append_3, 3}},
- {913, {wxMenu, append_1, 1}},
- {914, {wxMenu, append_4_0, 4}},
- {915, {wxMenu, append_4_1, 4}},
- {916, {wxMenu, appendCheckItem, 3}},
- {917, {wxMenu, appendRadioItem, 3}},
- {918, {wxMenu, appendSeparator, 0}},
- {919, {wxMenu, break, 0}},
- {920, {wxMenu, check, 2}},
- {921, {wxMenu, delete_1_0, 1}},
- {922, {wxMenu, delete_1_1, 1}},
- {923, {wxMenu, destroy_1_0, 1}},
- {924, {wxMenu, destroy_1_1, 1}},
- {925, {wxMenu, enable, 2}},
- {926, {wxMenu, findItem_1, 1}},
- {927, {wxMenu, findItem_2, 2}},
- {928, {wxMenu, findItemByPosition, 1}},
- {929, {wxMenu, getHelpString, 1}},
- {930, {wxMenu, getLabel, 1}},
- {931, {wxMenu, getMenuItemCount, 0}},
- {932, {wxMenu, getMenuItems, 0}},
- {934, {wxMenu, getTitle, 0}},
- {935, {wxMenu, insert_2, 2}},
- {936, {wxMenu, insert_3, 3}},
- {937, {wxMenu, insert_5_1, 5}},
- {938, {wxMenu, insert_5_0, 5}},
- {939, {wxMenu, insertCheckItem, 4}},
- {940, {wxMenu, insertRadioItem, 4}},
- {941, {wxMenu, insertSeparator, 1}},
- {942, {wxMenu, isChecked, 1}},
- {943, {wxMenu, isEnabled, 1}},
- {944, {wxMenu, prepend_1, 1}},
- {945, {wxMenu, prepend_2, 2}},
- {946, {wxMenu, prepend_4_1, 4}},
- {947, {wxMenu, prepend_4_0, 4}},
- {948, {wxMenu, prependCheckItem, 3}},
- {949, {wxMenu, prependRadioItem, 3}},
- {950, {wxMenu, prependSeparator, 0}},
- {951, {wxMenu, remove_1_0, 1}},
- {952, {wxMenu, remove_1_1, 1}},
- {953, {wxMenu, setHelpString, 2}},
- {954, {wxMenu, setLabel, 2}},
- {955, {wxMenu, setTitle, 1}},
- {956, {wxMenuItem, new, 1}},
- {958, {wxMenuItem, destruct, 0}},
- {959, {wxMenuItem, check, 1}},
- {960, {wxMenuItem, enable, 1}},
- {961, {wxMenuItem, getBitmap, 0}},
- {962, {wxMenuItem, getHelp, 0}},
- {963, {wxMenuItem, getId, 0}},
- {964, {wxMenuItem, getKind, 0}},
- {965, {wxMenuItem, getLabel, 0}},
- {966, {wxMenuItem, getLabelFromText, 1}},
- {967, {wxMenuItem, getMenu, 0}},
- {968, {wxMenuItem, getText, 0}},
- {969, {wxMenuItem, getSubMenu, 0}},
- {970, {wxMenuItem, isCheckable, 0}},
- {971, {wxMenuItem, isChecked, 0}},
- {972, {wxMenuItem, isEnabled, 0}},
- {973, {wxMenuItem, isSeparator, 0}},
- {974, {wxMenuItem, isSubMenu, 0}},
- {975, {wxMenuItem, setBitmap, 1}},
- {976, {wxMenuItem, setHelp, 1}},
- {977, {wxMenuItem, setMenu, 1}},
- {978, {wxMenuItem, setSubMenu, 1}},
- {979, {wxMenuItem, setText, 1}},
- {980, {wxToolBar, addControl, 1}},
- {981, {wxToolBar, addSeparator, 0}},
- {982, {wxToolBar, addTool_5, 5}},
- {983, {wxToolBar, addTool_4_0, 4}},
- {984, {wxToolBar, addTool_1, 1}},
- {985, {wxToolBar, addTool_4_1, 4}},
- {986, {wxToolBar, addTool_3, 3}},
- {987, {wxToolBar, addTool_6, 6}},
- {988, {wxToolBar, addCheckTool, 4}},
- {989, {wxToolBar, addRadioTool, 4}},
- {990, {wxToolBar, addStretchableSpace, 0}},
- {991, {wxToolBar, insertStretchableSpace, 1}},
- {992, {wxToolBar, deleteTool, 1}},
- {993, {wxToolBar, deleteToolByPos, 1}},
- {994, {wxToolBar, enableTool, 2}},
- {995, {wxToolBar, findById, 1}},
- {996, {wxToolBar, findControl, 1}},
- {997, {wxToolBar, findToolForPosition, 2}},
- {998, {wxToolBar, getToolSize, 0}},
- {999, {wxToolBar, getToolBitmapSize, 0}},
- {1000, {wxToolBar, getMargins, 0}},
- {1001, {wxToolBar, getToolEnabled, 1}},
- {1002, {wxToolBar, getToolLongHelp, 1}},
- {1003, {wxToolBar, getToolPacking, 0}},
- {1004, {wxToolBar, getToolPos, 1}},
- {1005, {wxToolBar, getToolSeparation, 0}},
- {1006, {wxToolBar, getToolShortHelp, 1}},
- {1007, {wxToolBar, getToolState, 1}},
- {1008, {wxToolBar, insertControl, 2}},
- {1009, {wxToolBar, insertSeparator, 1}},
- {1010, {wxToolBar, insertTool_5, 5}},
- {1011, {wxToolBar, insertTool_2, 2}},
- {1012, {wxToolBar, insertTool_4, 4}},
- {1013, {wxToolBar, realize, 0}},
- {1014, {wxToolBar, removeTool, 1}},
- {1015, {wxToolBar, setMargins, 2}},
- {1016, {wxToolBar, setToolBitmapSize, 1}},
- {1017, {wxToolBar, setToolLongHelp, 2}},
- {1018, {wxToolBar, setToolPacking, 1}},
- {1019, {wxToolBar, setToolShortHelp, 2}},
- {1020, {wxToolBar, setToolSeparation, 1}},
- {1021, {wxToolBar, toggleTool, 2}},
- {1023, {wxStatusBar, new_0, 0}},
- {1024, {wxStatusBar, new_2, 2}},
- {1026, {wxStatusBar, destruct, 0}},
- {1027, {wxStatusBar, create, 2}},
- {1028, {wxStatusBar, getFieldRect, 2}},
- {1029, {wxStatusBar, getFieldsCount, 0}},
- {1030, {wxStatusBar, getStatusText, 1}},
- {1031, {wxStatusBar, popStatusText, 1}},
- {1032, {wxStatusBar, pushStatusText, 2}},
- {1033, {wxStatusBar, setFieldsCount, 2}},
- {1034, {wxStatusBar, setMinHeight, 1}},
- {1035, {wxStatusBar, setStatusText, 2}},
- {1036, {wxStatusBar, setStatusWidths, 2}},
- {1037, {wxStatusBar, setStatusStyles, 2}},
- {1038, {wxBitmap, new_0, 0}},
- {1039, {wxBitmap, new_3, 3}},
- {1040, {wxBitmap, new_4, 4}},
- {1041, {wxBitmap, new_2_0, 2}},
- {1042, {wxBitmap, new_2_1, 2}},
- {1043, {wxBitmap, destruct, 0}},
- {1044, {wxBitmap, convertToImage, 0}},
- {1045, {wxBitmap, copyFromIcon, 1}},
- {1046, {wxBitmap, create, 3}},
- {1047, {wxBitmap, getDepth, 0}},
- {1048, {wxBitmap, getHeight, 0}},
- {1049, {wxBitmap, getPalette, 0}},
- {1050, {wxBitmap, getMask, 0}},
- {1051, {wxBitmap, getWidth, 0}},
- {1052, {wxBitmap, getSubBitmap, 1}},
- {1053, {wxBitmap, loadFile, 2}},
- {1054, {wxBitmap, ok, 0}},
- {1055, {wxBitmap, saveFile, 3}},
- {1056, {wxBitmap, setDepth, 1}},
- {1057, {wxBitmap, setHeight, 1}},
- {1058, {wxBitmap, setMask, 1}},
- {1059, {wxBitmap, setPalette, 1}},
- {1060, {wxBitmap, setWidth, 1}},
- {1061, {wxIcon, new_0, 0}},
- {1062, {wxIcon, new_2, 2}},
- {1063, {wxIcon, new_1, 1}},
- {1064, {wxIcon, copyFromBitmap, 1}},
- {1065, {wxIcon, 'Destroy', undefined}},
- {1066, {wxIconBundle, new_0, 0}},
- {1067, {wxIconBundle, new_2, 2}},
- {1068, {wxIconBundle, new_1_0, 1}},
- {1069, {wxIconBundle, new_1_1, 1}},
- {1070, {wxIconBundle, destruct, 0}},
- {1071, {wxIconBundle, addIcon_2, 2}},
- {1072, {wxIconBundle, addIcon_1, 1}},
- {1073, {wxIconBundle, getIcon_1_1, 1}},
- {1074, {wxIconBundle, getIcon_1_0, 1}},
- {1075, {wxCursor, new_0, 0}},
- {1076, {wxCursor, new_1_0, 1}},
- {1077, {wxCursor, new_1_1, 1}},
- {1078, {wxCursor, new_4, 4}},
- {1079, {wxCursor, destruct, 0}},
- {1080, {wxCursor, ok, 0}},
- {1081, {wxMask, new_0, 0}},
- {1082, {wxMask, new_2_1, 2}},
- {1083, {wxMask, new_2_0, 2}},
- {1084, {wxMask, new_1, 1}},
- {1085, {wxMask, destruct, 0}},
- {1086, {wxMask, create_2_1, 2}},
- {1087, {wxMask, create_2_0, 2}},
- {1088, {wxMask, create_1, 1}},
- {1089, {wxImage, new_0, 0}},
- {1090, {wxImage, new_3_0, 3}},
- {1091, {wxImage, new_4, 4}},
- {1092, {wxImage, new_5, 5}},
- {1093, {wxImage, new_2, 2}},
- {1094, {wxImage, new_3_1, 3}},
- {1095, {wxImage, blur, 1}},
- {1096, {wxImage, blurHorizontal, 1}},
- {1097, {wxImage, blurVertical, 1}},
- {1098, {wxImage, convertAlphaToMask, 1}},
- {1099, {wxImage, convertToGreyscale, 1}},
- {1100, {wxImage, convertToMono, 3}},
- {1101, {wxImage, copy, 0}},
- {1102, {wxImage, create_3, 3}},
- {1103, {wxImage, create_4, 4}},
- {1104, {wxImage, create_5, 5}},
- {1105, {wxImage, 'Destroy', 0}},
- {1106, {wxImage, findFirstUnusedColour, 4}},
- {1107, {wxImage, getImageExtWildcard, 0}},
- {1108, {wxImage, getAlpha_2, 2}},
- {1109, {wxImage, getAlpha_0, 0}},
- {1110, {wxImage, getBlue, 2}},
- {1111, {wxImage, getData, 0}},
- {1112, {wxImage, getGreen, 2}},
- {1113, {wxImage, getImageCount, 2}},
- {1114, {wxImage, getHeight, 0}},
- {1115, {wxImage, getMaskBlue, 0}},
- {1116, {wxImage, getMaskGreen, 0}},
- {1117, {wxImage, getMaskRed, 0}},
- {1118, {wxImage, getOrFindMaskColour, 3}},
- {1119, {wxImage, getPalette, 0}},
- {1120, {wxImage, getRed, 2}},
- {1121, {wxImage, getSubImage, 1}},
- {1122, {wxImage, getWidth, 0}},
- {1123, {wxImage, hasAlpha, 0}},
- {1124, {wxImage, hasMask, 0}},
- {1125, {wxImage, getOption, 1}},
- {1126, {wxImage, getOptionInt, 1}},
- {1127, {wxImage, hasOption, 1}},
- {1128, {wxImage, initAlpha, 0}},
- {1129, {wxImage, initStandardHandlers, 0}},
- {1130, {wxImage, isTransparent, 3}},
- {1131, {wxImage, loadFile_2, 2}},
- {1132, {wxImage, loadFile_3, 3}},
- {1133, {wxImage, ok, 0}},
- {1134, {wxImage, removeHandler, 1}},
- {1135, {wxImage, mirror, 1}},
- {1136, {wxImage, replace, 6}},
- {1137, {wxImage, rescale, 3}},
- {1138, {wxImage, resize, 3}},
- {1139, {wxImage, rotate, 3}},
- {1140, {wxImage, rotateHue, 1}},
- {1141, {wxImage, rotate90, 1}},
- {1142, {wxImage, saveFile_1, 1}},
- {1143, {wxImage, saveFile_2_0, 2}},
- {1144, {wxImage, saveFile_2_1, 2}},
- {1145, {wxImage, scale, 3}},
- {1146, {wxImage, size, 3}},
- {1147, {wxImage, setAlpha_3, 3}},
- {1148, {wxImage, setAlpha_2, 2}},
- {1149, {wxImage, setData_2, 2}},
- {1150, {wxImage, setData_4, 4}},
- {1151, {wxImage, setMask, 1}},
- {1152, {wxImage, setMaskColour, 3}},
- {1153, {wxImage, setMaskFromImage, 4}},
- {1154, {wxImage, setOption_2_1, 2}},
- {1155, {wxImage, setOption_2_0, 2}},
- {1156, {wxImage, setPalette, 1}},
- {1157, {wxImage, setRGB_5, 5}},
- {1158, {wxImage, setRGB_4, 4}},
- {1159, {wxImage, 'Destroy', undefined}},
- {1160, {wxBrush, new_0, 0}},
- {1161, {wxBrush, new_2, 2}},
- {1162, {wxBrush, new_1, 1}},
- {1164, {wxBrush, destruct, 0}},
- {1165, {wxBrush, getColour, 0}},
- {1166, {wxBrush, getStipple, 0}},
- {1167, {wxBrush, getStyle, 0}},
- {1168, {wxBrush, isHatch, 0}},
- {1169, {wxBrush, isOk, 0}},
- {1170, {wxBrush, setColour_1, 1}},
- {1171, {wxBrush, setColour_3, 3}},
- {1172, {wxBrush, setStipple, 1}},
- {1173, {wxBrush, setStyle, 1}},
- {1174, {wxPen, new_0, 0}},
- {1175, {wxPen, new_2, 2}},
- {1176, {wxPen, destruct, 0}},
- {1177, {wxPen, getCap, 0}},
- {1178, {wxPen, getColour, 0}},
- {1179, {wxPen, getJoin, 0}},
- {1180, {wxPen, getStyle, 0}},
- {1181, {wxPen, getWidth, 0}},
- {1182, {wxPen, isOk, 0}},
- {1183, {wxPen, setCap, 1}},
- {1184, {wxPen, setColour_1, 1}},
- {1185, {wxPen, setColour_3, 3}},
- {1186, {wxPen, setJoin, 1}},
- {1187, {wxPen, setStyle, 1}},
- {1188, {wxPen, setWidth, 1}},
- {1189, {wxRegion, new_0, 0}},
- {1190, {wxRegion, new_4, 4}},
- {1191, {wxRegion, new_2, 2}},
- {1192, {wxRegion, new_1_1, 1}},
- {1194, {wxRegion, new_1_0, 1}},
- {1196, {wxRegion, destruct, 0}},
- {1197, {wxRegion, clear, 0}},
- {1198, {wxRegion, contains_2, 2}},
- {1199, {wxRegion, contains_1_0, 1}},
- {1200, {wxRegion, contains_4, 4}},
- {1201, {wxRegion, contains_1_1, 1}},
- {1202, {wxRegion, convertToBitmap, 0}},
- {1203, {wxRegion, getBox, 0}},
- {1204, {wxRegion, intersect_4, 4}},
- {1205, {wxRegion, intersect_1_1, 1}},
- {1206, {wxRegion, intersect_1_0, 1}},
- {1207, {wxRegion, isEmpty, 0}},
- {1208, {wxRegion, subtract_4, 4}},
- {1209, {wxRegion, subtract_1_1, 1}},
- {1210, {wxRegion, subtract_1_0, 1}},
- {1211, {wxRegion, offset_2, 2}},
- {1212, {wxRegion, offset_1, 1}},
- {1213, {wxRegion, union_4, 4}},
- {1214, {wxRegion, union_1_2, 1}},
- {1215, {wxRegion, union_1_1, 1}},
- {1216, {wxRegion, union_1_0, 1}},
- {1217, {wxRegion, union_3, 3}},
- {1218, {wxRegion, xor_4, 4}},
- {1219, {wxRegion, xor_1_1, 1}},
- {1220, {wxRegion, xor_1_0, 1}},
- {1221, {wxAcceleratorTable, new_0, 0}},
- {1222, {wxAcceleratorTable, new_2, 2}},
- {1223, {wxAcceleratorTable, destruct, 0}},
- {1224, {wxAcceleratorTable, ok, 0}},
- {1225, {wxAcceleratorEntry, new_1_0, 1}},
- {1226, {wxAcceleratorEntry, new_1_1, 1}},
- {1227, {wxAcceleratorEntry, getCommand, 0}},
- {1228, {wxAcceleratorEntry, getFlags, 0}},
- {1229, {wxAcceleratorEntry, getKeyCode, 0}},
- {1230, {wxAcceleratorEntry, set, 4}},
- {1231, {wxAcceleratorEntry, 'Destroy', undefined}},
- {1236, {wxCaret, new_3, 3}},
- {1237, {wxCaret, new_2, 2}},
- {1239, {wxCaret, destruct, 0}},
- {1240, {wxCaret, create_3, 3}},
- {1241, {wxCaret, create_2, 2}},
- {1242, {wxCaret, getBlinkTime, 0}},
- {1244, {wxCaret, getPosition, 0}},
- {1246, {wxCaret, getSize, 0}},
- {1247, {wxCaret, getWindow, 0}},
- {1248, {wxCaret, hide, 0}},
- {1249, {wxCaret, isOk, 0}},
- {1250, {wxCaret, isVisible, 0}},
- {1251, {wxCaret, move_2, 2}},
- {1252, {wxCaret, move_1, 1}},
- {1253, {wxCaret, setBlinkTime, 1}},
- {1254, {wxCaret, setSize_2, 2}},
- {1255, {wxCaret, setSize_1, 1}},
- {1256, {wxCaret, show, 1}},
- {1257, {wxSizer, add_2_1, 2}},
- {1258, {wxSizer, add_2_0, 2}},
- {1259, {wxSizer, add_3, 3}},
- {1260, {wxSizer, add_2_3, 2}},
- {1261, {wxSizer, add_2_2, 2}},
- {1262, {wxSizer, addSpacer, 1}},
- {1263, {wxSizer, addStretchSpacer, 1}},
- {1264, {wxSizer, calcMin, 0}},
- {1265, {wxSizer, clear, 1}},
- {1266, {wxSizer, detach_1_2, 1}},
- {1267, {wxSizer, detach_1_1, 1}},
- {1268, {wxSizer, detach_1_0, 1}},
- {1269, {wxSizer, fit, 1}},
- {1270, {wxSizer, fitInside, 1}},
- {1271, {wxSizer, getChildren, 0}},
- {1272, {wxSizer, getItem_2_1, 2}},
- {1273, {wxSizer, getItem_2_0, 2}},
- {1274, {wxSizer, getItem_1, 1}},
- {1275, {wxSizer, getSize, 0}},
- {1276, {wxSizer, getPosition, 0}},
- {1277, {wxSizer, getMinSize, 0}},
- {1278, {wxSizer, hide_2_0, 2}},
- {1279, {wxSizer, hide_2_1, 2}},
- {1280, {wxSizer, hide_1, 1}},
- {1281, {wxSizer, insert_3_1, 3}},
- {1282, {wxSizer, insert_3_0, 3}},
- {1283, {wxSizer, insert_4, 4}},
- {1284, {wxSizer, insert_3_3, 3}},
- {1285, {wxSizer, insert_3_2, 3}},
- {1286, {wxSizer, insert_2, 2}},
- {1287, {wxSizer, insertSpacer, 2}},
- {1288, {wxSizer, insertStretchSpacer, 2}},
- {1289, {wxSizer, isShown_1_2, 1}},
- {1290, {wxSizer, isShown_1_1, 1}},
- {1291, {wxSizer, isShown_1_0, 1}},
- {1292, {wxSizer, layout, 0}},
- {1293, {wxSizer, prepend_2_1, 2}},
- {1294, {wxSizer, prepend_2_0, 2}},
- {1295, {wxSizer, prepend_3, 3}},
- {1296, {wxSizer, prepend_2_3, 2}},
- {1297, {wxSizer, prepend_2_2, 2}},
- {1298, {wxSizer, prepend_1, 1}},
- {1299, {wxSizer, prependSpacer, 1}},
- {1300, {wxSizer, prependStretchSpacer, 1}},
- {1301, {wxSizer, recalcSizes, 0}},
- {1302, {wxSizer, remove_1_1, 1}},
- {1303, {wxSizer, remove_1_0, 1}},
- {1304, {wxSizer, replace_3_1, 3}},
- {1305, {wxSizer, replace_3_0, 3}},
- {1306, {wxSizer, replace_2, 2}},
- {1307, {wxSizer, setDimension, 4}},
- {1308, {wxSizer, setMinSize_2, 2}},
- {1309, {wxSizer, setMinSize_1, 1}},
- {1310, {wxSizer, setItemMinSize_3_2, 3}},
- {1311, {wxSizer, setItemMinSize_2_2, 2}},
- {1312, {wxSizer, setItemMinSize_3_1, 3}},
- {1313, {wxSizer, setItemMinSize_2_1, 2}},
- {1314, {wxSizer, setItemMinSize_3_0, 3}},
- {1315, {wxSizer, setItemMinSize_2_0, 2}},
- {1316, {wxSizer, setSizeHints, 1}},
- {1317, {wxSizer, setVirtualSizeHints, 1}},
- {1318, {wxSizer, show_2_2, 2}},
- {1319, {wxSizer, show_2_1, 2}},
- {1320, {wxSizer, show_2_0, 2}},
- {1321, {wxSizer, show_1, 1}},
- {1322, {wxSizerFlags, new, 1}},
- {1323, {wxSizerFlags, align, 1}},
- {1324, {wxSizerFlags, border_2, 2}},
- {1325, {wxSizerFlags, border_1, 1}},
- {1326, {wxSizerFlags, center, 0}},
- {1327, {wxSizerFlags, centre, 0}},
- {1328, {wxSizerFlags, expand, 0}},
- {1329, {wxSizerFlags, left, 0}},
- {1330, {wxSizerFlags, proportion, 1}},
- {1331, {wxSizerFlags, right, 0}},
- {1332, {wxSizerFlags, 'Destroy', undefined}},
- {1333, {wxSizerItem, new_5_1, 5}},
- {1334, {wxSizerItem, new_2_1, 2}},
- {1335, {wxSizerItem, new_5_0, 5}},
- {1336, {wxSizerItem, new_2_0, 2}},
- {1337, {wxSizerItem, new_6, 6}},
- {1338, {wxSizerItem, new_3, 3}},
- {1339, {wxSizerItem, new_0, 0}},
- {1340, {wxSizerItem, destruct, 0}},
- {1341, {wxSizerItem, calcMin, 0}},
- {1342, {wxSizerItem, deleteWindows, 0}},
- {1343, {wxSizerItem, detachSizer, 0}},
- {1344, {wxSizerItem, getBorder, 0}},
- {1345, {wxSizerItem, getFlag, 0}},
- {1346, {wxSizerItem, getMinSize, 0}},
- {1347, {wxSizerItem, getPosition, 0}},
- {1348, {wxSizerItem, getProportion, 0}},
- {1349, {wxSizerItem, getRatio, 0}},
- {1350, {wxSizerItem, getRect, 0}},
- {1351, {wxSizerItem, getSize, 0}},
- {1352, {wxSizerItem, getSizer, 0}},
- {1353, {wxSizerItem, getSpacer, 0}},
- {1354, {wxSizerItem, getUserData, 0}},
- {1355, {wxSizerItem, getWindow, 0}},
- {1356, {wxSizerItem, isSizer, 0}},
- {1357, {wxSizerItem, isShown, 0}},
- {1358, {wxSizerItem, isSpacer, 0}},
- {1359, {wxSizerItem, isWindow, 0}},
- {1360, {wxSizerItem, setBorder, 1}},
- {1361, {wxSizerItem, setDimension, 2}},
- {1362, {wxSizerItem, setFlag, 1}},
- {1363, {wxSizerItem, setInitSize, 2}},
- {1364, {wxSizerItem, setMinSize_1, 1}},
- {1365, {wxSizerItem, setMinSize_2, 2}},
- {1366, {wxSizerItem, setProportion, 1}},
- {1367, {wxSizerItem, setRatio_2, 2}},
- {1368, {wxSizerItem, setRatio_1_1, 1}},
- {1369, {wxSizerItem, setRatio_1_0, 1}},
- {1370, {wxSizerItem, setSizer, 1}},
- {1371, {wxSizerItem, setSpacer_1, 1}},
- {1372, {wxSizerItem, setSpacer_2, 2}},
- {1373, {wxSizerItem, setWindow, 1}},
- {1374, {wxSizerItem, show, 1}},
- {1375, {wxBoxSizer, new, 1}},
- {1376, {wxBoxSizer, getOrientation, 0}},
- {1377, {wxBoxSizer, 'Destroy', undefined}},
- {1378, {wxStaticBoxSizer, new_2, 2}},
- {1379, {wxStaticBoxSizer, new_3, 3}},
- {1380, {wxStaticBoxSizer, getStaticBox, 0}},
- {1381, {wxStaticBoxSizer, 'Destroy', undefined}},
- {1382, {wxGridSizer, new_4, 4}},
- {1383, {wxGridSizer, new_2, 2}},
- {1384, {wxGridSizer, getCols, 0}},
- {1385, {wxGridSizer, getHGap, 0}},
- {1386, {wxGridSizer, getRows, 0}},
- {1387, {wxGridSizer, getVGap, 0}},
- {1388, {wxGridSizer, setCols, 1}},
- {1389, {wxGridSizer, setHGap, 1}},
- {1390, {wxGridSizer, setRows, 1}},
- {1391, {wxGridSizer, setVGap, 1}},
- {1392, {wxGridSizer, 'Destroy', undefined}},
- {1393, {wxFlexGridSizer, new_4, 4}},
- {1394, {wxFlexGridSizer, new_2, 2}},
- {1395, {wxFlexGridSizer, addGrowableCol, 2}},
- {1396, {wxFlexGridSizer, addGrowableRow, 2}},
- {1397, {wxFlexGridSizer, getFlexibleDirection, 0}},
- {1398, {wxFlexGridSizer, getNonFlexibleGrowMode, 0}},
- {1399, {wxFlexGridSizer, removeGrowableCol, 1}},
- {1400, {wxFlexGridSizer, removeGrowableRow, 1}},
- {1401, {wxFlexGridSizer, setFlexibleDirection, 1}},
- {1402, {wxFlexGridSizer, setNonFlexibleGrowMode, 1}},
- {1403, {wxFlexGridSizer, 'Destroy', undefined}},
- {1404, {wxGridBagSizer, new, 1}},
- {1405, {wxGridBagSizer, add_3_2, 3}},
- {1406, {wxGridBagSizer, add_3_1, 3}},
- {1407, {wxGridBagSizer, add_4, 4}},
- {1408, {wxGridBagSizer, add_1_0, 1}},
- {1409, {wxGridBagSizer, add_2_1, 2}},
- {1410, {wxGridBagSizer, add_2_0, 2}},
- {1411, {wxGridBagSizer, add_3_0, 3}},
- {1412, {wxGridBagSizer, add_1_1, 1}},
- {1413, {wxGridBagSizer, calcMin, 0}},
- {1414, {wxGridBagSizer, checkForIntersection_2, 2}},
- {1415, {wxGridBagSizer, checkForIntersection_3, 3}},
- {1416, {wxGridBagSizer, findItem_1_1, 1}},
- {1417, {wxGridBagSizer, findItem_1_0, 1}},
- {1418, {wxGridBagSizer, findItemAtPoint, 1}},
- {1419, {wxGridBagSizer, findItemAtPosition, 1}},
- {1420, {wxGridBagSizer, findItemWithData, 1}},
- {1421, {wxGridBagSizer, getCellSize, 2}},
- {1422, {wxGridBagSizer, getEmptyCellSize, 0}},
- {1423, {wxGridBagSizer, getItemPosition_1_2, 1}},
- {1424, {wxGridBagSizer, getItemPosition_1_1, 1}},
- {1425, {wxGridBagSizer, getItemPosition_1_0, 1}},
- {1426, {wxGridBagSizer, getItemSpan_1_2, 1}},
- {1427, {wxGridBagSizer, getItemSpan_1_1, 1}},
- {1428, {wxGridBagSizer, getItemSpan_1_0, 1}},
- {1429, {wxGridBagSizer, setEmptyCellSize, 1}},
- {1430, {wxGridBagSizer, setItemPosition_2_2, 2}},
- {1431, {wxGridBagSizer, setItemPosition_2_1, 2}},
- {1432, {wxGridBagSizer, setItemPosition_2_0, 2}},
- {1433, {wxGridBagSizer, setItemSpan_2_2, 2}},
- {1434, {wxGridBagSizer, setItemSpan_2_1, 2}},
- {1435, {wxGridBagSizer, setItemSpan_2_0, 2}},
- {1436, {wxGridBagSizer, 'Destroy', undefined}},
- {1437, {wxStdDialogButtonSizer, new, 0}},
- {1438, {wxStdDialogButtonSizer, addButton, 1}},
- {1439, {wxStdDialogButtonSizer, realize, 0}},
- {1440, {wxStdDialogButtonSizer, setAffirmativeButton, 1}},
- {1441, {wxStdDialogButtonSizer, setCancelButton, 1}},
- {1442, {wxStdDialogButtonSizer, setNegativeButton, 1}},
- {1443, {wxStdDialogButtonSizer, 'Destroy', undefined}},
- {1444, {wxFont, new_0, 0}},
- {1445, {wxFont, new_1, 1}},
- {1446, {wxFont, new_5, 5}},
- {1448, {wxFont, destruct, 0}},
- {1449, {wxFont, isFixedWidth, 0}},
- {1450, {wxFont, getDefaultEncoding, 0}},
- {1451, {wxFont, getFaceName, 0}},
- {1452, {wxFont, getFamily, 0}},
- {1453, {wxFont, getNativeFontInfoDesc, 0}},
- {1454, {wxFont, getNativeFontInfoUserDesc, 0}},
- {1455, {wxFont, getPointSize, 0}},
- {1456, {wxFont, getStyle, 0}},
- {1457, {wxFont, getUnderlined, 0}},
- {1458, {wxFont, getWeight, 0}},
- {1459, {wxFont, ok, 0}},
- {1460, {wxFont, setDefaultEncoding, 1}},
- {1461, {wxFont, setFaceName, 1}},
- {1462, {wxFont, setFamily, 1}},
- {1463, {wxFont, setPointSize, 1}},
- {1464, {wxFont, setStyle, 1}},
- {1465, {wxFont, setUnderlined, 1}},
- {1466, {wxFont, setWeight, 1}},
- {1467, {wxToolTip, enable, 1}},
- {1468, {wxToolTip, setDelay, 1}},
- {1469, {wxToolTip, new, 1}},
- {1470, {wxToolTip, setTip, 1}},
- {1471, {wxToolTip, getTip, 0}},
- {1472, {wxToolTip, getWindow, 0}},
- {1473, {wxToolTip, 'Destroy', undefined}},
- {1475, {wxButton, new_3, 3}},
- {1476, {wxButton, new_0, 0}},
- {1477, {wxButton, destruct, 0}},
- {1478, {wxButton, create, 3}},
- {1479, {wxButton, getDefaultSize, 0}},
- {1480, {wxButton, setDefault, 0}},
- {1481, {wxButton, setLabel, 1}},
- {1483, {wxBitmapButton, new_4, 4}},
- {1484, {wxBitmapButton, new_0, 0}},
- {1485, {wxBitmapButton, create, 4}},
- {1486, {wxBitmapButton, getBitmapDisabled, 0}},
- {1488, {wxBitmapButton, getBitmapFocus, 0}},
- {1490, {wxBitmapButton, getBitmapLabel, 0}},
- {1492, {wxBitmapButton, getBitmapSelected, 0}},
- {1494, {wxBitmapButton, setBitmapDisabled, 1}},
- {1495, {wxBitmapButton, setBitmapFocus, 1}},
- {1496, {wxBitmapButton, setBitmapLabel, 1}},
- {1497, {wxBitmapButton, setBitmapSelected, 1}},
- {1498, {wxBitmapButton, 'Destroy', undefined}},
- {1499, {wxToggleButton, new_0, 0}},
- {1500, {wxToggleButton, new_4, 4}},
- {1501, {wxToggleButton, create, 4}},
- {1502, {wxToggleButton, getValue, 0}},
- {1503, {wxToggleButton, setValue, 1}},
- {1504, {wxToggleButton, 'Destroy', undefined}},
- {1505, {wxCalendarCtrl, new_0, 0}},
- {1506, {wxCalendarCtrl, new_3, 3}},
- {1507, {wxCalendarCtrl, create, 3}},
- {1508, {wxCalendarCtrl, destruct, 0}},
- {1509, {wxCalendarCtrl, setDate, 1}},
- {1510, {wxCalendarCtrl, getDate, 0}},
- {1511, {wxCalendarCtrl, enableYearChange, 1}},
- {1512, {wxCalendarCtrl, enableMonthChange, 1}},
- {1513, {wxCalendarCtrl, enableHolidayDisplay, 1}},
- {1514, {wxCalendarCtrl, setHeaderColours, 2}},
- {1515, {wxCalendarCtrl, getHeaderColourFg, 0}},
- {1516, {wxCalendarCtrl, getHeaderColourBg, 0}},
- {1517, {wxCalendarCtrl, setHighlightColours, 2}},
- {1518, {wxCalendarCtrl, getHighlightColourFg, 0}},
- {1519, {wxCalendarCtrl, getHighlightColourBg, 0}},
- {1520, {wxCalendarCtrl, setHolidayColours, 2}},
- {1521, {wxCalendarCtrl, getHolidayColourFg, 0}},
- {1522, {wxCalendarCtrl, getHolidayColourBg, 0}},
- {1523, {wxCalendarCtrl, getAttr, 1}},
- {1524, {wxCalendarCtrl, setAttr, 2}},
- {1525, {wxCalendarCtrl, setHoliday, 1}},
- {1526, {wxCalendarCtrl, resetAttr, 1}},
- {1527, {wxCalendarCtrl, hitTest, 2}},
- {1528, {wxCalendarDateAttr, new_0, 0}},
- {1529, {wxCalendarDateAttr, new_2_1, 2}},
- {1530, {wxCalendarDateAttr, new_2_0, 2}},
- {1531, {wxCalendarDateAttr, setTextColour, 1}},
- {1532, {wxCalendarDateAttr, setBackgroundColour, 1}},
- {1533, {wxCalendarDateAttr, setBorderColour, 1}},
- {1534, {wxCalendarDateAttr, setFont, 1}},
- {1535, {wxCalendarDateAttr, setBorder, 1}},
- {1536, {wxCalendarDateAttr, setHoliday, 1}},
- {1537, {wxCalendarDateAttr, hasTextColour, 0}},
- {1538, {wxCalendarDateAttr, hasBackgroundColour, 0}},
- {1539, {wxCalendarDateAttr, hasBorderColour, 0}},
- {1540, {wxCalendarDateAttr, hasFont, 0}},
- {1541, {wxCalendarDateAttr, hasBorder, 0}},
- {1542, {wxCalendarDateAttr, isHoliday, 0}},
- {1543, {wxCalendarDateAttr, getTextColour, 0}},
- {1544, {wxCalendarDateAttr, getBackgroundColour, 0}},
- {1545, {wxCalendarDateAttr, getBorderColour, 0}},
- {1546, {wxCalendarDateAttr, getFont, 0}},
- {1547, {wxCalendarDateAttr, getBorder, 0}},
- {1548, {wxCalendarDateAttr, 'Destroy', undefined}},
- {1550, {wxCheckBox, new_4, 4}},
- {1551, {wxCheckBox, new_0, 0}},
- {1552, {wxCheckBox, create, 4}},
- {1553, {wxCheckBox, getValue, 0}},
- {1554, {wxCheckBox, get3StateValue, 0}},
- {1555, {wxCheckBox, is3rdStateAllowedForUser, 0}},
- {1556, {wxCheckBox, is3State, 0}},
- {1557, {wxCheckBox, isChecked, 0}},
- {1558, {wxCheckBox, setValue, 1}},
- {1559, {wxCheckBox, set3StateValue, 1}},
- {1560, {wxCheckBox, 'Destroy', undefined}},
- {1561, {wxCheckListBox, new_0, 0}},
- {1563, {wxCheckListBox, new_3, 3}},
- {1564, {wxCheckListBox, check, 2}},
- {1565, {wxCheckListBox, isChecked, 1}},
- {1566, {wxCheckListBox, 'Destroy', undefined}},
- {1569, {wxChoice, new_3, 3}},
- {1570, {wxChoice, new_0, 0}},
- {1572, {wxChoice, destruct, 0}},
- {1574, {wxChoice, create, 6}},
- {1575, {wxChoice, delete, 1}},
- {1576, {wxChoice, getColumns, 0}},
- {1577, {wxChoice, setColumns, 1}},
- {1578, {wxComboBox, new_0, 0}},
- {1580, {wxComboBox, new_3, 3}},
- {1581, {wxComboBox, destruct, 0}},
- {1583, {wxComboBox, create, 7}},
- {1584, {wxComboBox, canCopy, 0}},
- {1585, {wxComboBox, canCut, 0}},
- {1586, {wxComboBox, canPaste, 0}},
- {1587, {wxComboBox, canRedo, 0}},
- {1588, {wxComboBox, canUndo, 0}},
- {1589, {wxComboBox, copy, 0}},
- {1590, {wxComboBox, cut, 0}},
- {1591, {wxComboBox, getInsertionPoint, 0}},
- {1592, {wxComboBox, getLastPosition, 0}},
- {1593, {wxComboBox, getValue, 0}},
- {1594, {wxComboBox, paste, 0}},
- {1595, {wxComboBox, redo, 0}},
- {1596, {wxComboBox, replace, 3}},
- {1597, {wxComboBox, remove, 2}},
- {1598, {wxComboBox, setInsertionPoint, 1}},
- {1599, {wxComboBox, setInsertionPointEnd, 0}},
- {1600, {wxComboBox, setSelection_1, 1}},
- {1601, {wxComboBox, setSelection_2, 2}},
- {1602, {wxComboBox, setValue, 1}},
- {1603, {wxComboBox, undo, 0}},
- {1604, {wxGauge, new_0, 0}},
- {1605, {wxGauge, new_4, 4}},
- {1606, {wxGauge, create, 4}},
- {1607, {wxGauge, getRange, 0}},
- {1608, {wxGauge, getValue, 0}},
- {1609, {wxGauge, isVertical, 0}},
- {1610, {wxGauge, setRange, 1}},
- {1611, {wxGauge, setValue, 1}},
- {1612, {wxGauge, pulse, 0}},
- {1613, {wxGauge, 'Destroy', undefined}},
- {1614, {wxGenericDirCtrl, new_0, 0}},
- {1615, {wxGenericDirCtrl, new_2, 2}},
- {1616, {wxGenericDirCtrl, destruct, 0}},
- {1617, {wxGenericDirCtrl, create, 2}},
- {1618, {wxGenericDirCtrl, init, 0}},
- {1619, {wxGenericDirCtrl, collapseTree, 0}},
- {1620, {wxGenericDirCtrl, expandPath, 1}},
- {1621, {wxGenericDirCtrl, getDefaultPath, 0}},
- {1622, {wxGenericDirCtrl, getPath, 0}},
- {1623, {wxGenericDirCtrl, getFilePath, 0}},
- {1624, {wxGenericDirCtrl, getFilter, 0}},
- {1625, {wxGenericDirCtrl, getFilterIndex, 0}},
- {1626, {wxGenericDirCtrl, getRootId, 0}},
- {1627, {wxGenericDirCtrl, getTreeCtrl, 0}},
- {1628, {wxGenericDirCtrl, reCreateTree, 0}},
- {1629, {wxGenericDirCtrl, setDefaultPath, 1}},
- {1630, {wxGenericDirCtrl, setFilter, 1}},
- {1631, {wxGenericDirCtrl, setFilterIndex, 1}},
- {1632, {wxGenericDirCtrl, setPath, 1}},
- {1634, {wxStaticBox, new_4, 4}},
- {1635, {wxStaticBox, new_0, 0}},
- {1636, {wxStaticBox, create, 4}},
- {1637, {wxStaticBox, 'Destroy', undefined}},
- {1639, {wxStaticLine, new_2, 2}},
- {1640, {wxStaticLine, new_0, 0}},
- {1641, {wxStaticLine, destruct, 0}},
- {1642, {wxStaticLine, create, 2}},
- {1643, {wxStaticLine, isVertical, 0}},
- {1644, {wxStaticLine, getDefaultSize, 0}},
- {1647, {wxListBox, new_3, 3}},
- {1648, {wxListBox, new_0, 0}},
- {1650, {wxListBox, destruct, 0}},
- {1652, {wxListBox, create, 6}},
- {1653, {wxListBox, deselect, 1}},
- {1654, {wxListBox, getSelections, 1}},
- {1655, {wxListBox, insertItems, 2}},
- {1656, {wxListBox, isSelected, 1}},
- {1657, {wxListBox, set, 1}},
- {1658, {wxListBox, hitTest, 1}},
- {1659, {wxListBox, setFirstItem_1_0, 1}},
- {1660, {wxListBox, setFirstItem_1_1, 1}},
- {1661, {wxListCtrl, new_0, 0}},
- {1662, {wxListCtrl, new_2, 2}},
- {1663, {wxListCtrl, arrange, 1}},
- {1664, {wxListCtrl, assignImageList, 2}},
- {1665, {wxListCtrl, clearAll, 0}},
- {1666, {wxListCtrl, create, 2}},
- {1667, {wxListCtrl, deleteAllItems, 0}},
- {1668, {wxListCtrl, deleteColumn, 1}},
- {1669, {wxListCtrl, deleteItem, 1}},
- {1670, {wxListCtrl, editLabel, 1}},
- {1671, {wxListCtrl, ensureVisible, 1}},
- {1672, {wxListCtrl, findItem_3_0, 3}},
- {1673, {wxListCtrl, findItem_3_1, 3}},
- {1674, {wxListCtrl, getColumn, 2}},
- {1675, {wxListCtrl, getColumnCount, 0}},
- {1676, {wxListCtrl, getColumnWidth, 1}},
- {1677, {wxListCtrl, getCountPerPage, 0}},
- {1678, {wxListCtrl, getEditControl, 0}},
- {1679, {wxListCtrl, getImageList, 1}},
- {1680, {wxListCtrl, getItem, 1}},
- {1681, {wxListCtrl, getItemBackgroundColour, 1}},
- {1682, {wxListCtrl, getItemCount, 0}},
- {1683, {wxListCtrl, getItemData, 1}},
- {1684, {wxListCtrl, getItemFont, 1}},
- {1685, {wxListCtrl, getItemPosition, 2}},
- {1686, {wxListCtrl, getItemRect, 3}},
- {1687, {wxListCtrl, getItemSpacing, 0}},
- {1688, {wxListCtrl, getItemState, 2}},
- {1689, {wxListCtrl, getItemText, 1}},
- {1690, {wxListCtrl, getItemTextColour, 1}},
- {1691, {wxListCtrl, getNextItem, 2}},
- {1692, {wxListCtrl, getSelectedItemCount, 0}},
- {1693, {wxListCtrl, getTextColour, 0}},
- {1694, {wxListCtrl, getTopItem, 0}},
- {1695, {wxListCtrl, getViewRect, 0}},
- {1696, {wxListCtrl, hitTest, 3}},
- {1697, {wxListCtrl, insertColumn_2, 2}},
- {1698, {wxListCtrl, insertColumn_3, 3}},
- {1699, {wxListCtrl, insertItem_1, 1}},
- {1700, {wxListCtrl, insertItem_2_1, 2}},
- {1701, {wxListCtrl, insertItem_2_0, 2}},
- {1702, {wxListCtrl, insertItem_3, 3}},
- {1703, {wxListCtrl, refreshItem, 1}},
- {1704, {wxListCtrl, refreshItems, 2}},
- {1705, {wxListCtrl, scrollList, 2}},
- {1706, {wxListCtrl, setBackgroundColour, 1}},
- {1707, {wxListCtrl, setColumn, 2}},
- {1708, {wxListCtrl, setColumnWidth, 2}},
- {1709, {wxListCtrl, setImageList, 2}},
- {1710, {wxListCtrl, setItem_1, 1}},
- {1711, {wxListCtrl, setItem_4, 4}},
- {1712, {wxListCtrl, setItemBackgroundColour, 2}},
- {1713, {wxListCtrl, setItemCount, 1}},
- {1714, {wxListCtrl, setItemData, 2}},
- {1715, {wxListCtrl, setItemFont, 2}},
- {1716, {wxListCtrl, setItemImage, 3}},
- {1717, {wxListCtrl, setItemColumnImage, 3}},
- {1718, {wxListCtrl, setItemPosition, 2}},
- {1719, {wxListCtrl, setItemState, 3}},
- {1720, {wxListCtrl, setItemText, 2}},
- {1721, {wxListCtrl, setItemTextColour, 2}},
- {1722, {wxListCtrl, setSingleStyle, 2}},
- {1723, {wxListCtrl, setTextColour, 1}},
- {1724, {wxListCtrl, setWindowStyleFlag, 1}},
- {1725, {wxListCtrl, sortItems, 2}},
- {1726, {wxListCtrl, 'Destroy', undefined}},
- {1727, {wxListView, clearColumnImage, 1}},
- {1728, {wxListView, focus, 1}},
- {1729, {wxListView, getFirstSelected, 0}},
- {1730, {wxListView, getFocusedItem, 0}},
- {1731, {wxListView, getNextSelected, 1}},
- {1732, {wxListView, isSelected, 1}},
- {1733, {wxListView, select, 2}},
- {1734, {wxListView, setColumnImage, 2}},
- {1735, {wxListItem, new_0, 0}},
- {1736, {wxListItem, new_1, 1}},
- {1737, {wxListItem, destruct, 0}},
- {1738, {wxListItem, clear, 0}},
- {1739, {wxListItem, getAlign, 0}},
- {1740, {wxListItem, getBackgroundColour, 0}},
- {1741, {wxListItem, getColumn, 0}},
- {1742, {wxListItem, getFont, 0}},
- {1743, {wxListItem, getId, 0}},
- {1744, {wxListItem, getImage, 0}},
- {1745, {wxListItem, getMask, 0}},
- {1746, {wxListItem, getState, 0}},
- {1747, {wxListItem, getText, 0}},
- {1748, {wxListItem, getTextColour, 0}},
- {1749, {wxListItem, getWidth, 0}},
- {1750, {wxListItem, setAlign, 1}},
- {1751, {wxListItem, setBackgroundColour, 1}},
- {1752, {wxListItem, setColumn, 1}},
- {1753, {wxListItem, setFont, 1}},
- {1754, {wxListItem, setId, 1}},
- {1755, {wxListItem, setImage, 1}},
- {1756, {wxListItem, setMask, 1}},
- {1757, {wxListItem, setState, 1}},
- {1758, {wxListItem, setStateMask, 1}},
- {1759, {wxListItem, setText, 1}},
- {1760, {wxListItem, setTextColour, 1}},
- {1761, {wxListItem, setWidth, 1}},
- {1762, {wxListItemAttr, new_0, 0}},
- {1763, {wxListItemAttr, new_3, 3}},
- {1764, {wxListItemAttr, getBackgroundColour, 0}},
- {1765, {wxListItemAttr, getFont, 0}},
- {1766, {wxListItemAttr, getTextColour, 0}},
- {1767, {wxListItemAttr, hasBackgroundColour, 0}},
- {1768, {wxListItemAttr, hasFont, 0}},
- {1769, {wxListItemAttr, hasTextColour, 0}},
- {1770, {wxListItemAttr, setBackgroundColour, 1}},
- {1771, {wxListItemAttr, setFont, 1}},
- {1772, {wxListItemAttr, setTextColour, 1}},
- {1773, {wxListItemAttr, 'Destroy', undefined}},
- {1774, {wxImageList, new_0, 0}},
- {1775, {wxImageList, new_3, 3}},
- {1776, {wxImageList, add_1, 1}},
- {1777, {wxImageList, add_2_0, 2}},
- {1778, {wxImageList, add_2_1, 2}},
- {1779, {wxImageList, create, 3}},
- {1781, {wxImageList, draw, 5}},
- {1782, {wxImageList, getBitmap, 1}},
- {1783, {wxImageList, getIcon, 1}},
- {1784, {wxImageList, getImageCount, 0}},
- {1785, {wxImageList, getSize, 3}},
- {1786, {wxImageList, remove, 1}},
- {1787, {wxImageList, removeAll, 0}},
- {1788, {wxImageList, replace_2, 2}},
- {1789, {wxImageList, replace_3, 3}},
- {1790, {wxImageList, 'Destroy', undefined}},
- {1791, {wxTextAttr, new_0, 0}},
- {1792, {wxTextAttr, new_2, 2}},
- {1793, {wxTextAttr, getAlignment, 0}},
- {1794, {wxTextAttr, getBackgroundColour, 0}},
- {1795, {wxTextAttr, getFont, 0}},
- {1796, {wxTextAttr, getLeftIndent, 0}},
- {1797, {wxTextAttr, getLeftSubIndent, 0}},
- {1798, {wxTextAttr, getRightIndent, 0}},
- {1799, {wxTextAttr, getTabs, 0}},
- {1800, {wxTextAttr, getTextColour, 0}},
- {1801, {wxTextAttr, hasBackgroundColour, 0}},
- {1802, {wxTextAttr, hasFont, 0}},
- {1803, {wxTextAttr, hasTextColour, 0}},
- {1804, {wxTextAttr, getFlags, 0}},
- {1805, {wxTextAttr, isDefault, 0}},
- {1806, {wxTextAttr, setAlignment, 1}},
- {1807, {wxTextAttr, setBackgroundColour, 1}},
- {1808, {wxTextAttr, setFlags, 1}},
- {1809, {wxTextAttr, setFont, 2}},
- {1810, {wxTextAttr, setLeftIndent, 2}},
- {1811, {wxTextAttr, setRightIndent, 1}},
- {1812, {wxTextAttr, setTabs, 1}},
- {1813, {wxTextAttr, setTextColour, 1}},
- {1814, {wxTextAttr, 'Destroy', undefined}},
- {1816, {wxTextCtrl, new_3, 3}},
- {1817, {wxTextCtrl, new_0, 0}},
- {1819, {wxTextCtrl, destruct, 0}},
- {1820, {wxTextCtrl, appendText, 1}},
- {1821, {wxTextCtrl, canCopy, 0}},
- {1822, {wxTextCtrl, canCut, 0}},
- {1823, {wxTextCtrl, canPaste, 0}},
- {1824, {wxTextCtrl, canRedo, 0}},
- {1825, {wxTextCtrl, canUndo, 0}},
- {1826, {wxTextCtrl, clear, 0}},
- {1827, {wxTextCtrl, copy, 0}},
- {1828, {wxTextCtrl, create, 3}},
- {1829, {wxTextCtrl, cut, 0}},
- {1830, {wxTextCtrl, discardEdits, 0}},
- {1831, {wxTextCtrl, changeValue, 1}},
- {1832, {wxTextCtrl, emulateKeyPress, 1}},
- {1833, {wxTextCtrl, getDefaultStyle, 0}},
- {1834, {wxTextCtrl, getInsertionPoint, 0}},
- {1835, {wxTextCtrl, getLastPosition, 0}},
- {1836, {wxTextCtrl, getLineLength, 1}},
- {1837, {wxTextCtrl, getLineText, 1}},
- {1838, {wxTextCtrl, getNumberOfLines, 0}},
- {1839, {wxTextCtrl, getRange, 2}},
- {1840, {wxTextCtrl, getSelection, 2}},
- {1841, {wxTextCtrl, getStringSelection, 0}},
- {1842, {wxTextCtrl, getStyle, 2}},
- {1843, {wxTextCtrl, getValue, 0}},
- {1844, {wxTextCtrl, isEditable, 0}},
- {1845, {wxTextCtrl, isModified, 0}},
- {1846, {wxTextCtrl, isMultiLine, 0}},
- {1847, {wxTextCtrl, isSingleLine, 0}},
- {1848, {wxTextCtrl, loadFile, 2}},
- {1849, {wxTextCtrl, markDirty, 0}},
- {1850, {wxTextCtrl, paste, 0}},
- {1851, {wxTextCtrl, positionToXY, 3}},
- {1852, {wxTextCtrl, redo, 0}},
- {1853, {wxTextCtrl, remove, 2}},
- {1854, {wxTextCtrl, replace, 3}},
- {1855, {wxTextCtrl, saveFile, 1}},
- {1856, {wxTextCtrl, setDefaultStyle, 1}},
- {1857, {wxTextCtrl, setEditable, 1}},
- {1858, {wxTextCtrl, setInsertionPoint, 1}},
- {1859, {wxTextCtrl, setInsertionPointEnd, 0}},
- {1861, {wxTextCtrl, setMaxLength, 1}},
- {1862, {wxTextCtrl, setSelection, 2}},
- {1863, {wxTextCtrl, setStyle, 3}},
- {1864, {wxTextCtrl, setValue, 1}},
- {1865, {wxTextCtrl, showPosition, 1}},
- {1866, {wxTextCtrl, undo, 0}},
- {1867, {wxTextCtrl, writeText, 1}},
- {1868, {wxTextCtrl, xYToPosition, 2}},
- {1871, {wxNotebook, new_0, 0}},
- {1872, {wxNotebook, new_3, 3}},
- {1873, {wxNotebook, destruct, 0}},
- {1874, {wxNotebook, addPage, 3}},
- {1875, {wxNotebook, advanceSelection, 1}},
- {1876, {wxNotebook, assignImageList, 1}},
- {1877, {wxNotebook, create, 3}},
- {1878, {wxNotebook, deleteAllPages, 0}},
- {1879, {wxNotebook, deletePage, 1}},
- {1880, {wxNotebook, removePage, 1}},
- {1881, {wxNotebook, getCurrentPage, 0}},
- {1882, {wxNotebook, getImageList, 0}},
- {1884, {wxNotebook, getPage, 1}},
- {1885, {wxNotebook, getPageCount, 0}},
- {1886, {wxNotebook, getPageImage, 1}},
- {1887, {wxNotebook, getPageText, 1}},
- {1888, {wxNotebook, getRowCount, 0}},
- {1889, {wxNotebook, getSelection, 0}},
- {1890, {wxNotebook, getThemeBackgroundColour, 0}},
- {1892, {wxNotebook, hitTest, 2}},
- {1894, {wxNotebook, insertPage, 4}},
- {1895, {wxNotebook, setImageList, 1}},
- {1896, {wxNotebook, setPadding, 1}},
- {1897, {wxNotebook, setPageSize, 1}},
- {1898, {wxNotebook, setPageImage, 2}},
- {1899, {wxNotebook, setPageText, 2}},
- {1900, {wxNotebook, setSelection, 1}},
- {1901, {wxNotebook, changeSelection, 1}},
- {1902, {wxChoicebook, new_0, 0}},
- {1903, {wxChoicebook, new_3, 3}},
- {1904, {wxChoicebook, addPage, 3}},
- {1905, {wxChoicebook, advanceSelection, 1}},
- {1906, {wxChoicebook, assignImageList, 1}},
- {1907, {wxChoicebook, create, 3}},
- {1908, {wxChoicebook, deleteAllPages, 0}},
- {1909, {wxChoicebook, deletePage, 1}},
- {1910, {wxChoicebook, removePage, 1}},
- {1911, {wxChoicebook, getCurrentPage, 0}},
- {1912, {wxChoicebook, getImageList, 0}},
- {1914, {wxChoicebook, getPage, 1}},
- {1915, {wxChoicebook, getPageCount, 0}},
- {1916, {wxChoicebook, getPageImage, 1}},
- {1917, {wxChoicebook, getPageText, 1}},
- {1918, {wxChoicebook, getSelection, 0}},
- {1919, {wxChoicebook, hitTest, 2}},
- {1920, {wxChoicebook, insertPage, 4}},
- {1921, {wxChoicebook, setImageList, 1}},
- {1922, {wxChoicebook, setPageSize, 1}},
- {1923, {wxChoicebook, setPageImage, 2}},
- {1924, {wxChoicebook, setPageText, 2}},
- {1925, {wxChoicebook, setSelection, 1}},
- {1926, {wxChoicebook, changeSelection, 1}},
- {1927, {wxChoicebook, 'Destroy', undefined}},
- {1928, {wxToolbook, new_0, 0}},
- {1929, {wxToolbook, new_3, 3}},
- {1930, {wxToolbook, addPage, 3}},
- {1931, {wxToolbook, advanceSelection, 1}},
- {1932, {wxToolbook, assignImageList, 1}},
- {1933, {wxToolbook, create, 3}},
- {1934, {wxToolbook, deleteAllPages, 0}},
- {1935, {wxToolbook, deletePage, 1}},
- {1936, {wxToolbook, removePage, 1}},
- {1937, {wxToolbook, getCurrentPage, 0}},
- {1938, {wxToolbook, getImageList, 0}},
- {1940, {wxToolbook, getPage, 1}},
- {1941, {wxToolbook, getPageCount, 0}},
- {1942, {wxToolbook, getPageImage, 1}},
- {1943, {wxToolbook, getPageText, 1}},
- {1944, {wxToolbook, getSelection, 0}},
- {1946, {wxToolbook, hitTest, 2}},
- {1947, {wxToolbook, insertPage, 4}},
- {1948, {wxToolbook, setImageList, 1}},
- {1949, {wxToolbook, setPageSize, 1}},
- {1950, {wxToolbook, setPageImage, 2}},
- {1951, {wxToolbook, setPageText, 2}},
- {1952, {wxToolbook, setSelection, 1}},
- {1953, {wxToolbook, changeSelection, 1}},
- {1954, {wxToolbook, 'Destroy', undefined}},
- {1955, {wxListbook, new_0, 0}},
- {1956, {wxListbook, new_3, 3}},
- {1957, {wxListbook, addPage, 3}},
- {1958, {wxListbook, advanceSelection, 1}},
- {1959, {wxListbook, assignImageList, 1}},
- {1960, {wxListbook, create, 3}},
- {1961, {wxListbook, deleteAllPages, 0}},
- {1962, {wxListbook, deletePage, 1}},
- {1963, {wxListbook, removePage, 1}},
- {1964, {wxListbook, getCurrentPage, 0}},
- {1965, {wxListbook, getImageList, 0}},
- {1967, {wxListbook, getPage, 1}},
- {1968, {wxListbook, getPageCount, 0}},
- {1969, {wxListbook, getPageImage, 1}},
- {1970, {wxListbook, getPageText, 1}},
- {1971, {wxListbook, getSelection, 0}},
- {1973, {wxListbook, hitTest, 2}},
- {1974, {wxListbook, insertPage, 4}},
- {1975, {wxListbook, setImageList, 1}},
- {1976, {wxListbook, setPageSize, 1}},
- {1977, {wxListbook, setPageImage, 2}},
- {1978, {wxListbook, setPageText, 2}},
- {1979, {wxListbook, setSelection, 1}},
- {1980, {wxListbook, changeSelection, 1}},
- {1981, {wxListbook, 'Destroy', undefined}},
- {1982, {wxTreebook, new_0, 0}},
- {1983, {wxTreebook, new_3, 3}},
- {1984, {wxTreebook, addPage, 3}},
- {1985, {wxTreebook, advanceSelection, 1}},
- {1986, {wxTreebook, assignImageList, 1}},
- {1987, {wxTreebook, create, 3}},
- {1988, {wxTreebook, deleteAllPages, 0}},
- {1989, {wxTreebook, deletePage, 1}},
- {1990, {wxTreebook, removePage, 1}},
- {1991, {wxTreebook, getCurrentPage, 0}},
- {1992, {wxTreebook, getImageList, 0}},
- {1994, {wxTreebook, getPage, 1}},
- {1995, {wxTreebook, getPageCount, 0}},
- {1996, {wxTreebook, getPageImage, 1}},
- {1997, {wxTreebook, getPageText, 1}},
- {1998, {wxTreebook, getSelection, 0}},
- {1999, {wxTreebook, expandNode, 2}},
- {2000, {wxTreebook, isNodeExpanded, 1}},
- {2002, {wxTreebook, hitTest, 2}},
- {2003, {wxTreebook, insertPage, 4}},
- {2004, {wxTreebook, insertSubPage, 4}},
- {2005, {wxTreebook, setImageList, 1}},
- {2006, {wxTreebook, setPageSize, 1}},
- {2007, {wxTreebook, setPageImage, 2}},
- {2008, {wxTreebook, setPageText, 2}},
- {2009, {wxTreebook, setSelection, 1}},
- {2010, {wxTreebook, changeSelection, 1}},
- {2011, {wxTreebook, 'Destroy', undefined}},
- {2014, {wxTreeCtrl, new_2, 2}},
- {2015, {wxTreeCtrl, new_0, 0}},
- {2017, {wxTreeCtrl, destruct, 0}},
- {2018, {wxTreeCtrl, addRoot, 2}},
- {2019, {wxTreeCtrl, appendItem, 3}},
- {2020, {wxTreeCtrl, assignImageList, 1}},
- {2021, {wxTreeCtrl, assignStateImageList, 1}},
- {2022, {wxTreeCtrl, collapse, 1}},
- {2023, {wxTreeCtrl, collapseAndReset, 1}},
- {2024, {wxTreeCtrl, create, 2}},
- {2025, {wxTreeCtrl, delete, 1}},
- {2026, {wxTreeCtrl, deleteAllItems, 0}},
- {2027, {wxTreeCtrl, deleteChildren, 1}},
- {2028, {wxTreeCtrl, editLabel, 1}},
- {2029, {wxTreeCtrl, ensureVisible, 1}},
- {2030, {wxTreeCtrl, expand, 1}},
- {2031, {wxTreeCtrl, getBoundingRect, 3}},
- {2033, {wxTreeCtrl, getChildrenCount, 2}},
- {2034, {wxTreeCtrl, getCount, 0}},
- {2035, {wxTreeCtrl, getEditControl, 0}},
- {2036, {wxTreeCtrl, getFirstChild, 2}},
- {2037, {wxTreeCtrl, getNextChild, 2}},
- {2038, {wxTreeCtrl, getFirstVisibleItem, 0}},
- {2039, {wxTreeCtrl, getImageList, 0}},
- {2040, {wxTreeCtrl, getIndent, 0}},
- {2041, {wxTreeCtrl, getItemBackgroundColour, 1}},
- {2042, {wxTreeCtrl, getItemData, 1}},
- {2043, {wxTreeCtrl, getItemFont, 1}},
- {2044, {wxTreeCtrl, getItemImage_1, 1}},
- {2045, {wxTreeCtrl, getItemImage_2, 2}},
- {2046, {wxTreeCtrl, getItemText, 1}},
- {2047, {wxTreeCtrl, getItemTextColour, 1}},
- {2048, {wxTreeCtrl, getLastChild, 1}},
- {2049, {wxTreeCtrl, getNextSibling, 1}},
- {2050, {wxTreeCtrl, getNextVisible, 1}},
- {2051, {wxTreeCtrl, getItemParent, 1}},
- {2052, {wxTreeCtrl, getPrevSibling, 1}},
- {2053, {wxTreeCtrl, getPrevVisible, 1}},
- {2054, {wxTreeCtrl, getRootItem, 0}},
- {2055, {wxTreeCtrl, getSelection, 0}},
- {2056, {wxTreeCtrl, getSelections, 1}},
- {2057, {wxTreeCtrl, getStateImageList, 0}},
- {2058, {wxTreeCtrl, hitTest, 2}},
- {2060, {wxTreeCtrl, insertItem, 4}},
- {2061, {wxTreeCtrl, isBold, 1}},
- {2062, {wxTreeCtrl, isExpanded, 1}},
- {2063, {wxTreeCtrl, isSelected, 1}},
- {2064, {wxTreeCtrl, isVisible, 1}},
- {2065, {wxTreeCtrl, itemHasChildren, 1}},
- {2066, {wxTreeCtrl, isTreeItemIdOk, 1}},
- {2067, {wxTreeCtrl, prependItem, 3}},
- {2068, {wxTreeCtrl, scrollTo, 1}},
- {2069, {wxTreeCtrl, selectItem_1, 1}},
- {2070, {wxTreeCtrl, selectItem_2, 2}},
- {2071, {wxTreeCtrl, setIndent, 1}},
- {2072, {wxTreeCtrl, setImageList, 1}},
- {2073, {wxTreeCtrl, setItemBackgroundColour, 2}},
- {2074, {wxTreeCtrl, setItemBold, 2}},
- {2075, {wxTreeCtrl, setItemData, 2}},
- {2076, {wxTreeCtrl, setItemDropHighlight, 2}},
- {2077, {wxTreeCtrl, setItemFont, 2}},
- {2078, {wxTreeCtrl, setItemHasChildren, 2}},
- {2079, {wxTreeCtrl, setItemImage_2, 2}},
- {2080, {wxTreeCtrl, setItemImage_3, 3}},
- {2081, {wxTreeCtrl, setItemText, 2}},
- {2082, {wxTreeCtrl, setItemTextColour, 2}},
- {2083, {wxTreeCtrl, setStateImageList, 1}},
- {2084, {wxTreeCtrl, setWindowStyle, 1}},
- {2085, {wxTreeCtrl, sortChildren, 1}},
- {2086, {wxTreeCtrl, toggle, 1}},
- {2087, {wxTreeCtrl, toggleItemSelection, 1}},
- {2088, {wxTreeCtrl, unselect, 0}},
- {2089, {wxTreeCtrl, unselectAll, 0}},
- {2090, {wxTreeCtrl, unselectItem, 1}},
- {2091, {wxScrollBar, new_0, 0}},
- {2092, {wxScrollBar, new_3, 3}},
- {2093, {wxScrollBar, destruct, 0}},
- {2094, {wxScrollBar, create, 3}},
- {2095, {wxScrollBar, getRange, 0}},
- {2096, {wxScrollBar, getPageSize, 0}},
- {2097, {wxScrollBar, getThumbPosition, 0}},
- {2098, {wxScrollBar, getThumbSize, 0}},
- {2099, {wxScrollBar, setThumbPosition, 1}},
- {2100, {wxScrollBar, setScrollbar, 5}},
- {2102, {wxSpinButton, new_2, 2}},
- {2103, {wxSpinButton, new_0, 0}},
- {2104, {wxSpinButton, create, 2}},
- {2105, {wxSpinButton, getMax, 0}},
- {2106, {wxSpinButton, getMin, 0}},
- {2107, {wxSpinButton, getValue, 0}},
- {2108, {wxSpinButton, setRange, 2}},
- {2109, {wxSpinButton, setValue, 1}},
- {2110, {wxSpinButton, 'Destroy', undefined}},
- {2111, {wxSpinCtrl, new_0, 0}},
- {2112, {wxSpinCtrl, new_2, 2}},
- {2114, {wxSpinCtrl, create, 2}},
- {2117, {wxSpinCtrl, setValue_1_1, 1}},
- {2118, {wxSpinCtrl, setValue_1_0, 1}},
- {2120, {wxSpinCtrl, getValue, 0}},
- {2122, {wxSpinCtrl, setRange, 2}},
- {2123, {wxSpinCtrl, setSelection, 2}},
- {2125, {wxSpinCtrl, getMin, 0}},
- {2127, {wxSpinCtrl, getMax, 0}},
- {2128, {wxSpinCtrl, 'Destroy', undefined}},
- {2129, {wxStaticText, new_0, 0}},
- {2130, {wxStaticText, new_4, 4}},
- {2131, {wxStaticText, create, 4}},
- {2132, {wxStaticText, getLabel, 0}},
- {2133, {wxStaticText, setLabel, 1}},
- {2134, {wxStaticText, wrap, 1}},
- {2135, {wxStaticText, 'Destroy', undefined}},
- {2136, {wxStaticBitmap, new_0, 0}},
- {2137, {wxStaticBitmap, new_4, 4}},
- {2138, {wxStaticBitmap, create, 4}},
- {2139, {wxStaticBitmap, getBitmap, 0}},
- {2140, {wxStaticBitmap, setBitmap, 1}},
- {2141, {wxStaticBitmap, 'Destroy', undefined}},
- {2142, {wxRadioBox, new, 7}},
- {2144, {wxRadioBox, destruct, 0}},
- {2145, {wxRadioBox, create, 7}},
- {2146, {wxRadioBox, enable_2, 2}},
- {2147, {wxRadioBox, enable_1, 1}},
- {2148, {wxRadioBox, getSelection, 0}},
- {2149, {wxRadioBox, getString, 1}},
- {2150, {wxRadioBox, setSelection, 1}},
- {2151, {wxRadioBox, show_2, 2}},
- {2152, {wxRadioBox, show_1, 1}},
- {2153, {wxRadioBox, getColumnCount, 0}},
- {2154, {wxRadioBox, getItemHelpText, 1}},
- {2155, {wxRadioBox, getItemToolTip, 1}},
- {2157, {wxRadioBox, getItemFromPoint, 1}},
- {2158, {wxRadioBox, getRowCount, 0}},
- {2159, {wxRadioBox, isItemEnabled, 1}},
- {2160, {wxRadioBox, isItemShown, 1}},
- {2161, {wxRadioBox, setItemHelpText, 2}},
- {2162, {wxRadioBox, setItemToolTip, 2}},
- {2163, {wxRadioButton, new_0, 0}},
- {2164, {wxRadioButton, new_4, 4}},
- {2165, {wxRadioButton, create, 4}},
- {2166, {wxRadioButton, getValue, 0}},
- {2167, {wxRadioButton, setValue, 1}},
- {2168, {wxRadioButton, 'Destroy', undefined}},
- {2170, {wxSlider, new_6, 6}},
- {2171, {wxSlider, new_0, 0}},
- {2172, {wxSlider, create, 6}},
- {2173, {wxSlider, getLineSize, 0}},
- {2174, {wxSlider, getMax, 0}},
- {2175, {wxSlider, getMin, 0}},
- {2176, {wxSlider, getPageSize, 0}},
- {2177, {wxSlider, getThumbLength, 0}},
- {2178, {wxSlider, getValue, 0}},
- {2179, {wxSlider, setLineSize, 1}},
- {2180, {wxSlider, setPageSize, 1}},
- {2181, {wxSlider, setRange, 2}},
- {2182, {wxSlider, setThumbLength, 1}},
- {2183, {wxSlider, setValue, 1}},
- {2184, {wxSlider, 'Destroy', undefined}},
- {2186, {wxDialog, new_4, 4}},
- {2187, {wxDialog, new_0, 0}},
- {2189, {wxDialog, destruct, 0}},
- {2190, {wxDialog, create, 4}},
- {2191, {wxDialog, createButtonSizer, 1}},
- {2192, {wxDialog, createStdDialogButtonSizer, 1}},
- {2193, {wxDialog, endModal, 1}},
- {2194, {wxDialog, getAffirmativeId, 0}},
- {2195, {wxDialog, getReturnCode, 0}},
- {2196, {wxDialog, isModal, 0}},
- {2197, {wxDialog, setAffirmativeId, 1}},
- {2198, {wxDialog, setReturnCode, 1}},
- {2199, {wxDialog, show, 1}},
- {2200, {wxDialog, showModal, 0}},
- {2201, {wxColourDialog, new_0, 0}},
- {2202, {wxColourDialog, new_2, 2}},
- {2203, {wxColourDialog, destruct, 0}},
- {2204, {wxColourDialog, create, 2}},
- {2205, {wxColourDialog, getColourData, 0}},
- {2206, {wxColourData, new_0, 0}},
- {2207, {wxColourData, new_1, 1}},
- {2208, {wxColourData, destruct, 0}},
- {2209, {wxColourData, getChooseFull, 0}},
- {2210, {wxColourData, getColour, 0}},
- {2212, {wxColourData, getCustomColour, 1}},
- {2213, {wxColourData, setChooseFull, 1}},
- {2214, {wxColourData, setColour, 1}},
- {2215, {wxColourData, setCustomColour, 2}},
- {2216, {wxPalette, new_0, 0}},
- {2217, {wxPalette, new_4, 4}},
- {2219, {wxPalette, destruct, 0}},
- {2220, {wxPalette, create, 4}},
- {2221, {wxPalette, getColoursCount, 0}},
- {2222, {wxPalette, getPixel, 3}},
- {2223, {wxPalette, getRGB, 4}},
- {2224, {wxPalette, isOk, 0}},
- {2228, {wxDirDialog, new, 2}},
- {2229, {wxDirDialog, destruct, 0}},
- {2230, {wxDirDialog, getPath, 0}},
- {2231, {wxDirDialog, getMessage, 0}},
- {2232, {wxDirDialog, setMessage, 1}},
- {2233, {wxDirDialog, setPath, 1}},
- {2237, {wxFileDialog, new, 2}},
- {2238, {wxFileDialog, destruct, 0}},
- {2239, {wxFileDialog, getDirectory, 0}},
- {2240, {wxFileDialog, getFilename, 0}},
- {2241, {wxFileDialog, getFilenames, 1}},
- {2242, {wxFileDialog, getFilterIndex, 0}},
- {2243, {wxFileDialog, getMessage, 0}},
- {2244, {wxFileDialog, getPath, 0}},
- {2245, {wxFileDialog, getPaths, 1}},
- {2246, {wxFileDialog, getWildcard, 0}},
- {2247, {wxFileDialog, setDirectory, 1}},
- {2248, {wxFileDialog, setFilename, 1}},
- {2249, {wxFileDialog, setFilterIndex, 1}},
- {2250, {wxFileDialog, setMessage, 1}},
- {2251, {wxFileDialog, setPath, 1}},
- {2252, {wxFileDialog, setWildcard, 1}},
- {2253, {wxPickerBase, setInternalMargin, 1}},
- {2254, {wxPickerBase, getInternalMargin, 0}},
- {2255, {wxPickerBase, setTextCtrlProportion, 1}},
- {2256, {wxPickerBase, setPickerCtrlProportion, 1}},
- {2257, {wxPickerBase, getTextCtrlProportion, 0}},
- {2258, {wxPickerBase, getPickerCtrlProportion, 0}},
- {2259, {wxPickerBase, hasTextCtrl, 0}},
- {2260, {wxPickerBase, getTextCtrl, 0}},
- {2261, {wxPickerBase, isTextCtrlGrowable, 0}},
- {2262, {wxPickerBase, setPickerCtrlGrowable, 1}},
- {2263, {wxPickerBase, setTextCtrlGrowable, 1}},
- {2264, {wxPickerBase, isPickerCtrlGrowable, 0}},
- {2265, {wxFilePickerCtrl, new_0, 0}},
- {2266, {wxFilePickerCtrl, new_3, 3}},
- {2267, {wxFilePickerCtrl, create, 3}},
- {2268, {wxFilePickerCtrl, getPath, 0}},
- {2269, {wxFilePickerCtrl, setPath, 1}},
- {2270, {wxFilePickerCtrl, 'Destroy', undefined}},
- {2271, {wxDirPickerCtrl, new_0, 0}},
- {2272, {wxDirPickerCtrl, new_3, 3}},
- {2273, {wxDirPickerCtrl, create, 3}},
- {2274, {wxDirPickerCtrl, getPath, 0}},
- {2275, {wxDirPickerCtrl, setPath, 1}},
- {2276, {wxDirPickerCtrl, 'Destroy', undefined}},
- {2277, {wxColourPickerCtrl, new_0, 0}},
- {2278, {wxColourPickerCtrl, new_3, 3}},
- {2279, {wxColourPickerCtrl, create, 3}},
- {2280, {wxColourPickerCtrl, getColour, 0}},
- {2281, {wxColourPickerCtrl, setColour_1_1, 1}},
- {2282, {wxColourPickerCtrl, setColour_1_0, 1}},
- {2283, {wxColourPickerCtrl, 'Destroy', undefined}},
- {2284, {wxDatePickerCtrl, new_0, 0}},
- {2285, {wxDatePickerCtrl, new_3, 3}},
- {2286, {wxDatePickerCtrl, getRange, 2}},
- {2287, {wxDatePickerCtrl, getValue, 0}},
- {2288, {wxDatePickerCtrl, setRange, 2}},
- {2289, {wxDatePickerCtrl, setValue, 1}},
- {2290, {wxDatePickerCtrl, 'Destroy', undefined}},
- {2291, {wxFontPickerCtrl, new_0, 0}},
- {2292, {wxFontPickerCtrl, new_3, 3}},
- {2293, {wxFontPickerCtrl, create, 3}},
- {2294, {wxFontPickerCtrl, getSelectedFont, 0}},
- {2295, {wxFontPickerCtrl, setSelectedFont, 1}},
- {2296, {wxFontPickerCtrl, getMaxPointSize, 0}},
- {2297, {wxFontPickerCtrl, setMaxPointSize, 1}},
- {2298, {wxFontPickerCtrl, 'Destroy', undefined}},
- {2301, {wxFindReplaceDialog, new_0, 0}},
- {2302, {wxFindReplaceDialog, new_4, 4}},
- {2303, {wxFindReplaceDialog, destruct, 0}},
- {2304, {wxFindReplaceDialog, create, 4}},
- {2305, {wxFindReplaceDialog, getData, 0}},
- {2306, {wxFindReplaceData, new_0, 0}},
- {2307, {wxFindReplaceData, new_1, 1}},
- {2308, {wxFindReplaceData, getFindString, 0}},
- {2309, {wxFindReplaceData, getReplaceString, 0}},
- {2310, {wxFindReplaceData, getFlags, 0}},
- {2311, {wxFindReplaceData, setFlags, 1}},
- {2312, {wxFindReplaceData, setFindString, 1}},
- {2313, {wxFindReplaceData, setReplaceString, 1}},
- {2314, {wxFindReplaceData, 'Destroy', undefined}},
- {2315, {wxMultiChoiceDialog, new_0, 0}},
- {2317, {wxMultiChoiceDialog, new_5, 5}},
- {2318, {wxMultiChoiceDialog, getSelections, 0}},
- {2319, {wxMultiChoiceDialog, setSelections, 1}},
- {2320, {wxMultiChoiceDialog, 'Destroy', undefined}},
- {2321, {wxSingleChoiceDialog, new_0, 0}},
- {2323, {wxSingleChoiceDialog, new_5, 5}},
- {2324, {wxSingleChoiceDialog, getSelection, 0}},
- {2325, {wxSingleChoiceDialog, getStringSelection, 0}},
- {2326, {wxSingleChoiceDialog, setSelection, 1}},
- {2327, {wxSingleChoiceDialog, 'Destroy', undefined}},
- {2328, {wxTextEntryDialog, new, 3}},
- {2329, {wxTextEntryDialog, getValue, 0}},
- {2330, {wxTextEntryDialog, setValue, 1}},
- {2331, {wxTextEntryDialog, 'Destroy', undefined}},
- {2332, {wxPasswordEntryDialog, new, 3}},
- {2333, {wxPasswordEntryDialog, 'Destroy', undefined}},
- {2334, {wxFontData, new_0, 0}},
- {2335, {wxFontData, new_1, 1}},
- {2336, {wxFontData, destruct, 0}},
- {2337, {wxFontData, enableEffects, 1}},
- {2338, {wxFontData, getAllowSymbols, 0}},
- {2339, {wxFontData, getColour, 0}},
- {2340, {wxFontData, getChosenFont, 0}},
- {2341, {wxFontData, getEnableEffects, 0}},
- {2342, {wxFontData, getInitialFont, 0}},
- {2343, {wxFontData, getShowHelp, 0}},
- {2344, {wxFontData, setAllowSymbols, 1}},
- {2345, {wxFontData, setChosenFont, 1}},
- {2346, {wxFontData, setColour, 1}},
- {2347, {wxFontData, setInitialFont, 1}},
- {2348, {wxFontData, setRange, 2}},
- {2349, {wxFontData, setShowHelp, 1}},
- {2353, {wxFontDialog, new_0, 0}},
- {2355, {wxFontDialog, new_2, 2}},
- {2357, {wxFontDialog, create, 2}},
- {2358, {wxFontDialog, getFontData, 0}},
- {2360, {wxFontDialog, 'Destroy', undefined}},
- {2361, {wxProgressDialog, new, 3}},
- {2362, {wxProgressDialog, destruct, 0}},
- {2363, {wxProgressDialog, resume, 0}},
- {2364, {wxProgressDialog, update_2, 2}},
- {2365, {wxProgressDialog, update_0, 0}},
- {2366, {wxMessageDialog, new, 3}},
- {2367, {wxMessageDialog, destruct, 0}},
- {2368, {wxPageSetupDialog, new, 2}},
- {2369, {wxPageSetupDialog, destruct, 0}},
- {2370, {wxPageSetupDialog, getPageSetupData, 0}},
- {2371, {wxPageSetupDialog, showModal, 0}},
- {2372, {wxPageSetupDialogData, new_0, 0}},
- {2373, {wxPageSetupDialogData, new_1_0, 1}},
- {2374, {wxPageSetupDialogData, new_1_1, 1}},
- {2375, {wxPageSetupDialogData, destruct, 0}},
- {2376, {wxPageSetupDialogData, enableHelp, 1}},
- {2377, {wxPageSetupDialogData, enableMargins, 1}},
- {2378, {wxPageSetupDialogData, enableOrientation, 1}},
- {2379, {wxPageSetupDialogData, enablePaper, 1}},
- {2380, {wxPageSetupDialogData, enablePrinter, 1}},
- {2381, {wxPageSetupDialogData, getDefaultMinMargins, 0}},
- {2382, {wxPageSetupDialogData, getEnableMargins, 0}},
- {2383, {wxPageSetupDialogData, getEnableOrientation, 0}},
- {2384, {wxPageSetupDialogData, getEnablePaper, 0}},
- {2385, {wxPageSetupDialogData, getEnablePrinter, 0}},
- {2386, {wxPageSetupDialogData, getEnableHelp, 0}},
- {2387, {wxPageSetupDialogData, getDefaultInfo, 0}},
- {2388, {wxPageSetupDialogData, getMarginTopLeft, 0}},
- {2389, {wxPageSetupDialogData, getMarginBottomRight, 0}},
- {2390, {wxPageSetupDialogData, getMinMarginTopLeft, 0}},
- {2391, {wxPageSetupDialogData, getMinMarginBottomRight, 0}},
- {2392, {wxPageSetupDialogData, getPaperId, 0}},
- {2393, {wxPageSetupDialogData, getPaperSize, 0}},
- {2395, {wxPageSetupDialogData, getPrintData, 0}},
- {2396, {wxPageSetupDialogData, isOk, 0}},
- {2397, {wxPageSetupDialogData, setDefaultInfo, 1}},
- {2398, {wxPageSetupDialogData, setDefaultMinMargins, 1}},
- {2399, {wxPageSetupDialogData, setMarginTopLeft, 1}},
- {2400, {wxPageSetupDialogData, setMarginBottomRight, 1}},
- {2401, {wxPageSetupDialogData, setMinMarginTopLeft, 1}},
- {2402, {wxPageSetupDialogData, setMinMarginBottomRight, 1}},
- {2403, {wxPageSetupDialogData, setPaperId, 1}},
- {2404, {wxPageSetupDialogData, setPaperSize_1_1, 1}},
- {2405, {wxPageSetupDialogData, setPaperSize_1_0, 1}},
- {2406, {wxPageSetupDialogData, setPrintData, 1}},
- {2407, {wxPrintDialog, new_2_0, 2}},
- {2408, {wxPrintDialog, new_2_1, 2}},
- {2409, {wxPrintDialog, destruct, 0}},
- {2410, {wxPrintDialog, getPrintDialogData, 0}},
- {2411, {wxPrintDialog, getPrintDC, 0}},
- {2412, {wxPrintDialogData, new_0, 0}},
- {2413, {wxPrintDialogData, new_1_1, 1}},
- {2414, {wxPrintDialogData, new_1_0, 1}},
- {2415, {wxPrintDialogData, destruct, 0}},
- {2416, {wxPrintDialogData, enableHelp, 1}},
- {2417, {wxPrintDialogData, enablePageNumbers, 1}},
- {2418, {wxPrintDialogData, enablePrintToFile, 1}},
- {2419, {wxPrintDialogData, enableSelection, 1}},
- {2420, {wxPrintDialogData, getAllPages, 0}},
- {2421, {wxPrintDialogData, getCollate, 0}},
- {2422, {wxPrintDialogData, getFromPage, 0}},
- {2423, {wxPrintDialogData, getMaxPage, 0}},
- {2424, {wxPrintDialogData, getMinPage, 0}},
- {2425, {wxPrintDialogData, getNoCopies, 0}},
- {2426, {wxPrintDialogData, getPrintData, 0}},
- {2427, {wxPrintDialogData, getPrintToFile, 0}},
- {2428, {wxPrintDialogData, getSelection, 0}},
- {2429, {wxPrintDialogData, getToPage, 0}},
- {2430, {wxPrintDialogData, isOk, 0}},
- {2431, {wxPrintDialogData, setCollate, 1}},
- {2432, {wxPrintDialogData, setFromPage, 1}},
- {2433, {wxPrintDialogData, setMaxPage, 1}},
- {2434, {wxPrintDialogData, setMinPage, 1}},
- {2435, {wxPrintDialogData, setNoCopies, 1}},
- {2436, {wxPrintDialogData, setPrintData, 1}},
- {2437, {wxPrintDialogData, setPrintToFile, 1}},
- {2438, {wxPrintDialogData, setSelection, 1}},
- {2439, {wxPrintDialogData, setToPage, 1}},
- {2440, {wxPrintData, new_0, 0}},
- {2441, {wxPrintData, new_1, 1}},
- {2442, {wxPrintData, destruct, 0}},
- {2443, {wxPrintData, getCollate, 0}},
- {2444, {wxPrintData, getBin, 0}},
- {2445, {wxPrintData, getColour, 0}},
- {2446, {wxPrintData, getDuplex, 0}},
- {2447, {wxPrintData, getNoCopies, 0}},
- {2448, {wxPrintData, getOrientation, 0}},
- {2449, {wxPrintData, getPaperId, 0}},
- {2450, {wxPrintData, getPrinterName, 0}},
- {2451, {wxPrintData, getQuality, 0}},
- {2452, {wxPrintData, isOk, 0}},
- {2453, {wxPrintData, setBin, 1}},
- {2454, {wxPrintData, setCollate, 1}},
- {2455, {wxPrintData, setColour, 1}},
- {2456, {wxPrintData, setDuplex, 1}},
- {2457, {wxPrintData, setNoCopies, 1}},
- {2458, {wxPrintData, setOrientation, 1}},
- {2459, {wxPrintData, setPaperId, 1}},
- {2460, {wxPrintData, setPrinterName, 1}},
- {2461, {wxPrintData, setQuality, 1}},
- {2464, {wxPrintPreview, new_2, 2}},
- {2465, {wxPrintPreview, new_3, 3}},
- {2467, {wxPrintPreview, destruct, 0}},
- {2468, {wxPrintPreview, getCanvas, 0}},
- {2469, {wxPrintPreview, getCurrentPage, 0}},
- {2470, {wxPrintPreview, getFrame, 0}},
- {2471, {wxPrintPreview, getMaxPage, 0}},
- {2472, {wxPrintPreview, getMinPage, 0}},
- {2473, {wxPrintPreview, getPrintout, 0}},
- {2474, {wxPrintPreview, getPrintoutForPrinting, 0}},
- {2475, {wxPrintPreview, isOk, 0}},
- {2476, {wxPrintPreview, paintPage, 2}},
- {2477, {wxPrintPreview, print, 1}},
- {2478, {wxPrintPreview, renderPage, 1}},
- {2479, {wxPrintPreview, setCanvas, 1}},
- {2480, {wxPrintPreview, setCurrentPage, 1}},
- {2481, {wxPrintPreview, setFrame, 1}},
- {2482, {wxPrintPreview, setPrintout, 1}},
- {2483, {wxPrintPreview, setZoom, 1}},
- {2484, {wxPreviewFrame, new, 3}},
- {2485, {wxPreviewFrame, destruct, 0}},
- {2486, {wxPreviewFrame, createControlBar, 0}},
- {2487, {wxPreviewFrame, createCanvas, 0}},
- {2488, {wxPreviewFrame, initialize, 0}},
- {2489, {wxPreviewFrame, onCloseWindow, 1}},
- {2490, {wxPreviewControlBar, new, 4}},
- {2491, {wxPreviewControlBar, destruct, 0}},
- {2492, {wxPreviewControlBar, createButtons, 0}},
- {2493, {wxPreviewControlBar, getPrintPreview, 0}},
- {2494, {wxPreviewControlBar, getZoomControl, 0}},
- {2495, {wxPreviewControlBar, setZoomControl, 1}},
- {2497, {wxPrinter, new, 1}},
- {2498, {wxPrinter, createAbortWindow, 2}},
- {2499, {wxPrinter, getAbort, 0}},
- {2500, {wxPrinter, getLastError, 0}},
- {2501, {wxPrinter, getPrintDialogData, 0}},
- {2502, {wxPrinter, print, 3}},
- {2503, {wxPrinter, printDialog, 1}},
- {2504, {wxPrinter, reportError, 3}},
- {2505, {wxPrinter, setup, 1}},
- {2506, {wxPrinter, 'Destroy', undefined}},
- {2507, {wxXmlResource, new_1, 1}},
- {2508, {wxXmlResource, new_2, 2}},
- {2509, {wxXmlResource, destruct, 0}},
- {2510, {wxXmlResource, attachUnknownControl, 3}},
- {2511, {wxXmlResource, clearHandlers, 0}},
- {2512, {wxXmlResource, compareVersion, 4}},
- {2513, {wxXmlResource, get, 0}},
- {2514, {wxXmlResource, getFlags, 0}},
- {2515, {wxXmlResource, getVersion, 0}},
- {2516, {wxXmlResource, getXRCID, 2}},
- {2517, {wxXmlResource, initAllHandlers, 0}},
- {2518, {wxXmlResource, load, 1}},
- {2519, {wxXmlResource, loadBitmap, 1}},
- {2520, {wxXmlResource, loadDialog_2, 2}},
- {2521, {wxXmlResource, loadDialog_3, 3}},
- {2522, {wxXmlResource, loadFrame_2, 2}},
- {2523, {wxXmlResource, loadFrame_3, 3}},
- {2524, {wxXmlResource, loadIcon, 1}},
- {2525, {wxXmlResource, loadMenu, 1}},
- {2526, {wxXmlResource, loadMenuBar_2, 2}},
- {2527, {wxXmlResource, loadMenuBar_1, 1}},
- {2528, {wxXmlResource, loadPanel_2, 2}},
- {2529, {wxXmlResource, loadPanel_3, 3}},
- {2530, {wxXmlResource, loadToolBar, 2}},
- {2531, {wxXmlResource, set, 1}},
- {2532, {wxXmlResource, setFlags, 1}},
- {2533, {wxXmlResource, unload, 1}},
- {2534, {wxXmlResource, xrcctrl, 3}},
- {2535, {wxHtmlEasyPrinting, new, 1}},
- {2536, {wxHtmlEasyPrinting, destruct, 0}},
- {2537, {wxHtmlEasyPrinting, getPrintData, 0}},
- {2538, {wxHtmlEasyPrinting, getPageSetupData, 0}},
- {2539, {wxHtmlEasyPrinting, previewFile, 1}},
- {2540, {wxHtmlEasyPrinting, previewText, 2}},
- {2541, {wxHtmlEasyPrinting, printFile, 1}},
- {2542, {wxHtmlEasyPrinting, printText, 2}},
- {2543, {wxHtmlEasyPrinting, pageSetup, 0}},
- {2544, {wxHtmlEasyPrinting, setFonts, 3}},
- {2545, {wxHtmlEasyPrinting, setHeader, 2}},
- {2546, {wxHtmlEasyPrinting, setFooter, 2}},
- {2548, {wxGLCanvas, new_2, 2}},
- {2549, {wxGLCanvas, new_3_1, 3}},
- {2550, {wxGLCanvas, new_3_0, 3}},
- {2551, {wxGLCanvas, getContext, 0}},
- {2553, {wxGLCanvas, setCurrent, 0}},
- {2554, {wxGLCanvas, swapBuffers, 0}},
- {2555, {wxGLCanvas, 'Destroy', undefined}},
- {2556, {wxAuiManager, new, 1}},
- {2557, {wxAuiManager, destruct, 0}},
- {2558, {wxAuiManager, addPane_2_1, 2}},
- {2559, {wxAuiManager, addPane_3, 3}},
- {2560, {wxAuiManager, addPane_2_0, 2}},
- {2561, {wxAuiManager, detachPane, 1}},
- {2562, {wxAuiManager, getAllPanes, 0}},
- {2563, {wxAuiManager, getArtProvider, 0}},
- {2564, {wxAuiManager, getDockSizeConstraint, 2}},
- {2565, {wxAuiManager, getFlags, 0}},
- {2566, {wxAuiManager, getManagedWindow, 0}},
- {2567, {wxAuiManager, getManager, 1}},
- {2568, {wxAuiManager, getPane_1_1, 1}},
- {2569, {wxAuiManager, getPane_1_0, 1}},
- {2570, {wxAuiManager, hideHint, 0}},
- {2571, {wxAuiManager, insertPane, 3}},
- {2572, {wxAuiManager, loadPaneInfo, 2}},
- {2573, {wxAuiManager, loadPerspective, 2}},
- {2574, {wxAuiManager, savePaneInfo, 1}},
- {2575, {wxAuiManager, savePerspective, 0}},
- {2576, {wxAuiManager, setArtProvider, 1}},
- {2577, {wxAuiManager, setDockSizeConstraint, 2}},
- {2578, {wxAuiManager, setFlags, 1}},
- {2579, {wxAuiManager, setManagedWindow, 1}},
- {2580, {wxAuiManager, showHint, 1}},
- {2581, {wxAuiManager, unInit, 0}},
- {2582, {wxAuiManager, update, 0}},
- {2583, {wxAuiPaneInfo, new_0, 0}},
- {2584, {wxAuiPaneInfo, new_1, 1}},
- {2585, {wxAuiPaneInfo, destruct, 0}},
- {2586, {wxAuiPaneInfo, bestSize_1, 1}},
- {2587, {wxAuiPaneInfo, bestSize_2, 2}},
- {2588, {wxAuiPaneInfo, bottom, 0}},
- {2589, {wxAuiPaneInfo, bottomDockable, 1}},
- {2590, {wxAuiPaneInfo, caption, 1}},
- {2591, {wxAuiPaneInfo, captionVisible, 1}},
- {2592, {wxAuiPaneInfo, centre, 0}},
- {2593, {wxAuiPaneInfo, centrePane, 0}},
- {2594, {wxAuiPaneInfo, closeButton, 1}},
- {2595, {wxAuiPaneInfo, defaultPane, 0}},
- {2596, {wxAuiPaneInfo, destroyOnClose, 1}},
- {2597, {wxAuiPaneInfo, direction, 1}},
- {2598, {wxAuiPaneInfo, dock, 0}},
- {2599, {wxAuiPaneInfo, dockable, 1}},
- {2600, {wxAuiPaneInfo, fixed, 0}},
- {2601, {wxAuiPaneInfo, float, 0}},
- {2602, {wxAuiPaneInfo, floatable, 1}},
- {2603, {wxAuiPaneInfo, floatingPosition_1, 1}},
- {2604, {wxAuiPaneInfo, floatingPosition_2, 2}},
- {2605, {wxAuiPaneInfo, floatingSize_1, 1}},
- {2606, {wxAuiPaneInfo, floatingSize_2, 2}},
- {2607, {wxAuiPaneInfo, gripper, 1}},
- {2608, {wxAuiPaneInfo, gripperTop, 1}},
- {2609, {wxAuiPaneInfo, hasBorder, 0}},
- {2610, {wxAuiPaneInfo, hasCaption, 0}},
- {2611, {wxAuiPaneInfo, hasCloseButton, 0}},
- {2612, {wxAuiPaneInfo, hasFlag, 1}},
- {2613, {wxAuiPaneInfo, hasGripper, 0}},
- {2614, {wxAuiPaneInfo, hasGripperTop, 0}},
- {2615, {wxAuiPaneInfo, hasMaximizeButton, 0}},
- {2616, {wxAuiPaneInfo, hasMinimizeButton, 0}},
- {2617, {wxAuiPaneInfo, hasPinButton, 0}},
- {2618, {wxAuiPaneInfo, hide, 0}},
- {2619, {wxAuiPaneInfo, isBottomDockable, 0}},
- {2620, {wxAuiPaneInfo, isDocked, 0}},
- {2621, {wxAuiPaneInfo, isFixed, 0}},
- {2622, {wxAuiPaneInfo, isFloatable, 0}},
- {2623, {wxAuiPaneInfo, isFloating, 0}},
- {2624, {wxAuiPaneInfo, isLeftDockable, 0}},
- {2625, {wxAuiPaneInfo, isMovable, 0}},
- {2626, {wxAuiPaneInfo, isOk, 0}},
- {2627, {wxAuiPaneInfo, isResizable, 0}},
- {2628, {wxAuiPaneInfo, isRightDockable, 0}},
- {2629, {wxAuiPaneInfo, isShown, 0}},
- {2630, {wxAuiPaneInfo, isToolbar, 0}},
- {2631, {wxAuiPaneInfo, isTopDockable, 0}},
- {2632, {wxAuiPaneInfo, layer, 1}},
- {2633, {wxAuiPaneInfo, left, 0}},
- {2634, {wxAuiPaneInfo, leftDockable, 1}},
- {2635, {wxAuiPaneInfo, maxSize_1, 1}},
- {2636, {wxAuiPaneInfo, maxSize_2, 2}},
- {2637, {wxAuiPaneInfo, maximizeButton, 1}},
- {2638, {wxAuiPaneInfo, minSize_1, 1}},
- {2639, {wxAuiPaneInfo, minSize_2, 2}},
- {2640, {wxAuiPaneInfo, minimizeButton, 1}},
- {2641, {wxAuiPaneInfo, movable, 1}},
- {2642, {wxAuiPaneInfo, name, 1}},
- {2643, {wxAuiPaneInfo, paneBorder, 1}},
- {2644, {wxAuiPaneInfo, pinButton, 1}},
- {2645, {wxAuiPaneInfo, position, 1}},
- {2646, {wxAuiPaneInfo, resizable, 1}},
- {2647, {wxAuiPaneInfo, right, 0}},
- {2648, {wxAuiPaneInfo, rightDockable, 1}},
- {2649, {wxAuiPaneInfo, row, 1}},
- {2650, {wxAuiPaneInfo, safeSet, 1}},
- {2651, {wxAuiPaneInfo, setFlag, 2}},
- {2652, {wxAuiPaneInfo, show, 1}},
- {2653, {wxAuiPaneInfo, toolbarPane, 0}},
- {2654, {wxAuiPaneInfo, top, 0}},
- {2655, {wxAuiPaneInfo, topDockable, 1}},
- {2656, {wxAuiPaneInfo, window, 1}},
- {2657, {wxAuiPaneInfo, getWindow, 0}},
- {2658, {wxAuiPaneInfo, getFrame, 0}},
- {2659, {wxAuiPaneInfo, getDirection, 0}},
- {2660, {wxAuiPaneInfo, getLayer, 0}},
- {2661, {wxAuiPaneInfo, getRow, 0}},
- {2662, {wxAuiPaneInfo, getPosition, 0}},
- {2663, {wxAuiPaneInfo, getFloatingPosition, 0}},
- {2664, {wxAuiPaneInfo, getFloatingSize, 0}},
- {2665, {wxAuiNotebook, new_0, 0}},
- {2666, {wxAuiNotebook, new_2, 2}},
- {2667, {wxAuiNotebook, addPage, 3}},
- {2668, {wxAuiNotebook, create, 2}},
- {2669, {wxAuiNotebook, deletePage, 1}},
- {2670, {wxAuiNotebook, getArtProvider, 0}},
- {2671, {wxAuiNotebook, getPage, 1}},
- {2672, {wxAuiNotebook, getPageBitmap, 1}},
- {2673, {wxAuiNotebook, getPageCount, 0}},
- {2674, {wxAuiNotebook, getPageIndex, 1}},
- {2675, {wxAuiNotebook, getPageText, 1}},
- {2676, {wxAuiNotebook, getSelection, 0}},
- {2677, {wxAuiNotebook, insertPage, 4}},
- {2678, {wxAuiNotebook, removePage, 1}},
- {2679, {wxAuiNotebook, setArtProvider, 1}},
- {2680, {wxAuiNotebook, setFont, 1}},
- {2681, {wxAuiNotebook, setPageBitmap, 2}},
- {2682, {wxAuiNotebook, setPageText, 2}},
- {2683, {wxAuiNotebook, setSelection, 1}},
- {2684, {wxAuiNotebook, setTabCtrlHeight, 1}},
- {2685, {wxAuiNotebook, setUniformBitmapSize, 1}},
- {2686, {wxAuiNotebook, 'Destroy', undefined}},
- {2687, {wxAuiTabArt, setFlags, 1}},
- {2688, {wxAuiTabArt, setMeasuringFont, 1}},
- {2689, {wxAuiTabArt, setNormalFont, 1}},
- {2690, {wxAuiTabArt, setSelectedFont, 1}},
- {2691, {wxAuiTabArt, setColour, 1}},
- {2692, {wxAuiTabArt, setActiveColour, 1}},
- {2693, {wxAuiDockArt, getColour, 1}},
- {2694, {wxAuiDockArt, getFont, 1}},
- {2695, {wxAuiDockArt, getMetric, 1}},
- {2696, {wxAuiDockArt, setColour, 2}},
- {2697, {wxAuiDockArt, setFont, 2}},
- {2698, {wxAuiDockArt, setMetric, 2}},
- {2699, {wxAuiSimpleTabArt, new, 0}},
- {2700, {wxAuiSimpleTabArt, 'Destroy', undefined}},
- {2701, {wxMDIParentFrame, new_0, 0}},
- {2702, {wxMDIParentFrame, new_4, 4}},
- {2703, {wxMDIParentFrame, destruct, 0}},
- {2704, {wxMDIParentFrame, activateNext, 0}},
- {2705, {wxMDIParentFrame, activatePrevious, 0}},
- {2706, {wxMDIParentFrame, arrangeIcons, 0}},
- {2707, {wxMDIParentFrame, cascade, 0}},
- {2708, {wxMDIParentFrame, create, 4}},
- {2709, {wxMDIParentFrame, getActiveChild, 0}},
- {2710, {wxMDIParentFrame, getClientWindow, 0}},
- {2711, {wxMDIParentFrame, tile, 1}},
- {2712, {wxMDIChildFrame, new_0, 0}},
- {2713, {wxMDIChildFrame, new_4, 4}},
- {2714, {wxMDIChildFrame, destruct, 0}},
- {2715, {wxMDIChildFrame, activate, 0}},
- {2716, {wxMDIChildFrame, create, 4}},
- {2717, {wxMDIChildFrame, maximize, 1}},
- {2718, {wxMDIChildFrame, restore, 0}},
- {2719, {wxMDIClientWindow, new_0, 0}},
- {2720, {wxMDIClientWindow, new_2, 2}},
- {2721, {wxMDIClientWindow, destruct, 0}},
- {2722, {wxMDIClientWindow, createClient, 2}},
- {2723, {wxLayoutAlgorithm, new, 0}},
- {2724, {wxLayoutAlgorithm, layoutFrame, 2}},
- {2725, {wxLayoutAlgorithm, layoutMDIFrame, 2}},
- {2726, {wxLayoutAlgorithm, layoutWindow, 2}},
- {2727, {wxLayoutAlgorithm, 'Destroy', undefined}},
- {2728, {wxEvent, getId, 0}},
- {2729, {wxEvent, getSkipped, 0}},
- {2730, {wxEvent, getTimestamp, 0}},
- {2731, {wxEvent, isCommandEvent, 0}},
- {2732, {wxEvent, resumePropagation, 1}},
- {2733, {wxEvent, shouldPropagate, 0}},
- {2734, {wxEvent, skip, 1}},
- {2735, {wxEvent, stopPropagation, 0}},
- {2736, {wxCommandEvent, getClientData, 0}},
- {2737, {wxCommandEvent, getExtraLong, 0}},
- {2738, {wxCommandEvent, getInt, 0}},
- {2739, {wxCommandEvent, getSelection, 0}},
- {2740, {wxCommandEvent, getString, 0}},
- {2741, {wxCommandEvent, isChecked, 0}},
- {2742, {wxCommandEvent, isSelection, 0}},
- {2743, {wxCommandEvent, setInt, 1}},
- {2744, {wxCommandEvent, setString, 1}},
- {2745, {wxScrollEvent, getOrientation, 0}},
- {2746, {wxScrollEvent, getPosition, 0}},
- {2747, {wxScrollWinEvent, getOrientation, 0}},
- {2748, {wxScrollWinEvent, getPosition, 0}},
- {2749, {wxMouseEvent, altDown, 0}},
- {2750, {wxMouseEvent, button, 1}},
- {2751, {wxMouseEvent, buttonDClick, 1}},
- {2752, {wxMouseEvent, buttonDown, 1}},
- {2753, {wxMouseEvent, buttonUp, 1}},
- {2754, {wxMouseEvent, cmdDown, 0}},
- {2755, {wxMouseEvent, controlDown, 0}},
- {2756, {wxMouseEvent, dragging, 0}},
- {2757, {wxMouseEvent, entering, 0}},
- {2758, {wxMouseEvent, getButton, 0}},
- {2761, {wxMouseEvent, getPosition, 0}},
- {2762, {wxMouseEvent, getLogicalPosition, 1}},
- {2763, {wxMouseEvent, getLinesPerAction, 0}},
- {2764, {wxMouseEvent, getWheelRotation, 0}},
- {2765, {wxMouseEvent, getWheelDelta, 0}},
- {2766, {wxMouseEvent, getX, 0}},
- {2767, {wxMouseEvent, getY, 0}},
- {2768, {wxMouseEvent, isButton, 0}},
- {2769, {wxMouseEvent, isPageScroll, 0}},
- {2770, {wxMouseEvent, leaving, 0}},
- {2771, {wxMouseEvent, leftDClick, 0}},
- {2772, {wxMouseEvent, leftDown, 0}},
- {2773, {wxMouseEvent, leftIsDown, 0}},
- {2774, {wxMouseEvent, leftUp, 0}},
- {2775, {wxMouseEvent, metaDown, 0}},
- {2776, {wxMouseEvent, middleDClick, 0}},
- {2777, {wxMouseEvent, middleDown, 0}},
- {2778, {wxMouseEvent, middleIsDown, 0}},
- {2779, {wxMouseEvent, middleUp, 0}},
- {2780, {wxMouseEvent, moving, 0}},
- {2781, {wxMouseEvent, rightDClick, 0}},
- {2782, {wxMouseEvent, rightDown, 0}},
- {2783, {wxMouseEvent, rightIsDown, 0}},
- {2784, {wxMouseEvent, rightUp, 0}},
- {2785, {wxMouseEvent, shiftDown, 0}},
- {2786, {wxSetCursorEvent, getCursor, 0}},
- {2787, {wxSetCursorEvent, getX, 0}},
- {2788, {wxSetCursorEvent, getY, 0}},
- {2789, {wxSetCursorEvent, hasCursor, 0}},
- {2790, {wxSetCursorEvent, setCursor, 1}},
- {2791, {wxKeyEvent, altDown, 0}},
- {2792, {wxKeyEvent, cmdDown, 0}},
- {2793, {wxKeyEvent, controlDown, 0}},
- {2794, {wxKeyEvent, getKeyCode, 0}},
- {2795, {wxKeyEvent, getModifiers, 0}},
- {2798, {wxKeyEvent, getPosition, 0}},
- {2799, {wxKeyEvent, getRawKeyCode, 0}},
- {2800, {wxKeyEvent, getRawKeyFlags, 0}},
- {2801, {wxKeyEvent, getUnicodeKey, 0}},
- {2802, {wxKeyEvent, getX, 0}},
- {2803, {wxKeyEvent, getY, 0}},
- {2804, {wxKeyEvent, hasModifiers, 0}},
- {2805, {wxKeyEvent, metaDown, 0}},
- {2806, {wxKeyEvent, shiftDown, 0}},
- {2807, {wxSizeEvent, getSize, 0}},
- {2808, {wxMoveEvent, getPosition, 0}},
- {2809, {wxEraseEvent, getDC, 0}},
- {2810, {wxFocusEvent, getWindow, 0}},
- {2811, {wxChildFocusEvent, getWindow, 0}},
- {2812, {wxMenuEvent, getMenu, 0}},
- {2813, {wxMenuEvent, getMenuId, 0}},
- {2814, {wxMenuEvent, isPopup, 0}},
- {2815, {wxCloseEvent, canVeto, 0}},
- {2816, {wxCloseEvent, getLoggingOff, 0}},
- {2817, {wxCloseEvent, setCanVeto, 1}},
- {2818, {wxCloseEvent, setLoggingOff, 1}},
- {2819, {wxCloseEvent, veto, 1}},
- {2820, {wxShowEvent, setShow, 1}},
- {2821, {wxShowEvent, getShow, 0}},
- {2822, {wxIconizeEvent, iconized, 0}},
- {2823, {wxJoystickEvent, buttonDown, 1}},
- {2824, {wxJoystickEvent, buttonIsDown, 1}},
- {2825, {wxJoystickEvent, buttonUp, 1}},
- {2826, {wxJoystickEvent, getButtonChange, 0}},
- {2827, {wxJoystickEvent, getButtonState, 0}},
- {2828, {wxJoystickEvent, getJoystick, 0}},
- {2829, {wxJoystickEvent, getPosition, 0}},
- {2830, {wxJoystickEvent, getZPosition, 0}},
- {2831, {wxJoystickEvent, isButton, 0}},
- {2832, {wxJoystickEvent, isMove, 0}},
- {2833, {wxJoystickEvent, isZMove, 0}},
- {2834, {wxUpdateUIEvent, canUpdate, 1}},
- {2835, {wxUpdateUIEvent, check, 1}},
- {2836, {wxUpdateUIEvent, enable, 1}},
- {2837, {wxUpdateUIEvent, show, 1}},
- {2838, {wxUpdateUIEvent, getChecked, 0}},
- {2839, {wxUpdateUIEvent, getEnabled, 0}},
- {2840, {wxUpdateUIEvent, getShown, 0}},
- {2841, {wxUpdateUIEvent, getSetChecked, 0}},
- {2842, {wxUpdateUIEvent, getSetEnabled, 0}},
- {2843, {wxUpdateUIEvent, getSetShown, 0}},
- {2844, {wxUpdateUIEvent, getSetText, 0}},
- {2845, {wxUpdateUIEvent, getText, 0}},
- {2846, {wxUpdateUIEvent, getMode, 0}},
- {2847, {wxUpdateUIEvent, getUpdateInterval, 0}},
- {2848, {wxUpdateUIEvent, resetUpdateTime, 0}},
- {2849, {wxUpdateUIEvent, setMode, 1}},
- {2850, {wxUpdateUIEvent, setText, 1}},
- {2851, {wxUpdateUIEvent, setUpdateInterval, 1}},
- {2852, {wxMouseCaptureChangedEvent, getCapturedWindow, 0}},
- {2853, {wxPaletteChangedEvent, setChangedWindow, 1}},
- {2854, {wxPaletteChangedEvent, getChangedWindow, 0}},
- {2855, {wxQueryNewPaletteEvent, setPaletteRealized, 1}},
- {2856, {wxQueryNewPaletteEvent, getPaletteRealized, 0}},
- {2857, {wxNavigationKeyEvent, getDirection, 0}},
- {2858, {wxNavigationKeyEvent, setDirection, 1}},
- {2859, {wxNavigationKeyEvent, isWindowChange, 0}},
- {2860, {wxNavigationKeyEvent, setWindowChange, 1}},
- {2861, {wxNavigationKeyEvent, isFromTab, 0}},
- {2862, {wxNavigationKeyEvent, setFromTab, 1}},
- {2863, {wxNavigationKeyEvent, getCurrentFocus, 0}},
- {2864, {wxNavigationKeyEvent, setCurrentFocus, 1}},
- {2865, {wxHelpEvent, getOrigin, 0}},
- {2866, {wxHelpEvent, getPosition, 0}},
- {2867, {wxHelpEvent, setOrigin, 1}},
- {2868, {wxHelpEvent, setPosition, 1}},
- {2869, {wxContextMenuEvent, getPosition, 0}},
- {2870, {wxContextMenuEvent, setPosition, 1}},
- {2871, {wxIdleEvent, canSend, 1}},
- {2872, {wxIdleEvent, getMode, 0}},
- {2873, {wxIdleEvent, requestMore, 1}},
- {2874, {wxIdleEvent, moreRequested, 0}},
- {2875, {wxIdleEvent, setMode, 1}},
- {2876, {wxGridEvent, altDown, 0}},
- {2877, {wxGridEvent, controlDown, 0}},
- {2878, {wxGridEvent, getCol, 0}},
- {2879, {wxGridEvent, getPosition, 0}},
- {2880, {wxGridEvent, getRow, 0}},
- {2881, {wxGridEvent, metaDown, 0}},
- {2882, {wxGridEvent, selecting, 0}},
- {2883, {wxGridEvent, shiftDown, 0}},
- {2884, {wxNotifyEvent, allow, 0}},
- {2885, {wxNotifyEvent, isAllowed, 0}},
- {2886, {wxNotifyEvent, veto, 0}},
- {2887, {wxSashEvent, getEdge, 0}},
- {2888, {wxSashEvent, getDragRect, 0}},
- {2889, {wxSashEvent, getDragStatus, 0}},
- {2890, {wxListEvent, getCacheFrom, 0}},
- {2891, {wxListEvent, getCacheTo, 0}},
- {2892, {wxListEvent, getKeyCode, 0}},
- {2893, {wxListEvent, getIndex, 0}},
- {2894, {wxListEvent, getColumn, 0}},
- {2895, {wxListEvent, getPoint, 0}},
- {2896, {wxListEvent, getLabel, 0}},
- {2897, {wxListEvent, getText, 0}},
- {2898, {wxListEvent, getImage, 0}},
- {2899, {wxListEvent, getData, 0}},
- {2900, {wxListEvent, getMask, 0}},
- {2901, {wxListEvent, getItem, 0}},
- {2902, {wxListEvent, isEditCancelled, 0}},
- {2903, {wxDateEvent, getDate, 0}},
- {2904, {wxCalendarEvent, getWeekDay, 0}},
- {2905, {wxFileDirPickerEvent, getPath, 0}},
- {2906, {wxColourPickerEvent, getColour, 0}},
- {2907, {wxFontPickerEvent, getFont, 0}},
- {2908, {wxStyledTextEvent, getPosition, 0}},
- {2909, {wxStyledTextEvent, getKey, 0}},
- {2910, {wxStyledTextEvent, getModifiers, 0}},
- {2911, {wxStyledTextEvent, getModificationType, 0}},
- {2912, {wxStyledTextEvent, getText, 0}},
- {2913, {wxStyledTextEvent, getLength, 0}},
- {2914, {wxStyledTextEvent, getLinesAdded, 0}},
- {2915, {wxStyledTextEvent, getLine, 0}},
- {2916, {wxStyledTextEvent, getFoldLevelNow, 0}},
- {2917, {wxStyledTextEvent, getFoldLevelPrev, 0}},
- {2918, {wxStyledTextEvent, getMargin, 0}},
- {2919, {wxStyledTextEvent, getMessage, 0}},
- {2920, {wxStyledTextEvent, getWParam, 0}},
- {2921, {wxStyledTextEvent, getLParam, 0}},
- {2922, {wxStyledTextEvent, getListType, 0}},
- {2923, {wxStyledTextEvent, getX, 0}},
- {2924, {wxStyledTextEvent, getY, 0}},
- {2925, {wxStyledTextEvent, getDragText, 0}},
- {2926, {wxStyledTextEvent, getDragAllowMove, 0}},
- {2927, {wxStyledTextEvent, getDragResult, 0}},
- {2928, {wxStyledTextEvent, getShift, 0}},
- {2929, {wxStyledTextEvent, getControl, 0}},
- {2930, {wxStyledTextEvent, getAlt, 0}},
- {2931, {utils, getKeyState, 1}},
- {2932, {utils, getMousePosition, 2}},
- {2933, {utils, getMouseState, 0}},
- {2934, {utils, setDetectableAutoRepeat, 1}},
- {2935, {utils, bell, 0}},
- {2936, {utils, findMenuItemId, 3}},
- {2937, {utils, genericFindWindowAtPoint, 1}},
- {2938, {utils, findWindowAtPoint, 1}},
- {2939, {utils, beginBusyCursor, 1}},
- {2940, {utils, endBusyCursor, 0}},
- {2941, {utils, isBusy, 0}},
- {2942, {utils, shutdown, 1}},
- {2943, {utils, shell, 1}},
- {2944, {utils, launchDefaultBrowser, 2}},
- {2945, {utils, getEmailAddress, 0}},
- {2946, {utils, getUserId, 0}},
- {2947, {utils, getHomeDir, 0}},
- {2948, {utils, newId, 0}},
- {2949, {utils, registerId, 1}},
- {2950, {utils, getCurrentId, 0}},
- {2951, {utils, getOsDescription, 0}},
- {2952, {utils, isPlatformLittleEndian, 0}},
- {2953, {utils, isPlatform64Bit, 0}},
- {2954, {gdicmn, displaySize, 2}},
- {2955, {gdicmn, setCursor, 1}},
- {2956, {wxPrintout, new, 1}},
- {2957, {wxPrintout, destruct, 0}},
- {2958, {wxPrintout, getDC, 0}},
- {2959, {wxPrintout, getPageSizeMM, 2}},
- {2960, {wxPrintout, getPageSizePixels, 2}},
- {2961, {wxPrintout, getPaperRectPixels, 0}},
- {2962, {wxPrintout, getPPIPrinter, 2}},
- {2963, {wxPrintout, getPPIScreen, 2}},
- {2964, {wxPrintout, getTitle, 0}},
- {2965, {wxPrintout, isPreview, 0}},
- {2966, {wxPrintout, fitThisSizeToPaper, 1}},
- {2967, {wxPrintout, fitThisSizeToPage, 1}},
- {2968, {wxPrintout, fitThisSizeToPageMargins, 2}},
- {2969, {wxPrintout, mapScreenSizeToPaper, 0}},
- {2970, {wxPrintout, mapScreenSizeToPage, 0}},
- {2971, {wxPrintout, mapScreenSizeToPageMargins, 1}},
- {2972, {wxPrintout, mapScreenSizeToDevice, 0}},
- {2973, {wxPrintout, getLogicalPaperRect, 0}},
- {2974, {wxPrintout, getLogicalPageRect, 0}},
- {2975, {wxPrintout, getLogicalPageMarginsRect, 1}},
- {2976, {wxPrintout, setLogicalOrigin, 2}},
- {2977, {wxPrintout, offsetLogicalOrigin, 2}},
- {2978, {wxStyledTextCtrl, new_2, 2}},
- {2979, {wxStyledTextCtrl, new_0, 0}},
- {2980, {wxStyledTextCtrl, destruct, 0}},
- {2981, {wxStyledTextCtrl, create, 2}},
- {2982, {wxStyledTextCtrl, addText, 1}},
- {2983, {wxStyledTextCtrl, addStyledText, 1}},
- {2984, {wxStyledTextCtrl, insertText, 2}},
- {2985, {wxStyledTextCtrl, clearAll, 0}},
- {2986, {wxStyledTextCtrl, clearDocumentStyle, 0}},
- {2987, {wxStyledTextCtrl, getLength, 0}},
- {2988, {wxStyledTextCtrl, getCharAt, 1}},
- {2989, {wxStyledTextCtrl, getCurrentPos, 0}},
- {2990, {wxStyledTextCtrl, getAnchor, 0}},
- {2991, {wxStyledTextCtrl, getStyleAt, 1}},
- {2992, {wxStyledTextCtrl, redo, 0}},
- {2993, {wxStyledTextCtrl, setUndoCollection, 1}},
- {2994, {wxStyledTextCtrl, selectAll, 0}},
- {2995, {wxStyledTextCtrl, setSavePoint, 0}},
- {2996, {wxStyledTextCtrl, getStyledText, 2}},
- {2997, {wxStyledTextCtrl, canRedo, 0}},
- {2998, {wxStyledTextCtrl, markerLineFromHandle, 1}},
- {2999, {wxStyledTextCtrl, markerDeleteHandle, 1}},
- {3000, {wxStyledTextCtrl, getUndoCollection, 0}},
- {3001, {wxStyledTextCtrl, getViewWhiteSpace, 0}},
- {3002, {wxStyledTextCtrl, setViewWhiteSpace, 1}},
- {3003, {wxStyledTextCtrl, positionFromPoint, 1}},
- {3004, {wxStyledTextCtrl, positionFromPointClose, 2}},
- {3005, {wxStyledTextCtrl, gotoLine, 1}},
- {3006, {wxStyledTextCtrl, gotoPos, 1}},
- {3007, {wxStyledTextCtrl, setAnchor, 1}},
- {3008, {wxStyledTextCtrl, getCurLine, 1}},
- {3009, {wxStyledTextCtrl, getEndStyled, 0}},
- {3010, {wxStyledTextCtrl, convertEOLs, 1}},
- {3011, {wxStyledTextCtrl, getEOLMode, 0}},
- {3012, {wxStyledTextCtrl, setEOLMode, 1}},
- {3013, {wxStyledTextCtrl, startStyling, 2}},
- {3014, {wxStyledTextCtrl, setStyling, 2}},
- {3015, {wxStyledTextCtrl, getBufferedDraw, 0}},
- {3016, {wxStyledTextCtrl, setBufferedDraw, 1}},
- {3017, {wxStyledTextCtrl, setTabWidth, 1}},
- {3018, {wxStyledTextCtrl, getTabWidth, 0}},
- {3019, {wxStyledTextCtrl, setCodePage, 1}},
- {3020, {wxStyledTextCtrl, markerDefine, 3}},
- {3021, {wxStyledTextCtrl, markerSetForeground, 2}},
- {3022, {wxStyledTextCtrl, markerSetBackground, 2}},
- {3023, {wxStyledTextCtrl, markerAdd, 2}},
- {3024, {wxStyledTextCtrl, markerDelete, 2}},
- {3025, {wxStyledTextCtrl, markerDeleteAll, 1}},
- {3026, {wxStyledTextCtrl, markerGet, 1}},
- {3027, {wxStyledTextCtrl, markerNext, 2}},
- {3028, {wxStyledTextCtrl, markerPrevious, 2}},
- {3029, {wxStyledTextCtrl, markerDefineBitmap, 2}},
- {3030, {wxStyledTextCtrl, markerAddSet, 2}},
- {3031, {wxStyledTextCtrl, markerSetAlpha, 2}},
- {3032, {wxStyledTextCtrl, setMarginType, 2}},
- {3033, {wxStyledTextCtrl, getMarginType, 1}},
- {3034, {wxStyledTextCtrl, setMarginWidth, 2}},
- {3035, {wxStyledTextCtrl, getMarginWidth, 1}},
- {3036, {wxStyledTextCtrl, setMarginMask, 2}},
- {3037, {wxStyledTextCtrl, getMarginMask, 1}},
- {3038, {wxStyledTextCtrl, setMarginSensitive, 2}},
- {3039, {wxStyledTextCtrl, getMarginSensitive, 1}},
- {3040, {wxStyledTextCtrl, styleClearAll, 0}},
- {3041, {wxStyledTextCtrl, styleSetForeground, 2}},
- {3042, {wxStyledTextCtrl, styleSetBackground, 2}},
- {3043, {wxStyledTextCtrl, styleSetBold, 2}},
- {3044, {wxStyledTextCtrl, styleSetItalic, 2}},
- {3045, {wxStyledTextCtrl, styleSetSize, 2}},
- {3046, {wxStyledTextCtrl, styleSetFaceName, 2}},
- {3047, {wxStyledTextCtrl, styleSetEOLFilled, 2}},
- {3048, {wxStyledTextCtrl, styleResetDefault, 0}},
- {3049, {wxStyledTextCtrl, styleSetUnderline, 2}},
- {3050, {wxStyledTextCtrl, styleSetCase, 2}},
- {3051, {wxStyledTextCtrl, styleSetHotSpot, 2}},
- {3052, {wxStyledTextCtrl, setSelForeground, 2}},
- {3053, {wxStyledTextCtrl, setSelBackground, 2}},
- {3054, {wxStyledTextCtrl, getSelAlpha, 0}},
- {3055, {wxStyledTextCtrl, setSelAlpha, 1}},
- {3056, {wxStyledTextCtrl, setCaretForeground, 1}},
- {3057, {wxStyledTextCtrl, cmdKeyAssign, 3}},
- {3058, {wxStyledTextCtrl, cmdKeyClear, 2}},
- {3059, {wxStyledTextCtrl, cmdKeyClearAll, 0}},
- {3060, {wxStyledTextCtrl, setStyleBytes, 2}},
- {3061, {wxStyledTextCtrl, styleSetVisible, 2}},
- {3062, {wxStyledTextCtrl, getCaretPeriod, 0}},
- {3063, {wxStyledTextCtrl, setCaretPeriod, 1}},
- {3064, {wxStyledTextCtrl, setWordChars, 1}},
- {3065, {wxStyledTextCtrl, beginUndoAction, 0}},
- {3066, {wxStyledTextCtrl, endUndoAction, 0}},
- {3067, {wxStyledTextCtrl, indicatorSetStyle, 2}},
- {3068, {wxStyledTextCtrl, indicatorGetStyle, 1}},
- {3069, {wxStyledTextCtrl, indicatorSetForeground, 2}},
- {3070, {wxStyledTextCtrl, indicatorGetForeground, 1}},
- {3071, {wxStyledTextCtrl, setWhitespaceForeground, 2}},
- {3072, {wxStyledTextCtrl, setWhitespaceBackground, 2}},
- {3073, {wxStyledTextCtrl, getStyleBits, 0}},
- {3074, {wxStyledTextCtrl, setLineState, 2}},
- {3075, {wxStyledTextCtrl, getLineState, 1}},
- {3076, {wxStyledTextCtrl, getMaxLineState, 0}},
- {3077, {wxStyledTextCtrl, getCaretLineVisible, 0}},
- {3078, {wxStyledTextCtrl, setCaretLineVisible, 1}},
- {3079, {wxStyledTextCtrl, getCaretLineBackground, 0}},
- {3080, {wxStyledTextCtrl, setCaretLineBackground, 1}},
- {3081, {wxStyledTextCtrl, autoCompShow, 2}},
- {3082, {wxStyledTextCtrl, autoCompCancel, 0}},
- {3083, {wxStyledTextCtrl, autoCompActive, 0}},
- {3084, {wxStyledTextCtrl, autoCompPosStart, 0}},
- {3085, {wxStyledTextCtrl, autoCompComplete, 0}},
- {3086, {wxStyledTextCtrl, autoCompStops, 1}},
- {3087, {wxStyledTextCtrl, autoCompSetSeparator, 1}},
- {3088, {wxStyledTextCtrl, autoCompGetSeparator, 0}},
- {3089, {wxStyledTextCtrl, autoCompSelect, 1}},
- {3090, {wxStyledTextCtrl, autoCompSetCancelAtStart, 1}},
- {3091, {wxStyledTextCtrl, autoCompGetCancelAtStart, 0}},
- {3092, {wxStyledTextCtrl, autoCompSetFillUps, 1}},
- {3093, {wxStyledTextCtrl, autoCompSetChooseSingle, 1}},
- {3094, {wxStyledTextCtrl, autoCompGetChooseSingle, 0}},
- {3095, {wxStyledTextCtrl, autoCompSetIgnoreCase, 1}},
- {3096, {wxStyledTextCtrl, autoCompGetIgnoreCase, 0}},
- {3097, {wxStyledTextCtrl, userListShow, 2}},
- {3098, {wxStyledTextCtrl, autoCompSetAutoHide, 1}},
- {3099, {wxStyledTextCtrl, autoCompGetAutoHide, 0}},
- {3100, {wxStyledTextCtrl, autoCompSetDropRestOfWord, 1}},
- {3101, {wxStyledTextCtrl, autoCompGetDropRestOfWord, 0}},
- {3102, {wxStyledTextCtrl, registerImage, 2}},
- {3103, {wxStyledTextCtrl, clearRegisteredImages, 0}},
- {3104, {wxStyledTextCtrl, autoCompGetTypeSeparator, 0}},
- {3105, {wxStyledTextCtrl, autoCompSetTypeSeparator, 1}},
- {3106, {wxStyledTextCtrl, autoCompSetMaxWidth, 1}},
- {3107, {wxStyledTextCtrl, autoCompGetMaxWidth, 0}},
- {3108, {wxStyledTextCtrl, autoCompSetMaxHeight, 1}},
- {3109, {wxStyledTextCtrl, autoCompGetMaxHeight, 0}},
- {3110, {wxStyledTextCtrl, setIndent, 1}},
- {3111, {wxStyledTextCtrl, getIndent, 0}},
- {3112, {wxStyledTextCtrl, setUseTabs, 1}},
- {3113, {wxStyledTextCtrl, getUseTabs, 0}},
- {3114, {wxStyledTextCtrl, setLineIndentation, 2}},
- {3115, {wxStyledTextCtrl, getLineIndentation, 1}},
- {3116, {wxStyledTextCtrl, getLineIndentPosition, 1}},
- {3117, {wxStyledTextCtrl, getColumn, 1}},
- {3118, {wxStyledTextCtrl, setUseHorizontalScrollBar, 1}},
- {3119, {wxStyledTextCtrl, getUseHorizontalScrollBar, 0}},
- {3120, {wxStyledTextCtrl, setIndentationGuides, 1}},
- {3121, {wxStyledTextCtrl, getIndentationGuides, 0}},
- {3122, {wxStyledTextCtrl, setHighlightGuide, 1}},
- {3123, {wxStyledTextCtrl, getHighlightGuide, 0}},
- {3124, {wxStyledTextCtrl, getLineEndPosition, 1}},
- {3125, {wxStyledTextCtrl, getCodePage, 0}},
- {3126, {wxStyledTextCtrl, getCaretForeground, 0}},
- {3127, {wxStyledTextCtrl, getReadOnly, 0}},
- {3128, {wxStyledTextCtrl, setCurrentPos, 1}},
- {3129, {wxStyledTextCtrl, setSelectionStart, 1}},
- {3130, {wxStyledTextCtrl, getSelectionStart, 0}},
- {3131, {wxStyledTextCtrl, setSelectionEnd, 1}},
- {3132, {wxStyledTextCtrl, getSelectionEnd, 0}},
- {3133, {wxStyledTextCtrl, setPrintMagnification, 1}},
- {3134, {wxStyledTextCtrl, getPrintMagnification, 0}},
- {3135, {wxStyledTextCtrl, setPrintColourMode, 1}},
- {3136, {wxStyledTextCtrl, getPrintColourMode, 0}},
- {3137, {wxStyledTextCtrl, findText, 4}},
- {3138, {wxStyledTextCtrl, formatRange, 7}},
- {3139, {wxStyledTextCtrl, getFirstVisibleLine, 0}},
- {3140, {wxStyledTextCtrl, getLine, 1}},
- {3141, {wxStyledTextCtrl, getLineCount, 0}},
- {3142, {wxStyledTextCtrl, setMarginLeft, 1}},
- {3143, {wxStyledTextCtrl, getMarginLeft, 0}},
- {3144, {wxStyledTextCtrl, setMarginRight, 1}},
- {3145, {wxStyledTextCtrl, getMarginRight, 0}},
- {3146, {wxStyledTextCtrl, getModify, 0}},
- {3147, {wxStyledTextCtrl, setSelection, 2}},
- {3148, {wxStyledTextCtrl, getSelectedText, 0}},
- {3149, {wxStyledTextCtrl, getTextRange, 2}},
- {3150, {wxStyledTextCtrl, hideSelection, 1}},
- {3151, {wxStyledTextCtrl, lineFromPosition, 1}},
- {3152, {wxStyledTextCtrl, positionFromLine, 1}},
- {3153, {wxStyledTextCtrl, lineScroll, 2}},
- {3154, {wxStyledTextCtrl, ensureCaretVisible, 0}},
- {3155, {wxStyledTextCtrl, replaceSelection, 1}},
- {3156, {wxStyledTextCtrl, setReadOnly, 1}},
- {3157, {wxStyledTextCtrl, canPaste, 0}},
- {3158, {wxStyledTextCtrl, canUndo, 0}},
- {3159, {wxStyledTextCtrl, emptyUndoBuffer, 0}},
- {3160, {wxStyledTextCtrl, undo, 0}},
- {3161, {wxStyledTextCtrl, cut, 0}},
- {3162, {wxStyledTextCtrl, copy, 0}},
- {3163, {wxStyledTextCtrl, paste, 0}},
- {3164, {wxStyledTextCtrl, clear, 0}},
- {3165, {wxStyledTextCtrl, setText, 1}},
- {3166, {wxStyledTextCtrl, getText, 0}},
- {3167, {wxStyledTextCtrl, getTextLength, 0}},
- {3168, {wxStyledTextCtrl, getOvertype, 0}},
- {3169, {wxStyledTextCtrl, setCaretWidth, 1}},
- {3170, {wxStyledTextCtrl, getCaretWidth, 0}},
- {3171, {wxStyledTextCtrl, setTargetStart, 1}},
- {3172, {wxStyledTextCtrl, getTargetStart, 0}},
- {3173, {wxStyledTextCtrl, setTargetEnd, 1}},
- {3174, {wxStyledTextCtrl, getTargetEnd, 0}},
- {3175, {wxStyledTextCtrl, replaceTarget, 1}},
- {3176, {wxStyledTextCtrl, searchInTarget, 1}},
- {3177, {wxStyledTextCtrl, setSearchFlags, 1}},
- {3178, {wxStyledTextCtrl, getSearchFlags, 0}},
- {3179, {wxStyledTextCtrl, callTipShow, 2}},
- {3180, {wxStyledTextCtrl, callTipCancel, 0}},
- {3181, {wxStyledTextCtrl, callTipActive, 0}},
- {3182, {wxStyledTextCtrl, callTipPosAtStart, 0}},
- {3183, {wxStyledTextCtrl, callTipSetHighlight, 2}},
- {3184, {wxStyledTextCtrl, callTipSetBackground, 1}},
- {3185, {wxStyledTextCtrl, callTipSetForeground, 1}},
- {3186, {wxStyledTextCtrl, callTipSetForegroundHighlight, 1}},
- {3187, {wxStyledTextCtrl, callTipUseStyle, 1}},
- {3188, {wxStyledTextCtrl, visibleFromDocLine, 1}},
- {3189, {wxStyledTextCtrl, docLineFromVisible, 1}},
- {3190, {wxStyledTextCtrl, wrapCount, 1}},
- {3191, {wxStyledTextCtrl, setFoldLevel, 2}},
- {3192, {wxStyledTextCtrl, getFoldLevel, 1}},
- {3193, {wxStyledTextCtrl, getLastChild, 2}},
- {3194, {wxStyledTextCtrl, getFoldParent, 1}},
- {3195, {wxStyledTextCtrl, showLines, 2}},
- {3196, {wxStyledTextCtrl, hideLines, 2}},
- {3197, {wxStyledTextCtrl, getLineVisible, 1}},
- {3198, {wxStyledTextCtrl, setFoldExpanded, 2}},
- {3199, {wxStyledTextCtrl, getFoldExpanded, 1}},
- {3200, {wxStyledTextCtrl, toggleFold, 1}},
- {3201, {wxStyledTextCtrl, ensureVisible, 1}},
- {3202, {wxStyledTextCtrl, setFoldFlags, 1}},
- {3203, {wxStyledTextCtrl, ensureVisibleEnforcePolicy, 1}},
- {3204, {wxStyledTextCtrl, setTabIndents, 1}},
- {3205, {wxStyledTextCtrl, getTabIndents, 0}},
- {3206, {wxStyledTextCtrl, setBackSpaceUnIndents, 1}},
- {3207, {wxStyledTextCtrl, getBackSpaceUnIndents, 0}},
- {3208, {wxStyledTextCtrl, setMouseDwellTime, 1}},
- {3209, {wxStyledTextCtrl, getMouseDwellTime, 0}},
- {3210, {wxStyledTextCtrl, wordStartPosition, 2}},
- {3211, {wxStyledTextCtrl, wordEndPosition, 2}},
- {3212, {wxStyledTextCtrl, setWrapMode, 1}},
- {3213, {wxStyledTextCtrl, getWrapMode, 0}},
- {3214, {wxStyledTextCtrl, setWrapVisualFlags, 1}},
- {3215, {wxStyledTextCtrl, getWrapVisualFlags, 0}},
- {3216, {wxStyledTextCtrl, setWrapVisualFlagsLocation, 1}},
- {3217, {wxStyledTextCtrl, getWrapVisualFlagsLocation, 0}},
- {3218, {wxStyledTextCtrl, setWrapStartIndent, 1}},
- {3219, {wxStyledTextCtrl, getWrapStartIndent, 0}},
- {3220, {wxStyledTextCtrl, setLayoutCache, 1}},
- {3221, {wxStyledTextCtrl, getLayoutCache, 0}},
- {3222, {wxStyledTextCtrl, setScrollWidth, 1}},
- {3223, {wxStyledTextCtrl, getScrollWidth, 0}},
- {3224, {wxStyledTextCtrl, textWidth, 2}},
- {3225, {wxStyledTextCtrl, getEndAtLastLine, 0}},
- {3226, {wxStyledTextCtrl, textHeight, 1}},
- {3227, {wxStyledTextCtrl, setUseVerticalScrollBar, 1}},
- {3228, {wxStyledTextCtrl, getUseVerticalScrollBar, 0}},
- {3229, {wxStyledTextCtrl, appendText, 1}},
- {3230, {wxStyledTextCtrl, getTwoPhaseDraw, 0}},
- {3231, {wxStyledTextCtrl, setTwoPhaseDraw, 1}},
- {3232, {wxStyledTextCtrl, targetFromSelection, 0}},
- {3233, {wxStyledTextCtrl, linesJoin, 0}},
- {3234, {wxStyledTextCtrl, linesSplit, 1}},
- {3235, {wxStyledTextCtrl, setFoldMarginColour, 2}},
- {3236, {wxStyledTextCtrl, setFoldMarginHiColour, 2}},
- {3237, {wxStyledTextCtrl, lineDown, 0}},
- {3238, {wxStyledTextCtrl, lineDownExtend, 0}},
- {3239, {wxStyledTextCtrl, lineUp, 0}},
- {3240, {wxStyledTextCtrl, lineUpExtend, 0}},
- {3241, {wxStyledTextCtrl, charLeft, 0}},
- {3242, {wxStyledTextCtrl, charLeftExtend, 0}},
- {3243, {wxStyledTextCtrl, charRight, 0}},
- {3244, {wxStyledTextCtrl, charRightExtend, 0}},
- {3245, {wxStyledTextCtrl, wordLeft, 0}},
- {3246, {wxStyledTextCtrl, wordLeftExtend, 0}},
- {3247, {wxStyledTextCtrl, wordRight, 0}},
- {3248, {wxStyledTextCtrl, wordRightExtend, 0}},
- {3249, {wxStyledTextCtrl, home, 0}},
- {3250, {wxStyledTextCtrl, homeExtend, 0}},
- {3251, {wxStyledTextCtrl, lineEnd, 0}},
- {3252, {wxStyledTextCtrl, lineEndExtend, 0}},
- {3253, {wxStyledTextCtrl, documentStart, 0}},
- {3254, {wxStyledTextCtrl, documentStartExtend, 0}},
- {3255, {wxStyledTextCtrl, documentEnd, 0}},
- {3256, {wxStyledTextCtrl, documentEndExtend, 0}},
- {3257, {wxStyledTextCtrl, pageUp, 0}},
- {3258, {wxStyledTextCtrl, pageUpExtend, 0}},
- {3259, {wxStyledTextCtrl, pageDown, 0}},
- {3260, {wxStyledTextCtrl, pageDownExtend, 0}},
- {3261, {wxStyledTextCtrl, editToggleOvertype, 0}},
- {3262, {wxStyledTextCtrl, cancel, 0}},
- {3263, {wxStyledTextCtrl, deleteBack, 0}},
- {3264, {wxStyledTextCtrl, tab, 0}},
- {3265, {wxStyledTextCtrl, backTab, 0}},
- {3266, {wxStyledTextCtrl, newLine, 0}},
- {3267, {wxStyledTextCtrl, formFeed, 0}},
- {3268, {wxStyledTextCtrl, vCHome, 0}},
- {3269, {wxStyledTextCtrl, vCHomeExtend, 0}},
- {3270, {wxStyledTextCtrl, zoomIn, 0}},
- {3271, {wxStyledTextCtrl, zoomOut, 0}},
- {3272, {wxStyledTextCtrl, delWordLeft, 0}},
- {3273, {wxStyledTextCtrl, delWordRight, 0}},
- {3274, {wxStyledTextCtrl, lineCut, 0}},
- {3275, {wxStyledTextCtrl, lineDelete, 0}},
- {3276, {wxStyledTextCtrl, lineTranspose, 0}},
- {3277, {wxStyledTextCtrl, lineDuplicate, 0}},
- {3278, {wxStyledTextCtrl, lowerCase, 0}},
- {3279, {wxStyledTextCtrl, upperCase, 0}},
- {3280, {wxStyledTextCtrl, lineScrollDown, 0}},
- {3281, {wxStyledTextCtrl, lineScrollUp, 0}},
- {3282, {wxStyledTextCtrl, deleteBackNotLine, 0}},
- {3283, {wxStyledTextCtrl, homeDisplay, 0}},
- {3284, {wxStyledTextCtrl, homeDisplayExtend, 0}},
- {3285, {wxStyledTextCtrl, lineEndDisplay, 0}},
- {3286, {wxStyledTextCtrl, lineEndDisplayExtend, 0}},
- {3287, {wxStyledTextCtrl, homeWrapExtend, 0}},
- {3288, {wxStyledTextCtrl, lineEndWrap, 0}},
- {3289, {wxStyledTextCtrl, lineEndWrapExtend, 0}},
- {3290, {wxStyledTextCtrl, vCHomeWrap, 0}},
- {3291, {wxStyledTextCtrl, vCHomeWrapExtend, 0}},
- {3292, {wxStyledTextCtrl, lineCopy, 0}},
- {3293, {wxStyledTextCtrl, moveCaretInsideView, 0}},
- {3294, {wxStyledTextCtrl, lineLength, 1}},
- {3295, {wxStyledTextCtrl, braceHighlight, 2}},
- {3296, {wxStyledTextCtrl, braceBadLight, 1}},
- {3297, {wxStyledTextCtrl, braceMatch, 1}},
- {3298, {wxStyledTextCtrl, getViewEOL, 0}},
- {3299, {wxStyledTextCtrl, setViewEOL, 1}},
- {3300, {wxStyledTextCtrl, setModEventMask, 1}},
- {3301, {wxStyledTextCtrl, getEdgeColumn, 0}},
- {3302, {wxStyledTextCtrl, setEdgeColumn, 1}},
- {3303, {wxStyledTextCtrl, setEdgeMode, 1}},
- {3304, {wxStyledTextCtrl, getEdgeMode, 0}},
- {3305, {wxStyledTextCtrl, getEdgeColour, 0}},
- {3306, {wxStyledTextCtrl, setEdgeColour, 1}},
- {3307, {wxStyledTextCtrl, searchAnchor, 0}},
- {3308, {wxStyledTextCtrl, searchNext, 2}},
- {3309, {wxStyledTextCtrl, searchPrev, 2}},
- {3310, {wxStyledTextCtrl, linesOnScreen, 0}},
- {3311, {wxStyledTextCtrl, usePopUp, 1}},
- {3312, {wxStyledTextCtrl, selectionIsRectangle, 0}},
- {3313, {wxStyledTextCtrl, setZoom, 1}},
- {3314, {wxStyledTextCtrl, getZoom, 0}},
- {3315, {wxStyledTextCtrl, getModEventMask, 0}},
- {3316, {wxStyledTextCtrl, setSTCFocus, 1}},
- {3317, {wxStyledTextCtrl, getSTCFocus, 0}},
- {3318, {wxStyledTextCtrl, setStatus, 1}},
- {3319, {wxStyledTextCtrl, getStatus, 0}},
- {3320, {wxStyledTextCtrl, setMouseDownCaptures, 1}},
- {3321, {wxStyledTextCtrl, getMouseDownCaptures, 0}},
- {3322, {wxStyledTextCtrl, setSTCCursor, 1}},
- {3323, {wxStyledTextCtrl, getSTCCursor, 0}},
- {3324, {wxStyledTextCtrl, setControlCharSymbol, 1}},
- {3325, {wxStyledTextCtrl, getControlCharSymbol, 0}},
- {3326, {wxStyledTextCtrl, wordPartLeft, 0}},
- {3327, {wxStyledTextCtrl, wordPartLeftExtend, 0}},
- {3328, {wxStyledTextCtrl, wordPartRight, 0}},
- {3329, {wxStyledTextCtrl, wordPartRightExtend, 0}},
- {3330, {wxStyledTextCtrl, setVisiblePolicy, 2}},
- {3331, {wxStyledTextCtrl, delLineLeft, 0}},
- {3332, {wxStyledTextCtrl, delLineRight, 0}},
- {3333, {wxStyledTextCtrl, getXOffset, 0}},
- {3334, {wxStyledTextCtrl, chooseCaretX, 0}},
- {3335, {wxStyledTextCtrl, setXCaretPolicy, 2}},
- {3336, {wxStyledTextCtrl, setYCaretPolicy, 2}},
- {3337, {wxStyledTextCtrl, getPrintWrapMode, 0}},
- {3338, {wxStyledTextCtrl, setHotspotActiveForeground, 2}},
- {3339, {wxStyledTextCtrl, setHotspotActiveBackground, 2}},
- {3340, {wxStyledTextCtrl, setHotspotActiveUnderline, 1}},
- {3341, {wxStyledTextCtrl, setHotspotSingleLine, 1}},
- {3342, {wxStyledTextCtrl, paraDownExtend, 0}},
- {3343, {wxStyledTextCtrl, paraUp, 0}},
- {3344, {wxStyledTextCtrl, paraUpExtend, 0}},
- {3345, {wxStyledTextCtrl, positionBefore, 1}},
- {3346, {wxStyledTextCtrl, positionAfter, 1}},
- {3347, {wxStyledTextCtrl, copyRange, 2}},
- {3348, {wxStyledTextCtrl, copyText, 2}},
- {3349, {wxStyledTextCtrl, setSelectionMode, 1}},
- {3350, {wxStyledTextCtrl, getSelectionMode, 0}},
- {3351, {wxStyledTextCtrl, lineDownRectExtend, 0}},
- {3352, {wxStyledTextCtrl, lineUpRectExtend, 0}},
- {3353, {wxStyledTextCtrl, charLeftRectExtend, 0}},
- {3354, {wxStyledTextCtrl, charRightRectExtend, 0}},
- {3355, {wxStyledTextCtrl, homeRectExtend, 0}},
- {3356, {wxStyledTextCtrl, vCHomeRectExtend, 0}},
- {3357, {wxStyledTextCtrl, lineEndRectExtend, 0}},
- {3358, {wxStyledTextCtrl, pageUpRectExtend, 0}},
- {3359, {wxStyledTextCtrl, pageDownRectExtend, 0}},
- {3360, {wxStyledTextCtrl, stutteredPageUp, 0}},
- {3361, {wxStyledTextCtrl, stutteredPageUpExtend, 0}},
- {3362, {wxStyledTextCtrl, stutteredPageDown, 0}},
- {3363, {wxStyledTextCtrl, stutteredPageDownExtend, 0}},
- {3364, {wxStyledTextCtrl, wordLeftEnd, 0}},
- {3365, {wxStyledTextCtrl, wordLeftEndExtend, 0}},
- {3366, {wxStyledTextCtrl, wordRightEnd, 0}},
- {3367, {wxStyledTextCtrl, wordRightEndExtend, 0}},
- {3368, {wxStyledTextCtrl, setWhitespaceChars, 1}},
- {3369, {wxStyledTextCtrl, setCharsDefault, 0}},
- {3370, {wxStyledTextCtrl, autoCompGetCurrent, 0}},
- {3371, {wxStyledTextCtrl, allocate, 1}},
- {3372, {wxStyledTextCtrl, findColumn, 2}},
- {3373, {wxStyledTextCtrl, getCaretSticky, 0}},
- {3374, {wxStyledTextCtrl, setCaretSticky, 1}},
- {3375, {wxStyledTextCtrl, toggleCaretSticky, 0}},
- {3376, {wxStyledTextCtrl, setPasteConvertEndings, 1}},
- {3377, {wxStyledTextCtrl, getPasteConvertEndings, 0}},
- {3378, {wxStyledTextCtrl, selectionDuplicate, 0}},
- {3379, {wxStyledTextCtrl, setCaretLineBackAlpha, 1}},
- {3380, {wxStyledTextCtrl, getCaretLineBackAlpha, 0}},
- {3381, {wxStyledTextCtrl, startRecord, 0}},
- {3382, {wxStyledTextCtrl, stopRecord, 0}},
- {3383, {wxStyledTextCtrl, setLexer, 1}},
- {3384, {wxStyledTextCtrl, getLexer, 0}},
- {3385, {wxStyledTextCtrl, colourise, 2}},
- {3386, {wxStyledTextCtrl, setProperty, 2}},
- {3387, {wxStyledTextCtrl, setKeyWords, 2}},
- {3388, {wxStyledTextCtrl, setLexerLanguage, 1}},
- {3389, {wxStyledTextCtrl, getProperty, 1}},
- {3390, {wxStyledTextCtrl, getStyleBitsNeeded, 0}},
- {3391, {wxStyledTextCtrl, getCurrentLine, 0}},
- {3392, {wxStyledTextCtrl, styleSetSpec, 2}},
- {3393, {wxStyledTextCtrl, styleSetFont, 2}},
- {3394, {wxStyledTextCtrl, styleSetFontAttr, 7}},
- {3395, {wxStyledTextCtrl, styleSetCharacterSet, 2}},
- {3396, {wxStyledTextCtrl, styleSetFontEncoding, 2}},
- {3397, {wxStyledTextCtrl, cmdKeyExecute, 1}},
- {3398, {wxStyledTextCtrl, setMargins, 2}},
- {3399, {wxStyledTextCtrl, getSelection, 2}},
- {3400, {wxStyledTextCtrl, pointFromPosition, 1}},
- {3401, {wxStyledTextCtrl, scrollToLine, 1}},
- {3402, {wxStyledTextCtrl, scrollToColumn, 1}},
- {3403, {wxStyledTextCtrl, setVScrollBar, 1}},
- {3404, {wxStyledTextCtrl, setHScrollBar, 1}},
- {3405, {wxStyledTextCtrl, getLastKeydownProcessed, 0}},
- {3406, {wxStyledTextCtrl, setLastKeydownProcessed, 1}},
- {3407, {wxStyledTextCtrl, saveFile, 1}},
- {3408, {wxStyledTextCtrl, loadFile, 1}},
- {3409, {wxStyledTextCtrl, doDragOver, 3}},
- {3410, {wxStyledTextCtrl, doDropText, 3}},
- {3411, {wxStyledTextCtrl, getUseAntiAliasing, 0}},
- {3412, {wxStyledTextCtrl, addTextRaw, 1}},
- {3413, {wxStyledTextCtrl, insertTextRaw, 2}},
- {3414, {wxStyledTextCtrl, getCurLineRaw, 1}},
- {3415, {wxStyledTextCtrl, getLineRaw, 1}},
- {3416, {wxStyledTextCtrl, getSelectedTextRaw, 0}},
- {3417, {wxStyledTextCtrl, getTextRangeRaw, 2}},
- {3418, {wxStyledTextCtrl, setTextRaw, 1}},
- {3419, {wxStyledTextCtrl, getTextRaw, 0}},
- {3420, {wxStyledTextCtrl, appendTextRaw, 1}},
- {3421, {wxArtProvider, getBitmap, 2}},
- {3422, {wxArtProvider, getIcon, 2}},
- {3423, {wxTreeEvent, getKeyCode, 0}},
- {3424, {wxTreeEvent, getItem, 0}},
- {3425, {wxTreeEvent, getKeyEvent, 0}},
- {3426, {wxTreeEvent, getLabel, 0}},
- {3427, {wxTreeEvent, getOldItem, 0}},
- {3428, {wxTreeEvent, getPoint, 0}},
- {3429, {wxTreeEvent, isEditCancelled, 0}},
- {3430, {wxTreeEvent, setToolTip, 1}},
- {3431, {wxNotebookEvent, getOldSelection, 0}},
- {3432, {wxNotebookEvent, getSelection, 0}},
- {3433, {wxNotebookEvent, setOldSelection, 1}},
- {3434, {wxNotebookEvent, setSelection, 1}},
- {3435, {wxFileDataObject, new, 0}},
- {3436, {wxFileDataObject, addFile, 1}},
- {3437, {wxFileDataObject, getFilenames, 0}},
- {3438, {wxFileDataObject, 'Destroy', undefined}},
- {3439, {wxTextDataObject, new, 1}},
- {3440, {wxTextDataObject, getTextLength, 0}},
- {3441, {wxTextDataObject, getText, 0}},
- {3442, {wxTextDataObject, setText, 1}},
- {3443, {wxTextDataObject, 'Destroy', undefined}},
- {3444, {wxBitmapDataObject, new_1_1, 1}},
- {3445, {wxBitmapDataObject, new_1_0, 1}},
- {3446, {wxBitmapDataObject, getBitmap, 0}},
- {3447, {wxBitmapDataObject, setBitmap, 1}},
- {3448, {wxBitmapDataObject, 'Destroy', undefined}},
- {3450, {wxClipboard, new, 0}},
- {3451, {wxClipboard, destruct, 0}},
- {3452, {wxClipboard, addData, 1}},
- {3453, {wxClipboard, clear, 0}},
- {3454, {wxClipboard, close, 0}},
- {3455, {wxClipboard, flush, 0}},
- {3456, {wxClipboard, getData, 1}},
- {3457, {wxClipboard, isOpened, 0}},
- {3458, {wxClipboard, open, 0}},
- {3459, {wxClipboard, setData, 1}},
- {3461, {wxClipboard, usePrimarySelection, 1}},
- {3462, {wxClipboard, isSupported, 1}},
- {3463, {wxClipboard, get, 0}},
- {3464, {wxSpinEvent, getPosition, 0}},
- {3465, {wxSpinEvent, setPosition, 1}},
- {3466, {wxSplitterWindow, new_0, 0}},
- {3467, {wxSplitterWindow, new_2, 2}},
- {3468, {wxSplitterWindow, destruct, 0}},
- {3469, {wxSplitterWindow, create, 2}},
- {3470, {wxSplitterWindow, getMinimumPaneSize, 0}},
- {3471, {wxSplitterWindow, getSashGravity, 0}},
- {3472, {wxSplitterWindow, getSashPosition, 0}},
- {3473, {wxSplitterWindow, getSplitMode, 0}},
- {3474, {wxSplitterWindow, getWindow1, 0}},
- {3475, {wxSplitterWindow, getWindow2, 0}},
- {3476, {wxSplitterWindow, initialize, 1}},
- {3477, {wxSplitterWindow, isSplit, 0}},
- {3478, {wxSplitterWindow, replaceWindow, 2}},
- {3479, {wxSplitterWindow, setSashGravity, 1}},
- {3480, {wxSplitterWindow, setSashPosition, 2}},
- {3481, {wxSplitterWindow, setSashSize, 1}},
- {3482, {wxSplitterWindow, setMinimumPaneSize, 1}},
- {3483, {wxSplitterWindow, setSplitMode, 1}},
- {3484, {wxSplitterWindow, splitHorizontally, 3}},
- {3485, {wxSplitterWindow, splitVertically, 3}},
- {3486, {wxSplitterWindow, unsplit, 1}},
- {3487, {wxSplitterWindow, updateSize, 0}},
- {3488, {wxSplitterEvent, getSashPosition, 0}},
- {3489, {wxSplitterEvent, getX, 0}},
- {3490, {wxSplitterEvent, getY, 0}},
- {3491, {wxSplitterEvent, getWindowBeingRemoved, 0}},
- {3492, {wxSplitterEvent, setSashPosition, 1}},
- {3493, {wxHtmlWindow, new_0, 0}},
- {3494, {wxHtmlWindow, new_2, 2}},
- {3495, {wxHtmlWindow, appendToPage, 1}},
- {3496, {wxHtmlWindow, getOpenedAnchor, 0}},
- {3497, {wxHtmlWindow, getOpenedPage, 0}},
- {3498, {wxHtmlWindow, getOpenedPageTitle, 0}},
- {3499, {wxHtmlWindow, getRelatedFrame, 0}},
- {3500, {wxHtmlWindow, historyBack, 0}},
- {3501, {wxHtmlWindow, historyCanBack, 0}},
- {3502, {wxHtmlWindow, historyCanForward, 0}},
- {3503, {wxHtmlWindow, historyClear, 0}},
- {3504, {wxHtmlWindow, historyForward, 0}},
- {3505, {wxHtmlWindow, loadFile, 1}},
- {3506, {wxHtmlWindow, loadPage, 1}},
- {3507, {wxHtmlWindow, selectAll, 0}},
- {3508, {wxHtmlWindow, selectionToText, 0}},
- {3509, {wxHtmlWindow, selectLine, 1}},
- {3510, {wxHtmlWindow, selectWord, 1}},
- {3511, {wxHtmlWindow, setBorders, 1}},
- {3512, {wxHtmlWindow, setFonts, 3}},
- {3513, {wxHtmlWindow, setPage, 1}},
- {3514, {wxHtmlWindow, setRelatedFrame, 2}},
- {3515, {wxHtmlWindow, setRelatedStatusBar, 1}},
- {3516, {wxHtmlWindow, toText, 0}},
- {3517, {wxHtmlWindow, 'Destroy', undefined}},
- {3518, {wxHtmlLinkEvent, getLinkInfo, 0}},
- {3519, {wxSystemSettings, getColour, 1}},
- {3520, {wxSystemSettings, getFont, 1}},
- {3521, {wxSystemSettings, getMetric, 2}},
- {3522, {wxSystemSettings, getScreenType, 0}},
- {3523, {wxSystemOptions, getOption, 1}},
- {3524, {wxSystemOptions, getOptionInt, 1}},
- {3525, {wxSystemOptions, hasOption, 1}},
- {3526, {wxSystemOptions, isFalse, 1}},
- {3527, {wxSystemOptions, setOption_2_1, 2}},
- {3528, {wxSystemOptions, setOption_2_0, 2}},
- {3529, {wxAuiNotebookEvent, setSelection, 1}},
- {3530, {wxAuiNotebookEvent, getSelection, 0}},
- {3531, {wxAuiNotebookEvent, setOldSelection, 1}},
- {3532, {wxAuiNotebookEvent, getOldSelection, 0}},
- {3533, {wxAuiNotebookEvent, setDragSource, 1}},
- {3534, {wxAuiNotebookEvent, getDragSource, 0}},
- {3535, {wxAuiManagerEvent, setManager, 1}},
- {3536, {wxAuiManagerEvent, getManager, 0}},
- {3537, {wxAuiManagerEvent, setPane, 1}},
- {3538, {wxAuiManagerEvent, getPane, 0}},
- {3539, {wxAuiManagerEvent, setButton, 1}},
- {3540, {wxAuiManagerEvent, getButton, 0}},
- {3541, {wxAuiManagerEvent, setDC, 1}},
- {3542, {wxAuiManagerEvent, getDC, 0}},
- {3543, {wxAuiManagerEvent, veto, 1}},
- {3544, {wxAuiManagerEvent, getVeto, 0}},
- {3545, {wxAuiManagerEvent, setCanVeto, 1}},
- {3546, {wxAuiManagerEvent, canVeto, 0}},
- {3547, {wxLogNull, new, 0}},
- {3548, {wxLogNull, 'Destroy', undefined}},
- {3549, {wxTaskBarIcon, new, 0}},
- {3550, {wxTaskBarIcon, destruct, 0}},
- {3551, {wxTaskBarIcon, popupMenu, 1}},
- {3552, {wxTaskBarIcon, removeIcon, 0}},
- {3553, {wxTaskBarIcon, setIcon, 2}},
- {3554, {wxLocale, new_0, 0}},
- {3556, {wxLocale, new_2, 2}},
- {3557, {wxLocale, destruct, 0}},
- {3559, {wxLocale, init, 1}},
- {3560, {wxLocale, addCatalog_1, 1}},
- {3561, {wxLocale, addCatalog_3, 3}},
- {3562, {wxLocale, addCatalogLookupPathPrefix, 1}},
- {3563, {wxLocale, getCanonicalName, 0}},
- {3564, {wxLocale, getLanguage, 0}},
- {3565, {wxLocale, getLanguageName, 1}},
- {3566, {wxLocale, getLocale, 0}},
- {3567, {wxLocale, getName, 0}},
- {3568, {wxLocale, getString_2, 2}},
- {3569, {wxLocale, getString_4, 4}},
- {3570, {wxLocale, getHeaderValue, 2}},
- {3571, {wxLocale, getSysName, 0}},
- {3572, {wxLocale, getSystemEncoding, 0}},
- {3573, {wxLocale, getSystemEncodingName, 0}},
- {3574, {wxLocale, getSystemLanguage, 0}},
- {3575, {wxLocale, isLoaded, 1}},
- {3576, {wxLocale, isOk, 0}},
- {3577, {wxActivateEvent, getActive, 0}},
- {3579, {wxPopupWindow, new_2, 2}},
- {3580, {wxPopupWindow, new_0, 0}},
- {3582, {wxPopupWindow, destruct, 0}},
- {3583, {wxPopupWindow, create, 2}},
- {3584, {wxPopupWindow, position, 2}},
- {3585, {wxPopupTransientWindow, new_0, 0}},
- {3586, {wxPopupTransientWindow, new_2, 2}},
- {3587, {wxPopupTransientWindow, destruct, 0}},
- {3588, {wxPopupTransientWindow, popup, 1}},
- {3589, {wxPopupTransientWindow, dismiss, 0}},
- {3590, {wxOverlay, new, 0}},
- {3591, {wxOverlay, destruct, 0}},
- {3592, {wxOverlay, reset, 0}},
- {3593, {wxDCOverlay, new_6, 6}},
- {3594, {wxDCOverlay, new_2, 2}},
- {3595, {wxDCOverlay, destruct, 0}},
- {3596, {wxDCOverlay, clear, 0}},
- {3597, {wxDropFilesEvent, getPosition, 0}},
- {3598, {wxDropFilesEvent, getNumberOfFiles, 0}},
- {3599, {wxDropFilesEvent, getFiles, 0}},
- {3600, {wxDisplay, new, 1}},
- {3601, {wxDisplay, destruct, 0}},
- {3602, {wxDisplay, isOk, 0}},
- {3603, {wxDisplay, getClientArea, 0}},
- {3604, {wxDisplay, getGeometry, 0}},
- {3605, {wxDisplay, getName, 0}},
- {3606, {wxDisplay, isPrimary, 0}},
- {3607, {wxDisplay, getCount, 0}},
- {3608, {wxDisplay, getFromPoint, 1}},
- {3609, {wxDisplay, getFromWindow, 1}},
- {3610, {wxDisplay, getPPI, 0}},
- {3611, {wxGCDC, new_1, 1}},
- {3612, {wxGCDC, new_0, 0}},
- {3613, {wxGCDC, destruct, 0}},
- {3614, {wxGCDC, getGraphicsContext, 0}},
- {3615, {wxGCDC, setGraphicsContext, 1}},
+ {201, {wxWindow, isShownOnScreen, 0}},
+ {202, {wxWindow, layout, 0}},
+ {203, {wxWindow, lineDown, 0}},
+ {204, {wxWindow, lineUp, 0}},
+ {205, {wxWindow, lower, 0}},
+ {206, {wxWindow, makeModal, 1}},
+ {207, {wxWindow, move_3, 3}},
+ {208, {wxWindow, move_2, 2}},
+ {209, {wxWindow, moveAfterInTabOrder, 1}},
+ {210, {wxWindow, moveBeforeInTabOrder, 1}},
+ {211, {wxWindow, navigate, 1}},
+ {212, {wxWindow, pageDown, 0}},
+ {213, {wxWindow, pageUp, 0}},
+ {214, {wxWindow, popEventHandler, 1}},
+ {215, {wxWindow, popupMenu_2, 2}},
+ {216, {wxWindow, popupMenu_3, 3}},
+ {217, {wxWindow, raise, 0}},
+ {218, {wxWindow, refresh, 1}},
+ {219, {wxWindow, refreshRect, 2}},
+ {220, {wxWindow, releaseMouse, 0}},
+ {221, {wxWindow, removeChild, 1}},
+ {222, {wxWindow, reparent, 1}},
+ {223, {wxWindow, screenToClient_2, 2}},
+ {224, {wxWindow, screenToClient_1, 1}},
+ {226, {wxWindow, scrollLines, 1}},
+ {228, {wxWindow, scrollPages, 1}},
+ {229, {wxWindow, scrollWindow, 3}},
+ {230, {wxWindow, setAcceleratorTable, 1}},
+ {231, {wxWindow, setAutoLayout, 1}},
+ {232, {wxWindow, setBackgroundColour, 1}},
+ {233, {wxWindow, setBackgroundStyle, 1}},
+ {234, {wxWindow, setCaret, 1}},
+ {235, {wxWindow, setClientSize_2, 2}},
+ {236, {wxWindow, setClientSize_1_0, 1}},
+ {237, {wxWindow, setClientSize_1_1, 1}},
+ {238, {wxWindow, setContainingSizer, 1}},
+ {239, {wxWindow, setCursor, 1}},
+ {240, {wxWindow, setMaxSize, 1}},
+ {241, {wxWindow, setMinSize, 1}},
+ {242, {wxWindow, setOwnBackgroundColour, 1}},
+ {243, {wxWindow, setOwnFont, 1}},
+ {244, {wxWindow, setOwnForegroundColour, 1}},
+ {245, {wxWindow, setDropTarget, 1}},
+ {246, {wxWindow, setExtraStyle, 1}},
+ {247, {wxWindow, setFocus, 0}},
+ {248, {wxWindow, setFocusFromKbd, 0}},
+ {249, {wxWindow, setFont, 1}},
+ {250, {wxWindow, setForegroundColour, 1}},
+ {251, {wxWindow, setHelpText, 1}},
+ {252, {wxWindow, setId, 1}},
+ {254, {wxWindow, setLabel, 1}},
+ {255, {wxWindow, setName, 1}},
+ {256, {wxWindow, setPalette, 1}},
+ {257, {wxWindow, setScrollbar, 5}},
+ {258, {wxWindow, setScrollPos, 3}},
+ {259, {wxWindow, setSize_5, 5}},
+ {260, {wxWindow, setSize_2_0, 2}},
+ {261, {wxWindow, setSize_1, 1}},
+ {262, {wxWindow, setSize_2_1, 2}},
+ {263, {wxWindow, setSizeHints_3, 3}},
+ {264, {wxWindow, setSizeHints_2, 2}},
+ {265, {wxWindow, setSizer, 2}},
+ {266, {wxWindow, setSizerAndFit, 2}},
+ {267, {wxWindow, setThemeEnabled, 1}},
+ {268, {wxWindow, setToolTip_1_0, 1}},
+ {269, {wxWindow, setToolTip_1_1, 1}},
+ {270, {wxWindow, setVirtualSize_1, 1}},
+ {271, {wxWindow, setVirtualSize_2, 2}},
+ {272, {wxWindow, setVirtualSizeHints_3, 3}},
+ {273, {wxWindow, setVirtualSizeHints_2, 2}},
+ {274, {wxWindow, setWindowStyle, 1}},
+ {275, {wxWindow, setWindowStyleFlag, 1}},
+ {276, {wxWindow, setWindowVariant, 1}},
+ {277, {wxWindow, shouldInheritColours, 0}},
+ {278, {wxWindow, show, 1}},
+ {279, {wxWindow, thaw, 0}},
+ {280, {wxWindow, transferDataFromWindow, 0}},
+ {281, {wxWindow, transferDataToWindow, 0}},
+ {282, {wxWindow, update, 0}},
+ {283, {wxWindow, updateWindowUI, 1}},
+ {284, {wxWindow, validate, 0}},
+ {285, {wxWindow, warpPointer, 2}},
+ {286, {wxWindow, setTransparent, 1}},
+ {287, {wxWindow, canSetTransparent, 0}},
+ {288, {wxWindow, isDoubleBuffered, 0}},
+ {289, {wxWindow, setDoubleBuffered, 1}},
+ {290, {wxWindow, getContentScaleFactor, 0}},
+ {291, {wxTopLevelWindow, getIcon, 0}},
+ {292, {wxTopLevelWindow, getIcons, 0}},
+ {293, {wxTopLevelWindow, getTitle, 0}},
+ {294, {wxTopLevelWindow, isActive, 0}},
+ {295, {wxTopLevelWindow, iconize, 1}},
+ {296, {wxTopLevelWindow, isFullScreen, 0}},
+ {297, {wxTopLevelWindow, isIconized, 0}},
+ {298, {wxTopLevelWindow, isMaximized, 0}},
+ {299, {wxTopLevelWindow, maximize, 1}},
+ {300, {wxTopLevelWindow, requestUserAttention, 1}},
+ {301, {wxTopLevelWindow, setIcon, 1}},
+ {302, {wxTopLevelWindow, setIcons, 1}},
+ {303, {wxTopLevelWindow, centerOnScreen, 1}},
+ {304, {wxTopLevelWindow, centreOnScreen, 1}},
+ {306, {wxTopLevelWindow, setShape, 1}},
+ {307, {wxTopLevelWindow, setTitle, 1}},
+ {308, {wxTopLevelWindow, showFullScreen, 2}},
+ {310, {wxFrame, new_4, 4}},
+ {311, {wxFrame, new_0, 0}},
+ {313, {wxFrame, destruct, 0}},
+ {314, {wxFrame, create, 4}},
+ {315, {wxFrame, createStatusBar, 1}},
+ {316, {wxFrame, createToolBar, 1}},
+ {317, {wxFrame, getClientAreaOrigin, 0}},
+ {318, {wxFrame, getMenuBar, 0}},
+ {319, {wxFrame, getStatusBar, 0}},
+ {320, {wxFrame, getStatusBarPane, 0}},
+ {321, {wxFrame, getToolBar, 0}},
+ {322, {wxFrame, processCommand, 1}},
+ {323, {wxFrame, sendSizeEvent, 0}},
+ {324, {wxFrame, setMenuBar, 1}},
+ {325, {wxFrame, setStatusBar, 1}},
+ {326, {wxFrame, setStatusBarPane, 1}},
+ {327, {wxFrame, setStatusText, 2}},
+ {328, {wxFrame, setStatusWidths, 2}},
+ {329, {wxFrame, setToolBar, 1}},
+ {330, {wxMiniFrame, new_0, 0}},
+ {331, {wxMiniFrame, new_4, 4}},
+ {332, {wxMiniFrame, create, 4}},
+ {333, {wxMiniFrame, 'Destroy', undefined}},
+ {334, {wxSplashScreen, new_0, 0}},
+ {335, {wxSplashScreen, new_6, 6}},
+ {336, {wxSplashScreen, destruct, 0}},
+ {337, {wxSplashScreen, getSplashStyle, 0}},
+ {338, {wxSplashScreen, getTimeout, 0}},
+ {339, {wxPanel, new_0, 0}},
+ {340, {wxPanel, new_6, 6}},
+ {341, {wxPanel, new_2, 2}},
+ {342, {wxPanel, destruct, 0}},
+ {343, {wxPanel, initDialog, 0}},
+ {344, {wxPanel, setFocusIgnoringChildren, 0}},
+ {345, {wxScrolledWindow, new_0, 0}},
+ {346, {wxScrolledWindow, new_2, 2}},
+ {347, {wxScrolledWindow, destruct, 0}},
+ {348, {wxScrolledWindow, calcScrolledPosition_4, 4}},
+ {349, {wxScrolledWindow, calcScrolledPosition_1, 1}},
+ {350, {wxScrolledWindow, calcUnscrolledPosition_4, 4}},
+ {351, {wxScrolledWindow, calcUnscrolledPosition_1, 1}},
+ {352, {wxScrolledWindow, enableScrolling, 2}},
+ {353, {wxScrolledWindow, getScrollPixelsPerUnit, 2}},
+ {354, {wxScrolledWindow, getViewStart, 2}},
+ {355, {wxScrolledWindow, doPrepareDC, 1}},
+ {356, {wxScrolledWindow, prepareDC, 1}},
+ {357, {wxScrolledWindow, scroll, 2}},
+ {358, {wxScrolledWindow, setScrollbars, 5}},
+ {359, {wxScrolledWindow, setScrollRate, 2}},
+ {360, {wxScrolledWindow, setTargetWindow, 1}},
+ {361, {wxSashWindow, new_0, 0}},
+ {362, {wxSashWindow, new_2, 2}},
+ {363, {wxSashWindow, destruct, 0}},
+ {364, {wxSashWindow, getSashVisible, 1}},
+ {365, {wxSashWindow, getMaximumSizeX, 0}},
+ {366, {wxSashWindow, getMaximumSizeY, 0}},
+ {367, {wxSashWindow, getMinimumSizeX, 0}},
+ {368, {wxSashWindow, getMinimumSizeY, 0}},
+ {369, {wxSashWindow, setMaximumSizeX, 1}},
+ {370, {wxSashWindow, setMaximumSizeY, 1}},
+ {371, {wxSashWindow, setMinimumSizeX, 1}},
+ {372, {wxSashWindow, setMinimumSizeY, 1}},
+ {373, {wxSashWindow, setSashVisible, 2}},
+ {374, {wxSashLayoutWindow, new_0, 0}},
+ {375, {wxSashLayoutWindow, new_2, 2}},
+ {376, {wxSashLayoutWindow, create, 2}},
+ {377, {wxSashLayoutWindow, getAlignment, 0}},
+ {378, {wxSashLayoutWindow, getOrientation, 0}},
+ {379, {wxSashLayoutWindow, setAlignment, 1}},
+ {380, {wxSashLayoutWindow, setDefaultSize, 1}},
+ {381, {wxSashLayoutWindow, setOrientation, 1}},
+ {382, {wxSashLayoutWindow, 'Destroy', undefined}},
+ {383, {wxGrid, new_0, 0}},
+ {384, {wxGrid, new_3, 3}},
+ {385, {wxGrid, new_4, 4}},
+ {386, {wxGrid, destruct, 0}},
+ {387, {wxGrid, appendCols, 1}},
+ {388, {wxGrid, appendRows, 1}},
+ {389, {wxGrid, autoSize, 0}},
+ {390, {wxGrid, autoSizeColumn, 2}},
+ {391, {wxGrid, autoSizeColumns, 1}},
+ {392, {wxGrid, autoSizeRow, 2}},
+ {393, {wxGrid, autoSizeRows, 1}},
+ {394, {wxGrid, beginBatch, 0}},
+ {395, {wxGrid, blockToDeviceRect, 2}},
+ {396, {wxGrid, canDragColSize, 0}},
+ {397, {wxGrid, canDragRowSize, 0}},
+ {398, {wxGrid, canDragGridSize, 0}},
+ {399, {wxGrid, canEnableCellControl, 0}},
+ {400, {wxGrid, cellToRect_2, 2}},
+ {401, {wxGrid, cellToRect_1, 1}},
+ {402, {wxGrid, clearGrid, 0}},
+ {403, {wxGrid, clearSelection, 0}},
+ {404, {wxGrid, createGrid, 3}},
+ {405, {wxGrid, deleteCols, 1}},
+ {406, {wxGrid, deleteRows, 1}},
+ {407, {wxGrid, disableCellEditControl, 0}},
+ {408, {wxGrid, disableDragColSize, 0}},
+ {409, {wxGrid, disableDragGridSize, 0}},
+ {410, {wxGrid, disableDragRowSize, 0}},
+ {411, {wxGrid, enableCellEditControl, 1}},
+ {412, {wxGrid, enableDragColSize, 1}},
+ {413, {wxGrid, enableDragGridSize, 1}},
+ {414, {wxGrid, enableDragRowSize, 1}},
+ {415, {wxGrid, enableEditing, 1}},
+ {416, {wxGrid, enableGridLines, 1}},
+ {417, {wxGrid, endBatch, 0}},
+ {418, {wxGrid, fit, 0}},
+ {419, {wxGrid, forceRefresh, 0}},
+ {420, {wxGrid, getBatchCount, 0}},
+ {421, {wxGrid, getCellAlignment, 4}},
+ {422, {wxGrid, getCellBackgroundColour, 2}},
+ {423, {wxGrid, getCellEditor, 2}},
+ {424, {wxGrid, getCellFont, 2}},
+ {425, {wxGrid, getCellRenderer, 2}},
+ {426, {wxGrid, getCellTextColour, 2}},
+ {427, {wxGrid, getCellValue_2, 2}},
+ {428, {wxGrid, getCellValue_1, 1}},
+ {429, {wxGrid, getColLabelAlignment, 2}},
+ {430, {wxGrid, getColLabelSize, 0}},
+ {431, {wxGrid, getColLabelValue, 1}},
+ {432, {wxGrid, getColMinimalAcceptableWidth, 0}},
+ {433, {wxGrid, getDefaultCellAlignment, 2}},
+ {434, {wxGrid, getDefaultCellBackgroundColour, 0}},
+ {435, {wxGrid, getDefaultCellFont, 0}},
+ {436, {wxGrid, getDefaultCellTextColour, 0}},
+ {437, {wxGrid, getDefaultColLabelSize, 0}},
+ {438, {wxGrid, getDefaultColSize, 0}},
+ {439, {wxGrid, getDefaultEditor, 0}},
+ {440, {wxGrid, getDefaultEditorForCell_2, 2}},
+ {441, {wxGrid, getDefaultEditorForCell_1, 1}},
+ {442, {wxGrid, getDefaultEditorForType, 1}},
+ {443, {wxGrid, getDefaultRenderer, 0}},
+ {444, {wxGrid, getDefaultRendererForCell, 2}},
+ {445, {wxGrid, getDefaultRendererForType, 1}},
+ {446, {wxGrid, getDefaultRowLabelSize, 0}},
+ {447, {wxGrid, getDefaultRowSize, 0}},
+ {448, {wxGrid, getGridCursorCol, 0}},
+ {449, {wxGrid, getGridCursorRow, 0}},
+ {450, {wxGrid, getGridLineColour, 0}},
+ {451, {wxGrid, gridLinesEnabled, 0}},
+ {452, {wxGrid, getLabelBackgroundColour, 0}},
+ {453, {wxGrid, getLabelFont, 0}},
+ {454, {wxGrid, getLabelTextColour, 0}},
+ {455, {wxGrid, getNumberCols, 0}},
+ {456, {wxGrid, getNumberRows, 0}},
+ {457, {wxGrid, getOrCreateCellAttr, 2}},
+ {458, {wxGrid, getRowMinimalAcceptableHeight, 0}},
+ {459, {wxGrid, getRowLabelAlignment, 2}},
+ {460, {wxGrid, getRowLabelSize, 0}},
+ {461, {wxGrid, getRowLabelValue, 1}},
+ {462, {wxGrid, getRowSize, 1}},
+ {463, {wxGrid, getScrollLineX, 0}},
+ {464, {wxGrid, getScrollLineY, 0}},
+ {465, {wxGrid, getSelectedCells, 0}},
+ {466, {wxGrid, getSelectedCols, 0}},
+ {467, {wxGrid, getSelectedRows, 0}},
+ {468, {wxGrid, getSelectionBackground, 0}},
+ {469, {wxGrid, getSelectionBlockTopLeft, 0}},
+ {470, {wxGrid, getSelectionBlockBottomRight, 0}},
+ {471, {wxGrid, getSelectionForeground, 0}},
+ {472, {wxGrid, getViewWidth, 0}},
+ {473, {wxGrid, getGridWindow, 0}},
+ {474, {wxGrid, getGridRowLabelWindow, 0}},
+ {475, {wxGrid, getGridColLabelWindow, 0}},
+ {476, {wxGrid, getGridCornerLabelWindow, 0}},
+ {477, {wxGrid, hideCellEditControl, 0}},
+ {478, {wxGrid, insertCols, 1}},
+ {479, {wxGrid, insertRows, 1}},
+ {480, {wxGrid, isCellEditControlEnabled, 0}},
+ {481, {wxGrid, isCurrentCellReadOnly, 0}},
+ {482, {wxGrid, isEditable, 0}},
+ {483, {wxGrid, isInSelection_2, 2}},
+ {484, {wxGrid, isInSelection_1, 1}},
+ {485, {wxGrid, isReadOnly, 2}},
+ {486, {wxGrid, isSelection, 0}},
+ {487, {wxGrid, isVisible_3, 3}},
+ {488, {wxGrid, isVisible_2, 2}},
+ {489, {wxGrid, makeCellVisible_2, 2}},
+ {490, {wxGrid, makeCellVisible_1, 1}},
+ {491, {wxGrid, moveCursorDown, 1}},
+ {492, {wxGrid, moveCursorLeft, 1}},
+ {493, {wxGrid, moveCursorRight, 1}},
+ {494, {wxGrid, moveCursorUp, 1}},
+ {495, {wxGrid, moveCursorDownBlock, 1}},
+ {496, {wxGrid, moveCursorLeftBlock, 1}},
+ {497, {wxGrid, moveCursorRightBlock, 1}},
+ {498, {wxGrid, moveCursorUpBlock, 1}},
+ {499, {wxGrid, movePageDown, 0}},
+ {500, {wxGrid, movePageUp, 0}},
+ {501, {wxGrid, registerDataType, 3}},
+ {502, {wxGrid, saveEditControlValue, 0}},
+ {503, {wxGrid, selectAll, 0}},
+ {504, {wxGrid, selectBlock_5, 5}},
+ {505, {wxGrid, selectBlock_3, 3}},
+ {506, {wxGrid, selectCol, 2}},
+ {507, {wxGrid, selectRow, 2}},
+ {508, {wxGrid, setCellAlignment_4, 4}},
+ {509, {wxGrid, setCellAlignment_3, 3}},
+ {510, {wxGrid, setCellAlignment_1, 1}},
+ {511, {wxGrid, setCellBackgroundColour_3_0, 3}},
+ {512, {wxGrid, setCellBackgroundColour_1, 1}},
+ {513, {wxGrid, setCellBackgroundColour_3_1, 3}},
+ {514, {wxGrid, setCellEditor, 3}},
+ {515, {wxGrid, setCellFont, 3}},
+ {516, {wxGrid, setCellRenderer, 3}},
+ {517, {wxGrid, setCellTextColour_3_0, 3}},
+ {518, {wxGrid, setCellTextColour_3_1, 3}},
+ {519, {wxGrid, setCellTextColour_1, 1}},
+ {520, {wxGrid, setCellValue_3_0, 3}},
+ {521, {wxGrid, setCellValue_2, 2}},
+ {522, {wxGrid, setCellValue_3_1, 3}},
+ {523, {wxGrid, setColAttr, 2}},
+ {524, {wxGrid, setColFormatBool, 1}},
+ {525, {wxGrid, setColFormatNumber, 1}},
+ {526, {wxGrid, setColFormatFloat, 2}},
+ {527, {wxGrid, setColFormatCustom, 2}},
+ {528, {wxGrid, setColLabelAlignment, 2}},
+ {529, {wxGrid, setColLabelSize, 1}},
+ {530, {wxGrid, setColLabelValue, 2}},
+ {531, {wxGrid, setColMinimalWidth, 2}},
+ {532, {wxGrid, setColMinimalAcceptableWidth, 1}},
+ {533, {wxGrid, setColSize, 2}},
+ {534, {wxGrid, setDefaultCellAlignment, 2}},
+ {535, {wxGrid, setDefaultCellBackgroundColour, 1}},
+ {536, {wxGrid, setDefaultCellFont, 1}},
+ {537, {wxGrid, setDefaultCellTextColour, 1}},
+ {538, {wxGrid, setDefaultEditor, 1}},
+ {539, {wxGrid, setDefaultRenderer, 1}},
+ {540, {wxGrid, setDefaultColSize, 2}},
+ {541, {wxGrid, setDefaultRowSize, 2}},
+ {542, {wxGrid, setGridCursor, 2}},
+ {543, {wxGrid, setGridLineColour, 1}},
+ {544, {wxGrid, setLabelBackgroundColour, 1}},
+ {545, {wxGrid, setLabelFont, 1}},
+ {546, {wxGrid, setLabelTextColour, 1}},
+ {547, {wxGrid, setMargins, 2}},
+ {548, {wxGrid, setReadOnly, 3}},
+ {549, {wxGrid, setRowAttr, 2}},
+ {550, {wxGrid, setRowLabelAlignment, 2}},
+ {551, {wxGrid, setRowLabelSize, 1}},
+ {552, {wxGrid, setRowLabelValue, 2}},
+ {553, {wxGrid, setRowMinimalHeight, 2}},
+ {554, {wxGrid, setRowMinimalAcceptableHeight, 1}},
+ {555, {wxGrid, setRowSize, 2}},
+ {556, {wxGrid, setScrollLineX, 1}},
+ {557, {wxGrid, setScrollLineY, 1}},
+ {558, {wxGrid, setSelectionBackground, 1}},
+ {559, {wxGrid, setSelectionForeground, 1}},
+ {560, {wxGrid, setSelectionMode, 1}},
+ {561, {wxGrid, showCellEditControl, 0}},
+ {562, {wxGrid, xToCol, 2}},
+ {563, {wxGrid, xToEdgeOfCol, 1}},
+ {564, {wxGrid, yToEdgeOfRow, 1}},
+ {565, {wxGrid, yToRow, 1}},
+ {566, {wxGridCellRenderer, draw, 7}},
+ {567, {wxGridCellRenderer, getBestSize, 5}},
+ {568, {wxGridCellEditor, create, 3}},
+ {569, {wxGridCellEditor, isCreated, 0}},
+ {570, {wxGridCellEditor, setSize, 1}},
+ {571, {wxGridCellEditor, show, 2}},
+ {572, {wxGridCellEditor, paintBackground, 2}},
+ {573, {wxGridCellEditor, beginEdit, 3}},
+ {574, {wxGridCellEditor, endEdit, 3}},
+ {575, {wxGridCellEditor, reset, 0}},
+ {576, {wxGridCellEditor, startingKey, 1}},
+ {577, {wxGridCellEditor, startingClick, 0}},
+ {578, {wxGridCellEditor, handleReturn, 1}},
+ {579, {wxGridCellBoolRenderer, new, 0}},
+ {580, {wxGridCellBoolRenderer, 'Destroy', undefined}},
+ {581, {wxGridCellBoolEditor, new, 0}},
+ {582, {wxGridCellBoolEditor, isTrueValue, 1}},
+ {583, {wxGridCellBoolEditor, useStringValues, 1}},
+ {584, {wxGridCellBoolEditor, 'Destroy', undefined}},
+ {585, {wxGridCellFloatRenderer, new, 1}},
+ {586, {wxGridCellFloatRenderer, getPrecision, 0}},
+ {587, {wxGridCellFloatRenderer, getWidth, 0}},
+ {588, {wxGridCellFloatRenderer, setParameters, 1}},
+ {589, {wxGridCellFloatRenderer, setPrecision, 1}},
+ {590, {wxGridCellFloatRenderer, setWidth, 1}},
+ {591, {wxGridCellFloatRenderer, 'Destroy', undefined}},
+ {592, {wxGridCellFloatEditor, new, 1}},
+ {593, {wxGridCellFloatEditor, setParameters, 1}},
+ {594, {wxGridCellFloatEditor, 'Destroy', undefined}},
+ {595, {wxGridCellStringRenderer, new, 0}},
+ {596, {wxGridCellStringRenderer, 'Destroy', undefined}},
+ {597, {wxGridCellTextEditor, new, 0}},
+ {598, {wxGridCellTextEditor, setParameters, 1}},
+ {599, {wxGridCellTextEditor, 'Destroy', undefined}},
+ {601, {wxGridCellChoiceEditor, new, 2}},
+ {602, {wxGridCellChoiceEditor, setParameters, 1}},
+ {603, {wxGridCellChoiceEditor, 'Destroy', undefined}},
+ {604, {wxGridCellNumberRenderer, new, 0}},
+ {605, {wxGridCellNumberRenderer, 'Destroy', undefined}},
+ {606, {wxGridCellNumberEditor, new, 1}},
+ {607, {wxGridCellNumberEditor, getValue, 0}},
+ {608, {wxGridCellNumberEditor, setParameters, 1}},
+ {609, {wxGridCellNumberEditor, 'Destroy', undefined}},
+ {610, {wxGridCellAttr, setTextColour, 1}},
+ {611, {wxGridCellAttr, setBackgroundColour, 1}},
+ {612, {wxGridCellAttr, setFont, 1}},
+ {613, {wxGridCellAttr, setAlignment, 2}},
+ {614, {wxGridCellAttr, setReadOnly, 1}},
+ {615, {wxGridCellAttr, setRenderer, 1}},
+ {616, {wxGridCellAttr, setEditor, 1}},
+ {617, {wxGridCellAttr, hasTextColour, 0}},
+ {618, {wxGridCellAttr, hasBackgroundColour, 0}},
+ {619, {wxGridCellAttr, hasFont, 0}},
+ {620, {wxGridCellAttr, hasAlignment, 0}},
+ {621, {wxGridCellAttr, hasRenderer, 0}},
+ {622, {wxGridCellAttr, hasEditor, 0}},
+ {623, {wxGridCellAttr, getTextColour, 0}},
+ {624, {wxGridCellAttr, getBackgroundColour, 0}},
+ {625, {wxGridCellAttr, getFont, 0}},
+ {626, {wxGridCellAttr, getAlignment, 2}},
+ {627, {wxGridCellAttr, getRenderer, 3}},
+ {628, {wxGridCellAttr, getEditor, 3}},
+ {629, {wxGridCellAttr, isReadOnly, 0}},
+ {630, {wxGridCellAttr, setDefAttr, 1}},
+ {631, {wxDC, blit, 5}},
+ {632, {wxDC, calcBoundingBox, 2}},
+ {633, {wxDC, clear, 0}},
+ {634, {wxDC, computeScaleAndOrigin, 0}},
+ {635, {wxDC, crossHair, 1}},
+ {636, {wxDC, destroyClippingRegion, 0}},
+ {637, {wxDC, deviceToLogicalX, 1}},
+ {638, {wxDC, deviceToLogicalXRel, 1}},
+ {639, {wxDC, deviceToLogicalY, 1}},
+ {640, {wxDC, deviceToLogicalYRel, 1}},
+ {641, {wxDC, drawArc, 3}},
+ {642, {wxDC, drawBitmap, 3}},
+ {643, {wxDC, drawCheckMark, 1}},
+ {644, {wxDC, drawCircle, 2}},
+ {646, {wxDC, drawEllipse_2, 2}},
+ {647, {wxDC, drawEllipse_1, 1}},
+ {648, {wxDC, drawEllipticArc, 4}},
+ {649, {wxDC, drawIcon, 2}},
+ {650, {wxDC, drawLabel, 3}},
+ {651, {wxDC, drawLine, 2}},
+ {652, {wxDC, drawLines, 3}},
+ {654, {wxDC, drawPolygon, 3}},
+ {656, {wxDC, drawPoint, 1}},
+ {658, {wxDC, drawRectangle_2, 2}},
+ {659, {wxDC, drawRectangle_1, 1}},
+ {660, {wxDC, drawRotatedText, 3}},
+ {662, {wxDC, drawRoundedRectangle_3, 3}},
+ {663, {wxDC, drawRoundedRectangle_2, 2}},
+ {664, {wxDC, drawText, 2}},
+ {665, {wxDC, endDoc, 0}},
+ {666, {wxDC, endPage, 0}},
+ {667, {wxDC, floodFill, 3}},
+ {668, {wxDC, getBackground, 0}},
+ {669, {wxDC, getBackgroundMode, 0}},
+ {670, {wxDC, getBrush, 0}},
+ {671, {wxDC, getCharHeight, 0}},
+ {672, {wxDC, getCharWidth, 0}},
+ {673, {wxDC, getClippingBox, 4}},
+ {675, {wxDC, getFont, 0}},
+ {676, {wxDC, getLayoutDirection, 0}},
+ {677, {wxDC, getLogicalFunction, 0}},
+ {678, {wxDC, getMapMode, 0}},
+ {679, {wxDC, getMultiLineTextExtent_4, 4}},
+ {680, {wxDC, getMultiLineTextExtent_1, 1}},
+ {681, {wxDC, getPartialTextExtents, 2}},
+ {682, {wxDC, getPen, 0}},
+ {683, {wxDC, getPixel, 2}},
+ {684, {wxDC, getPPI, 0}},
+ {686, {wxDC, getSize, 0}},
+ {688, {wxDC, getSizeMM, 0}},
+ {689, {wxDC, getTextBackground, 0}},
+ {690, {wxDC, getTextExtent_4, 4}},
+ {691, {wxDC, getTextExtent_1, 1}},
+ {693, {wxDC, getTextForeground, 0}},
+ {694, {wxDC, getUserScale, 2}},
+ {695, {wxDC, gradientFillConcentric_3, 3}},
+ {696, {wxDC, gradientFillConcentric_4, 4}},
+ {697, {wxDC, gradientFillLinear, 4}},
+ {698, {wxDC, logicalToDeviceX, 1}},
+ {699, {wxDC, logicalToDeviceXRel, 1}},
+ {700, {wxDC, logicalToDeviceY, 1}},
+ {701, {wxDC, logicalToDeviceYRel, 1}},
+ {702, {wxDC, maxX, 0}},
+ {703, {wxDC, maxY, 0}},
+ {704, {wxDC, minX, 0}},
+ {705, {wxDC, minY, 0}},
+ {706, {wxDC, isOk, 0}},
+ {707, {wxDC, resetBoundingBox, 0}},
+ {708, {wxDC, setAxisOrientation, 2}},
+ {709, {wxDC, setBackground, 1}},
+ {710, {wxDC, setBackgroundMode, 1}},
+ {711, {wxDC, setBrush, 1}},
+ {713, {wxDC, setClippingRegion_2, 2}},
+ {714, {wxDC, setClippingRegion_1_1, 1}},
+ {715, {wxDC, setClippingRegion_1_0, 1}},
+ {716, {wxDC, setDeviceOrigin, 2}},
+ {717, {wxDC, setFont, 1}},
+ {718, {wxDC, setLayoutDirection, 1}},
+ {719, {wxDC, setLogicalFunction, 1}},
+ {720, {wxDC, setMapMode, 1}},
+ {721, {wxDC, setPalette, 1}},
+ {722, {wxDC, setPen, 1}},
+ {723, {wxDC, setTextBackground, 1}},
+ {724, {wxDC, setTextForeground, 1}},
+ {725, {wxDC, setUserScale, 2}},
+ {726, {wxDC, startDoc, 1}},
+ {727, {wxDC, startPage, 0}},
+ {728, {wxMirrorDC, new, 2}},
+ {729, {wxMirrorDC, 'Destroy', undefined}},
+ {730, {wxScreenDC, new, 0}},
+ {731, {wxScreenDC, destruct, 0}},
+ {732, {wxPostScriptDC, new_0, 0}},
+ {733, {wxPostScriptDC, new_1, 1}},
+ {734, {wxPostScriptDC, destruct, 0}},
+ {735, {wxPostScriptDC, setResolution, 1}},
+ {736, {wxPostScriptDC, getResolution, 0}},
+ {737, {wxWindowDC, new_0, 0}},
+ {738, {wxWindowDC, new_1, 1}},
+ {739, {wxWindowDC, destruct, 0}},
+ {740, {wxClientDC, new_0, 0}},
+ {741, {wxClientDC, new_1, 1}},
+ {742, {wxClientDC, 'Destroy', undefined}},
+ {743, {wxPaintDC, new_0, 0}},
+ {744, {wxPaintDC, new_1, 1}},
+ {745, {wxPaintDC, 'Destroy', undefined}},
+ {747, {wxMemoryDC, new_1_0, 1}},
+ {748, {wxMemoryDC, new_1_1, 1}},
+ {749, {wxMemoryDC, new_0, 0}},
+ {751, {wxMemoryDC, destruct, 0}},
+ {752, {wxMemoryDC, selectObject, 1}},
+ {753, {wxMemoryDC, selectObjectAsSource, 1}},
+ {754, {wxBufferedDC, new_0, 0}},
+ {755, {wxBufferedDC, new_2, 2}},
+ {756, {wxBufferedDC, new_3, 3}},
+ {757, {wxBufferedDC, destruct, 0}},
+ {758, {wxBufferedDC, init_2, 2}},
+ {759, {wxBufferedDC, init_3, 3}},
+ {760, {wxBufferedPaintDC, new_3, 3}},
+ {761, {wxBufferedPaintDC, new_2, 2}},
+ {762, {wxBufferedPaintDC, destruct, 0}},
+ {763, {wxGraphicsObject, destruct, 0}},
+ {764, {wxGraphicsObject, getRenderer, 0}},
+ {765, {wxGraphicsObject, isNull, 0}},
+ {766, {wxGraphicsContext, destruct, 0}},
+ {767, {wxGraphicsContext, create_1_1, 1}},
+ {768, {wxGraphicsContext, create_1_0, 1}},
+ {769, {wxGraphicsContext, create_0, 0}},
+ {770, {wxGraphicsContext, createPen, 1}},
+ {771, {wxGraphicsContext, createBrush, 1}},
+ {772, {wxGraphicsContext, createRadialGradientBrush, 7}},
+ {773, {wxGraphicsContext, createLinearGradientBrush, 6}},
+ {774, {wxGraphicsContext, createFont, 2}},
+ {775, {wxGraphicsContext, createMatrix, 1}},
+ {776, {wxGraphicsContext, createPath, 0}},
+ {777, {wxGraphicsContext, clip_1, 1}},
+ {778, {wxGraphicsContext, clip_4, 4}},
+ {779, {wxGraphicsContext, resetClip, 0}},
+ {780, {wxGraphicsContext, drawBitmap, 5}},
+ {781, {wxGraphicsContext, drawEllipse, 4}},
+ {782, {wxGraphicsContext, drawIcon, 5}},
+ {783, {wxGraphicsContext, drawLines, 3}},
+ {784, {wxGraphicsContext, drawPath, 2}},
+ {785, {wxGraphicsContext, drawRectangle, 4}},
+ {786, {wxGraphicsContext, drawRoundedRectangle, 5}},
+ {787, {wxGraphicsContext, drawText_3, 3}},
+ {788, {wxGraphicsContext, drawText_4_0, 4}},
+ {789, {wxGraphicsContext, drawText_4_1, 4}},
+ {790, {wxGraphicsContext, drawText_5, 5}},
+ {791, {wxGraphicsContext, fillPath, 2}},
+ {792, {wxGraphicsContext, strokePath, 1}},
+ {793, {wxGraphicsContext, getPartialTextExtents, 2}},
+ {794, {wxGraphicsContext, getTextExtent, 5}},
+ {795, {wxGraphicsContext, rotate, 1}},
+ {796, {wxGraphicsContext, scale, 2}},
+ {797, {wxGraphicsContext, translate, 2}},
+ {798, {wxGraphicsContext, getTransform, 0}},
+ {799, {wxGraphicsContext, setTransform, 1}},
+ {800, {wxGraphicsContext, concatTransform, 1}},
+ {801, {wxGraphicsContext, setBrush_1_1, 1}},
+ {802, {wxGraphicsContext, setBrush_1_0, 1}},
+ {803, {wxGraphicsContext, setFont_1, 1}},
+ {804, {wxGraphicsContext, setFont_2, 2}},
+ {805, {wxGraphicsContext, setPen_1_0, 1}},
+ {806, {wxGraphicsContext, setPen_1_1, 1}},
+ {807, {wxGraphicsContext, strokeLine, 4}},
+ {808, {wxGraphicsContext, strokeLines, 2}},
+ {810, {wxGraphicsMatrix, concat, 1}},
+ {812, {wxGraphicsMatrix, get, 1}},
+ {813, {wxGraphicsMatrix, invert, 0}},
+ {814, {wxGraphicsMatrix, isEqual, 1}},
+ {816, {wxGraphicsMatrix, isIdentity, 0}},
+ {817, {wxGraphicsMatrix, rotate, 1}},
+ {818, {wxGraphicsMatrix, scale, 2}},
+ {819, {wxGraphicsMatrix, translate, 2}},
+ {820, {wxGraphicsMatrix, set, 1}},
+ {821, {wxGraphicsMatrix, transformPoint, 2}},
+ {822, {wxGraphicsMatrix, transformDistance, 2}},
+ {823, {wxGraphicsPath, moveToPoint_2, 2}},
+ {824, {wxGraphicsPath, moveToPoint_1, 1}},
+ {825, {wxGraphicsPath, addArc_6, 6}},
+ {826, {wxGraphicsPath, addArc_5, 5}},
+ {827, {wxGraphicsPath, addArcToPoint, 5}},
+ {828, {wxGraphicsPath, addCircle, 3}},
+ {829, {wxGraphicsPath, addCurveToPoint_6, 6}},
+ {830, {wxGraphicsPath, addCurveToPoint_3, 3}},
+ {831, {wxGraphicsPath, addEllipse, 4}},
+ {832, {wxGraphicsPath, addLineToPoint_2, 2}},
+ {833, {wxGraphicsPath, addLineToPoint_1, 1}},
+ {834, {wxGraphicsPath, addPath, 1}},
+ {835, {wxGraphicsPath, addQuadCurveToPoint, 4}},
+ {836, {wxGraphicsPath, addRectangle, 4}},
+ {837, {wxGraphicsPath, addRoundedRectangle, 5}},
+ {838, {wxGraphicsPath, closeSubpath, 0}},
+ {839, {wxGraphicsPath, contains_3, 3}},
+ {840, {wxGraphicsPath, contains_2, 2}},
+ {842, {wxGraphicsPath, getBox, 0}},
+ {844, {wxGraphicsPath, getCurrentPoint, 0}},
+ {845, {wxGraphicsPath, transform, 1}},
+ {846, {wxGraphicsRenderer, getDefaultRenderer, 0}},
+ {847, {wxGraphicsRenderer, createContext_1_1, 1}},
+ {848, {wxGraphicsRenderer, createContext_1_0, 1}},
+ {849, {wxGraphicsRenderer, createPen, 1}},
+ {850, {wxGraphicsRenderer, createBrush, 1}},
+ {851, {wxGraphicsRenderer, createLinearGradientBrush, 6}},
+ {852, {wxGraphicsRenderer, createRadialGradientBrush, 7}},
+ {853, {wxGraphicsRenderer, createFont, 2}},
+ {854, {wxGraphicsRenderer, createMatrix, 1}},
+ {855, {wxGraphicsRenderer, createPath, 0}},
+ {857, {wxMenuBar, new_1, 1}},
+ {859, {wxMenuBar, new_0, 0}},
+ {861, {wxMenuBar, destruct, 0}},
+ {862, {wxMenuBar, append, 2}},
+ {863, {wxMenuBar, check, 2}},
+ {864, {wxMenuBar, enable_2, 2}},
+ {865, {wxMenuBar, enable_1, 1}},
+ {866, {wxMenuBar, enableTop, 2}},
+ {867, {wxMenuBar, findMenu, 1}},
+ {868, {wxMenuBar, findMenuItem, 2}},
+ {869, {wxMenuBar, findItem, 2}},
+ {870, {wxMenuBar, getHelpString, 1}},
+ {871, {wxMenuBar, getLabel_1, 1}},
+ {872, {wxMenuBar, getLabel_0, 0}},
+ {873, {wxMenuBar, getLabelTop, 1}},
+ {874, {wxMenuBar, getMenu, 1}},
+ {875, {wxMenuBar, getMenuCount, 0}},
+ {876, {wxMenuBar, insert, 3}},
+ {877, {wxMenuBar, isChecked, 1}},
+ {878, {wxMenuBar, setAutoWindowMenu, 1}},
+ {879, {wxMenuBar, getAutoWindowMenu, 0}},
+ {880, {wxMenuBar, oSXGetAppleMenu, 0}},
+ {881, {wxMenuBar, isEnabled_1, 1}},
+ {882, {wxMenuBar, isEnabled_0, 0}},
+ {883, {wxMenuBar, remove, 1}},
+ {884, {wxMenuBar, replace, 3}},
+ {885, {wxMenuBar, setHelpString, 2}},
+ {886, {wxMenuBar, setLabel_2, 2}},
+ {887, {wxMenuBar, setLabel_1, 1}},
+ {888, {wxMenuBar, setLabelTop, 2}},
+ {889, {wxControl, getLabel, 0}},
+ {890, {wxControl, setLabel, 1}},
+ {891, {wxControlWithItems, append_1, 1}},
+ {892, {wxControlWithItems, append_2, 2}},
+ {893, {wxControlWithItems, appendStrings_1, 1}},
+ {894, {wxControlWithItems, clear, 0}},
+ {895, {wxControlWithItems, delete, 1}},
+ {896, {wxControlWithItems, findString, 2}},
+ {897, {wxControlWithItems, getClientData, 1}},
+ {898, {wxControlWithItems, setClientData, 2}},
+ {899, {wxControlWithItems, getCount, 0}},
+ {900, {wxControlWithItems, getSelection, 0}},
+ {901, {wxControlWithItems, getString, 1}},
+ {902, {wxControlWithItems, getStringSelection, 0}},
+ {903, {wxControlWithItems, insert_2, 2}},
+ {904, {wxControlWithItems, insert_3, 3}},
+ {905, {wxControlWithItems, isEmpty, 0}},
+ {906, {wxControlWithItems, select, 1}},
+ {907, {wxControlWithItems, setSelection, 1}},
+ {908, {wxControlWithItems, setString, 2}},
+ {909, {wxControlWithItems, setStringSelection, 1}},
+ {912, {wxMenu, new_2, 2}},
+ {913, {wxMenu, new_1, 1}},
+ {915, {wxMenu, destruct, 0}},
+ {916, {wxMenu, append_3, 3}},
+ {917, {wxMenu, append_1, 1}},
+ {918, {wxMenu, append_4_0, 4}},
+ {919, {wxMenu, append_4_1, 4}},
+ {920, {wxMenu, appendCheckItem, 3}},
+ {921, {wxMenu, appendRadioItem, 3}},
+ {922, {wxMenu, appendSeparator, 0}},
+ {923, {wxMenu, break, 0}},
+ {924, {wxMenu, check, 2}},
+ {925, {wxMenu, delete_1_0, 1}},
+ {926, {wxMenu, delete_1_1, 1}},
+ {927, {wxMenu, destroy_1_0, 1}},
+ {928, {wxMenu, destroy_1_1, 1}},
+ {929, {wxMenu, enable, 2}},
+ {930, {wxMenu, findItem_1, 1}},
+ {931, {wxMenu, findItem_2, 2}},
+ {932, {wxMenu, findItemByPosition, 1}},
+ {933, {wxMenu, getHelpString, 1}},
+ {934, {wxMenu, getLabel, 1}},
+ {935, {wxMenu, getMenuItemCount, 0}},
+ {936, {wxMenu, getMenuItems, 0}},
+ {938, {wxMenu, getTitle, 0}},
+ {939, {wxMenu, insert_2, 2}},
+ {940, {wxMenu, insert_3, 3}},
+ {941, {wxMenu, insert_5_1, 5}},
+ {942, {wxMenu, insert_5_0, 5}},
+ {943, {wxMenu, insertCheckItem, 4}},
+ {944, {wxMenu, insertRadioItem, 4}},
+ {945, {wxMenu, insertSeparator, 1}},
+ {946, {wxMenu, isChecked, 1}},
+ {947, {wxMenu, isEnabled, 1}},
+ {948, {wxMenu, prepend_1, 1}},
+ {949, {wxMenu, prepend_2, 2}},
+ {950, {wxMenu, prepend_4_1, 4}},
+ {951, {wxMenu, prepend_4_0, 4}},
+ {952, {wxMenu, prependCheckItem, 3}},
+ {953, {wxMenu, prependRadioItem, 3}},
+ {954, {wxMenu, prependSeparator, 0}},
+ {955, {wxMenu, remove_1_0, 1}},
+ {956, {wxMenu, remove_1_1, 1}},
+ {957, {wxMenu, setHelpString, 2}},
+ {958, {wxMenu, setLabel, 2}},
+ {959, {wxMenu, setTitle, 1}},
+ {960, {wxMenuItem, new, 1}},
+ {962, {wxMenuItem, destruct, 0}},
+ {963, {wxMenuItem, check, 1}},
+ {964, {wxMenuItem, enable, 1}},
+ {965, {wxMenuItem, getBitmap, 0}},
+ {966, {wxMenuItem, getHelp, 0}},
+ {967, {wxMenuItem, getId, 0}},
+ {968, {wxMenuItem, getKind, 0}},
+ {969, {wxMenuItem, getLabel, 0}},
+ {970, {wxMenuItem, getLabelFromText, 1}},
+ {971, {wxMenuItem, getMenu, 0}},
+ {972, {wxMenuItem, getText, 0}},
+ {973, {wxMenuItem, getSubMenu, 0}},
+ {974, {wxMenuItem, isCheckable, 0}},
+ {975, {wxMenuItem, isChecked, 0}},
+ {976, {wxMenuItem, isEnabled, 0}},
+ {977, {wxMenuItem, isSeparator, 0}},
+ {978, {wxMenuItem, isSubMenu, 0}},
+ {979, {wxMenuItem, setBitmap, 1}},
+ {980, {wxMenuItem, setHelp, 1}},
+ {981, {wxMenuItem, setMenu, 1}},
+ {982, {wxMenuItem, setSubMenu, 1}},
+ {983, {wxMenuItem, setText, 1}},
+ {984, {wxToolBar, addControl, 1}},
+ {985, {wxToolBar, addSeparator, 0}},
+ {986, {wxToolBar, addTool_5, 5}},
+ {987, {wxToolBar, addTool_4_0, 4}},
+ {988, {wxToolBar, addTool_1, 1}},
+ {989, {wxToolBar, addTool_4_1, 4}},
+ {990, {wxToolBar, addTool_3, 3}},
+ {991, {wxToolBar, addTool_6, 6}},
+ {992, {wxToolBar, addCheckTool, 4}},
+ {993, {wxToolBar, addRadioTool, 4}},
+ {994, {wxToolBar, addStretchableSpace, 0}},
+ {995, {wxToolBar, insertStretchableSpace, 1}},
+ {996, {wxToolBar, deleteTool, 1}},
+ {997, {wxToolBar, deleteToolByPos, 1}},
+ {998, {wxToolBar, enableTool, 2}},
+ {999, {wxToolBar, findById, 1}},
+ {1000, {wxToolBar, findControl, 1}},
+ {1001, {wxToolBar, findToolForPosition, 2}},
+ {1002, {wxToolBar, getToolSize, 0}},
+ {1003, {wxToolBar, getToolBitmapSize, 0}},
+ {1004, {wxToolBar, getMargins, 0}},
+ {1005, {wxToolBar, getToolEnabled, 1}},
+ {1006, {wxToolBar, getToolLongHelp, 1}},
+ {1007, {wxToolBar, getToolPacking, 0}},
+ {1008, {wxToolBar, getToolPos, 1}},
+ {1009, {wxToolBar, getToolSeparation, 0}},
+ {1010, {wxToolBar, getToolShortHelp, 1}},
+ {1011, {wxToolBar, getToolState, 1}},
+ {1012, {wxToolBar, insertControl, 2}},
+ {1013, {wxToolBar, insertSeparator, 1}},
+ {1014, {wxToolBar, insertTool_5, 5}},
+ {1015, {wxToolBar, insertTool_2, 2}},
+ {1016, {wxToolBar, insertTool_4, 4}},
+ {1017, {wxToolBar, realize, 0}},
+ {1018, {wxToolBar, removeTool, 1}},
+ {1019, {wxToolBar, setMargins, 2}},
+ {1020, {wxToolBar, setToolBitmapSize, 1}},
+ {1021, {wxToolBar, setToolLongHelp, 2}},
+ {1022, {wxToolBar, setToolPacking, 1}},
+ {1023, {wxToolBar, setToolShortHelp, 2}},
+ {1024, {wxToolBar, setToolSeparation, 1}},
+ {1025, {wxToolBar, toggleTool, 2}},
+ {1027, {wxStatusBar, new_0, 0}},
+ {1028, {wxStatusBar, new_2, 2}},
+ {1030, {wxStatusBar, destruct, 0}},
+ {1031, {wxStatusBar, create, 2}},
+ {1032, {wxStatusBar, getFieldRect, 2}},
+ {1033, {wxStatusBar, getFieldsCount, 0}},
+ {1034, {wxStatusBar, getStatusText, 1}},
+ {1035, {wxStatusBar, popStatusText, 1}},
+ {1036, {wxStatusBar, pushStatusText, 2}},
+ {1037, {wxStatusBar, setFieldsCount, 2}},
+ {1038, {wxStatusBar, setMinHeight, 1}},
+ {1039, {wxStatusBar, setStatusText, 2}},
+ {1040, {wxStatusBar, setStatusWidths, 2}},
+ {1041, {wxStatusBar, setStatusStyles, 2}},
+ {1042, {wxBitmap, new_0, 0}},
+ {1043, {wxBitmap, new_3, 3}},
+ {1044, {wxBitmap, new_4, 4}},
+ {1045, {wxBitmap, new_2_0, 2}},
+ {1046, {wxBitmap, new_2_1, 2}},
+ {1047, {wxBitmap, destruct, 0}},
+ {1048, {wxBitmap, convertToImage, 0}},
+ {1049, {wxBitmap, copyFromIcon, 1}},
+ {1050, {wxBitmap, create, 3}},
+ {1051, {wxBitmap, getDepth, 0}},
+ {1052, {wxBitmap, getHeight, 0}},
+ {1053, {wxBitmap, getPalette, 0}},
+ {1054, {wxBitmap, getMask, 0}},
+ {1055, {wxBitmap, getWidth, 0}},
+ {1056, {wxBitmap, getSubBitmap, 1}},
+ {1057, {wxBitmap, loadFile, 2}},
+ {1058, {wxBitmap, ok, 0}},
+ {1059, {wxBitmap, saveFile, 3}},
+ {1060, {wxBitmap, setDepth, 1}},
+ {1061, {wxBitmap, setHeight, 1}},
+ {1062, {wxBitmap, setMask, 1}},
+ {1063, {wxBitmap, setPalette, 1}},
+ {1064, {wxBitmap, setWidth, 1}},
+ {1065, {wxIcon, new_0, 0}},
+ {1066, {wxIcon, new_2, 2}},
+ {1067, {wxIcon, new_1, 1}},
+ {1068, {wxIcon, copyFromBitmap, 1}},
+ {1069, {wxIcon, 'Destroy', undefined}},
+ {1070, {wxIconBundle, new_0, 0}},
+ {1071, {wxIconBundle, new_2, 2}},
+ {1072, {wxIconBundle, new_1_0, 1}},
+ {1073, {wxIconBundle, new_1_1, 1}},
+ {1074, {wxIconBundle, destruct, 0}},
+ {1075, {wxIconBundle, addIcon_2, 2}},
+ {1076, {wxIconBundle, addIcon_1, 1}},
+ {1077, {wxIconBundle, getIcon_1_1, 1}},
+ {1078, {wxIconBundle, getIcon_1_0, 1}},
+ {1079, {wxCursor, new_0, 0}},
+ {1080, {wxCursor, new_1_0, 1}},
+ {1081, {wxCursor, new_1_1, 1}},
+ {1082, {wxCursor, new_4, 4}},
+ {1083, {wxCursor, destruct, 0}},
+ {1084, {wxCursor, ok, 0}},
+ {1085, {wxMask, new_0, 0}},
+ {1086, {wxMask, new_2_1, 2}},
+ {1087, {wxMask, new_2_0, 2}},
+ {1088, {wxMask, new_1, 1}},
+ {1089, {wxMask, destruct, 0}},
+ {1090, {wxMask, create_2_1, 2}},
+ {1091, {wxMask, create_2_0, 2}},
+ {1092, {wxMask, create_1, 1}},
+ {1093, {wxImage, new_0, 0}},
+ {1094, {wxImage, new_3_0, 3}},
+ {1095, {wxImage, new_4, 4}},
+ {1096, {wxImage, new_5, 5}},
+ {1097, {wxImage, new_2, 2}},
+ {1098, {wxImage, new_3_1, 3}},
+ {1099, {wxImage, blur, 1}},
+ {1100, {wxImage, blurHorizontal, 1}},
+ {1101, {wxImage, blurVertical, 1}},
+ {1102, {wxImage, convertAlphaToMask, 1}},
+ {1103, {wxImage, convertToGreyscale, 1}},
+ {1104, {wxImage, convertToMono, 3}},
+ {1105, {wxImage, copy, 0}},
+ {1106, {wxImage, create_3, 3}},
+ {1107, {wxImage, create_4, 4}},
+ {1108, {wxImage, create_5, 5}},
+ {1109, {wxImage, 'Destroy', 0}},
+ {1110, {wxImage, findFirstUnusedColour, 4}},
+ {1111, {wxImage, getImageExtWildcard, 0}},
+ {1112, {wxImage, getAlpha_2, 2}},
+ {1113, {wxImage, getAlpha_0, 0}},
+ {1114, {wxImage, getBlue, 2}},
+ {1115, {wxImage, getData, 0}},
+ {1116, {wxImage, getGreen, 2}},
+ {1117, {wxImage, getImageCount, 2}},
+ {1118, {wxImage, getHeight, 0}},
+ {1119, {wxImage, getMaskBlue, 0}},
+ {1120, {wxImage, getMaskGreen, 0}},
+ {1121, {wxImage, getMaskRed, 0}},
+ {1122, {wxImage, getOrFindMaskColour, 3}},
+ {1123, {wxImage, getPalette, 0}},
+ {1124, {wxImage, getRed, 2}},
+ {1125, {wxImage, getSubImage, 1}},
+ {1126, {wxImage, getWidth, 0}},
+ {1127, {wxImage, hasAlpha, 0}},
+ {1128, {wxImage, hasMask, 0}},
+ {1129, {wxImage, getOption, 1}},
+ {1130, {wxImage, getOptionInt, 1}},
+ {1131, {wxImage, hasOption, 1}},
+ {1132, {wxImage, initAlpha, 0}},
+ {1133, {wxImage, initStandardHandlers, 0}},
+ {1134, {wxImage, isTransparent, 3}},
+ {1135, {wxImage, loadFile_2, 2}},
+ {1136, {wxImage, loadFile_3, 3}},
+ {1137, {wxImage, ok, 0}},
+ {1138, {wxImage, removeHandler, 1}},
+ {1139, {wxImage, mirror, 1}},
+ {1140, {wxImage, replace, 6}},
+ {1141, {wxImage, rescale, 3}},
+ {1142, {wxImage, resize, 3}},
+ {1143, {wxImage, rotate, 3}},
+ {1144, {wxImage, rotateHue, 1}},
+ {1145, {wxImage, rotate90, 1}},
+ {1146, {wxImage, saveFile_1, 1}},
+ {1147, {wxImage, saveFile_2_0, 2}},
+ {1148, {wxImage, saveFile_2_1, 2}},
+ {1149, {wxImage, scale, 3}},
+ {1150, {wxImage, size, 3}},
+ {1151, {wxImage, setAlpha_3, 3}},
+ {1152, {wxImage, setAlpha_2, 2}},
+ {1153, {wxImage, setData_2, 2}},
+ {1154, {wxImage, setData_4, 4}},
+ {1155, {wxImage, setMask, 1}},
+ {1156, {wxImage, setMaskColour, 3}},
+ {1157, {wxImage, setMaskFromImage, 4}},
+ {1158, {wxImage, setOption_2_1, 2}},
+ {1159, {wxImage, setOption_2_0, 2}},
+ {1160, {wxImage, setPalette, 1}},
+ {1161, {wxImage, setRGB_5, 5}},
+ {1162, {wxImage, setRGB_4, 4}},
+ {1163, {wxImage, 'Destroy', undefined}},
+ {1164, {wxBrush, new_0, 0}},
+ {1165, {wxBrush, new_2, 2}},
+ {1166, {wxBrush, new_1, 1}},
+ {1168, {wxBrush, destruct, 0}},
+ {1169, {wxBrush, getColour, 0}},
+ {1170, {wxBrush, getStipple, 0}},
+ {1171, {wxBrush, getStyle, 0}},
+ {1172, {wxBrush, isHatch, 0}},
+ {1173, {wxBrush, isOk, 0}},
+ {1174, {wxBrush, setColour_1, 1}},
+ {1175, {wxBrush, setColour_3, 3}},
+ {1176, {wxBrush, setStipple, 1}},
+ {1177, {wxBrush, setStyle, 1}},
+ {1178, {wxPen, new_0, 0}},
+ {1179, {wxPen, new_2, 2}},
+ {1180, {wxPen, destruct, 0}},
+ {1181, {wxPen, getCap, 0}},
+ {1182, {wxPen, getColour, 0}},
+ {1183, {wxPen, getJoin, 0}},
+ {1184, {wxPen, getStyle, 0}},
+ {1185, {wxPen, getWidth, 0}},
+ {1186, {wxPen, isOk, 0}},
+ {1187, {wxPen, setCap, 1}},
+ {1188, {wxPen, setColour_1, 1}},
+ {1189, {wxPen, setColour_3, 3}},
+ {1190, {wxPen, setJoin, 1}},
+ {1191, {wxPen, setStyle, 1}},
+ {1192, {wxPen, setWidth, 1}},
+ {1193, {wxRegion, new_0, 0}},
+ {1194, {wxRegion, new_4, 4}},
+ {1195, {wxRegion, new_2, 2}},
+ {1196, {wxRegion, new_1_1, 1}},
+ {1198, {wxRegion, new_1_0, 1}},
+ {1200, {wxRegion, destruct, 0}},
+ {1201, {wxRegion, clear, 0}},
+ {1202, {wxRegion, contains_2, 2}},
+ {1203, {wxRegion, contains_1_0, 1}},
+ {1204, {wxRegion, contains_4, 4}},
+ {1205, {wxRegion, contains_1_1, 1}},
+ {1206, {wxRegion, convertToBitmap, 0}},
+ {1207, {wxRegion, getBox, 0}},
+ {1208, {wxRegion, intersect_4, 4}},
+ {1209, {wxRegion, intersect_1_1, 1}},
+ {1210, {wxRegion, intersect_1_0, 1}},
+ {1211, {wxRegion, isEmpty, 0}},
+ {1212, {wxRegion, subtract_4, 4}},
+ {1213, {wxRegion, subtract_1_1, 1}},
+ {1214, {wxRegion, subtract_1_0, 1}},
+ {1215, {wxRegion, offset_2, 2}},
+ {1216, {wxRegion, offset_1, 1}},
+ {1217, {wxRegion, union_4, 4}},
+ {1218, {wxRegion, union_1_2, 1}},
+ {1219, {wxRegion, union_1_1, 1}},
+ {1220, {wxRegion, union_1_0, 1}},
+ {1221, {wxRegion, union_3, 3}},
+ {1222, {wxRegion, xor_4, 4}},
+ {1223, {wxRegion, xor_1_1, 1}},
+ {1224, {wxRegion, xor_1_0, 1}},
+ {1225, {wxAcceleratorTable, new_0, 0}},
+ {1226, {wxAcceleratorTable, new_2, 2}},
+ {1227, {wxAcceleratorTable, destruct, 0}},
+ {1228, {wxAcceleratorTable, ok, 0}},
+ {1229, {wxAcceleratorEntry, new_1_0, 1}},
+ {1230, {wxAcceleratorEntry, new_1_1, 1}},
+ {1231, {wxAcceleratorEntry, getCommand, 0}},
+ {1232, {wxAcceleratorEntry, getFlags, 0}},
+ {1233, {wxAcceleratorEntry, getKeyCode, 0}},
+ {1234, {wxAcceleratorEntry, set, 4}},
+ {1235, {wxAcceleratorEntry, 'Destroy', undefined}},
+ {1240, {wxCaret, new_3, 3}},
+ {1241, {wxCaret, new_2, 2}},
+ {1243, {wxCaret, destruct, 0}},
+ {1244, {wxCaret, create_3, 3}},
+ {1245, {wxCaret, create_2, 2}},
+ {1246, {wxCaret, getBlinkTime, 0}},
+ {1248, {wxCaret, getPosition, 0}},
+ {1250, {wxCaret, getSize, 0}},
+ {1251, {wxCaret, getWindow, 0}},
+ {1252, {wxCaret, hide, 0}},
+ {1253, {wxCaret, isOk, 0}},
+ {1254, {wxCaret, isVisible, 0}},
+ {1255, {wxCaret, move_2, 2}},
+ {1256, {wxCaret, move_1, 1}},
+ {1257, {wxCaret, setBlinkTime, 1}},
+ {1258, {wxCaret, setSize_2, 2}},
+ {1259, {wxCaret, setSize_1, 1}},
+ {1260, {wxCaret, show, 1}},
+ {1261, {wxSizer, add_2_1, 2}},
+ {1262, {wxSizer, add_2_0, 2}},
+ {1263, {wxSizer, add_3, 3}},
+ {1264, {wxSizer, add_2_3, 2}},
+ {1265, {wxSizer, add_2_2, 2}},
+ {1266, {wxSizer, addSpacer, 1}},
+ {1267, {wxSizer, addStretchSpacer, 1}},
+ {1268, {wxSizer, calcMin, 0}},
+ {1269, {wxSizer, clear, 1}},
+ {1270, {wxSizer, detach_1_2, 1}},
+ {1271, {wxSizer, detach_1_1, 1}},
+ {1272, {wxSizer, detach_1_0, 1}},
+ {1273, {wxSizer, fit, 1}},
+ {1274, {wxSizer, fitInside, 1}},
+ {1275, {wxSizer, getChildren, 0}},
+ {1276, {wxSizer, getItem_2_1, 2}},
+ {1277, {wxSizer, getItem_2_0, 2}},
+ {1278, {wxSizer, getItem_1, 1}},
+ {1279, {wxSizer, getSize, 0}},
+ {1280, {wxSizer, getPosition, 0}},
+ {1281, {wxSizer, getMinSize, 0}},
+ {1282, {wxSizer, hide_2_0, 2}},
+ {1283, {wxSizer, hide_2_1, 2}},
+ {1284, {wxSizer, hide_1, 1}},
+ {1285, {wxSizer, insert_3_1, 3}},
+ {1286, {wxSizer, insert_3_0, 3}},
+ {1287, {wxSizer, insert_4, 4}},
+ {1288, {wxSizer, insert_3_3, 3}},
+ {1289, {wxSizer, insert_3_2, 3}},
+ {1290, {wxSizer, insert_2, 2}},
+ {1291, {wxSizer, insertSpacer, 2}},
+ {1292, {wxSizer, insertStretchSpacer, 2}},
+ {1293, {wxSizer, isShown_1_2, 1}},
+ {1294, {wxSizer, isShown_1_1, 1}},
+ {1295, {wxSizer, isShown_1_0, 1}},
+ {1296, {wxSizer, layout, 0}},
+ {1297, {wxSizer, prepend_2_1, 2}},
+ {1298, {wxSizer, prepend_2_0, 2}},
+ {1299, {wxSizer, prepend_3, 3}},
+ {1300, {wxSizer, prepend_2_3, 2}},
+ {1301, {wxSizer, prepend_2_2, 2}},
+ {1302, {wxSizer, prepend_1, 1}},
+ {1303, {wxSizer, prependSpacer, 1}},
+ {1304, {wxSizer, prependStretchSpacer, 1}},
+ {1305, {wxSizer, recalcSizes, 0}},
+ {1306, {wxSizer, remove_1_1, 1}},
+ {1307, {wxSizer, remove_1_0, 1}},
+ {1308, {wxSizer, replace_3_1, 3}},
+ {1309, {wxSizer, replace_3_0, 3}},
+ {1310, {wxSizer, replace_2, 2}},
+ {1311, {wxSizer, setDimension, 4}},
+ {1312, {wxSizer, setMinSize_2, 2}},
+ {1313, {wxSizer, setMinSize_1, 1}},
+ {1314, {wxSizer, setItemMinSize_3_2, 3}},
+ {1315, {wxSizer, setItemMinSize_2_2, 2}},
+ {1316, {wxSizer, setItemMinSize_3_1, 3}},
+ {1317, {wxSizer, setItemMinSize_2_1, 2}},
+ {1318, {wxSizer, setItemMinSize_3_0, 3}},
+ {1319, {wxSizer, setItemMinSize_2_0, 2}},
+ {1320, {wxSizer, setSizeHints, 1}},
+ {1321, {wxSizer, setVirtualSizeHints, 1}},
+ {1322, {wxSizer, show_2_2, 2}},
+ {1323, {wxSizer, show_2_1, 2}},
+ {1324, {wxSizer, show_2_0, 2}},
+ {1325, {wxSizer, show_1, 1}},
+ {1326, {wxSizerFlags, new, 1}},
+ {1327, {wxSizerFlags, align, 1}},
+ {1328, {wxSizerFlags, border_2, 2}},
+ {1329, {wxSizerFlags, border_1, 1}},
+ {1330, {wxSizerFlags, center, 0}},
+ {1331, {wxSizerFlags, centre, 0}},
+ {1332, {wxSizerFlags, expand, 0}},
+ {1333, {wxSizerFlags, left, 0}},
+ {1334, {wxSizerFlags, proportion, 1}},
+ {1335, {wxSizerFlags, right, 0}},
+ {1336, {wxSizerFlags, 'Destroy', undefined}},
+ {1337, {wxSizerItem, new_5_1, 5}},
+ {1338, {wxSizerItem, new_2_1, 2}},
+ {1339, {wxSizerItem, new_5_0, 5}},
+ {1340, {wxSizerItem, new_2_0, 2}},
+ {1341, {wxSizerItem, new_6, 6}},
+ {1342, {wxSizerItem, new_3, 3}},
+ {1343, {wxSizerItem, new_0, 0}},
+ {1344, {wxSizerItem, destruct, 0}},
+ {1345, {wxSizerItem, calcMin, 0}},
+ {1346, {wxSizerItem, deleteWindows, 0}},
+ {1347, {wxSizerItem, detachSizer, 0}},
+ {1348, {wxSizerItem, getBorder, 0}},
+ {1349, {wxSizerItem, getFlag, 0}},
+ {1350, {wxSizerItem, getMinSize, 0}},
+ {1351, {wxSizerItem, getPosition, 0}},
+ {1352, {wxSizerItem, getProportion, 0}},
+ {1353, {wxSizerItem, getRatio, 0}},
+ {1354, {wxSizerItem, getRect, 0}},
+ {1355, {wxSizerItem, getSize, 0}},
+ {1356, {wxSizerItem, getSizer, 0}},
+ {1357, {wxSizerItem, getSpacer, 0}},
+ {1358, {wxSizerItem, getUserData, 0}},
+ {1359, {wxSizerItem, getWindow, 0}},
+ {1360, {wxSizerItem, isSizer, 0}},
+ {1361, {wxSizerItem, isShown, 0}},
+ {1362, {wxSizerItem, isSpacer, 0}},
+ {1363, {wxSizerItem, isWindow, 0}},
+ {1364, {wxSizerItem, setBorder, 1}},
+ {1365, {wxSizerItem, setDimension, 2}},
+ {1366, {wxSizerItem, setFlag, 1}},
+ {1367, {wxSizerItem, setInitSize, 2}},
+ {1368, {wxSizerItem, setMinSize_1, 1}},
+ {1369, {wxSizerItem, setMinSize_2, 2}},
+ {1370, {wxSizerItem, setProportion, 1}},
+ {1371, {wxSizerItem, setRatio_2, 2}},
+ {1372, {wxSizerItem, setRatio_1_1, 1}},
+ {1373, {wxSizerItem, setRatio_1_0, 1}},
+ {1374, {wxSizerItem, setSizer, 1}},
+ {1375, {wxSizerItem, setSpacer_1, 1}},
+ {1376, {wxSizerItem, setSpacer_2, 2}},
+ {1377, {wxSizerItem, setWindow, 1}},
+ {1378, {wxSizerItem, show, 1}},
+ {1379, {wxBoxSizer, new, 1}},
+ {1380, {wxBoxSizer, getOrientation, 0}},
+ {1381, {wxBoxSizer, 'Destroy', undefined}},
+ {1382, {wxStaticBoxSizer, new_2, 2}},
+ {1383, {wxStaticBoxSizer, new_3, 3}},
+ {1384, {wxStaticBoxSizer, getStaticBox, 0}},
+ {1385, {wxStaticBoxSizer, 'Destroy', undefined}},
+ {1386, {wxGridSizer, new_4, 4}},
+ {1387, {wxGridSizer, new_2, 2}},
+ {1388, {wxGridSizer, getCols, 0}},
+ {1389, {wxGridSizer, getHGap, 0}},
+ {1390, {wxGridSizer, getRows, 0}},
+ {1391, {wxGridSizer, getVGap, 0}},
+ {1392, {wxGridSizer, setCols, 1}},
+ {1393, {wxGridSizer, setHGap, 1}},
+ {1394, {wxGridSizer, setRows, 1}},
+ {1395, {wxGridSizer, setVGap, 1}},
+ {1396, {wxGridSizer, 'Destroy', undefined}},
+ {1397, {wxFlexGridSizer, new_4, 4}},
+ {1398, {wxFlexGridSizer, new_2, 2}},
+ {1399, {wxFlexGridSizer, addGrowableCol, 2}},
+ {1400, {wxFlexGridSizer, addGrowableRow, 2}},
+ {1401, {wxFlexGridSizer, getFlexibleDirection, 0}},
+ {1402, {wxFlexGridSizer, getNonFlexibleGrowMode, 0}},
+ {1403, {wxFlexGridSizer, removeGrowableCol, 1}},
+ {1404, {wxFlexGridSizer, removeGrowableRow, 1}},
+ {1405, {wxFlexGridSizer, setFlexibleDirection, 1}},
+ {1406, {wxFlexGridSizer, setNonFlexibleGrowMode, 1}},
+ {1407, {wxFlexGridSizer, 'Destroy', undefined}},
+ {1408, {wxGridBagSizer, new, 1}},
+ {1409, {wxGridBagSizer, add_3_2, 3}},
+ {1410, {wxGridBagSizer, add_3_1, 3}},
+ {1411, {wxGridBagSizer, add_4, 4}},
+ {1412, {wxGridBagSizer, add_1_0, 1}},
+ {1413, {wxGridBagSizer, add_2_1, 2}},
+ {1414, {wxGridBagSizer, add_2_0, 2}},
+ {1415, {wxGridBagSizer, add_3_0, 3}},
+ {1416, {wxGridBagSizer, add_1_1, 1}},
+ {1417, {wxGridBagSizer, calcMin, 0}},
+ {1418, {wxGridBagSizer, checkForIntersection_2, 2}},
+ {1419, {wxGridBagSizer, checkForIntersection_3, 3}},
+ {1420, {wxGridBagSizer, findItem_1_1, 1}},
+ {1421, {wxGridBagSizer, findItem_1_0, 1}},
+ {1422, {wxGridBagSizer, findItemAtPoint, 1}},
+ {1423, {wxGridBagSizer, findItemAtPosition, 1}},
+ {1424, {wxGridBagSizer, findItemWithData, 1}},
+ {1425, {wxGridBagSizer, getCellSize, 2}},
+ {1426, {wxGridBagSizer, getEmptyCellSize, 0}},
+ {1427, {wxGridBagSizer, getItemPosition_1_2, 1}},
+ {1428, {wxGridBagSizer, getItemPosition_1_1, 1}},
+ {1429, {wxGridBagSizer, getItemPosition_1_0, 1}},
+ {1430, {wxGridBagSizer, getItemSpan_1_2, 1}},
+ {1431, {wxGridBagSizer, getItemSpan_1_1, 1}},
+ {1432, {wxGridBagSizer, getItemSpan_1_0, 1}},
+ {1433, {wxGridBagSizer, setEmptyCellSize, 1}},
+ {1434, {wxGridBagSizer, setItemPosition_2_2, 2}},
+ {1435, {wxGridBagSizer, setItemPosition_2_1, 2}},
+ {1436, {wxGridBagSizer, setItemPosition_2_0, 2}},
+ {1437, {wxGridBagSizer, setItemSpan_2_2, 2}},
+ {1438, {wxGridBagSizer, setItemSpan_2_1, 2}},
+ {1439, {wxGridBagSizer, setItemSpan_2_0, 2}},
+ {1440, {wxGridBagSizer, 'Destroy', undefined}},
+ {1441, {wxStdDialogButtonSizer, new, 0}},
+ {1442, {wxStdDialogButtonSizer, addButton, 1}},
+ {1443, {wxStdDialogButtonSizer, realize, 0}},
+ {1444, {wxStdDialogButtonSizer, setAffirmativeButton, 1}},
+ {1445, {wxStdDialogButtonSizer, setCancelButton, 1}},
+ {1446, {wxStdDialogButtonSizer, setNegativeButton, 1}},
+ {1447, {wxStdDialogButtonSizer, 'Destroy', undefined}},
+ {1448, {wxFont, new_0, 0}},
+ {1449, {wxFont, new_1, 1}},
+ {1450, {wxFont, new_5, 5}},
+ {1452, {wxFont, destruct, 0}},
+ {1453, {wxFont, isFixedWidth, 0}},
+ {1454, {wxFont, getDefaultEncoding, 0}},
+ {1455, {wxFont, getFaceName, 0}},
+ {1456, {wxFont, getFamily, 0}},
+ {1457, {wxFont, getNativeFontInfoDesc, 0}},
+ {1458, {wxFont, getNativeFontInfoUserDesc, 0}},
+ {1459, {wxFont, getPointSize, 0}},
+ {1460, {wxFont, getStyle, 0}},
+ {1461, {wxFont, getUnderlined, 0}},
+ {1462, {wxFont, getWeight, 0}},
+ {1463, {wxFont, ok, 0}},
+ {1464, {wxFont, setDefaultEncoding, 1}},
+ {1465, {wxFont, setFaceName, 1}},
+ {1466, {wxFont, setFamily, 1}},
+ {1467, {wxFont, setPointSize, 1}},
+ {1468, {wxFont, setStyle, 1}},
+ {1469, {wxFont, setUnderlined, 1}},
+ {1470, {wxFont, setWeight, 1}},
+ {1471, {wxToolTip, enable, 1}},
+ {1472, {wxToolTip, setDelay, 1}},
+ {1473, {wxToolTip, new, 1}},
+ {1474, {wxToolTip, setTip, 1}},
+ {1475, {wxToolTip, getTip, 0}},
+ {1476, {wxToolTip, getWindow, 0}},
+ {1477, {wxToolTip, 'Destroy', undefined}},
+ {1479, {wxButton, new_3, 3}},
+ {1480, {wxButton, new_0, 0}},
+ {1481, {wxButton, destruct, 0}},
+ {1482, {wxButton, create, 3}},
+ {1483, {wxButton, getDefaultSize, 0}},
+ {1484, {wxButton, setDefault, 0}},
+ {1485, {wxButton, setLabel, 1}},
+ {1487, {wxBitmapButton, new_4, 4}},
+ {1488, {wxBitmapButton, new_0, 0}},
+ {1489, {wxBitmapButton, create, 4}},
+ {1490, {wxBitmapButton, getBitmapDisabled, 0}},
+ {1492, {wxBitmapButton, getBitmapFocus, 0}},
+ {1494, {wxBitmapButton, getBitmapLabel, 0}},
+ {1496, {wxBitmapButton, getBitmapSelected, 0}},
+ {1498, {wxBitmapButton, setBitmapDisabled, 1}},
+ {1499, {wxBitmapButton, setBitmapFocus, 1}},
+ {1500, {wxBitmapButton, setBitmapLabel, 1}},
+ {1501, {wxBitmapButton, setBitmapSelected, 1}},
+ {1502, {wxBitmapButton, 'Destroy', undefined}},
+ {1503, {wxToggleButton, new_0, 0}},
+ {1504, {wxToggleButton, new_4, 4}},
+ {1505, {wxToggleButton, create, 4}},
+ {1506, {wxToggleButton, getValue, 0}},
+ {1507, {wxToggleButton, setValue, 1}},
+ {1508, {wxToggleButton, 'Destroy', undefined}},
+ {1509, {wxCalendarCtrl, new_0, 0}},
+ {1510, {wxCalendarCtrl, new_3, 3}},
+ {1511, {wxCalendarCtrl, create, 3}},
+ {1512, {wxCalendarCtrl, destruct, 0}},
+ {1513, {wxCalendarCtrl, setDate, 1}},
+ {1514, {wxCalendarCtrl, getDate, 0}},
+ {1515, {wxCalendarCtrl, enableYearChange, 1}},
+ {1516, {wxCalendarCtrl, enableMonthChange, 1}},
+ {1517, {wxCalendarCtrl, enableHolidayDisplay, 1}},
+ {1518, {wxCalendarCtrl, setHeaderColours, 2}},
+ {1519, {wxCalendarCtrl, getHeaderColourFg, 0}},
+ {1520, {wxCalendarCtrl, getHeaderColourBg, 0}},
+ {1521, {wxCalendarCtrl, setHighlightColours, 2}},
+ {1522, {wxCalendarCtrl, getHighlightColourFg, 0}},
+ {1523, {wxCalendarCtrl, getHighlightColourBg, 0}},
+ {1524, {wxCalendarCtrl, setHolidayColours, 2}},
+ {1525, {wxCalendarCtrl, getHolidayColourFg, 0}},
+ {1526, {wxCalendarCtrl, getHolidayColourBg, 0}},
+ {1527, {wxCalendarCtrl, getAttr, 1}},
+ {1528, {wxCalendarCtrl, setAttr, 2}},
+ {1529, {wxCalendarCtrl, setHoliday, 1}},
+ {1530, {wxCalendarCtrl, resetAttr, 1}},
+ {1531, {wxCalendarCtrl, hitTest, 2}},
+ {1532, {wxCalendarDateAttr, new_0, 0}},
+ {1533, {wxCalendarDateAttr, new_2_1, 2}},
+ {1534, {wxCalendarDateAttr, new_2_0, 2}},
+ {1535, {wxCalendarDateAttr, setTextColour, 1}},
+ {1536, {wxCalendarDateAttr, setBackgroundColour, 1}},
+ {1537, {wxCalendarDateAttr, setBorderColour, 1}},
+ {1538, {wxCalendarDateAttr, setFont, 1}},
+ {1539, {wxCalendarDateAttr, setBorder, 1}},
+ {1540, {wxCalendarDateAttr, setHoliday, 1}},
+ {1541, {wxCalendarDateAttr, hasTextColour, 0}},
+ {1542, {wxCalendarDateAttr, hasBackgroundColour, 0}},
+ {1543, {wxCalendarDateAttr, hasBorderColour, 0}},
+ {1544, {wxCalendarDateAttr, hasFont, 0}},
+ {1545, {wxCalendarDateAttr, hasBorder, 0}},
+ {1546, {wxCalendarDateAttr, isHoliday, 0}},
+ {1547, {wxCalendarDateAttr, getTextColour, 0}},
+ {1548, {wxCalendarDateAttr, getBackgroundColour, 0}},
+ {1549, {wxCalendarDateAttr, getBorderColour, 0}},
+ {1550, {wxCalendarDateAttr, getFont, 0}},
+ {1551, {wxCalendarDateAttr, getBorder, 0}},
+ {1552, {wxCalendarDateAttr, 'Destroy', undefined}},
+ {1554, {wxCheckBox, new_4, 4}},
+ {1555, {wxCheckBox, new_0, 0}},
+ {1556, {wxCheckBox, create, 4}},
+ {1557, {wxCheckBox, getValue, 0}},
+ {1558, {wxCheckBox, get3StateValue, 0}},
+ {1559, {wxCheckBox, is3rdStateAllowedForUser, 0}},
+ {1560, {wxCheckBox, is3State, 0}},
+ {1561, {wxCheckBox, isChecked, 0}},
+ {1562, {wxCheckBox, setValue, 1}},
+ {1563, {wxCheckBox, set3StateValue, 1}},
+ {1564, {wxCheckBox, 'Destroy', undefined}},
+ {1565, {wxCheckListBox, new_0, 0}},
+ {1567, {wxCheckListBox, new_3, 3}},
+ {1568, {wxCheckListBox, check, 2}},
+ {1569, {wxCheckListBox, isChecked, 1}},
+ {1570, {wxCheckListBox, 'Destroy', undefined}},
+ {1573, {wxChoice, new_3, 3}},
+ {1574, {wxChoice, new_0, 0}},
+ {1576, {wxChoice, destruct, 0}},
+ {1578, {wxChoice, create, 6}},
+ {1579, {wxChoice, delete, 1}},
+ {1580, {wxChoice, getColumns, 0}},
+ {1581, {wxChoice, setColumns, 1}},
+ {1582, {wxComboBox, new_0, 0}},
+ {1584, {wxComboBox, new_3, 3}},
+ {1585, {wxComboBox, destruct, 0}},
+ {1587, {wxComboBox, create, 7}},
+ {1588, {wxComboBox, canCopy, 0}},
+ {1589, {wxComboBox, canCut, 0}},
+ {1590, {wxComboBox, canPaste, 0}},
+ {1591, {wxComboBox, canRedo, 0}},
+ {1592, {wxComboBox, canUndo, 0}},
+ {1593, {wxComboBox, copy, 0}},
+ {1594, {wxComboBox, cut, 0}},
+ {1595, {wxComboBox, getInsertionPoint, 0}},
+ {1596, {wxComboBox, getLastPosition, 0}},
+ {1597, {wxComboBox, getValue, 0}},
+ {1598, {wxComboBox, paste, 0}},
+ {1599, {wxComboBox, redo, 0}},
+ {1600, {wxComboBox, replace, 3}},
+ {1601, {wxComboBox, remove, 2}},
+ {1602, {wxComboBox, setInsertionPoint, 1}},
+ {1603, {wxComboBox, setInsertionPointEnd, 0}},
+ {1604, {wxComboBox, setSelection_1, 1}},
+ {1605, {wxComboBox, setSelection_2, 2}},
+ {1606, {wxComboBox, setValue, 1}},
+ {1607, {wxComboBox, undo, 0}},
+ {1608, {wxGauge, new_0, 0}},
+ {1609, {wxGauge, new_4, 4}},
+ {1610, {wxGauge, create, 4}},
+ {1611, {wxGauge, getRange, 0}},
+ {1612, {wxGauge, getValue, 0}},
+ {1613, {wxGauge, isVertical, 0}},
+ {1614, {wxGauge, setRange, 1}},
+ {1615, {wxGauge, setValue, 1}},
+ {1616, {wxGauge, pulse, 0}},
+ {1617, {wxGauge, 'Destroy', undefined}},
+ {1618, {wxGenericDirCtrl, new_0, 0}},
+ {1619, {wxGenericDirCtrl, new_2, 2}},
+ {1620, {wxGenericDirCtrl, destruct, 0}},
+ {1621, {wxGenericDirCtrl, create, 2}},
+ {1622, {wxGenericDirCtrl, init, 0}},
+ {1623, {wxGenericDirCtrl, collapseTree, 0}},
+ {1624, {wxGenericDirCtrl, expandPath, 1}},
+ {1625, {wxGenericDirCtrl, getDefaultPath, 0}},
+ {1626, {wxGenericDirCtrl, getPath, 0}},
+ {1627, {wxGenericDirCtrl, getFilePath, 0}},
+ {1628, {wxGenericDirCtrl, getFilter, 0}},
+ {1629, {wxGenericDirCtrl, getFilterIndex, 0}},
+ {1630, {wxGenericDirCtrl, getRootId, 0}},
+ {1631, {wxGenericDirCtrl, getTreeCtrl, 0}},
+ {1632, {wxGenericDirCtrl, reCreateTree, 0}},
+ {1633, {wxGenericDirCtrl, setDefaultPath, 1}},
+ {1634, {wxGenericDirCtrl, setFilter, 1}},
+ {1635, {wxGenericDirCtrl, setFilterIndex, 1}},
+ {1636, {wxGenericDirCtrl, setPath, 1}},
+ {1638, {wxStaticBox, new_4, 4}},
+ {1639, {wxStaticBox, new_0, 0}},
+ {1640, {wxStaticBox, create, 4}},
+ {1641, {wxStaticBox, 'Destroy', undefined}},
+ {1643, {wxStaticLine, new_2, 2}},
+ {1644, {wxStaticLine, new_0, 0}},
+ {1645, {wxStaticLine, destruct, 0}},
+ {1646, {wxStaticLine, create, 2}},
+ {1647, {wxStaticLine, isVertical, 0}},
+ {1648, {wxStaticLine, getDefaultSize, 0}},
+ {1651, {wxListBox, new_3, 3}},
+ {1652, {wxListBox, new_0, 0}},
+ {1654, {wxListBox, destruct, 0}},
+ {1656, {wxListBox, create, 6}},
+ {1657, {wxListBox, deselect, 1}},
+ {1658, {wxListBox, getSelections, 1}},
+ {1659, {wxListBox, insertItems, 2}},
+ {1660, {wxListBox, isSelected, 1}},
+ {1661, {wxListBox, set, 1}},
+ {1662, {wxListBox, hitTest, 1}},
+ {1663, {wxListBox, setFirstItem_1_0, 1}},
+ {1664, {wxListBox, setFirstItem_1_1, 1}},
+ {1665, {wxListCtrl, new_0, 0}},
+ {1666, {wxListCtrl, new_2, 2}},
+ {1667, {wxListCtrl, arrange, 1}},
+ {1668, {wxListCtrl, assignImageList, 2}},
+ {1669, {wxListCtrl, clearAll, 0}},
+ {1670, {wxListCtrl, create, 2}},
+ {1671, {wxListCtrl, deleteAllItems, 0}},
+ {1672, {wxListCtrl, deleteColumn, 1}},
+ {1673, {wxListCtrl, deleteItem, 1}},
+ {1674, {wxListCtrl, editLabel, 1}},
+ {1675, {wxListCtrl, ensureVisible, 1}},
+ {1676, {wxListCtrl, findItem_3_0, 3}},
+ {1677, {wxListCtrl, findItem_3_1, 3}},
+ {1678, {wxListCtrl, getColumn, 2}},
+ {1679, {wxListCtrl, getColumnCount, 0}},
+ {1680, {wxListCtrl, getColumnWidth, 1}},
+ {1681, {wxListCtrl, getCountPerPage, 0}},
+ {1682, {wxListCtrl, getEditControl, 0}},
+ {1683, {wxListCtrl, getImageList, 1}},
+ {1684, {wxListCtrl, getItem, 1}},
+ {1685, {wxListCtrl, getItemBackgroundColour, 1}},
+ {1686, {wxListCtrl, getItemCount, 0}},
+ {1687, {wxListCtrl, getItemData, 1}},
+ {1688, {wxListCtrl, getItemFont, 1}},
+ {1689, {wxListCtrl, getItemPosition, 2}},
+ {1690, {wxListCtrl, getItemRect, 3}},
+ {1691, {wxListCtrl, getItemSpacing, 0}},
+ {1692, {wxListCtrl, getItemState, 2}},
+ {1693, {wxListCtrl, getItemText, 1}},
+ {1694, {wxListCtrl, getItemTextColour, 1}},
+ {1695, {wxListCtrl, getNextItem, 2}},
+ {1696, {wxListCtrl, getSelectedItemCount, 0}},
+ {1697, {wxListCtrl, getTextColour, 0}},
+ {1698, {wxListCtrl, getTopItem, 0}},
+ {1699, {wxListCtrl, getViewRect, 0}},
+ {1700, {wxListCtrl, hitTest, 3}},
+ {1701, {wxListCtrl, insertColumn_2, 2}},
+ {1702, {wxListCtrl, insertColumn_3, 3}},
+ {1703, {wxListCtrl, insertItem_1, 1}},
+ {1704, {wxListCtrl, insertItem_2_1, 2}},
+ {1705, {wxListCtrl, insertItem_2_0, 2}},
+ {1706, {wxListCtrl, insertItem_3, 3}},
+ {1707, {wxListCtrl, refreshItem, 1}},
+ {1708, {wxListCtrl, refreshItems, 2}},
+ {1709, {wxListCtrl, scrollList, 2}},
+ {1710, {wxListCtrl, setBackgroundColour, 1}},
+ {1711, {wxListCtrl, setColumn, 2}},
+ {1712, {wxListCtrl, setColumnWidth, 2}},
+ {1713, {wxListCtrl, setImageList, 2}},
+ {1714, {wxListCtrl, setItem_1, 1}},
+ {1715, {wxListCtrl, setItem_4, 4}},
+ {1716, {wxListCtrl, setItemBackgroundColour, 2}},
+ {1717, {wxListCtrl, setItemCount, 1}},
+ {1718, {wxListCtrl, setItemData, 2}},
+ {1719, {wxListCtrl, setItemFont, 2}},
+ {1720, {wxListCtrl, setItemImage, 3}},
+ {1721, {wxListCtrl, setItemColumnImage, 3}},
+ {1722, {wxListCtrl, setItemPosition, 2}},
+ {1723, {wxListCtrl, setItemState, 3}},
+ {1724, {wxListCtrl, setItemText, 2}},
+ {1725, {wxListCtrl, setItemTextColour, 2}},
+ {1726, {wxListCtrl, setSingleStyle, 2}},
+ {1727, {wxListCtrl, setTextColour, 1}},
+ {1728, {wxListCtrl, setWindowStyleFlag, 1}},
+ {1729, {wxListCtrl, sortItems, 2}},
+ {1730, {wxListCtrl, 'Destroy', undefined}},
+ {1731, {wxListView, clearColumnImage, 1}},
+ {1732, {wxListView, focus, 1}},
+ {1733, {wxListView, getFirstSelected, 0}},
+ {1734, {wxListView, getFocusedItem, 0}},
+ {1735, {wxListView, getNextSelected, 1}},
+ {1736, {wxListView, isSelected, 1}},
+ {1737, {wxListView, select, 2}},
+ {1738, {wxListView, setColumnImage, 2}},
+ {1739, {wxListItem, new_0, 0}},
+ {1740, {wxListItem, new_1, 1}},
+ {1741, {wxListItem, destruct, 0}},
+ {1742, {wxListItem, clear, 0}},
+ {1743, {wxListItem, getAlign, 0}},
+ {1744, {wxListItem, getBackgroundColour, 0}},
+ {1745, {wxListItem, getColumn, 0}},
+ {1746, {wxListItem, getFont, 0}},
+ {1747, {wxListItem, getId, 0}},
+ {1748, {wxListItem, getImage, 0}},
+ {1749, {wxListItem, getMask, 0}},
+ {1750, {wxListItem, getState, 0}},
+ {1751, {wxListItem, getText, 0}},
+ {1752, {wxListItem, getTextColour, 0}},
+ {1753, {wxListItem, getWidth, 0}},
+ {1754, {wxListItem, setAlign, 1}},
+ {1755, {wxListItem, setBackgroundColour, 1}},
+ {1756, {wxListItem, setColumn, 1}},
+ {1757, {wxListItem, setFont, 1}},
+ {1758, {wxListItem, setId, 1}},
+ {1759, {wxListItem, setImage, 1}},
+ {1760, {wxListItem, setMask, 1}},
+ {1761, {wxListItem, setState, 1}},
+ {1762, {wxListItem, setStateMask, 1}},
+ {1763, {wxListItem, setText, 1}},
+ {1764, {wxListItem, setTextColour, 1}},
+ {1765, {wxListItem, setWidth, 1}},
+ {1766, {wxListItemAttr, new_0, 0}},
+ {1767, {wxListItemAttr, new_3, 3}},
+ {1768, {wxListItemAttr, getBackgroundColour, 0}},
+ {1769, {wxListItemAttr, getFont, 0}},
+ {1770, {wxListItemAttr, getTextColour, 0}},
+ {1771, {wxListItemAttr, hasBackgroundColour, 0}},
+ {1772, {wxListItemAttr, hasFont, 0}},
+ {1773, {wxListItemAttr, hasTextColour, 0}},
+ {1774, {wxListItemAttr, setBackgroundColour, 1}},
+ {1775, {wxListItemAttr, setFont, 1}},
+ {1776, {wxListItemAttr, setTextColour, 1}},
+ {1777, {wxListItemAttr, 'Destroy', undefined}},
+ {1778, {wxImageList, new_0, 0}},
+ {1779, {wxImageList, new_3, 3}},
+ {1780, {wxImageList, add_1, 1}},
+ {1781, {wxImageList, add_2_0, 2}},
+ {1782, {wxImageList, add_2_1, 2}},
+ {1783, {wxImageList, create, 3}},
+ {1785, {wxImageList, draw, 5}},
+ {1786, {wxImageList, getBitmap, 1}},
+ {1787, {wxImageList, getIcon, 1}},
+ {1788, {wxImageList, getImageCount, 0}},
+ {1789, {wxImageList, getSize, 3}},
+ {1790, {wxImageList, remove, 1}},
+ {1791, {wxImageList, removeAll, 0}},
+ {1792, {wxImageList, replace_2, 2}},
+ {1793, {wxImageList, replace_3, 3}},
+ {1794, {wxImageList, 'Destroy', undefined}},
+ {1795, {wxTextAttr, new_0, 0}},
+ {1796, {wxTextAttr, new_2, 2}},
+ {1797, {wxTextAttr, getAlignment, 0}},
+ {1798, {wxTextAttr, getBackgroundColour, 0}},
+ {1799, {wxTextAttr, getFont, 0}},
+ {1800, {wxTextAttr, getLeftIndent, 0}},
+ {1801, {wxTextAttr, getLeftSubIndent, 0}},
+ {1802, {wxTextAttr, getRightIndent, 0}},
+ {1803, {wxTextAttr, getTabs, 0}},
+ {1804, {wxTextAttr, getTextColour, 0}},
+ {1805, {wxTextAttr, hasBackgroundColour, 0}},
+ {1806, {wxTextAttr, hasFont, 0}},
+ {1807, {wxTextAttr, hasTextColour, 0}},
+ {1808, {wxTextAttr, getFlags, 0}},
+ {1809, {wxTextAttr, isDefault, 0}},
+ {1810, {wxTextAttr, setAlignment, 1}},
+ {1811, {wxTextAttr, setBackgroundColour, 1}},
+ {1812, {wxTextAttr, setFlags, 1}},
+ {1813, {wxTextAttr, setFont, 2}},
+ {1814, {wxTextAttr, setLeftIndent, 2}},
+ {1815, {wxTextAttr, setRightIndent, 1}},
+ {1816, {wxTextAttr, setTabs, 1}},
+ {1817, {wxTextAttr, setTextColour, 1}},
+ {1818, {wxTextAttr, 'Destroy', undefined}},
+ {1820, {wxTextCtrl, new_3, 3}},
+ {1821, {wxTextCtrl, new_0, 0}},
+ {1823, {wxTextCtrl, destruct, 0}},
+ {1824, {wxTextCtrl, appendText, 1}},
+ {1825, {wxTextCtrl, canCopy, 0}},
+ {1826, {wxTextCtrl, canCut, 0}},
+ {1827, {wxTextCtrl, canPaste, 0}},
+ {1828, {wxTextCtrl, canRedo, 0}},
+ {1829, {wxTextCtrl, canUndo, 0}},
+ {1830, {wxTextCtrl, clear, 0}},
+ {1831, {wxTextCtrl, copy, 0}},
+ {1832, {wxTextCtrl, create, 3}},
+ {1833, {wxTextCtrl, cut, 0}},
+ {1834, {wxTextCtrl, discardEdits, 0}},
+ {1835, {wxTextCtrl, changeValue, 1}},
+ {1836, {wxTextCtrl, emulateKeyPress, 1}},
+ {1837, {wxTextCtrl, getDefaultStyle, 0}},
+ {1838, {wxTextCtrl, getInsertionPoint, 0}},
+ {1839, {wxTextCtrl, getLastPosition, 0}},
+ {1840, {wxTextCtrl, getLineLength, 1}},
+ {1841, {wxTextCtrl, getLineText, 1}},
+ {1842, {wxTextCtrl, getNumberOfLines, 0}},
+ {1843, {wxTextCtrl, getRange, 2}},
+ {1844, {wxTextCtrl, getSelection, 2}},
+ {1845, {wxTextCtrl, getStringSelection, 0}},
+ {1846, {wxTextCtrl, getStyle, 2}},
+ {1847, {wxTextCtrl, getValue, 0}},
+ {1848, {wxTextCtrl, isEditable, 0}},
+ {1849, {wxTextCtrl, isModified, 0}},
+ {1850, {wxTextCtrl, isMultiLine, 0}},
+ {1851, {wxTextCtrl, isSingleLine, 0}},
+ {1852, {wxTextCtrl, loadFile, 2}},
+ {1853, {wxTextCtrl, markDirty, 0}},
+ {1854, {wxTextCtrl, paste, 0}},
+ {1855, {wxTextCtrl, positionToXY, 3}},
+ {1856, {wxTextCtrl, redo, 0}},
+ {1857, {wxTextCtrl, remove, 2}},
+ {1858, {wxTextCtrl, replace, 3}},
+ {1859, {wxTextCtrl, saveFile, 1}},
+ {1860, {wxTextCtrl, setDefaultStyle, 1}},
+ {1861, {wxTextCtrl, setEditable, 1}},
+ {1862, {wxTextCtrl, setInsertionPoint, 1}},
+ {1863, {wxTextCtrl, setInsertionPointEnd, 0}},
+ {1865, {wxTextCtrl, setMaxLength, 1}},
+ {1866, {wxTextCtrl, setSelection, 2}},
+ {1867, {wxTextCtrl, setStyle, 3}},
+ {1868, {wxTextCtrl, setValue, 1}},
+ {1869, {wxTextCtrl, showPosition, 1}},
+ {1870, {wxTextCtrl, undo, 0}},
+ {1871, {wxTextCtrl, writeText, 1}},
+ {1872, {wxTextCtrl, xYToPosition, 2}},
+ {1875, {wxNotebook, new_0, 0}},
+ {1876, {wxNotebook, new_3, 3}},
+ {1877, {wxNotebook, destruct, 0}},
+ {1878, {wxNotebook, addPage, 3}},
+ {1879, {wxNotebook, advanceSelection, 1}},
+ {1880, {wxNotebook, assignImageList, 1}},
+ {1881, {wxNotebook, create, 3}},
+ {1882, {wxNotebook, deleteAllPages, 0}},
+ {1883, {wxNotebook, deletePage, 1}},
+ {1884, {wxNotebook, removePage, 1}},
+ {1885, {wxNotebook, getCurrentPage, 0}},
+ {1886, {wxNotebook, getImageList, 0}},
+ {1888, {wxNotebook, getPage, 1}},
+ {1889, {wxNotebook, getPageCount, 0}},
+ {1890, {wxNotebook, getPageImage, 1}},
+ {1891, {wxNotebook, getPageText, 1}},
+ {1892, {wxNotebook, getRowCount, 0}},
+ {1893, {wxNotebook, getSelection, 0}},
+ {1894, {wxNotebook, getThemeBackgroundColour, 0}},
+ {1896, {wxNotebook, hitTest, 2}},
+ {1898, {wxNotebook, insertPage, 4}},
+ {1899, {wxNotebook, setImageList, 1}},
+ {1900, {wxNotebook, setPadding, 1}},
+ {1901, {wxNotebook, setPageSize, 1}},
+ {1902, {wxNotebook, setPageImage, 2}},
+ {1903, {wxNotebook, setPageText, 2}},
+ {1904, {wxNotebook, setSelection, 1}},
+ {1905, {wxNotebook, changeSelection, 1}},
+ {1906, {wxChoicebook, new_0, 0}},
+ {1907, {wxChoicebook, new_3, 3}},
+ {1908, {wxChoicebook, addPage, 3}},
+ {1909, {wxChoicebook, advanceSelection, 1}},
+ {1910, {wxChoicebook, assignImageList, 1}},
+ {1911, {wxChoicebook, create, 3}},
+ {1912, {wxChoicebook, deleteAllPages, 0}},
+ {1913, {wxChoicebook, deletePage, 1}},
+ {1914, {wxChoicebook, removePage, 1}},
+ {1915, {wxChoicebook, getCurrentPage, 0}},
+ {1916, {wxChoicebook, getImageList, 0}},
+ {1918, {wxChoicebook, getPage, 1}},
+ {1919, {wxChoicebook, getPageCount, 0}},
+ {1920, {wxChoicebook, getPageImage, 1}},
+ {1921, {wxChoicebook, getPageText, 1}},
+ {1922, {wxChoicebook, getSelection, 0}},
+ {1923, {wxChoicebook, hitTest, 2}},
+ {1924, {wxChoicebook, insertPage, 4}},
+ {1925, {wxChoicebook, setImageList, 1}},
+ {1926, {wxChoicebook, setPageSize, 1}},
+ {1927, {wxChoicebook, setPageImage, 2}},
+ {1928, {wxChoicebook, setPageText, 2}},
+ {1929, {wxChoicebook, setSelection, 1}},
+ {1930, {wxChoicebook, changeSelection, 1}},
+ {1931, {wxChoicebook, 'Destroy', undefined}},
+ {1932, {wxToolbook, new_0, 0}},
+ {1933, {wxToolbook, new_3, 3}},
+ {1934, {wxToolbook, addPage, 3}},
+ {1935, {wxToolbook, advanceSelection, 1}},
+ {1936, {wxToolbook, assignImageList, 1}},
+ {1937, {wxToolbook, create, 3}},
+ {1938, {wxToolbook, deleteAllPages, 0}},
+ {1939, {wxToolbook, deletePage, 1}},
+ {1940, {wxToolbook, removePage, 1}},
+ {1941, {wxToolbook, getCurrentPage, 0}},
+ {1942, {wxToolbook, getImageList, 0}},
+ {1944, {wxToolbook, getPage, 1}},
+ {1945, {wxToolbook, getPageCount, 0}},
+ {1946, {wxToolbook, getPageImage, 1}},
+ {1947, {wxToolbook, getPageText, 1}},
+ {1948, {wxToolbook, getSelection, 0}},
+ {1950, {wxToolbook, hitTest, 2}},
+ {1951, {wxToolbook, insertPage, 4}},
+ {1952, {wxToolbook, setImageList, 1}},
+ {1953, {wxToolbook, setPageSize, 1}},
+ {1954, {wxToolbook, setPageImage, 2}},
+ {1955, {wxToolbook, setPageText, 2}},
+ {1956, {wxToolbook, setSelection, 1}},
+ {1957, {wxToolbook, changeSelection, 1}},
+ {1958, {wxToolbook, 'Destroy', undefined}},
+ {1959, {wxListbook, new_0, 0}},
+ {1960, {wxListbook, new_3, 3}},
+ {1961, {wxListbook, addPage, 3}},
+ {1962, {wxListbook, advanceSelection, 1}},
+ {1963, {wxListbook, assignImageList, 1}},
+ {1964, {wxListbook, create, 3}},
+ {1965, {wxListbook, deleteAllPages, 0}},
+ {1966, {wxListbook, deletePage, 1}},
+ {1967, {wxListbook, removePage, 1}},
+ {1968, {wxListbook, getCurrentPage, 0}},
+ {1969, {wxListbook, getImageList, 0}},
+ {1971, {wxListbook, getPage, 1}},
+ {1972, {wxListbook, getPageCount, 0}},
+ {1973, {wxListbook, getPageImage, 1}},
+ {1974, {wxListbook, getPageText, 1}},
+ {1975, {wxListbook, getSelection, 0}},
+ {1977, {wxListbook, hitTest, 2}},
+ {1978, {wxListbook, insertPage, 4}},
+ {1979, {wxListbook, setImageList, 1}},
+ {1980, {wxListbook, setPageSize, 1}},
+ {1981, {wxListbook, setPageImage, 2}},
+ {1982, {wxListbook, setPageText, 2}},
+ {1983, {wxListbook, setSelection, 1}},
+ {1984, {wxListbook, changeSelection, 1}},
+ {1985, {wxListbook, 'Destroy', undefined}},
+ {1986, {wxTreebook, new_0, 0}},
+ {1987, {wxTreebook, new_3, 3}},
+ {1988, {wxTreebook, addPage, 3}},
+ {1989, {wxTreebook, advanceSelection, 1}},
+ {1990, {wxTreebook, assignImageList, 1}},
+ {1991, {wxTreebook, create, 3}},
+ {1992, {wxTreebook, deleteAllPages, 0}},
+ {1993, {wxTreebook, deletePage, 1}},
+ {1994, {wxTreebook, removePage, 1}},
+ {1995, {wxTreebook, getCurrentPage, 0}},
+ {1996, {wxTreebook, getImageList, 0}},
+ {1998, {wxTreebook, getPage, 1}},
+ {1999, {wxTreebook, getPageCount, 0}},
+ {2000, {wxTreebook, getPageImage, 1}},
+ {2001, {wxTreebook, getPageText, 1}},
+ {2002, {wxTreebook, getSelection, 0}},
+ {2003, {wxTreebook, expandNode, 2}},
+ {2004, {wxTreebook, isNodeExpanded, 1}},
+ {2006, {wxTreebook, hitTest, 2}},
+ {2007, {wxTreebook, insertPage, 4}},
+ {2008, {wxTreebook, insertSubPage, 4}},
+ {2009, {wxTreebook, setImageList, 1}},
+ {2010, {wxTreebook, setPageSize, 1}},
+ {2011, {wxTreebook, setPageImage, 2}},
+ {2012, {wxTreebook, setPageText, 2}},
+ {2013, {wxTreebook, setSelection, 1}},
+ {2014, {wxTreebook, changeSelection, 1}},
+ {2015, {wxTreebook, 'Destroy', undefined}},
+ {2018, {wxTreeCtrl, new_2, 2}},
+ {2019, {wxTreeCtrl, new_0, 0}},
+ {2021, {wxTreeCtrl, destruct, 0}},
+ {2022, {wxTreeCtrl, addRoot, 2}},
+ {2023, {wxTreeCtrl, appendItem, 3}},
+ {2024, {wxTreeCtrl, assignImageList, 1}},
+ {2025, {wxTreeCtrl, assignStateImageList, 1}},
+ {2026, {wxTreeCtrl, collapse, 1}},
+ {2027, {wxTreeCtrl, collapseAndReset, 1}},
+ {2028, {wxTreeCtrl, create, 2}},
+ {2029, {wxTreeCtrl, delete, 1}},
+ {2030, {wxTreeCtrl, deleteAllItems, 0}},
+ {2031, {wxTreeCtrl, deleteChildren, 1}},
+ {2032, {wxTreeCtrl, editLabel, 1}},
+ {2033, {wxTreeCtrl, ensureVisible, 1}},
+ {2034, {wxTreeCtrl, expand, 1}},
+ {2035, {wxTreeCtrl, getBoundingRect, 3}},
+ {2037, {wxTreeCtrl, getChildrenCount, 2}},
+ {2038, {wxTreeCtrl, getCount, 0}},
+ {2039, {wxTreeCtrl, getEditControl, 0}},
+ {2040, {wxTreeCtrl, getFirstChild, 2}},
+ {2041, {wxTreeCtrl, getNextChild, 2}},
+ {2042, {wxTreeCtrl, getFirstVisibleItem, 0}},
+ {2043, {wxTreeCtrl, getImageList, 0}},
+ {2044, {wxTreeCtrl, getIndent, 0}},
+ {2045, {wxTreeCtrl, getItemBackgroundColour, 1}},
+ {2046, {wxTreeCtrl, getItemData, 1}},
+ {2047, {wxTreeCtrl, getItemFont, 1}},
+ {2048, {wxTreeCtrl, getItemImage_1, 1}},
+ {2049, {wxTreeCtrl, getItemImage_2, 2}},
+ {2050, {wxTreeCtrl, getItemText, 1}},
+ {2051, {wxTreeCtrl, getItemTextColour, 1}},
+ {2052, {wxTreeCtrl, getLastChild, 1}},
+ {2053, {wxTreeCtrl, getNextSibling, 1}},
+ {2054, {wxTreeCtrl, getNextVisible, 1}},
+ {2055, {wxTreeCtrl, getItemParent, 1}},
+ {2056, {wxTreeCtrl, getPrevSibling, 1}},
+ {2057, {wxTreeCtrl, getPrevVisible, 1}},
+ {2058, {wxTreeCtrl, getRootItem, 0}},
+ {2059, {wxTreeCtrl, getSelection, 0}},
+ {2060, {wxTreeCtrl, getSelections, 1}},
+ {2061, {wxTreeCtrl, getStateImageList, 0}},
+ {2062, {wxTreeCtrl, hitTest, 2}},
+ {2064, {wxTreeCtrl, insertItem, 4}},
+ {2065, {wxTreeCtrl, isBold, 1}},
+ {2066, {wxTreeCtrl, isExpanded, 1}},
+ {2067, {wxTreeCtrl, isSelected, 1}},
+ {2068, {wxTreeCtrl, isVisible, 1}},
+ {2069, {wxTreeCtrl, itemHasChildren, 1}},
+ {2070, {wxTreeCtrl, isTreeItemIdOk, 1}},
+ {2071, {wxTreeCtrl, prependItem, 3}},
+ {2072, {wxTreeCtrl, scrollTo, 1}},
+ {2073, {wxTreeCtrl, selectItem_1, 1}},
+ {2074, {wxTreeCtrl, selectItem_2, 2}},
+ {2075, {wxTreeCtrl, setIndent, 1}},
+ {2076, {wxTreeCtrl, setImageList, 1}},
+ {2077, {wxTreeCtrl, setItemBackgroundColour, 2}},
+ {2078, {wxTreeCtrl, setItemBold, 2}},
+ {2079, {wxTreeCtrl, setItemData, 2}},
+ {2080, {wxTreeCtrl, setItemDropHighlight, 2}},
+ {2081, {wxTreeCtrl, setItemFont, 2}},
+ {2082, {wxTreeCtrl, setItemHasChildren, 2}},
+ {2083, {wxTreeCtrl, setItemImage_2, 2}},
+ {2084, {wxTreeCtrl, setItemImage_3, 3}},
+ {2085, {wxTreeCtrl, setItemText, 2}},
+ {2086, {wxTreeCtrl, setItemTextColour, 2}},
+ {2087, {wxTreeCtrl, setStateImageList, 1}},
+ {2088, {wxTreeCtrl, setWindowStyle, 1}},
+ {2089, {wxTreeCtrl, sortChildren, 1}},
+ {2090, {wxTreeCtrl, toggle, 1}},
+ {2091, {wxTreeCtrl, toggleItemSelection, 1}},
+ {2092, {wxTreeCtrl, unselect, 0}},
+ {2093, {wxTreeCtrl, unselectAll, 0}},
+ {2094, {wxTreeCtrl, unselectItem, 1}},
+ {2095, {wxScrollBar, new_0, 0}},
+ {2096, {wxScrollBar, new_3, 3}},
+ {2097, {wxScrollBar, destruct, 0}},
+ {2098, {wxScrollBar, create, 3}},
+ {2099, {wxScrollBar, getRange, 0}},
+ {2100, {wxScrollBar, getPageSize, 0}},
+ {2101, {wxScrollBar, getThumbPosition, 0}},
+ {2102, {wxScrollBar, getThumbSize, 0}},
+ {2103, {wxScrollBar, setThumbPosition, 1}},
+ {2104, {wxScrollBar, setScrollbar, 5}},
+ {2106, {wxSpinButton, new_2, 2}},
+ {2107, {wxSpinButton, new_0, 0}},
+ {2108, {wxSpinButton, create, 2}},
+ {2109, {wxSpinButton, getMax, 0}},
+ {2110, {wxSpinButton, getMin, 0}},
+ {2111, {wxSpinButton, getValue, 0}},
+ {2112, {wxSpinButton, setRange, 2}},
+ {2113, {wxSpinButton, setValue, 1}},
+ {2114, {wxSpinButton, 'Destroy', undefined}},
+ {2115, {wxSpinCtrl, new_0, 0}},
+ {2116, {wxSpinCtrl, new_2, 2}},
+ {2118, {wxSpinCtrl, create, 2}},
+ {2121, {wxSpinCtrl, setValue_1_1, 1}},
+ {2122, {wxSpinCtrl, setValue_1_0, 1}},
+ {2124, {wxSpinCtrl, getValue, 0}},
+ {2126, {wxSpinCtrl, setRange, 2}},
+ {2127, {wxSpinCtrl, setSelection, 2}},
+ {2129, {wxSpinCtrl, getMin, 0}},
+ {2131, {wxSpinCtrl, getMax, 0}},
+ {2132, {wxSpinCtrl, 'Destroy', undefined}},
+ {2133, {wxStaticText, new_0, 0}},
+ {2134, {wxStaticText, new_4, 4}},
+ {2135, {wxStaticText, create, 4}},
+ {2136, {wxStaticText, getLabel, 0}},
+ {2137, {wxStaticText, setLabel, 1}},
+ {2138, {wxStaticText, wrap, 1}},
+ {2139, {wxStaticText, 'Destroy', undefined}},
+ {2140, {wxStaticBitmap, new_0, 0}},
+ {2141, {wxStaticBitmap, new_4, 4}},
+ {2142, {wxStaticBitmap, create, 4}},
+ {2143, {wxStaticBitmap, getBitmap, 0}},
+ {2144, {wxStaticBitmap, setBitmap, 1}},
+ {2145, {wxStaticBitmap, 'Destroy', undefined}},
+ {2146, {wxRadioBox, new, 7}},
+ {2148, {wxRadioBox, destruct, 0}},
+ {2149, {wxRadioBox, create, 7}},
+ {2150, {wxRadioBox, enable_2, 2}},
+ {2151, {wxRadioBox, enable_1, 1}},
+ {2152, {wxRadioBox, getSelection, 0}},
+ {2153, {wxRadioBox, getString, 1}},
+ {2154, {wxRadioBox, setSelection, 1}},
+ {2155, {wxRadioBox, show_2, 2}},
+ {2156, {wxRadioBox, show_1, 1}},
+ {2157, {wxRadioBox, getColumnCount, 0}},
+ {2158, {wxRadioBox, getItemHelpText, 1}},
+ {2159, {wxRadioBox, getItemToolTip, 1}},
+ {2161, {wxRadioBox, getItemFromPoint, 1}},
+ {2162, {wxRadioBox, getRowCount, 0}},
+ {2163, {wxRadioBox, isItemEnabled, 1}},
+ {2164, {wxRadioBox, isItemShown, 1}},
+ {2165, {wxRadioBox, setItemHelpText, 2}},
+ {2166, {wxRadioBox, setItemToolTip, 2}},
+ {2167, {wxRadioButton, new_0, 0}},
+ {2168, {wxRadioButton, new_4, 4}},
+ {2169, {wxRadioButton, create, 4}},
+ {2170, {wxRadioButton, getValue, 0}},
+ {2171, {wxRadioButton, setValue, 1}},
+ {2172, {wxRadioButton, 'Destroy', undefined}},
+ {2174, {wxSlider, new_6, 6}},
+ {2175, {wxSlider, new_0, 0}},
+ {2176, {wxSlider, create, 6}},
+ {2177, {wxSlider, getLineSize, 0}},
+ {2178, {wxSlider, getMax, 0}},
+ {2179, {wxSlider, getMin, 0}},
+ {2180, {wxSlider, getPageSize, 0}},
+ {2181, {wxSlider, getThumbLength, 0}},
+ {2182, {wxSlider, getValue, 0}},
+ {2183, {wxSlider, setLineSize, 1}},
+ {2184, {wxSlider, setPageSize, 1}},
+ {2185, {wxSlider, setRange, 2}},
+ {2186, {wxSlider, setThumbLength, 1}},
+ {2187, {wxSlider, setValue, 1}},
+ {2188, {wxSlider, 'Destroy', undefined}},
+ {2190, {wxDialog, new_4, 4}},
+ {2191, {wxDialog, new_0, 0}},
+ {2193, {wxDialog, destruct, 0}},
+ {2194, {wxDialog, create, 4}},
+ {2195, {wxDialog, createButtonSizer, 1}},
+ {2196, {wxDialog, createStdDialogButtonSizer, 1}},
+ {2197, {wxDialog, endModal, 1}},
+ {2198, {wxDialog, getAffirmativeId, 0}},
+ {2199, {wxDialog, getReturnCode, 0}},
+ {2200, {wxDialog, isModal, 0}},
+ {2201, {wxDialog, setAffirmativeId, 1}},
+ {2202, {wxDialog, setReturnCode, 1}},
+ {2203, {wxDialog, show, 1}},
+ {2204, {wxDialog, showModal, 0}},
+ {2205, {wxColourDialog, new_0, 0}},
+ {2206, {wxColourDialog, new_2, 2}},
+ {2207, {wxColourDialog, destruct, 0}},
+ {2208, {wxColourDialog, create, 2}},
+ {2209, {wxColourDialog, getColourData, 0}},
+ {2210, {wxColourData, new_0, 0}},
+ {2211, {wxColourData, new_1, 1}},
+ {2212, {wxColourData, destruct, 0}},
+ {2213, {wxColourData, getChooseFull, 0}},
+ {2214, {wxColourData, getColour, 0}},
+ {2216, {wxColourData, getCustomColour, 1}},
+ {2217, {wxColourData, setChooseFull, 1}},
+ {2218, {wxColourData, setColour, 1}},
+ {2219, {wxColourData, setCustomColour, 2}},
+ {2220, {wxPalette, new_0, 0}},
+ {2221, {wxPalette, new_4, 4}},
+ {2223, {wxPalette, destruct, 0}},
+ {2224, {wxPalette, create, 4}},
+ {2225, {wxPalette, getColoursCount, 0}},
+ {2226, {wxPalette, getPixel, 3}},
+ {2227, {wxPalette, getRGB, 4}},
+ {2228, {wxPalette, isOk, 0}},
+ {2232, {wxDirDialog, new, 2}},
+ {2233, {wxDirDialog, destruct, 0}},
+ {2234, {wxDirDialog, getPath, 0}},
+ {2235, {wxDirDialog, getMessage, 0}},
+ {2236, {wxDirDialog, setMessage, 1}},
+ {2237, {wxDirDialog, setPath, 1}},
+ {2241, {wxFileDialog, new, 2}},
+ {2242, {wxFileDialog, destruct, 0}},
+ {2243, {wxFileDialog, getDirectory, 0}},
+ {2244, {wxFileDialog, getFilename, 0}},
+ {2245, {wxFileDialog, getFilenames, 1}},
+ {2246, {wxFileDialog, getFilterIndex, 0}},
+ {2247, {wxFileDialog, getMessage, 0}},
+ {2248, {wxFileDialog, getPath, 0}},
+ {2249, {wxFileDialog, getPaths, 1}},
+ {2250, {wxFileDialog, getWildcard, 0}},
+ {2251, {wxFileDialog, setDirectory, 1}},
+ {2252, {wxFileDialog, setFilename, 1}},
+ {2253, {wxFileDialog, setFilterIndex, 1}},
+ {2254, {wxFileDialog, setMessage, 1}},
+ {2255, {wxFileDialog, setPath, 1}},
+ {2256, {wxFileDialog, setWildcard, 1}},
+ {2257, {wxPickerBase, setInternalMargin, 1}},
+ {2258, {wxPickerBase, getInternalMargin, 0}},
+ {2259, {wxPickerBase, setTextCtrlProportion, 1}},
+ {2260, {wxPickerBase, setPickerCtrlProportion, 1}},
+ {2261, {wxPickerBase, getTextCtrlProportion, 0}},
+ {2262, {wxPickerBase, getPickerCtrlProportion, 0}},
+ {2263, {wxPickerBase, hasTextCtrl, 0}},
+ {2264, {wxPickerBase, getTextCtrl, 0}},
+ {2265, {wxPickerBase, isTextCtrlGrowable, 0}},
+ {2266, {wxPickerBase, setPickerCtrlGrowable, 1}},
+ {2267, {wxPickerBase, setTextCtrlGrowable, 1}},
+ {2268, {wxPickerBase, isPickerCtrlGrowable, 0}},
+ {2269, {wxFilePickerCtrl, new_0, 0}},
+ {2270, {wxFilePickerCtrl, new_3, 3}},
+ {2271, {wxFilePickerCtrl, create, 3}},
+ {2272, {wxFilePickerCtrl, getPath, 0}},
+ {2273, {wxFilePickerCtrl, setPath, 1}},
+ {2274, {wxFilePickerCtrl, 'Destroy', undefined}},
+ {2275, {wxDirPickerCtrl, new_0, 0}},
+ {2276, {wxDirPickerCtrl, new_3, 3}},
+ {2277, {wxDirPickerCtrl, create, 3}},
+ {2278, {wxDirPickerCtrl, getPath, 0}},
+ {2279, {wxDirPickerCtrl, setPath, 1}},
+ {2280, {wxDirPickerCtrl, 'Destroy', undefined}},
+ {2281, {wxColourPickerCtrl, new_0, 0}},
+ {2282, {wxColourPickerCtrl, new_3, 3}},
+ {2283, {wxColourPickerCtrl, create, 3}},
+ {2284, {wxColourPickerCtrl, getColour, 0}},
+ {2285, {wxColourPickerCtrl, setColour_1_1, 1}},
+ {2286, {wxColourPickerCtrl, setColour_1_0, 1}},
+ {2287, {wxColourPickerCtrl, 'Destroy', undefined}},
+ {2288, {wxDatePickerCtrl, new_0, 0}},
+ {2289, {wxDatePickerCtrl, new_3, 3}},
+ {2290, {wxDatePickerCtrl, getRange, 2}},
+ {2291, {wxDatePickerCtrl, getValue, 0}},
+ {2292, {wxDatePickerCtrl, setRange, 2}},
+ {2293, {wxDatePickerCtrl, setValue, 1}},
+ {2294, {wxDatePickerCtrl, 'Destroy', undefined}},
+ {2295, {wxFontPickerCtrl, new_0, 0}},
+ {2296, {wxFontPickerCtrl, new_3, 3}},
+ {2297, {wxFontPickerCtrl, create, 3}},
+ {2298, {wxFontPickerCtrl, getSelectedFont, 0}},
+ {2299, {wxFontPickerCtrl, setSelectedFont, 1}},
+ {2300, {wxFontPickerCtrl, getMaxPointSize, 0}},
+ {2301, {wxFontPickerCtrl, setMaxPointSize, 1}},
+ {2302, {wxFontPickerCtrl, 'Destroy', undefined}},
+ {2305, {wxFindReplaceDialog, new_0, 0}},
+ {2306, {wxFindReplaceDialog, new_4, 4}},
+ {2307, {wxFindReplaceDialog, destruct, 0}},
+ {2308, {wxFindReplaceDialog, create, 4}},
+ {2309, {wxFindReplaceDialog, getData, 0}},
+ {2310, {wxFindReplaceData, new_0, 0}},
+ {2311, {wxFindReplaceData, new_1, 1}},
+ {2312, {wxFindReplaceData, getFindString, 0}},
+ {2313, {wxFindReplaceData, getReplaceString, 0}},
+ {2314, {wxFindReplaceData, getFlags, 0}},
+ {2315, {wxFindReplaceData, setFlags, 1}},
+ {2316, {wxFindReplaceData, setFindString, 1}},
+ {2317, {wxFindReplaceData, setReplaceString, 1}},
+ {2318, {wxFindReplaceData, 'Destroy', undefined}},
+ {2319, {wxMultiChoiceDialog, new_0, 0}},
+ {2321, {wxMultiChoiceDialog, new_5, 5}},
+ {2322, {wxMultiChoiceDialog, getSelections, 0}},
+ {2323, {wxMultiChoiceDialog, setSelections, 1}},
+ {2324, {wxMultiChoiceDialog, 'Destroy', undefined}},
+ {2325, {wxSingleChoiceDialog, new_0, 0}},
+ {2327, {wxSingleChoiceDialog, new_5, 5}},
+ {2328, {wxSingleChoiceDialog, getSelection, 0}},
+ {2329, {wxSingleChoiceDialog, getStringSelection, 0}},
+ {2330, {wxSingleChoiceDialog, setSelection, 1}},
+ {2331, {wxSingleChoiceDialog, 'Destroy', undefined}},
+ {2332, {wxTextEntryDialog, new, 3}},
+ {2333, {wxTextEntryDialog, getValue, 0}},
+ {2334, {wxTextEntryDialog, setValue, 1}},
+ {2335, {wxTextEntryDialog, 'Destroy', undefined}},
+ {2336, {wxPasswordEntryDialog, new, 3}},
+ {2337, {wxPasswordEntryDialog, 'Destroy', undefined}},
+ {2338, {wxFontData, new_0, 0}},
+ {2339, {wxFontData, new_1, 1}},
+ {2340, {wxFontData, destruct, 0}},
+ {2341, {wxFontData, enableEffects, 1}},
+ {2342, {wxFontData, getAllowSymbols, 0}},
+ {2343, {wxFontData, getColour, 0}},
+ {2344, {wxFontData, getChosenFont, 0}},
+ {2345, {wxFontData, getEnableEffects, 0}},
+ {2346, {wxFontData, getInitialFont, 0}},
+ {2347, {wxFontData, getShowHelp, 0}},
+ {2348, {wxFontData, setAllowSymbols, 1}},
+ {2349, {wxFontData, setChosenFont, 1}},
+ {2350, {wxFontData, setColour, 1}},
+ {2351, {wxFontData, setInitialFont, 1}},
+ {2352, {wxFontData, setRange, 2}},
+ {2353, {wxFontData, setShowHelp, 1}},
+ {2357, {wxFontDialog, new_0, 0}},
+ {2359, {wxFontDialog, new_2, 2}},
+ {2361, {wxFontDialog, create, 2}},
+ {2362, {wxFontDialog, getFontData, 0}},
+ {2364, {wxFontDialog, 'Destroy', undefined}},
+ {2365, {wxProgressDialog, new, 3}},
+ {2366, {wxProgressDialog, destruct, 0}},
+ {2367, {wxProgressDialog, resume, 0}},
+ {2368, {wxProgressDialog, update_2, 2}},
+ {2369, {wxProgressDialog, update_0, 0}},
+ {2370, {wxMessageDialog, new, 3}},
+ {2371, {wxMessageDialog, destruct, 0}},
+ {2372, {wxPageSetupDialog, new, 2}},
+ {2373, {wxPageSetupDialog, destruct, 0}},
+ {2374, {wxPageSetupDialog, getPageSetupData, 0}},
+ {2375, {wxPageSetupDialog, showModal, 0}},
+ {2376, {wxPageSetupDialogData, new_0, 0}},
+ {2377, {wxPageSetupDialogData, new_1_0, 1}},
+ {2378, {wxPageSetupDialogData, new_1_1, 1}},
+ {2379, {wxPageSetupDialogData, destruct, 0}},
+ {2380, {wxPageSetupDialogData, enableHelp, 1}},
+ {2381, {wxPageSetupDialogData, enableMargins, 1}},
+ {2382, {wxPageSetupDialogData, enableOrientation, 1}},
+ {2383, {wxPageSetupDialogData, enablePaper, 1}},
+ {2384, {wxPageSetupDialogData, enablePrinter, 1}},
+ {2385, {wxPageSetupDialogData, getDefaultMinMargins, 0}},
+ {2386, {wxPageSetupDialogData, getEnableMargins, 0}},
+ {2387, {wxPageSetupDialogData, getEnableOrientation, 0}},
+ {2388, {wxPageSetupDialogData, getEnablePaper, 0}},
+ {2389, {wxPageSetupDialogData, getEnablePrinter, 0}},
+ {2390, {wxPageSetupDialogData, getEnableHelp, 0}},
+ {2391, {wxPageSetupDialogData, getDefaultInfo, 0}},
+ {2392, {wxPageSetupDialogData, getMarginTopLeft, 0}},
+ {2393, {wxPageSetupDialogData, getMarginBottomRight, 0}},
+ {2394, {wxPageSetupDialogData, getMinMarginTopLeft, 0}},
+ {2395, {wxPageSetupDialogData, getMinMarginBottomRight, 0}},
+ {2396, {wxPageSetupDialogData, getPaperId, 0}},
+ {2397, {wxPageSetupDialogData, getPaperSize, 0}},
+ {2399, {wxPageSetupDialogData, getPrintData, 0}},
+ {2400, {wxPageSetupDialogData, isOk, 0}},
+ {2401, {wxPageSetupDialogData, setDefaultInfo, 1}},
+ {2402, {wxPageSetupDialogData, setDefaultMinMargins, 1}},
+ {2403, {wxPageSetupDialogData, setMarginTopLeft, 1}},
+ {2404, {wxPageSetupDialogData, setMarginBottomRight, 1}},
+ {2405, {wxPageSetupDialogData, setMinMarginTopLeft, 1}},
+ {2406, {wxPageSetupDialogData, setMinMarginBottomRight, 1}},
+ {2407, {wxPageSetupDialogData, setPaperId, 1}},
+ {2408, {wxPageSetupDialogData, setPaperSize_1_1, 1}},
+ {2409, {wxPageSetupDialogData, setPaperSize_1_0, 1}},
+ {2410, {wxPageSetupDialogData, setPrintData, 1}},
+ {2411, {wxPrintDialog, new_2_0, 2}},
+ {2412, {wxPrintDialog, new_2_1, 2}},
+ {2413, {wxPrintDialog, destruct, 0}},
+ {2414, {wxPrintDialog, getPrintDialogData, 0}},
+ {2415, {wxPrintDialog, getPrintDC, 0}},
+ {2416, {wxPrintDialogData, new_0, 0}},
+ {2417, {wxPrintDialogData, new_1_1, 1}},
+ {2418, {wxPrintDialogData, new_1_0, 1}},
+ {2419, {wxPrintDialogData, destruct, 0}},
+ {2420, {wxPrintDialogData, enableHelp, 1}},
+ {2421, {wxPrintDialogData, enablePageNumbers, 1}},
+ {2422, {wxPrintDialogData, enablePrintToFile, 1}},
+ {2423, {wxPrintDialogData, enableSelection, 1}},
+ {2424, {wxPrintDialogData, getAllPages, 0}},
+ {2425, {wxPrintDialogData, getCollate, 0}},
+ {2426, {wxPrintDialogData, getFromPage, 0}},
+ {2427, {wxPrintDialogData, getMaxPage, 0}},
+ {2428, {wxPrintDialogData, getMinPage, 0}},
+ {2429, {wxPrintDialogData, getNoCopies, 0}},
+ {2430, {wxPrintDialogData, getPrintData, 0}},
+ {2431, {wxPrintDialogData, getPrintToFile, 0}},
+ {2432, {wxPrintDialogData, getSelection, 0}},
+ {2433, {wxPrintDialogData, getToPage, 0}},
+ {2434, {wxPrintDialogData, isOk, 0}},
+ {2435, {wxPrintDialogData, setCollate, 1}},
+ {2436, {wxPrintDialogData, setFromPage, 1}},
+ {2437, {wxPrintDialogData, setMaxPage, 1}},
+ {2438, {wxPrintDialogData, setMinPage, 1}},
+ {2439, {wxPrintDialogData, setNoCopies, 1}},
+ {2440, {wxPrintDialogData, setPrintData, 1}},
+ {2441, {wxPrintDialogData, setPrintToFile, 1}},
+ {2442, {wxPrintDialogData, setSelection, 1}},
+ {2443, {wxPrintDialogData, setToPage, 1}},
+ {2444, {wxPrintData, new_0, 0}},
+ {2445, {wxPrintData, new_1, 1}},
+ {2446, {wxPrintData, destruct, 0}},
+ {2447, {wxPrintData, getCollate, 0}},
+ {2448, {wxPrintData, getBin, 0}},
+ {2449, {wxPrintData, getColour, 0}},
+ {2450, {wxPrintData, getDuplex, 0}},
+ {2451, {wxPrintData, getNoCopies, 0}},
+ {2452, {wxPrintData, getOrientation, 0}},
+ {2453, {wxPrintData, getPaperId, 0}},
+ {2454, {wxPrintData, getPrinterName, 0}},
+ {2455, {wxPrintData, getQuality, 0}},
+ {2456, {wxPrintData, isOk, 0}},
+ {2457, {wxPrintData, setBin, 1}},
+ {2458, {wxPrintData, setCollate, 1}},
+ {2459, {wxPrintData, setColour, 1}},
+ {2460, {wxPrintData, setDuplex, 1}},
+ {2461, {wxPrintData, setNoCopies, 1}},
+ {2462, {wxPrintData, setOrientation, 1}},
+ {2463, {wxPrintData, setPaperId, 1}},
+ {2464, {wxPrintData, setPrinterName, 1}},
+ {2465, {wxPrintData, setQuality, 1}},
+ {2468, {wxPrintPreview, new_2, 2}},
+ {2469, {wxPrintPreview, new_3, 3}},
+ {2471, {wxPrintPreview, destruct, 0}},
+ {2472, {wxPrintPreview, getCanvas, 0}},
+ {2473, {wxPrintPreview, getCurrentPage, 0}},
+ {2474, {wxPrintPreview, getFrame, 0}},
+ {2475, {wxPrintPreview, getMaxPage, 0}},
+ {2476, {wxPrintPreview, getMinPage, 0}},
+ {2477, {wxPrintPreview, getPrintout, 0}},
+ {2478, {wxPrintPreview, getPrintoutForPrinting, 0}},
+ {2479, {wxPrintPreview, isOk, 0}},
+ {2480, {wxPrintPreview, paintPage, 2}},
+ {2481, {wxPrintPreview, print, 1}},
+ {2482, {wxPrintPreview, renderPage, 1}},
+ {2483, {wxPrintPreview, setCanvas, 1}},
+ {2484, {wxPrintPreview, setCurrentPage, 1}},
+ {2485, {wxPrintPreview, setFrame, 1}},
+ {2486, {wxPrintPreview, setPrintout, 1}},
+ {2487, {wxPrintPreview, setZoom, 1}},
+ {2488, {wxPreviewFrame, new, 3}},
+ {2489, {wxPreviewFrame, destruct, 0}},
+ {2490, {wxPreviewFrame, createControlBar, 0}},
+ {2491, {wxPreviewFrame, createCanvas, 0}},
+ {2492, {wxPreviewFrame, initialize, 0}},
+ {2493, {wxPreviewFrame, onCloseWindow, 1}},
+ {2494, {wxPreviewControlBar, new, 4}},
+ {2495, {wxPreviewControlBar, destruct, 0}},
+ {2496, {wxPreviewControlBar, createButtons, 0}},
+ {2497, {wxPreviewControlBar, getPrintPreview, 0}},
+ {2498, {wxPreviewControlBar, getZoomControl, 0}},
+ {2499, {wxPreviewControlBar, setZoomControl, 1}},
+ {2501, {wxPrinter, new, 1}},
+ {2502, {wxPrinter, createAbortWindow, 2}},
+ {2503, {wxPrinter, getAbort, 0}},
+ {2504, {wxPrinter, getLastError, 0}},
+ {2505, {wxPrinter, getPrintDialogData, 0}},
+ {2506, {wxPrinter, print, 3}},
+ {2507, {wxPrinter, printDialog, 1}},
+ {2508, {wxPrinter, reportError, 3}},
+ {2509, {wxPrinter, setup, 1}},
+ {2510, {wxPrinter, 'Destroy', undefined}},
+ {2511, {wxXmlResource, new_1, 1}},
+ {2512, {wxXmlResource, new_2, 2}},
+ {2513, {wxXmlResource, destruct, 0}},
+ {2514, {wxXmlResource, attachUnknownControl, 3}},
+ {2515, {wxXmlResource, clearHandlers, 0}},
+ {2516, {wxXmlResource, compareVersion, 4}},
+ {2517, {wxXmlResource, get, 0}},
+ {2518, {wxXmlResource, getFlags, 0}},
+ {2519, {wxXmlResource, getVersion, 0}},
+ {2520, {wxXmlResource, getXRCID, 2}},
+ {2521, {wxXmlResource, initAllHandlers, 0}},
+ {2522, {wxXmlResource, load, 1}},
+ {2523, {wxXmlResource, loadBitmap, 1}},
+ {2524, {wxXmlResource, loadDialog_2, 2}},
+ {2525, {wxXmlResource, loadDialog_3, 3}},
+ {2526, {wxXmlResource, loadFrame_2, 2}},
+ {2527, {wxXmlResource, loadFrame_3, 3}},
+ {2528, {wxXmlResource, loadIcon, 1}},
+ {2529, {wxXmlResource, loadMenu, 1}},
+ {2530, {wxXmlResource, loadMenuBar_2, 2}},
+ {2531, {wxXmlResource, loadMenuBar_1, 1}},
+ {2532, {wxXmlResource, loadPanel_2, 2}},
+ {2533, {wxXmlResource, loadPanel_3, 3}},
+ {2534, {wxXmlResource, loadToolBar, 2}},
+ {2535, {wxXmlResource, set, 1}},
+ {2536, {wxXmlResource, setFlags, 1}},
+ {2537, {wxXmlResource, unload, 1}},
+ {2538, {wxXmlResource, xrcctrl, 3}},
+ {2539, {wxHtmlEasyPrinting, new, 1}},
+ {2540, {wxHtmlEasyPrinting, destruct, 0}},
+ {2541, {wxHtmlEasyPrinting, getPrintData, 0}},
+ {2542, {wxHtmlEasyPrinting, getPageSetupData, 0}},
+ {2543, {wxHtmlEasyPrinting, previewFile, 1}},
+ {2544, {wxHtmlEasyPrinting, previewText, 2}},
+ {2545, {wxHtmlEasyPrinting, printFile, 1}},
+ {2546, {wxHtmlEasyPrinting, printText, 2}},
+ {2547, {wxHtmlEasyPrinting, pageSetup, 0}},
+ {2548, {wxHtmlEasyPrinting, setFonts, 3}},
+ {2549, {wxHtmlEasyPrinting, setHeader, 2}},
+ {2550, {wxHtmlEasyPrinting, setFooter, 2}},
+ {2552, {wxGLCanvas, new_2, 2}},
+ {2553, {wxGLCanvas, new_3_1, 3}},
+ {2554, {wxGLCanvas, new_3_0, 3}},
+ {2555, {wxGLCanvas, getContext, 0}},
+ {2557, {wxGLCanvas, setCurrent, 0}},
+ {2558, {wxGLCanvas, swapBuffers, 0}},
+ {2559, {wxGLCanvas, 'Destroy', undefined}},
+ {2560, {wxAuiManager, new, 1}},
+ {2561, {wxAuiManager, destruct, 0}},
+ {2562, {wxAuiManager, addPane_2_1, 2}},
+ {2563, {wxAuiManager, addPane_3, 3}},
+ {2564, {wxAuiManager, addPane_2_0, 2}},
+ {2565, {wxAuiManager, detachPane, 1}},
+ {2566, {wxAuiManager, getAllPanes, 0}},
+ {2567, {wxAuiManager, getArtProvider, 0}},
+ {2568, {wxAuiManager, getDockSizeConstraint, 2}},
+ {2569, {wxAuiManager, getFlags, 0}},
+ {2570, {wxAuiManager, getManagedWindow, 0}},
+ {2571, {wxAuiManager, getManager, 1}},
+ {2572, {wxAuiManager, getPane_1_1, 1}},
+ {2573, {wxAuiManager, getPane_1_0, 1}},
+ {2574, {wxAuiManager, hideHint, 0}},
+ {2575, {wxAuiManager, insertPane, 3}},
+ {2576, {wxAuiManager, loadPaneInfo, 2}},
+ {2577, {wxAuiManager, loadPerspective, 2}},
+ {2578, {wxAuiManager, savePaneInfo, 1}},
+ {2579, {wxAuiManager, savePerspective, 0}},
+ {2580, {wxAuiManager, setArtProvider, 1}},
+ {2581, {wxAuiManager, setDockSizeConstraint, 2}},
+ {2582, {wxAuiManager, setFlags, 1}},
+ {2583, {wxAuiManager, setManagedWindow, 1}},
+ {2584, {wxAuiManager, showHint, 1}},
+ {2585, {wxAuiManager, unInit, 0}},
+ {2586, {wxAuiManager, update, 0}},
+ {2587, {wxAuiPaneInfo, new_0, 0}},
+ {2588, {wxAuiPaneInfo, new_1, 1}},
+ {2589, {wxAuiPaneInfo, destruct, 0}},
+ {2590, {wxAuiPaneInfo, bestSize_1, 1}},
+ {2591, {wxAuiPaneInfo, bestSize_2, 2}},
+ {2592, {wxAuiPaneInfo, bottom, 0}},
+ {2593, {wxAuiPaneInfo, bottomDockable, 1}},
+ {2594, {wxAuiPaneInfo, caption, 1}},
+ {2595, {wxAuiPaneInfo, captionVisible, 1}},
+ {2596, {wxAuiPaneInfo, centre, 0}},
+ {2597, {wxAuiPaneInfo, centrePane, 0}},
+ {2598, {wxAuiPaneInfo, closeButton, 1}},
+ {2599, {wxAuiPaneInfo, defaultPane, 0}},
+ {2600, {wxAuiPaneInfo, destroyOnClose, 1}},
+ {2601, {wxAuiPaneInfo, direction, 1}},
+ {2602, {wxAuiPaneInfo, dock, 0}},
+ {2603, {wxAuiPaneInfo, dockable, 1}},
+ {2604, {wxAuiPaneInfo, fixed, 0}},
+ {2605, {wxAuiPaneInfo, float, 0}},
+ {2606, {wxAuiPaneInfo, floatable, 1}},
+ {2607, {wxAuiPaneInfo, floatingPosition_1, 1}},
+ {2608, {wxAuiPaneInfo, floatingPosition_2, 2}},
+ {2609, {wxAuiPaneInfo, floatingSize_1, 1}},
+ {2610, {wxAuiPaneInfo, floatingSize_2, 2}},
+ {2611, {wxAuiPaneInfo, gripper, 1}},
+ {2612, {wxAuiPaneInfo, gripperTop, 1}},
+ {2613, {wxAuiPaneInfo, hasBorder, 0}},
+ {2614, {wxAuiPaneInfo, hasCaption, 0}},
+ {2615, {wxAuiPaneInfo, hasCloseButton, 0}},
+ {2616, {wxAuiPaneInfo, hasFlag, 1}},
+ {2617, {wxAuiPaneInfo, hasGripper, 0}},
+ {2618, {wxAuiPaneInfo, hasGripperTop, 0}},
+ {2619, {wxAuiPaneInfo, hasMaximizeButton, 0}},
+ {2620, {wxAuiPaneInfo, hasMinimizeButton, 0}},
+ {2621, {wxAuiPaneInfo, hasPinButton, 0}},
+ {2622, {wxAuiPaneInfo, hide, 0}},
+ {2623, {wxAuiPaneInfo, isBottomDockable, 0}},
+ {2624, {wxAuiPaneInfo, isDocked, 0}},
+ {2625, {wxAuiPaneInfo, isFixed, 0}},
+ {2626, {wxAuiPaneInfo, isFloatable, 0}},
+ {2627, {wxAuiPaneInfo, isFloating, 0}},
+ {2628, {wxAuiPaneInfo, isLeftDockable, 0}},
+ {2629, {wxAuiPaneInfo, isMovable, 0}},
+ {2630, {wxAuiPaneInfo, isOk, 0}},
+ {2631, {wxAuiPaneInfo, isResizable, 0}},
+ {2632, {wxAuiPaneInfo, isRightDockable, 0}},
+ {2633, {wxAuiPaneInfo, isShown, 0}},
+ {2634, {wxAuiPaneInfo, isToolbar, 0}},
+ {2635, {wxAuiPaneInfo, isTopDockable, 0}},
+ {2636, {wxAuiPaneInfo, layer, 1}},
+ {2637, {wxAuiPaneInfo, left, 0}},
+ {2638, {wxAuiPaneInfo, leftDockable, 1}},
+ {2639, {wxAuiPaneInfo, maxSize_1, 1}},
+ {2640, {wxAuiPaneInfo, maxSize_2, 2}},
+ {2641, {wxAuiPaneInfo, maximizeButton, 1}},
+ {2642, {wxAuiPaneInfo, minSize_1, 1}},
+ {2643, {wxAuiPaneInfo, minSize_2, 2}},
+ {2644, {wxAuiPaneInfo, minimizeButton, 1}},
+ {2645, {wxAuiPaneInfo, movable, 1}},
+ {2646, {wxAuiPaneInfo, name, 1}},
+ {2647, {wxAuiPaneInfo, paneBorder, 1}},
+ {2648, {wxAuiPaneInfo, pinButton, 1}},
+ {2649, {wxAuiPaneInfo, position, 1}},
+ {2650, {wxAuiPaneInfo, resizable, 1}},
+ {2651, {wxAuiPaneInfo, right, 0}},
+ {2652, {wxAuiPaneInfo, rightDockable, 1}},
+ {2653, {wxAuiPaneInfo, row, 1}},
+ {2654, {wxAuiPaneInfo, safeSet, 1}},
+ {2655, {wxAuiPaneInfo, setFlag, 2}},
+ {2656, {wxAuiPaneInfo, show, 1}},
+ {2657, {wxAuiPaneInfo, toolbarPane, 0}},
+ {2658, {wxAuiPaneInfo, top, 0}},
+ {2659, {wxAuiPaneInfo, topDockable, 1}},
+ {2660, {wxAuiPaneInfo, window, 1}},
+ {2661, {wxAuiPaneInfo, getWindow, 0}},
+ {2662, {wxAuiPaneInfo, getFrame, 0}},
+ {2663, {wxAuiPaneInfo, getDirection, 0}},
+ {2664, {wxAuiPaneInfo, getLayer, 0}},
+ {2665, {wxAuiPaneInfo, getRow, 0}},
+ {2666, {wxAuiPaneInfo, getPosition, 0}},
+ {2667, {wxAuiPaneInfo, getFloatingPosition, 0}},
+ {2668, {wxAuiPaneInfo, getFloatingSize, 0}},
+ {2669, {wxAuiNotebook, new_0, 0}},
+ {2670, {wxAuiNotebook, new_2, 2}},
+ {2671, {wxAuiNotebook, addPage, 3}},
+ {2672, {wxAuiNotebook, create, 2}},
+ {2673, {wxAuiNotebook, deletePage, 1}},
+ {2674, {wxAuiNotebook, getArtProvider, 0}},
+ {2675, {wxAuiNotebook, getPage, 1}},
+ {2676, {wxAuiNotebook, getPageBitmap, 1}},
+ {2677, {wxAuiNotebook, getPageCount, 0}},
+ {2678, {wxAuiNotebook, getPageIndex, 1}},
+ {2679, {wxAuiNotebook, getPageText, 1}},
+ {2680, {wxAuiNotebook, getSelection, 0}},
+ {2681, {wxAuiNotebook, insertPage, 4}},
+ {2682, {wxAuiNotebook, removePage, 1}},
+ {2683, {wxAuiNotebook, setArtProvider, 1}},
+ {2684, {wxAuiNotebook, setFont, 1}},
+ {2685, {wxAuiNotebook, setPageBitmap, 2}},
+ {2686, {wxAuiNotebook, setPageText, 2}},
+ {2687, {wxAuiNotebook, setSelection, 1}},
+ {2688, {wxAuiNotebook, setTabCtrlHeight, 1}},
+ {2689, {wxAuiNotebook, setUniformBitmapSize, 1}},
+ {2690, {wxAuiNotebook, 'Destroy', undefined}},
+ {2691, {wxAuiTabArt, setFlags, 1}},
+ {2692, {wxAuiTabArt, setMeasuringFont, 1}},
+ {2693, {wxAuiTabArt, setNormalFont, 1}},
+ {2694, {wxAuiTabArt, setSelectedFont, 1}},
+ {2695, {wxAuiTabArt, setColour, 1}},
+ {2696, {wxAuiTabArt, setActiveColour, 1}},
+ {2697, {wxAuiDockArt, getColour, 1}},
+ {2698, {wxAuiDockArt, getFont, 1}},
+ {2699, {wxAuiDockArt, getMetric, 1}},
+ {2700, {wxAuiDockArt, setColour, 2}},
+ {2701, {wxAuiDockArt, setFont, 2}},
+ {2702, {wxAuiDockArt, setMetric, 2}},
+ {2703, {wxAuiSimpleTabArt, new, 0}},
+ {2704, {wxAuiSimpleTabArt, 'Destroy', undefined}},
+ {2705, {wxMDIParentFrame, new_0, 0}},
+ {2706, {wxMDIParentFrame, new_4, 4}},
+ {2707, {wxMDIParentFrame, destruct, 0}},
+ {2708, {wxMDIParentFrame, activateNext, 0}},
+ {2709, {wxMDIParentFrame, activatePrevious, 0}},
+ {2710, {wxMDIParentFrame, arrangeIcons, 0}},
+ {2711, {wxMDIParentFrame, cascade, 0}},
+ {2712, {wxMDIParentFrame, create, 4}},
+ {2713, {wxMDIParentFrame, getActiveChild, 0}},
+ {2714, {wxMDIParentFrame, getClientWindow, 0}},
+ {2715, {wxMDIParentFrame, tile, 1}},
+ {2716, {wxMDIChildFrame, new_0, 0}},
+ {2717, {wxMDIChildFrame, new_4, 4}},
+ {2718, {wxMDIChildFrame, destruct, 0}},
+ {2719, {wxMDIChildFrame, activate, 0}},
+ {2720, {wxMDIChildFrame, create, 4}},
+ {2721, {wxMDIChildFrame, maximize, 1}},
+ {2722, {wxMDIChildFrame, restore, 0}},
+ {2723, {wxMDIClientWindow, new_0, 0}},
+ {2724, {wxMDIClientWindow, new_2, 2}},
+ {2725, {wxMDIClientWindow, destruct, 0}},
+ {2726, {wxMDIClientWindow, createClient, 2}},
+ {2727, {wxLayoutAlgorithm, new, 0}},
+ {2728, {wxLayoutAlgorithm, layoutFrame, 2}},
+ {2729, {wxLayoutAlgorithm, layoutMDIFrame, 2}},
+ {2730, {wxLayoutAlgorithm, layoutWindow, 2}},
+ {2731, {wxLayoutAlgorithm, 'Destroy', undefined}},
+ {2732, {wxEvent, getId, 0}},
+ {2733, {wxEvent, getSkipped, 0}},
+ {2734, {wxEvent, getTimestamp, 0}},
+ {2735, {wxEvent, isCommandEvent, 0}},
+ {2736, {wxEvent, resumePropagation, 1}},
+ {2737, {wxEvent, shouldPropagate, 0}},
+ {2738, {wxEvent, skip, 1}},
+ {2739, {wxEvent, stopPropagation, 0}},
+ {2740, {wxCommandEvent, getClientData, 0}},
+ {2741, {wxCommandEvent, getExtraLong, 0}},
+ {2742, {wxCommandEvent, getInt, 0}},
+ {2743, {wxCommandEvent, getSelection, 0}},
+ {2744, {wxCommandEvent, getString, 0}},
+ {2745, {wxCommandEvent, isChecked, 0}},
+ {2746, {wxCommandEvent, isSelection, 0}},
+ {2747, {wxCommandEvent, setInt, 1}},
+ {2748, {wxCommandEvent, setString, 1}},
+ {2749, {wxScrollEvent, getOrientation, 0}},
+ {2750, {wxScrollEvent, getPosition, 0}},
+ {2751, {wxScrollWinEvent, getOrientation, 0}},
+ {2752, {wxScrollWinEvent, getPosition, 0}},
+ {2753, {wxMouseEvent, altDown, 0}},
+ {2754, {wxMouseEvent, button, 1}},
+ {2755, {wxMouseEvent, buttonDClick, 1}},
+ {2756, {wxMouseEvent, buttonDown, 1}},
+ {2757, {wxMouseEvent, buttonUp, 1}},
+ {2758, {wxMouseEvent, cmdDown, 0}},
+ {2759, {wxMouseEvent, controlDown, 0}},
+ {2760, {wxMouseEvent, dragging, 0}},
+ {2761, {wxMouseEvent, entering, 0}},
+ {2762, {wxMouseEvent, getButton, 0}},
+ {2765, {wxMouseEvent, getPosition, 0}},
+ {2766, {wxMouseEvent, getLogicalPosition, 1}},
+ {2767, {wxMouseEvent, getLinesPerAction, 0}},
+ {2768, {wxMouseEvent, getWheelRotation, 0}},
+ {2769, {wxMouseEvent, getWheelDelta, 0}},
+ {2770, {wxMouseEvent, getX, 0}},
+ {2771, {wxMouseEvent, getY, 0}},
+ {2772, {wxMouseEvent, isButton, 0}},
+ {2773, {wxMouseEvent, isPageScroll, 0}},
+ {2774, {wxMouseEvent, leaving, 0}},
+ {2775, {wxMouseEvent, leftDClick, 0}},
+ {2776, {wxMouseEvent, leftDown, 0}},
+ {2777, {wxMouseEvent, leftIsDown, 0}},
+ {2778, {wxMouseEvent, leftUp, 0}},
+ {2779, {wxMouseEvent, metaDown, 0}},
+ {2780, {wxMouseEvent, middleDClick, 0}},
+ {2781, {wxMouseEvent, middleDown, 0}},
+ {2782, {wxMouseEvent, middleIsDown, 0}},
+ {2783, {wxMouseEvent, middleUp, 0}},
+ {2784, {wxMouseEvent, moving, 0}},
+ {2785, {wxMouseEvent, rightDClick, 0}},
+ {2786, {wxMouseEvent, rightDown, 0}},
+ {2787, {wxMouseEvent, rightIsDown, 0}},
+ {2788, {wxMouseEvent, rightUp, 0}},
+ {2789, {wxMouseEvent, shiftDown, 0}},
+ {2790, {wxSetCursorEvent, getCursor, 0}},
+ {2791, {wxSetCursorEvent, getX, 0}},
+ {2792, {wxSetCursorEvent, getY, 0}},
+ {2793, {wxSetCursorEvent, hasCursor, 0}},
+ {2794, {wxSetCursorEvent, setCursor, 1}},
+ {2795, {wxKeyEvent, altDown, 0}},
+ {2796, {wxKeyEvent, cmdDown, 0}},
+ {2797, {wxKeyEvent, controlDown, 0}},
+ {2798, {wxKeyEvent, getKeyCode, 0}},
+ {2799, {wxKeyEvent, getModifiers, 0}},
+ {2802, {wxKeyEvent, getPosition, 0}},
+ {2803, {wxKeyEvent, getRawKeyCode, 0}},
+ {2804, {wxKeyEvent, getRawKeyFlags, 0}},
+ {2805, {wxKeyEvent, getUnicodeKey, 0}},
+ {2806, {wxKeyEvent, getX, 0}},
+ {2807, {wxKeyEvent, getY, 0}},
+ {2808, {wxKeyEvent, hasModifiers, 0}},
+ {2809, {wxKeyEvent, metaDown, 0}},
+ {2810, {wxKeyEvent, shiftDown, 0}},
+ {2811, {wxSizeEvent, getSize, 0}},
+ {2812, {wxMoveEvent, getPosition, 0}},
+ {2813, {wxEraseEvent, getDC, 0}},
+ {2814, {wxFocusEvent, getWindow, 0}},
+ {2815, {wxChildFocusEvent, getWindow, 0}},
+ {2816, {wxMenuEvent, getMenu, 0}},
+ {2817, {wxMenuEvent, getMenuId, 0}},
+ {2818, {wxMenuEvent, isPopup, 0}},
+ {2819, {wxCloseEvent, canVeto, 0}},
+ {2820, {wxCloseEvent, getLoggingOff, 0}},
+ {2821, {wxCloseEvent, setCanVeto, 1}},
+ {2822, {wxCloseEvent, setLoggingOff, 1}},
+ {2823, {wxCloseEvent, veto, 1}},
+ {2824, {wxShowEvent, setShow, 1}},
+ {2825, {wxShowEvent, getShow, 0}},
+ {2826, {wxIconizeEvent, iconized, 0}},
+ {2827, {wxJoystickEvent, buttonDown, 1}},
+ {2828, {wxJoystickEvent, buttonIsDown, 1}},
+ {2829, {wxJoystickEvent, buttonUp, 1}},
+ {2830, {wxJoystickEvent, getButtonChange, 0}},
+ {2831, {wxJoystickEvent, getButtonState, 0}},
+ {2832, {wxJoystickEvent, getJoystick, 0}},
+ {2833, {wxJoystickEvent, getPosition, 0}},
+ {2834, {wxJoystickEvent, getZPosition, 0}},
+ {2835, {wxJoystickEvent, isButton, 0}},
+ {2836, {wxJoystickEvent, isMove, 0}},
+ {2837, {wxJoystickEvent, isZMove, 0}},
+ {2838, {wxUpdateUIEvent, canUpdate, 1}},
+ {2839, {wxUpdateUIEvent, check, 1}},
+ {2840, {wxUpdateUIEvent, enable, 1}},
+ {2841, {wxUpdateUIEvent, show, 1}},
+ {2842, {wxUpdateUIEvent, getChecked, 0}},
+ {2843, {wxUpdateUIEvent, getEnabled, 0}},
+ {2844, {wxUpdateUIEvent, getShown, 0}},
+ {2845, {wxUpdateUIEvent, getSetChecked, 0}},
+ {2846, {wxUpdateUIEvent, getSetEnabled, 0}},
+ {2847, {wxUpdateUIEvent, getSetShown, 0}},
+ {2848, {wxUpdateUIEvent, getSetText, 0}},
+ {2849, {wxUpdateUIEvent, getText, 0}},
+ {2850, {wxUpdateUIEvent, getMode, 0}},
+ {2851, {wxUpdateUIEvent, getUpdateInterval, 0}},
+ {2852, {wxUpdateUIEvent, resetUpdateTime, 0}},
+ {2853, {wxUpdateUIEvent, setMode, 1}},
+ {2854, {wxUpdateUIEvent, setText, 1}},
+ {2855, {wxUpdateUIEvent, setUpdateInterval, 1}},
+ {2856, {wxMouseCaptureChangedEvent, getCapturedWindow, 0}},
+ {2857, {wxPaletteChangedEvent, setChangedWindow, 1}},
+ {2858, {wxPaletteChangedEvent, getChangedWindow, 0}},
+ {2859, {wxQueryNewPaletteEvent, setPaletteRealized, 1}},
+ {2860, {wxQueryNewPaletteEvent, getPaletteRealized, 0}},
+ {2861, {wxNavigationKeyEvent, getDirection, 0}},
+ {2862, {wxNavigationKeyEvent, setDirection, 1}},
+ {2863, {wxNavigationKeyEvent, isWindowChange, 0}},
+ {2864, {wxNavigationKeyEvent, setWindowChange, 1}},
+ {2865, {wxNavigationKeyEvent, isFromTab, 0}},
+ {2866, {wxNavigationKeyEvent, setFromTab, 1}},
+ {2867, {wxNavigationKeyEvent, getCurrentFocus, 0}},
+ {2868, {wxNavigationKeyEvent, setCurrentFocus, 1}},
+ {2869, {wxHelpEvent, getOrigin, 0}},
+ {2870, {wxHelpEvent, getPosition, 0}},
+ {2871, {wxHelpEvent, setOrigin, 1}},
+ {2872, {wxHelpEvent, setPosition, 1}},
+ {2873, {wxContextMenuEvent, getPosition, 0}},
+ {2874, {wxContextMenuEvent, setPosition, 1}},
+ {2875, {wxIdleEvent, canSend, 1}},
+ {2876, {wxIdleEvent, getMode, 0}},
+ {2877, {wxIdleEvent, requestMore, 1}},
+ {2878, {wxIdleEvent, moreRequested, 0}},
+ {2879, {wxIdleEvent, setMode, 1}},
+ {2880, {wxGridEvent, altDown, 0}},
+ {2881, {wxGridEvent, controlDown, 0}},
+ {2882, {wxGridEvent, getCol, 0}},
+ {2883, {wxGridEvent, getPosition, 0}},
+ {2884, {wxGridEvent, getRow, 0}},
+ {2885, {wxGridEvent, metaDown, 0}},
+ {2886, {wxGridEvent, selecting, 0}},
+ {2887, {wxGridEvent, shiftDown, 0}},
+ {2888, {wxNotifyEvent, allow, 0}},
+ {2889, {wxNotifyEvent, isAllowed, 0}},
+ {2890, {wxNotifyEvent, veto, 0}},
+ {2891, {wxSashEvent, getEdge, 0}},
+ {2892, {wxSashEvent, getDragRect, 0}},
+ {2893, {wxSashEvent, getDragStatus, 0}},
+ {2894, {wxListEvent, getCacheFrom, 0}},
+ {2895, {wxListEvent, getCacheTo, 0}},
+ {2896, {wxListEvent, getKeyCode, 0}},
+ {2897, {wxListEvent, getIndex, 0}},
+ {2898, {wxListEvent, getColumn, 0}},
+ {2899, {wxListEvent, getPoint, 0}},
+ {2900, {wxListEvent, getLabel, 0}},
+ {2901, {wxListEvent, getText, 0}},
+ {2902, {wxListEvent, getImage, 0}},
+ {2903, {wxListEvent, getData, 0}},
+ {2904, {wxListEvent, getMask, 0}},
+ {2905, {wxListEvent, getItem, 0}},
+ {2906, {wxListEvent, isEditCancelled, 0}},
+ {2907, {wxDateEvent, getDate, 0}},
+ {2908, {wxCalendarEvent, getWeekDay, 0}},
+ {2909, {wxFileDirPickerEvent, getPath, 0}},
+ {2910, {wxColourPickerEvent, getColour, 0}},
+ {2911, {wxFontPickerEvent, getFont, 0}},
+ {2912, {wxStyledTextEvent, getPosition, 0}},
+ {2913, {wxStyledTextEvent, getKey, 0}},
+ {2914, {wxStyledTextEvent, getModifiers, 0}},
+ {2915, {wxStyledTextEvent, getModificationType, 0}},
+ {2916, {wxStyledTextEvent, getText, 0}},
+ {2917, {wxStyledTextEvent, getLength, 0}},
+ {2918, {wxStyledTextEvent, getLinesAdded, 0}},
+ {2919, {wxStyledTextEvent, getLine, 0}},
+ {2920, {wxStyledTextEvent, getFoldLevelNow, 0}},
+ {2921, {wxStyledTextEvent, getFoldLevelPrev, 0}},
+ {2922, {wxStyledTextEvent, getMargin, 0}},
+ {2923, {wxStyledTextEvent, getMessage, 0}},
+ {2924, {wxStyledTextEvent, getWParam, 0}},
+ {2925, {wxStyledTextEvent, getLParam, 0}},
+ {2926, {wxStyledTextEvent, getListType, 0}},
+ {2927, {wxStyledTextEvent, getX, 0}},
+ {2928, {wxStyledTextEvent, getY, 0}},
+ {2929, {wxStyledTextEvent, getDragText, 0}},
+ {2930, {wxStyledTextEvent, getDragAllowMove, 0}},
+ {2931, {wxStyledTextEvent, getDragResult, 0}},
+ {2932, {wxStyledTextEvent, getShift, 0}},
+ {2933, {wxStyledTextEvent, getControl, 0}},
+ {2934, {wxStyledTextEvent, getAlt, 0}},
+ {2935, {utils, getKeyState, 1}},
+ {2936, {utils, getMousePosition, 2}},
+ {2937, {utils, getMouseState, 0}},
+ {2938, {utils, setDetectableAutoRepeat, 1}},
+ {2939, {utils, bell, 0}},
+ {2940, {utils, findMenuItemId, 3}},
+ {2941, {utils, genericFindWindowAtPoint, 1}},
+ {2942, {utils, findWindowAtPoint, 1}},
+ {2943, {utils, beginBusyCursor, 1}},
+ {2944, {utils, endBusyCursor, 0}},
+ {2945, {utils, isBusy, 0}},
+ {2946, {utils, shutdown, 1}},
+ {2947, {utils, shell, 1}},
+ {2948, {utils, launchDefaultBrowser, 2}},
+ {2949, {utils, getEmailAddress, 0}},
+ {2950, {utils, getUserId, 0}},
+ {2951, {utils, getHomeDir, 0}},
+ {2952, {utils, newId, 0}},
+ {2953, {utils, registerId, 1}},
+ {2954, {utils, getCurrentId, 0}},
+ {2955, {utils, getOsDescription, 0}},
+ {2956, {utils, isPlatformLittleEndian, 0}},
+ {2957, {utils, isPlatform64Bit, 0}},
+ {2958, {gdicmn, displaySize, 2}},
+ {2959, {gdicmn, setCursor, 1}},
+ {2960, {wxPrintout, new, 1}},
+ {2961, {wxPrintout, destruct, 0}},
+ {2962, {wxPrintout, getDC, 0}},
+ {2963, {wxPrintout, getPageSizeMM, 2}},
+ {2964, {wxPrintout, getPageSizePixels, 2}},
+ {2965, {wxPrintout, getPaperRectPixels, 0}},
+ {2966, {wxPrintout, getPPIPrinter, 2}},
+ {2967, {wxPrintout, getPPIScreen, 2}},
+ {2968, {wxPrintout, getTitle, 0}},
+ {2969, {wxPrintout, isPreview, 0}},
+ {2970, {wxPrintout, fitThisSizeToPaper, 1}},
+ {2971, {wxPrintout, fitThisSizeToPage, 1}},
+ {2972, {wxPrintout, fitThisSizeToPageMargins, 2}},
+ {2973, {wxPrintout, mapScreenSizeToPaper, 0}},
+ {2974, {wxPrintout, mapScreenSizeToPage, 0}},
+ {2975, {wxPrintout, mapScreenSizeToPageMargins, 1}},
+ {2976, {wxPrintout, mapScreenSizeToDevice, 0}},
+ {2977, {wxPrintout, getLogicalPaperRect, 0}},
+ {2978, {wxPrintout, getLogicalPageRect, 0}},
+ {2979, {wxPrintout, getLogicalPageMarginsRect, 1}},
+ {2980, {wxPrintout, setLogicalOrigin, 2}},
+ {2981, {wxPrintout, offsetLogicalOrigin, 2}},
+ {2982, {wxStyledTextCtrl, new_2, 2}},
+ {2983, {wxStyledTextCtrl, new_0, 0}},
+ {2984, {wxStyledTextCtrl, destruct, 0}},
+ {2985, {wxStyledTextCtrl, create, 2}},
+ {2986, {wxStyledTextCtrl, addText, 1}},
+ {2987, {wxStyledTextCtrl, addStyledText, 1}},
+ {2988, {wxStyledTextCtrl, insertText, 2}},
+ {2989, {wxStyledTextCtrl, clearAll, 0}},
+ {2990, {wxStyledTextCtrl, clearDocumentStyle, 0}},
+ {2991, {wxStyledTextCtrl, getLength, 0}},
+ {2992, {wxStyledTextCtrl, getCharAt, 1}},
+ {2993, {wxStyledTextCtrl, getCurrentPos, 0}},
+ {2994, {wxStyledTextCtrl, getAnchor, 0}},
+ {2995, {wxStyledTextCtrl, getStyleAt, 1}},
+ {2996, {wxStyledTextCtrl, redo, 0}},
+ {2997, {wxStyledTextCtrl, setUndoCollection, 1}},
+ {2998, {wxStyledTextCtrl, selectAll, 0}},
+ {2999, {wxStyledTextCtrl, setSavePoint, 0}},
+ {3000, {wxStyledTextCtrl, getStyledText, 2}},
+ {3001, {wxStyledTextCtrl, canRedo, 0}},
+ {3002, {wxStyledTextCtrl, markerLineFromHandle, 1}},
+ {3003, {wxStyledTextCtrl, markerDeleteHandle, 1}},
+ {3004, {wxStyledTextCtrl, getUndoCollection, 0}},
+ {3005, {wxStyledTextCtrl, getViewWhiteSpace, 0}},
+ {3006, {wxStyledTextCtrl, setViewWhiteSpace, 1}},
+ {3007, {wxStyledTextCtrl, positionFromPoint, 1}},
+ {3008, {wxStyledTextCtrl, positionFromPointClose, 2}},
+ {3009, {wxStyledTextCtrl, gotoLine, 1}},
+ {3010, {wxStyledTextCtrl, gotoPos, 1}},
+ {3011, {wxStyledTextCtrl, setAnchor, 1}},
+ {3012, {wxStyledTextCtrl, getCurLine, 1}},
+ {3013, {wxStyledTextCtrl, getEndStyled, 0}},
+ {3014, {wxStyledTextCtrl, convertEOLs, 1}},
+ {3015, {wxStyledTextCtrl, getEOLMode, 0}},
+ {3016, {wxStyledTextCtrl, setEOLMode, 1}},
+ {3017, {wxStyledTextCtrl, startStyling, 2}},
+ {3018, {wxStyledTextCtrl, setStyling, 2}},
+ {3019, {wxStyledTextCtrl, getBufferedDraw, 0}},
+ {3020, {wxStyledTextCtrl, setBufferedDraw, 1}},
+ {3021, {wxStyledTextCtrl, setTabWidth, 1}},
+ {3022, {wxStyledTextCtrl, getTabWidth, 0}},
+ {3023, {wxStyledTextCtrl, setCodePage, 1}},
+ {3024, {wxStyledTextCtrl, markerDefine, 3}},
+ {3025, {wxStyledTextCtrl, markerSetForeground, 2}},
+ {3026, {wxStyledTextCtrl, markerSetBackground, 2}},
+ {3027, {wxStyledTextCtrl, markerAdd, 2}},
+ {3028, {wxStyledTextCtrl, markerDelete, 2}},
+ {3029, {wxStyledTextCtrl, markerDeleteAll, 1}},
+ {3030, {wxStyledTextCtrl, markerGet, 1}},
+ {3031, {wxStyledTextCtrl, markerNext, 2}},
+ {3032, {wxStyledTextCtrl, markerPrevious, 2}},
+ {3033, {wxStyledTextCtrl, markerDefineBitmap, 2}},
+ {3034, {wxStyledTextCtrl, markerAddSet, 2}},
+ {3035, {wxStyledTextCtrl, markerSetAlpha, 2}},
+ {3036, {wxStyledTextCtrl, setMarginType, 2}},
+ {3037, {wxStyledTextCtrl, getMarginType, 1}},
+ {3038, {wxStyledTextCtrl, setMarginWidth, 2}},
+ {3039, {wxStyledTextCtrl, getMarginWidth, 1}},
+ {3040, {wxStyledTextCtrl, setMarginMask, 2}},
+ {3041, {wxStyledTextCtrl, getMarginMask, 1}},
+ {3042, {wxStyledTextCtrl, setMarginSensitive, 2}},
+ {3043, {wxStyledTextCtrl, getMarginSensitive, 1}},
+ {3044, {wxStyledTextCtrl, styleClearAll, 0}},
+ {3045, {wxStyledTextCtrl, styleSetForeground, 2}},
+ {3046, {wxStyledTextCtrl, styleSetBackground, 2}},
+ {3047, {wxStyledTextCtrl, styleSetBold, 2}},
+ {3048, {wxStyledTextCtrl, styleSetItalic, 2}},
+ {3049, {wxStyledTextCtrl, styleSetSize, 2}},
+ {3050, {wxStyledTextCtrl, styleSetFaceName, 2}},
+ {3051, {wxStyledTextCtrl, styleSetEOLFilled, 2}},
+ {3052, {wxStyledTextCtrl, styleResetDefault, 0}},
+ {3053, {wxStyledTextCtrl, styleSetUnderline, 2}},
+ {3054, {wxStyledTextCtrl, styleSetCase, 2}},
+ {3055, {wxStyledTextCtrl, styleSetHotSpot, 2}},
+ {3056, {wxStyledTextCtrl, setSelForeground, 2}},
+ {3057, {wxStyledTextCtrl, setSelBackground, 2}},
+ {3058, {wxStyledTextCtrl, getSelAlpha, 0}},
+ {3059, {wxStyledTextCtrl, setSelAlpha, 1}},
+ {3060, {wxStyledTextCtrl, setCaretForeground, 1}},
+ {3061, {wxStyledTextCtrl, cmdKeyAssign, 3}},
+ {3062, {wxStyledTextCtrl, cmdKeyClear, 2}},
+ {3063, {wxStyledTextCtrl, cmdKeyClearAll, 0}},
+ {3064, {wxStyledTextCtrl, setStyleBytes, 2}},
+ {3065, {wxStyledTextCtrl, styleSetVisible, 2}},
+ {3066, {wxStyledTextCtrl, getCaretPeriod, 0}},
+ {3067, {wxStyledTextCtrl, setCaretPeriod, 1}},
+ {3068, {wxStyledTextCtrl, setWordChars, 1}},
+ {3069, {wxStyledTextCtrl, beginUndoAction, 0}},
+ {3070, {wxStyledTextCtrl, endUndoAction, 0}},
+ {3071, {wxStyledTextCtrl, indicatorSetStyle, 2}},
+ {3072, {wxStyledTextCtrl, indicatorGetStyle, 1}},
+ {3073, {wxStyledTextCtrl, indicatorSetForeground, 2}},
+ {3074, {wxStyledTextCtrl, indicatorGetForeground, 1}},
+ {3075, {wxStyledTextCtrl, setWhitespaceForeground, 2}},
+ {3076, {wxStyledTextCtrl, setWhitespaceBackground, 2}},
+ {3077, {wxStyledTextCtrl, getStyleBits, 0}},
+ {3078, {wxStyledTextCtrl, setLineState, 2}},
+ {3079, {wxStyledTextCtrl, getLineState, 1}},
+ {3080, {wxStyledTextCtrl, getMaxLineState, 0}},
+ {3081, {wxStyledTextCtrl, getCaretLineVisible, 0}},
+ {3082, {wxStyledTextCtrl, setCaretLineVisible, 1}},
+ {3083, {wxStyledTextCtrl, getCaretLineBackground, 0}},
+ {3084, {wxStyledTextCtrl, setCaretLineBackground, 1}},
+ {3085, {wxStyledTextCtrl, autoCompShow, 2}},
+ {3086, {wxStyledTextCtrl, autoCompCancel, 0}},
+ {3087, {wxStyledTextCtrl, autoCompActive, 0}},
+ {3088, {wxStyledTextCtrl, autoCompPosStart, 0}},
+ {3089, {wxStyledTextCtrl, autoCompComplete, 0}},
+ {3090, {wxStyledTextCtrl, autoCompStops, 1}},
+ {3091, {wxStyledTextCtrl, autoCompSetSeparator, 1}},
+ {3092, {wxStyledTextCtrl, autoCompGetSeparator, 0}},
+ {3093, {wxStyledTextCtrl, autoCompSelect, 1}},
+ {3094, {wxStyledTextCtrl, autoCompSetCancelAtStart, 1}},
+ {3095, {wxStyledTextCtrl, autoCompGetCancelAtStart, 0}},
+ {3096, {wxStyledTextCtrl, autoCompSetFillUps, 1}},
+ {3097, {wxStyledTextCtrl, autoCompSetChooseSingle, 1}},
+ {3098, {wxStyledTextCtrl, autoCompGetChooseSingle, 0}},
+ {3099, {wxStyledTextCtrl, autoCompSetIgnoreCase, 1}},
+ {3100, {wxStyledTextCtrl, autoCompGetIgnoreCase, 0}},
+ {3101, {wxStyledTextCtrl, userListShow, 2}},
+ {3102, {wxStyledTextCtrl, autoCompSetAutoHide, 1}},
+ {3103, {wxStyledTextCtrl, autoCompGetAutoHide, 0}},
+ {3104, {wxStyledTextCtrl, autoCompSetDropRestOfWord, 1}},
+ {3105, {wxStyledTextCtrl, autoCompGetDropRestOfWord, 0}},
+ {3106, {wxStyledTextCtrl, registerImage, 2}},
+ {3107, {wxStyledTextCtrl, clearRegisteredImages, 0}},
+ {3108, {wxStyledTextCtrl, autoCompGetTypeSeparator, 0}},
+ {3109, {wxStyledTextCtrl, autoCompSetTypeSeparator, 1}},
+ {3110, {wxStyledTextCtrl, autoCompSetMaxWidth, 1}},
+ {3111, {wxStyledTextCtrl, autoCompGetMaxWidth, 0}},
+ {3112, {wxStyledTextCtrl, autoCompSetMaxHeight, 1}},
+ {3113, {wxStyledTextCtrl, autoCompGetMaxHeight, 0}},
+ {3114, {wxStyledTextCtrl, setIndent, 1}},
+ {3115, {wxStyledTextCtrl, getIndent, 0}},
+ {3116, {wxStyledTextCtrl, setUseTabs, 1}},
+ {3117, {wxStyledTextCtrl, getUseTabs, 0}},
+ {3118, {wxStyledTextCtrl, setLineIndentation, 2}},
+ {3119, {wxStyledTextCtrl, getLineIndentation, 1}},
+ {3120, {wxStyledTextCtrl, getLineIndentPosition, 1}},
+ {3121, {wxStyledTextCtrl, getColumn, 1}},
+ {3122, {wxStyledTextCtrl, setUseHorizontalScrollBar, 1}},
+ {3123, {wxStyledTextCtrl, getUseHorizontalScrollBar, 0}},
+ {3124, {wxStyledTextCtrl, setIndentationGuides, 1}},
+ {3125, {wxStyledTextCtrl, getIndentationGuides, 0}},
+ {3126, {wxStyledTextCtrl, setHighlightGuide, 1}},
+ {3127, {wxStyledTextCtrl, getHighlightGuide, 0}},
+ {3128, {wxStyledTextCtrl, getLineEndPosition, 1}},
+ {3129, {wxStyledTextCtrl, getCodePage, 0}},
+ {3130, {wxStyledTextCtrl, getCaretForeground, 0}},
+ {3131, {wxStyledTextCtrl, getReadOnly, 0}},
+ {3132, {wxStyledTextCtrl, setCurrentPos, 1}},
+ {3133, {wxStyledTextCtrl, setSelectionStart, 1}},
+ {3134, {wxStyledTextCtrl, getSelectionStart, 0}},
+ {3135, {wxStyledTextCtrl, setSelectionEnd, 1}},
+ {3136, {wxStyledTextCtrl, getSelectionEnd, 0}},
+ {3137, {wxStyledTextCtrl, setPrintMagnification, 1}},
+ {3138, {wxStyledTextCtrl, getPrintMagnification, 0}},
+ {3139, {wxStyledTextCtrl, setPrintColourMode, 1}},
+ {3140, {wxStyledTextCtrl, getPrintColourMode, 0}},
+ {3141, {wxStyledTextCtrl, findText, 4}},
+ {3142, {wxStyledTextCtrl, formatRange, 7}},
+ {3143, {wxStyledTextCtrl, getFirstVisibleLine, 0}},
+ {3144, {wxStyledTextCtrl, getLine, 1}},
+ {3145, {wxStyledTextCtrl, getLineCount, 0}},
+ {3146, {wxStyledTextCtrl, setMarginLeft, 1}},
+ {3147, {wxStyledTextCtrl, getMarginLeft, 0}},
+ {3148, {wxStyledTextCtrl, setMarginRight, 1}},
+ {3149, {wxStyledTextCtrl, getMarginRight, 0}},
+ {3150, {wxStyledTextCtrl, getModify, 0}},
+ {3151, {wxStyledTextCtrl, setSelection, 2}},
+ {3152, {wxStyledTextCtrl, getSelectedText, 0}},
+ {3153, {wxStyledTextCtrl, getTextRange, 2}},
+ {3154, {wxStyledTextCtrl, hideSelection, 1}},
+ {3155, {wxStyledTextCtrl, lineFromPosition, 1}},
+ {3156, {wxStyledTextCtrl, positionFromLine, 1}},
+ {3157, {wxStyledTextCtrl, lineScroll, 2}},
+ {3158, {wxStyledTextCtrl, ensureCaretVisible, 0}},
+ {3159, {wxStyledTextCtrl, replaceSelection, 1}},
+ {3160, {wxStyledTextCtrl, setReadOnly, 1}},
+ {3161, {wxStyledTextCtrl, canPaste, 0}},
+ {3162, {wxStyledTextCtrl, canUndo, 0}},
+ {3163, {wxStyledTextCtrl, emptyUndoBuffer, 0}},
+ {3164, {wxStyledTextCtrl, undo, 0}},
+ {3165, {wxStyledTextCtrl, cut, 0}},
+ {3166, {wxStyledTextCtrl, copy, 0}},
+ {3167, {wxStyledTextCtrl, paste, 0}},
+ {3168, {wxStyledTextCtrl, clear, 0}},
+ {3169, {wxStyledTextCtrl, setText, 1}},
+ {3170, {wxStyledTextCtrl, getText, 0}},
+ {3171, {wxStyledTextCtrl, getTextLength, 0}},
+ {3172, {wxStyledTextCtrl, getOvertype, 0}},
+ {3173, {wxStyledTextCtrl, setCaretWidth, 1}},
+ {3174, {wxStyledTextCtrl, getCaretWidth, 0}},
+ {3175, {wxStyledTextCtrl, setTargetStart, 1}},
+ {3176, {wxStyledTextCtrl, getTargetStart, 0}},
+ {3177, {wxStyledTextCtrl, setTargetEnd, 1}},
+ {3178, {wxStyledTextCtrl, getTargetEnd, 0}},
+ {3179, {wxStyledTextCtrl, replaceTarget, 1}},
+ {3180, {wxStyledTextCtrl, searchInTarget, 1}},
+ {3181, {wxStyledTextCtrl, setSearchFlags, 1}},
+ {3182, {wxStyledTextCtrl, getSearchFlags, 0}},
+ {3183, {wxStyledTextCtrl, callTipShow, 2}},
+ {3184, {wxStyledTextCtrl, callTipCancel, 0}},
+ {3185, {wxStyledTextCtrl, callTipActive, 0}},
+ {3186, {wxStyledTextCtrl, callTipPosAtStart, 0}},
+ {3187, {wxStyledTextCtrl, callTipSetHighlight, 2}},
+ {3188, {wxStyledTextCtrl, callTipSetBackground, 1}},
+ {3189, {wxStyledTextCtrl, callTipSetForeground, 1}},
+ {3190, {wxStyledTextCtrl, callTipSetForegroundHighlight, 1}},
+ {3191, {wxStyledTextCtrl, callTipUseStyle, 1}},
+ {3192, {wxStyledTextCtrl, visibleFromDocLine, 1}},
+ {3193, {wxStyledTextCtrl, docLineFromVisible, 1}},
+ {3194, {wxStyledTextCtrl, wrapCount, 1}},
+ {3195, {wxStyledTextCtrl, setFoldLevel, 2}},
+ {3196, {wxStyledTextCtrl, getFoldLevel, 1}},
+ {3197, {wxStyledTextCtrl, getLastChild, 2}},
+ {3198, {wxStyledTextCtrl, getFoldParent, 1}},
+ {3199, {wxStyledTextCtrl, showLines, 2}},
+ {3200, {wxStyledTextCtrl, hideLines, 2}},
+ {3201, {wxStyledTextCtrl, getLineVisible, 1}},
+ {3202, {wxStyledTextCtrl, setFoldExpanded, 2}},
+ {3203, {wxStyledTextCtrl, getFoldExpanded, 1}},
+ {3204, {wxStyledTextCtrl, toggleFold, 1}},
+ {3205, {wxStyledTextCtrl, ensureVisible, 1}},
+ {3206, {wxStyledTextCtrl, setFoldFlags, 1}},
+ {3207, {wxStyledTextCtrl, ensureVisibleEnforcePolicy, 1}},
+ {3208, {wxStyledTextCtrl, setTabIndents, 1}},
+ {3209, {wxStyledTextCtrl, getTabIndents, 0}},
+ {3210, {wxStyledTextCtrl, setBackSpaceUnIndents, 1}},
+ {3211, {wxStyledTextCtrl, getBackSpaceUnIndents, 0}},
+ {3212, {wxStyledTextCtrl, setMouseDwellTime, 1}},
+ {3213, {wxStyledTextCtrl, getMouseDwellTime, 0}},
+ {3214, {wxStyledTextCtrl, wordStartPosition, 2}},
+ {3215, {wxStyledTextCtrl, wordEndPosition, 2}},
+ {3216, {wxStyledTextCtrl, setWrapMode, 1}},
+ {3217, {wxStyledTextCtrl, getWrapMode, 0}},
+ {3218, {wxStyledTextCtrl, setWrapVisualFlags, 1}},
+ {3219, {wxStyledTextCtrl, getWrapVisualFlags, 0}},
+ {3220, {wxStyledTextCtrl, setWrapVisualFlagsLocation, 1}},
+ {3221, {wxStyledTextCtrl, getWrapVisualFlagsLocation, 0}},
+ {3222, {wxStyledTextCtrl, setWrapStartIndent, 1}},
+ {3223, {wxStyledTextCtrl, getWrapStartIndent, 0}},
+ {3224, {wxStyledTextCtrl, setLayoutCache, 1}},
+ {3225, {wxStyledTextCtrl, getLayoutCache, 0}},
+ {3226, {wxStyledTextCtrl, setScrollWidth, 1}},
+ {3227, {wxStyledTextCtrl, getScrollWidth, 0}},
+ {3228, {wxStyledTextCtrl, textWidth, 2}},
+ {3229, {wxStyledTextCtrl, getEndAtLastLine, 0}},
+ {3230, {wxStyledTextCtrl, textHeight, 1}},
+ {3231, {wxStyledTextCtrl, setUseVerticalScrollBar, 1}},
+ {3232, {wxStyledTextCtrl, getUseVerticalScrollBar, 0}},
+ {3233, {wxStyledTextCtrl, appendText, 1}},
+ {3234, {wxStyledTextCtrl, getTwoPhaseDraw, 0}},
+ {3235, {wxStyledTextCtrl, setTwoPhaseDraw, 1}},
+ {3236, {wxStyledTextCtrl, targetFromSelection, 0}},
+ {3237, {wxStyledTextCtrl, linesJoin, 0}},
+ {3238, {wxStyledTextCtrl, linesSplit, 1}},
+ {3239, {wxStyledTextCtrl, setFoldMarginColour, 2}},
+ {3240, {wxStyledTextCtrl, setFoldMarginHiColour, 2}},
+ {3241, {wxStyledTextCtrl, lineDown, 0}},
+ {3242, {wxStyledTextCtrl, lineDownExtend, 0}},
+ {3243, {wxStyledTextCtrl, lineUp, 0}},
+ {3244, {wxStyledTextCtrl, lineUpExtend, 0}},
+ {3245, {wxStyledTextCtrl, charLeft, 0}},
+ {3246, {wxStyledTextCtrl, charLeftExtend, 0}},
+ {3247, {wxStyledTextCtrl, charRight, 0}},
+ {3248, {wxStyledTextCtrl, charRightExtend, 0}},
+ {3249, {wxStyledTextCtrl, wordLeft, 0}},
+ {3250, {wxStyledTextCtrl, wordLeftExtend, 0}},
+ {3251, {wxStyledTextCtrl, wordRight, 0}},
+ {3252, {wxStyledTextCtrl, wordRightExtend, 0}},
+ {3253, {wxStyledTextCtrl, home, 0}},
+ {3254, {wxStyledTextCtrl, homeExtend, 0}},
+ {3255, {wxStyledTextCtrl, lineEnd, 0}},
+ {3256, {wxStyledTextCtrl, lineEndExtend, 0}},
+ {3257, {wxStyledTextCtrl, documentStart, 0}},
+ {3258, {wxStyledTextCtrl, documentStartExtend, 0}},
+ {3259, {wxStyledTextCtrl, documentEnd, 0}},
+ {3260, {wxStyledTextCtrl, documentEndExtend, 0}},
+ {3261, {wxStyledTextCtrl, pageUp, 0}},
+ {3262, {wxStyledTextCtrl, pageUpExtend, 0}},
+ {3263, {wxStyledTextCtrl, pageDown, 0}},
+ {3264, {wxStyledTextCtrl, pageDownExtend, 0}},
+ {3265, {wxStyledTextCtrl, editToggleOvertype, 0}},
+ {3266, {wxStyledTextCtrl, cancel, 0}},
+ {3267, {wxStyledTextCtrl, deleteBack, 0}},
+ {3268, {wxStyledTextCtrl, tab, 0}},
+ {3269, {wxStyledTextCtrl, backTab, 0}},
+ {3270, {wxStyledTextCtrl, newLine, 0}},
+ {3271, {wxStyledTextCtrl, formFeed, 0}},
+ {3272, {wxStyledTextCtrl, vCHome, 0}},
+ {3273, {wxStyledTextCtrl, vCHomeExtend, 0}},
+ {3274, {wxStyledTextCtrl, zoomIn, 0}},
+ {3275, {wxStyledTextCtrl, zoomOut, 0}},
+ {3276, {wxStyledTextCtrl, delWordLeft, 0}},
+ {3277, {wxStyledTextCtrl, delWordRight, 0}},
+ {3278, {wxStyledTextCtrl, lineCut, 0}},
+ {3279, {wxStyledTextCtrl, lineDelete, 0}},
+ {3280, {wxStyledTextCtrl, lineTranspose, 0}},
+ {3281, {wxStyledTextCtrl, lineDuplicate, 0}},
+ {3282, {wxStyledTextCtrl, lowerCase, 0}},
+ {3283, {wxStyledTextCtrl, upperCase, 0}},
+ {3284, {wxStyledTextCtrl, lineScrollDown, 0}},
+ {3285, {wxStyledTextCtrl, lineScrollUp, 0}},
+ {3286, {wxStyledTextCtrl, deleteBackNotLine, 0}},
+ {3287, {wxStyledTextCtrl, homeDisplay, 0}},
+ {3288, {wxStyledTextCtrl, homeDisplayExtend, 0}},
+ {3289, {wxStyledTextCtrl, lineEndDisplay, 0}},
+ {3290, {wxStyledTextCtrl, lineEndDisplayExtend, 0}},
+ {3291, {wxStyledTextCtrl, homeWrapExtend, 0}},
+ {3292, {wxStyledTextCtrl, lineEndWrap, 0}},
+ {3293, {wxStyledTextCtrl, lineEndWrapExtend, 0}},
+ {3294, {wxStyledTextCtrl, vCHomeWrap, 0}},
+ {3295, {wxStyledTextCtrl, vCHomeWrapExtend, 0}},
+ {3296, {wxStyledTextCtrl, lineCopy, 0}},
+ {3297, {wxStyledTextCtrl, moveCaretInsideView, 0}},
+ {3298, {wxStyledTextCtrl, lineLength, 1}},
+ {3299, {wxStyledTextCtrl, braceHighlight, 2}},
+ {3300, {wxStyledTextCtrl, braceBadLight, 1}},
+ {3301, {wxStyledTextCtrl, braceMatch, 1}},
+ {3302, {wxStyledTextCtrl, getViewEOL, 0}},
+ {3303, {wxStyledTextCtrl, setViewEOL, 1}},
+ {3304, {wxStyledTextCtrl, setModEventMask, 1}},
+ {3305, {wxStyledTextCtrl, getEdgeColumn, 0}},
+ {3306, {wxStyledTextCtrl, setEdgeColumn, 1}},
+ {3307, {wxStyledTextCtrl, setEdgeMode, 1}},
+ {3308, {wxStyledTextCtrl, getEdgeMode, 0}},
+ {3309, {wxStyledTextCtrl, getEdgeColour, 0}},
+ {3310, {wxStyledTextCtrl, setEdgeColour, 1}},
+ {3311, {wxStyledTextCtrl, searchAnchor, 0}},
+ {3312, {wxStyledTextCtrl, searchNext, 2}},
+ {3313, {wxStyledTextCtrl, searchPrev, 2}},
+ {3314, {wxStyledTextCtrl, linesOnScreen, 0}},
+ {3315, {wxStyledTextCtrl, usePopUp, 1}},
+ {3316, {wxStyledTextCtrl, selectionIsRectangle, 0}},
+ {3317, {wxStyledTextCtrl, setZoom, 1}},
+ {3318, {wxStyledTextCtrl, getZoom, 0}},
+ {3319, {wxStyledTextCtrl, getModEventMask, 0}},
+ {3320, {wxStyledTextCtrl, setSTCFocus, 1}},
+ {3321, {wxStyledTextCtrl, getSTCFocus, 0}},
+ {3322, {wxStyledTextCtrl, setStatus, 1}},
+ {3323, {wxStyledTextCtrl, getStatus, 0}},
+ {3324, {wxStyledTextCtrl, setMouseDownCaptures, 1}},
+ {3325, {wxStyledTextCtrl, getMouseDownCaptures, 0}},
+ {3326, {wxStyledTextCtrl, setSTCCursor, 1}},
+ {3327, {wxStyledTextCtrl, getSTCCursor, 0}},
+ {3328, {wxStyledTextCtrl, setControlCharSymbol, 1}},
+ {3329, {wxStyledTextCtrl, getControlCharSymbol, 0}},
+ {3330, {wxStyledTextCtrl, wordPartLeft, 0}},
+ {3331, {wxStyledTextCtrl, wordPartLeftExtend, 0}},
+ {3332, {wxStyledTextCtrl, wordPartRight, 0}},
+ {3333, {wxStyledTextCtrl, wordPartRightExtend, 0}},
+ {3334, {wxStyledTextCtrl, setVisiblePolicy, 2}},
+ {3335, {wxStyledTextCtrl, delLineLeft, 0}},
+ {3336, {wxStyledTextCtrl, delLineRight, 0}},
+ {3337, {wxStyledTextCtrl, getXOffset, 0}},
+ {3338, {wxStyledTextCtrl, chooseCaretX, 0}},
+ {3339, {wxStyledTextCtrl, setXCaretPolicy, 2}},
+ {3340, {wxStyledTextCtrl, setYCaretPolicy, 2}},
+ {3341, {wxStyledTextCtrl, getPrintWrapMode, 0}},
+ {3342, {wxStyledTextCtrl, setHotspotActiveForeground, 2}},
+ {3343, {wxStyledTextCtrl, setHotspotActiveBackground, 2}},
+ {3344, {wxStyledTextCtrl, setHotspotActiveUnderline, 1}},
+ {3345, {wxStyledTextCtrl, setHotspotSingleLine, 1}},
+ {3346, {wxStyledTextCtrl, paraDownExtend, 0}},
+ {3347, {wxStyledTextCtrl, paraUp, 0}},
+ {3348, {wxStyledTextCtrl, paraUpExtend, 0}},
+ {3349, {wxStyledTextCtrl, positionBefore, 1}},
+ {3350, {wxStyledTextCtrl, positionAfter, 1}},
+ {3351, {wxStyledTextCtrl, copyRange, 2}},
+ {3352, {wxStyledTextCtrl, copyText, 2}},
+ {3353, {wxStyledTextCtrl, setSelectionMode, 1}},
+ {3354, {wxStyledTextCtrl, getSelectionMode, 0}},
+ {3355, {wxStyledTextCtrl, lineDownRectExtend, 0}},
+ {3356, {wxStyledTextCtrl, lineUpRectExtend, 0}},
+ {3357, {wxStyledTextCtrl, charLeftRectExtend, 0}},
+ {3358, {wxStyledTextCtrl, charRightRectExtend, 0}},
+ {3359, {wxStyledTextCtrl, homeRectExtend, 0}},
+ {3360, {wxStyledTextCtrl, vCHomeRectExtend, 0}},
+ {3361, {wxStyledTextCtrl, lineEndRectExtend, 0}},
+ {3362, {wxStyledTextCtrl, pageUpRectExtend, 0}},
+ {3363, {wxStyledTextCtrl, pageDownRectExtend, 0}},
+ {3364, {wxStyledTextCtrl, stutteredPageUp, 0}},
+ {3365, {wxStyledTextCtrl, stutteredPageUpExtend, 0}},
+ {3366, {wxStyledTextCtrl, stutteredPageDown, 0}},
+ {3367, {wxStyledTextCtrl, stutteredPageDownExtend, 0}},
+ {3368, {wxStyledTextCtrl, wordLeftEnd, 0}},
+ {3369, {wxStyledTextCtrl, wordLeftEndExtend, 0}},
+ {3370, {wxStyledTextCtrl, wordRightEnd, 0}},
+ {3371, {wxStyledTextCtrl, wordRightEndExtend, 0}},
+ {3372, {wxStyledTextCtrl, setWhitespaceChars, 1}},
+ {3373, {wxStyledTextCtrl, setCharsDefault, 0}},
+ {3374, {wxStyledTextCtrl, autoCompGetCurrent, 0}},
+ {3375, {wxStyledTextCtrl, allocate, 1}},
+ {3376, {wxStyledTextCtrl, findColumn, 2}},
+ {3377, {wxStyledTextCtrl, getCaretSticky, 0}},
+ {3378, {wxStyledTextCtrl, setCaretSticky, 1}},
+ {3379, {wxStyledTextCtrl, toggleCaretSticky, 0}},
+ {3380, {wxStyledTextCtrl, setPasteConvertEndings, 1}},
+ {3381, {wxStyledTextCtrl, getPasteConvertEndings, 0}},
+ {3382, {wxStyledTextCtrl, selectionDuplicate, 0}},
+ {3383, {wxStyledTextCtrl, setCaretLineBackAlpha, 1}},
+ {3384, {wxStyledTextCtrl, getCaretLineBackAlpha, 0}},
+ {3385, {wxStyledTextCtrl, startRecord, 0}},
+ {3386, {wxStyledTextCtrl, stopRecord, 0}},
+ {3387, {wxStyledTextCtrl, setLexer, 1}},
+ {3388, {wxStyledTextCtrl, getLexer, 0}},
+ {3389, {wxStyledTextCtrl, colourise, 2}},
+ {3390, {wxStyledTextCtrl, setProperty, 2}},
+ {3391, {wxStyledTextCtrl, setKeyWords, 2}},
+ {3392, {wxStyledTextCtrl, setLexerLanguage, 1}},
+ {3393, {wxStyledTextCtrl, getProperty, 1}},
+ {3394, {wxStyledTextCtrl, getStyleBitsNeeded, 0}},
+ {3395, {wxStyledTextCtrl, getCurrentLine, 0}},
+ {3396, {wxStyledTextCtrl, styleSetSpec, 2}},
+ {3397, {wxStyledTextCtrl, styleSetFont, 2}},
+ {3398, {wxStyledTextCtrl, styleSetFontAttr, 7}},
+ {3399, {wxStyledTextCtrl, styleSetCharacterSet, 2}},
+ {3400, {wxStyledTextCtrl, styleSetFontEncoding, 2}},
+ {3401, {wxStyledTextCtrl, cmdKeyExecute, 1}},
+ {3402, {wxStyledTextCtrl, setMargins, 2}},
+ {3403, {wxStyledTextCtrl, getSelection, 2}},
+ {3404, {wxStyledTextCtrl, pointFromPosition, 1}},
+ {3405, {wxStyledTextCtrl, scrollToLine, 1}},
+ {3406, {wxStyledTextCtrl, scrollToColumn, 1}},
+ {3407, {wxStyledTextCtrl, setVScrollBar, 1}},
+ {3408, {wxStyledTextCtrl, setHScrollBar, 1}},
+ {3409, {wxStyledTextCtrl, getLastKeydownProcessed, 0}},
+ {3410, {wxStyledTextCtrl, setLastKeydownProcessed, 1}},
+ {3411, {wxStyledTextCtrl, saveFile, 1}},
+ {3412, {wxStyledTextCtrl, loadFile, 1}},
+ {3413, {wxStyledTextCtrl, doDragOver, 3}},
+ {3414, {wxStyledTextCtrl, doDropText, 3}},
+ {3415, {wxStyledTextCtrl, getUseAntiAliasing, 0}},
+ {3416, {wxStyledTextCtrl, addTextRaw, 1}},
+ {3417, {wxStyledTextCtrl, insertTextRaw, 2}},
+ {3418, {wxStyledTextCtrl, getCurLineRaw, 1}},
+ {3419, {wxStyledTextCtrl, getLineRaw, 1}},
+ {3420, {wxStyledTextCtrl, getSelectedTextRaw, 0}},
+ {3421, {wxStyledTextCtrl, getTextRangeRaw, 2}},
+ {3422, {wxStyledTextCtrl, setTextRaw, 1}},
+ {3423, {wxStyledTextCtrl, getTextRaw, 0}},
+ {3424, {wxStyledTextCtrl, appendTextRaw, 1}},
+ {3425, {wxArtProvider, getBitmap, 2}},
+ {3426, {wxArtProvider, getIcon, 2}},
+ {3427, {wxTreeEvent, getKeyCode, 0}},
+ {3428, {wxTreeEvent, getItem, 0}},
+ {3429, {wxTreeEvent, getKeyEvent, 0}},
+ {3430, {wxTreeEvent, getLabel, 0}},
+ {3431, {wxTreeEvent, getOldItem, 0}},
+ {3432, {wxTreeEvent, getPoint, 0}},
+ {3433, {wxTreeEvent, isEditCancelled, 0}},
+ {3434, {wxTreeEvent, setToolTip, 1}},
+ {3435, {wxNotebookEvent, getOldSelection, 0}},
+ {3436, {wxNotebookEvent, getSelection, 0}},
+ {3437, {wxNotebookEvent, setOldSelection, 1}},
+ {3438, {wxNotebookEvent, setSelection, 1}},
+ {3439, {wxFileDataObject, new, 0}},
+ {3440, {wxFileDataObject, addFile, 1}},
+ {3441, {wxFileDataObject, getFilenames, 0}},
+ {3442, {wxFileDataObject, 'Destroy', undefined}},
+ {3443, {wxTextDataObject, new, 1}},
+ {3444, {wxTextDataObject, getTextLength, 0}},
+ {3445, {wxTextDataObject, getText, 0}},
+ {3446, {wxTextDataObject, setText, 1}},
+ {3447, {wxTextDataObject, 'Destroy', undefined}},
+ {3448, {wxBitmapDataObject, new_1_1, 1}},
+ {3449, {wxBitmapDataObject, new_1_0, 1}},
+ {3450, {wxBitmapDataObject, getBitmap, 0}},
+ {3451, {wxBitmapDataObject, setBitmap, 1}},
+ {3452, {wxBitmapDataObject, 'Destroy', undefined}},
+ {3454, {wxClipboard, new, 0}},
+ {3455, {wxClipboard, destruct, 0}},
+ {3456, {wxClipboard, addData, 1}},
+ {3457, {wxClipboard, clear, 0}},
+ {3458, {wxClipboard, close, 0}},
+ {3459, {wxClipboard, flush, 0}},
+ {3460, {wxClipboard, getData, 1}},
+ {3461, {wxClipboard, isOpened, 0}},
+ {3462, {wxClipboard, open, 0}},
+ {3463, {wxClipboard, setData, 1}},
+ {3465, {wxClipboard, usePrimarySelection, 1}},
+ {3466, {wxClipboard, isSupported, 1}},
+ {3467, {wxClipboard, get, 0}},
+ {3468, {wxSpinEvent, getPosition, 0}},
+ {3469, {wxSpinEvent, setPosition, 1}},
+ {3470, {wxSplitterWindow, new_0, 0}},
+ {3471, {wxSplitterWindow, new_2, 2}},
+ {3472, {wxSplitterWindow, destruct, 0}},
+ {3473, {wxSplitterWindow, create, 2}},
+ {3474, {wxSplitterWindow, getMinimumPaneSize, 0}},
+ {3475, {wxSplitterWindow, getSashGravity, 0}},
+ {3476, {wxSplitterWindow, getSashPosition, 0}},
+ {3477, {wxSplitterWindow, getSplitMode, 0}},
+ {3478, {wxSplitterWindow, getWindow1, 0}},
+ {3479, {wxSplitterWindow, getWindow2, 0}},
+ {3480, {wxSplitterWindow, initialize, 1}},
+ {3481, {wxSplitterWindow, isSplit, 0}},
+ {3482, {wxSplitterWindow, replaceWindow, 2}},
+ {3483, {wxSplitterWindow, setSashGravity, 1}},
+ {3484, {wxSplitterWindow, setSashPosition, 2}},
+ {3485, {wxSplitterWindow, setSashSize, 1}},
+ {3486, {wxSplitterWindow, setMinimumPaneSize, 1}},
+ {3487, {wxSplitterWindow, setSplitMode, 1}},
+ {3488, {wxSplitterWindow, splitHorizontally, 3}},
+ {3489, {wxSplitterWindow, splitVertically, 3}},
+ {3490, {wxSplitterWindow, unsplit, 1}},
+ {3491, {wxSplitterWindow, updateSize, 0}},
+ {3492, {wxSplitterEvent, getSashPosition, 0}},
+ {3493, {wxSplitterEvent, getX, 0}},
+ {3494, {wxSplitterEvent, getY, 0}},
+ {3495, {wxSplitterEvent, getWindowBeingRemoved, 0}},
+ {3496, {wxSplitterEvent, setSashPosition, 1}},
+ {3497, {wxHtmlWindow, new_0, 0}},
+ {3498, {wxHtmlWindow, new_2, 2}},
+ {3499, {wxHtmlWindow, appendToPage, 1}},
+ {3500, {wxHtmlWindow, getOpenedAnchor, 0}},
+ {3501, {wxHtmlWindow, getOpenedPage, 0}},
+ {3502, {wxHtmlWindow, getOpenedPageTitle, 0}},
+ {3503, {wxHtmlWindow, getRelatedFrame, 0}},
+ {3504, {wxHtmlWindow, historyBack, 0}},
+ {3505, {wxHtmlWindow, historyCanBack, 0}},
+ {3506, {wxHtmlWindow, historyCanForward, 0}},
+ {3507, {wxHtmlWindow, historyClear, 0}},
+ {3508, {wxHtmlWindow, historyForward, 0}},
+ {3509, {wxHtmlWindow, loadFile, 1}},
+ {3510, {wxHtmlWindow, loadPage, 1}},
+ {3511, {wxHtmlWindow, selectAll, 0}},
+ {3512, {wxHtmlWindow, selectionToText, 0}},
+ {3513, {wxHtmlWindow, selectLine, 1}},
+ {3514, {wxHtmlWindow, selectWord, 1}},
+ {3515, {wxHtmlWindow, setBorders, 1}},
+ {3516, {wxHtmlWindow, setFonts, 3}},
+ {3517, {wxHtmlWindow, setPage, 1}},
+ {3518, {wxHtmlWindow, setRelatedFrame, 2}},
+ {3519, {wxHtmlWindow, setRelatedStatusBar, 1}},
+ {3520, {wxHtmlWindow, toText, 0}},
+ {3521, {wxHtmlWindow, 'Destroy', undefined}},
+ {3522, {wxHtmlLinkEvent, getLinkInfo, 0}},
+ {3523, {wxSystemSettings, getColour, 1}},
+ {3524, {wxSystemSettings, getFont, 1}},
+ {3525, {wxSystemSettings, getMetric, 2}},
+ {3526, {wxSystemSettings, getScreenType, 0}},
+ {3527, {wxSystemOptions, getOption, 1}},
+ {3528, {wxSystemOptions, getOptionInt, 1}},
+ {3529, {wxSystemOptions, hasOption, 1}},
+ {3530, {wxSystemOptions, isFalse, 1}},
+ {3531, {wxSystemOptions, setOption_2_1, 2}},
+ {3532, {wxSystemOptions, setOption_2_0, 2}},
+ {3533, {wxAuiNotebookEvent, setSelection, 1}},
+ {3534, {wxAuiNotebookEvent, getSelection, 0}},
+ {3535, {wxAuiNotebookEvent, setOldSelection, 1}},
+ {3536, {wxAuiNotebookEvent, getOldSelection, 0}},
+ {3537, {wxAuiNotebookEvent, setDragSource, 1}},
+ {3538, {wxAuiNotebookEvent, getDragSource, 0}},
+ {3539, {wxAuiManagerEvent, setManager, 1}},
+ {3540, {wxAuiManagerEvent, getManager, 0}},
+ {3541, {wxAuiManagerEvent, setPane, 1}},
+ {3542, {wxAuiManagerEvent, getPane, 0}},
+ {3543, {wxAuiManagerEvent, setButton, 1}},
+ {3544, {wxAuiManagerEvent, getButton, 0}},
+ {3545, {wxAuiManagerEvent, setDC, 1}},
+ {3546, {wxAuiManagerEvent, getDC, 0}},
+ {3547, {wxAuiManagerEvent, veto, 1}},
+ {3548, {wxAuiManagerEvent, getVeto, 0}},
+ {3549, {wxAuiManagerEvent, setCanVeto, 1}},
+ {3550, {wxAuiManagerEvent, canVeto, 0}},
+ {3551, {wxLogNull, new, 0}},
+ {3552, {wxLogNull, 'Destroy', undefined}},
+ {3553, {wxTaskBarIcon, new, 0}},
+ {3554, {wxTaskBarIcon, destruct, 0}},
+ {3555, {wxTaskBarIcon, popupMenu, 1}},
+ {3556, {wxTaskBarIcon, removeIcon, 0}},
+ {3557, {wxTaskBarIcon, setIcon, 2}},
+ {3558, {wxLocale, new_0, 0}},
+ {3560, {wxLocale, new_2, 2}},
+ {3561, {wxLocale, destruct, 0}},
+ {3563, {wxLocale, init, 1}},
+ {3564, {wxLocale, addCatalog_1, 1}},
+ {3565, {wxLocale, addCatalog_3, 3}},
+ {3566, {wxLocale, addCatalogLookupPathPrefix, 1}},
+ {3567, {wxLocale, getCanonicalName, 0}},
+ {3568, {wxLocale, getLanguage, 0}},
+ {3569, {wxLocale, getLanguageName, 1}},
+ {3570, {wxLocale, getLocale, 0}},
+ {3571, {wxLocale, getName, 0}},
+ {3572, {wxLocale, getString_2, 2}},
+ {3573, {wxLocale, getString_4, 4}},
+ {3574, {wxLocale, getHeaderValue, 2}},
+ {3575, {wxLocale, getSysName, 0}},
+ {3576, {wxLocale, getSystemEncoding, 0}},
+ {3577, {wxLocale, getSystemEncodingName, 0}},
+ {3578, {wxLocale, getSystemLanguage, 0}},
+ {3579, {wxLocale, isLoaded, 1}},
+ {3580, {wxLocale, isOk, 0}},
+ {3581, {wxActivateEvent, getActive, 0}},
+ {3583, {wxPopupWindow, new_2, 2}},
+ {3584, {wxPopupWindow, new_0, 0}},
+ {3586, {wxPopupWindow, destruct, 0}},
+ {3587, {wxPopupWindow, create, 2}},
+ {3588, {wxPopupWindow, position, 2}},
+ {3589, {wxPopupTransientWindow, new_0, 0}},
+ {3590, {wxPopupTransientWindow, new_2, 2}},
+ {3591, {wxPopupTransientWindow, destruct, 0}},
+ {3592, {wxPopupTransientWindow, popup, 1}},
+ {3593, {wxPopupTransientWindow, dismiss, 0}},
+ {3594, {wxOverlay, new, 0}},
+ {3595, {wxOverlay, destruct, 0}},
+ {3596, {wxOverlay, reset, 0}},
+ {3597, {wxDCOverlay, new_6, 6}},
+ {3598, {wxDCOverlay, new_2, 2}},
+ {3599, {wxDCOverlay, destruct, 0}},
+ {3600, {wxDCOverlay, clear, 0}},
+ {3601, {wxDropFilesEvent, getPosition, 0}},
+ {3602, {wxDropFilesEvent, getNumberOfFiles, 0}},
+ {3603, {wxDropFilesEvent, getFiles, 0}},
+ {3604, {wxDisplay, new, 1}},
+ {3605, {wxDisplay, destruct, 0}},
+ {3606, {wxDisplay, isOk, 0}},
+ {3607, {wxDisplay, getClientArea, 0}},
+ {3608, {wxDisplay, getGeometry, 0}},
+ {3609, {wxDisplay, getName, 0}},
+ {3610, {wxDisplay, isPrimary, 0}},
+ {3611, {wxDisplay, getCount, 0}},
+ {3612, {wxDisplay, getFromPoint, 1}},
+ {3613, {wxDisplay, getFromWindow, 1}},
+ {3614, {wxDisplay, getPPI, 0}},
+ {3615, {wxGCDC, new_1, 1}},
+ {3616, {wxGCDC, new_0, 0}},
+ {3617, {wxGCDC, destruct, 0}},
+ {3618, {wxGCDC, getGraphicsContext, 0}},
+ {3619, {wxGCDC, setGraphicsContext, 1}},
{-1, {mod, func, -1}}
].
diff --git a/lib/wx/src/gen/wxe_funcs.hrl b/lib/wx/src/gen/wxe_funcs.hrl
index 030f7f117d..f880c04105 100644
--- a/lib/wx/src/gen/wxe_funcs.hrl
+++ b/lib/wx/src/gen/wxe_funcs.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -109,3284 +109,3288 @@
-define(wxWindow_IsRetained, 198).
-define(wxWindow_IsShown, 199).
-define(wxWindow_IsTopLevel, 200).
--define(wxWindow_Layout, 201).
--define(wxWindow_LineDown, 202).
--define(wxWindow_LineUp, 203).
--define(wxWindow_Lower, 204).
--define(wxWindow_MakeModal, 205).
--define(wxWindow_Move_3, 206).
--define(wxWindow_Move_2, 207).
--define(wxWindow_MoveAfterInTabOrder, 208).
--define(wxWindow_MoveBeforeInTabOrder, 209).
--define(wxWindow_Navigate, 210).
--define(wxWindow_PageDown, 211).
--define(wxWindow_PageUp, 212).
--define(wxWindow_PopEventHandler, 213).
--define(wxWindow_PopupMenu_2, 214).
--define(wxWindow_PopupMenu_3, 215).
--define(wxWindow_Raise, 216).
--define(wxWindow_Refresh, 217).
--define(wxWindow_RefreshRect, 218).
--define(wxWindow_ReleaseMouse, 219).
--define(wxWindow_RemoveChild, 220).
--define(wxWindow_Reparent, 221).
--define(wxWindow_ScreenToClient_2, 222).
--define(wxWindow_ScreenToClient_1, 223).
--define(wxWindow_ScrollLines, 225).
--define(wxWindow_ScrollPages, 227).
--define(wxWindow_ScrollWindow, 228).
--define(wxWindow_SetAcceleratorTable, 229).
--define(wxWindow_SetAutoLayout, 230).
--define(wxWindow_SetBackgroundColour, 231).
--define(wxWindow_SetBackgroundStyle, 232).
--define(wxWindow_SetCaret, 233).
--define(wxWindow_SetClientSize_2, 234).
--define(wxWindow_SetClientSize_1_0, 235).
--define(wxWindow_SetClientSize_1_1, 236).
--define(wxWindow_SetContainingSizer, 237).
--define(wxWindow_SetCursor, 238).
--define(wxWindow_SetMaxSize, 239).
--define(wxWindow_SetMinSize, 240).
--define(wxWindow_SetOwnBackgroundColour, 241).
--define(wxWindow_SetOwnFont, 242).
--define(wxWindow_SetOwnForegroundColour, 243).
--define(wxWindow_SetDropTarget, 244).
--define(wxWindow_SetExtraStyle, 245).
--define(wxWindow_SetFocus, 246).
--define(wxWindow_SetFocusFromKbd, 247).
--define(wxWindow_SetFont, 248).
--define(wxWindow_SetForegroundColour, 249).
--define(wxWindow_SetHelpText, 250).
--define(wxWindow_SetId, 251).
--define(wxWindow_SetLabel, 253).
--define(wxWindow_SetName, 254).
--define(wxWindow_SetPalette, 255).
--define(wxWindow_SetScrollbar, 256).
--define(wxWindow_SetScrollPos, 257).
--define(wxWindow_SetSize_5, 258).
--define(wxWindow_SetSize_2_0, 259).
--define(wxWindow_SetSize_1, 260).
--define(wxWindow_SetSize_2_1, 261).
--define(wxWindow_SetSizeHints_3, 262).
--define(wxWindow_SetSizeHints_2, 263).
--define(wxWindow_SetSizer, 264).
--define(wxWindow_SetSizerAndFit, 265).
--define(wxWindow_SetThemeEnabled, 266).
--define(wxWindow_SetToolTip_1_0, 267).
--define(wxWindow_SetToolTip_1_1, 268).
--define(wxWindow_SetVirtualSize_1, 269).
--define(wxWindow_SetVirtualSize_2, 270).
--define(wxWindow_SetVirtualSizeHints_3, 271).
--define(wxWindow_SetVirtualSizeHints_2, 272).
--define(wxWindow_SetWindowStyle, 273).
--define(wxWindow_SetWindowStyleFlag, 274).
--define(wxWindow_SetWindowVariant, 275).
--define(wxWindow_ShouldInheritColours, 276).
--define(wxWindow_Show, 277).
--define(wxWindow_Thaw, 278).
--define(wxWindow_TransferDataFromWindow, 279).
--define(wxWindow_TransferDataToWindow, 280).
--define(wxWindow_Update, 281).
--define(wxWindow_UpdateWindowUI, 282).
--define(wxWindow_Validate, 283).
--define(wxWindow_WarpPointer, 284).
--define(wxWindow_SetTransparent, 285).
--define(wxWindow_CanSetTransparent, 286).
--define(wxWindow_IsDoubleBuffered, 287).
--define(wxWindow_SetDoubleBuffered, 288).
--define(wxWindow_GetContentScaleFactor, 289).
--define(wxTopLevelWindow_GetIcon, 290).
--define(wxTopLevelWindow_GetIcons, 291).
--define(wxTopLevelWindow_GetTitle, 292).
--define(wxTopLevelWindow_IsActive, 293).
--define(wxTopLevelWindow_Iconize, 294).
--define(wxTopLevelWindow_IsFullScreen, 295).
--define(wxTopLevelWindow_IsIconized, 296).
--define(wxTopLevelWindow_IsMaximized, 297).
--define(wxTopLevelWindow_Maximize, 298).
--define(wxTopLevelWindow_RequestUserAttention, 299).
--define(wxTopLevelWindow_SetIcon, 300).
--define(wxTopLevelWindow_SetIcons, 301).
--define(wxTopLevelWindow_CenterOnScreen, 302).
--define(wxTopLevelWindow_CentreOnScreen, 303).
--define(wxTopLevelWindow_SetShape, 305).
--define(wxTopLevelWindow_SetTitle, 306).
--define(wxTopLevelWindow_ShowFullScreen, 307).
--define(wxFrame_new_4, 309).
--define(wxFrame_new_0, 310).
--define(wxFrame_destruct, 312).
--define(wxFrame_Create, 313).
--define(wxFrame_CreateStatusBar, 314).
--define(wxFrame_CreateToolBar, 315).
--define(wxFrame_GetClientAreaOrigin, 316).
--define(wxFrame_GetMenuBar, 317).
--define(wxFrame_GetStatusBar, 318).
--define(wxFrame_GetStatusBarPane, 319).
--define(wxFrame_GetToolBar, 320).
--define(wxFrame_ProcessCommand, 321).
--define(wxFrame_SendSizeEvent, 322).
--define(wxFrame_SetMenuBar, 323).
--define(wxFrame_SetStatusBar, 324).
--define(wxFrame_SetStatusBarPane, 325).
--define(wxFrame_SetStatusText, 326).
--define(wxFrame_SetStatusWidths, 327).
--define(wxFrame_SetToolBar, 328).
--define(wxMiniFrame_new_0, 329).
--define(wxMiniFrame_new_4, 330).
--define(wxMiniFrame_Create, 331).
--define(wxMiniFrame_destroy, 332).
--define(wxSplashScreen_new_0, 333).
--define(wxSplashScreen_new_6, 334).
--define(wxSplashScreen_destruct, 335).
--define(wxSplashScreen_GetSplashStyle, 336).
--define(wxSplashScreen_GetTimeout, 337).
--define(wxPanel_new_0, 338).
--define(wxPanel_new_6, 339).
--define(wxPanel_new_2, 340).
--define(wxPanel_destruct, 341).
--define(wxPanel_InitDialog, 342).
--define(wxPanel_SetFocusIgnoringChildren, 343).
--define(wxScrolledWindow_new_0, 344).
--define(wxScrolledWindow_new_2, 345).
--define(wxScrolledWindow_destruct, 346).
--define(wxScrolledWindow_CalcScrolledPosition_4, 347).
--define(wxScrolledWindow_CalcScrolledPosition_1, 348).
--define(wxScrolledWindow_CalcUnscrolledPosition_4, 349).
--define(wxScrolledWindow_CalcUnscrolledPosition_1, 350).
--define(wxScrolledWindow_EnableScrolling, 351).
--define(wxScrolledWindow_GetScrollPixelsPerUnit, 352).
--define(wxScrolledWindow_GetViewStart, 353).
--define(wxScrolledWindow_DoPrepareDC, 354).
--define(wxScrolledWindow_PrepareDC, 355).
--define(wxScrolledWindow_Scroll, 356).
--define(wxScrolledWindow_SetScrollbars, 357).
--define(wxScrolledWindow_SetScrollRate, 358).
--define(wxScrolledWindow_SetTargetWindow, 359).
--define(wxSashWindow_new_0, 360).
--define(wxSashWindow_new_2, 361).
--define(wxSashWindow_destruct, 362).
--define(wxSashWindow_GetSashVisible, 363).
--define(wxSashWindow_GetMaximumSizeX, 364).
--define(wxSashWindow_GetMaximumSizeY, 365).
--define(wxSashWindow_GetMinimumSizeX, 366).
--define(wxSashWindow_GetMinimumSizeY, 367).
--define(wxSashWindow_SetMaximumSizeX, 368).
--define(wxSashWindow_SetMaximumSizeY, 369).
--define(wxSashWindow_SetMinimumSizeX, 370).
--define(wxSashWindow_SetMinimumSizeY, 371).
--define(wxSashWindow_SetSashVisible, 372).
--define(wxSashLayoutWindow_new_0, 373).
--define(wxSashLayoutWindow_new_2, 374).
--define(wxSashLayoutWindow_Create, 375).
--define(wxSashLayoutWindow_GetAlignment, 376).
--define(wxSashLayoutWindow_GetOrientation, 377).
--define(wxSashLayoutWindow_SetAlignment, 378).
--define(wxSashLayoutWindow_SetDefaultSize, 379).
--define(wxSashLayoutWindow_SetOrientation, 380).
--define(wxSashLayoutWindow_destroy, 381).
--define(wxGrid_new_0, 382).
--define(wxGrid_new_3, 383).
--define(wxGrid_new_4, 384).
--define(wxGrid_destruct, 385).
--define(wxGrid_AppendCols, 386).
--define(wxGrid_AppendRows, 387).
--define(wxGrid_AutoSize, 388).
--define(wxGrid_AutoSizeColumn, 389).
--define(wxGrid_AutoSizeColumns, 390).
--define(wxGrid_AutoSizeRow, 391).
--define(wxGrid_AutoSizeRows, 392).
--define(wxGrid_BeginBatch, 393).
--define(wxGrid_BlockToDeviceRect, 394).
--define(wxGrid_CanDragColSize, 395).
--define(wxGrid_CanDragRowSize, 396).
--define(wxGrid_CanDragGridSize, 397).
--define(wxGrid_CanEnableCellControl, 398).
--define(wxGrid_CellToRect_2, 399).
--define(wxGrid_CellToRect_1, 400).
--define(wxGrid_ClearGrid, 401).
--define(wxGrid_ClearSelection, 402).
--define(wxGrid_CreateGrid, 403).
--define(wxGrid_DeleteCols, 404).
--define(wxGrid_DeleteRows, 405).
--define(wxGrid_DisableCellEditControl, 406).
--define(wxGrid_DisableDragColSize, 407).
--define(wxGrid_DisableDragGridSize, 408).
--define(wxGrid_DisableDragRowSize, 409).
--define(wxGrid_EnableCellEditControl, 410).
--define(wxGrid_EnableDragColSize, 411).
--define(wxGrid_EnableDragGridSize, 412).
--define(wxGrid_EnableDragRowSize, 413).
--define(wxGrid_EnableEditing, 414).
--define(wxGrid_EnableGridLines, 415).
--define(wxGrid_EndBatch, 416).
--define(wxGrid_Fit, 417).
--define(wxGrid_ForceRefresh, 418).
--define(wxGrid_GetBatchCount, 419).
--define(wxGrid_GetCellAlignment, 420).
--define(wxGrid_GetCellBackgroundColour, 421).
--define(wxGrid_GetCellEditor, 422).
--define(wxGrid_GetCellFont, 423).
--define(wxGrid_GetCellRenderer, 424).
--define(wxGrid_GetCellTextColour, 425).
--define(wxGrid_GetCellValue_2, 426).
--define(wxGrid_GetCellValue_1, 427).
--define(wxGrid_GetColLabelAlignment, 428).
--define(wxGrid_GetColLabelSize, 429).
--define(wxGrid_GetColLabelValue, 430).
--define(wxGrid_GetColMinimalAcceptableWidth, 431).
--define(wxGrid_GetDefaultCellAlignment, 432).
--define(wxGrid_GetDefaultCellBackgroundColour, 433).
--define(wxGrid_GetDefaultCellFont, 434).
--define(wxGrid_GetDefaultCellTextColour, 435).
--define(wxGrid_GetDefaultColLabelSize, 436).
--define(wxGrid_GetDefaultColSize, 437).
--define(wxGrid_GetDefaultEditor, 438).
--define(wxGrid_GetDefaultEditorForCell_2, 439).
--define(wxGrid_GetDefaultEditorForCell_1, 440).
--define(wxGrid_GetDefaultEditorForType, 441).
--define(wxGrid_GetDefaultRenderer, 442).
--define(wxGrid_GetDefaultRendererForCell, 443).
--define(wxGrid_GetDefaultRendererForType, 444).
--define(wxGrid_GetDefaultRowLabelSize, 445).
--define(wxGrid_GetDefaultRowSize, 446).
--define(wxGrid_GetGridCursorCol, 447).
--define(wxGrid_GetGridCursorRow, 448).
--define(wxGrid_GetGridLineColour, 449).
--define(wxGrid_GridLinesEnabled, 450).
--define(wxGrid_GetLabelBackgroundColour, 451).
--define(wxGrid_GetLabelFont, 452).
--define(wxGrid_GetLabelTextColour, 453).
--define(wxGrid_GetNumberCols, 454).
--define(wxGrid_GetNumberRows, 455).
--define(wxGrid_GetOrCreateCellAttr, 456).
--define(wxGrid_GetRowMinimalAcceptableHeight, 457).
--define(wxGrid_GetRowLabelAlignment, 458).
--define(wxGrid_GetRowLabelSize, 459).
--define(wxGrid_GetRowLabelValue, 460).
--define(wxGrid_GetRowSize, 461).
--define(wxGrid_GetScrollLineX, 462).
--define(wxGrid_GetScrollLineY, 463).
--define(wxGrid_GetSelectedCells, 464).
--define(wxGrid_GetSelectedCols, 465).
--define(wxGrid_GetSelectedRows, 466).
--define(wxGrid_GetSelectionBackground, 467).
--define(wxGrid_GetSelectionBlockTopLeft, 468).
--define(wxGrid_GetSelectionBlockBottomRight, 469).
--define(wxGrid_GetSelectionForeground, 470).
--define(wxGrid_GetViewWidth, 471).
--define(wxGrid_GetGridWindow, 472).
--define(wxGrid_GetGridRowLabelWindow, 473).
--define(wxGrid_GetGridColLabelWindow, 474).
--define(wxGrid_GetGridCornerLabelWindow, 475).
--define(wxGrid_HideCellEditControl, 476).
--define(wxGrid_InsertCols, 477).
--define(wxGrid_InsertRows, 478).
--define(wxGrid_IsCellEditControlEnabled, 479).
--define(wxGrid_IsCurrentCellReadOnly, 480).
--define(wxGrid_IsEditable, 481).
--define(wxGrid_IsInSelection_2, 482).
--define(wxGrid_IsInSelection_1, 483).
--define(wxGrid_IsReadOnly, 484).
--define(wxGrid_IsSelection, 485).
--define(wxGrid_IsVisible_3, 486).
--define(wxGrid_IsVisible_2, 487).
--define(wxGrid_MakeCellVisible_2, 488).
--define(wxGrid_MakeCellVisible_1, 489).
--define(wxGrid_MoveCursorDown, 490).
--define(wxGrid_MoveCursorLeft, 491).
--define(wxGrid_MoveCursorRight, 492).
--define(wxGrid_MoveCursorUp, 493).
--define(wxGrid_MoveCursorDownBlock, 494).
--define(wxGrid_MoveCursorLeftBlock, 495).
--define(wxGrid_MoveCursorRightBlock, 496).
--define(wxGrid_MoveCursorUpBlock, 497).
--define(wxGrid_MovePageDown, 498).
--define(wxGrid_MovePageUp, 499).
--define(wxGrid_RegisterDataType, 500).
--define(wxGrid_SaveEditControlValue, 501).
--define(wxGrid_SelectAll, 502).
--define(wxGrid_SelectBlock_5, 503).
--define(wxGrid_SelectBlock_3, 504).
--define(wxGrid_SelectCol, 505).
--define(wxGrid_SelectRow, 506).
--define(wxGrid_SetCellAlignment_4, 507).
--define(wxGrid_SetCellAlignment_3, 508).
--define(wxGrid_SetCellAlignment_1, 509).
--define(wxGrid_SetCellBackgroundColour_3_0, 510).
--define(wxGrid_SetCellBackgroundColour_1, 511).
--define(wxGrid_SetCellBackgroundColour_3_1, 512).
--define(wxGrid_SetCellEditor, 513).
--define(wxGrid_SetCellFont, 514).
--define(wxGrid_SetCellRenderer, 515).
--define(wxGrid_SetCellTextColour_3_0, 516).
--define(wxGrid_SetCellTextColour_3_1, 517).
--define(wxGrid_SetCellTextColour_1, 518).
--define(wxGrid_SetCellValue_3_0, 519).
--define(wxGrid_SetCellValue_2, 520).
--define(wxGrid_SetCellValue_3_1, 521).
--define(wxGrid_SetColAttr, 522).
--define(wxGrid_SetColFormatBool, 523).
--define(wxGrid_SetColFormatNumber, 524).
--define(wxGrid_SetColFormatFloat, 525).
--define(wxGrid_SetColFormatCustom, 526).
--define(wxGrid_SetColLabelAlignment, 527).
--define(wxGrid_SetColLabelSize, 528).
--define(wxGrid_SetColLabelValue, 529).
--define(wxGrid_SetColMinimalWidth, 530).
--define(wxGrid_SetColMinimalAcceptableWidth, 531).
--define(wxGrid_SetColSize, 532).
--define(wxGrid_SetDefaultCellAlignment, 533).
--define(wxGrid_SetDefaultCellBackgroundColour, 534).
--define(wxGrid_SetDefaultCellFont, 535).
--define(wxGrid_SetDefaultCellTextColour, 536).
--define(wxGrid_SetDefaultEditor, 537).
--define(wxGrid_SetDefaultRenderer, 538).
--define(wxGrid_SetDefaultColSize, 539).
--define(wxGrid_SetDefaultRowSize, 540).
--define(wxGrid_SetGridCursor, 541).
--define(wxGrid_SetGridLineColour, 542).
--define(wxGrid_SetLabelBackgroundColour, 543).
--define(wxGrid_SetLabelFont, 544).
--define(wxGrid_SetLabelTextColour, 545).
--define(wxGrid_SetMargins, 546).
--define(wxGrid_SetReadOnly, 547).
--define(wxGrid_SetRowAttr, 548).
--define(wxGrid_SetRowLabelAlignment, 549).
--define(wxGrid_SetRowLabelSize, 550).
--define(wxGrid_SetRowLabelValue, 551).
--define(wxGrid_SetRowMinimalHeight, 552).
--define(wxGrid_SetRowMinimalAcceptableHeight, 553).
--define(wxGrid_SetRowSize, 554).
--define(wxGrid_SetScrollLineX, 555).
--define(wxGrid_SetScrollLineY, 556).
--define(wxGrid_SetSelectionBackground, 557).
--define(wxGrid_SetSelectionForeground, 558).
--define(wxGrid_SetSelectionMode, 559).
--define(wxGrid_ShowCellEditControl, 560).
--define(wxGrid_XToCol, 561).
--define(wxGrid_XToEdgeOfCol, 562).
--define(wxGrid_YToEdgeOfRow, 563).
--define(wxGrid_YToRow, 564).
--define(wxGridCellRenderer_Draw, 565).
--define(wxGridCellRenderer_GetBestSize, 566).
--define(wxGridCellEditor_Create, 567).
--define(wxGridCellEditor_IsCreated, 568).
--define(wxGridCellEditor_SetSize, 569).
--define(wxGridCellEditor_Show, 570).
--define(wxGridCellEditor_PaintBackground, 571).
--define(wxGridCellEditor_BeginEdit, 572).
--define(wxGridCellEditor_EndEdit, 573).
--define(wxGridCellEditor_Reset, 574).
--define(wxGridCellEditor_StartingKey, 575).
--define(wxGridCellEditor_StartingClick, 576).
--define(wxGridCellEditor_HandleReturn, 577).
--define(wxGridCellBoolRenderer_new, 578).
--define(wxGridCellBoolRenderer_destroy, 579).
--define(wxGridCellBoolEditor_new, 580).
--define(wxGridCellBoolEditor_IsTrueValue, 581).
--define(wxGridCellBoolEditor_UseStringValues, 582).
--define(wxGridCellBoolEditor_destroy, 583).
--define(wxGridCellFloatRenderer_new, 584).
--define(wxGridCellFloatRenderer_GetPrecision, 585).
--define(wxGridCellFloatRenderer_GetWidth, 586).
--define(wxGridCellFloatRenderer_SetParameters, 587).
--define(wxGridCellFloatRenderer_SetPrecision, 588).
--define(wxGridCellFloatRenderer_SetWidth, 589).
--define(wxGridCellFloatRenderer_destroy, 590).
--define(wxGridCellFloatEditor_new, 591).
--define(wxGridCellFloatEditor_SetParameters, 592).
--define(wxGridCellFloatEditor_destroy, 593).
--define(wxGridCellStringRenderer_new, 594).
--define(wxGridCellStringRenderer_destroy, 595).
--define(wxGridCellTextEditor_new, 596).
--define(wxGridCellTextEditor_SetParameters, 597).
--define(wxGridCellTextEditor_destroy, 598).
--define(wxGridCellChoiceEditor_new, 600).
--define(wxGridCellChoiceEditor_SetParameters, 601).
--define(wxGridCellChoiceEditor_destroy, 602).
--define(wxGridCellNumberRenderer_new, 603).
--define(wxGridCellNumberRenderer_destroy, 604).
--define(wxGridCellNumberEditor_new, 605).
--define(wxGridCellNumberEditor_GetValue, 606).
--define(wxGridCellNumberEditor_SetParameters, 607).
--define(wxGridCellNumberEditor_destroy, 608).
--define(wxGridCellAttr_SetTextColour, 609).
--define(wxGridCellAttr_SetBackgroundColour, 610).
--define(wxGridCellAttr_SetFont, 611).
--define(wxGridCellAttr_SetAlignment, 612).
--define(wxGridCellAttr_SetReadOnly, 613).
--define(wxGridCellAttr_SetRenderer, 614).
--define(wxGridCellAttr_SetEditor, 615).
--define(wxGridCellAttr_HasTextColour, 616).
--define(wxGridCellAttr_HasBackgroundColour, 617).
--define(wxGridCellAttr_HasFont, 618).
--define(wxGridCellAttr_HasAlignment, 619).
--define(wxGridCellAttr_HasRenderer, 620).
--define(wxGridCellAttr_HasEditor, 621).
--define(wxGridCellAttr_GetTextColour, 622).
--define(wxGridCellAttr_GetBackgroundColour, 623).
--define(wxGridCellAttr_GetFont, 624).
--define(wxGridCellAttr_GetAlignment, 625).
--define(wxGridCellAttr_GetRenderer, 626).
--define(wxGridCellAttr_GetEditor, 627).
--define(wxGridCellAttr_IsReadOnly, 628).
--define(wxGridCellAttr_SetDefAttr, 629).
--define(wxDC_Blit, 630).
--define(wxDC_CalcBoundingBox, 631).
--define(wxDC_Clear, 632).
--define(wxDC_ComputeScaleAndOrigin, 633).
--define(wxDC_CrossHair, 634).
--define(wxDC_DestroyClippingRegion, 635).
--define(wxDC_DeviceToLogicalX, 636).
--define(wxDC_DeviceToLogicalXRel, 637).
--define(wxDC_DeviceToLogicalY, 638).
--define(wxDC_DeviceToLogicalYRel, 639).
--define(wxDC_DrawArc, 640).
--define(wxDC_DrawBitmap, 641).
--define(wxDC_DrawCheckMark, 642).
--define(wxDC_DrawCircle, 643).
--define(wxDC_DrawEllipse_2, 645).
--define(wxDC_DrawEllipse_1, 646).
--define(wxDC_DrawEllipticArc, 647).
--define(wxDC_DrawIcon, 648).
--define(wxDC_DrawLabel, 649).
--define(wxDC_DrawLine, 650).
--define(wxDC_DrawLines, 651).
--define(wxDC_DrawPolygon, 653).
--define(wxDC_DrawPoint, 655).
--define(wxDC_DrawRectangle_2, 657).
--define(wxDC_DrawRectangle_1, 658).
--define(wxDC_DrawRotatedText, 659).
--define(wxDC_DrawRoundedRectangle_3, 661).
--define(wxDC_DrawRoundedRectangle_2, 662).
--define(wxDC_DrawText, 663).
--define(wxDC_EndDoc, 664).
--define(wxDC_EndPage, 665).
--define(wxDC_FloodFill, 666).
--define(wxDC_GetBackground, 667).
--define(wxDC_GetBackgroundMode, 668).
--define(wxDC_GetBrush, 669).
--define(wxDC_GetCharHeight, 670).
--define(wxDC_GetCharWidth, 671).
--define(wxDC_GetClippingBox, 672).
--define(wxDC_GetFont, 674).
--define(wxDC_GetLayoutDirection, 675).
--define(wxDC_GetLogicalFunction, 676).
--define(wxDC_GetMapMode, 677).
--define(wxDC_GetMultiLineTextExtent_4, 678).
--define(wxDC_GetMultiLineTextExtent_1, 679).
--define(wxDC_GetPartialTextExtents, 680).
--define(wxDC_GetPen, 681).
--define(wxDC_GetPixel, 682).
--define(wxDC_GetPPI, 683).
--define(wxDC_GetSize, 685).
--define(wxDC_GetSizeMM, 687).
--define(wxDC_GetTextBackground, 688).
--define(wxDC_GetTextExtent_4, 689).
--define(wxDC_GetTextExtent_1, 690).
--define(wxDC_GetTextForeground, 692).
--define(wxDC_GetUserScale, 693).
--define(wxDC_GradientFillConcentric_3, 694).
--define(wxDC_GradientFillConcentric_4, 695).
--define(wxDC_GradientFillLinear, 696).
--define(wxDC_LogicalToDeviceX, 697).
--define(wxDC_LogicalToDeviceXRel, 698).
--define(wxDC_LogicalToDeviceY, 699).
--define(wxDC_LogicalToDeviceYRel, 700).
--define(wxDC_MaxX, 701).
--define(wxDC_MaxY, 702).
--define(wxDC_MinX, 703).
--define(wxDC_MinY, 704).
--define(wxDC_IsOk, 705).
--define(wxDC_ResetBoundingBox, 706).
--define(wxDC_SetAxisOrientation, 707).
--define(wxDC_SetBackground, 708).
--define(wxDC_SetBackgroundMode, 709).
--define(wxDC_SetBrush, 710).
--define(wxDC_SetClippingRegion_2, 712).
--define(wxDC_SetClippingRegion_1_1, 713).
--define(wxDC_SetClippingRegion_1_0, 714).
--define(wxDC_SetDeviceOrigin, 715).
--define(wxDC_SetFont, 716).
--define(wxDC_SetLayoutDirection, 717).
--define(wxDC_SetLogicalFunction, 718).
--define(wxDC_SetMapMode, 719).
--define(wxDC_SetPalette, 720).
--define(wxDC_SetPen, 721).
--define(wxDC_SetTextBackground, 722).
--define(wxDC_SetTextForeground, 723).
--define(wxDC_SetUserScale, 724).
--define(wxDC_StartDoc, 725).
--define(wxDC_StartPage, 726).
--define(wxMirrorDC_new, 727).
--define(wxMirrorDC_destroy, 728).
--define(wxScreenDC_new, 729).
--define(wxScreenDC_destruct, 730).
--define(wxPostScriptDC_new_0, 731).
--define(wxPostScriptDC_new_1, 732).
--define(wxPostScriptDC_destruct, 733).
--define(wxPostScriptDC_SetResolution, 734).
--define(wxPostScriptDC_GetResolution, 735).
--define(wxWindowDC_new_0, 736).
--define(wxWindowDC_new_1, 737).
--define(wxWindowDC_destruct, 738).
--define(wxClientDC_new_0, 739).
--define(wxClientDC_new_1, 740).
--define(wxClientDC_destroy, 741).
--define(wxPaintDC_new_0, 742).
--define(wxPaintDC_new_1, 743).
--define(wxPaintDC_destroy, 744).
--define(wxMemoryDC_new_1_0, 746).
--define(wxMemoryDC_new_1_1, 747).
--define(wxMemoryDC_new_0, 748).
--define(wxMemoryDC_destruct, 750).
--define(wxMemoryDC_SelectObject, 751).
--define(wxMemoryDC_SelectObjectAsSource, 752).
--define(wxBufferedDC_new_0, 753).
--define(wxBufferedDC_new_2, 754).
--define(wxBufferedDC_new_3, 755).
--define(wxBufferedDC_destruct, 756).
--define(wxBufferedDC_Init_2, 757).
--define(wxBufferedDC_Init_3, 758).
--define(wxBufferedPaintDC_new_3, 759).
--define(wxBufferedPaintDC_new_2, 760).
--define(wxBufferedPaintDC_destruct, 761).
--define(wxGraphicsObject_destruct, 762).
--define(wxGraphicsObject_GetRenderer, 763).
--define(wxGraphicsObject_IsNull, 764).
--define(wxGraphicsContext_destruct, 765).
--define(wxGraphicsContext_Create_1_1, 766).
--define(wxGraphicsContext_Create_1_0, 767).
--define(wxGraphicsContext_Create_0, 768).
--define(wxGraphicsContext_CreatePen, 769).
--define(wxGraphicsContext_CreateBrush, 770).
--define(wxGraphicsContext_CreateRadialGradientBrush, 771).
--define(wxGraphicsContext_CreateLinearGradientBrush, 772).
--define(wxGraphicsContext_CreateFont, 773).
--define(wxGraphicsContext_CreateMatrix, 774).
--define(wxGraphicsContext_CreatePath, 775).
--define(wxGraphicsContext_Clip_1, 776).
--define(wxGraphicsContext_Clip_4, 777).
--define(wxGraphicsContext_ResetClip, 778).
--define(wxGraphicsContext_DrawBitmap, 779).
--define(wxGraphicsContext_DrawEllipse, 780).
--define(wxGraphicsContext_DrawIcon, 781).
--define(wxGraphicsContext_DrawLines, 782).
--define(wxGraphicsContext_DrawPath, 783).
--define(wxGraphicsContext_DrawRectangle, 784).
--define(wxGraphicsContext_DrawRoundedRectangle, 785).
--define(wxGraphicsContext_DrawText_3, 786).
--define(wxGraphicsContext_DrawText_4_0, 787).
--define(wxGraphicsContext_DrawText_4_1, 788).
--define(wxGraphicsContext_DrawText_5, 789).
--define(wxGraphicsContext_FillPath, 790).
--define(wxGraphicsContext_StrokePath, 791).
--define(wxGraphicsContext_GetPartialTextExtents, 792).
--define(wxGraphicsContext_GetTextExtent, 793).
--define(wxGraphicsContext_Rotate, 794).
--define(wxGraphicsContext_Scale, 795).
--define(wxGraphicsContext_Translate, 796).
--define(wxGraphicsContext_GetTransform, 797).
--define(wxGraphicsContext_SetTransform, 798).
--define(wxGraphicsContext_ConcatTransform, 799).
--define(wxGraphicsContext_SetBrush_1_1, 800).
--define(wxGraphicsContext_SetBrush_1_0, 801).
--define(wxGraphicsContext_SetFont_1, 802).
--define(wxGraphicsContext_SetFont_2, 803).
--define(wxGraphicsContext_SetPen_1_0, 804).
--define(wxGraphicsContext_SetPen_1_1, 805).
--define(wxGraphicsContext_StrokeLine, 806).
--define(wxGraphicsContext_StrokeLines, 807).
--define(wxGraphicsMatrix_Concat, 809).
--define(wxGraphicsMatrix_Get, 811).
--define(wxGraphicsMatrix_Invert, 812).
--define(wxGraphicsMatrix_IsEqual, 813).
--define(wxGraphicsMatrix_IsIdentity, 815).
--define(wxGraphicsMatrix_Rotate, 816).
--define(wxGraphicsMatrix_Scale, 817).
--define(wxGraphicsMatrix_Translate, 818).
--define(wxGraphicsMatrix_Set, 819).
--define(wxGraphicsMatrix_TransformPoint, 820).
--define(wxGraphicsMatrix_TransformDistance, 821).
--define(wxGraphicsPath_MoveToPoint_2, 822).
--define(wxGraphicsPath_MoveToPoint_1, 823).
--define(wxGraphicsPath_AddArc_6, 824).
--define(wxGraphicsPath_AddArc_5, 825).
--define(wxGraphicsPath_AddArcToPoint, 826).
--define(wxGraphicsPath_AddCircle, 827).
--define(wxGraphicsPath_AddCurveToPoint_6, 828).
--define(wxGraphicsPath_AddCurveToPoint_3, 829).
--define(wxGraphicsPath_AddEllipse, 830).
--define(wxGraphicsPath_AddLineToPoint_2, 831).
--define(wxGraphicsPath_AddLineToPoint_1, 832).
--define(wxGraphicsPath_AddPath, 833).
--define(wxGraphicsPath_AddQuadCurveToPoint, 834).
--define(wxGraphicsPath_AddRectangle, 835).
--define(wxGraphicsPath_AddRoundedRectangle, 836).
--define(wxGraphicsPath_CloseSubpath, 837).
--define(wxGraphicsPath_Contains_3, 838).
--define(wxGraphicsPath_Contains_2, 839).
--define(wxGraphicsPath_GetBox, 841).
--define(wxGraphicsPath_GetCurrentPoint, 843).
--define(wxGraphicsPath_Transform, 844).
--define(wxGraphicsRenderer_GetDefaultRenderer, 845).
--define(wxGraphicsRenderer_CreateContext_1_1, 846).
--define(wxGraphicsRenderer_CreateContext_1_0, 847).
--define(wxGraphicsRenderer_CreatePen, 848).
--define(wxGraphicsRenderer_CreateBrush, 849).
--define(wxGraphicsRenderer_CreateLinearGradientBrush, 850).
--define(wxGraphicsRenderer_CreateRadialGradientBrush, 851).
--define(wxGraphicsRenderer_CreateFont, 852).
--define(wxGraphicsRenderer_CreateMatrix, 853).
--define(wxGraphicsRenderer_CreatePath, 854).
--define(wxMenuBar_new_1, 856).
--define(wxMenuBar_new_0, 858).
--define(wxMenuBar_destruct, 860).
--define(wxMenuBar_Append, 861).
--define(wxMenuBar_Check, 862).
--define(wxMenuBar_Enable_2, 863).
--define(wxMenuBar_Enable_1, 864).
--define(wxMenuBar_EnableTop, 865).
--define(wxMenuBar_FindMenu, 866).
--define(wxMenuBar_FindMenuItem, 867).
--define(wxMenuBar_FindItem, 868).
--define(wxMenuBar_GetHelpString, 869).
--define(wxMenuBar_GetLabel_1, 870).
--define(wxMenuBar_GetLabel_0, 871).
--define(wxMenuBar_GetLabelTop, 872).
--define(wxMenuBar_GetMenu, 873).
--define(wxMenuBar_GetMenuCount, 874).
--define(wxMenuBar_Insert, 875).
--define(wxMenuBar_IsChecked, 876).
--define(wxMenuBar_IsEnabled_1, 877).
--define(wxMenuBar_IsEnabled_0, 878).
--define(wxMenuBar_Remove, 879).
--define(wxMenuBar_Replace, 880).
--define(wxMenuBar_SetHelpString, 881).
--define(wxMenuBar_SetLabel_2, 882).
--define(wxMenuBar_SetLabel_1, 883).
--define(wxMenuBar_SetLabelTop, 884).
--define(wxControl_GetLabel, 885).
--define(wxControl_SetLabel, 886).
--define(wxControlWithItems_Append_1, 887).
--define(wxControlWithItems_Append_2, 888).
--define(wxControlWithItems_appendStrings_1, 889).
--define(wxControlWithItems_Clear, 890).
--define(wxControlWithItems_Delete, 891).
--define(wxControlWithItems_FindString, 892).
--define(wxControlWithItems_getClientData, 893).
--define(wxControlWithItems_setClientData, 894).
--define(wxControlWithItems_GetCount, 895).
--define(wxControlWithItems_GetSelection, 896).
--define(wxControlWithItems_GetString, 897).
--define(wxControlWithItems_GetStringSelection, 898).
--define(wxControlWithItems_Insert_2, 899).
--define(wxControlWithItems_Insert_3, 900).
--define(wxControlWithItems_IsEmpty, 901).
--define(wxControlWithItems_Select, 902).
--define(wxControlWithItems_SetSelection, 903).
--define(wxControlWithItems_SetString, 904).
--define(wxControlWithItems_SetStringSelection, 905).
--define(wxMenu_new_2, 908).
--define(wxMenu_new_1, 909).
--define(wxMenu_destruct, 911).
--define(wxMenu_Append_3, 912).
--define(wxMenu_Append_1, 913).
--define(wxMenu_Append_4_0, 914).
--define(wxMenu_Append_4_1, 915).
--define(wxMenu_AppendCheckItem, 916).
--define(wxMenu_AppendRadioItem, 917).
--define(wxMenu_AppendSeparator, 918).
--define(wxMenu_Break, 919).
--define(wxMenu_Check, 920).
--define(wxMenu_Delete_1_0, 921).
--define(wxMenu_Delete_1_1, 922).
--define(wxMenu_Destroy_1_0, 923).
--define(wxMenu_Destroy_1_1, 924).
--define(wxMenu_Enable, 925).
--define(wxMenu_FindItem_1, 926).
--define(wxMenu_FindItem_2, 927).
--define(wxMenu_FindItemByPosition, 928).
--define(wxMenu_GetHelpString, 929).
--define(wxMenu_GetLabel, 930).
--define(wxMenu_GetMenuItemCount, 931).
--define(wxMenu_GetMenuItems, 932).
--define(wxMenu_GetTitle, 934).
--define(wxMenu_Insert_2, 935).
--define(wxMenu_Insert_3, 936).
--define(wxMenu_Insert_5_1, 937).
--define(wxMenu_Insert_5_0, 938).
--define(wxMenu_InsertCheckItem, 939).
--define(wxMenu_InsertRadioItem, 940).
--define(wxMenu_InsertSeparator, 941).
--define(wxMenu_IsChecked, 942).
--define(wxMenu_IsEnabled, 943).
--define(wxMenu_Prepend_1, 944).
--define(wxMenu_Prepend_2, 945).
--define(wxMenu_Prepend_4_1, 946).
--define(wxMenu_Prepend_4_0, 947).
--define(wxMenu_PrependCheckItem, 948).
--define(wxMenu_PrependRadioItem, 949).
--define(wxMenu_PrependSeparator, 950).
--define(wxMenu_Remove_1_0, 951).
--define(wxMenu_Remove_1_1, 952).
--define(wxMenu_SetHelpString, 953).
--define(wxMenu_SetLabel, 954).
--define(wxMenu_SetTitle, 955).
--define(wxMenuItem_new, 956).
--define(wxMenuItem_destruct, 958).
--define(wxMenuItem_Check, 959).
--define(wxMenuItem_Enable, 960).
--define(wxMenuItem_GetBitmap, 961).
--define(wxMenuItem_GetHelp, 962).
--define(wxMenuItem_GetId, 963).
--define(wxMenuItem_GetKind, 964).
--define(wxMenuItem_GetLabel, 965).
--define(wxMenuItem_GetLabelFromText, 966).
--define(wxMenuItem_GetMenu, 967).
--define(wxMenuItem_GetText, 968).
--define(wxMenuItem_GetSubMenu, 969).
--define(wxMenuItem_IsCheckable, 970).
--define(wxMenuItem_IsChecked, 971).
--define(wxMenuItem_IsEnabled, 972).
--define(wxMenuItem_IsSeparator, 973).
--define(wxMenuItem_IsSubMenu, 974).
--define(wxMenuItem_SetBitmap, 975).
--define(wxMenuItem_SetHelp, 976).
--define(wxMenuItem_SetMenu, 977).
--define(wxMenuItem_SetSubMenu, 978).
--define(wxMenuItem_SetText, 979).
--define(wxToolBar_AddControl, 980).
--define(wxToolBar_AddSeparator, 981).
--define(wxToolBar_AddTool_5, 982).
--define(wxToolBar_AddTool_4_0, 983).
--define(wxToolBar_AddTool_1, 984).
--define(wxToolBar_AddTool_4_1, 985).
--define(wxToolBar_AddTool_3, 986).
--define(wxToolBar_AddTool_6, 987).
--define(wxToolBar_AddCheckTool, 988).
--define(wxToolBar_AddRadioTool, 989).
--define(wxToolBar_AddStretchableSpace, 990).
--define(wxToolBar_InsertStretchableSpace, 991).
--define(wxToolBar_DeleteTool, 992).
--define(wxToolBar_DeleteToolByPos, 993).
--define(wxToolBar_EnableTool, 994).
--define(wxToolBar_FindById, 995).
--define(wxToolBar_FindControl, 996).
--define(wxToolBar_FindToolForPosition, 997).
--define(wxToolBar_GetToolSize, 998).
--define(wxToolBar_GetToolBitmapSize, 999).
--define(wxToolBar_GetMargins, 1000).
--define(wxToolBar_GetToolEnabled, 1001).
--define(wxToolBar_GetToolLongHelp, 1002).
--define(wxToolBar_GetToolPacking, 1003).
--define(wxToolBar_GetToolPos, 1004).
--define(wxToolBar_GetToolSeparation, 1005).
--define(wxToolBar_GetToolShortHelp, 1006).
--define(wxToolBar_GetToolState, 1007).
--define(wxToolBar_InsertControl, 1008).
--define(wxToolBar_InsertSeparator, 1009).
--define(wxToolBar_InsertTool_5, 1010).
--define(wxToolBar_InsertTool_2, 1011).
--define(wxToolBar_InsertTool_4, 1012).
--define(wxToolBar_Realize, 1013).
--define(wxToolBar_RemoveTool, 1014).
--define(wxToolBar_SetMargins, 1015).
--define(wxToolBar_SetToolBitmapSize, 1016).
--define(wxToolBar_SetToolLongHelp, 1017).
--define(wxToolBar_SetToolPacking, 1018).
--define(wxToolBar_SetToolShortHelp, 1019).
--define(wxToolBar_SetToolSeparation, 1020).
--define(wxToolBar_ToggleTool, 1021).
--define(wxStatusBar_new_0, 1023).
--define(wxStatusBar_new_2, 1024).
--define(wxStatusBar_destruct, 1026).
--define(wxStatusBar_Create, 1027).
--define(wxStatusBar_GetFieldRect, 1028).
--define(wxStatusBar_GetFieldsCount, 1029).
--define(wxStatusBar_GetStatusText, 1030).
--define(wxStatusBar_PopStatusText, 1031).
--define(wxStatusBar_PushStatusText, 1032).
--define(wxStatusBar_SetFieldsCount, 1033).
--define(wxStatusBar_SetMinHeight, 1034).
--define(wxStatusBar_SetStatusText, 1035).
--define(wxStatusBar_SetStatusWidths, 1036).
--define(wxStatusBar_SetStatusStyles, 1037).
--define(wxBitmap_new_0, 1038).
--define(wxBitmap_new_3, 1039).
--define(wxBitmap_new_4, 1040).
--define(wxBitmap_new_2_0, 1041).
--define(wxBitmap_new_2_1, 1042).
--define(wxBitmap_destruct, 1043).
--define(wxBitmap_ConvertToImage, 1044).
--define(wxBitmap_CopyFromIcon, 1045).
--define(wxBitmap_Create, 1046).
--define(wxBitmap_GetDepth, 1047).
--define(wxBitmap_GetHeight, 1048).
--define(wxBitmap_GetPalette, 1049).
--define(wxBitmap_GetMask, 1050).
--define(wxBitmap_GetWidth, 1051).
--define(wxBitmap_GetSubBitmap, 1052).
--define(wxBitmap_LoadFile, 1053).
--define(wxBitmap_Ok, 1054).
--define(wxBitmap_SaveFile, 1055).
--define(wxBitmap_SetDepth, 1056).
--define(wxBitmap_SetHeight, 1057).
--define(wxBitmap_SetMask, 1058).
--define(wxBitmap_SetPalette, 1059).
--define(wxBitmap_SetWidth, 1060).
--define(wxIcon_new_0, 1061).
--define(wxIcon_new_2, 1062).
--define(wxIcon_new_1, 1063).
--define(wxIcon_CopyFromBitmap, 1064).
--define(wxIcon_destroy, 1065).
--define(wxIconBundle_new_0, 1066).
--define(wxIconBundle_new_2, 1067).
--define(wxIconBundle_new_1_0, 1068).
--define(wxIconBundle_new_1_1, 1069).
--define(wxIconBundle_destruct, 1070).
--define(wxIconBundle_AddIcon_2, 1071).
--define(wxIconBundle_AddIcon_1, 1072).
--define(wxIconBundle_GetIcon_1_1, 1073).
--define(wxIconBundle_GetIcon_1_0, 1074).
--define(wxCursor_new_0, 1075).
--define(wxCursor_new_1_0, 1076).
--define(wxCursor_new_1_1, 1077).
--define(wxCursor_new_4, 1078).
--define(wxCursor_destruct, 1079).
--define(wxCursor_Ok, 1080).
--define(wxMask_new_0, 1081).
--define(wxMask_new_2_1, 1082).
--define(wxMask_new_2_0, 1083).
--define(wxMask_new_1, 1084).
--define(wxMask_destruct, 1085).
--define(wxMask_Create_2_1, 1086).
--define(wxMask_Create_2_0, 1087).
--define(wxMask_Create_1, 1088).
--define(wxImage_new_0, 1089).
--define(wxImage_new_3_0, 1090).
--define(wxImage_new_4, 1091).
--define(wxImage_new_5, 1092).
--define(wxImage_new_2, 1093).
--define(wxImage_new_3_1, 1094).
--define(wxImage_Blur, 1095).
--define(wxImage_BlurHorizontal, 1096).
--define(wxImage_BlurVertical, 1097).
--define(wxImage_ConvertAlphaToMask, 1098).
--define(wxImage_ConvertToGreyscale, 1099).
--define(wxImage_ConvertToMono, 1100).
--define(wxImage_Copy, 1101).
--define(wxImage_Create_3, 1102).
--define(wxImage_Create_4, 1103).
--define(wxImage_Create_5, 1104).
--define(wxImage_Destroy, 1105).
--define(wxImage_FindFirstUnusedColour, 1106).
--define(wxImage_GetImageExtWildcard, 1107).
--define(wxImage_GetAlpha_2, 1108).
--define(wxImage_GetAlpha_0, 1109).
--define(wxImage_GetBlue, 1110).
--define(wxImage_GetData, 1111).
--define(wxImage_GetGreen, 1112).
--define(wxImage_GetImageCount, 1113).
--define(wxImage_GetHeight, 1114).
--define(wxImage_GetMaskBlue, 1115).
--define(wxImage_GetMaskGreen, 1116).
--define(wxImage_GetMaskRed, 1117).
--define(wxImage_GetOrFindMaskColour, 1118).
--define(wxImage_GetPalette, 1119).
--define(wxImage_GetRed, 1120).
--define(wxImage_GetSubImage, 1121).
--define(wxImage_GetWidth, 1122).
--define(wxImage_HasAlpha, 1123).
--define(wxImage_HasMask, 1124).
--define(wxImage_GetOption, 1125).
--define(wxImage_GetOptionInt, 1126).
--define(wxImage_HasOption, 1127).
--define(wxImage_InitAlpha, 1128).
--define(wxImage_InitStandardHandlers, 1129).
--define(wxImage_IsTransparent, 1130).
--define(wxImage_LoadFile_2, 1131).
--define(wxImage_LoadFile_3, 1132).
--define(wxImage_Ok, 1133).
--define(wxImage_RemoveHandler, 1134).
--define(wxImage_Mirror, 1135).
--define(wxImage_Replace, 1136).
--define(wxImage_Rescale, 1137).
--define(wxImage_Resize, 1138).
--define(wxImage_Rotate, 1139).
--define(wxImage_RotateHue, 1140).
--define(wxImage_Rotate90, 1141).
--define(wxImage_SaveFile_1, 1142).
--define(wxImage_SaveFile_2_0, 1143).
--define(wxImage_SaveFile_2_1, 1144).
--define(wxImage_Scale, 1145).
--define(wxImage_Size, 1146).
--define(wxImage_SetAlpha_3, 1147).
--define(wxImage_SetAlpha_2, 1148).
--define(wxImage_SetData_2, 1149).
--define(wxImage_SetData_4, 1150).
--define(wxImage_SetMask, 1151).
--define(wxImage_SetMaskColour, 1152).
--define(wxImage_SetMaskFromImage, 1153).
--define(wxImage_SetOption_2_1, 1154).
--define(wxImage_SetOption_2_0, 1155).
--define(wxImage_SetPalette, 1156).
--define(wxImage_SetRGB_5, 1157).
--define(wxImage_SetRGB_4, 1158).
--define(wxImage_destroy, 1159).
--define(wxBrush_new_0, 1160).
--define(wxBrush_new_2, 1161).
--define(wxBrush_new_1, 1162).
--define(wxBrush_destruct, 1164).
--define(wxBrush_GetColour, 1165).
--define(wxBrush_GetStipple, 1166).
--define(wxBrush_GetStyle, 1167).
--define(wxBrush_IsHatch, 1168).
--define(wxBrush_IsOk, 1169).
--define(wxBrush_SetColour_1, 1170).
--define(wxBrush_SetColour_3, 1171).
--define(wxBrush_SetStipple, 1172).
--define(wxBrush_SetStyle, 1173).
--define(wxPen_new_0, 1174).
--define(wxPen_new_2, 1175).
--define(wxPen_destruct, 1176).
--define(wxPen_GetCap, 1177).
--define(wxPen_GetColour, 1178).
--define(wxPen_GetJoin, 1179).
--define(wxPen_GetStyle, 1180).
--define(wxPen_GetWidth, 1181).
--define(wxPen_IsOk, 1182).
--define(wxPen_SetCap, 1183).
--define(wxPen_SetColour_1, 1184).
--define(wxPen_SetColour_3, 1185).
--define(wxPen_SetJoin, 1186).
--define(wxPen_SetStyle, 1187).
--define(wxPen_SetWidth, 1188).
--define(wxRegion_new_0, 1189).
--define(wxRegion_new_4, 1190).
--define(wxRegion_new_2, 1191).
--define(wxRegion_new_1_1, 1192).
--define(wxRegion_new_1_0, 1194).
--define(wxRegion_destruct, 1196).
--define(wxRegion_Clear, 1197).
--define(wxRegion_Contains_2, 1198).
--define(wxRegion_Contains_1_0, 1199).
--define(wxRegion_Contains_4, 1200).
--define(wxRegion_Contains_1_1, 1201).
--define(wxRegion_ConvertToBitmap, 1202).
--define(wxRegion_GetBox, 1203).
--define(wxRegion_Intersect_4, 1204).
--define(wxRegion_Intersect_1_1, 1205).
--define(wxRegion_Intersect_1_0, 1206).
--define(wxRegion_IsEmpty, 1207).
--define(wxRegion_Subtract_4, 1208).
--define(wxRegion_Subtract_1_1, 1209).
--define(wxRegion_Subtract_1_0, 1210).
--define(wxRegion_Offset_2, 1211).
--define(wxRegion_Offset_1, 1212).
--define(wxRegion_Union_4, 1213).
--define(wxRegion_Union_1_2, 1214).
--define(wxRegion_Union_1_1, 1215).
--define(wxRegion_Union_1_0, 1216).
--define(wxRegion_Union_3, 1217).
--define(wxRegion_Xor_4, 1218).
--define(wxRegion_Xor_1_1, 1219).
--define(wxRegion_Xor_1_0, 1220).
--define(wxAcceleratorTable_new_0, 1221).
--define(wxAcceleratorTable_new_2, 1222).
--define(wxAcceleratorTable_destruct, 1223).
--define(wxAcceleratorTable_Ok, 1224).
--define(wxAcceleratorEntry_new_1_0, 1225).
--define(wxAcceleratorEntry_new_1_1, 1226).
--define(wxAcceleratorEntry_GetCommand, 1227).
--define(wxAcceleratorEntry_GetFlags, 1228).
--define(wxAcceleratorEntry_GetKeyCode, 1229).
--define(wxAcceleratorEntry_Set, 1230).
--define(wxAcceleratorEntry_destroy, 1231).
--define(wxCaret_new_3, 1236).
--define(wxCaret_new_2, 1237).
--define(wxCaret_destruct, 1239).
--define(wxCaret_Create_3, 1240).
--define(wxCaret_Create_2, 1241).
--define(wxCaret_GetBlinkTime, 1242).
--define(wxCaret_GetPosition, 1244).
--define(wxCaret_GetSize, 1246).
--define(wxCaret_GetWindow, 1247).
--define(wxCaret_Hide, 1248).
--define(wxCaret_IsOk, 1249).
--define(wxCaret_IsVisible, 1250).
--define(wxCaret_Move_2, 1251).
--define(wxCaret_Move_1, 1252).
--define(wxCaret_SetBlinkTime, 1253).
--define(wxCaret_SetSize_2, 1254).
--define(wxCaret_SetSize_1, 1255).
--define(wxCaret_Show, 1256).
--define(wxSizer_Add_2_1, 1257).
--define(wxSizer_Add_2_0, 1258).
--define(wxSizer_Add_3, 1259).
--define(wxSizer_Add_2_3, 1260).
--define(wxSizer_Add_2_2, 1261).
--define(wxSizer_AddSpacer, 1262).
--define(wxSizer_AddStretchSpacer, 1263).
--define(wxSizer_CalcMin, 1264).
--define(wxSizer_Clear, 1265).
--define(wxSizer_Detach_1_2, 1266).
--define(wxSizer_Detach_1_1, 1267).
--define(wxSizer_Detach_1_0, 1268).
--define(wxSizer_Fit, 1269).
--define(wxSizer_FitInside, 1270).
--define(wxSizer_GetChildren, 1271).
--define(wxSizer_GetItem_2_1, 1272).
--define(wxSizer_GetItem_2_0, 1273).
--define(wxSizer_GetItem_1, 1274).
--define(wxSizer_GetSize, 1275).
--define(wxSizer_GetPosition, 1276).
--define(wxSizer_GetMinSize, 1277).
--define(wxSizer_Hide_2_0, 1278).
--define(wxSizer_Hide_2_1, 1279).
--define(wxSizer_Hide_1, 1280).
--define(wxSizer_Insert_3_1, 1281).
--define(wxSizer_Insert_3_0, 1282).
--define(wxSizer_Insert_4, 1283).
--define(wxSizer_Insert_3_3, 1284).
--define(wxSizer_Insert_3_2, 1285).
--define(wxSizer_Insert_2, 1286).
--define(wxSizer_InsertSpacer, 1287).
--define(wxSizer_InsertStretchSpacer, 1288).
--define(wxSizer_IsShown_1_2, 1289).
--define(wxSizer_IsShown_1_1, 1290).
--define(wxSizer_IsShown_1_0, 1291).
--define(wxSizer_Layout, 1292).
--define(wxSizer_Prepend_2_1, 1293).
--define(wxSizer_Prepend_2_0, 1294).
--define(wxSizer_Prepend_3, 1295).
--define(wxSizer_Prepend_2_3, 1296).
--define(wxSizer_Prepend_2_2, 1297).
--define(wxSizer_Prepend_1, 1298).
--define(wxSizer_PrependSpacer, 1299).
--define(wxSizer_PrependStretchSpacer, 1300).
--define(wxSizer_RecalcSizes, 1301).
--define(wxSizer_Remove_1_1, 1302).
--define(wxSizer_Remove_1_0, 1303).
--define(wxSizer_Replace_3_1, 1304).
--define(wxSizer_Replace_3_0, 1305).
--define(wxSizer_Replace_2, 1306).
--define(wxSizer_SetDimension, 1307).
--define(wxSizer_SetMinSize_2, 1308).
--define(wxSizer_SetMinSize_1, 1309).
--define(wxSizer_SetItemMinSize_3_2, 1310).
--define(wxSizer_SetItemMinSize_2_2, 1311).
--define(wxSizer_SetItemMinSize_3_1, 1312).
--define(wxSizer_SetItemMinSize_2_1, 1313).
--define(wxSizer_SetItemMinSize_3_0, 1314).
--define(wxSizer_SetItemMinSize_2_0, 1315).
--define(wxSizer_SetSizeHints, 1316).
--define(wxSizer_SetVirtualSizeHints, 1317).
--define(wxSizer_Show_2_2, 1318).
--define(wxSizer_Show_2_1, 1319).
--define(wxSizer_Show_2_0, 1320).
--define(wxSizer_Show_1, 1321).
--define(wxSizerFlags_new, 1322).
--define(wxSizerFlags_Align, 1323).
--define(wxSizerFlags_Border_2, 1324).
--define(wxSizerFlags_Border_1, 1325).
--define(wxSizerFlags_Center, 1326).
--define(wxSizerFlags_Centre, 1327).
--define(wxSizerFlags_Expand, 1328).
--define(wxSizerFlags_Left, 1329).
--define(wxSizerFlags_Proportion, 1330).
--define(wxSizerFlags_Right, 1331).
--define(wxSizerFlags_destroy, 1332).
--define(wxSizerItem_new_5_1, 1333).
--define(wxSizerItem_new_2_1, 1334).
--define(wxSizerItem_new_5_0, 1335).
--define(wxSizerItem_new_2_0, 1336).
--define(wxSizerItem_new_6, 1337).
--define(wxSizerItem_new_3, 1338).
--define(wxSizerItem_new_0, 1339).
--define(wxSizerItem_destruct, 1340).
--define(wxSizerItem_CalcMin, 1341).
--define(wxSizerItem_DeleteWindows, 1342).
--define(wxSizerItem_DetachSizer, 1343).
--define(wxSizerItem_GetBorder, 1344).
--define(wxSizerItem_GetFlag, 1345).
--define(wxSizerItem_GetMinSize, 1346).
--define(wxSizerItem_GetPosition, 1347).
--define(wxSizerItem_GetProportion, 1348).
--define(wxSizerItem_GetRatio, 1349).
--define(wxSizerItem_GetRect, 1350).
--define(wxSizerItem_GetSize, 1351).
--define(wxSizerItem_GetSizer, 1352).
--define(wxSizerItem_GetSpacer, 1353).
--define(wxSizerItem_GetUserData, 1354).
--define(wxSizerItem_GetWindow, 1355).
--define(wxSizerItem_IsSizer, 1356).
--define(wxSizerItem_IsShown, 1357).
--define(wxSizerItem_IsSpacer, 1358).
--define(wxSizerItem_IsWindow, 1359).
--define(wxSizerItem_SetBorder, 1360).
--define(wxSizerItem_SetDimension, 1361).
--define(wxSizerItem_SetFlag, 1362).
--define(wxSizerItem_SetInitSize, 1363).
--define(wxSizerItem_SetMinSize_1, 1364).
--define(wxSizerItem_SetMinSize_2, 1365).
--define(wxSizerItem_SetProportion, 1366).
--define(wxSizerItem_SetRatio_2, 1367).
--define(wxSizerItem_SetRatio_1_1, 1368).
--define(wxSizerItem_SetRatio_1_0, 1369).
--define(wxSizerItem_SetSizer, 1370).
--define(wxSizerItem_SetSpacer_1, 1371).
--define(wxSizerItem_SetSpacer_2, 1372).
--define(wxSizerItem_SetWindow, 1373).
--define(wxSizerItem_Show, 1374).
--define(wxBoxSizer_new, 1375).
--define(wxBoxSizer_GetOrientation, 1376).
--define(wxBoxSizer_destroy, 1377).
--define(wxStaticBoxSizer_new_2, 1378).
--define(wxStaticBoxSizer_new_3, 1379).
--define(wxStaticBoxSizer_GetStaticBox, 1380).
--define(wxStaticBoxSizer_destroy, 1381).
--define(wxGridSizer_new_4, 1382).
--define(wxGridSizer_new_2, 1383).
--define(wxGridSizer_GetCols, 1384).
--define(wxGridSizer_GetHGap, 1385).
--define(wxGridSizer_GetRows, 1386).
--define(wxGridSizer_GetVGap, 1387).
--define(wxGridSizer_SetCols, 1388).
--define(wxGridSizer_SetHGap, 1389).
--define(wxGridSizer_SetRows, 1390).
--define(wxGridSizer_SetVGap, 1391).
--define(wxGridSizer_destroy, 1392).
--define(wxFlexGridSizer_new_4, 1393).
--define(wxFlexGridSizer_new_2, 1394).
--define(wxFlexGridSizer_AddGrowableCol, 1395).
--define(wxFlexGridSizer_AddGrowableRow, 1396).
--define(wxFlexGridSizer_GetFlexibleDirection, 1397).
--define(wxFlexGridSizer_GetNonFlexibleGrowMode, 1398).
--define(wxFlexGridSizer_RemoveGrowableCol, 1399).
--define(wxFlexGridSizer_RemoveGrowableRow, 1400).
--define(wxFlexGridSizer_SetFlexibleDirection, 1401).
--define(wxFlexGridSizer_SetNonFlexibleGrowMode, 1402).
--define(wxFlexGridSizer_destroy, 1403).
--define(wxGridBagSizer_new, 1404).
--define(wxGridBagSizer_Add_3_2, 1405).
--define(wxGridBagSizer_Add_3_1, 1406).
--define(wxGridBagSizer_Add_4, 1407).
--define(wxGridBagSizer_Add_1_0, 1408).
--define(wxGridBagSizer_Add_2_1, 1409).
--define(wxGridBagSizer_Add_2_0, 1410).
--define(wxGridBagSizer_Add_3_0, 1411).
--define(wxGridBagSizer_Add_1_1, 1412).
--define(wxGridBagSizer_CalcMin, 1413).
--define(wxGridBagSizer_CheckForIntersection_2, 1414).
--define(wxGridBagSizer_CheckForIntersection_3, 1415).
--define(wxGridBagSizer_FindItem_1_1, 1416).
--define(wxGridBagSizer_FindItem_1_0, 1417).
--define(wxGridBagSizer_FindItemAtPoint, 1418).
--define(wxGridBagSizer_FindItemAtPosition, 1419).
--define(wxGridBagSizer_FindItemWithData, 1420).
--define(wxGridBagSizer_GetCellSize, 1421).
--define(wxGridBagSizer_GetEmptyCellSize, 1422).
--define(wxGridBagSizer_GetItemPosition_1_2, 1423).
--define(wxGridBagSizer_GetItemPosition_1_1, 1424).
--define(wxGridBagSizer_GetItemPosition_1_0, 1425).
--define(wxGridBagSizer_GetItemSpan_1_2, 1426).
--define(wxGridBagSizer_GetItemSpan_1_1, 1427).
--define(wxGridBagSizer_GetItemSpan_1_0, 1428).
--define(wxGridBagSizer_SetEmptyCellSize, 1429).
--define(wxGridBagSizer_SetItemPosition_2_2, 1430).
--define(wxGridBagSizer_SetItemPosition_2_1, 1431).
--define(wxGridBagSizer_SetItemPosition_2_0, 1432).
--define(wxGridBagSizer_SetItemSpan_2_2, 1433).
--define(wxGridBagSizer_SetItemSpan_2_1, 1434).
--define(wxGridBagSizer_SetItemSpan_2_0, 1435).
--define(wxGridBagSizer_destroy, 1436).
--define(wxStdDialogButtonSizer_new, 1437).
--define(wxStdDialogButtonSizer_AddButton, 1438).
--define(wxStdDialogButtonSizer_Realize, 1439).
--define(wxStdDialogButtonSizer_SetAffirmativeButton, 1440).
--define(wxStdDialogButtonSizer_SetCancelButton, 1441).
--define(wxStdDialogButtonSizer_SetNegativeButton, 1442).
--define(wxStdDialogButtonSizer_destroy, 1443).
--define(wxFont_new_0, 1444).
--define(wxFont_new_1, 1445).
--define(wxFont_new_5, 1446).
--define(wxFont_destruct, 1448).
--define(wxFont_IsFixedWidth, 1449).
--define(wxFont_GetDefaultEncoding, 1450).
--define(wxFont_GetFaceName, 1451).
--define(wxFont_GetFamily, 1452).
--define(wxFont_GetNativeFontInfoDesc, 1453).
--define(wxFont_GetNativeFontInfoUserDesc, 1454).
--define(wxFont_GetPointSize, 1455).
--define(wxFont_GetStyle, 1456).
--define(wxFont_GetUnderlined, 1457).
--define(wxFont_GetWeight, 1458).
--define(wxFont_Ok, 1459).
--define(wxFont_SetDefaultEncoding, 1460).
--define(wxFont_SetFaceName, 1461).
--define(wxFont_SetFamily, 1462).
--define(wxFont_SetPointSize, 1463).
--define(wxFont_SetStyle, 1464).
--define(wxFont_SetUnderlined, 1465).
--define(wxFont_SetWeight, 1466).
--define(wxToolTip_Enable, 1467).
--define(wxToolTip_SetDelay, 1468).
--define(wxToolTip_new, 1469).
--define(wxToolTip_SetTip, 1470).
--define(wxToolTip_GetTip, 1471).
--define(wxToolTip_GetWindow, 1472).
--define(wxToolTip_destroy, 1473).
--define(wxButton_new_3, 1475).
--define(wxButton_new_0, 1476).
--define(wxButton_destruct, 1477).
--define(wxButton_Create, 1478).
--define(wxButton_GetDefaultSize, 1479).
--define(wxButton_SetDefault, 1480).
--define(wxButton_SetLabel, 1481).
--define(wxBitmapButton_new_4, 1483).
--define(wxBitmapButton_new_0, 1484).
--define(wxBitmapButton_Create, 1485).
--define(wxBitmapButton_GetBitmapDisabled, 1486).
--define(wxBitmapButton_GetBitmapFocus, 1488).
--define(wxBitmapButton_GetBitmapLabel, 1490).
--define(wxBitmapButton_GetBitmapSelected, 1492).
--define(wxBitmapButton_SetBitmapDisabled, 1494).
--define(wxBitmapButton_SetBitmapFocus, 1495).
--define(wxBitmapButton_SetBitmapLabel, 1496).
--define(wxBitmapButton_SetBitmapSelected, 1497).
--define(wxBitmapButton_destroy, 1498).
--define(wxToggleButton_new_0, 1499).
--define(wxToggleButton_new_4, 1500).
--define(wxToggleButton_Create, 1501).
--define(wxToggleButton_GetValue, 1502).
--define(wxToggleButton_SetValue, 1503).
--define(wxToggleButton_destroy, 1504).
--define(wxCalendarCtrl_new_0, 1505).
--define(wxCalendarCtrl_new_3, 1506).
--define(wxCalendarCtrl_Create, 1507).
--define(wxCalendarCtrl_destruct, 1508).
--define(wxCalendarCtrl_SetDate, 1509).
--define(wxCalendarCtrl_GetDate, 1510).
--define(wxCalendarCtrl_EnableYearChange, 1511).
--define(wxCalendarCtrl_EnableMonthChange, 1512).
--define(wxCalendarCtrl_EnableHolidayDisplay, 1513).
--define(wxCalendarCtrl_SetHeaderColours, 1514).
--define(wxCalendarCtrl_GetHeaderColourFg, 1515).
--define(wxCalendarCtrl_GetHeaderColourBg, 1516).
--define(wxCalendarCtrl_SetHighlightColours, 1517).
--define(wxCalendarCtrl_GetHighlightColourFg, 1518).
--define(wxCalendarCtrl_GetHighlightColourBg, 1519).
--define(wxCalendarCtrl_SetHolidayColours, 1520).
--define(wxCalendarCtrl_GetHolidayColourFg, 1521).
--define(wxCalendarCtrl_GetHolidayColourBg, 1522).
--define(wxCalendarCtrl_GetAttr, 1523).
--define(wxCalendarCtrl_SetAttr, 1524).
--define(wxCalendarCtrl_SetHoliday, 1525).
--define(wxCalendarCtrl_ResetAttr, 1526).
--define(wxCalendarCtrl_HitTest, 1527).
--define(wxCalendarDateAttr_new_0, 1528).
--define(wxCalendarDateAttr_new_2_1, 1529).
--define(wxCalendarDateAttr_new_2_0, 1530).
--define(wxCalendarDateAttr_SetTextColour, 1531).
--define(wxCalendarDateAttr_SetBackgroundColour, 1532).
--define(wxCalendarDateAttr_SetBorderColour, 1533).
--define(wxCalendarDateAttr_SetFont, 1534).
--define(wxCalendarDateAttr_SetBorder, 1535).
--define(wxCalendarDateAttr_SetHoliday, 1536).
--define(wxCalendarDateAttr_HasTextColour, 1537).
--define(wxCalendarDateAttr_HasBackgroundColour, 1538).
--define(wxCalendarDateAttr_HasBorderColour, 1539).
--define(wxCalendarDateAttr_HasFont, 1540).
--define(wxCalendarDateAttr_HasBorder, 1541).
--define(wxCalendarDateAttr_IsHoliday, 1542).
--define(wxCalendarDateAttr_GetTextColour, 1543).
--define(wxCalendarDateAttr_GetBackgroundColour, 1544).
--define(wxCalendarDateAttr_GetBorderColour, 1545).
--define(wxCalendarDateAttr_GetFont, 1546).
--define(wxCalendarDateAttr_GetBorder, 1547).
--define(wxCalendarDateAttr_destroy, 1548).
--define(wxCheckBox_new_4, 1550).
--define(wxCheckBox_new_0, 1551).
--define(wxCheckBox_Create, 1552).
--define(wxCheckBox_GetValue, 1553).
--define(wxCheckBox_Get3StateValue, 1554).
--define(wxCheckBox_Is3rdStateAllowedForUser, 1555).
--define(wxCheckBox_Is3State, 1556).
--define(wxCheckBox_IsChecked, 1557).
--define(wxCheckBox_SetValue, 1558).
--define(wxCheckBox_Set3StateValue, 1559).
--define(wxCheckBox_destroy, 1560).
--define(wxCheckListBox_new_0, 1561).
--define(wxCheckListBox_new_3, 1563).
--define(wxCheckListBox_Check, 1564).
--define(wxCheckListBox_IsChecked, 1565).
--define(wxCheckListBox_destroy, 1566).
--define(wxChoice_new_3, 1569).
--define(wxChoice_new_0, 1570).
--define(wxChoice_destruct, 1572).
--define(wxChoice_Create, 1574).
--define(wxChoice_Delete, 1575).
--define(wxChoice_GetColumns, 1576).
--define(wxChoice_SetColumns, 1577).
--define(wxComboBox_new_0, 1578).
--define(wxComboBox_new_3, 1580).
--define(wxComboBox_destruct, 1581).
--define(wxComboBox_Create, 1583).
--define(wxComboBox_CanCopy, 1584).
--define(wxComboBox_CanCut, 1585).
--define(wxComboBox_CanPaste, 1586).
--define(wxComboBox_CanRedo, 1587).
--define(wxComboBox_CanUndo, 1588).
--define(wxComboBox_Copy, 1589).
--define(wxComboBox_Cut, 1590).
--define(wxComboBox_GetInsertionPoint, 1591).
--define(wxComboBox_GetLastPosition, 1592).
--define(wxComboBox_GetValue, 1593).
--define(wxComboBox_Paste, 1594).
--define(wxComboBox_Redo, 1595).
--define(wxComboBox_Replace, 1596).
--define(wxComboBox_Remove, 1597).
--define(wxComboBox_SetInsertionPoint, 1598).
--define(wxComboBox_SetInsertionPointEnd, 1599).
--define(wxComboBox_SetSelection_1, 1600).
--define(wxComboBox_SetSelection_2, 1601).
--define(wxComboBox_SetValue, 1602).
--define(wxComboBox_Undo, 1603).
--define(wxGauge_new_0, 1604).
--define(wxGauge_new_4, 1605).
--define(wxGauge_Create, 1606).
--define(wxGauge_GetRange, 1607).
--define(wxGauge_GetValue, 1608).
--define(wxGauge_IsVertical, 1609).
--define(wxGauge_SetRange, 1610).
--define(wxGauge_SetValue, 1611).
--define(wxGauge_Pulse, 1612).
--define(wxGauge_destroy, 1613).
--define(wxGenericDirCtrl_new_0, 1614).
--define(wxGenericDirCtrl_new_2, 1615).
--define(wxGenericDirCtrl_destruct, 1616).
--define(wxGenericDirCtrl_Create, 1617).
--define(wxGenericDirCtrl_Init, 1618).
--define(wxGenericDirCtrl_CollapseTree, 1619).
--define(wxGenericDirCtrl_ExpandPath, 1620).
--define(wxGenericDirCtrl_GetDefaultPath, 1621).
--define(wxGenericDirCtrl_GetPath, 1622).
--define(wxGenericDirCtrl_GetFilePath, 1623).
--define(wxGenericDirCtrl_GetFilter, 1624).
--define(wxGenericDirCtrl_GetFilterIndex, 1625).
--define(wxGenericDirCtrl_GetRootId, 1626).
--define(wxGenericDirCtrl_GetTreeCtrl, 1627).
--define(wxGenericDirCtrl_ReCreateTree, 1628).
--define(wxGenericDirCtrl_SetDefaultPath, 1629).
--define(wxGenericDirCtrl_SetFilter, 1630).
--define(wxGenericDirCtrl_SetFilterIndex, 1631).
--define(wxGenericDirCtrl_SetPath, 1632).
--define(wxStaticBox_new_4, 1634).
--define(wxStaticBox_new_0, 1635).
--define(wxStaticBox_Create, 1636).
--define(wxStaticBox_destroy, 1637).
--define(wxStaticLine_new_2, 1639).
--define(wxStaticLine_new_0, 1640).
--define(wxStaticLine_destruct, 1641).
--define(wxStaticLine_Create, 1642).
--define(wxStaticLine_IsVertical, 1643).
--define(wxStaticLine_GetDefaultSize, 1644).
--define(wxListBox_new_3, 1647).
--define(wxListBox_new_0, 1648).
--define(wxListBox_destruct, 1650).
--define(wxListBox_Create, 1652).
--define(wxListBox_Deselect, 1653).
--define(wxListBox_GetSelections, 1654).
--define(wxListBox_InsertItems, 1655).
--define(wxListBox_IsSelected, 1656).
--define(wxListBox_Set, 1657).
--define(wxListBox_HitTest, 1658).
--define(wxListBox_SetFirstItem_1_0, 1659).
--define(wxListBox_SetFirstItem_1_1, 1660).
--define(wxListCtrl_new_0, 1661).
--define(wxListCtrl_new_2, 1662).
--define(wxListCtrl_Arrange, 1663).
--define(wxListCtrl_AssignImageList, 1664).
--define(wxListCtrl_ClearAll, 1665).
--define(wxListCtrl_Create, 1666).
--define(wxListCtrl_DeleteAllItems, 1667).
--define(wxListCtrl_DeleteColumn, 1668).
--define(wxListCtrl_DeleteItem, 1669).
--define(wxListCtrl_EditLabel, 1670).
--define(wxListCtrl_EnsureVisible, 1671).
--define(wxListCtrl_FindItem_3_0, 1672).
--define(wxListCtrl_FindItem_3_1, 1673).
--define(wxListCtrl_GetColumn, 1674).
--define(wxListCtrl_GetColumnCount, 1675).
--define(wxListCtrl_GetColumnWidth, 1676).
--define(wxListCtrl_GetCountPerPage, 1677).
--define(wxListCtrl_GetEditControl, 1678).
--define(wxListCtrl_GetImageList, 1679).
--define(wxListCtrl_GetItem, 1680).
--define(wxListCtrl_GetItemBackgroundColour, 1681).
--define(wxListCtrl_GetItemCount, 1682).
--define(wxListCtrl_GetItemData, 1683).
--define(wxListCtrl_GetItemFont, 1684).
--define(wxListCtrl_GetItemPosition, 1685).
--define(wxListCtrl_GetItemRect, 1686).
--define(wxListCtrl_GetItemSpacing, 1687).
--define(wxListCtrl_GetItemState, 1688).
--define(wxListCtrl_GetItemText, 1689).
--define(wxListCtrl_GetItemTextColour, 1690).
--define(wxListCtrl_GetNextItem, 1691).
--define(wxListCtrl_GetSelectedItemCount, 1692).
--define(wxListCtrl_GetTextColour, 1693).
--define(wxListCtrl_GetTopItem, 1694).
--define(wxListCtrl_GetViewRect, 1695).
--define(wxListCtrl_HitTest, 1696).
--define(wxListCtrl_InsertColumn_2, 1697).
--define(wxListCtrl_InsertColumn_3, 1698).
--define(wxListCtrl_InsertItem_1, 1699).
--define(wxListCtrl_InsertItem_2_1, 1700).
--define(wxListCtrl_InsertItem_2_0, 1701).
--define(wxListCtrl_InsertItem_3, 1702).
--define(wxListCtrl_RefreshItem, 1703).
--define(wxListCtrl_RefreshItems, 1704).
--define(wxListCtrl_ScrollList, 1705).
--define(wxListCtrl_SetBackgroundColour, 1706).
--define(wxListCtrl_SetColumn, 1707).
--define(wxListCtrl_SetColumnWidth, 1708).
--define(wxListCtrl_SetImageList, 1709).
--define(wxListCtrl_SetItem_1, 1710).
--define(wxListCtrl_SetItem_4, 1711).
--define(wxListCtrl_SetItemBackgroundColour, 1712).
--define(wxListCtrl_SetItemCount, 1713).
--define(wxListCtrl_SetItemData, 1714).
--define(wxListCtrl_SetItemFont, 1715).
--define(wxListCtrl_SetItemImage, 1716).
--define(wxListCtrl_SetItemColumnImage, 1717).
--define(wxListCtrl_SetItemPosition, 1718).
--define(wxListCtrl_SetItemState, 1719).
--define(wxListCtrl_SetItemText, 1720).
--define(wxListCtrl_SetItemTextColour, 1721).
--define(wxListCtrl_SetSingleStyle, 1722).
--define(wxListCtrl_SetTextColour, 1723).
--define(wxListCtrl_SetWindowStyleFlag, 1724).
--define(wxListCtrl_SortItems, 1725).
--define(wxListCtrl_destroy, 1726).
--define(wxListView_ClearColumnImage, 1727).
--define(wxListView_Focus, 1728).
--define(wxListView_GetFirstSelected, 1729).
--define(wxListView_GetFocusedItem, 1730).
--define(wxListView_GetNextSelected, 1731).
--define(wxListView_IsSelected, 1732).
--define(wxListView_Select, 1733).
--define(wxListView_SetColumnImage, 1734).
--define(wxListItem_new_0, 1735).
--define(wxListItem_new_1, 1736).
--define(wxListItem_destruct, 1737).
--define(wxListItem_Clear, 1738).
--define(wxListItem_GetAlign, 1739).
--define(wxListItem_GetBackgroundColour, 1740).
--define(wxListItem_GetColumn, 1741).
--define(wxListItem_GetFont, 1742).
--define(wxListItem_GetId, 1743).
--define(wxListItem_GetImage, 1744).
--define(wxListItem_GetMask, 1745).
--define(wxListItem_GetState, 1746).
--define(wxListItem_GetText, 1747).
--define(wxListItem_GetTextColour, 1748).
--define(wxListItem_GetWidth, 1749).
--define(wxListItem_SetAlign, 1750).
--define(wxListItem_SetBackgroundColour, 1751).
--define(wxListItem_SetColumn, 1752).
--define(wxListItem_SetFont, 1753).
--define(wxListItem_SetId, 1754).
--define(wxListItem_SetImage, 1755).
--define(wxListItem_SetMask, 1756).
--define(wxListItem_SetState, 1757).
--define(wxListItem_SetStateMask, 1758).
--define(wxListItem_SetText, 1759).
--define(wxListItem_SetTextColour, 1760).
--define(wxListItem_SetWidth, 1761).
--define(wxListItemAttr_new_0, 1762).
--define(wxListItemAttr_new_3, 1763).
--define(wxListItemAttr_GetBackgroundColour, 1764).
--define(wxListItemAttr_GetFont, 1765).
--define(wxListItemAttr_GetTextColour, 1766).
--define(wxListItemAttr_HasBackgroundColour, 1767).
--define(wxListItemAttr_HasFont, 1768).
--define(wxListItemAttr_HasTextColour, 1769).
--define(wxListItemAttr_SetBackgroundColour, 1770).
--define(wxListItemAttr_SetFont, 1771).
--define(wxListItemAttr_SetTextColour, 1772).
--define(wxListItemAttr_destroy, 1773).
--define(wxImageList_new_0, 1774).
--define(wxImageList_new_3, 1775).
--define(wxImageList_Add_1, 1776).
--define(wxImageList_Add_2_0, 1777).
--define(wxImageList_Add_2_1, 1778).
--define(wxImageList_Create, 1779).
--define(wxImageList_Draw, 1781).
--define(wxImageList_GetBitmap, 1782).
--define(wxImageList_GetIcon, 1783).
--define(wxImageList_GetImageCount, 1784).
--define(wxImageList_GetSize, 1785).
--define(wxImageList_Remove, 1786).
--define(wxImageList_RemoveAll, 1787).
--define(wxImageList_Replace_2, 1788).
--define(wxImageList_Replace_3, 1789).
--define(wxImageList_destroy, 1790).
--define(wxTextAttr_new_0, 1791).
--define(wxTextAttr_new_2, 1792).
--define(wxTextAttr_GetAlignment, 1793).
--define(wxTextAttr_GetBackgroundColour, 1794).
--define(wxTextAttr_GetFont, 1795).
--define(wxTextAttr_GetLeftIndent, 1796).
--define(wxTextAttr_GetLeftSubIndent, 1797).
--define(wxTextAttr_GetRightIndent, 1798).
--define(wxTextAttr_GetTabs, 1799).
--define(wxTextAttr_GetTextColour, 1800).
--define(wxTextAttr_HasBackgroundColour, 1801).
--define(wxTextAttr_HasFont, 1802).
--define(wxTextAttr_HasTextColour, 1803).
--define(wxTextAttr_GetFlags, 1804).
--define(wxTextAttr_IsDefault, 1805).
--define(wxTextAttr_SetAlignment, 1806).
--define(wxTextAttr_SetBackgroundColour, 1807).
--define(wxTextAttr_SetFlags, 1808).
--define(wxTextAttr_SetFont, 1809).
--define(wxTextAttr_SetLeftIndent, 1810).
--define(wxTextAttr_SetRightIndent, 1811).
--define(wxTextAttr_SetTabs, 1812).
--define(wxTextAttr_SetTextColour, 1813).
--define(wxTextAttr_destroy, 1814).
--define(wxTextCtrl_new_3, 1816).
--define(wxTextCtrl_new_0, 1817).
--define(wxTextCtrl_destruct, 1819).
--define(wxTextCtrl_AppendText, 1820).
--define(wxTextCtrl_CanCopy, 1821).
--define(wxTextCtrl_CanCut, 1822).
--define(wxTextCtrl_CanPaste, 1823).
--define(wxTextCtrl_CanRedo, 1824).
--define(wxTextCtrl_CanUndo, 1825).
--define(wxTextCtrl_Clear, 1826).
--define(wxTextCtrl_Copy, 1827).
--define(wxTextCtrl_Create, 1828).
--define(wxTextCtrl_Cut, 1829).
--define(wxTextCtrl_DiscardEdits, 1830).
--define(wxTextCtrl_ChangeValue, 1831).
--define(wxTextCtrl_EmulateKeyPress, 1832).
--define(wxTextCtrl_GetDefaultStyle, 1833).
--define(wxTextCtrl_GetInsertionPoint, 1834).
--define(wxTextCtrl_GetLastPosition, 1835).
--define(wxTextCtrl_GetLineLength, 1836).
--define(wxTextCtrl_GetLineText, 1837).
--define(wxTextCtrl_GetNumberOfLines, 1838).
--define(wxTextCtrl_GetRange, 1839).
--define(wxTextCtrl_GetSelection, 1840).
--define(wxTextCtrl_GetStringSelection, 1841).
--define(wxTextCtrl_GetStyle, 1842).
--define(wxTextCtrl_GetValue, 1843).
--define(wxTextCtrl_IsEditable, 1844).
--define(wxTextCtrl_IsModified, 1845).
--define(wxTextCtrl_IsMultiLine, 1846).
--define(wxTextCtrl_IsSingleLine, 1847).
--define(wxTextCtrl_LoadFile, 1848).
--define(wxTextCtrl_MarkDirty, 1849).
--define(wxTextCtrl_Paste, 1850).
--define(wxTextCtrl_PositionToXY, 1851).
--define(wxTextCtrl_Redo, 1852).
--define(wxTextCtrl_Remove, 1853).
--define(wxTextCtrl_Replace, 1854).
--define(wxTextCtrl_SaveFile, 1855).
--define(wxTextCtrl_SetDefaultStyle, 1856).
--define(wxTextCtrl_SetEditable, 1857).
--define(wxTextCtrl_SetInsertionPoint, 1858).
--define(wxTextCtrl_SetInsertionPointEnd, 1859).
--define(wxTextCtrl_SetMaxLength, 1861).
--define(wxTextCtrl_SetSelection, 1862).
--define(wxTextCtrl_SetStyle, 1863).
--define(wxTextCtrl_SetValue, 1864).
--define(wxTextCtrl_ShowPosition, 1865).
--define(wxTextCtrl_Undo, 1866).
--define(wxTextCtrl_WriteText, 1867).
--define(wxTextCtrl_XYToPosition, 1868).
--define(wxNotebook_new_0, 1871).
--define(wxNotebook_new_3, 1872).
--define(wxNotebook_destruct, 1873).
--define(wxNotebook_AddPage, 1874).
--define(wxNotebook_AdvanceSelection, 1875).
--define(wxNotebook_AssignImageList, 1876).
--define(wxNotebook_Create, 1877).
--define(wxNotebook_DeleteAllPages, 1878).
--define(wxNotebook_DeletePage, 1879).
--define(wxNotebook_RemovePage, 1880).
--define(wxNotebook_GetCurrentPage, 1881).
--define(wxNotebook_GetImageList, 1882).
--define(wxNotebook_GetPage, 1884).
--define(wxNotebook_GetPageCount, 1885).
--define(wxNotebook_GetPageImage, 1886).
--define(wxNotebook_GetPageText, 1887).
--define(wxNotebook_GetRowCount, 1888).
--define(wxNotebook_GetSelection, 1889).
--define(wxNotebook_GetThemeBackgroundColour, 1890).
--define(wxNotebook_HitTest, 1892).
--define(wxNotebook_InsertPage, 1894).
--define(wxNotebook_SetImageList, 1895).
--define(wxNotebook_SetPadding, 1896).
--define(wxNotebook_SetPageSize, 1897).
--define(wxNotebook_SetPageImage, 1898).
--define(wxNotebook_SetPageText, 1899).
--define(wxNotebook_SetSelection, 1900).
--define(wxNotebook_ChangeSelection, 1901).
--define(wxChoicebook_new_0, 1902).
--define(wxChoicebook_new_3, 1903).
--define(wxChoicebook_AddPage, 1904).
--define(wxChoicebook_AdvanceSelection, 1905).
--define(wxChoicebook_AssignImageList, 1906).
--define(wxChoicebook_Create, 1907).
--define(wxChoicebook_DeleteAllPages, 1908).
--define(wxChoicebook_DeletePage, 1909).
--define(wxChoicebook_RemovePage, 1910).
--define(wxChoicebook_GetCurrentPage, 1911).
--define(wxChoicebook_GetImageList, 1912).
--define(wxChoicebook_GetPage, 1914).
--define(wxChoicebook_GetPageCount, 1915).
--define(wxChoicebook_GetPageImage, 1916).
--define(wxChoicebook_GetPageText, 1917).
--define(wxChoicebook_GetSelection, 1918).
--define(wxChoicebook_HitTest, 1919).
--define(wxChoicebook_InsertPage, 1920).
--define(wxChoicebook_SetImageList, 1921).
--define(wxChoicebook_SetPageSize, 1922).
--define(wxChoicebook_SetPageImage, 1923).
--define(wxChoicebook_SetPageText, 1924).
--define(wxChoicebook_SetSelection, 1925).
--define(wxChoicebook_ChangeSelection, 1926).
--define(wxChoicebook_destroy, 1927).
--define(wxToolbook_new_0, 1928).
--define(wxToolbook_new_3, 1929).
--define(wxToolbook_AddPage, 1930).
--define(wxToolbook_AdvanceSelection, 1931).
--define(wxToolbook_AssignImageList, 1932).
--define(wxToolbook_Create, 1933).
--define(wxToolbook_DeleteAllPages, 1934).
--define(wxToolbook_DeletePage, 1935).
--define(wxToolbook_RemovePage, 1936).
--define(wxToolbook_GetCurrentPage, 1937).
--define(wxToolbook_GetImageList, 1938).
--define(wxToolbook_GetPage, 1940).
--define(wxToolbook_GetPageCount, 1941).
--define(wxToolbook_GetPageImage, 1942).
--define(wxToolbook_GetPageText, 1943).
--define(wxToolbook_GetSelection, 1944).
--define(wxToolbook_HitTest, 1946).
--define(wxToolbook_InsertPage, 1947).
--define(wxToolbook_SetImageList, 1948).
--define(wxToolbook_SetPageSize, 1949).
--define(wxToolbook_SetPageImage, 1950).
--define(wxToolbook_SetPageText, 1951).
--define(wxToolbook_SetSelection, 1952).
--define(wxToolbook_ChangeSelection, 1953).
--define(wxToolbook_destroy, 1954).
--define(wxListbook_new_0, 1955).
--define(wxListbook_new_3, 1956).
--define(wxListbook_AddPage, 1957).
--define(wxListbook_AdvanceSelection, 1958).
--define(wxListbook_AssignImageList, 1959).
--define(wxListbook_Create, 1960).
--define(wxListbook_DeleteAllPages, 1961).
--define(wxListbook_DeletePage, 1962).
--define(wxListbook_RemovePage, 1963).
--define(wxListbook_GetCurrentPage, 1964).
--define(wxListbook_GetImageList, 1965).
--define(wxListbook_GetPage, 1967).
--define(wxListbook_GetPageCount, 1968).
--define(wxListbook_GetPageImage, 1969).
--define(wxListbook_GetPageText, 1970).
--define(wxListbook_GetSelection, 1971).
--define(wxListbook_HitTest, 1973).
--define(wxListbook_InsertPage, 1974).
--define(wxListbook_SetImageList, 1975).
--define(wxListbook_SetPageSize, 1976).
--define(wxListbook_SetPageImage, 1977).
--define(wxListbook_SetPageText, 1978).
--define(wxListbook_SetSelection, 1979).
--define(wxListbook_ChangeSelection, 1980).
--define(wxListbook_destroy, 1981).
--define(wxTreebook_new_0, 1982).
--define(wxTreebook_new_3, 1983).
--define(wxTreebook_AddPage, 1984).
--define(wxTreebook_AdvanceSelection, 1985).
--define(wxTreebook_AssignImageList, 1986).
--define(wxTreebook_Create, 1987).
--define(wxTreebook_DeleteAllPages, 1988).
--define(wxTreebook_DeletePage, 1989).
--define(wxTreebook_RemovePage, 1990).
--define(wxTreebook_GetCurrentPage, 1991).
--define(wxTreebook_GetImageList, 1992).
--define(wxTreebook_GetPage, 1994).
--define(wxTreebook_GetPageCount, 1995).
--define(wxTreebook_GetPageImage, 1996).
--define(wxTreebook_GetPageText, 1997).
--define(wxTreebook_GetSelection, 1998).
--define(wxTreebook_ExpandNode, 1999).
--define(wxTreebook_IsNodeExpanded, 2000).
--define(wxTreebook_HitTest, 2002).
--define(wxTreebook_InsertPage, 2003).
--define(wxTreebook_InsertSubPage, 2004).
--define(wxTreebook_SetImageList, 2005).
--define(wxTreebook_SetPageSize, 2006).
--define(wxTreebook_SetPageImage, 2007).
--define(wxTreebook_SetPageText, 2008).
--define(wxTreebook_SetSelection, 2009).
--define(wxTreebook_ChangeSelection, 2010).
--define(wxTreebook_destroy, 2011).
--define(wxTreeCtrl_new_2, 2014).
--define(wxTreeCtrl_new_0, 2015).
--define(wxTreeCtrl_destruct, 2017).
--define(wxTreeCtrl_AddRoot, 2018).
--define(wxTreeCtrl_AppendItem, 2019).
--define(wxTreeCtrl_AssignImageList, 2020).
--define(wxTreeCtrl_AssignStateImageList, 2021).
--define(wxTreeCtrl_Collapse, 2022).
--define(wxTreeCtrl_CollapseAndReset, 2023).
--define(wxTreeCtrl_Create, 2024).
--define(wxTreeCtrl_Delete, 2025).
--define(wxTreeCtrl_DeleteAllItems, 2026).
--define(wxTreeCtrl_DeleteChildren, 2027).
--define(wxTreeCtrl_EditLabel, 2028).
--define(wxTreeCtrl_EnsureVisible, 2029).
--define(wxTreeCtrl_Expand, 2030).
--define(wxTreeCtrl_GetBoundingRect, 2031).
--define(wxTreeCtrl_GetChildrenCount, 2033).
--define(wxTreeCtrl_GetCount, 2034).
--define(wxTreeCtrl_GetEditControl, 2035).
--define(wxTreeCtrl_GetFirstChild, 2036).
--define(wxTreeCtrl_GetNextChild, 2037).
--define(wxTreeCtrl_GetFirstVisibleItem, 2038).
--define(wxTreeCtrl_GetImageList, 2039).
--define(wxTreeCtrl_GetIndent, 2040).
--define(wxTreeCtrl_GetItemBackgroundColour, 2041).
--define(wxTreeCtrl_GetItemData, 2042).
--define(wxTreeCtrl_GetItemFont, 2043).
--define(wxTreeCtrl_GetItemImage_1, 2044).
--define(wxTreeCtrl_GetItemImage_2, 2045).
--define(wxTreeCtrl_GetItemText, 2046).
--define(wxTreeCtrl_GetItemTextColour, 2047).
--define(wxTreeCtrl_GetLastChild, 2048).
--define(wxTreeCtrl_GetNextSibling, 2049).
--define(wxTreeCtrl_GetNextVisible, 2050).
--define(wxTreeCtrl_GetItemParent, 2051).
--define(wxTreeCtrl_GetPrevSibling, 2052).
--define(wxTreeCtrl_GetPrevVisible, 2053).
--define(wxTreeCtrl_GetRootItem, 2054).
--define(wxTreeCtrl_GetSelection, 2055).
--define(wxTreeCtrl_GetSelections, 2056).
--define(wxTreeCtrl_GetStateImageList, 2057).
--define(wxTreeCtrl_HitTest, 2058).
--define(wxTreeCtrl_InsertItem, 2060).
--define(wxTreeCtrl_IsBold, 2061).
--define(wxTreeCtrl_IsExpanded, 2062).
--define(wxTreeCtrl_IsSelected, 2063).
--define(wxTreeCtrl_IsVisible, 2064).
--define(wxTreeCtrl_ItemHasChildren, 2065).
--define(wxTreeCtrl_IsTreeItemIdOk, 2066).
--define(wxTreeCtrl_PrependItem, 2067).
--define(wxTreeCtrl_ScrollTo, 2068).
--define(wxTreeCtrl_SelectItem_1, 2069).
--define(wxTreeCtrl_SelectItem_2, 2070).
--define(wxTreeCtrl_SetIndent, 2071).
--define(wxTreeCtrl_SetImageList, 2072).
--define(wxTreeCtrl_SetItemBackgroundColour, 2073).
--define(wxTreeCtrl_SetItemBold, 2074).
--define(wxTreeCtrl_SetItemData, 2075).
--define(wxTreeCtrl_SetItemDropHighlight, 2076).
--define(wxTreeCtrl_SetItemFont, 2077).
--define(wxTreeCtrl_SetItemHasChildren, 2078).
--define(wxTreeCtrl_SetItemImage_2, 2079).
--define(wxTreeCtrl_SetItemImage_3, 2080).
--define(wxTreeCtrl_SetItemText, 2081).
--define(wxTreeCtrl_SetItemTextColour, 2082).
--define(wxTreeCtrl_SetStateImageList, 2083).
--define(wxTreeCtrl_SetWindowStyle, 2084).
--define(wxTreeCtrl_SortChildren, 2085).
--define(wxTreeCtrl_Toggle, 2086).
--define(wxTreeCtrl_ToggleItemSelection, 2087).
--define(wxTreeCtrl_Unselect, 2088).
--define(wxTreeCtrl_UnselectAll, 2089).
--define(wxTreeCtrl_UnselectItem, 2090).
--define(wxScrollBar_new_0, 2091).
--define(wxScrollBar_new_3, 2092).
--define(wxScrollBar_destruct, 2093).
--define(wxScrollBar_Create, 2094).
--define(wxScrollBar_GetRange, 2095).
--define(wxScrollBar_GetPageSize, 2096).
--define(wxScrollBar_GetThumbPosition, 2097).
--define(wxScrollBar_GetThumbSize, 2098).
--define(wxScrollBar_SetThumbPosition, 2099).
--define(wxScrollBar_SetScrollbar, 2100).
--define(wxSpinButton_new_2, 2102).
--define(wxSpinButton_new_0, 2103).
--define(wxSpinButton_Create, 2104).
--define(wxSpinButton_GetMax, 2105).
--define(wxSpinButton_GetMin, 2106).
--define(wxSpinButton_GetValue, 2107).
--define(wxSpinButton_SetRange, 2108).
--define(wxSpinButton_SetValue, 2109).
--define(wxSpinButton_destroy, 2110).
--define(wxSpinCtrl_new_0, 2111).
--define(wxSpinCtrl_new_2, 2112).
--define(wxSpinCtrl_Create, 2114).
--define(wxSpinCtrl_SetValue_1_1, 2117).
--define(wxSpinCtrl_SetValue_1_0, 2118).
--define(wxSpinCtrl_GetValue, 2120).
--define(wxSpinCtrl_SetRange, 2122).
--define(wxSpinCtrl_SetSelection, 2123).
--define(wxSpinCtrl_GetMin, 2125).
--define(wxSpinCtrl_GetMax, 2127).
--define(wxSpinCtrl_destroy, 2128).
--define(wxStaticText_new_0, 2129).
--define(wxStaticText_new_4, 2130).
--define(wxStaticText_Create, 2131).
--define(wxStaticText_GetLabel, 2132).
--define(wxStaticText_SetLabel, 2133).
--define(wxStaticText_Wrap, 2134).
--define(wxStaticText_destroy, 2135).
--define(wxStaticBitmap_new_0, 2136).
--define(wxStaticBitmap_new_4, 2137).
--define(wxStaticBitmap_Create, 2138).
--define(wxStaticBitmap_GetBitmap, 2139).
--define(wxStaticBitmap_SetBitmap, 2140).
--define(wxStaticBitmap_destroy, 2141).
--define(wxRadioBox_new, 2142).
--define(wxRadioBox_destruct, 2144).
--define(wxRadioBox_Create, 2145).
--define(wxRadioBox_Enable_2, 2146).
--define(wxRadioBox_Enable_1, 2147).
--define(wxRadioBox_GetSelection, 2148).
--define(wxRadioBox_GetString, 2149).
--define(wxRadioBox_SetSelection, 2150).
--define(wxRadioBox_Show_2, 2151).
--define(wxRadioBox_Show_1, 2152).
--define(wxRadioBox_GetColumnCount, 2153).
--define(wxRadioBox_GetItemHelpText, 2154).
--define(wxRadioBox_GetItemToolTip, 2155).
--define(wxRadioBox_GetItemFromPoint, 2157).
--define(wxRadioBox_GetRowCount, 2158).
--define(wxRadioBox_IsItemEnabled, 2159).
--define(wxRadioBox_IsItemShown, 2160).
--define(wxRadioBox_SetItemHelpText, 2161).
--define(wxRadioBox_SetItemToolTip, 2162).
--define(wxRadioButton_new_0, 2163).
--define(wxRadioButton_new_4, 2164).
--define(wxRadioButton_Create, 2165).
--define(wxRadioButton_GetValue, 2166).
--define(wxRadioButton_SetValue, 2167).
--define(wxRadioButton_destroy, 2168).
--define(wxSlider_new_6, 2170).
--define(wxSlider_new_0, 2171).
--define(wxSlider_Create, 2172).
--define(wxSlider_GetLineSize, 2173).
--define(wxSlider_GetMax, 2174).
--define(wxSlider_GetMin, 2175).
--define(wxSlider_GetPageSize, 2176).
--define(wxSlider_GetThumbLength, 2177).
--define(wxSlider_GetValue, 2178).
--define(wxSlider_SetLineSize, 2179).
--define(wxSlider_SetPageSize, 2180).
--define(wxSlider_SetRange, 2181).
--define(wxSlider_SetThumbLength, 2182).
--define(wxSlider_SetValue, 2183).
--define(wxSlider_destroy, 2184).
--define(wxDialog_new_4, 2186).
--define(wxDialog_new_0, 2187).
--define(wxDialog_destruct, 2189).
--define(wxDialog_Create, 2190).
--define(wxDialog_CreateButtonSizer, 2191).
--define(wxDialog_CreateStdDialogButtonSizer, 2192).
--define(wxDialog_EndModal, 2193).
--define(wxDialog_GetAffirmativeId, 2194).
--define(wxDialog_GetReturnCode, 2195).
--define(wxDialog_IsModal, 2196).
--define(wxDialog_SetAffirmativeId, 2197).
--define(wxDialog_SetReturnCode, 2198).
--define(wxDialog_Show, 2199).
--define(wxDialog_ShowModal, 2200).
--define(wxColourDialog_new_0, 2201).
--define(wxColourDialog_new_2, 2202).
--define(wxColourDialog_destruct, 2203).
--define(wxColourDialog_Create, 2204).
--define(wxColourDialog_GetColourData, 2205).
--define(wxColourData_new_0, 2206).
--define(wxColourData_new_1, 2207).
--define(wxColourData_destruct, 2208).
--define(wxColourData_GetChooseFull, 2209).
--define(wxColourData_GetColour, 2210).
--define(wxColourData_GetCustomColour, 2212).
--define(wxColourData_SetChooseFull, 2213).
--define(wxColourData_SetColour, 2214).
--define(wxColourData_SetCustomColour, 2215).
--define(wxPalette_new_0, 2216).
--define(wxPalette_new_4, 2217).
--define(wxPalette_destruct, 2219).
--define(wxPalette_Create, 2220).
--define(wxPalette_GetColoursCount, 2221).
--define(wxPalette_GetPixel, 2222).
--define(wxPalette_GetRGB, 2223).
--define(wxPalette_IsOk, 2224).
--define(wxDirDialog_new, 2228).
--define(wxDirDialog_destruct, 2229).
--define(wxDirDialog_GetPath, 2230).
--define(wxDirDialog_GetMessage, 2231).
--define(wxDirDialog_SetMessage, 2232).
--define(wxDirDialog_SetPath, 2233).
--define(wxFileDialog_new, 2237).
--define(wxFileDialog_destruct, 2238).
--define(wxFileDialog_GetDirectory, 2239).
--define(wxFileDialog_GetFilename, 2240).
--define(wxFileDialog_GetFilenames, 2241).
--define(wxFileDialog_GetFilterIndex, 2242).
--define(wxFileDialog_GetMessage, 2243).
--define(wxFileDialog_GetPath, 2244).
--define(wxFileDialog_GetPaths, 2245).
--define(wxFileDialog_GetWildcard, 2246).
--define(wxFileDialog_SetDirectory, 2247).
--define(wxFileDialog_SetFilename, 2248).
--define(wxFileDialog_SetFilterIndex, 2249).
--define(wxFileDialog_SetMessage, 2250).
--define(wxFileDialog_SetPath, 2251).
--define(wxFileDialog_SetWildcard, 2252).
--define(wxPickerBase_SetInternalMargin, 2253).
--define(wxPickerBase_GetInternalMargin, 2254).
--define(wxPickerBase_SetTextCtrlProportion, 2255).
--define(wxPickerBase_SetPickerCtrlProportion, 2256).
--define(wxPickerBase_GetTextCtrlProportion, 2257).
--define(wxPickerBase_GetPickerCtrlProportion, 2258).
--define(wxPickerBase_HasTextCtrl, 2259).
--define(wxPickerBase_GetTextCtrl, 2260).
--define(wxPickerBase_IsTextCtrlGrowable, 2261).
--define(wxPickerBase_SetPickerCtrlGrowable, 2262).
--define(wxPickerBase_SetTextCtrlGrowable, 2263).
--define(wxPickerBase_IsPickerCtrlGrowable, 2264).
--define(wxFilePickerCtrl_new_0, 2265).
--define(wxFilePickerCtrl_new_3, 2266).
--define(wxFilePickerCtrl_Create, 2267).
--define(wxFilePickerCtrl_GetPath, 2268).
--define(wxFilePickerCtrl_SetPath, 2269).
--define(wxFilePickerCtrl_destroy, 2270).
--define(wxDirPickerCtrl_new_0, 2271).
--define(wxDirPickerCtrl_new_3, 2272).
--define(wxDirPickerCtrl_Create, 2273).
--define(wxDirPickerCtrl_GetPath, 2274).
--define(wxDirPickerCtrl_SetPath, 2275).
--define(wxDirPickerCtrl_destroy, 2276).
--define(wxColourPickerCtrl_new_0, 2277).
--define(wxColourPickerCtrl_new_3, 2278).
--define(wxColourPickerCtrl_Create, 2279).
--define(wxColourPickerCtrl_GetColour, 2280).
--define(wxColourPickerCtrl_SetColour_1_1, 2281).
--define(wxColourPickerCtrl_SetColour_1_0, 2282).
--define(wxColourPickerCtrl_destroy, 2283).
--define(wxDatePickerCtrl_new_0, 2284).
--define(wxDatePickerCtrl_new_3, 2285).
--define(wxDatePickerCtrl_GetRange, 2286).
--define(wxDatePickerCtrl_GetValue, 2287).
--define(wxDatePickerCtrl_SetRange, 2288).
--define(wxDatePickerCtrl_SetValue, 2289).
--define(wxDatePickerCtrl_destroy, 2290).
--define(wxFontPickerCtrl_new_0, 2291).
--define(wxFontPickerCtrl_new_3, 2292).
--define(wxFontPickerCtrl_Create, 2293).
--define(wxFontPickerCtrl_GetSelectedFont, 2294).
--define(wxFontPickerCtrl_SetSelectedFont, 2295).
--define(wxFontPickerCtrl_GetMaxPointSize, 2296).
--define(wxFontPickerCtrl_SetMaxPointSize, 2297).
--define(wxFontPickerCtrl_destroy, 2298).
--define(wxFindReplaceDialog_new_0, 2301).
--define(wxFindReplaceDialog_new_4, 2302).
--define(wxFindReplaceDialog_destruct, 2303).
--define(wxFindReplaceDialog_Create, 2304).
--define(wxFindReplaceDialog_GetData, 2305).
--define(wxFindReplaceData_new_0, 2306).
--define(wxFindReplaceData_new_1, 2307).
--define(wxFindReplaceData_GetFindString, 2308).
--define(wxFindReplaceData_GetReplaceString, 2309).
--define(wxFindReplaceData_GetFlags, 2310).
--define(wxFindReplaceData_SetFlags, 2311).
--define(wxFindReplaceData_SetFindString, 2312).
--define(wxFindReplaceData_SetReplaceString, 2313).
--define(wxFindReplaceData_destroy, 2314).
--define(wxMultiChoiceDialog_new_0, 2315).
--define(wxMultiChoiceDialog_new_5, 2317).
--define(wxMultiChoiceDialog_GetSelections, 2318).
--define(wxMultiChoiceDialog_SetSelections, 2319).
--define(wxMultiChoiceDialog_destroy, 2320).
--define(wxSingleChoiceDialog_new_0, 2321).
--define(wxSingleChoiceDialog_new_5, 2323).
--define(wxSingleChoiceDialog_GetSelection, 2324).
--define(wxSingleChoiceDialog_GetStringSelection, 2325).
--define(wxSingleChoiceDialog_SetSelection, 2326).
--define(wxSingleChoiceDialog_destroy, 2327).
--define(wxTextEntryDialog_new, 2328).
--define(wxTextEntryDialog_GetValue, 2329).
--define(wxTextEntryDialog_SetValue, 2330).
--define(wxTextEntryDialog_destroy, 2331).
--define(wxPasswordEntryDialog_new, 2332).
--define(wxPasswordEntryDialog_destroy, 2333).
--define(wxFontData_new_0, 2334).
--define(wxFontData_new_1, 2335).
--define(wxFontData_destruct, 2336).
--define(wxFontData_EnableEffects, 2337).
--define(wxFontData_GetAllowSymbols, 2338).
--define(wxFontData_GetColour, 2339).
--define(wxFontData_GetChosenFont, 2340).
--define(wxFontData_GetEnableEffects, 2341).
--define(wxFontData_GetInitialFont, 2342).
--define(wxFontData_GetShowHelp, 2343).
--define(wxFontData_SetAllowSymbols, 2344).
--define(wxFontData_SetChosenFont, 2345).
--define(wxFontData_SetColour, 2346).
--define(wxFontData_SetInitialFont, 2347).
--define(wxFontData_SetRange, 2348).
--define(wxFontData_SetShowHelp, 2349).
--define(wxFontDialog_new_0, 2353).
--define(wxFontDialog_new_2, 2355).
--define(wxFontDialog_Create, 2357).
--define(wxFontDialog_GetFontData, 2358).
--define(wxFontDialog_destroy, 2360).
--define(wxProgressDialog_new, 2361).
--define(wxProgressDialog_destruct, 2362).
--define(wxProgressDialog_Resume, 2363).
--define(wxProgressDialog_Update_2, 2364).
--define(wxProgressDialog_Update_0, 2365).
--define(wxMessageDialog_new, 2366).
--define(wxMessageDialog_destruct, 2367).
--define(wxPageSetupDialog_new, 2368).
--define(wxPageSetupDialog_destruct, 2369).
--define(wxPageSetupDialog_GetPageSetupData, 2370).
--define(wxPageSetupDialog_ShowModal, 2371).
--define(wxPageSetupDialogData_new_0, 2372).
--define(wxPageSetupDialogData_new_1_0, 2373).
--define(wxPageSetupDialogData_new_1_1, 2374).
--define(wxPageSetupDialogData_destruct, 2375).
--define(wxPageSetupDialogData_EnableHelp, 2376).
--define(wxPageSetupDialogData_EnableMargins, 2377).
--define(wxPageSetupDialogData_EnableOrientation, 2378).
--define(wxPageSetupDialogData_EnablePaper, 2379).
--define(wxPageSetupDialogData_EnablePrinter, 2380).
--define(wxPageSetupDialogData_GetDefaultMinMargins, 2381).
--define(wxPageSetupDialogData_GetEnableMargins, 2382).
--define(wxPageSetupDialogData_GetEnableOrientation, 2383).
--define(wxPageSetupDialogData_GetEnablePaper, 2384).
--define(wxPageSetupDialogData_GetEnablePrinter, 2385).
--define(wxPageSetupDialogData_GetEnableHelp, 2386).
--define(wxPageSetupDialogData_GetDefaultInfo, 2387).
--define(wxPageSetupDialogData_GetMarginTopLeft, 2388).
--define(wxPageSetupDialogData_GetMarginBottomRight, 2389).
--define(wxPageSetupDialogData_GetMinMarginTopLeft, 2390).
--define(wxPageSetupDialogData_GetMinMarginBottomRight, 2391).
--define(wxPageSetupDialogData_GetPaperId, 2392).
--define(wxPageSetupDialogData_GetPaperSize, 2393).
--define(wxPageSetupDialogData_GetPrintData, 2395).
--define(wxPageSetupDialogData_IsOk, 2396).
--define(wxPageSetupDialogData_SetDefaultInfo, 2397).
--define(wxPageSetupDialogData_SetDefaultMinMargins, 2398).
--define(wxPageSetupDialogData_SetMarginTopLeft, 2399).
--define(wxPageSetupDialogData_SetMarginBottomRight, 2400).
--define(wxPageSetupDialogData_SetMinMarginTopLeft, 2401).
--define(wxPageSetupDialogData_SetMinMarginBottomRight, 2402).
--define(wxPageSetupDialogData_SetPaperId, 2403).
--define(wxPageSetupDialogData_SetPaperSize_1_1, 2404).
--define(wxPageSetupDialogData_SetPaperSize_1_0, 2405).
--define(wxPageSetupDialogData_SetPrintData, 2406).
--define(wxPrintDialog_new_2_0, 2407).
--define(wxPrintDialog_new_2_1, 2408).
--define(wxPrintDialog_destruct, 2409).
--define(wxPrintDialog_GetPrintDialogData, 2410).
--define(wxPrintDialog_GetPrintDC, 2411).
--define(wxPrintDialogData_new_0, 2412).
--define(wxPrintDialogData_new_1_1, 2413).
--define(wxPrintDialogData_new_1_0, 2414).
--define(wxPrintDialogData_destruct, 2415).
--define(wxPrintDialogData_EnableHelp, 2416).
--define(wxPrintDialogData_EnablePageNumbers, 2417).
--define(wxPrintDialogData_EnablePrintToFile, 2418).
--define(wxPrintDialogData_EnableSelection, 2419).
--define(wxPrintDialogData_GetAllPages, 2420).
--define(wxPrintDialogData_GetCollate, 2421).
--define(wxPrintDialogData_GetFromPage, 2422).
--define(wxPrintDialogData_GetMaxPage, 2423).
--define(wxPrintDialogData_GetMinPage, 2424).
--define(wxPrintDialogData_GetNoCopies, 2425).
--define(wxPrintDialogData_GetPrintData, 2426).
--define(wxPrintDialogData_GetPrintToFile, 2427).
--define(wxPrintDialogData_GetSelection, 2428).
--define(wxPrintDialogData_GetToPage, 2429).
--define(wxPrintDialogData_IsOk, 2430).
--define(wxPrintDialogData_SetCollate, 2431).
--define(wxPrintDialogData_SetFromPage, 2432).
--define(wxPrintDialogData_SetMaxPage, 2433).
--define(wxPrintDialogData_SetMinPage, 2434).
--define(wxPrintDialogData_SetNoCopies, 2435).
--define(wxPrintDialogData_SetPrintData, 2436).
--define(wxPrintDialogData_SetPrintToFile, 2437).
--define(wxPrintDialogData_SetSelection, 2438).
--define(wxPrintDialogData_SetToPage, 2439).
--define(wxPrintData_new_0, 2440).
--define(wxPrintData_new_1, 2441).
--define(wxPrintData_destruct, 2442).
--define(wxPrintData_GetCollate, 2443).
--define(wxPrintData_GetBin, 2444).
--define(wxPrintData_GetColour, 2445).
--define(wxPrintData_GetDuplex, 2446).
--define(wxPrintData_GetNoCopies, 2447).
--define(wxPrintData_GetOrientation, 2448).
--define(wxPrintData_GetPaperId, 2449).
--define(wxPrintData_GetPrinterName, 2450).
--define(wxPrintData_GetQuality, 2451).
--define(wxPrintData_IsOk, 2452).
--define(wxPrintData_SetBin, 2453).
--define(wxPrintData_SetCollate, 2454).
--define(wxPrintData_SetColour, 2455).
--define(wxPrintData_SetDuplex, 2456).
--define(wxPrintData_SetNoCopies, 2457).
--define(wxPrintData_SetOrientation, 2458).
--define(wxPrintData_SetPaperId, 2459).
--define(wxPrintData_SetPrinterName, 2460).
--define(wxPrintData_SetQuality, 2461).
--define(wxPrintPreview_new_2, 2464).
--define(wxPrintPreview_new_3, 2465).
--define(wxPrintPreview_destruct, 2467).
--define(wxPrintPreview_GetCanvas, 2468).
--define(wxPrintPreview_GetCurrentPage, 2469).
--define(wxPrintPreview_GetFrame, 2470).
--define(wxPrintPreview_GetMaxPage, 2471).
--define(wxPrintPreview_GetMinPage, 2472).
--define(wxPrintPreview_GetPrintout, 2473).
--define(wxPrintPreview_GetPrintoutForPrinting, 2474).
--define(wxPrintPreview_IsOk, 2475).
--define(wxPrintPreview_PaintPage, 2476).
--define(wxPrintPreview_Print, 2477).
--define(wxPrintPreview_RenderPage, 2478).
--define(wxPrintPreview_SetCanvas, 2479).
--define(wxPrintPreview_SetCurrentPage, 2480).
--define(wxPrintPreview_SetFrame, 2481).
--define(wxPrintPreview_SetPrintout, 2482).
--define(wxPrintPreview_SetZoom, 2483).
--define(wxPreviewFrame_new, 2484).
--define(wxPreviewFrame_destruct, 2485).
--define(wxPreviewFrame_CreateControlBar, 2486).
--define(wxPreviewFrame_CreateCanvas, 2487).
--define(wxPreviewFrame_Initialize, 2488).
--define(wxPreviewFrame_OnCloseWindow, 2489).
--define(wxPreviewControlBar_new, 2490).
--define(wxPreviewControlBar_destruct, 2491).
--define(wxPreviewControlBar_CreateButtons, 2492).
--define(wxPreviewControlBar_GetPrintPreview, 2493).
--define(wxPreviewControlBar_GetZoomControl, 2494).
--define(wxPreviewControlBar_SetZoomControl, 2495).
--define(wxPrinter_new, 2497).
--define(wxPrinter_CreateAbortWindow, 2498).
--define(wxPrinter_GetAbort, 2499).
--define(wxPrinter_GetLastError, 2500).
--define(wxPrinter_GetPrintDialogData, 2501).
--define(wxPrinter_Print, 2502).
--define(wxPrinter_PrintDialog, 2503).
--define(wxPrinter_ReportError, 2504).
--define(wxPrinter_Setup, 2505).
--define(wxPrinter_destroy, 2506).
--define(wxXmlResource_new_1, 2507).
--define(wxXmlResource_new_2, 2508).
--define(wxXmlResource_destruct, 2509).
--define(wxXmlResource_AttachUnknownControl, 2510).
--define(wxXmlResource_ClearHandlers, 2511).
--define(wxXmlResource_CompareVersion, 2512).
--define(wxXmlResource_Get, 2513).
--define(wxXmlResource_GetFlags, 2514).
--define(wxXmlResource_GetVersion, 2515).
--define(wxXmlResource_GetXRCID, 2516).
--define(wxXmlResource_InitAllHandlers, 2517).
--define(wxXmlResource_Load, 2518).
--define(wxXmlResource_LoadBitmap, 2519).
--define(wxXmlResource_LoadDialog_2, 2520).
--define(wxXmlResource_LoadDialog_3, 2521).
--define(wxXmlResource_LoadFrame_2, 2522).
--define(wxXmlResource_LoadFrame_3, 2523).
--define(wxXmlResource_LoadIcon, 2524).
--define(wxXmlResource_LoadMenu, 2525).
--define(wxXmlResource_LoadMenuBar_2, 2526).
--define(wxXmlResource_LoadMenuBar_1, 2527).
--define(wxXmlResource_LoadPanel_2, 2528).
--define(wxXmlResource_LoadPanel_3, 2529).
--define(wxXmlResource_LoadToolBar, 2530).
--define(wxXmlResource_Set, 2531).
--define(wxXmlResource_SetFlags, 2532).
--define(wxXmlResource_Unload, 2533).
--define(wxXmlResource_xrcctrl, 2534).
--define(wxHtmlEasyPrinting_new, 2535).
--define(wxHtmlEasyPrinting_destruct, 2536).
--define(wxHtmlEasyPrinting_GetPrintData, 2537).
--define(wxHtmlEasyPrinting_GetPageSetupData, 2538).
--define(wxHtmlEasyPrinting_PreviewFile, 2539).
--define(wxHtmlEasyPrinting_PreviewText, 2540).
--define(wxHtmlEasyPrinting_PrintFile, 2541).
--define(wxHtmlEasyPrinting_PrintText, 2542).
--define(wxHtmlEasyPrinting_PageSetup, 2543).
--define(wxHtmlEasyPrinting_SetFonts, 2544).
--define(wxHtmlEasyPrinting_SetHeader, 2545).
--define(wxHtmlEasyPrinting_SetFooter, 2546).
--define(wxGLCanvas_new_2, 2548).
--define(wxGLCanvas_new_3_1, 2549).
--define(wxGLCanvas_new_3_0, 2550).
--define(wxGLCanvas_GetContext, 2551).
--define(wxGLCanvas_SetCurrent, 2553).
--define(wxGLCanvas_SwapBuffers, 2554).
--define(wxGLCanvas_destroy, 2555).
--define(wxAuiManager_new, 2556).
--define(wxAuiManager_destruct, 2557).
--define(wxAuiManager_AddPane_2_1, 2558).
--define(wxAuiManager_AddPane_3, 2559).
--define(wxAuiManager_AddPane_2_0, 2560).
--define(wxAuiManager_DetachPane, 2561).
--define(wxAuiManager_GetAllPanes, 2562).
--define(wxAuiManager_GetArtProvider, 2563).
--define(wxAuiManager_GetDockSizeConstraint, 2564).
--define(wxAuiManager_GetFlags, 2565).
--define(wxAuiManager_GetManagedWindow, 2566).
--define(wxAuiManager_GetManager, 2567).
--define(wxAuiManager_GetPane_1_1, 2568).
--define(wxAuiManager_GetPane_1_0, 2569).
--define(wxAuiManager_HideHint, 2570).
--define(wxAuiManager_InsertPane, 2571).
--define(wxAuiManager_LoadPaneInfo, 2572).
--define(wxAuiManager_LoadPerspective, 2573).
--define(wxAuiManager_SavePaneInfo, 2574).
--define(wxAuiManager_SavePerspective, 2575).
--define(wxAuiManager_SetArtProvider, 2576).
--define(wxAuiManager_SetDockSizeConstraint, 2577).
--define(wxAuiManager_SetFlags, 2578).
--define(wxAuiManager_SetManagedWindow, 2579).
--define(wxAuiManager_ShowHint, 2580).
--define(wxAuiManager_UnInit, 2581).
--define(wxAuiManager_Update, 2582).
--define(wxAuiPaneInfo_new_0, 2583).
--define(wxAuiPaneInfo_new_1, 2584).
--define(wxAuiPaneInfo_destruct, 2585).
--define(wxAuiPaneInfo_BestSize_1, 2586).
--define(wxAuiPaneInfo_BestSize_2, 2587).
--define(wxAuiPaneInfo_Bottom, 2588).
--define(wxAuiPaneInfo_BottomDockable, 2589).
--define(wxAuiPaneInfo_Caption, 2590).
--define(wxAuiPaneInfo_CaptionVisible, 2591).
--define(wxAuiPaneInfo_Centre, 2592).
--define(wxAuiPaneInfo_CentrePane, 2593).
--define(wxAuiPaneInfo_CloseButton, 2594).
--define(wxAuiPaneInfo_DefaultPane, 2595).
--define(wxAuiPaneInfo_DestroyOnClose, 2596).
--define(wxAuiPaneInfo_Direction, 2597).
--define(wxAuiPaneInfo_Dock, 2598).
--define(wxAuiPaneInfo_Dockable, 2599).
--define(wxAuiPaneInfo_Fixed, 2600).
--define(wxAuiPaneInfo_Float, 2601).
--define(wxAuiPaneInfo_Floatable, 2602).
--define(wxAuiPaneInfo_FloatingPosition_1, 2603).
--define(wxAuiPaneInfo_FloatingPosition_2, 2604).
--define(wxAuiPaneInfo_FloatingSize_1, 2605).
--define(wxAuiPaneInfo_FloatingSize_2, 2606).
--define(wxAuiPaneInfo_Gripper, 2607).
--define(wxAuiPaneInfo_GripperTop, 2608).
--define(wxAuiPaneInfo_HasBorder, 2609).
--define(wxAuiPaneInfo_HasCaption, 2610).
--define(wxAuiPaneInfo_HasCloseButton, 2611).
--define(wxAuiPaneInfo_HasFlag, 2612).
--define(wxAuiPaneInfo_HasGripper, 2613).
--define(wxAuiPaneInfo_HasGripperTop, 2614).
--define(wxAuiPaneInfo_HasMaximizeButton, 2615).
--define(wxAuiPaneInfo_HasMinimizeButton, 2616).
--define(wxAuiPaneInfo_HasPinButton, 2617).
--define(wxAuiPaneInfo_Hide, 2618).
--define(wxAuiPaneInfo_IsBottomDockable, 2619).
--define(wxAuiPaneInfo_IsDocked, 2620).
--define(wxAuiPaneInfo_IsFixed, 2621).
--define(wxAuiPaneInfo_IsFloatable, 2622).
--define(wxAuiPaneInfo_IsFloating, 2623).
--define(wxAuiPaneInfo_IsLeftDockable, 2624).
--define(wxAuiPaneInfo_IsMovable, 2625).
--define(wxAuiPaneInfo_IsOk, 2626).
--define(wxAuiPaneInfo_IsResizable, 2627).
--define(wxAuiPaneInfo_IsRightDockable, 2628).
--define(wxAuiPaneInfo_IsShown, 2629).
--define(wxAuiPaneInfo_IsToolbar, 2630).
--define(wxAuiPaneInfo_IsTopDockable, 2631).
--define(wxAuiPaneInfo_Layer, 2632).
--define(wxAuiPaneInfo_Left, 2633).
--define(wxAuiPaneInfo_LeftDockable, 2634).
--define(wxAuiPaneInfo_MaxSize_1, 2635).
--define(wxAuiPaneInfo_MaxSize_2, 2636).
--define(wxAuiPaneInfo_MaximizeButton, 2637).
--define(wxAuiPaneInfo_MinSize_1, 2638).
--define(wxAuiPaneInfo_MinSize_2, 2639).
--define(wxAuiPaneInfo_MinimizeButton, 2640).
--define(wxAuiPaneInfo_Movable, 2641).
--define(wxAuiPaneInfo_Name, 2642).
--define(wxAuiPaneInfo_PaneBorder, 2643).
--define(wxAuiPaneInfo_PinButton, 2644).
--define(wxAuiPaneInfo_Position, 2645).
--define(wxAuiPaneInfo_Resizable, 2646).
--define(wxAuiPaneInfo_Right, 2647).
--define(wxAuiPaneInfo_RightDockable, 2648).
--define(wxAuiPaneInfo_Row, 2649).
--define(wxAuiPaneInfo_SafeSet, 2650).
--define(wxAuiPaneInfo_SetFlag, 2651).
--define(wxAuiPaneInfo_Show, 2652).
--define(wxAuiPaneInfo_ToolbarPane, 2653).
--define(wxAuiPaneInfo_Top, 2654).
--define(wxAuiPaneInfo_TopDockable, 2655).
--define(wxAuiPaneInfo_Window, 2656).
--define(wxAuiPaneInfo_GetWindow, 2657).
--define(wxAuiPaneInfo_GetFrame, 2658).
--define(wxAuiPaneInfo_GetDirection, 2659).
--define(wxAuiPaneInfo_GetLayer, 2660).
--define(wxAuiPaneInfo_GetRow, 2661).
--define(wxAuiPaneInfo_GetPosition, 2662).
--define(wxAuiPaneInfo_GetFloatingPosition, 2663).
--define(wxAuiPaneInfo_GetFloatingSize, 2664).
--define(wxAuiNotebook_new_0, 2665).
--define(wxAuiNotebook_new_2, 2666).
--define(wxAuiNotebook_AddPage, 2667).
--define(wxAuiNotebook_Create, 2668).
--define(wxAuiNotebook_DeletePage, 2669).
--define(wxAuiNotebook_GetArtProvider, 2670).
--define(wxAuiNotebook_GetPage, 2671).
--define(wxAuiNotebook_GetPageBitmap, 2672).
--define(wxAuiNotebook_GetPageCount, 2673).
--define(wxAuiNotebook_GetPageIndex, 2674).
--define(wxAuiNotebook_GetPageText, 2675).
--define(wxAuiNotebook_GetSelection, 2676).
--define(wxAuiNotebook_InsertPage, 2677).
--define(wxAuiNotebook_RemovePage, 2678).
--define(wxAuiNotebook_SetArtProvider, 2679).
--define(wxAuiNotebook_SetFont, 2680).
--define(wxAuiNotebook_SetPageBitmap, 2681).
--define(wxAuiNotebook_SetPageText, 2682).
--define(wxAuiNotebook_SetSelection, 2683).
--define(wxAuiNotebook_SetTabCtrlHeight, 2684).
--define(wxAuiNotebook_SetUniformBitmapSize, 2685).
--define(wxAuiNotebook_destroy, 2686).
--define(wxAuiTabArt_SetFlags, 2687).
--define(wxAuiTabArt_SetMeasuringFont, 2688).
--define(wxAuiTabArt_SetNormalFont, 2689).
--define(wxAuiTabArt_SetSelectedFont, 2690).
--define(wxAuiTabArt_SetColour, 2691).
--define(wxAuiTabArt_SetActiveColour, 2692).
--define(wxAuiDockArt_GetColour, 2693).
--define(wxAuiDockArt_GetFont, 2694).
--define(wxAuiDockArt_GetMetric, 2695).
--define(wxAuiDockArt_SetColour, 2696).
--define(wxAuiDockArt_SetFont, 2697).
--define(wxAuiDockArt_SetMetric, 2698).
--define(wxAuiSimpleTabArt_new, 2699).
--define(wxAuiSimpleTabArt_destroy, 2700).
--define(wxMDIParentFrame_new_0, 2701).
--define(wxMDIParentFrame_new_4, 2702).
--define(wxMDIParentFrame_destruct, 2703).
--define(wxMDIParentFrame_ActivateNext, 2704).
--define(wxMDIParentFrame_ActivatePrevious, 2705).
--define(wxMDIParentFrame_ArrangeIcons, 2706).
--define(wxMDIParentFrame_Cascade, 2707).
--define(wxMDIParentFrame_Create, 2708).
--define(wxMDIParentFrame_GetActiveChild, 2709).
--define(wxMDIParentFrame_GetClientWindow, 2710).
--define(wxMDIParentFrame_Tile, 2711).
--define(wxMDIChildFrame_new_0, 2712).
--define(wxMDIChildFrame_new_4, 2713).
--define(wxMDIChildFrame_destruct, 2714).
--define(wxMDIChildFrame_Activate, 2715).
--define(wxMDIChildFrame_Create, 2716).
--define(wxMDIChildFrame_Maximize, 2717).
--define(wxMDIChildFrame_Restore, 2718).
--define(wxMDIClientWindow_new_0, 2719).
--define(wxMDIClientWindow_new_2, 2720).
--define(wxMDIClientWindow_destruct, 2721).
--define(wxMDIClientWindow_CreateClient, 2722).
--define(wxLayoutAlgorithm_new, 2723).
--define(wxLayoutAlgorithm_LayoutFrame, 2724).
--define(wxLayoutAlgorithm_LayoutMDIFrame, 2725).
--define(wxLayoutAlgorithm_LayoutWindow, 2726).
--define(wxLayoutAlgorithm_destroy, 2727).
--define(wxEvent_GetId, 2728).
--define(wxEvent_GetSkipped, 2729).
--define(wxEvent_GetTimestamp, 2730).
--define(wxEvent_IsCommandEvent, 2731).
--define(wxEvent_ResumePropagation, 2732).
--define(wxEvent_ShouldPropagate, 2733).
--define(wxEvent_Skip, 2734).
--define(wxEvent_StopPropagation, 2735).
--define(wxCommandEvent_getClientData, 2736).
--define(wxCommandEvent_GetExtraLong, 2737).
--define(wxCommandEvent_GetInt, 2738).
--define(wxCommandEvent_GetSelection, 2739).
--define(wxCommandEvent_GetString, 2740).
--define(wxCommandEvent_IsChecked, 2741).
--define(wxCommandEvent_IsSelection, 2742).
--define(wxCommandEvent_SetInt, 2743).
--define(wxCommandEvent_SetString, 2744).
--define(wxScrollEvent_GetOrientation, 2745).
--define(wxScrollEvent_GetPosition, 2746).
--define(wxScrollWinEvent_GetOrientation, 2747).
--define(wxScrollWinEvent_GetPosition, 2748).
--define(wxMouseEvent_AltDown, 2749).
--define(wxMouseEvent_Button, 2750).
--define(wxMouseEvent_ButtonDClick, 2751).
--define(wxMouseEvent_ButtonDown, 2752).
--define(wxMouseEvent_ButtonUp, 2753).
--define(wxMouseEvent_CmdDown, 2754).
--define(wxMouseEvent_ControlDown, 2755).
--define(wxMouseEvent_Dragging, 2756).
--define(wxMouseEvent_Entering, 2757).
--define(wxMouseEvent_GetButton, 2758).
--define(wxMouseEvent_GetPosition, 2761).
--define(wxMouseEvent_GetLogicalPosition, 2762).
--define(wxMouseEvent_GetLinesPerAction, 2763).
--define(wxMouseEvent_GetWheelRotation, 2764).
--define(wxMouseEvent_GetWheelDelta, 2765).
--define(wxMouseEvent_GetX, 2766).
--define(wxMouseEvent_GetY, 2767).
--define(wxMouseEvent_IsButton, 2768).
--define(wxMouseEvent_IsPageScroll, 2769).
--define(wxMouseEvent_Leaving, 2770).
--define(wxMouseEvent_LeftDClick, 2771).
--define(wxMouseEvent_LeftDown, 2772).
--define(wxMouseEvent_LeftIsDown, 2773).
--define(wxMouseEvent_LeftUp, 2774).
--define(wxMouseEvent_MetaDown, 2775).
--define(wxMouseEvent_MiddleDClick, 2776).
--define(wxMouseEvent_MiddleDown, 2777).
--define(wxMouseEvent_MiddleIsDown, 2778).
--define(wxMouseEvent_MiddleUp, 2779).
--define(wxMouseEvent_Moving, 2780).
--define(wxMouseEvent_RightDClick, 2781).
--define(wxMouseEvent_RightDown, 2782).
--define(wxMouseEvent_RightIsDown, 2783).
--define(wxMouseEvent_RightUp, 2784).
--define(wxMouseEvent_ShiftDown, 2785).
--define(wxSetCursorEvent_GetCursor, 2786).
--define(wxSetCursorEvent_GetX, 2787).
--define(wxSetCursorEvent_GetY, 2788).
--define(wxSetCursorEvent_HasCursor, 2789).
--define(wxSetCursorEvent_SetCursor, 2790).
--define(wxKeyEvent_AltDown, 2791).
--define(wxKeyEvent_CmdDown, 2792).
--define(wxKeyEvent_ControlDown, 2793).
--define(wxKeyEvent_GetKeyCode, 2794).
--define(wxKeyEvent_GetModifiers, 2795).
--define(wxKeyEvent_GetPosition, 2798).
--define(wxKeyEvent_GetRawKeyCode, 2799).
--define(wxKeyEvent_GetRawKeyFlags, 2800).
--define(wxKeyEvent_GetUnicodeKey, 2801).
--define(wxKeyEvent_GetX, 2802).
--define(wxKeyEvent_GetY, 2803).
--define(wxKeyEvent_HasModifiers, 2804).
--define(wxKeyEvent_MetaDown, 2805).
--define(wxKeyEvent_ShiftDown, 2806).
--define(wxSizeEvent_GetSize, 2807).
--define(wxMoveEvent_GetPosition, 2808).
--define(wxEraseEvent_GetDC, 2809).
--define(wxFocusEvent_GetWindow, 2810).
--define(wxChildFocusEvent_GetWindow, 2811).
--define(wxMenuEvent_GetMenu, 2812).
--define(wxMenuEvent_GetMenuId, 2813).
--define(wxMenuEvent_IsPopup, 2814).
--define(wxCloseEvent_CanVeto, 2815).
--define(wxCloseEvent_GetLoggingOff, 2816).
--define(wxCloseEvent_SetCanVeto, 2817).
--define(wxCloseEvent_SetLoggingOff, 2818).
--define(wxCloseEvent_Veto, 2819).
--define(wxShowEvent_SetShow, 2820).
--define(wxShowEvent_GetShow, 2821).
--define(wxIconizeEvent_Iconized, 2822).
--define(wxJoystickEvent_ButtonDown, 2823).
--define(wxJoystickEvent_ButtonIsDown, 2824).
--define(wxJoystickEvent_ButtonUp, 2825).
--define(wxJoystickEvent_GetButtonChange, 2826).
--define(wxJoystickEvent_GetButtonState, 2827).
--define(wxJoystickEvent_GetJoystick, 2828).
--define(wxJoystickEvent_GetPosition, 2829).
--define(wxJoystickEvent_GetZPosition, 2830).
--define(wxJoystickEvent_IsButton, 2831).
--define(wxJoystickEvent_IsMove, 2832).
--define(wxJoystickEvent_IsZMove, 2833).
--define(wxUpdateUIEvent_CanUpdate, 2834).
--define(wxUpdateUIEvent_Check, 2835).
--define(wxUpdateUIEvent_Enable, 2836).
--define(wxUpdateUIEvent_Show, 2837).
--define(wxUpdateUIEvent_GetChecked, 2838).
--define(wxUpdateUIEvent_GetEnabled, 2839).
--define(wxUpdateUIEvent_GetShown, 2840).
--define(wxUpdateUIEvent_GetSetChecked, 2841).
--define(wxUpdateUIEvent_GetSetEnabled, 2842).
--define(wxUpdateUIEvent_GetSetShown, 2843).
--define(wxUpdateUIEvent_GetSetText, 2844).
--define(wxUpdateUIEvent_GetText, 2845).
--define(wxUpdateUIEvent_GetMode, 2846).
--define(wxUpdateUIEvent_GetUpdateInterval, 2847).
--define(wxUpdateUIEvent_ResetUpdateTime, 2848).
--define(wxUpdateUIEvent_SetMode, 2849).
--define(wxUpdateUIEvent_SetText, 2850).
--define(wxUpdateUIEvent_SetUpdateInterval, 2851).
--define(wxMouseCaptureChangedEvent_GetCapturedWindow, 2852).
--define(wxPaletteChangedEvent_SetChangedWindow, 2853).
--define(wxPaletteChangedEvent_GetChangedWindow, 2854).
--define(wxQueryNewPaletteEvent_SetPaletteRealized, 2855).
--define(wxQueryNewPaletteEvent_GetPaletteRealized, 2856).
--define(wxNavigationKeyEvent_GetDirection, 2857).
--define(wxNavigationKeyEvent_SetDirection, 2858).
--define(wxNavigationKeyEvent_IsWindowChange, 2859).
--define(wxNavigationKeyEvent_SetWindowChange, 2860).
--define(wxNavigationKeyEvent_IsFromTab, 2861).
--define(wxNavigationKeyEvent_SetFromTab, 2862).
--define(wxNavigationKeyEvent_GetCurrentFocus, 2863).
--define(wxNavigationKeyEvent_SetCurrentFocus, 2864).
--define(wxHelpEvent_GetOrigin, 2865).
--define(wxHelpEvent_GetPosition, 2866).
--define(wxHelpEvent_SetOrigin, 2867).
--define(wxHelpEvent_SetPosition, 2868).
--define(wxContextMenuEvent_GetPosition, 2869).
--define(wxContextMenuEvent_SetPosition, 2870).
--define(wxIdleEvent_CanSend, 2871).
--define(wxIdleEvent_GetMode, 2872).
--define(wxIdleEvent_RequestMore, 2873).
--define(wxIdleEvent_MoreRequested, 2874).
--define(wxIdleEvent_SetMode, 2875).
--define(wxGridEvent_AltDown, 2876).
--define(wxGridEvent_ControlDown, 2877).
--define(wxGridEvent_GetCol, 2878).
--define(wxGridEvent_GetPosition, 2879).
--define(wxGridEvent_GetRow, 2880).
--define(wxGridEvent_MetaDown, 2881).
--define(wxGridEvent_Selecting, 2882).
--define(wxGridEvent_ShiftDown, 2883).
--define(wxNotifyEvent_Allow, 2884).
--define(wxNotifyEvent_IsAllowed, 2885).
--define(wxNotifyEvent_Veto, 2886).
--define(wxSashEvent_GetEdge, 2887).
--define(wxSashEvent_GetDragRect, 2888).
--define(wxSashEvent_GetDragStatus, 2889).
--define(wxListEvent_GetCacheFrom, 2890).
--define(wxListEvent_GetCacheTo, 2891).
--define(wxListEvent_GetKeyCode, 2892).
--define(wxListEvent_GetIndex, 2893).
--define(wxListEvent_GetColumn, 2894).
--define(wxListEvent_GetPoint, 2895).
--define(wxListEvent_GetLabel, 2896).
--define(wxListEvent_GetText, 2897).
--define(wxListEvent_GetImage, 2898).
--define(wxListEvent_GetData, 2899).
--define(wxListEvent_GetMask, 2900).
--define(wxListEvent_GetItem, 2901).
--define(wxListEvent_IsEditCancelled, 2902).
--define(wxDateEvent_GetDate, 2903).
--define(wxCalendarEvent_GetWeekDay, 2904).
--define(wxFileDirPickerEvent_GetPath, 2905).
--define(wxColourPickerEvent_GetColour, 2906).
--define(wxFontPickerEvent_GetFont, 2907).
--define(wxStyledTextEvent_GetPosition, 2908).
--define(wxStyledTextEvent_GetKey, 2909).
--define(wxStyledTextEvent_GetModifiers, 2910).
--define(wxStyledTextEvent_GetModificationType, 2911).
--define(wxStyledTextEvent_GetText, 2912).
--define(wxStyledTextEvent_GetLength, 2913).
--define(wxStyledTextEvent_GetLinesAdded, 2914).
--define(wxStyledTextEvent_GetLine, 2915).
--define(wxStyledTextEvent_GetFoldLevelNow, 2916).
--define(wxStyledTextEvent_GetFoldLevelPrev, 2917).
--define(wxStyledTextEvent_GetMargin, 2918).
--define(wxStyledTextEvent_GetMessage, 2919).
--define(wxStyledTextEvent_GetWParam, 2920).
--define(wxStyledTextEvent_GetLParam, 2921).
--define(wxStyledTextEvent_GetListType, 2922).
--define(wxStyledTextEvent_GetX, 2923).
--define(wxStyledTextEvent_GetY, 2924).
--define(wxStyledTextEvent_GetDragText, 2925).
--define(wxStyledTextEvent_GetDragAllowMove, 2926).
--define(wxStyledTextEvent_GetDragResult, 2927).
--define(wxStyledTextEvent_GetShift, 2928).
--define(wxStyledTextEvent_GetControl, 2929).
--define(wxStyledTextEvent_GetAlt, 2930).
--define(utils_wxGetKeyState, 2931).
--define(utils_wxGetMousePosition, 2932).
--define(utils_wxGetMouseState, 2933).
--define(utils_wxSetDetectableAutoRepeat, 2934).
--define(utils_wxBell, 2935).
--define(utils_wxFindMenuItemId, 2936).
--define(utils_wxGenericFindWindowAtPoint, 2937).
--define(utils_wxFindWindowAtPoint, 2938).
--define(utils_wxBeginBusyCursor, 2939).
--define(utils_wxEndBusyCursor, 2940).
--define(utils_wxIsBusy, 2941).
--define(utils_wxShutdown, 2942).
--define(utils_wxShell, 2943).
--define(utils_wxLaunchDefaultBrowser, 2944).
--define(utils_wxGetEmailAddress, 2945).
--define(utils_wxGetUserId, 2946).
--define(utils_wxGetHomeDir, 2947).
--define(utils_wxNewId, 2948).
--define(utils_wxRegisterId, 2949).
--define(utils_wxGetCurrentId, 2950).
--define(utils_wxGetOsDescription, 2951).
--define(utils_wxIsPlatformLittleEndian, 2952).
--define(utils_wxIsPlatform64Bit, 2953).
--define(gdicmn_wxDisplaySize, 2954).
--define(gdicmn_wxSetCursor, 2955).
--define(wxPrintout_new, 2956).
--define(wxPrintout_destruct, 2957).
--define(wxPrintout_GetDC, 2958).
--define(wxPrintout_GetPageSizeMM, 2959).
--define(wxPrintout_GetPageSizePixels, 2960).
--define(wxPrintout_GetPaperRectPixels, 2961).
--define(wxPrintout_GetPPIPrinter, 2962).
--define(wxPrintout_GetPPIScreen, 2963).
--define(wxPrintout_GetTitle, 2964).
--define(wxPrintout_IsPreview, 2965).
--define(wxPrintout_FitThisSizeToPaper, 2966).
--define(wxPrintout_FitThisSizeToPage, 2967).
--define(wxPrintout_FitThisSizeToPageMargins, 2968).
--define(wxPrintout_MapScreenSizeToPaper, 2969).
--define(wxPrintout_MapScreenSizeToPage, 2970).
--define(wxPrintout_MapScreenSizeToPageMargins, 2971).
--define(wxPrintout_MapScreenSizeToDevice, 2972).
--define(wxPrintout_GetLogicalPaperRect, 2973).
--define(wxPrintout_GetLogicalPageRect, 2974).
--define(wxPrintout_GetLogicalPageMarginsRect, 2975).
--define(wxPrintout_SetLogicalOrigin, 2976).
--define(wxPrintout_OffsetLogicalOrigin, 2977).
--define(wxStyledTextCtrl_new_2, 2978).
--define(wxStyledTextCtrl_new_0, 2979).
--define(wxStyledTextCtrl_destruct, 2980).
--define(wxStyledTextCtrl_Create, 2981).
--define(wxStyledTextCtrl_AddText, 2982).
--define(wxStyledTextCtrl_AddStyledText, 2983).
--define(wxStyledTextCtrl_InsertText, 2984).
--define(wxStyledTextCtrl_ClearAll, 2985).
--define(wxStyledTextCtrl_ClearDocumentStyle, 2986).
--define(wxStyledTextCtrl_GetLength, 2987).
--define(wxStyledTextCtrl_GetCharAt, 2988).
--define(wxStyledTextCtrl_GetCurrentPos, 2989).
--define(wxStyledTextCtrl_GetAnchor, 2990).
--define(wxStyledTextCtrl_GetStyleAt, 2991).
--define(wxStyledTextCtrl_Redo, 2992).
--define(wxStyledTextCtrl_SetUndoCollection, 2993).
--define(wxStyledTextCtrl_SelectAll, 2994).
--define(wxStyledTextCtrl_SetSavePoint, 2995).
--define(wxStyledTextCtrl_GetStyledText, 2996).
--define(wxStyledTextCtrl_CanRedo, 2997).
--define(wxStyledTextCtrl_MarkerLineFromHandle, 2998).
--define(wxStyledTextCtrl_MarkerDeleteHandle, 2999).
--define(wxStyledTextCtrl_GetUndoCollection, 3000).
--define(wxStyledTextCtrl_GetViewWhiteSpace, 3001).
--define(wxStyledTextCtrl_SetViewWhiteSpace, 3002).
--define(wxStyledTextCtrl_PositionFromPoint, 3003).
--define(wxStyledTextCtrl_PositionFromPointClose, 3004).
--define(wxStyledTextCtrl_GotoLine, 3005).
--define(wxStyledTextCtrl_GotoPos, 3006).
--define(wxStyledTextCtrl_SetAnchor, 3007).
--define(wxStyledTextCtrl_GetCurLine, 3008).
--define(wxStyledTextCtrl_GetEndStyled, 3009).
--define(wxStyledTextCtrl_ConvertEOLs, 3010).
--define(wxStyledTextCtrl_GetEOLMode, 3011).
--define(wxStyledTextCtrl_SetEOLMode, 3012).
--define(wxStyledTextCtrl_StartStyling, 3013).
--define(wxStyledTextCtrl_SetStyling, 3014).
--define(wxStyledTextCtrl_GetBufferedDraw, 3015).
--define(wxStyledTextCtrl_SetBufferedDraw, 3016).
--define(wxStyledTextCtrl_SetTabWidth, 3017).
--define(wxStyledTextCtrl_GetTabWidth, 3018).
--define(wxStyledTextCtrl_SetCodePage, 3019).
--define(wxStyledTextCtrl_MarkerDefine, 3020).
--define(wxStyledTextCtrl_MarkerSetForeground, 3021).
--define(wxStyledTextCtrl_MarkerSetBackground, 3022).
--define(wxStyledTextCtrl_MarkerAdd, 3023).
--define(wxStyledTextCtrl_MarkerDelete, 3024).
--define(wxStyledTextCtrl_MarkerDeleteAll, 3025).
--define(wxStyledTextCtrl_MarkerGet, 3026).
--define(wxStyledTextCtrl_MarkerNext, 3027).
--define(wxStyledTextCtrl_MarkerPrevious, 3028).
--define(wxStyledTextCtrl_MarkerDefineBitmap, 3029).
--define(wxStyledTextCtrl_MarkerAddSet, 3030).
--define(wxStyledTextCtrl_MarkerSetAlpha, 3031).
--define(wxStyledTextCtrl_SetMarginType, 3032).
--define(wxStyledTextCtrl_GetMarginType, 3033).
--define(wxStyledTextCtrl_SetMarginWidth, 3034).
--define(wxStyledTextCtrl_GetMarginWidth, 3035).
--define(wxStyledTextCtrl_SetMarginMask, 3036).
--define(wxStyledTextCtrl_GetMarginMask, 3037).
--define(wxStyledTextCtrl_SetMarginSensitive, 3038).
--define(wxStyledTextCtrl_GetMarginSensitive, 3039).
--define(wxStyledTextCtrl_StyleClearAll, 3040).
--define(wxStyledTextCtrl_StyleSetForeground, 3041).
--define(wxStyledTextCtrl_StyleSetBackground, 3042).
--define(wxStyledTextCtrl_StyleSetBold, 3043).
--define(wxStyledTextCtrl_StyleSetItalic, 3044).
--define(wxStyledTextCtrl_StyleSetSize, 3045).
--define(wxStyledTextCtrl_StyleSetFaceName, 3046).
--define(wxStyledTextCtrl_StyleSetEOLFilled, 3047).
--define(wxStyledTextCtrl_StyleResetDefault, 3048).
--define(wxStyledTextCtrl_StyleSetUnderline, 3049).
--define(wxStyledTextCtrl_StyleSetCase, 3050).
--define(wxStyledTextCtrl_StyleSetHotSpot, 3051).
--define(wxStyledTextCtrl_SetSelForeground, 3052).
--define(wxStyledTextCtrl_SetSelBackground, 3053).
--define(wxStyledTextCtrl_GetSelAlpha, 3054).
--define(wxStyledTextCtrl_SetSelAlpha, 3055).
--define(wxStyledTextCtrl_SetCaretForeground, 3056).
--define(wxStyledTextCtrl_CmdKeyAssign, 3057).
--define(wxStyledTextCtrl_CmdKeyClear, 3058).
--define(wxStyledTextCtrl_CmdKeyClearAll, 3059).
--define(wxStyledTextCtrl_SetStyleBytes, 3060).
--define(wxStyledTextCtrl_StyleSetVisible, 3061).
--define(wxStyledTextCtrl_GetCaretPeriod, 3062).
--define(wxStyledTextCtrl_SetCaretPeriod, 3063).
--define(wxStyledTextCtrl_SetWordChars, 3064).
--define(wxStyledTextCtrl_BeginUndoAction, 3065).
--define(wxStyledTextCtrl_EndUndoAction, 3066).
--define(wxStyledTextCtrl_IndicatorSetStyle, 3067).
--define(wxStyledTextCtrl_IndicatorGetStyle, 3068).
--define(wxStyledTextCtrl_IndicatorSetForeground, 3069).
--define(wxStyledTextCtrl_IndicatorGetForeground, 3070).
--define(wxStyledTextCtrl_SetWhitespaceForeground, 3071).
--define(wxStyledTextCtrl_SetWhitespaceBackground, 3072).
--define(wxStyledTextCtrl_GetStyleBits, 3073).
--define(wxStyledTextCtrl_SetLineState, 3074).
--define(wxStyledTextCtrl_GetLineState, 3075).
--define(wxStyledTextCtrl_GetMaxLineState, 3076).
--define(wxStyledTextCtrl_GetCaretLineVisible, 3077).
--define(wxStyledTextCtrl_SetCaretLineVisible, 3078).
--define(wxStyledTextCtrl_GetCaretLineBackground, 3079).
--define(wxStyledTextCtrl_SetCaretLineBackground, 3080).
--define(wxStyledTextCtrl_AutoCompShow, 3081).
--define(wxStyledTextCtrl_AutoCompCancel, 3082).
--define(wxStyledTextCtrl_AutoCompActive, 3083).
--define(wxStyledTextCtrl_AutoCompPosStart, 3084).
--define(wxStyledTextCtrl_AutoCompComplete, 3085).
--define(wxStyledTextCtrl_AutoCompStops, 3086).
--define(wxStyledTextCtrl_AutoCompSetSeparator, 3087).
--define(wxStyledTextCtrl_AutoCompGetSeparator, 3088).
--define(wxStyledTextCtrl_AutoCompSelect, 3089).
--define(wxStyledTextCtrl_AutoCompSetCancelAtStart, 3090).
--define(wxStyledTextCtrl_AutoCompGetCancelAtStart, 3091).
--define(wxStyledTextCtrl_AutoCompSetFillUps, 3092).
--define(wxStyledTextCtrl_AutoCompSetChooseSingle, 3093).
--define(wxStyledTextCtrl_AutoCompGetChooseSingle, 3094).
--define(wxStyledTextCtrl_AutoCompSetIgnoreCase, 3095).
--define(wxStyledTextCtrl_AutoCompGetIgnoreCase, 3096).
--define(wxStyledTextCtrl_UserListShow, 3097).
--define(wxStyledTextCtrl_AutoCompSetAutoHide, 3098).
--define(wxStyledTextCtrl_AutoCompGetAutoHide, 3099).
--define(wxStyledTextCtrl_AutoCompSetDropRestOfWord, 3100).
--define(wxStyledTextCtrl_AutoCompGetDropRestOfWord, 3101).
--define(wxStyledTextCtrl_RegisterImage, 3102).
--define(wxStyledTextCtrl_ClearRegisteredImages, 3103).
--define(wxStyledTextCtrl_AutoCompGetTypeSeparator, 3104).
--define(wxStyledTextCtrl_AutoCompSetTypeSeparator, 3105).
--define(wxStyledTextCtrl_AutoCompSetMaxWidth, 3106).
--define(wxStyledTextCtrl_AutoCompGetMaxWidth, 3107).
--define(wxStyledTextCtrl_AutoCompSetMaxHeight, 3108).
--define(wxStyledTextCtrl_AutoCompGetMaxHeight, 3109).
--define(wxStyledTextCtrl_SetIndent, 3110).
--define(wxStyledTextCtrl_GetIndent, 3111).
--define(wxStyledTextCtrl_SetUseTabs, 3112).
--define(wxStyledTextCtrl_GetUseTabs, 3113).
--define(wxStyledTextCtrl_SetLineIndentation, 3114).
--define(wxStyledTextCtrl_GetLineIndentation, 3115).
--define(wxStyledTextCtrl_GetLineIndentPosition, 3116).
--define(wxStyledTextCtrl_GetColumn, 3117).
--define(wxStyledTextCtrl_SetUseHorizontalScrollBar, 3118).
--define(wxStyledTextCtrl_GetUseHorizontalScrollBar, 3119).
--define(wxStyledTextCtrl_SetIndentationGuides, 3120).
--define(wxStyledTextCtrl_GetIndentationGuides, 3121).
--define(wxStyledTextCtrl_SetHighlightGuide, 3122).
--define(wxStyledTextCtrl_GetHighlightGuide, 3123).
--define(wxStyledTextCtrl_GetLineEndPosition, 3124).
--define(wxStyledTextCtrl_GetCodePage, 3125).
--define(wxStyledTextCtrl_GetCaretForeground, 3126).
--define(wxStyledTextCtrl_GetReadOnly, 3127).
--define(wxStyledTextCtrl_SetCurrentPos, 3128).
--define(wxStyledTextCtrl_SetSelectionStart, 3129).
--define(wxStyledTextCtrl_GetSelectionStart, 3130).
--define(wxStyledTextCtrl_SetSelectionEnd, 3131).
--define(wxStyledTextCtrl_GetSelectionEnd, 3132).
--define(wxStyledTextCtrl_SetPrintMagnification, 3133).
--define(wxStyledTextCtrl_GetPrintMagnification, 3134).
--define(wxStyledTextCtrl_SetPrintColourMode, 3135).
--define(wxStyledTextCtrl_GetPrintColourMode, 3136).
--define(wxStyledTextCtrl_FindText, 3137).
--define(wxStyledTextCtrl_FormatRange, 3138).
--define(wxStyledTextCtrl_GetFirstVisibleLine, 3139).
--define(wxStyledTextCtrl_GetLine, 3140).
--define(wxStyledTextCtrl_GetLineCount, 3141).
--define(wxStyledTextCtrl_SetMarginLeft, 3142).
--define(wxStyledTextCtrl_GetMarginLeft, 3143).
--define(wxStyledTextCtrl_SetMarginRight, 3144).
--define(wxStyledTextCtrl_GetMarginRight, 3145).
--define(wxStyledTextCtrl_GetModify, 3146).
--define(wxStyledTextCtrl_SetSelection, 3147).
--define(wxStyledTextCtrl_GetSelectedText, 3148).
--define(wxStyledTextCtrl_GetTextRange, 3149).
--define(wxStyledTextCtrl_HideSelection, 3150).
--define(wxStyledTextCtrl_LineFromPosition, 3151).
--define(wxStyledTextCtrl_PositionFromLine, 3152).
--define(wxStyledTextCtrl_LineScroll, 3153).
--define(wxStyledTextCtrl_EnsureCaretVisible, 3154).
--define(wxStyledTextCtrl_ReplaceSelection, 3155).
--define(wxStyledTextCtrl_SetReadOnly, 3156).
--define(wxStyledTextCtrl_CanPaste, 3157).
--define(wxStyledTextCtrl_CanUndo, 3158).
--define(wxStyledTextCtrl_EmptyUndoBuffer, 3159).
--define(wxStyledTextCtrl_Undo, 3160).
--define(wxStyledTextCtrl_Cut, 3161).
--define(wxStyledTextCtrl_Copy, 3162).
--define(wxStyledTextCtrl_Paste, 3163).
--define(wxStyledTextCtrl_Clear, 3164).
--define(wxStyledTextCtrl_SetText, 3165).
--define(wxStyledTextCtrl_GetText, 3166).
--define(wxStyledTextCtrl_GetTextLength, 3167).
--define(wxStyledTextCtrl_GetOvertype, 3168).
--define(wxStyledTextCtrl_SetCaretWidth, 3169).
--define(wxStyledTextCtrl_GetCaretWidth, 3170).
--define(wxStyledTextCtrl_SetTargetStart, 3171).
--define(wxStyledTextCtrl_GetTargetStart, 3172).
--define(wxStyledTextCtrl_SetTargetEnd, 3173).
--define(wxStyledTextCtrl_GetTargetEnd, 3174).
--define(wxStyledTextCtrl_ReplaceTarget, 3175).
--define(wxStyledTextCtrl_SearchInTarget, 3176).
--define(wxStyledTextCtrl_SetSearchFlags, 3177).
--define(wxStyledTextCtrl_GetSearchFlags, 3178).
--define(wxStyledTextCtrl_CallTipShow, 3179).
--define(wxStyledTextCtrl_CallTipCancel, 3180).
--define(wxStyledTextCtrl_CallTipActive, 3181).
--define(wxStyledTextCtrl_CallTipPosAtStart, 3182).
--define(wxStyledTextCtrl_CallTipSetHighlight, 3183).
--define(wxStyledTextCtrl_CallTipSetBackground, 3184).
--define(wxStyledTextCtrl_CallTipSetForeground, 3185).
--define(wxStyledTextCtrl_CallTipSetForegroundHighlight, 3186).
--define(wxStyledTextCtrl_CallTipUseStyle, 3187).
--define(wxStyledTextCtrl_VisibleFromDocLine, 3188).
--define(wxStyledTextCtrl_DocLineFromVisible, 3189).
--define(wxStyledTextCtrl_WrapCount, 3190).
--define(wxStyledTextCtrl_SetFoldLevel, 3191).
--define(wxStyledTextCtrl_GetFoldLevel, 3192).
--define(wxStyledTextCtrl_GetLastChild, 3193).
--define(wxStyledTextCtrl_GetFoldParent, 3194).
--define(wxStyledTextCtrl_ShowLines, 3195).
--define(wxStyledTextCtrl_HideLines, 3196).
--define(wxStyledTextCtrl_GetLineVisible, 3197).
--define(wxStyledTextCtrl_SetFoldExpanded, 3198).
--define(wxStyledTextCtrl_GetFoldExpanded, 3199).
--define(wxStyledTextCtrl_ToggleFold, 3200).
--define(wxStyledTextCtrl_EnsureVisible, 3201).
--define(wxStyledTextCtrl_SetFoldFlags, 3202).
--define(wxStyledTextCtrl_EnsureVisibleEnforcePolicy, 3203).
--define(wxStyledTextCtrl_SetTabIndents, 3204).
--define(wxStyledTextCtrl_GetTabIndents, 3205).
--define(wxStyledTextCtrl_SetBackSpaceUnIndents, 3206).
--define(wxStyledTextCtrl_GetBackSpaceUnIndents, 3207).
--define(wxStyledTextCtrl_SetMouseDwellTime, 3208).
--define(wxStyledTextCtrl_GetMouseDwellTime, 3209).
--define(wxStyledTextCtrl_WordStartPosition, 3210).
--define(wxStyledTextCtrl_WordEndPosition, 3211).
--define(wxStyledTextCtrl_SetWrapMode, 3212).
--define(wxStyledTextCtrl_GetWrapMode, 3213).
--define(wxStyledTextCtrl_SetWrapVisualFlags, 3214).
--define(wxStyledTextCtrl_GetWrapVisualFlags, 3215).
--define(wxStyledTextCtrl_SetWrapVisualFlagsLocation, 3216).
--define(wxStyledTextCtrl_GetWrapVisualFlagsLocation, 3217).
--define(wxStyledTextCtrl_SetWrapStartIndent, 3218).
--define(wxStyledTextCtrl_GetWrapStartIndent, 3219).
--define(wxStyledTextCtrl_SetLayoutCache, 3220).
--define(wxStyledTextCtrl_GetLayoutCache, 3221).
--define(wxStyledTextCtrl_SetScrollWidth, 3222).
--define(wxStyledTextCtrl_GetScrollWidth, 3223).
--define(wxStyledTextCtrl_TextWidth, 3224).
--define(wxStyledTextCtrl_GetEndAtLastLine, 3225).
--define(wxStyledTextCtrl_TextHeight, 3226).
--define(wxStyledTextCtrl_SetUseVerticalScrollBar, 3227).
--define(wxStyledTextCtrl_GetUseVerticalScrollBar, 3228).
--define(wxStyledTextCtrl_AppendText, 3229).
--define(wxStyledTextCtrl_GetTwoPhaseDraw, 3230).
--define(wxStyledTextCtrl_SetTwoPhaseDraw, 3231).
--define(wxStyledTextCtrl_TargetFromSelection, 3232).
--define(wxStyledTextCtrl_LinesJoin, 3233).
--define(wxStyledTextCtrl_LinesSplit, 3234).
--define(wxStyledTextCtrl_SetFoldMarginColour, 3235).
--define(wxStyledTextCtrl_SetFoldMarginHiColour, 3236).
--define(wxStyledTextCtrl_LineDown, 3237).
--define(wxStyledTextCtrl_LineDownExtend, 3238).
--define(wxStyledTextCtrl_LineUp, 3239).
--define(wxStyledTextCtrl_LineUpExtend, 3240).
--define(wxStyledTextCtrl_CharLeft, 3241).
--define(wxStyledTextCtrl_CharLeftExtend, 3242).
--define(wxStyledTextCtrl_CharRight, 3243).
--define(wxStyledTextCtrl_CharRightExtend, 3244).
--define(wxStyledTextCtrl_WordLeft, 3245).
--define(wxStyledTextCtrl_WordLeftExtend, 3246).
--define(wxStyledTextCtrl_WordRight, 3247).
--define(wxStyledTextCtrl_WordRightExtend, 3248).
--define(wxStyledTextCtrl_Home, 3249).
--define(wxStyledTextCtrl_HomeExtend, 3250).
--define(wxStyledTextCtrl_LineEnd, 3251).
--define(wxStyledTextCtrl_LineEndExtend, 3252).
--define(wxStyledTextCtrl_DocumentStart, 3253).
--define(wxStyledTextCtrl_DocumentStartExtend, 3254).
--define(wxStyledTextCtrl_DocumentEnd, 3255).
--define(wxStyledTextCtrl_DocumentEndExtend, 3256).
--define(wxStyledTextCtrl_PageUp, 3257).
--define(wxStyledTextCtrl_PageUpExtend, 3258).
--define(wxStyledTextCtrl_PageDown, 3259).
--define(wxStyledTextCtrl_PageDownExtend, 3260).
--define(wxStyledTextCtrl_EditToggleOvertype, 3261).
--define(wxStyledTextCtrl_Cancel, 3262).
--define(wxStyledTextCtrl_DeleteBack, 3263).
--define(wxStyledTextCtrl_Tab, 3264).
--define(wxStyledTextCtrl_BackTab, 3265).
--define(wxStyledTextCtrl_NewLine, 3266).
--define(wxStyledTextCtrl_FormFeed, 3267).
--define(wxStyledTextCtrl_VCHome, 3268).
--define(wxStyledTextCtrl_VCHomeExtend, 3269).
--define(wxStyledTextCtrl_ZoomIn, 3270).
--define(wxStyledTextCtrl_ZoomOut, 3271).
--define(wxStyledTextCtrl_DelWordLeft, 3272).
--define(wxStyledTextCtrl_DelWordRight, 3273).
--define(wxStyledTextCtrl_LineCut, 3274).
--define(wxStyledTextCtrl_LineDelete, 3275).
--define(wxStyledTextCtrl_LineTranspose, 3276).
--define(wxStyledTextCtrl_LineDuplicate, 3277).
--define(wxStyledTextCtrl_LowerCase, 3278).
--define(wxStyledTextCtrl_UpperCase, 3279).
--define(wxStyledTextCtrl_LineScrollDown, 3280).
--define(wxStyledTextCtrl_LineScrollUp, 3281).
--define(wxStyledTextCtrl_DeleteBackNotLine, 3282).
--define(wxStyledTextCtrl_HomeDisplay, 3283).
--define(wxStyledTextCtrl_HomeDisplayExtend, 3284).
--define(wxStyledTextCtrl_LineEndDisplay, 3285).
--define(wxStyledTextCtrl_LineEndDisplayExtend, 3286).
--define(wxStyledTextCtrl_HomeWrapExtend, 3287).
--define(wxStyledTextCtrl_LineEndWrap, 3288).
--define(wxStyledTextCtrl_LineEndWrapExtend, 3289).
--define(wxStyledTextCtrl_VCHomeWrap, 3290).
--define(wxStyledTextCtrl_VCHomeWrapExtend, 3291).
--define(wxStyledTextCtrl_LineCopy, 3292).
--define(wxStyledTextCtrl_MoveCaretInsideView, 3293).
--define(wxStyledTextCtrl_LineLength, 3294).
--define(wxStyledTextCtrl_BraceHighlight, 3295).
--define(wxStyledTextCtrl_BraceBadLight, 3296).
--define(wxStyledTextCtrl_BraceMatch, 3297).
--define(wxStyledTextCtrl_GetViewEOL, 3298).
--define(wxStyledTextCtrl_SetViewEOL, 3299).
--define(wxStyledTextCtrl_SetModEventMask, 3300).
--define(wxStyledTextCtrl_GetEdgeColumn, 3301).
--define(wxStyledTextCtrl_SetEdgeColumn, 3302).
--define(wxStyledTextCtrl_SetEdgeMode, 3303).
--define(wxStyledTextCtrl_GetEdgeMode, 3304).
--define(wxStyledTextCtrl_GetEdgeColour, 3305).
--define(wxStyledTextCtrl_SetEdgeColour, 3306).
--define(wxStyledTextCtrl_SearchAnchor, 3307).
--define(wxStyledTextCtrl_SearchNext, 3308).
--define(wxStyledTextCtrl_SearchPrev, 3309).
--define(wxStyledTextCtrl_LinesOnScreen, 3310).
--define(wxStyledTextCtrl_UsePopUp, 3311).
--define(wxStyledTextCtrl_SelectionIsRectangle, 3312).
--define(wxStyledTextCtrl_SetZoom, 3313).
--define(wxStyledTextCtrl_GetZoom, 3314).
--define(wxStyledTextCtrl_GetModEventMask, 3315).
--define(wxStyledTextCtrl_SetSTCFocus, 3316).
--define(wxStyledTextCtrl_GetSTCFocus, 3317).
--define(wxStyledTextCtrl_SetStatus, 3318).
--define(wxStyledTextCtrl_GetStatus, 3319).
--define(wxStyledTextCtrl_SetMouseDownCaptures, 3320).
--define(wxStyledTextCtrl_GetMouseDownCaptures, 3321).
--define(wxStyledTextCtrl_SetSTCCursor, 3322).
--define(wxStyledTextCtrl_GetSTCCursor, 3323).
--define(wxStyledTextCtrl_SetControlCharSymbol, 3324).
--define(wxStyledTextCtrl_GetControlCharSymbol, 3325).
--define(wxStyledTextCtrl_WordPartLeft, 3326).
--define(wxStyledTextCtrl_WordPartLeftExtend, 3327).
--define(wxStyledTextCtrl_WordPartRight, 3328).
--define(wxStyledTextCtrl_WordPartRightExtend, 3329).
--define(wxStyledTextCtrl_SetVisiblePolicy, 3330).
--define(wxStyledTextCtrl_DelLineLeft, 3331).
--define(wxStyledTextCtrl_DelLineRight, 3332).
--define(wxStyledTextCtrl_GetXOffset, 3333).
--define(wxStyledTextCtrl_ChooseCaretX, 3334).
--define(wxStyledTextCtrl_SetXCaretPolicy, 3335).
--define(wxStyledTextCtrl_SetYCaretPolicy, 3336).
--define(wxStyledTextCtrl_GetPrintWrapMode, 3337).
--define(wxStyledTextCtrl_SetHotspotActiveForeground, 3338).
--define(wxStyledTextCtrl_SetHotspotActiveBackground, 3339).
--define(wxStyledTextCtrl_SetHotspotActiveUnderline, 3340).
--define(wxStyledTextCtrl_SetHotspotSingleLine, 3341).
--define(wxStyledTextCtrl_ParaDownExtend, 3342).
--define(wxStyledTextCtrl_ParaUp, 3343).
--define(wxStyledTextCtrl_ParaUpExtend, 3344).
--define(wxStyledTextCtrl_PositionBefore, 3345).
--define(wxStyledTextCtrl_PositionAfter, 3346).
--define(wxStyledTextCtrl_CopyRange, 3347).
--define(wxStyledTextCtrl_CopyText, 3348).
--define(wxStyledTextCtrl_SetSelectionMode, 3349).
--define(wxStyledTextCtrl_GetSelectionMode, 3350).
--define(wxStyledTextCtrl_LineDownRectExtend, 3351).
--define(wxStyledTextCtrl_LineUpRectExtend, 3352).
--define(wxStyledTextCtrl_CharLeftRectExtend, 3353).
--define(wxStyledTextCtrl_CharRightRectExtend, 3354).
--define(wxStyledTextCtrl_HomeRectExtend, 3355).
--define(wxStyledTextCtrl_VCHomeRectExtend, 3356).
--define(wxStyledTextCtrl_LineEndRectExtend, 3357).
--define(wxStyledTextCtrl_PageUpRectExtend, 3358).
--define(wxStyledTextCtrl_PageDownRectExtend, 3359).
--define(wxStyledTextCtrl_StutteredPageUp, 3360).
--define(wxStyledTextCtrl_StutteredPageUpExtend, 3361).
--define(wxStyledTextCtrl_StutteredPageDown, 3362).
--define(wxStyledTextCtrl_StutteredPageDownExtend, 3363).
--define(wxStyledTextCtrl_WordLeftEnd, 3364).
--define(wxStyledTextCtrl_WordLeftEndExtend, 3365).
--define(wxStyledTextCtrl_WordRightEnd, 3366).
--define(wxStyledTextCtrl_WordRightEndExtend, 3367).
--define(wxStyledTextCtrl_SetWhitespaceChars, 3368).
--define(wxStyledTextCtrl_SetCharsDefault, 3369).
--define(wxStyledTextCtrl_AutoCompGetCurrent, 3370).
--define(wxStyledTextCtrl_Allocate, 3371).
--define(wxStyledTextCtrl_FindColumn, 3372).
--define(wxStyledTextCtrl_GetCaretSticky, 3373).
--define(wxStyledTextCtrl_SetCaretSticky, 3374).
--define(wxStyledTextCtrl_ToggleCaretSticky, 3375).
--define(wxStyledTextCtrl_SetPasteConvertEndings, 3376).
--define(wxStyledTextCtrl_GetPasteConvertEndings, 3377).
--define(wxStyledTextCtrl_SelectionDuplicate, 3378).
--define(wxStyledTextCtrl_SetCaretLineBackAlpha, 3379).
--define(wxStyledTextCtrl_GetCaretLineBackAlpha, 3380).
--define(wxStyledTextCtrl_StartRecord, 3381).
--define(wxStyledTextCtrl_StopRecord, 3382).
--define(wxStyledTextCtrl_SetLexer, 3383).
--define(wxStyledTextCtrl_GetLexer, 3384).
--define(wxStyledTextCtrl_Colourise, 3385).
--define(wxStyledTextCtrl_SetProperty, 3386).
--define(wxStyledTextCtrl_SetKeyWords, 3387).
--define(wxStyledTextCtrl_SetLexerLanguage, 3388).
--define(wxStyledTextCtrl_GetProperty, 3389).
--define(wxStyledTextCtrl_GetStyleBitsNeeded, 3390).
--define(wxStyledTextCtrl_GetCurrentLine, 3391).
--define(wxStyledTextCtrl_StyleSetSpec, 3392).
--define(wxStyledTextCtrl_StyleSetFont, 3393).
--define(wxStyledTextCtrl_StyleSetFontAttr, 3394).
--define(wxStyledTextCtrl_StyleSetCharacterSet, 3395).
--define(wxStyledTextCtrl_StyleSetFontEncoding, 3396).
--define(wxStyledTextCtrl_CmdKeyExecute, 3397).
--define(wxStyledTextCtrl_SetMargins, 3398).
--define(wxStyledTextCtrl_GetSelection, 3399).
--define(wxStyledTextCtrl_PointFromPosition, 3400).
--define(wxStyledTextCtrl_ScrollToLine, 3401).
--define(wxStyledTextCtrl_ScrollToColumn, 3402).
--define(wxStyledTextCtrl_SetVScrollBar, 3403).
--define(wxStyledTextCtrl_SetHScrollBar, 3404).
--define(wxStyledTextCtrl_GetLastKeydownProcessed, 3405).
--define(wxStyledTextCtrl_SetLastKeydownProcessed, 3406).
--define(wxStyledTextCtrl_SaveFile, 3407).
--define(wxStyledTextCtrl_LoadFile, 3408).
--define(wxStyledTextCtrl_DoDragOver, 3409).
--define(wxStyledTextCtrl_DoDropText, 3410).
--define(wxStyledTextCtrl_GetUseAntiAliasing, 3411).
--define(wxStyledTextCtrl_AddTextRaw, 3412).
--define(wxStyledTextCtrl_InsertTextRaw, 3413).
--define(wxStyledTextCtrl_GetCurLineRaw, 3414).
--define(wxStyledTextCtrl_GetLineRaw, 3415).
--define(wxStyledTextCtrl_GetSelectedTextRaw, 3416).
--define(wxStyledTextCtrl_GetTextRangeRaw, 3417).
--define(wxStyledTextCtrl_SetTextRaw, 3418).
--define(wxStyledTextCtrl_GetTextRaw, 3419).
--define(wxStyledTextCtrl_AppendTextRaw, 3420).
--define(wxArtProvider_GetBitmap, 3421).
--define(wxArtProvider_GetIcon, 3422).
--define(wxTreeEvent_GetKeyCode, 3423).
--define(wxTreeEvent_GetItem, 3424).
--define(wxTreeEvent_GetKeyEvent, 3425).
--define(wxTreeEvent_GetLabel, 3426).
--define(wxTreeEvent_GetOldItem, 3427).
--define(wxTreeEvent_GetPoint, 3428).
--define(wxTreeEvent_IsEditCancelled, 3429).
--define(wxTreeEvent_SetToolTip, 3430).
--define(wxNotebookEvent_GetOldSelection, 3431).
--define(wxNotebookEvent_GetSelection, 3432).
--define(wxNotebookEvent_SetOldSelection, 3433).
--define(wxNotebookEvent_SetSelection, 3434).
--define(wxFileDataObject_new, 3435).
--define(wxFileDataObject_AddFile, 3436).
--define(wxFileDataObject_GetFilenames, 3437).
--define(wxFileDataObject_destroy, 3438).
--define(wxTextDataObject_new, 3439).
--define(wxTextDataObject_GetTextLength, 3440).
--define(wxTextDataObject_GetText, 3441).
--define(wxTextDataObject_SetText, 3442).
--define(wxTextDataObject_destroy, 3443).
--define(wxBitmapDataObject_new_1_1, 3444).
--define(wxBitmapDataObject_new_1_0, 3445).
--define(wxBitmapDataObject_GetBitmap, 3446).
--define(wxBitmapDataObject_SetBitmap, 3447).
--define(wxBitmapDataObject_destroy, 3448).
--define(wxClipboard_new, 3450).
--define(wxClipboard_destruct, 3451).
--define(wxClipboard_AddData, 3452).
--define(wxClipboard_Clear, 3453).
--define(wxClipboard_Close, 3454).
--define(wxClipboard_Flush, 3455).
--define(wxClipboard_GetData, 3456).
--define(wxClipboard_IsOpened, 3457).
--define(wxClipboard_Open, 3458).
--define(wxClipboard_SetData, 3459).
--define(wxClipboard_UsePrimarySelection, 3461).
--define(wxClipboard_IsSupported, 3462).
--define(wxClipboard_Get, 3463).
--define(wxSpinEvent_GetPosition, 3464).
--define(wxSpinEvent_SetPosition, 3465).
--define(wxSplitterWindow_new_0, 3466).
--define(wxSplitterWindow_new_2, 3467).
--define(wxSplitterWindow_destruct, 3468).
--define(wxSplitterWindow_Create, 3469).
--define(wxSplitterWindow_GetMinimumPaneSize, 3470).
--define(wxSplitterWindow_GetSashGravity, 3471).
--define(wxSplitterWindow_GetSashPosition, 3472).
--define(wxSplitterWindow_GetSplitMode, 3473).
--define(wxSplitterWindow_GetWindow1, 3474).
--define(wxSplitterWindow_GetWindow2, 3475).
--define(wxSplitterWindow_Initialize, 3476).
--define(wxSplitterWindow_IsSplit, 3477).
--define(wxSplitterWindow_ReplaceWindow, 3478).
--define(wxSplitterWindow_SetSashGravity, 3479).
--define(wxSplitterWindow_SetSashPosition, 3480).
--define(wxSplitterWindow_SetSashSize, 3481).
--define(wxSplitterWindow_SetMinimumPaneSize, 3482).
--define(wxSplitterWindow_SetSplitMode, 3483).
--define(wxSplitterWindow_SplitHorizontally, 3484).
--define(wxSplitterWindow_SplitVertically, 3485).
--define(wxSplitterWindow_Unsplit, 3486).
--define(wxSplitterWindow_UpdateSize, 3487).
--define(wxSplitterEvent_GetSashPosition, 3488).
--define(wxSplitterEvent_GetX, 3489).
--define(wxSplitterEvent_GetY, 3490).
--define(wxSplitterEvent_GetWindowBeingRemoved, 3491).
--define(wxSplitterEvent_SetSashPosition, 3492).
--define(wxHtmlWindow_new_0, 3493).
--define(wxHtmlWindow_new_2, 3494).
--define(wxHtmlWindow_AppendToPage, 3495).
--define(wxHtmlWindow_GetOpenedAnchor, 3496).
--define(wxHtmlWindow_GetOpenedPage, 3497).
--define(wxHtmlWindow_GetOpenedPageTitle, 3498).
--define(wxHtmlWindow_GetRelatedFrame, 3499).
--define(wxHtmlWindow_HistoryBack, 3500).
--define(wxHtmlWindow_HistoryCanBack, 3501).
--define(wxHtmlWindow_HistoryCanForward, 3502).
--define(wxHtmlWindow_HistoryClear, 3503).
--define(wxHtmlWindow_HistoryForward, 3504).
--define(wxHtmlWindow_LoadFile, 3505).
--define(wxHtmlWindow_LoadPage, 3506).
--define(wxHtmlWindow_SelectAll, 3507).
--define(wxHtmlWindow_SelectionToText, 3508).
--define(wxHtmlWindow_SelectLine, 3509).
--define(wxHtmlWindow_SelectWord, 3510).
--define(wxHtmlWindow_SetBorders, 3511).
--define(wxHtmlWindow_SetFonts, 3512).
--define(wxHtmlWindow_SetPage, 3513).
--define(wxHtmlWindow_SetRelatedFrame, 3514).
--define(wxHtmlWindow_SetRelatedStatusBar, 3515).
--define(wxHtmlWindow_ToText, 3516).
--define(wxHtmlWindow_destroy, 3517).
--define(wxHtmlLinkEvent_GetLinkInfo, 3518).
--define(wxSystemSettings_GetColour, 3519).
--define(wxSystemSettings_GetFont, 3520).
--define(wxSystemSettings_GetMetric, 3521).
--define(wxSystemSettings_GetScreenType, 3522).
--define(wxSystemOptions_GetOption, 3523).
--define(wxSystemOptions_GetOptionInt, 3524).
--define(wxSystemOptions_HasOption, 3525).
--define(wxSystemOptions_IsFalse, 3526).
--define(wxSystemOptions_SetOption_2_1, 3527).
--define(wxSystemOptions_SetOption_2_0, 3528).
--define(wxAuiNotebookEvent_SetSelection, 3529).
--define(wxAuiNotebookEvent_GetSelection, 3530).
--define(wxAuiNotebookEvent_SetOldSelection, 3531).
--define(wxAuiNotebookEvent_GetOldSelection, 3532).
--define(wxAuiNotebookEvent_SetDragSource, 3533).
--define(wxAuiNotebookEvent_GetDragSource, 3534).
--define(wxAuiManagerEvent_SetManager, 3535).
--define(wxAuiManagerEvent_GetManager, 3536).
--define(wxAuiManagerEvent_SetPane, 3537).
--define(wxAuiManagerEvent_GetPane, 3538).
--define(wxAuiManagerEvent_SetButton, 3539).
--define(wxAuiManagerEvent_GetButton, 3540).
--define(wxAuiManagerEvent_SetDC, 3541).
--define(wxAuiManagerEvent_GetDC, 3542).
--define(wxAuiManagerEvent_Veto, 3543).
--define(wxAuiManagerEvent_GetVeto, 3544).
--define(wxAuiManagerEvent_SetCanVeto, 3545).
--define(wxAuiManagerEvent_CanVeto, 3546).
--define(wxLogNull_new, 3547).
--define(wxLogNull_destroy, 3548).
--define(wxTaskBarIcon_new, 3549).
--define(wxTaskBarIcon_destruct, 3550).
--define(wxTaskBarIcon_PopupMenu, 3551).
--define(wxTaskBarIcon_RemoveIcon, 3552).
--define(wxTaskBarIcon_SetIcon, 3553).
--define(wxLocale_new_0, 3554).
--define(wxLocale_new_2, 3556).
--define(wxLocale_destruct, 3557).
--define(wxLocale_Init, 3559).
--define(wxLocale_AddCatalog_1, 3560).
--define(wxLocale_AddCatalog_3, 3561).
--define(wxLocale_AddCatalogLookupPathPrefix, 3562).
--define(wxLocale_GetCanonicalName, 3563).
--define(wxLocale_GetLanguage, 3564).
--define(wxLocale_GetLanguageName, 3565).
--define(wxLocale_GetLocale, 3566).
--define(wxLocale_GetName, 3567).
--define(wxLocale_GetString_2, 3568).
--define(wxLocale_GetString_4, 3569).
--define(wxLocale_GetHeaderValue, 3570).
--define(wxLocale_GetSysName, 3571).
--define(wxLocale_GetSystemEncoding, 3572).
--define(wxLocale_GetSystemEncodingName, 3573).
--define(wxLocale_GetSystemLanguage, 3574).
--define(wxLocale_IsLoaded, 3575).
--define(wxLocale_IsOk, 3576).
--define(wxActivateEvent_GetActive, 3577).
--define(wxPopupWindow_new_2, 3579).
--define(wxPopupWindow_new_0, 3580).
--define(wxPopupWindow_destruct, 3582).
--define(wxPopupWindow_Create, 3583).
--define(wxPopupWindow_Position, 3584).
--define(wxPopupTransientWindow_new_0, 3585).
--define(wxPopupTransientWindow_new_2, 3586).
--define(wxPopupTransientWindow_destruct, 3587).
--define(wxPopupTransientWindow_Popup, 3588).
--define(wxPopupTransientWindow_Dismiss, 3589).
--define(wxOverlay_new, 3590).
--define(wxOverlay_destruct, 3591).
--define(wxOverlay_Reset, 3592).
--define(wxDCOverlay_new_6, 3593).
--define(wxDCOverlay_new_2, 3594).
--define(wxDCOverlay_destruct, 3595).
--define(wxDCOverlay_Clear, 3596).
--define(wxDropFilesEvent_GetPosition, 3597).
--define(wxDropFilesEvent_GetNumberOfFiles, 3598).
--define(wxDropFilesEvent_GetFiles, 3599).
--define(wxDisplay_new, 3600).
--define(wxDisplay_destruct, 3601).
--define(wxDisplay_IsOk, 3602).
--define(wxDisplay_GetClientArea, 3603).
--define(wxDisplay_GetGeometry, 3604).
--define(wxDisplay_GetName, 3605).
--define(wxDisplay_IsPrimary, 3606).
--define(wxDisplay_GetCount, 3607).
--define(wxDisplay_GetFromPoint, 3608).
--define(wxDisplay_GetFromWindow, 3609).
--define(wxDisplay_GetPPI, 3610).
--define(wxGCDC_new_1, 3611).
--define(wxGCDC_new_0, 3612).
--define(wxGCDC_destruct, 3613).
--define(wxGCDC_GetGraphicsContext, 3614).
--define(wxGCDC_SetGraphicsContext, 3615).
+-define(wxWindow_IsShownOnScreen, 201).
+-define(wxWindow_Layout, 202).
+-define(wxWindow_LineDown, 203).
+-define(wxWindow_LineUp, 204).
+-define(wxWindow_Lower, 205).
+-define(wxWindow_MakeModal, 206).
+-define(wxWindow_Move_3, 207).
+-define(wxWindow_Move_2, 208).
+-define(wxWindow_MoveAfterInTabOrder, 209).
+-define(wxWindow_MoveBeforeInTabOrder, 210).
+-define(wxWindow_Navigate, 211).
+-define(wxWindow_PageDown, 212).
+-define(wxWindow_PageUp, 213).
+-define(wxWindow_PopEventHandler, 214).
+-define(wxWindow_PopupMenu_2, 215).
+-define(wxWindow_PopupMenu_3, 216).
+-define(wxWindow_Raise, 217).
+-define(wxWindow_Refresh, 218).
+-define(wxWindow_RefreshRect, 219).
+-define(wxWindow_ReleaseMouse, 220).
+-define(wxWindow_RemoveChild, 221).
+-define(wxWindow_Reparent, 222).
+-define(wxWindow_ScreenToClient_2, 223).
+-define(wxWindow_ScreenToClient_1, 224).
+-define(wxWindow_ScrollLines, 226).
+-define(wxWindow_ScrollPages, 228).
+-define(wxWindow_ScrollWindow, 229).
+-define(wxWindow_SetAcceleratorTable, 230).
+-define(wxWindow_SetAutoLayout, 231).
+-define(wxWindow_SetBackgroundColour, 232).
+-define(wxWindow_SetBackgroundStyle, 233).
+-define(wxWindow_SetCaret, 234).
+-define(wxWindow_SetClientSize_2, 235).
+-define(wxWindow_SetClientSize_1_0, 236).
+-define(wxWindow_SetClientSize_1_1, 237).
+-define(wxWindow_SetContainingSizer, 238).
+-define(wxWindow_SetCursor, 239).
+-define(wxWindow_SetMaxSize, 240).
+-define(wxWindow_SetMinSize, 241).
+-define(wxWindow_SetOwnBackgroundColour, 242).
+-define(wxWindow_SetOwnFont, 243).
+-define(wxWindow_SetOwnForegroundColour, 244).
+-define(wxWindow_SetDropTarget, 245).
+-define(wxWindow_SetExtraStyle, 246).
+-define(wxWindow_SetFocus, 247).
+-define(wxWindow_SetFocusFromKbd, 248).
+-define(wxWindow_SetFont, 249).
+-define(wxWindow_SetForegroundColour, 250).
+-define(wxWindow_SetHelpText, 251).
+-define(wxWindow_SetId, 252).
+-define(wxWindow_SetLabel, 254).
+-define(wxWindow_SetName, 255).
+-define(wxWindow_SetPalette, 256).
+-define(wxWindow_SetScrollbar, 257).
+-define(wxWindow_SetScrollPos, 258).
+-define(wxWindow_SetSize_5, 259).
+-define(wxWindow_SetSize_2_0, 260).
+-define(wxWindow_SetSize_1, 261).
+-define(wxWindow_SetSize_2_1, 262).
+-define(wxWindow_SetSizeHints_3, 263).
+-define(wxWindow_SetSizeHints_2, 264).
+-define(wxWindow_SetSizer, 265).
+-define(wxWindow_SetSizerAndFit, 266).
+-define(wxWindow_SetThemeEnabled, 267).
+-define(wxWindow_SetToolTip_1_0, 268).
+-define(wxWindow_SetToolTip_1_1, 269).
+-define(wxWindow_SetVirtualSize_1, 270).
+-define(wxWindow_SetVirtualSize_2, 271).
+-define(wxWindow_SetVirtualSizeHints_3, 272).
+-define(wxWindow_SetVirtualSizeHints_2, 273).
+-define(wxWindow_SetWindowStyle, 274).
+-define(wxWindow_SetWindowStyleFlag, 275).
+-define(wxWindow_SetWindowVariant, 276).
+-define(wxWindow_ShouldInheritColours, 277).
+-define(wxWindow_Show, 278).
+-define(wxWindow_Thaw, 279).
+-define(wxWindow_TransferDataFromWindow, 280).
+-define(wxWindow_TransferDataToWindow, 281).
+-define(wxWindow_Update, 282).
+-define(wxWindow_UpdateWindowUI, 283).
+-define(wxWindow_Validate, 284).
+-define(wxWindow_WarpPointer, 285).
+-define(wxWindow_SetTransparent, 286).
+-define(wxWindow_CanSetTransparent, 287).
+-define(wxWindow_IsDoubleBuffered, 288).
+-define(wxWindow_SetDoubleBuffered, 289).
+-define(wxWindow_GetContentScaleFactor, 290).
+-define(wxTopLevelWindow_GetIcon, 291).
+-define(wxTopLevelWindow_GetIcons, 292).
+-define(wxTopLevelWindow_GetTitle, 293).
+-define(wxTopLevelWindow_IsActive, 294).
+-define(wxTopLevelWindow_Iconize, 295).
+-define(wxTopLevelWindow_IsFullScreen, 296).
+-define(wxTopLevelWindow_IsIconized, 297).
+-define(wxTopLevelWindow_IsMaximized, 298).
+-define(wxTopLevelWindow_Maximize, 299).
+-define(wxTopLevelWindow_RequestUserAttention, 300).
+-define(wxTopLevelWindow_SetIcon, 301).
+-define(wxTopLevelWindow_SetIcons, 302).
+-define(wxTopLevelWindow_CenterOnScreen, 303).
+-define(wxTopLevelWindow_CentreOnScreen, 304).
+-define(wxTopLevelWindow_SetShape, 306).
+-define(wxTopLevelWindow_SetTitle, 307).
+-define(wxTopLevelWindow_ShowFullScreen, 308).
+-define(wxFrame_new_4, 310).
+-define(wxFrame_new_0, 311).
+-define(wxFrame_destruct, 313).
+-define(wxFrame_Create, 314).
+-define(wxFrame_CreateStatusBar, 315).
+-define(wxFrame_CreateToolBar, 316).
+-define(wxFrame_GetClientAreaOrigin, 317).
+-define(wxFrame_GetMenuBar, 318).
+-define(wxFrame_GetStatusBar, 319).
+-define(wxFrame_GetStatusBarPane, 320).
+-define(wxFrame_GetToolBar, 321).
+-define(wxFrame_ProcessCommand, 322).
+-define(wxFrame_SendSizeEvent, 323).
+-define(wxFrame_SetMenuBar, 324).
+-define(wxFrame_SetStatusBar, 325).
+-define(wxFrame_SetStatusBarPane, 326).
+-define(wxFrame_SetStatusText, 327).
+-define(wxFrame_SetStatusWidths, 328).
+-define(wxFrame_SetToolBar, 329).
+-define(wxMiniFrame_new_0, 330).
+-define(wxMiniFrame_new_4, 331).
+-define(wxMiniFrame_Create, 332).
+-define(wxMiniFrame_destroy, 333).
+-define(wxSplashScreen_new_0, 334).
+-define(wxSplashScreen_new_6, 335).
+-define(wxSplashScreen_destruct, 336).
+-define(wxSplashScreen_GetSplashStyle, 337).
+-define(wxSplashScreen_GetTimeout, 338).
+-define(wxPanel_new_0, 339).
+-define(wxPanel_new_6, 340).
+-define(wxPanel_new_2, 341).
+-define(wxPanel_destruct, 342).
+-define(wxPanel_InitDialog, 343).
+-define(wxPanel_SetFocusIgnoringChildren, 344).
+-define(wxScrolledWindow_new_0, 345).
+-define(wxScrolledWindow_new_2, 346).
+-define(wxScrolledWindow_destruct, 347).
+-define(wxScrolledWindow_CalcScrolledPosition_4, 348).
+-define(wxScrolledWindow_CalcScrolledPosition_1, 349).
+-define(wxScrolledWindow_CalcUnscrolledPosition_4, 350).
+-define(wxScrolledWindow_CalcUnscrolledPosition_1, 351).
+-define(wxScrolledWindow_EnableScrolling, 352).
+-define(wxScrolledWindow_GetScrollPixelsPerUnit, 353).
+-define(wxScrolledWindow_GetViewStart, 354).
+-define(wxScrolledWindow_DoPrepareDC, 355).
+-define(wxScrolledWindow_PrepareDC, 356).
+-define(wxScrolledWindow_Scroll, 357).
+-define(wxScrolledWindow_SetScrollbars, 358).
+-define(wxScrolledWindow_SetScrollRate, 359).
+-define(wxScrolledWindow_SetTargetWindow, 360).
+-define(wxSashWindow_new_0, 361).
+-define(wxSashWindow_new_2, 362).
+-define(wxSashWindow_destruct, 363).
+-define(wxSashWindow_GetSashVisible, 364).
+-define(wxSashWindow_GetMaximumSizeX, 365).
+-define(wxSashWindow_GetMaximumSizeY, 366).
+-define(wxSashWindow_GetMinimumSizeX, 367).
+-define(wxSashWindow_GetMinimumSizeY, 368).
+-define(wxSashWindow_SetMaximumSizeX, 369).
+-define(wxSashWindow_SetMaximumSizeY, 370).
+-define(wxSashWindow_SetMinimumSizeX, 371).
+-define(wxSashWindow_SetMinimumSizeY, 372).
+-define(wxSashWindow_SetSashVisible, 373).
+-define(wxSashLayoutWindow_new_0, 374).
+-define(wxSashLayoutWindow_new_2, 375).
+-define(wxSashLayoutWindow_Create, 376).
+-define(wxSashLayoutWindow_GetAlignment, 377).
+-define(wxSashLayoutWindow_GetOrientation, 378).
+-define(wxSashLayoutWindow_SetAlignment, 379).
+-define(wxSashLayoutWindow_SetDefaultSize, 380).
+-define(wxSashLayoutWindow_SetOrientation, 381).
+-define(wxSashLayoutWindow_destroy, 382).
+-define(wxGrid_new_0, 383).
+-define(wxGrid_new_3, 384).
+-define(wxGrid_new_4, 385).
+-define(wxGrid_destruct, 386).
+-define(wxGrid_AppendCols, 387).
+-define(wxGrid_AppendRows, 388).
+-define(wxGrid_AutoSize, 389).
+-define(wxGrid_AutoSizeColumn, 390).
+-define(wxGrid_AutoSizeColumns, 391).
+-define(wxGrid_AutoSizeRow, 392).
+-define(wxGrid_AutoSizeRows, 393).
+-define(wxGrid_BeginBatch, 394).
+-define(wxGrid_BlockToDeviceRect, 395).
+-define(wxGrid_CanDragColSize, 396).
+-define(wxGrid_CanDragRowSize, 397).
+-define(wxGrid_CanDragGridSize, 398).
+-define(wxGrid_CanEnableCellControl, 399).
+-define(wxGrid_CellToRect_2, 400).
+-define(wxGrid_CellToRect_1, 401).
+-define(wxGrid_ClearGrid, 402).
+-define(wxGrid_ClearSelection, 403).
+-define(wxGrid_CreateGrid, 404).
+-define(wxGrid_DeleteCols, 405).
+-define(wxGrid_DeleteRows, 406).
+-define(wxGrid_DisableCellEditControl, 407).
+-define(wxGrid_DisableDragColSize, 408).
+-define(wxGrid_DisableDragGridSize, 409).
+-define(wxGrid_DisableDragRowSize, 410).
+-define(wxGrid_EnableCellEditControl, 411).
+-define(wxGrid_EnableDragColSize, 412).
+-define(wxGrid_EnableDragGridSize, 413).
+-define(wxGrid_EnableDragRowSize, 414).
+-define(wxGrid_EnableEditing, 415).
+-define(wxGrid_EnableGridLines, 416).
+-define(wxGrid_EndBatch, 417).
+-define(wxGrid_Fit, 418).
+-define(wxGrid_ForceRefresh, 419).
+-define(wxGrid_GetBatchCount, 420).
+-define(wxGrid_GetCellAlignment, 421).
+-define(wxGrid_GetCellBackgroundColour, 422).
+-define(wxGrid_GetCellEditor, 423).
+-define(wxGrid_GetCellFont, 424).
+-define(wxGrid_GetCellRenderer, 425).
+-define(wxGrid_GetCellTextColour, 426).
+-define(wxGrid_GetCellValue_2, 427).
+-define(wxGrid_GetCellValue_1, 428).
+-define(wxGrid_GetColLabelAlignment, 429).
+-define(wxGrid_GetColLabelSize, 430).
+-define(wxGrid_GetColLabelValue, 431).
+-define(wxGrid_GetColMinimalAcceptableWidth, 432).
+-define(wxGrid_GetDefaultCellAlignment, 433).
+-define(wxGrid_GetDefaultCellBackgroundColour, 434).
+-define(wxGrid_GetDefaultCellFont, 435).
+-define(wxGrid_GetDefaultCellTextColour, 436).
+-define(wxGrid_GetDefaultColLabelSize, 437).
+-define(wxGrid_GetDefaultColSize, 438).
+-define(wxGrid_GetDefaultEditor, 439).
+-define(wxGrid_GetDefaultEditorForCell_2, 440).
+-define(wxGrid_GetDefaultEditorForCell_1, 441).
+-define(wxGrid_GetDefaultEditorForType, 442).
+-define(wxGrid_GetDefaultRenderer, 443).
+-define(wxGrid_GetDefaultRendererForCell, 444).
+-define(wxGrid_GetDefaultRendererForType, 445).
+-define(wxGrid_GetDefaultRowLabelSize, 446).
+-define(wxGrid_GetDefaultRowSize, 447).
+-define(wxGrid_GetGridCursorCol, 448).
+-define(wxGrid_GetGridCursorRow, 449).
+-define(wxGrid_GetGridLineColour, 450).
+-define(wxGrid_GridLinesEnabled, 451).
+-define(wxGrid_GetLabelBackgroundColour, 452).
+-define(wxGrid_GetLabelFont, 453).
+-define(wxGrid_GetLabelTextColour, 454).
+-define(wxGrid_GetNumberCols, 455).
+-define(wxGrid_GetNumberRows, 456).
+-define(wxGrid_GetOrCreateCellAttr, 457).
+-define(wxGrid_GetRowMinimalAcceptableHeight, 458).
+-define(wxGrid_GetRowLabelAlignment, 459).
+-define(wxGrid_GetRowLabelSize, 460).
+-define(wxGrid_GetRowLabelValue, 461).
+-define(wxGrid_GetRowSize, 462).
+-define(wxGrid_GetScrollLineX, 463).
+-define(wxGrid_GetScrollLineY, 464).
+-define(wxGrid_GetSelectedCells, 465).
+-define(wxGrid_GetSelectedCols, 466).
+-define(wxGrid_GetSelectedRows, 467).
+-define(wxGrid_GetSelectionBackground, 468).
+-define(wxGrid_GetSelectionBlockTopLeft, 469).
+-define(wxGrid_GetSelectionBlockBottomRight, 470).
+-define(wxGrid_GetSelectionForeground, 471).
+-define(wxGrid_GetViewWidth, 472).
+-define(wxGrid_GetGridWindow, 473).
+-define(wxGrid_GetGridRowLabelWindow, 474).
+-define(wxGrid_GetGridColLabelWindow, 475).
+-define(wxGrid_GetGridCornerLabelWindow, 476).
+-define(wxGrid_HideCellEditControl, 477).
+-define(wxGrid_InsertCols, 478).
+-define(wxGrid_InsertRows, 479).
+-define(wxGrid_IsCellEditControlEnabled, 480).
+-define(wxGrid_IsCurrentCellReadOnly, 481).
+-define(wxGrid_IsEditable, 482).
+-define(wxGrid_IsInSelection_2, 483).
+-define(wxGrid_IsInSelection_1, 484).
+-define(wxGrid_IsReadOnly, 485).
+-define(wxGrid_IsSelection, 486).
+-define(wxGrid_IsVisible_3, 487).
+-define(wxGrid_IsVisible_2, 488).
+-define(wxGrid_MakeCellVisible_2, 489).
+-define(wxGrid_MakeCellVisible_1, 490).
+-define(wxGrid_MoveCursorDown, 491).
+-define(wxGrid_MoveCursorLeft, 492).
+-define(wxGrid_MoveCursorRight, 493).
+-define(wxGrid_MoveCursorUp, 494).
+-define(wxGrid_MoveCursorDownBlock, 495).
+-define(wxGrid_MoveCursorLeftBlock, 496).
+-define(wxGrid_MoveCursorRightBlock, 497).
+-define(wxGrid_MoveCursorUpBlock, 498).
+-define(wxGrid_MovePageDown, 499).
+-define(wxGrid_MovePageUp, 500).
+-define(wxGrid_RegisterDataType, 501).
+-define(wxGrid_SaveEditControlValue, 502).
+-define(wxGrid_SelectAll, 503).
+-define(wxGrid_SelectBlock_5, 504).
+-define(wxGrid_SelectBlock_3, 505).
+-define(wxGrid_SelectCol, 506).
+-define(wxGrid_SelectRow, 507).
+-define(wxGrid_SetCellAlignment_4, 508).
+-define(wxGrid_SetCellAlignment_3, 509).
+-define(wxGrid_SetCellAlignment_1, 510).
+-define(wxGrid_SetCellBackgroundColour_3_0, 511).
+-define(wxGrid_SetCellBackgroundColour_1, 512).
+-define(wxGrid_SetCellBackgroundColour_3_1, 513).
+-define(wxGrid_SetCellEditor, 514).
+-define(wxGrid_SetCellFont, 515).
+-define(wxGrid_SetCellRenderer, 516).
+-define(wxGrid_SetCellTextColour_3_0, 517).
+-define(wxGrid_SetCellTextColour_3_1, 518).
+-define(wxGrid_SetCellTextColour_1, 519).
+-define(wxGrid_SetCellValue_3_0, 520).
+-define(wxGrid_SetCellValue_2, 521).
+-define(wxGrid_SetCellValue_3_1, 522).
+-define(wxGrid_SetColAttr, 523).
+-define(wxGrid_SetColFormatBool, 524).
+-define(wxGrid_SetColFormatNumber, 525).
+-define(wxGrid_SetColFormatFloat, 526).
+-define(wxGrid_SetColFormatCustom, 527).
+-define(wxGrid_SetColLabelAlignment, 528).
+-define(wxGrid_SetColLabelSize, 529).
+-define(wxGrid_SetColLabelValue, 530).
+-define(wxGrid_SetColMinimalWidth, 531).
+-define(wxGrid_SetColMinimalAcceptableWidth, 532).
+-define(wxGrid_SetColSize, 533).
+-define(wxGrid_SetDefaultCellAlignment, 534).
+-define(wxGrid_SetDefaultCellBackgroundColour, 535).
+-define(wxGrid_SetDefaultCellFont, 536).
+-define(wxGrid_SetDefaultCellTextColour, 537).
+-define(wxGrid_SetDefaultEditor, 538).
+-define(wxGrid_SetDefaultRenderer, 539).
+-define(wxGrid_SetDefaultColSize, 540).
+-define(wxGrid_SetDefaultRowSize, 541).
+-define(wxGrid_SetGridCursor, 542).
+-define(wxGrid_SetGridLineColour, 543).
+-define(wxGrid_SetLabelBackgroundColour, 544).
+-define(wxGrid_SetLabelFont, 545).
+-define(wxGrid_SetLabelTextColour, 546).
+-define(wxGrid_SetMargins, 547).
+-define(wxGrid_SetReadOnly, 548).
+-define(wxGrid_SetRowAttr, 549).
+-define(wxGrid_SetRowLabelAlignment, 550).
+-define(wxGrid_SetRowLabelSize, 551).
+-define(wxGrid_SetRowLabelValue, 552).
+-define(wxGrid_SetRowMinimalHeight, 553).
+-define(wxGrid_SetRowMinimalAcceptableHeight, 554).
+-define(wxGrid_SetRowSize, 555).
+-define(wxGrid_SetScrollLineX, 556).
+-define(wxGrid_SetScrollLineY, 557).
+-define(wxGrid_SetSelectionBackground, 558).
+-define(wxGrid_SetSelectionForeground, 559).
+-define(wxGrid_SetSelectionMode, 560).
+-define(wxGrid_ShowCellEditControl, 561).
+-define(wxGrid_XToCol, 562).
+-define(wxGrid_XToEdgeOfCol, 563).
+-define(wxGrid_YToEdgeOfRow, 564).
+-define(wxGrid_YToRow, 565).
+-define(wxGridCellRenderer_Draw, 566).
+-define(wxGridCellRenderer_GetBestSize, 567).
+-define(wxGridCellEditor_Create, 568).
+-define(wxGridCellEditor_IsCreated, 569).
+-define(wxGridCellEditor_SetSize, 570).
+-define(wxGridCellEditor_Show, 571).
+-define(wxGridCellEditor_PaintBackground, 572).
+-define(wxGridCellEditor_BeginEdit, 573).
+-define(wxGridCellEditor_EndEdit, 574).
+-define(wxGridCellEditor_Reset, 575).
+-define(wxGridCellEditor_StartingKey, 576).
+-define(wxGridCellEditor_StartingClick, 577).
+-define(wxGridCellEditor_HandleReturn, 578).
+-define(wxGridCellBoolRenderer_new, 579).
+-define(wxGridCellBoolRenderer_destroy, 580).
+-define(wxGridCellBoolEditor_new, 581).
+-define(wxGridCellBoolEditor_IsTrueValue, 582).
+-define(wxGridCellBoolEditor_UseStringValues, 583).
+-define(wxGridCellBoolEditor_destroy, 584).
+-define(wxGridCellFloatRenderer_new, 585).
+-define(wxGridCellFloatRenderer_GetPrecision, 586).
+-define(wxGridCellFloatRenderer_GetWidth, 587).
+-define(wxGridCellFloatRenderer_SetParameters, 588).
+-define(wxGridCellFloatRenderer_SetPrecision, 589).
+-define(wxGridCellFloatRenderer_SetWidth, 590).
+-define(wxGridCellFloatRenderer_destroy, 591).
+-define(wxGridCellFloatEditor_new, 592).
+-define(wxGridCellFloatEditor_SetParameters, 593).
+-define(wxGridCellFloatEditor_destroy, 594).
+-define(wxGridCellStringRenderer_new, 595).
+-define(wxGridCellStringRenderer_destroy, 596).
+-define(wxGridCellTextEditor_new, 597).
+-define(wxGridCellTextEditor_SetParameters, 598).
+-define(wxGridCellTextEditor_destroy, 599).
+-define(wxGridCellChoiceEditor_new, 601).
+-define(wxGridCellChoiceEditor_SetParameters, 602).
+-define(wxGridCellChoiceEditor_destroy, 603).
+-define(wxGridCellNumberRenderer_new, 604).
+-define(wxGridCellNumberRenderer_destroy, 605).
+-define(wxGridCellNumberEditor_new, 606).
+-define(wxGridCellNumberEditor_GetValue, 607).
+-define(wxGridCellNumberEditor_SetParameters, 608).
+-define(wxGridCellNumberEditor_destroy, 609).
+-define(wxGridCellAttr_SetTextColour, 610).
+-define(wxGridCellAttr_SetBackgroundColour, 611).
+-define(wxGridCellAttr_SetFont, 612).
+-define(wxGridCellAttr_SetAlignment, 613).
+-define(wxGridCellAttr_SetReadOnly, 614).
+-define(wxGridCellAttr_SetRenderer, 615).
+-define(wxGridCellAttr_SetEditor, 616).
+-define(wxGridCellAttr_HasTextColour, 617).
+-define(wxGridCellAttr_HasBackgroundColour, 618).
+-define(wxGridCellAttr_HasFont, 619).
+-define(wxGridCellAttr_HasAlignment, 620).
+-define(wxGridCellAttr_HasRenderer, 621).
+-define(wxGridCellAttr_HasEditor, 622).
+-define(wxGridCellAttr_GetTextColour, 623).
+-define(wxGridCellAttr_GetBackgroundColour, 624).
+-define(wxGridCellAttr_GetFont, 625).
+-define(wxGridCellAttr_GetAlignment, 626).
+-define(wxGridCellAttr_GetRenderer, 627).
+-define(wxGridCellAttr_GetEditor, 628).
+-define(wxGridCellAttr_IsReadOnly, 629).
+-define(wxGridCellAttr_SetDefAttr, 630).
+-define(wxDC_Blit, 631).
+-define(wxDC_CalcBoundingBox, 632).
+-define(wxDC_Clear, 633).
+-define(wxDC_ComputeScaleAndOrigin, 634).
+-define(wxDC_CrossHair, 635).
+-define(wxDC_DestroyClippingRegion, 636).
+-define(wxDC_DeviceToLogicalX, 637).
+-define(wxDC_DeviceToLogicalXRel, 638).
+-define(wxDC_DeviceToLogicalY, 639).
+-define(wxDC_DeviceToLogicalYRel, 640).
+-define(wxDC_DrawArc, 641).
+-define(wxDC_DrawBitmap, 642).
+-define(wxDC_DrawCheckMark, 643).
+-define(wxDC_DrawCircle, 644).
+-define(wxDC_DrawEllipse_2, 646).
+-define(wxDC_DrawEllipse_1, 647).
+-define(wxDC_DrawEllipticArc, 648).
+-define(wxDC_DrawIcon, 649).
+-define(wxDC_DrawLabel, 650).
+-define(wxDC_DrawLine, 651).
+-define(wxDC_DrawLines, 652).
+-define(wxDC_DrawPolygon, 654).
+-define(wxDC_DrawPoint, 656).
+-define(wxDC_DrawRectangle_2, 658).
+-define(wxDC_DrawRectangle_1, 659).
+-define(wxDC_DrawRotatedText, 660).
+-define(wxDC_DrawRoundedRectangle_3, 662).
+-define(wxDC_DrawRoundedRectangle_2, 663).
+-define(wxDC_DrawText, 664).
+-define(wxDC_EndDoc, 665).
+-define(wxDC_EndPage, 666).
+-define(wxDC_FloodFill, 667).
+-define(wxDC_GetBackground, 668).
+-define(wxDC_GetBackgroundMode, 669).
+-define(wxDC_GetBrush, 670).
+-define(wxDC_GetCharHeight, 671).
+-define(wxDC_GetCharWidth, 672).
+-define(wxDC_GetClippingBox, 673).
+-define(wxDC_GetFont, 675).
+-define(wxDC_GetLayoutDirection, 676).
+-define(wxDC_GetLogicalFunction, 677).
+-define(wxDC_GetMapMode, 678).
+-define(wxDC_GetMultiLineTextExtent_4, 679).
+-define(wxDC_GetMultiLineTextExtent_1, 680).
+-define(wxDC_GetPartialTextExtents, 681).
+-define(wxDC_GetPen, 682).
+-define(wxDC_GetPixel, 683).
+-define(wxDC_GetPPI, 684).
+-define(wxDC_GetSize, 686).
+-define(wxDC_GetSizeMM, 688).
+-define(wxDC_GetTextBackground, 689).
+-define(wxDC_GetTextExtent_4, 690).
+-define(wxDC_GetTextExtent_1, 691).
+-define(wxDC_GetTextForeground, 693).
+-define(wxDC_GetUserScale, 694).
+-define(wxDC_GradientFillConcentric_3, 695).
+-define(wxDC_GradientFillConcentric_4, 696).
+-define(wxDC_GradientFillLinear, 697).
+-define(wxDC_LogicalToDeviceX, 698).
+-define(wxDC_LogicalToDeviceXRel, 699).
+-define(wxDC_LogicalToDeviceY, 700).
+-define(wxDC_LogicalToDeviceYRel, 701).
+-define(wxDC_MaxX, 702).
+-define(wxDC_MaxY, 703).
+-define(wxDC_MinX, 704).
+-define(wxDC_MinY, 705).
+-define(wxDC_IsOk, 706).
+-define(wxDC_ResetBoundingBox, 707).
+-define(wxDC_SetAxisOrientation, 708).
+-define(wxDC_SetBackground, 709).
+-define(wxDC_SetBackgroundMode, 710).
+-define(wxDC_SetBrush, 711).
+-define(wxDC_SetClippingRegion_2, 713).
+-define(wxDC_SetClippingRegion_1_1, 714).
+-define(wxDC_SetClippingRegion_1_0, 715).
+-define(wxDC_SetDeviceOrigin, 716).
+-define(wxDC_SetFont, 717).
+-define(wxDC_SetLayoutDirection, 718).
+-define(wxDC_SetLogicalFunction, 719).
+-define(wxDC_SetMapMode, 720).
+-define(wxDC_SetPalette, 721).
+-define(wxDC_SetPen, 722).
+-define(wxDC_SetTextBackground, 723).
+-define(wxDC_SetTextForeground, 724).
+-define(wxDC_SetUserScale, 725).
+-define(wxDC_StartDoc, 726).
+-define(wxDC_StartPage, 727).
+-define(wxMirrorDC_new, 728).
+-define(wxMirrorDC_destroy, 729).
+-define(wxScreenDC_new, 730).
+-define(wxScreenDC_destruct, 731).
+-define(wxPostScriptDC_new_0, 732).
+-define(wxPostScriptDC_new_1, 733).
+-define(wxPostScriptDC_destruct, 734).
+-define(wxPostScriptDC_SetResolution, 735).
+-define(wxPostScriptDC_GetResolution, 736).
+-define(wxWindowDC_new_0, 737).
+-define(wxWindowDC_new_1, 738).
+-define(wxWindowDC_destruct, 739).
+-define(wxClientDC_new_0, 740).
+-define(wxClientDC_new_1, 741).
+-define(wxClientDC_destroy, 742).
+-define(wxPaintDC_new_0, 743).
+-define(wxPaintDC_new_1, 744).
+-define(wxPaintDC_destroy, 745).
+-define(wxMemoryDC_new_1_0, 747).
+-define(wxMemoryDC_new_1_1, 748).
+-define(wxMemoryDC_new_0, 749).
+-define(wxMemoryDC_destruct, 751).
+-define(wxMemoryDC_SelectObject, 752).
+-define(wxMemoryDC_SelectObjectAsSource, 753).
+-define(wxBufferedDC_new_0, 754).
+-define(wxBufferedDC_new_2, 755).
+-define(wxBufferedDC_new_3, 756).
+-define(wxBufferedDC_destruct, 757).
+-define(wxBufferedDC_Init_2, 758).
+-define(wxBufferedDC_Init_3, 759).
+-define(wxBufferedPaintDC_new_3, 760).
+-define(wxBufferedPaintDC_new_2, 761).
+-define(wxBufferedPaintDC_destruct, 762).
+-define(wxGraphicsObject_destruct, 763).
+-define(wxGraphicsObject_GetRenderer, 764).
+-define(wxGraphicsObject_IsNull, 765).
+-define(wxGraphicsContext_destruct, 766).
+-define(wxGraphicsContext_Create_1_1, 767).
+-define(wxGraphicsContext_Create_1_0, 768).
+-define(wxGraphicsContext_Create_0, 769).
+-define(wxGraphicsContext_CreatePen, 770).
+-define(wxGraphicsContext_CreateBrush, 771).
+-define(wxGraphicsContext_CreateRadialGradientBrush, 772).
+-define(wxGraphicsContext_CreateLinearGradientBrush, 773).
+-define(wxGraphicsContext_CreateFont, 774).
+-define(wxGraphicsContext_CreateMatrix, 775).
+-define(wxGraphicsContext_CreatePath, 776).
+-define(wxGraphicsContext_Clip_1, 777).
+-define(wxGraphicsContext_Clip_4, 778).
+-define(wxGraphicsContext_ResetClip, 779).
+-define(wxGraphicsContext_DrawBitmap, 780).
+-define(wxGraphicsContext_DrawEllipse, 781).
+-define(wxGraphicsContext_DrawIcon, 782).
+-define(wxGraphicsContext_DrawLines, 783).
+-define(wxGraphicsContext_DrawPath, 784).
+-define(wxGraphicsContext_DrawRectangle, 785).
+-define(wxGraphicsContext_DrawRoundedRectangle, 786).
+-define(wxGraphicsContext_DrawText_3, 787).
+-define(wxGraphicsContext_DrawText_4_0, 788).
+-define(wxGraphicsContext_DrawText_4_1, 789).
+-define(wxGraphicsContext_DrawText_5, 790).
+-define(wxGraphicsContext_FillPath, 791).
+-define(wxGraphicsContext_StrokePath, 792).
+-define(wxGraphicsContext_GetPartialTextExtents, 793).
+-define(wxGraphicsContext_GetTextExtent, 794).
+-define(wxGraphicsContext_Rotate, 795).
+-define(wxGraphicsContext_Scale, 796).
+-define(wxGraphicsContext_Translate, 797).
+-define(wxGraphicsContext_GetTransform, 798).
+-define(wxGraphicsContext_SetTransform, 799).
+-define(wxGraphicsContext_ConcatTransform, 800).
+-define(wxGraphicsContext_SetBrush_1_1, 801).
+-define(wxGraphicsContext_SetBrush_1_0, 802).
+-define(wxGraphicsContext_SetFont_1, 803).
+-define(wxGraphicsContext_SetFont_2, 804).
+-define(wxGraphicsContext_SetPen_1_0, 805).
+-define(wxGraphicsContext_SetPen_1_1, 806).
+-define(wxGraphicsContext_StrokeLine, 807).
+-define(wxGraphicsContext_StrokeLines, 808).
+-define(wxGraphicsMatrix_Concat, 810).
+-define(wxGraphicsMatrix_Get, 812).
+-define(wxGraphicsMatrix_Invert, 813).
+-define(wxGraphicsMatrix_IsEqual, 814).
+-define(wxGraphicsMatrix_IsIdentity, 816).
+-define(wxGraphicsMatrix_Rotate, 817).
+-define(wxGraphicsMatrix_Scale, 818).
+-define(wxGraphicsMatrix_Translate, 819).
+-define(wxGraphicsMatrix_Set, 820).
+-define(wxGraphicsMatrix_TransformPoint, 821).
+-define(wxGraphicsMatrix_TransformDistance, 822).
+-define(wxGraphicsPath_MoveToPoint_2, 823).
+-define(wxGraphicsPath_MoveToPoint_1, 824).
+-define(wxGraphicsPath_AddArc_6, 825).
+-define(wxGraphicsPath_AddArc_5, 826).
+-define(wxGraphicsPath_AddArcToPoint, 827).
+-define(wxGraphicsPath_AddCircle, 828).
+-define(wxGraphicsPath_AddCurveToPoint_6, 829).
+-define(wxGraphicsPath_AddCurveToPoint_3, 830).
+-define(wxGraphicsPath_AddEllipse, 831).
+-define(wxGraphicsPath_AddLineToPoint_2, 832).
+-define(wxGraphicsPath_AddLineToPoint_1, 833).
+-define(wxGraphicsPath_AddPath, 834).
+-define(wxGraphicsPath_AddQuadCurveToPoint, 835).
+-define(wxGraphicsPath_AddRectangle, 836).
+-define(wxGraphicsPath_AddRoundedRectangle, 837).
+-define(wxGraphicsPath_CloseSubpath, 838).
+-define(wxGraphicsPath_Contains_3, 839).
+-define(wxGraphicsPath_Contains_2, 840).
+-define(wxGraphicsPath_GetBox, 842).
+-define(wxGraphicsPath_GetCurrentPoint, 844).
+-define(wxGraphicsPath_Transform, 845).
+-define(wxGraphicsRenderer_GetDefaultRenderer, 846).
+-define(wxGraphicsRenderer_CreateContext_1_1, 847).
+-define(wxGraphicsRenderer_CreateContext_1_0, 848).
+-define(wxGraphicsRenderer_CreatePen, 849).
+-define(wxGraphicsRenderer_CreateBrush, 850).
+-define(wxGraphicsRenderer_CreateLinearGradientBrush, 851).
+-define(wxGraphicsRenderer_CreateRadialGradientBrush, 852).
+-define(wxGraphicsRenderer_CreateFont, 853).
+-define(wxGraphicsRenderer_CreateMatrix, 854).
+-define(wxGraphicsRenderer_CreatePath, 855).
+-define(wxMenuBar_new_1, 857).
+-define(wxMenuBar_new_0, 859).
+-define(wxMenuBar_destruct, 861).
+-define(wxMenuBar_Append, 862).
+-define(wxMenuBar_Check, 863).
+-define(wxMenuBar_Enable_2, 864).
+-define(wxMenuBar_Enable_1, 865).
+-define(wxMenuBar_EnableTop, 866).
+-define(wxMenuBar_FindMenu, 867).
+-define(wxMenuBar_FindMenuItem, 868).
+-define(wxMenuBar_FindItem, 869).
+-define(wxMenuBar_GetHelpString, 870).
+-define(wxMenuBar_GetLabel_1, 871).
+-define(wxMenuBar_GetLabel_0, 872).
+-define(wxMenuBar_GetLabelTop, 873).
+-define(wxMenuBar_GetMenu, 874).
+-define(wxMenuBar_GetMenuCount, 875).
+-define(wxMenuBar_Insert, 876).
+-define(wxMenuBar_IsChecked, 877).
+-define(wxMenuBar_SetAutoWindowMenu, 878).
+-define(wxMenuBar_GetAutoWindowMenu, 879).
+-define(wxMenuBar_OSXGetAppleMenu, 880).
+-define(wxMenuBar_IsEnabled_1, 881).
+-define(wxMenuBar_IsEnabled_0, 882).
+-define(wxMenuBar_Remove, 883).
+-define(wxMenuBar_Replace, 884).
+-define(wxMenuBar_SetHelpString, 885).
+-define(wxMenuBar_SetLabel_2, 886).
+-define(wxMenuBar_SetLabel_1, 887).
+-define(wxMenuBar_SetLabelTop, 888).
+-define(wxControl_GetLabel, 889).
+-define(wxControl_SetLabel, 890).
+-define(wxControlWithItems_Append_1, 891).
+-define(wxControlWithItems_Append_2, 892).
+-define(wxControlWithItems_appendStrings_1, 893).
+-define(wxControlWithItems_Clear, 894).
+-define(wxControlWithItems_Delete, 895).
+-define(wxControlWithItems_FindString, 896).
+-define(wxControlWithItems_getClientData, 897).
+-define(wxControlWithItems_setClientData, 898).
+-define(wxControlWithItems_GetCount, 899).
+-define(wxControlWithItems_GetSelection, 900).
+-define(wxControlWithItems_GetString, 901).
+-define(wxControlWithItems_GetStringSelection, 902).
+-define(wxControlWithItems_Insert_2, 903).
+-define(wxControlWithItems_Insert_3, 904).
+-define(wxControlWithItems_IsEmpty, 905).
+-define(wxControlWithItems_Select, 906).
+-define(wxControlWithItems_SetSelection, 907).
+-define(wxControlWithItems_SetString, 908).
+-define(wxControlWithItems_SetStringSelection, 909).
+-define(wxMenu_new_2, 912).
+-define(wxMenu_new_1, 913).
+-define(wxMenu_destruct, 915).
+-define(wxMenu_Append_3, 916).
+-define(wxMenu_Append_1, 917).
+-define(wxMenu_Append_4_0, 918).
+-define(wxMenu_Append_4_1, 919).
+-define(wxMenu_AppendCheckItem, 920).
+-define(wxMenu_AppendRadioItem, 921).
+-define(wxMenu_AppendSeparator, 922).
+-define(wxMenu_Break, 923).
+-define(wxMenu_Check, 924).
+-define(wxMenu_Delete_1_0, 925).
+-define(wxMenu_Delete_1_1, 926).
+-define(wxMenu_Destroy_1_0, 927).
+-define(wxMenu_Destroy_1_1, 928).
+-define(wxMenu_Enable, 929).
+-define(wxMenu_FindItem_1, 930).
+-define(wxMenu_FindItem_2, 931).
+-define(wxMenu_FindItemByPosition, 932).
+-define(wxMenu_GetHelpString, 933).
+-define(wxMenu_GetLabel, 934).
+-define(wxMenu_GetMenuItemCount, 935).
+-define(wxMenu_GetMenuItems, 936).
+-define(wxMenu_GetTitle, 938).
+-define(wxMenu_Insert_2, 939).
+-define(wxMenu_Insert_3, 940).
+-define(wxMenu_Insert_5_1, 941).
+-define(wxMenu_Insert_5_0, 942).
+-define(wxMenu_InsertCheckItem, 943).
+-define(wxMenu_InsertRadioItem, 944).
+-define(wxMenu_InsertSeparator, 945).
+-define(wxMenu_IsChecked, 946).
+-define(wxMenu_IsEnabled, 947).
+-define(wxMenu_Prepend_1, 948).
+-define(wxMenu_Prepend_2, 949).
+-define(wxMenu_Prepend_4_1, 950).
+-define(wxMenu_Prepend_4_0, 951).
+-define(wxMenu_PrependCheckItem, 952).
+-define(wxMenu_PrependRadioItem, 953).
+-define(wxMenu_PrependSeparator, 954).
+-define(wxMenu_Remove_1_0, 955).
+-define(wxMenu_Remove_1_1, 956).
+-define(wxMenu_SetHelpString, 957).
+-define(wxMenu_SetLabel, 958).
+-define(wxMenu_SetTitle, 959).
+-define(wxMenuItem_new, 960).
+-define(wxMenuItem_destruct, 962).
+-define(wxMenuItem_Check, 963).
+-define(wxMenuItem_Enable, 964).
+-define(wxMenuItem_GetBitmap, 965).
+-define(wxMenuItem_GetHelp, 966).
+-define(wxMenuItem_GetId, 967).
+-define(wxMenuItem_GetKind, 968).
+-define(wxMenuItem_GetLabel, 969).
+-define(wxMenuItem_GetLabelFromText, 970).
+-define(wxMenuItem_GetMenu, 971).
+-define(wxMenuItem_GetText, 972).
+-define(wxMenuItem_GetSubMenu, 973).
+-define(wxMenuItem_IsCheckable, 974).
+-define(wxMenuItem_IsChecked, 975).
+-define(wxMenuItem_IsEnabled, 976).
+-define(wxMenuItem_IsSeparator, 977).
+-define(wxMenuItem_IsSubMenu, 978).
+-define(wxMenuItem_SetBitmap, 979).
+-define(wxMenuItem_SetHelp, 980).
+-define(wxMenuItem_SetMenu, 981).
+-define(wxMenuItem_SetSubMenu, 982).
+-define(wxMenuItem_SetText, 983).
+-define(wxToolBar_AddControl, 984).
+-define(wxToolBar_AddSeparator, 985).
+-define(wxToolBar_AddTool_5, 986).
+-define(wxToolBar_AddTool_4_0, 987).
+-define(wxToolBar_AddTool_1, 988).
+-define(wxToolBar_AddTool_4_1, 989).
+-define(wxToolBar_AddTool_3, 990).
+-define(wxToolBar_AddTool_6, 991).
+-define(wxToolBar_AddCheckTool, 992).
+-define(wxToolBar_AddRadioTool, 993).
+-define(wxToolBar_AddStretchableSpace, 994).
+-define(wxToolBar_InsertStretchableSpace, 995).
+-define(wxToolBar_DeleteTool, 996).
+-define(wxToolBar_DeleteToolByPos, 997).
+-define(wxToolBar_EnableTool, 998).
+-define(wxToolBar_FindById, 999).
+-define(wxToolBar_FindControl, 1000).
+-define(wxToolBar_FindToolForPosition, 1001).
+-define(wxToolBar_GetToolSize, 1002).
+-define(wxToolBar_GetToolBitmapSize, 1003).
+-define(wxToolBar_GetMargins, 1004).
+-define(wxToolBar_GetToolEnabled, 1005).
+-define(wxToolBar_GetToolLongHelp, 1006).
+-define(wxToolBar_GetToolPacking, 1007).
+-define(wxToolBar_GetToolPos, 1008).
+-define(wxToolBar_GetToolSeparation, 1009).
+-define(wxToolBar_GetToolShortHelp, 1010).
+-define(wxToolBar_GetToolState, 1011).
+-define(wxToolBar_InsertControl, 1012).
+-define(wxToolBar_InsertSeparator, 1013).
+-define(wxToolBar_InsertTool_5, 1014).
+-define(wxToolBar_InsertTool_2, 1015).
+-define(wxToolBar_InsertTool_4, 1016).
+-define(wxToolBar_Realize, 1017).
+-define(wxToolBar_RemoveTool, 1018).
+-define(wxToolBar_SetMargins, 1019).
+-define(wxToolBar_SetToolBitmapSize, 1020).
+-define(wxToolBar_SetToolLongHelp, 1021).
+-define(wxToolBar_SetToolPacking, 1022).
+-define(wxToolBar_SetToolShortHelp, 1023).
+-define(wxToolBar_SetToolSeparation, 1024).
+-define(wxToolBar_ToggleTool, 1025).
+-define(wxStatusBar_new_0, 1027).
+-define(wxStatusBar_new_2, 1028).
+-define(wxStatusBar_destruct, 1030).
+-define(wxStatusBar_Create, 1031).
+-define(wxStatusBar_GetFieldRect, 1032).
+-define(wxStatusBar_GetFieldsCount, 1033).
+-define(wxStatusBar_GetStatusText, 1034).
+-define(wxStatusBar_PopStatusText, 1035).
+-define(wxStatusBar_PushStatusText, 1036).
+-define(wxStatusBar_SetFieldsCount, 1037).
+-define(wxStatusBar_SetMinHeight, 1038).
+-define(wxStatusBar_SetStatusText, 1039).
+-define(wxStatusBar_SetStatusWidths, 1040).
+-define(wxStatusBar_SetStatusStyles, 1041).
+-define(wxBitmap_new_0, 1042).
+-define(wxBitmap_new_3, 1043).
+-define(wxBitmap_new_4, 1044).
+-define(wxBitmap_new_2_0, 1045).
+-define(wxBitmap_new_2_1, 1046).
+-define(wxBitmap_destruct, 1047).
+-define(wxBitmap_ConvertToImage, 1048).
+-define(wxBitmap_CopyFromIcon, 1049).
+-define(wxBitmap_Create, 1050).
+-define(wxBitmap_GetDepth, 1051).
+-define(wxBitmap_GetHeight, 1052).
+-define(wxBitmap_GetPalette, 1053).
+-define(wxBitmap_GetMask, 1054).
+-define(wxBitmap_GetWidth, 1055).
+-define(wxBitmap_GetSubBitmap, 1056).
+-define(wxBitmap_LoadFile, 1057).
+-define(wxBitmap_Ok, 1058).
+-define(wxBitmap_SaveFile, 1059).
+-define(wxBitmap_SetDepth, 1060).
+-define(wxBitmap_SetHeight, 1061).
+-define(wxBitmap_SetMask, 1062).
+-define(wxBitmap_SetPalette, 1063).
+-define(wxBitmap_SetWidth, 1064).
+-define(wxIcon_new_0, 1065).
+-define(wxIcon_new_2, 1066).
+-define(wxIcon_new_1, 1067).
+-define(wxIcon_CopyFromBitmap, 1068).
+-define(wxIcon_destroy, 1069).
+-define(wxIconBundle_new_0, 1070).
+-define(wxIconBundle_new_2, 1071).
+-define(wxIconBundle_new_1_0, 1072).
+-define(wxIconBundle_new_1_1, 1073).
+-define(wxIconBundle_destruct, 1074).
+-define(wxIconBundle_AddIcon_2, 1075).
+-define(wxIconBundle_AddIcon_1, 1076).
+-define(wxIconBundle_GetIcon_1_1, 1077).
+-define(wxIconBundle_GetIcon_1_0, 1078).
+-define(wxCursor_new_0, 1079).
+-define(wxCursor_new_1_0, 1080).
+-define(wxCursor_new_1_1, 1081).
+-define(wxCursor_new_4, 1082).
+-define(wxCursor_destruct, 1083).
+-define(wxCursor_Ok, 1084).
+-define(wxMask_new_0, 1085).
+-define(wxMask_new_2_1, 1086).
+-define(wxMask_new_2_0, 1087).
+-define(wxMask_new_1, 1088).
+-define(wxMask_destruct, 1089).
+-define(wxMask_Create_2_1, 1090).
+-define(wxMask_Create_2_0, 1091).
+-define(wxMask_Create_1, 1092).
+-define(wxImage_new_0, 1093).
+-define(wxImage_new_3_0, 1094).
+-define(wxImage_new_4, 1095).
+-define(wxImage_new_5, 1096).
+-define(wxImage_new_2, 1097).
+-define(wxImage_new_3_1, 1098).
+-define(wxImage_Blur, 1099).
+-define(wxImage_BlurHorizontal, 1100).
+-define(wxImage_BlurVertical, 1101).
+-define(wxImage_ConvertAlphaToMask, 1102).
+-define(wxImage_ConvertToGreyscale, 1103).
+-define(wxImage_ConvertToMono, 1104).
+-define(wxImage_Copy, 1105).
+-define(wxImage_Create_3, 1106).
+-define(wxImage_Create_4, 1107).
+-define(wxImage_Create_5, 1108).
+-define(wxImage_Destroy, 1109).
+-define(wxImage_FindFirstUnusedColour, 1110).
+-define(wxImage_GetImageExtWildcard, 1111).
+-define(wxImage_GetAlpha_2, 1112).
+-define(wxImage_GetAlpha_0, 1113).
+-define(wxImage_GetBlue, 1114).
+-define(wxImage_GetData, 1115).
+-define(wxImage_GetGreen, 1116).
+-define(wxImage_GetImageCount, 1117).
+-define(wxImage_GetHeight, 1118).
+-define(wxImage_GetMaskBlue, 1119).
+-define(wxImage_GetMaskGreen, 1120).
+-define(wxImage_GetMaskRed, 1121).
+-define(wxImage_GetOrFindMaskColour, 1122).
+-define(wxImage_GetPalette, 1123).
+-define(wxImage_GetRed, 1124).
+-define(wxImage_GetSubImage, 1125).
+-define(wxImage_GetWidth, 1126).
+-define(wxImage_HasAlpha, 1127).
+-define(wxImage_HasMask, 1128).
+-define(wxImage_GetOption, 1129).
+-define(wxImage_GetOptionInt, 1130).
+-define(wxImage_HasOption, 1131).
+-define(wxImage_InitAlpha, 1132).
+-define(wxImage_InitStandardHandlers, 1133).
+-define(wxImage_IsTransparent, 1134).
+-define(wxImage_LoadFile_2, 1135).
+-define(wxImage_LoadFile_3, 1136).
+-define(wxImage_Ok, 1137).
+-define(wxImage_RemoveHandler, 1138).
+-define(wxImage_Mirror, 1139).
+-define(wxImage_Replace, 1140).
+-define(wxImage_Rescale, 1141).
+-define(wxImage_Resize, 1142).
+-define(wxImage_Rotate, 1143).
+-define(wxImage_RotateHue, 1144).
+-define(wxImage_Rotate90, 1145).
+-define(wxImage_SaveFile_1, 1146).
+-define(wxImage_SaveFile_2_0, 1147).
+-define(wxImage_SaveFile_2_1, 1148).
+-define(wxImage_Scale, 1149).
+-define(wxImage_Size, 1150).
+-define(wxImage_SetAlpha_3, 1151).
+-define(wxImage_SetAlpha_2, 1152).
+-define(wxImage_SetData_2, 1153).
+-define(wxImage_SetData_4, 1154).
+-define(wxImage_SetMask, 1155).
+-define(wxImage_SetMaskColour, 1156).
+-define(wxImage_SetMaskFromImage, 1157).
+-define(wxImage_SetOption_2_1, 1158).
+-define(wxImage_SetOption_2_0, 1159).
+-define(wxImage_SetPalette, 1160).
+-define(wxImage_SetRGB_5, 1161).
+-define(wxImage_SetRGB_4, 1162).
+-define(wxImage_destroy, 1163).
+-define(wxBrush_new_0, 1164).
+-define(wxBrush_new_2, 1165).
+-define(wxBrush_new_1, 1166).
+-define(wxBrush_destruct, 1168).
+-define(wxBrush_GetColour, 1169).
+-define(wxBrush_GetStipple, 1170).
+-define(wxBrush_GetStyle, 1171).
+-define(wxBrush_IsHatch, 1172).
+-define(wxBrush_IsOk, 1173).
+-define(wxBrush_SetColour_1, 1174).
+-define(wxBrush_SetColour_3, 1175).
+-define(wxBrush_SetStipple, 1176).
+-define(wxBrush_SetStyle, 1177).
+-define(wxPen_new_0, 1178).
+-define(wxPen_new_2, 1179).
+-define(wxPen_destruct, 1180).
+-define(wxPen_GetCap, 1181).
+-define(wxPen_GetColour, 1182).
+-define(wxPen_GetJoin, 1183).
+-define(wxPen_GetStyle, 1184).
+-define(wxPen_GetWidth, 1185).
+-define(wxPen_IsOk, 1186).
+-define(wxPen_SetCap, 1187).
+-define(wxPen_SetColour_1, 1188).
+-define(wxPen_SetColour_3, 1189).
+-define(wxPen_SetJoin, 1190).
+-define(wxPen_SetStyle, 1191).
+-define(wxPen_SetWidth, 1192).
+-define(wxRegion_new_0, 1193).
+-define(wxRegion_new_4, 1194).
+-define(wxRegion_new_2, 1195).
+-define(wxRegion_new_1_1, 1196).
+-define(wxRegion_new_1_0, 1198).
+-define(wxRegion_destruct, 1200).
+-define(wxRegion_Clear, 1201).
+-define(wxRegion_Contains_2, 1202).
+-define(wxRegion_Contains_1_0, 1203).
+-define(wxRegion_Contains_4, 1204).
+-define(wxRegion_Contains_1_1, 1205).
+-define(wxRegion_ConvertToBitmap, 1206).
+-define(wxRegion_GetBox, 1207).
+-define(wxRegion_Intersect_4, 1208).
+-define(wxRegion_Intersect_1_1, 1209).
+-define(wxRegion_Intersect_1_0, 1210).
+-define(wxRegion_IsEmpty, 1211).
+-define(wxRegion_Subtract_4, 1212).
+-define(wxRegion_Subtract_1_1, 1213).
+-define(wxRegion_Subtract_1_0, 1214).
+-define(wxRegion_Offset_2, 1215).
+-define(wxRegion_Offset_1, 1216).
+-define(wxRegion_Union_4, 1217).
+-define(wxRegion_Union_1_2, 1218).
+-define(wxRegion_Union_1_1, 1219).
+-define(wxRegion_Union_1_0, 1220).
+-define(wxRegion_Union_3, 1221).
+-define(wxRegion_Xor_4, 1222).
+-define(wxRegion_Xor_1_1, 1223).
+-define(wxRegion_Xor_1_0, 1224).
+-define(wxAcceleratorTable_new_0, 1225).
+-define(wxAcceleratorTable_new_2, 1226).
+-define(wxAcceleratorTable_destruct, 1227).
+-define(wxAcceleratorTable_Ok, 1228).
+-define(wxAcceleratorEntry_new_1_0, 1229).
+-define(wxAcceleratorEntry_new_1_1, 1230).
+-define(wxAcceleratorEntry_GetCommand, 1231).
+-define(wxAcceleratorEntry_GetFlags, 1232).
+-define(wxAcceleratorEntry_GetKeyCode, 1233).
+-define(wxAcceleratorEntry_Set, 1234).
+-define(wxAcceleratorEntry_destroy, 1235).
+-define(wxCaret_new_3, 1240).
+-define(wxCaret_new_2, 1241).
+-define(wxCaret_destruct, 1243).
+-define(wxCaret_Create_3, 1244).
+-define(wxCaret_Create_2, 1245).
+-define(wxCaret_GetBlinkTime, 1246).
+-define(wxCaret_GetPosition, 1248).
+-define(wxCaret_GetSize, 1250).
+-define(wxCaret_GetWindow, 1251).
+-define(wxCaret_Hide, 1252).
+-define(wxCaret_IsOk, 1253).
+-define(wxCaret_IsVisible, 1254).
+-define(wxCaret_Move_2, 1255).
+-define(wxCaret_Move_1, 1256).
+-define(wxCaret_SetBlinkTime, 1257).
+-define(wxCaret_SetSize_2, 1258).
+-define(wxCaret_SetSize_1, 1259).
+-define(wxCaret_Show, 1260).
+-define(wxSizer_Add_2_1, 1261).
+-define(wxSizer_Add_2_0, 1262).
+-define(wxSizer_Add_3, 1263).
+-define(wxSizer_Add_2_3, 1264).
+-define(wxSizer_Add_2_2, 1265).
+-define(wxSizer_AddSpacer, 1266).
+-define(wxSizer_AddStretchSpacer, 1267).
+-define(wxSizer_CalcMin, 1268).
+-define(wxSizer_Clear, 1269).
+-define(wxSizer_Detach_1_2, 1270).
+-define(wxSizer_Detach_1_1, 1271).
+-define(wxSizer_Detach_1_0, 1272).
+-define(wxSizer_Fit, 1273).
+-define(wxSizer_FitInside, 1274).
+-define(wxSizer_GetChildren, 1275).
+-define(wxSizer_GetItem_2_1, 1276).
+-define(wxSizer_GetItem_2_0, 1277).
+-define(wxSizer_GetItem_1, 1278).
+-define(wxSizer_GetSize, 1279).
+-define(wxSizer_GetPosition, 1280).
+-define(wxSizer_GetMinSize, 1281).
+-define(wxSizer_Hide_2_0, 1282).
+-define(wxSizer_Hide_2_1, 1283).
+-define(wxSizer_Hide_1, 1284).
+-define(wxSizer_Insert_3_1, 1285).
+-define(wxSizer_Insert_3_0, 1286).
+-define(wxSizer_Insert_4, 1287).
+-define(wxSizer_Insert_3_3, 1288).
+-define(wxSizer_Insert_3_2, 1289).
+-define(wxSizer_Insert_2, 1290).
+-define(wxSizer_InsertSpacer, 1291).
+-define(wxSizer_InsertStretchSpacer, 1292).
+-define(wxSizer_IsShown_1_2, 1293).
+-define(wxSizer_IsShown_1_1, 1294).
+-define(wxSizer_IsShown_1_0, 1295).
+-define(wxSizer_Layout, 1296).
+-define(wxSizer_Prepend_2_1, 1297).
+-define(wxSizer_Prepend_2_0, 1298).
+-define(wxSizer_Prepend_3, 1299).
+-define(wxSizer_Prepend_2_3, 1300).
+-define(wxSizer_Prepend_2_2, 1301).
+-define(wxSizer_Prepend_1, 1302).
+-define(wxSizer_PrependSpacer, 1303).
+-define(wxSizer_PrependStretchSpacer, 1304).
+-define(wxSizer_RecalcSizes, 1305).
+-define(wxSizer_Remove_1_1, 1306).
+-define(wxSizer_Remove_1_0, 1307).
+-define(wxSizer_Replace_3_1, 1308).
+-define(wxSizer_Replace_3_0, 1309).
+-define(wxSizer_Replace_2, 1310).
+-define(wxSizer_SetDimension, 1311).
+-define(wxSizer_SetMinSize_2, 1312).
+-define(wxSizer_SetMinSize_1, 1313).
+-define(wxSizer_SetItemMinSize_3_2, 1314).
+-define(wxSizer_SetItemMinSize_2_2, 1315).
+-define(wxSizer_SetItemMinSize_3_1, 1316).
+-define(wxSizer_SetItemMinSize_2_1, 1317).
+-define(wxSizer_SetItemMinSize_3_0, 1318).
+-define(wxSizer_SetItemMinSize_2_0, 1319).
+-define(wxSizer_SetSizeHints, 1320).
+-define(wxSizer_SetVirtualSizeHints, 1321).
+-define(wxSizer_Show_2_2, 1322).
+-define(wxSizer_Show_2_1, 1323).
+-define(wxSizer_Show_2_0, 1324).
+-define(wxSizer_Show_1, 1325).
+-define(wxSizerFlags_new, 1326).
+-define(wxSizerFlags_Align, 1327).
+-define(wxSizerFlags_Border_2, 1328).
+-define(wxSizerFlags_Border_1, 1329).
+-define(wxSizerFlags_Center, 1330).
+-define(wxSizerFlags_Centre, 1331).
+-define(wxSizerFlags_Expand, 1332).
+-define(wxSizerFlags_Left, 1333).
+-define(wxSizerFlags_Proportion, 1334).
+-define(wxSizerFlags_Right, 1335).
+-define(wxSizerFlags_destroy, 1336).
+-define(wxSizerItem_new_5_1, 1337).
+-define(wxSizerItem_new_2_1, 1338).
+-define(wxSizerItem_new_5_0, 1339).
+-define(wxSizerItem_new_2_0, 1340).
+-define(wxSizerItem_new_6, 1341).
+-define(wxSizerItem_new_3, 1342).
+-define(wxSizerItem_new_0, 1343).
+-define(wxSizerItem_destruct, 1344).
+-define(wxSizerItem_CalcMin, 1345).
+-define(wxSizerItem_DeleteWindows, 1346).
+-define(wxSizerItem_DetachSizer, 1347).
+-define(wxSizerItem_GetBorder, 1348).
+-define(wxSizerItem_GetFlag, 1349).
+-define(wxSizerItem_GetMinSize, 1350).
+-define(wxSizerItem_GetPosition, 1351).
+-define(wxSizerItem_GetProportion, 1352).
+-define(wxSizerItem_GetRatio, 1353).
+-define(wxSizerItem_GetRect, 1354).
+-define(wxSizerItem_GetSize, 1355).
+-define(wxSizerItem_GetSizer, 1356).
+-define(wxSizerItem_GetSpacer, 1357).
+-define(wxSizerItem_GetUserData, 1358).
+-define(wxSizerItem_GetWindow, 1359).
+-define(wxSizerItem_IsSizer, 1360).
+-define(wxSizerItem_IsShown, 1361).
+-define(wxSizerItem_IsSpacer, 1362).
+-define(wxSizerItem_IsWindow, 1363).
+-define(wxSizerItem_SetBorder, 1364).
+-define(wxSizerItem_SetDimension, 1365).
+-define(wxSizerItem_SetFlag, 1366).
+-define(wxSizerItem_SetInitSize, 1367).
+-define(wxSizerItem_SetMinSize_1, 1368).
+-define(wxSizerItem_SetMinSize_2, 1369).
+-define(wxSizerItem_SetProportion, 1370).
+-define(wxSizerItem_SetRatio_2, 1371).
+-define(wxSizerItem_SetRatio_1_1, 1372).
+-define(wxSizerItem_SetRatio_1_0, 1373).
+-define(wxSizerItem_SetSizer, 1374).
+-define(wxSizerItem_SetSpacer_1, 1375).
+-define(wxSizerItem_SetSpacer_2, 1376).
+-define(wxSizerItem_SetWindow, 1377).
+-define(wxSizerItem_Show, 1378).
+-define(wxBoxSizer_new, 1379).
+-define(wxBoxSizer_GetOrientation, 1380).
+-define(wxBoxSizer_destroy, 1381).
+-define(wxStaticBoxSizer_new_2, 1382).
+-define(wxStaticBoxSizer_new_3, 1383).
+-define(wxStaticBoxSizer_GetStaticBox, 1384).
+-define(wxStaticBoxSizer_destroy, 1385).
+-define(wxGridSizer_new_4, 1386).
+-define(wxGridSizer_new_2, 1387).
+-define(wxGridSizer_GetCols, 1388).
+-define(wxGridSizer_GetHGap, 1389).
+-define(wxGridSizer_GetRows, 1390).
+-define(wxGridSizer_GetVGap, 1391).
+-define(wxGridSizer_SetCols, 1392).
+-define(wxGridSizer_SetHGap, 1393).
+-define(wxGridSizer_SetRows, 1394).
+-define(wxGridSizer_SetVGap, 1395).
+-define(wxGridSizer_destroy, 1396).
+-define(wxFlexGridSizer_new_4, 1397).
+-define(wxFlexGridSizer_new_2, 1398).
+-define(wxFlexGridSizer_AddGrowableCol, 1399).
+-define(wxFlexGridSizer_AddGrowableRow, 1400).
+-define(wxFlexGridSizer_GetFlexibleDirection, 1401).
+-define(wxFlexGridSizer_GetNonFlexibleGrowMode, 1402).
+-define(wxFlexGridSizer_RemoveGrowableCol, 1403).
+-define(wxFlexGridSizer_RemoveGrowableRow, 1404).
+-define(wxFlexGridSizer_SetFlexibleDirection, 1405).
+-define(wxFlexGridSizer_SetNonFlexibleGrowMode, 1406).
+-define(wxFlexGridSizer_destroy, 1407).
+-define(wxGridBagSizer_new, 1408).
+-define(wxGridBagSizer_Add_3_2, 1409).
+-define(wxGridBagSizer_Add_3_1, 1410).
+-define(wxGridBagSizer_Add_4, 1411).
+-define(wxGridBagSizer_Add_1_0, 1412).
+-define(wxGridBagSizer_Add_2_1, 1413).
+-define(wxGridBagSizer_Add_2_0, 1414).
+-define(wxGridBagSizer_Add_3_0, 1415).
+-define(wxGridBagSizer_Add_1_1, 1416).
+-define(wxGridBagSizer_CalcMin, 1417).
+-define(wxGridBagSizer_CheckForIntersection_2, 1418).
+-define(wxGridBagSizer_CheckForIntersection_3, 1419).
+-define(wxGridBagSizer_FindItem_1_1, 1420).
+-define(wxGridBagSizer_FindItem_1_0, 1421).
+-define(wxGridBagSizer_FindItemAtPoint, 1422).
+-define(wxGridBagSizer_FindItemAtPosition, 1423).
+-define(wxGridBagSizer_FindItemWithData, 1424).
+-define(wxGridBagSizer_GetCellSize, 1425).
+-define(wxGridBagSizer_GetEmptyCellSize, 1426).
+-define(wxGridBagSizer_GetItemPosition_1_2, 1427).
+-define(wxGridBagSizer_GetItemPosition_1_1, 1428).
+-define(wxGridBagSizer_GetItemPosition_1_0, 1429).
+-define(wxGridBagSizer_GetItemSpan_1_2, 1430).
+-define(wxGridBagSizer_GetItemSpan_1_1, 1431).
+-define(wxGridBagSizer_GetItemSpan_1_0, 1432).
+-define(wxGridBagSizer_SetEmptyCellSize, 1433).
+-define(wxGridBagSizer_SetItemPosition_2_2, 1434).
+-define(wxGridBagSizer_SetItemPosition_2_1, 1435).
+-define(wxGridBagSizer_SetItemPosition_2_0, 1436).
+-define(wxGridBagSizer_SetItemSpan_2_2, 1437).
+-define(wxGridBagSizer_SetItemSpan_2_1, 1438).
+-define(wxGridBagSizer_SetItemSpan_2_0, 1439).
+-define(wxGridBagSizer_destroy, 1440).
+-define(wxStdDialogButtonSizer_new, 1441).
+-define(wxStdDialogButtonSizer_AddButton, 1442).
+-define(wxStdDialogButtonSizer_Realize, 1443).
+-define(wxStdDialogButtonSizer_SetAffirmativeButton, 1444).
+-define(wxStdDialogButtonSizer_SetCancelButton, 1445).
+-define(wxStdDialogButtonSizer_SetNegativeButton, 1446).
+-define(wxStdDialogButtonSizer_destroy, 1447).
+-define(wxFont_new_0, 1448).
+-define(wxFont_new_1, 1449).
+-define(wxFont_new_5, 1450).
+-define(wxFont_destruct, 1452).
+-define(wxFont_IsFixedWidth, 1453).
+-define(wxFont_GetDefaultEncoding, 1454).
+-define(wxFont_GetFaceName, 1455).
+-define(wxFont_GetFamily, 1456).
+-define(wxFont_GetNativeFontInfoDesc, 1457).
+-define(wxFont_GetNativeFontInfoUserDesc, 1458).
+-define(wxFont_GetPointSize, 1459).
+-define(wxFont_GetStyle, 1460).
+-define(wxFont_GetUnderlined, 1461).
+-define(wxFont_GetWeight, 1462).
+-define(wxFont_Ok, 1463).
+-define(wxFont_SetDefaultEncoding, 1464).
+-define(wxFont_SetFaceName, 1465).
+-define(wxFont_SetFamily, 1466).
+-define(wxFont_SetPointSize, 1467).
+-define(wxFont_SetStyle, 1468).
+-define(wxFont_SetUnderlined, 1469).
+-define(wxFont_SetWeight, 1470).
+-define(wxToolTip_Enable, 1471).
+-define(wxToolTip_SetDelay, 1472).
+-define(wxToolTip_new, 1473).
+-define(wxToolTip_SetTip, 1474).
+-define(wxToolTip_GetTip, 1475).
+-define(wxToolTip_GetWindow, 1476).
+-define(wxToolTip_destroy, 1477).
+-define(wxButton_new_3, 1479).
+-define(wxButton_new_0, 1480).
+-define(wxButton_destruct, 1481).
+-define(wxButton_Create, 1482).
+-define(wxButton_GetDefaultSize, 1483).
+-define(wxButton_SetDefault, 1484).
+-define(wxButton_SetLabel, 1485).
+-define(wxBitmapButton_new_4, 1487).
+-define(wxBitmapButton_new_0, 1488).
+-define(wxBitmapButton_Create, 1489).
+-define(wxBitmapButton_GetBitmapDisabled, 1490).
+-define(wxBitmapButton_GetBitmapFocus, 1492).
+-define(wxBitmapButton_GetBitmapLabel, 1494).
+-define(wxBitmapButton_GetBitmapSelected, 1496).
+-define(wxBitmapButton_SetBitmapDisabled, 1498).
+-define(wxBitmapButton_SetBitmapFocus, 1499).
+-define(wxBitmapButton_SetBitmapLabel, 1500).
+-define(wxBitmapButton_SetBitmapSelected, 1501).
+-define(wxBitmapButton_destroy, 1502).
+-define(wxToggleButton_new_0, 1503).
+-define(wxToggleButton_new_4, 1504).
+-define(wxToggleButton_Create, 1505).
+-define(wxToggleButton_GetValue, 1506).
+-define(wxToggleButton_SetValue, 1507).
+-define(wxToggleButton_destroy, 1508).
+-define(wxCalendarCtrl_new_0, 1509).
+-define(wxCalendarCtrl_new_3, 1510).
+-define(wxCalendarCtrl_Create, 1511).
+-define(wxCalendarCtrl_destruct, 1512).
+-define(wxCalendarCtrl_SetDate, 1513).
+-define(wxCalendarCtrl_GetDate, 1514).
+-define(wxCalendarCtrl_EnableYearChange, 1515).
+-define(wxCalendarCtrl_EnableMonthChange, 1516).
+-define(wxCalendarCtrl_EnableHolidayDisplay, 1517).
+-define(wxCalendarCtrl_SetHeaderColours, 1518).
+-define(wxCalendarCtrl_GetHeaderColourFg, 1519).
+-define(wxCalendarCtrl_GetHeaderColourBg, 1520).
+-define(wxCalendarCtrl_SetHighlightColours, 1521).
+-define(wxCalendarCtrl_GetHighlightColourFg, 1522).
+-define(wxCalendarCtrl_GetHighlightColourBg, 1523).
+-define(wxCalendarCtrl_SetHolidayColours, 1524).
+-define(wxCalendarCtrl_GetHolidayColourFg, 1525).
+-define(wxCalendarCtrl_GetHolidayColourBg, 1526).
+-define(wxCalendarCtrl_GetAttr, 1527).
+-define(wxCalendarCtrl_SetAttr, 1528).
+-define(wxCalendarCtrl_SetHoliday, 1529).
+-define(wxCalendarCtrl_ResetAttr, 1530).
+-define(wxCalendarCtrl_HitTest, 1531).
+-define(wxCalendarDateAttr_new_0, 1532).
+-define(wxCalendarDateAttr_new_2_1, 1533).
+-define(wxCalendarDateAttr_new_2_0, 1534).
+-define(wxCalendarDateAttr_SetTextColour, 1535).
+-define(wxCalendarDateAttr_SetBackgroundColour, 1536).
+-define(wxCalendarDateAttr_SetBorderColour, 1537).
+-define(wxCalendarDateAttr_SetFont, 1538).
+-define(wxCalendarDateAttr_SetBorder, 1539).
+-define(wxCalendarDateAttr_SetHoliday, 1540).
+-define(wxCalendarDateAttr_HasTextColour, 1541).
+-define(wxCalendarDateAttr_HasBackgroundColour, 1542).
+-define(wxCalendarDateAttr_HasBorderColour, 1543).
+-define(wxCalendarDateAttr_HasFont, 1544).
+-define(wxCalendarDateAttr_HasBorder, 1545).
+-define(wxCalendarDateAttr_IsHoliday, 1546).
+-define(wxCalendarDateAttr_GetTextColour, 1547).
+-define(wxCalendarDateAttr_GetBackgroundColour, 1548).
+-define(wxCalendarDateAttr_GetBorderColour, 1549).
+-define(wxCalendarDateAttr_GetFont, 1550).
+-define(wxCalendarDateAttr_GetBorder, 1551).
+-define(wxCalendarDateAttr_destroy, 1552).
+-define(wxCheckBox_new_4, 1554).
+-define(wxCheckBox_new_0, 1555).
+-define(wxCheckBox_Create, 1556).
+-define(wxCheckBox_GetValue, 1557).
+-define(wxCheckBox_Get3StateValue, 1558).
+-define(wxCheckBox_Is3rdStateAllowedForUser, 1559).
+-define(wxCheckBox_Is3State, 1560).
+-define(wxCheckBox_IsChecked, 1561).
+-define(wxCheckBox_SetValue, 1562).
+-define(wxCheckBox_Set3StateValue, 1563).
+-define(wxCheckBox_destroy, 1564).
+-define(wxCheckListBox_new_0, 1565).
+-define(wxCheckListBox_new_3, 1567).
+-define(wxCheckListBox_Check, 1568).
+-define(wxCheckListBox_IsChecked, 1569).
+-define(wxCheckListBox_destroy, 1570).
+-define(wxChoice_new_3, 1573).
+-define(wxChoice_new_0, 1574).
+-define(wxChoice_destruct, 1576).
+-define(wxChoice_Create, 1578).
+-define(wxChoice_Delete, 1579).
+-define(wxChoice_GetColumns, 1580).
+-define(wxChoice_SetColumns, 1581).
+-define(wxComboBox_new_0, 1582).
+-define(wxComboBox_new_3, 1584).
+-define(wxComboBox_destruct, 1585).
+-define(wxComboBox_Create, 1587).
+-define(wxComboBox_CanCopy, 1588).
+-define(wxComboBox_CanCut, 1589).
+-define(wxComboBox_CanPaste, 1590).
+-define(wxComboBox_CanRedo, 1591).
+-define(wxComboBox_CanUndo, 1592).
+-define(wxComboBox_Copy, 1593).
+-define(wxComboBox_Cut, 1594).
+-define(wxComboBox_GetInsertionPoint, 1595).
+-define(wxComboBox_GetLastPosition, 1596).
+-define(wxComboBox_GetValue, 1597).
+-define(wxComboBox_Paste, 1598).
+-define(wxComboBox_Redo, 1599).
+-define(wxComboBox_Replace, 1600).
+-define(wxComboBox_Remove, 1601).
+-define(wxComboBox_SetInsertionPoint, 1602).
+-define(wxComboBox_SetInsertionPointEnd, 1603).
+-define(wxComboBox_SetSelection_1, 1604).
+-define(wxComboBox_SetSelection_2, 1605).
+-define(wxComboBox_SetValue, 1606).
+-define(wxComboBox_Undo, 1607).
+-define(wxGauge_new_0, 1608).
+-define(wxGauge_new_4, 1609).
+-define(wxGauge_Create, 1610).
+-define(wxGauge_GetRange, 1611).
+-define(wxGauge_GetValue, 1612).
+-define(wxGauge_IsVertical, 1613).
+-define(wxGauge_SetRange, 1614).
+-define(wxGauge_SetValue, 1615).
+-define(wxGauge_Pulse, 1616).
+-define(wxGauge_destroy, 1617).
+-define(wxGenericDirCtrl_new_0, 1618).
+-define(wxGenericDirCtrl_new_2, 1619).
+-define(wxGenericDirCtrl_destruct, 1620).
+-define(wxGenericDirCtrl_Create, 1621).
+-define(wxGenericDirCtrl_Init, 1622).
+-define(wxGenericDirCtrl_CollapseTree, 1623).
+-define(wxGenericDirCtrl_ExpandPath, 1624).
+-define(wxGenericDirCtrl_GetDefaultPath, 1625).
+-define(wxGenericDirCtrl_GetPath, 1626).
+-define(wxGenericDirCtrl_GetFilePath, 1627).
+-define(wxGenericDirCtrl_GetFilter, 1628).
+-define(wxGenericDirCtrl_GetFilterIndex, 1629).
+-define(wxGenericDirCtrl_GetRootId, 1630).
+-define(wxGenericDirCtrl_GetTreeCtrl, 1631).
+-define(wxGenericDirCtrl_ReCreateTree, 1632).
+-define(wxGenericDirCtrl_SetDefaultPath, 1633).
+-define(wxGenericDirCtrl_SetFilter, 1634).
+-define(wxGenericDirCtrl_SetFilterIndex, 1635).
+-define(wxGenericDirCtrl_SetPath, 1636).
+-define(wxStaticBox_new_4, 1638).
+-define(wxStaticBox_new_0, 1639).
+-define(wxStaticBox_Create, 1640).
+-define(wxStaticBox_destroy, 1641).
+-define(wxStaticLine_new_2, 1643).
+-define(wxStaticLine_new_0, 1644).
+-define(wxStaticLine_destruct, 1645).
+-define(wxStaticLine_Create, 1646).
+-define(wxStaticLine_IsVertical, 1647).
+-define(wxStaticLine_GetDefaultSize, 1648).
+-define(wxListBox_new_3, 1651).
+-define(wxListBox_new_0, 1652).
+-define(wxListBox_destruct, 1654).
+-define(wxListBox_Create, 1656).
+-define(wxListBox_Deselect, 1657).
+-define(wxListBox_GetSelections, 1658).
+-define(wxListBox_InsertItems, 1659).
+-define(wxListBox_IsSelected, 1660).
+-define(wxListBox_Set, 1661).
+-define(wxListBox_HitTest, 1662).
+-define(wxListBox_SetFirstItem_1_0, 1663).
+-define(wxListBox_SetFirstItem_1_1, 1664).
+-define(wxListCtrl_new_0, 1665).
+-define(wxListCtrl_new_2, 1666).
+-define(wxListCtrl_Arrange, 1667).
+-define(wxListCtrl_AssignImageList, 1668).
+-define(wxListCtrl_ClearAll, 1669).
+-define(wxListCtrl_Create, 1670).
+-define(wxListCtrl_DeleteAllItems, 1671).
+-define(wxListCtrl_DeleteColumn, 1672).
+-define(wxListCtrl_DeleteItem, 1673).
+-define(wxListCtrl_EditLabel, 1674).
+-define(wxListCtrl_EnsureVisible, 1675).
+-define(wxListCtrl_FindItem_3_0, 1676).
+-define(wxListCtrl_FindItem_3_1, 1677).
+-define(wxListCtrl_GetColumn, 1678).
+-define(wxListCtrl_GetColumnCount, 1679).
+-define(wxListCtrl_GetColumnWidth, 1680).
+-define(wxListCtrl_GetCountPerPage, 1681).
+-define(wxListCtrl_GetEditControl, 1682).
+-define(wxListCtrl_GetImageList, 1683).
+-define(wxListCtrl_GetItem, 1684).
+-define(wxListCtrl_GetItemBackgroundColour, 1685).
+-define(wxListCtrl_GetItemCount, 1686).
+-define(wxListCtrl_GetItemData, 1687).
+-define(wxListCtrl_GetItemFont, 1688).
+-define(wxListCtrl_GetItemPosition, 1689).
+-define(wxListCtrl_GetItemRect, 1690).
+-define(wxListCtrl_GetItemSpacing, 1691).
+-define(wxListCtrl_GetItemState, 1692).
+-define(wxListCtrl_GetItemText, 1693).
+-define(wxListCtrl_GetItemTextColour, 1694).
+-define(wxListCtrl_GetNextItem, 1695).
+-define(wxListCtrl_GetSelectedItemCount, 1696).
+-define(wxListCtrl_GetTextColour, 1697).
+-define(wxListCtrl_GetTopItem, 1698).
+-define(wxListCtrl_GetViewRect, 1699).
+-define(wxListCtrl_HitTest, 1700).
+-define(wxListCtrl_InsertColumn_2, 1701).
+-define(wxListCtrl_InsertColumn_3, 1702).
+-define(wxListCtrl_InsertItem_1, 1703).
+-define(wxListCtrl_InsertItem_2_1, 1704).
+-define(wxListCtrl_InsertItem_2_0, 1705).
+-define(wxListCtrl_InsertItem_3, 1706).
+-define(wxListCtrl_RefreshItem, 1707).
+-define(wxListCtrl_RefreshItems, 1708).
+-define(wxListCtrl_ScrollList, 1709).
+-define(wxListCtrl_SetBackgroundColour, 1710).
+-define(wxListCtrl_SetColumn, 1711).
+-define(wxListCtrl_SetColumnWidth, 1712).
+-define(wxListCtrl_SetImageList, 1713).
+-define(wxListCtrl_SetItem_1, 1714).
+-define(wxListCtrl_SetItem_4, 1715).
+-define(wxListCtrl_SetItemBackgroundColour, 1716).
+-define(wxListCtrl_SetItemCount, 1717).
+-define(wxListCtrl_SetItemData, 1718).
+-define(wxListCtrl_SetItemFont, 1719).
+-define(wxListCtrl_SetItemImage, 1720).
+-define(wxListCtrl_SetItemColumnImage, 1721).
+-define(wxListCtrl_SetItemPosition, 1722).
+-define(wxListCtrl_SetItemState, 1723).
+-define(wxListCtrl_SetItemText, 1724).
+-define(wxListCtrl_SetItemTextColour, 1725).
+-define(wxListCtrl_SetSingleStyle, 1726).
+-define(wxListCtrl_SetTextColour, 1727).
+-define(wxListCtrl_SetWindowStyleFlag, 1728).
+-define(wxListCtrl_SortItems, 1729).
+-define(wxListCtrl_destroy, 1730).
+-define(wxListView_ClearColumnImage, 1731).
+-define(wxListView_Focus, 1732).
+-define(wxListView_GetFirstSelected, 1733).
+-define(wxListView_GetFocusedItem, 1734).
+-define(wxListView_GetNextSelected, 1735).
+-define(wxListView_IsSelected, 1736).
+-define(wxListView_Select, 1737).
+-define(wxListView_SetColumnImage, 1738).
+-define(wxListItem_new_0, 1739).
+-define(wxListItem_new_1, 1740).
+-define(wxListItem_destruct, 1741).
+-define(wxListItem_Clear, 1742).
+-define(wxListItem_GetAlign, 1743).
+-define(wxListItem_GetBackgroundColour, 1744).
+-define(wxListItem_GetColumn, 1745).
+-define(wxListItem_GetFont, 1746).
+-define(wxListItem_GetId, 1747).
+-define(wxListItem_GetImage, 1748).
+-define(wxListItem_GetMask, 1749).
+-define(wxListItem_GetState, 1750).
+-define(wxListItem_GetText, 1751).
+-define(wxListItem_GetTextColour, 1752).
+-define(wxListItem_GetWidth, 1753).
+-define(wxListItem_SetAlign, 1754).
+-define(wxListItem_SetBackgroundColour, 1755).
+-define(wxListItem_SetColumn, 1756).
+-define(wxListItem_SetFont, 1757).
+-define(wxListItem_SetId, 1758).
+-define(wxListItem_SetImage, 1759).
+-define(wxListItem_SetMask, 1760).
+-define(wxListItem_SetState, 1761).
+-define(wxListItem_SetStateMask, 1762).
+-define(wxListItem_SetText, 1763).
+-define(wxListItem_SetTextColour, 1764).
+-define(wxListItem_SetWidth, 1765).
+-define(wxListItemAttr_new_0, 1766).
+-define(wxListItemAttr_new_3, 1767).
+-define(wxListItemAttr_GetBackgroundColour, 1768).
+-define(wxListItemAttr_GetFont, 1769).
+-define(wxListItemAttr_GetTextColour, 1770).
+-define(wxListItemAttr_HasBackgroundColour, 1771).
+-define(wxListItemAttr_HasFont, 1772).
+-define(wxListItemAttr_HasTextColour, 1773).
+-define(wxListItemAttr_SetBackgroundColour, 1774).
+-define(wxListItemAttr_SetFont, 1775).
+-define(wxListItemAttr_SetTextColour, 1776).
+-define(wxListItemAttr_destroy, 1777).
+-define(wxImageList_new_0, 1778).
+-define(wxImageList_new_3, 1779).
+-define(wxImageList_Add_1, 1780).
+-define(wxImageList_Add_2_0, 1781).
+-define(wxImageList_Add_2_1, 1782).
+-define(wxImageList_Create, 1783).
+-define(wxImageList_Draw, 1785).
+-define(wxImageList_GetBitmap, 1786).
+-define(wxImageList_GetIcon, 1787).
+-define(wxImageList_GetImageCount, 1788).
+-define(wxImageList_GetSize, 1789).
+-define(wxImageList_Remove, 1790).
+-define(wxImageList_RemoveAll, 1791).
+-define(wxImageList_Replace_2, 1792).
+-define(wxImageList_Replace_3, 1793).
+-define(wxImageList_destroy, 1794).
+-define(wxTextAttr_new_0, 1795).
+-define(wxTextAttr_new_2, 1796).
+-define(wxTextAttr_GetAlignment, 1797).
+-define(wxTextAttr_GetBackgroundColour, 1798).
+-define(wxTextAttr_GetFont, 1799).
+-define(wxTextAttr_GetLeftIndent, 1800).
+-define(wxTextAttr_GetLeftSubIndent, 1801).
+-define(wxTextAttr_GetRightIndent, 1802).
+-define(wxTextAttr_GetTabs, 1803).
+-define(wxTextAttr_GetTextColour, 1804).
+-define(wxTextAttr_HasBackgroundColour, 1805).
+-define(wxTextAttr_HasFont, 1806).
+-define(wxTextAttr_HasTextColour, 1807).
+-define(wxTextAttr_GetFlags, 1808).
+-define(wxTextAttr_IsDefault, 1809).
+-define(wxTextAttr_SetAlignment, 1810).
+-define(wxTextAttr_SetBackgroundColour, 1811).
+-define(wxTextAttr_SetFlags, 1812).
+-define(wxTextAttr_SetFont, 1813).
+-define(wxTextAttr_SetLeftIndent, 1814).
+-define(wxTextAttr_SetRightIndent, 1815).
+-define(wxTextAttr_SetTabs, 1816).
+-define(wxTextAttr_SetTextColour, 1817).
+-define(wxTextAttr_destroy, 1818).
+-define(wxTextCtrl_new_3, 1820).
+-define(wxTextCtrl_new_0, 1821).
+-define(wxTextCtrl_destruct, 1823).
+-define(wxTextCtrl_AppendText, 1824).
+-define(wxTextCtrl_CanCopy, 1825).
+-define(wxTextCtrl_CanCut, 1826).
+-define(wxTextCtrl_CanPaste, 1827).
+-define(wxTextCtrl_CanRedo, 1828).
+-define(wxTextCtrl_CanUndo, 1829).
+-define(wxTextCtrl_Clear, 1830).
+-define(wxTextCtrl_Copy, 1831).
+-define(wxTextCtrl_Create, 1832).
+-define(wxTextCtrl_Cut, 1833).
+-define(wxTextCtrl_DiscardEdits, 1834).
+-define(wxTextCtrl_ChangeValue, 1835).
+-define(wxTextCtrl_EmulateKeyPress, 1836).
+-define(wxTextCtrl_GetDefaultStyle, 1837).
+-define(wxTextCtrl_GetInsertionPoint, 1838).
+-define(wxTextCtrl_GetLastPosition, 1839).
+-define(wxTextCtrl_GetLineLength, 1840).
+-define(wxTextCtrl_GetLineText, 1841).
+-define(wxTextCtrl_GetNumberOfLines, 1842).
+-define(wxTextCtrl_GetRange, 1843).
+-define(wxTextCtrl_GetSelection, 1844).
+-define(wxTextCtrl_GetStringSelection, 1845).
+-define(wxTextCtrl_GetStyle, 1846).
+-define(wxTextCtrl_GetValue, 1847).
+-define(wxTextCtrl_IsEditable, 1848).
+-define(wxTextCtrl_IsModified, 1849).
+-define(wxTextCtrl_IsMultiLine, 1850).
+-define(wxTextCtrl_IsSingleLine, 1851).
+-define(wxTextCtrl_LoadFile, 1852).
+-define(wxTextCtrl_MarkDirty, 1853).
+-define(wxTextCtrl_Paste, 1854).
+-define(wxTextCtrl_PositionToXY, 1855).
+-define(wxTextCtrl_Redo, 1856).
+-define(wxTextCtrl_Remove, 1857).
+-define(wxTextCtrl_Replace, 1858).
+-define(wxTextCtrl_SaveFile, 1859).
+-define(wxTextCtrl_SetDefaultStyle, 1860).
+-define(wxTextCtrl_SetEditable, 1861).
+-define(wxTextCtrl_SetInsertionPoint, 1862).
+-define(wxTextCtrl_SetInsertionPointEnd, 1863).
+-define(wxTextCtrl_SetMaxLength, 1865).
+-define(wxTextCtrl_SetSelection, 1866).
+-define(wxTextCtrl_SetStyle, 1867).
+-define(wxTextCtrl_SetValue, 1868).
+-define(wxTextCtrl_ShowPosition, 1869).
+-define(wxTextCtrl_Undo, 1870).
+-define(wxTextCtrl_WriteText, 1871).
+-define(wxTextCtrl_XYToPosition, 1872).
+-define(wxNotebook_new_0, 1875).
+-define(wxNotebook_new_3, 1876).
+-define(wxNotebook_destruct, 1877).
+-define(wxNotebook_AddPage, 1878).
+-define(wxNotebook_AdvanceSelection, 1879).
+-define(wxNotebook_AssignImageList, 1880).
+-define(wxNotebook_Create, 1881).
+-define(wxNotebook_DeleteAllPages, 1882).
+-define(wxNotebook_DeletePage, 1883).
+-define(wxNotebook_RemovePage, 1884).
+-define(wxNotebook_GetCurrentPage, 1885).
+-define(wxNotebook_GetImageList, 1886).
+-define(wxNotebook_GetPage, 1888).
+-define(wxNotebook_GetPageCount, 1889).
+-define(wxNotebook_GetPageImage, 1890).
+-define(wxNotebook_GetPageText, 1891).
+-define(wxNotebook_GetRowCount, 1892).
+-define(wxNotebook_GetSelection, 1893).
+-define(wxNotebook_GetThemeBackgroundColour, 1894).
+-define(wxNotebook_HitTest, 1896).
+-define(wxNotebook_InsertPage, 1898).
+-define(wxNotebook_SetImageList, 1899).
+-define(wxNotebook_SetPadding, 1900).
+-define(wxNotebook_SetPageSize, 1901).
+-define(wxNotebook_SetPageImage, 1902).
+-define(wxNotebook_SetPageText, 1903).
+-define(wxNotebook_SetSelection, 1904).
+-define(wxNotebook_ChangeSelection, 1905).
+-define(wxChoicebook_new_0, 1906).
+-define(wxChoicebook_new_3, 1907).
+-define(wxChoicebook_AddPage, 1908).
+-define(wxChoicebook_AdvanceSelection, 1909).
+-define(wxChoicebook_AssignImageList, 1910).
+-define(wxChoicebook_Create, 1911).
+-define(wxChoicebook_DeleteAllPages, 1912).
+-define(wxChoicebook_DeletePage, 1913).
+-define(wxChoicebook_RemovePage, 1914).
+-define(wxChoicebook_GetCurrentPage, 1915).
+-define(wxChoicebook_GetImageList, 1916).
+-define(wxChoicebook_GetPage, 1918).
+-define(wxChoicebook_GetPageCount, 1919).
+-define(wxChoicebook_GetPageImage, 1920).
+-define(wxChoicebook_GetPageText, 1921).
+-define(wxChoicebook_GetSelection, 1922).
+-define(wxChoicebook_HitTest, 1923).
+-define(wxChoicebook_InsertPage, 1924).
+-define(wxChoicebook_SetImageList, 1925).
+-define(wxChoicebook_SetPageSize, 1926).
+-define(wxChoicebook_SetPageImage, 1927).
+-define(wxChoicebook_SetPageText, 1928).
+-define(wxChoicebook_SetSelection, 1929).
+-define(wxChoicebook_ChangeSelection, 1930).
+-define(wxChoicebook_destroy, 1931).
+-define(wxToolbook_new_0, 1932).
+-define(wxToolbook_new_3, 1933).
+-define(wxToolbook_AddPage, 1934).
+-define(wxToolbook_AdvanceSelection, 1935).
+-define(wxToolbook_AssignImageList, 1936).
+-define(wxToolbook_Create, 1937).
+-define(wxToolbook_DeleteAllPages, 1938).
+-define(wxToolbook_DeletePage, 1939).
+-define(wxToolbook_RemovePage, 1940).
+-define(wxToolbook_GetCurrentPage, 1941).
+-define(wxToolbook_GetImageList, 1942).
+-define(wxToolbook_GetPage, 1944).
+-define(wxToolbook_GetPageCount, 1945).
+-define(wxToolbook_GetPageImage, 1946).
+-define(wxToolbook_GetPageText, 1947).
+-define(wxToolbook_GetSelection, 1948).
+-define(wxToolbook_HitTest, 1950).
+-define(wxToolbook_InsertPage, 1951).
+-define(wxToolbook_SetImageList, 1952).
+-define(wxToolbook_SetPageSize, 1953).
+-define(wxToolbook_SetPageImage, 1954).
+-define(wxToolbook_SetPageText, 1955).
+-define(wxToolbook_SetSelection, 1956).
+-define(wxToolbook_ChangeSelection, 1957).
+-define(wxToolbook_destroy, 1958).
+-define(wxListbook_new_0, 1959).
+-define(wxListbook_new_3, 1960).
+-define(wxListbook_AddPage, 1961).
+-define(wxListbook_AdvanceSelection, 1962).
+-define(wxListbook_AssignImageList, 1963).
+-define(wxListbook_Create, 1964).
+-define(wxListbook_DeleteAllPages, 1965).
+-define(wxListbook_DeletePage, 1966).
+-define(wxListbook_RemovePage, 1967).
+-define(wxListbook_GetCurrentPage, 1968).
+-define(wxListbook_GetImageList, 1969).
+-define(wxListbook_GetPage, 1971).
+-define(wxListbook_GetPageCount, 1972).
+-define(wxListbook_GetPageImage, 1973).
+-define(wxListbook_GetPageText, 1974).
+-define(wxListbook_GetSelection, 1975).
+-define(wxListbook_HitTest, 1977).
+-define(wxListbook_InsertPage, 1978).
+-define(wxListbook_SetImageList, 1979).
+-define(wxListbook_SetPageSize, 1980).
+-define(wxListbook_SetPageImage, 1981).
+-define(wxListbook_SetPageText, 1982).
+-define(wxListbook_SetSelection, 1983).
+-define(wxListbook_ChangeSelection, 1984).
+-define(wxListbook_destroy, 1985).
+-define(wxTreebook_new_0, 1986).
+-define(wxTreebook_new_3, 1987).
+-define(wxTreebook_AddPage, 1988).
+-define(wxTreebook_AdvanceSelection, 1989).
+-define(wxTreebook_AssignImageList, 1990).
+-define(wxTreebook_Create, 1991).
+-define(wxTreebook_DeleteAllPages, 1992).
+-define(wxTreebook_DeletePage, 1993).
+-define(wxTreebook_RemovePage, 1994).
+-define(wxTreebook_GetCurrentPage, 1995).
+-define(wxTreebook_GetImageList, 1996).
+-define(wxTreebook_GetPage, 1998).
+-define(wxTreebook_GetPageCount, 1999).
+-define(wxTreebook_GetPageImage, 2000).
+-define(wxTreebook_GetPageText, 2001).
+-define(wxTreebook_GetSelection, 2002).
+-define(wxTreebook_ExpandNode, 2003).
+-define(wxTreebook_IsNodeExpanded, 2004).
+-define(wxTreebook_HitTest, 2006).
+-define(wxTreebook_InsertPage, 2007).
+-define(wxTreebook_InsertSubPage, 2008).
+-define(wxTreebook_SetImageList, 2009).
+-define(wxTreebook_SetPageSize, 2010).
+-define(wxTreebook_SetPageImage, 2011).
+-define(wxTreebook_SetPageText, 2012).
+-define(wxTreebook_SetSelection, 2013).
+-define(wxTreebook_ChangeSelection, 2014).
+-define(wxTreebook_destroy, 2015).
+-define(wxTreeCtrl_new_2, 2018).
+-define(wxTreeCtrl_new_0, 2019).
+-define(wxTreeCtrl_destruct, 2021).
+-define(wxTreeCtrl_AddRoot, 2022).
+-define(wxTreeCtrl_AppendItem, 2023).
+-define(wxTreeCtrl_AssignImageList, 2024).
+-define(wxTreeCtrl_AssignStateImageList, 2025).
+-define(wxTreeCtrl_Collapse, 2026).
+-define(wxTreeCtrl_CollapseAndReset, 2027).
+-define(wxTreeCtrl_Create, 2028).
+-define(wxTreeCtrl_Delete, 2029).
+-define(wxTreeCtrl_DeleteAllItems, 2030).
+-define(wxTreeCtrl_DeleteChildren, 2031).
+-define(wxTreeCtrl_EditLabel, 2032).
+-define(wxTreeCtrl_EnsureVisible, 2033).
+-define(wxTreeCtrl_Expand, 2034).
+-define(wxTreeCtrl_GetBoundingRect, 2035).
+-define(wxTreeCtrl_GetChildrenCount, 2037).
+-define(wxTreeCtrl_GetCount, 2038).
+-define(wxTreeCtrl_GetEditControl, 2039).
+-define(wxTreeCtrl_GetFirstChild, 2040).
+-define(wxTreeCtrl_GetNextChild, 2041).
+-define(wxTreeCtrl_GetFirstVisibleItem, 2042).
+-define(wxTreeCtrl_GetImageList, 2043).
+-define(wxTreeCtrl_GetIndent, 2044).
+-define(wxTreeCtrl_GetItemBackgroundColour, 2045).
+-define(wxTreeCtrl_GetItemData, 2046).
+-define(wxTreeCtrl_GetItemFont, 2047).
+-define(wxTreeCtrl_GetItemImage_1, 2048).
+-define(wxTreeCtrl_GetItemImage_2, 2049).
+-define(wxTreeCtrl_GetItemText, 2050).
+-define(wxTreeCtrl_GetItemTextColour, 2051).
+-define(wxTreeCtrl_GetLastChild, 2052).
+-define(wxTreeCtrl_GetNextSibling, 2053).
+-define(wxTreeCtrl_GetNextVisible, 2054).
+-define(wxTreeCtrl_GetItemParent, 2055).
+-define(wxTreeCtrl_GetPrevSibling, 2056).
+-define(wxTreeCtrl_GetPrevVisible, 2057).
+-define(wxTreeCtrl_GetRootItem, 2058).
+-define(wxTreeCtrl_GetSelection, 2059).
+-define(wxTreeCtrl_GetSelections, 2060).
+-define(wxTreeCtrl_GetStateImageList, 2061).
+-define(wxTreeCtrl_HitTest, 2062).
+-define(wxTreeCtrl_InsertItem, 2064).
+-define(wxTreeCtrl_IsBold, 2065).
+-define(wxTreeCtrl_IsExpanded, 2066).
+-define(wxTreeCtrl_IsSelected, 2067).
+-define(wxTreeCtrl_IsVisible, 2068).
+-define(wxTreeCtrl_ItemHasChildren, 2069).
+-define(wxTreeCtrl_IsTreeItemIdOk, 2070).
+-define(wxTreeCtrl_PrependItem, 2071).
+-define(wxTreeCtrl_ScrollTo, 2072).
+-define(wxTreeCtrl_SelectItem_1, 2073).
+-define(wxTreeCtrl_SelectItem_2, 2074).
+-define(wxTreeCtrl_SetIndent, 2075).
+-define(wxTreeCtrl_SetImageList, 2076).
+-define(wxTreeCtrl_SetItemBackgroundColour, 2077).
+-define(wxTreeCtrl_SetItemBold, 2078).
+-define(wxTreeCtrl_SetItemData, 2079).
+-define(wxTreeCtrl_SetItemDropHighlight, 2080).
+-define(wxTreeCtrl_SetItemFont, 2081).
+-define(wxTreeCtrl_SetItemHasChildren, 2082).
+-define(wxTreeCtrl_SetItemImage_2, 2083).
+-define(wxTreeCtrl_SetItemImage_3, 2084).
+-define(wxTreeCtrl_SetItemText, 2085).
+-define(wxTreeCtrl_SetItemTextColour, 2086).
+-define(wxTreeCtrl_SetStateImageList, 2087).
+-define(wxTreeCtrl_SetWindowStyle, 2088).
+-define(wxTreeCtrl_SortChildren, 2089).
+-define(wxTreeCtrl_Toggle, 2090).
+-define(wxTreeCtrl_ToggleItemSelection, 2091).
+-define(wxTreeCtrl_Unselect, 2092).
+-define(wxTreeCtrl_UnselectAll, 2093).
+-define(wxTreeCtrl_UnselectItem, 2094).
+-define(wxScrollBar_new_0, 2095).
+-define(wxScrollBar_new_3, 2096).
+-define(wxScrollBar_destruct, 2097).
+-define(wxScrollBar_Create, 2098).
+-define(wxScrollBar_GetRange, 2099).
+-define(wxScrollBar_GetPageSize, 2100).
+-define(wxScrollBar_GetThumbPosition, 2101).
+-define(wxScrollBar_GetThumbSize, 2102).
+-define(wxScrollBar_SetThumbPosition, 2103).
+-define(wxScrollBar_SetScrollbar, 2104).
+-define(wxSpinButton_new_2, 2106).
+-define(wxSpinButton_new_0, 2107).
+-define(wxSpinButton_Create, 2108).
+-define(wxSpinButton_GetMax, 2109).
+-define(wxSpinButton_GetMin, 2110).
+-define(wxSpinButton_GetValue, 2111).
+-define(wxSpinButton_SetRange, 2112).
+-define(wxSpinButton_SetValue, 2113).
+-define(wxSpinButton_destroy, 2114).
+-define(wxSpinCtrl_new_0, 2115).
+-define(wxSpinCtrl_new_2, 2116).
+-define(wxSpinCtrl_Create, 2118).
+-define(wxSpinCtrl_SetValue_1_1, 2121).
+-define(wxSpinCtrl_SetValue_1_0, 2122).
+-define(wxSpinCtrl_GetValue, 2124).
+-define(wxSpinCtrl_SetRange, 2126).
+-define(wxSpinCtrl_SetSelection, 2127).
+-define(wxSpinCtrl_GetMin, 2129).
+-define(wxSpinCtrl_GetMax, 2131).
+-define(wxSpinCtrl_destroy, 2132).
+-define(wxStaticText_new_0, 2133).
+-define(wxStaticText_new_4, 2134).
+-define(wxStaticText_Create, 2135).
+-define(wxStaticText_GetLabel, 2136).
+-define(wxStaticText_SetLabel, 2137).
+-define(wxStaticText_Wrap, 2138).
+-define(wxStaticText_destroy, 2139).
+-define(wxStaticBitmap_new_0, 2140).
+-define(wxStaticBitmap_new_4, 2141).
+-define(wxStaticBitmap_Create, 2142).
+-define(wxStaticBitmap_GetBitmap, 2143).
+-define(wxStaticBitmap_SetBitmap, 2144).
+-define(wxStaticBitmap_destroy, 2145).
+-define(wxRadioBox_new, 2146).
+-define(wxRadioBox_destruct, 2148).
+-define(wxRadioBox_Create, 2149).
+-define(wxRadioBox_Enable_2, 2150).
+-define(wxRadioBox_Enable_1, 2151).
+-define(wxRadioBox_GetSelection, 2152).
+-define(wxRadioBox_GetString, 2153).
+-define(wxRadioBox_SetSelection, 2154).
+-define(wxRadioBox_Show_2, 2155).
+-define(wxRadioBox_Show_1, 2156).
+-define(wxRadioBox_GetColumnCount, 2157).
+-define(wxRadioBox_GetItemHelpText, 2158).
+-define(wxRadioBox_GetItemToolTip, 2159).
+-define(wxRadioBox_GetItemFromPoint, 2161).
+-define(wxRadioBox_GetRowCount, 2162).
+-define(wxRadioBox_IsItemEnabled, 2163).
+-define(wxRadioBox_IsItemShown, 2164).
+-define(wxRadioBox_SetItemHelpText, 2165).
+-define(wxRadioBox_SetItemToolTip, 2166).
+-define(wxRadioButton_new_0, 2167).
+-define(wxRadioButton_new_4, 2168).
+-define(wxRadioButton_Create, 2169).
+-define(wxRadioButton_GetValue, 2170).
+-define(wxRadioButton_SetValue, 2171).
+-define(wxRadioButton_destroy, 2172).
+-define(wxSlider_new_6, 2174).
+-define(wxSlider_new_0, 2175).
+-define(wxSlider_Create, 2176).
+-define(wxSlider_GetLineSize, 2177).
+-define(wxSlider_GetMax, 2178).
+-define(wxSlider_GetMin, 2179).
+-define(wxSlider_GetPageSize, 2180).
+-define(wxSlider_GetThumbLength, 2181).
+-define(wxSlider_GetValue, 2182).
+-define(wxSlider_SetLineSize, 2183).
+-define(wxSlider_SetPageSize, 2184).
+-define(wxSlider_SetRange, 2185).
+-define(wxSlider_SetThumbLength, 2186).
+-define(wxSlider_SetValue, 2187).
+-define(wxSlider_destroy, 2188).
+-define(wxDialog_new_4, 2190).
+-define(wxDialog_new_0, 2191).
+-define(wxDialog_destruct, 2193).
+-define(wxDialog_Create, 2194).
+-define(wxDialog_CreateButtonSizer, 2195).
+-define(wxDialog_CreateStdDialogButtonSizer, 2196).
+-define(wxDialog_EndModal, 2197).
+-define(wxDialog_GetAffirmativeId, 2198).
+-define(wxDialog_GetReturnCode, 2199).
+-define(wxDialog_IsModal, 2200).
+-define(wxDialog_SetAffirmativeId, 2201).
+-define(wxDialog_SetReturnCode, 2202).
+-define(wxDialog_Show, 2203).
+-define(wxDialog_ShowModal, 2204).
+-define(wxColourDialog_new_0, 2205).
+-define(wxColourDialog_new_2, 2206).
+-define(wxColourDialog_destruct, 2207).
+-define(wxColourDialog_Create, 2208).
+-define(wxColourDialog_GetColourData, 2209).
+-define(wxColourData_new_0, 2210).
+-define(wxColourData_new_1, 2211).
+-define(wxColourData_destruct, 2212).
+-define(wxColourData_GetChooseFull, 2213).
+-define(wxColourData_GetColour, 2214).
+-define(wxColourData_GetCustomColour, 2216).
+-define(wxColourData_SetChooseFull, 2217).
+-define(wxColourData_SetColour, 2218).
+-define(wxColourData_SetCustomColour, 2219).
+-define(wxPalette_new_0, 2220).
+-define(wxPalette_new_4, 2221).
+-define(wxPalette_destruct, 2223).
+-define(wxPalette_Create, 2224).
+-define(wxPalette_GetColoursCount, 2225).
+-define(wxPalette_GetPixel, 2226).
+-define(wxPalette_GetRGB, 2227).
+-define(wxPalette_IsOk, 2228).
+-define(wxDirDialog_new, 2232).
+-define(wxDirDialog_destruct, 2233).
+-define(wxDirDialog_GetPath, 2234).
+-define(wxDirDialog_GetMessage, 2235).
+-define(wxDirDialog_SetMessage, 2236).
+-define(wxDirDialog_SetPath, 2237).
+-define(wxFileDialog_new, 2241).
+-define(wxFileDialog_destruct, 2242).
+-define(wxFileDialog_GetDirectory, 2243).
+-define(wxFileDialog_GetFilename, 2244).
+-define(wxFileDialog_GetFilenames, 2245).
+-define(wxFileDialog_GetFilterIndex, 2246).
+-define(wxFileDialog_GetMessage, 2247).
+-define(wxFileDialog_GetPath, 2248).
+-define(wxFileDialog_GetPaths, 2249).
+-define(wxFileDialog_GetWildcard, 2250).
+-define(wxFileDialog_SetDirectory, 2251).
+-define(wxFileDialog_SetFilename, 2252).
+-define(wxFileDialog_SetFilterIndex, 2253).
+-define(wxFileDialog_SetMessage, 2254).
+-define(wxFileDialog_SetPath, 2255).
+-define(wxFileDialog_SetWildcard, 2256).
+-define(wxPickerBase_SetInternalMargin, 2257).
+-define(wxPickerBase_GetInternalMargin, 2258).
+-define(wxPickerBase_SetTextCtrlProportion, 2259).
+-define(wxPickerBase_SetPickerCtrlProportion, 2260).
+-define(wxPickerBase_GetTextCtrlProportion, 2261).
+-define(wxPickerBase_GetPickerCtrlProportion, 2262).
+-define(wxPickerBase_HasTextCtrl, 2263).
+-define(wxPickerBase_GetTextCtrl, 2264).
+-define(wxPickerBase_IsTextCtrlGrowable, 2265).
+-define(wxPickerBase_SetPickerCtrlGrowable, 2266).
+-define(wxPickerBase_SetTextCtrlGrowable, 2267).
+-define(wxPickerBase_IsPickerCtrlGrowable, 2268).
+-define(wxFilePickerCtrl_new_0, 2269).
+-define(wxFilePickerCtrl_new_3, 2270).
+-define(wxFilePickerCtrl_Create, 2271).
+-define(wxFilePickerCtrl_GetPath, 2272).
+-define(wxFilePickerCtrl_SetPath, 2273).
+-define(wxFilePickerCtrl_destroy, 2274).
+-define(wxDirPickerCtrl_new_0, 2275).
+-define(wxDirPickerCtrl_new_3, 2276).
+-define(wxDirPickerCtrl_Create, 2277).
+-define(wxDirPickerCtrl_GetPath, 2278).
+-define(wxDirPickerCtrl_SetPath, 2279).
+-define(wxDirPickerCtrl_destroy, 2280).
+-define(wxColourPickerCtrl_new_0, 2281).
+-define(wxColourPickerCtrl_new_3, 2282).
+-define(wxColourPickerCtrl_Create, 2283).
+-define(wxColourPickerCtrl_GetColour, 2284).
+-define(wxColourPickerCtrl_SetColour_1_1, 2285).
+-define(wxColourPickerCtrl_SetColour_1_0, 2286).
+-define(wxColourPickerCtrl_destroy, 2287).
+-define(wxDatePickerCtrl_new_0, 2288).
+-define(wxDatePickerCtrl_new_3, 2289).
+-define(wxDatePickerCtrl_GetRange, 2290).
+-define(wxDatePickerCtrl_GetValue, 2291).
+-define(wxDatePickerCtrl_SetRange, 2292).
+-define(wxDatePickerCtrl_SetValue, 2293).
+-define(wxDatePickerCtrl_destroy, 2294).
+-define(wxFontPickerCtrl_new_0, 2295).
+-define(wxFontPickerCtrl_new_3, 2296).
+-define(wxFontPickerCtrl_Create, 2297).
+-define(wxFontPickerCtrl_GetSelectedFont, 2298).
+-define(wxFontPickerCtrl_SetSelectedFont, 2299).
+-define(wxFontPickerCtrl_GetMaxPointSize, 2300).
+-define(wxFontPickerCtrl_SetMaxPointSize, 2301).
+-define(wxFontPickerCtrl_destroy, 2302).
+-define(wxFindReplaceDialog_new_0, 2305).
+-define(wxFindReplaceDialog_new_4, 2306).
+-define(wxFindReplaceDialog_destruct, 2307).
+-define(wxFindReplaceDialog_Create, 2308).
+-define(wxFindReplaceDialog_GetData, 2309).
+-define(wxFindReplaceData_new_0, 2310).
+-define(wxFindReplaceData_new_1, 2311).
+-define(wxFindReplaceData_GetFindString, 2312).
+-define(wxFindReplaceData_GetReplaceString, 2313).
+-define(wxFindReplaceData_GetFlags, 2314).
+-define(wxFindReplaceData_SetFlags, 2315).
+-define(wxFindReplaceData_SetFindString, 2316).
+-define(wxFindReplaceData_SetReplaceString, 2317).
+-define(wxFindReplaceData_destroy, 2318).
+-define(wxMultiChoiceDialog_new_0, 2319).
+-define(wxMultiChoiceDialog_new_5, 2321).
+-define(wxMultiChoiceDialog_GetSelections, 2322).
+-define(wxMultiChoiceDialog_SetSelections, 2323).
+-define(wxMultiChoiceDialog_destroy, 2324).
+-define(wxSingleChoiceDialog_new_0, 2325).
+-define(wxSingleChoiceDialog_new_5, 2327).
+-define(wxSingleChoiceDialog_GetSelection, 2328).
+-define(wxSingleChoiceDialog_GetStringSelection, 2329).
+-define(wxSingleChoiceDialog_SetSelection, 2330).
+-define(wxSingleChoiceDialog_destroy, 2331).
+-define(wxTextEntryDialog_new, 2332).
+-define(wxTextEntryDialog_GetValue, 2333).
+-define(wxTextEntryDialog_SetValue, 2334).
+-define(wxTextEntryDialog_destroy, 2335).
+-define(wxPasswordEntryDialog_new, 2336).
+-define(wxPasswordEntryDialog_destroy, 2337).
+-define(wxFontData_new_0, 2338).
+-define(wxFontData_new_1, 2339).
+-define(wxFontData_destruct, 2340).
+-define(wxFontData_EnableEffects, 2341).
+-define(wxFontData_GetAllowSymbols, 2342).
+-define(wxFontData_GetColour, 2343).
+-define(wxFontData_GetChosenFont, 2344).
+-define(wxFontData_GetEnableEffects, 2345).
+-define(wxFontData_GetInitialFont, 2346).
+-define(wxFontData_GetShowHelp, 2347).
+-define(wxFontData_SetAllowSymbols, 2348).
+-define(wxFontData_SetChosenFont, 2349).
+-define(wxFontData_SetColour, 2350).
+-define(wxFontData_SetInitialFont, 2351).
+-define(wxFontData_SetRange, 2352).
+-define(wxFontData_SetShowHelp, 2353).
+-define(wxFontDialog_new_0, 2357).
+-define(wxFontDialog_new_2, 2359).
+-define(wxFontDialog_Create, 2361).
+-define(wxFontDialog_GetFontData, 2362).
+-define(wxFontDialog_destroy, 2364).
+-define(wxProgressDialog_new, 2365).
+-define(wxProgressDialog_destruct, 2366).
+-define(wxProgressDialog_Resume, 2367).
+-define(wxProgressDialog_Update_2, 2368).
+-define(wxProgressDialog_Update_0, 2369).
+-define(wxMessageDialog_new, 2370).
+-define(wxMessageDialog_destruct, 2371).
+-define(wxPageSetupDialog_new, 2372).
+-define(wxPageSetupDialog_destruct, 2373).
+-define(wxPageSetupDialog_GetPageSetupData, 2374).
+-define(wxPageSetupDialog_ShowModal, 2375).
+-define(wxPageSetupDialogData_new_0, 2376).
+-define(wxPageSetupDialogData_new_1_0, 2377).
+-define(wxPageSetupDialogData_new_1_1, 2378).
+-define(wxPageSetupDialogData_destruct, 2379).
+-define(wxPageSetupDialogData_EnableHelp, 2380).
+-define(wxPageSetupDialogData_EnableMargins, 2381).
+-define(wxPageSetupDialogData_EnableOrientation, 2382).
+-define(wxPageSetupDialogData_EnablePaper, 2383).
+-define(wxPageSetupDialogData_EnablePrinter, 2384).
+-define(wxPageSetupDialogData_GetDefaultMinMargins, 2385).
+-define(wxPageSetupDialogData_GetEnableMargins, 2386).
+-define(wxPageSetupDialogData_GetEnableOrientation, 2387).
+-define(wxPageSetupDialogData_GetEnablePaper, 2388).
+-define(wxPageSetupDialogData_GetEnablePrinter, 2389).
+-define(wxPageSetupDialogData_GetEnableHelp, 2390).
+-define(wxPageSetupDialogData_GetDefaultInfo, 2391).
+-define(wxPageSetupDialogData_GetMarginTopLeft, 2392).
+-define(wxPageSetupDialogData_GetMarginBottomRight, 2393).
+-define(wxPageSetupDialogData_GetMinMarginTopLeft, 2394).
+-define(wxPageSetupDialogData_GetMinMarginBottomRight, 2395).
+-define(wxPageSetupDialogData_GetPaperId, 2396).
+-define(wxPageSetupDialogData_GetPaperSize, 2397).
+-define(wxPageSetupDialogData_GetPrintData, 2399).
+-define(wxPageSetupDialogData_IsOk, 2400).
+-define(wxPageSetupDialogData_SetDefaultInfo, 2401).
+-define(wxPageSetupDialogData_SetDefaultMinMargins, 2402).
+-define(wxPageSetupDialogData_SetMarginTopLeft, 2403).
+-define(wxPageSetupDialogData_SetMarginBottomRight, 2404).
+-define(wxPageSetupDialogData_SetMinMarginTopLeft, 2405).
+-define(wxPageSetupDialogData_SetMinMarginBottomRight, 2406).
+-define(wxPageSetupDialogData_SetPaperId, 2407).
+-define(wxPageSetupDialogData_SetPaperSize_1_1, 2408).
+-define(wxPageSetupDialogData_SetPaperSize_1_0, 2409).
+-define(wxPageSetupDialogData_SetPrintData, 2410).
+-define(wxPrintDialog_new_2_0, 2411).
+-define(wxPrintDialog_new_2_1, 2412).
+-define(wxPrintDialog_destruct, 2413).
+-define(wxPrintDialog_GetPrintDialogData, 2414).
+-define(wxPrintDialog_GetPrintDC, 2415).
+-define(wxPrintDialogData_new_0, 2416).
+-define(wxPrintDialogData_new_1_1, 2417).
+-define(wxPrintDialogData_new_1_0, 2418).
+-define(wxPrintDialogData_destruct, 2419).
+-define(wxPrintDialogData_EnableHelp, 2420).
+-define(wxPrintDialogData_EnablePageNumbers, 2421).
+-define(wxPrintDialogData_EnablePrintToFile, 2422).
+-define(wxPrintDialogData_EnableSelection, 2423).
+-define(wxPrintDialogData_GetAllPages, 2424).
+-define(wxPrintDialogData_GetCollate, 2425).
+-define(wxPrintDialogData_GetFromPage, 2426).
+-define(wxPrintDialogData_GetMaxPage, 2427).
+-define(wxPrintDialogData_GetMinPage, 2428).
+-define(wxPrintDialogData_GetNoCopies, 2429).
+-define(wxPrintDialogData_GetPrintData, 2430).
+-define(wxPrintDialogData_GetPrintToFile, 2431).
+-define(wxPrintDialogData_GetSelection, 2432).
+-define(wxPrintDialogData_GetToPage, 2433).
+-define(wxPrintDialogData_IsOk, 2434).
+-define(wxPrintDialogData_SetCollate, 2435).
+-define(wxPrintDialogData_SetFromPage, 2436).
+-define(wxPrintDialogData_SetMaxPage, 2437).
+-define(wxPrintDialogData_SetMinPage, 2438).
+-define(wxPrintDialogData_SetNoCopies, 2439).
+-define(wxPrintDialogData_SetPrintData, 2440).
+-define(wxPrintDialogData_SetPrintToFile, 2441).
+-define(wxPrintDialogData_SetSelection, 2442).
+-define(wxPrintDialogData_SetToPage, 2443).
+-define(wxPrintData_new_0, 2444).
+-define(wxPrintData_new_1, 2445).
+-define(wxPrintData_destruct, 2446).
+-define(wxPrintData_GetCollate, 2447).
+-define(wxPrintData_GetBin, 2448).
+-define(wxPrintData_GetColour, 2449).
+-define(wxPrintData_GetDuplex, 2450).
+-define(wxPrintData_GetNoCopies, 2451).
+-define(wxPrintData_GetOrientation, 2452).
+-define(wxPrintData_GetPaperId, 2453).
+-define(wxPrintData_GetPrinterName, 2454).
+-define(wxPrintData_GetQuality, 2455).
+-define(wxPrintData_IsOk, 2456).
+-define(wxPrintData_SetBin, 2457).
+-define(wxPrintData_SetCollate, 2458).
+-define(wxPrintData_SetColour, 2459).
+-define(wxPrintData_SetDuplex, 2460).
+-define(wxPrintData_SetNoCopies, 2461).
+-define(wxPrintData_SetOrientation, 2462).
+-define(wxPrintData_SetPaperId, 2463).
+-define(wxPrintData_SetPrinterName, 2464).
+-define(wxPrintData_SetQuality, 2465).
+-define(wxPrintPreview_new_2, 2468).
+-define(wxPrintPreview_new_3, 2469).
+-define(wxPrintPreview_destruct, 2471).
+-define(wxPrintPreview_GetCanvas, 2472).
+-define(wxPrintPreview_GetCurrentPage, 2473).
+-define(wxPrintPreview_GetFrame, 2474).
+-define(wxPrintPreview_GetMaxPage, 2475).
+-define(wxPrintPreview_GetMinPage, 2476).
+-define(wxPrintPreview_GetPrintout, 2477).
+-define(wxPrintPreview_GetPrintoutForPrinting, 2478).
+-define(wxPrintPreview_IsOk, 2479).
+-define(wxPrintPreview_PaintPage, 2480).
+-define(wxPrintPreview_Print, 2481).
+-define(wxPrintPreview_RenderPage, 2482).
+-define(wxPrintPreview_SetCanvas, 2483).
+-define(wxPrintPreview_SetCurrentPage, 2484).
+-define(wxPrintPreview_SetFrame, 2485).
+-define(wxPrintPreview_SetPrintout, 2486).
+-define(wxPrintPreview_SetZoom, 2487).
+-define(wxPreviewFrame_new, 2488).
+-define(wxPreviewFrame_destruct, 2489).
+-define(wxPreviewFrame_CreateControlBar, 2490).
+-define(wxPreviewFrame_CreateCanvas, 2491).
+-define(wxPreviewFrame_Initialize, 2492).
+-define(wxPreviewFrame_OnCloseWindow, 2493).
+-define(wxPreviewControlBar_new, 2494).
+-define(wxPreviewControlBar_destruct, 2495).
+-define(wxPreviewControlBar_CreateButtons, 2496).
+-define(wxPreviewControlBar_GetPrintPreview, 2497).
+-define(wxPreviewControlBar_GetZoomControl, 2498).
+-define(wxPreviewControlBar_SetZoomControl, 2499).
+-define(wxPrinter_new, 2501).
+-define(wxPrinter_CreateAbortWindow, 2502).
+-define(wxPrinter_GetAbort, 2503).
+-define(wxPrinter_GetLastError, 2504).
+-define(wxPrinter_GetPrintDialogData, 2505).
+-define(wxPrinter_Print, 2506).
+-define(wxPrinter_PrintDialog, 2507).
+-define(wxPrinter_ReportError, 2508).
+-define(wxPrinter_Setup, 2509).
+-define(wxPrinter_destroy, 2510).
+-define(wxXmlResource_new_1, 2511).
+-define(wxXmlResource_new_2, 2512).
+-define(wxXmlResource_destruct, 2513).
+-define(wxXmlResource_AttachUnknownControl, 2514).
+-define(wxXmlResource_ClearHandlers, 2515).
+-define(wxXmlResource_CompareVersion, 2516).
+-define(wxXmlResource_Get, 2517).
+-define(wxXmlResource_GetFlags, 2518).
+-define(wxXmlResource_GetVersion, 2519).
+-define(wxXmlResource_GetXRCID, 2520).
+-define(wxXmlResource_InitAllHandlers, 2521).
+-define(wxXmlResource_Load, 2522).
+-define(wxXmlResource_LoadBitmap, 2523).
+-define(wxXmlResource_LoadDialog_2, 2524).
+-define(wxXmlResource_LoadDialog_3, 2525).
+-define(wxXmlResource_LoadFrame_2, 2526).
+-define(wxXmlResource_LoadFrame_3, 2527).
+-define(wxXmlResource_LoadIcon, 2528).
+-define(wxXmlResource_LoadMenu, 2529).
+-define(wxXmlResource_LoadMenuBar_2, 2530).
+-define(wxXmlResource_LoadMenuBar_1, 2531).
+-define(wxXmlResource_LoadPanel_2, 2532).
+-define(wxXmlResource_LoadPanel_3, 2533).
+-define(wxXmlResource_LoadToolBar, 2534).
+-define(wxXmlResource_Set, 2535).
+-define(wxXmlResource_SetFlags, 2536).
+-define(wxXmlResource_Unload, 2537).
+-define(wxXmlResource_xrcctrl, 2538).
+-define(wxHtmlEasyPrinting_new, 2539).
+-define(wxHtmlEasyPrinting_destruct, 2540).
+-define(wxHtmlEasyPrinting_GetPrintData, 2541).
+-define(wxHtmlEasyPrinting_GetPageSetupData, 2542).
+-define(wxHtmlEasyPrinting_PreviewFile, 2543).
+-define(wxHtmlEasyPrinting_PreviewText, 2544).
+-define(wxHtmlEasyPrinting_PrintFile, 2545).
+-define(wxHtmlEasyPrinting_PrintText, 2546).
+-define(wxHtmlEasyPrinting_PageSetup, 2547).
+-define(wxHtmlEasyPrinting_SetFonts, 2548).
+-define(wxHtmlEasyPrinting_SetHeader, 2549).
+-define(wxHtmlEasyPrinting_SetFooter, 2550).
+-define(wxGLCanvas_new_2, 2552).
+-define(wxGLCanvas_new_3_1, 2553).
+-define(wxGLCanvas_new_3_0, 2554).
+-define(wxGLCanvas_GetContext, 2555).
+-define(wxGLCanvas_SetCurrent, 2557).
+-define(wxGLCanvas_SwapBuffers, 2558).
+-define(wxGLCanvas_destroy, 2559).
+-define(wxAuiManager_new, 2560).
+-define(wxAuiManager_destruct, 2561).
+-define(wxAuiManager_AddPane_2_1, 2562).
+-define(wxAuiManager_AddPane_3, 2563).
+-define(wxAuiManager_AddPane_2_0, 2564).
+-define(wxAuiManager_DetachPane, 2565).
+-define(wxAuiManager_GetAllPanes, 2566).
+-define(wxAuiManager_GetArtProvider, 2567).
+-define(wxAuiManager_GetDockSizeConstraint, 2568).
+-define(wxAuiManager_GetFlags, 2569).
+-define(wxAuiManager_GetManagedWindow, 2570).
+-define(wxAuiManager_GetManager, 2571).
+-define(wxAuiManager_GetPane_1_1, 2572).
+-define(wxAuiManager_GetPane_1_0, 2573).
+-define(wxAuiManager_HideHint, 2574).
+-define(wxAuiManager_InsertPane, 2575).
+-define(wxAuiManager_LoadPaneInfo, 2576).
+-define(wxAuiManager_LoadPerspective, 2577).
+-define(wxAuiManager_SavePaneInfo, 2578).
+-define(wxAuiManager_SavePerspective, 2579).
+-define(wxAuiManager_SetArtProvider, 2580).
+-define(wxAuiManager_SetDockSizeConstraint, 2581).
+-define(wxAuiManager_SetFlags, 2582).
+-define(wxAuiManager_SetManagedWindow, 2583).
+-define(wxAuiManager_ShowHint, 2584).
+-define(wxAuiManager_UnInit, 2585).
+-define(wxAuiManager_Update, 2586).
+-define(wxAuiPaneInfo_new_0, 2587).
+-define(wxAuiPaneInfo_new_1, 2588).
+-define(wxAuiPaneInfo_destruct, 2589).
+-define(wxAuiPaneInfo_BestSize_1, 2590).
+-define(wxAuiPaneInfo_BestSize_2, 2591).
+-define(wxAuiPaneInfo_Bottom, 2592).
+-define(wxAuiPaneInfo_BottomDockable, 2593).
+-define(wxAuiPaneInfo_Caption, 2594).
+-define(wxAuiPaneInfo_CaptionVisible, 2595).
+-define(wxAuiPaneInfo_Centre, 2596).
+-define(wxAuiPaneInfo_CentrePane, 2597).
+-define(wxAuiPaneInfo_CloseButton, 2598).
+-define(wxAuiPaneInfo_DefaultPane, 2599).
+-define(wxAuiPaneInfo_DestroyOnClose, 2600).
+-define(wxAuiPaneInfo_Direction, 2601).
+-define(wxAuiPaneInfo_Dock, 2602).
+-define(wxAuiPaneInfo_Dockable, 2603).
+-define(wxAuiPaneInfo_Fixed, 2604).
+-define(wxAuiPaneInfo_Float, 2605).
+-define(wxAuiPaneInfo_Floatable, 2606).
+-define(wxAuiPaneInfo_FloatingPosition_1, 2607).
+-define(wxAuiPaneInfo_FloatingPosition_2, 2608).
+-define(wxAuiPaneInfo_FloatingSize_1, 2609).
+-define(wxAuiPaneInfo_FloatingSize_2, 2610).
+-define(wxAuiPaneInfo_Gripper, 2611).
+-define(wxAuiPaneInfo_GripperTop, 2612).
+-define(wxAuiPaneInfo_HasBorder, 2613).
+-define(wxAuiPaneInfo_HasCaption, 2614).
+-define(wxAuiPaneInfo_HasCloseButton, 2615).
+-define(wxAuiPaneInfo_HasFlag, 2616).
+-define(wxAuiPaneInfo_HasGripper, 2617).
+-define(wxAuiPaneInfo_HasGripperTop, 2618).
+-define(wxAuiPaneInfo_HasMaximizeButton, 2619).
+-define(wxAuiPaneInfo_HasMinimizeButton, 2620).
+-define(wxAuiPaneInfo_HasPinButton, 2621).
+-define(wxAuiPaneInfo_Hide, 2622).
+-define(wxAuiPaneInfo_IsBottomDockable, 2623).
+-define(wxAuiPaneInfo_IsDocked, 2624).
+-define(wxAuiPaneInfo_IsFixed, 2625).
+-define(wxAuiPaneInfo_IsFloatable, 2626).
+-define(wxAuiPaneInfo_IsFloating, 2627).
+-define(wxAuiPaneInfo_IsLeftDockable, 2628).
+-define(wxAuiPaneInfo_IsMovable, 2629).
+-define(wxAuiPaneInfo_IsOk, 2630).
+-define(wxAuiPaneInfo_IsResizable, 2631).
+-define(wxAuiPaneInfo_IsRightDockable, 2632).
+-define(wxAuiPaneInfo_IsShown, 2633).
+-define(wxAuiPaneInfo_IsToolbar, 2634).
+-define(wxAuiPaneInfo_IsTopDockable, 2635).
+-define(wxAuiPaneInfo_Layer, 2636).
+-define(wxAuiPaneInfo_Left, 2637).
+-define(wxAuiPaneInfo_LeftDockable, 2638).
+-define(wxAuiPaneInfo_MaxSize_1, 2639).
+-define(wxAuiPaneInfo_MaxSize_2, 2640).
+-define(wxAuiPaneInfo_MaximizeButton, 2641).
+-define(wxAuiPaneInfo_MinSize_1, 2642).
+-define(wxAuiPaneInfo_MinSize_2, 2643).
+-define(wxAuiPaneInfo_MinimizeButton, 2644).
+-define(wxAuiPaneInfo_Movable, 2645).
+-define(wxAuiPaneInfo_Name, 2646).
+-define(wxAuiPaneInfo_PaneBorder, 2647).
+-define(wxAuiPaneInfo_PinButton, 2648).
+-define(wxAuiPaneInfo_Position, 2649).
+-define(wxAuiPaneInfo_Resizable, 2650).
+-define(wxAuiPaneInfo_Right, 2651).
+-define(wxAuiPaneInfo_RightDockable, 2652).
+-define(wxAuiPaneInfo_Row, 2653).
+-define(wxAuiPaneInfo_SafeSet, 2654).
+-define(wxAuiPaneInfo_SetFlag, 2655).
+-define(wxAuiPaneInfo_Show, 2656).
+-define(wxAuiPaneInfo_ToolbarPane, 2657).
+-define(wxAuiPaneInfo_Top, 2658).
+-define(wxAuiPaneInfo_TopDockable, 2659).
+-define(wxAuiPaneInfo_Window, 2660).
+-define(wxAuiPaneInfo_GetWindow, 2661).
+-define(wxAuiPaneInfo_GetFrame, 2662).
+-define(wxAuiPaneInfo_GetDirection, 2663).
+-define(wxAuiPaneInfo_GetLayer, 2664).
+-define(wxAuiPaneInfo_GetRow, 2665).
+-define(wxAuiPaneInfo_GetPosition, 2666).
+-define(wxAuiPaneInfo_GetFloatingPosition, 2667).
+-define(wxAuiPaneInfo_GetFloatingSize, 2668).
+-define(wxAuiNotebook_new_0, 2669).
+-define(wxAuiNotebook_new_2, 2670).
+-define(wxAuiNotebook_AddPage, 2671).
+-define(wxAuiNotebook_Create, 2672).
+-define(wxAuiNotebook_DeletePage, 2673).
+-define(wxAuiNotebook_GetArtProvider, 2674).
+-define(wxAuiNotebook_GetPage, 2675).
+-define(wxAuiNotebook_GetPageBitmap, 2676).
+-define(wxAuiNotebook_GetPageCount, 2677).
+-define(wxAuiNotebook_GetPageIndex, 2678).
+-define(wxAuiNotebook_GetPageText, 2679).
+-define(wxAuiNotebook_GetSelection, 2680).
+-define(wxAuiNotebook_InsertPage, 2681).
+-define(wxAuiNotebook_RemovePage, 2682).
+-define(wxAuiNotebook_SetArtProvider, 2683).
+-define(wxAuiNotebook_SetFont, 2684).
+-define(wxAuiNotebook_SetPageBitmap, 2685).
+-define(wxAuiNotebook_SetPageText, 2686).
+-define(wxAuiNotebook_SetSelection, 2687).
+-define(wxAuiNotebook_SetTabCtrlHeight, 2688).
+-define(wxAuiNotebook_SetUniformBitmapSize, 2689).
+-define(wxAuiNotebook_destroy, 2690).
+-define(wxAuiTabArt_SetFlags, 2691).
+-define(wxAuiTabArt_SetMeasuringFont, 2692).
+-define(wxAuiTabArt_SetNormalFont, 2693).
+-define(wxAuiTabArt_SetSelectedFont, 2694).
+-define(wxAuiTabArt_SetColour, 2695).
+-define(wxAuiTabArt_SetActiveColour, 2696).
+-define(wxAuiDockArt_GetColour, 2697).
+-define(wxAuiDockArt_GetFont, 2698).
+-define(wxAuiDockArt_GetMetric, 2699).
+-define(wxAuiDockArt_SetColour, 2700).
+-define(wxAuiDockArt_SetFont, 2701).
+-define(wxAuiDockArt_SetMetric, 2702).
+-define(wxAuiSimpleTabArt_new, 2703).
+-define(wxAuiSimpleTabArt_destroy, 2704).
+-define(wxMDIParentFrame_new_0, 2705).
+-define(wxMDIParentFrame_new_4, 2706).
+-define(wxMDIParentFrame_destruct, 2707).
+-define(wxMDIParentFrame_ActivateNext, 2708).
+-define(wxMDIParentFrame_ActivatePrevious, 2709).
+-define(wxMDIParentFrame_ArrangeIcons, 2710).
+-define(wxMDIParentFrame_Cascade, 2711).
+-define(wxMDIParentFrame_Create, 2712).
+-define(wxMDIParentFrame_GetActiveChild, 2713).
+-define(wxMDIParentFrame_GetClientWindow, 2714).
+-define(wxMDIParentFrame_Tile, 2715).
+-define(wxMDIChildFrame_new_0, 2716).
+-define(wxMDIChildFrame_new_4, 2717).
+-define(wxMDIChildFrame_destruct, 2718).
+-define(wxMDIChildFrame_Activate, 2719).
+-define(wxMDIChildFrame_Create, 2720).
+-define(wxMDIChildFrame_Maximize, 2721).
+-define(wxMDIChildFrame_Restore, 2722).
+-define(wxMDIClientWindow_new_0, 2723).
+-define(wxMDIClientWindow_new_2, 2724).
+-define(wxMDIClientWindow_destruct, 2725).
+-define(wxMDIClientWindow_CreateClient, 2726).
+-define(wxLayoutAlgorithm_new, 2727).
+-define(wxLayoutAlgorithm_LayoutFrame, 2728).
+-define(wxLayoutAlgorithm_LayoutMDIFrame, 2729).
+-define(wxLayoutAlgorithm_LayoutWindow, 2730).
+-define(wxLayoutAlgorithm_destroy, 2731).
+-define(wxEvent_GetId, 2732).
+-define(wxEvent_GetSkipped, 2733).
+-define(wxEvent_GetTimestamp, 2734).
+-define(wxEvent_IsCommandEvent, 2735).
+-define(wxEvent_ResumePropagation, 2736).
+-define(wxEvent_ShouldPropagate, 2737).
+-define(wxEvent_Skip, 2738).
+-define(wxEvent_StopPropagation, 2739).
+-define(wxCommandEvent_getClientData, 2740).
+-define(wxCommandEvent_GetExtraLong, 2741).
+-define(wxCommandEvent_GetInt, 2742).
+-define(wxCommandEvent_GetSelection, 2743).
+-define(wxCommandEvent_GetString, 2744).
+-define(wxCommandEvent_IsChecked, 2745).
+-define(wxCommandEvent_IsSelection, 2746).
+-define(wxCommandEvent_SetInt, 2747).
+-define(wxCommandEvent_SetString, 2748).
+-define(wxScrollEvent_GetOrientation, 2749).
+-define(wxScrollEvent_GetPosition, 2750).
+-define(wxScrollWinEvent_GetOrientation, 2751).
+-define(wxScrollWinEvent_GetPosition, 2752).
+-define(wxMouseEvent_AltDown, 2753).
+-define(wxMouseEvent_Button, 2754).
+-define(wxMouseEvent_ButtonDClick, 2755).
+-define(wxMouseEvent_ButtonDown, 2756).
+-define(wxMouseEvent_ButtonUp, 2757).
+-define(wxMouseEvent_CmdDown, 2758).
+-define(wxMouseEvent_ControlDown, 2759).
+-define(wxMouseEvent_Dragging, 2760).
+-define(wxMouseEvent_Entering, 2761).
+-define(wxMouseEvent_GetButton, 2762).
+-define(wxMouseEvent_GetPosition, 2765).
+-define(wxMouseEvent_GetLogicalPosition, 2766).
+-define(wxMouseEvent_GetLinesPerAction, 2767).
+-define(wxMouseEvent_GetWheelRotation, 2768).
+-define(wxMouseEvent_GetWheelDelta, 2769).
+-define(wxMouseEvent_GetX, 2770).
+-define(wxMouseEvent_GetY, 2771).
+-define(wxMouseEvent_IsButton, 2772).
+-define(wxMouseEvent_IsPageScroll, 2773).
+-define(wxMouseEvent_Leaving, 2774).
+-define(wxMouseEvent_LeftDClick, 2775).
+-define(wxMouseEvent_LeftDown, 2776).
+-define(wxMouseEvent_LeftIsDown, 2777).
+-define(wxMouseEvent_LeftUp, 2778).
+-define(wxMouseEvent_MetaDown, 2779).
+-define(wxMouseEvent_MiddleDClick, 2780).
+-define(wxMouseEvent_MiddleDown, 2781).
+-define(wxMouseEvent_MiddleIsDown, 2782).
+-define(wxMouseEvent_MiddleUp, 2783).
+-define(wxMouseEvent_Moving, 2784).
+-define(wxMouseEvent_RightDClick, 2785).
+-define(wxMouseEvent_RightDown, 2786).
+-define(wxMouseEvent_RightIsDown, 2787).
+-define(wxMouseEvent_RightUp, 2788).
+-define(wxMouseEvent_ShiftDown, 2789).
+-define(wxSetCursorEvent_GetCursor, 2790).
+-define(wxSetCursorEvent_GetX, 2791).
+-define(wxSetCursorEvent_GetY, 2792).
+-define(wxSetCursorEvent_HasCursor, 2793).
+-define(wxSetCursorEvent_SetCursor, 2794).
+-define(wxKeyEvent_AltDown, 2795).
+-define(wxKeyEvent_CmdDown, 2796).
+-define(wxKeyEvent_ControlDown, 2797).
+-define(wxKeyEvent_GetKeyCode, 2798).
+-define(wxKeyEvent_GetModifiers, 2799).
+-define(wxKeyEvent_GetPosition, 2802).
+-define(wxKeyEvent_GetRawKeyCode, 2803).
+-define(wxKeyEvent_GetRawKeyFlags, 2804).
+-define(wxKeyEvent_GetUnicodeKey, 2805).
+-define(wxKeyEvent_GetX, 2806).
+-define(wxKeyEvent_GetY, 2807).
+-define(wxKeyEvent_HasModifiers, 2808).
+-define(wxKeyEvent_MetaDown, 2809).
+-define(wxKeyEvent_ShiftDown, 2810).
+-define(wxSizeEvent_GetSize, 2811).
+-define(wxMoveEvent_GetPosition, 2812).
+-define(wxEraseEvent_GetDC, 2813).
+-define(wxFocusEvent_GetWindow, 2814).
+-define(wxChildFocusEvent_GetWindow, 2815).
+-define(wxMenuEvent_GetMenu, 2816).
+-define(wxMenuEvent_GetMenuId, 2817).
+-define(wxMenuEvent_IsPopup, 2818).
+-define(wxCloseEvent_CanVeto, 2819).
+-define(wxCloseEvent_GetLoggingOff, 2820).
+-define(wxCloseEvent_SetCanVeto, 2821).
+-define(wxCloseEvent_SetLoggingOff, 2822).
+-define(wxCloseEvent_Veto, 2823).
+-define(wxShowEvent_SetShow, 2824).
+-define(wxShowEvent_GetShow, 2825).
+-define(wxIconizeEvent_Iconized, 2826).
+-define(wxJoystickEvent_ButtonDown, 2827).
+-define(wxJoystickEvent_ButtonIsDown, 2828).
+-define(wxJoystickEvent_ButtonUp, 2829).
+-define(wxJoystickEvent_GetButtonChange, 2830).
+-define(wxJoystickEvent_GetButtonState, 2831).
+-define(wxJoystickEvent_GetJoystick, 2832).
+-define(wxJoystickEvent_GetPosition, 2833).
+-define(wxJoystickEvent_GetZPosition, 2834).
+-define(wxJoystickEvent_IsButton, 2835).
+-define(wxJoystickEvent_IsMove, 2836).
+-define(wxJoystickEvent_IsZMove, 2837).
+-define(wxUpdateUIEvent_CanUpdate, 2838).
+-define(wxUpdateUIEvent_Check, 2839).
+-define(wxUpdateUIEvent_Enable, 2840).
+-define(wxUpdateUIEvent_Show, 2841).
+-define(wxUpdateUIEvent_GetChecked, 2842).
+-define(wxUpdateUIEvent_GetEnabled, 2843).
+-define(wxUpdateUIEvent_GetShown, 2844).
+-define(wxUpdateUIEvent_GetSetChecked, 2845).
+-define(wxUpdateUIEvent_GetSetEnabled, 2846).
+-define(wxUpdateUIEvent_GetSetShown, 2847).
+-define(wxUpdateUIEvent_GetSetText, 2848).
+-define(wxUpdateUIEvent_GetText, 2849).
+-define(wxUpdateUIEvent_GetMode, 2850).
+-define(wxUpdateUIEvent_GetUpdateInterval, 2851).
+-define(wxUpdateUIEvent_ResetUpdateTime, 2852).
+-define(wxUpdateUIEvent_SetMode, 2853).
+-define(wxUpdateUIEvent_SetText, 2854).
+-define(wxUpdateUIEvent_SetUpdateInterval, 2855).
+-define(wxMouseCaptureChangedEvent_GetCapturedWindow, 2856).
+-define(wxPaletteChangedEvent_SetChangedWindow, 2857).
+-define(wxPaletteChangedEvent_GetChangedWindow, 2858).
+-define(wxQueryNewPaletteEvent_SetPaletteRealized, 2859).
+-define(wxQueryNewPaletteEvent_GetPaletteRealized, 2860).
+-define(wxNavigationKeyEvent_GetDirection, 2861).
+-define(wxNavigationKeyEvent_SetDirection, 2862).
+-define(wxNavigationKeyEvent_IsWindowChange, 2863).
+-define(wxNavigationKeyEvent_SetWindowChange, 2864).
+-define(wxNavigationKeyEvent_IsFromTab, 2865).
+-define(wxNavigationKeyEvent_SetFromTab, 2866).
+-define(wxNavigationKeyEvent_GetCurrentFocus, 2867).
+-define(wxNavigationKeyEvent_SetCurrentFocus, 2868).
+-define(wxHelpEvent_GetOrigin, 2869).
+-define(wxHelpEvent_GetPosition, 2870).
+-define(wxHelpEvent_SetOrigin, 2871).
+-define(wxHelpEvent_SetPosition, 2872).
+-define(wxContextMenuEvent_GetPosition, 2873).
+-define(wxContextMenuEvent_SetPosition, 2874).
+-define(wxIdleEvent_CanSend, 2875).
+-define(wxIdleEvent_GetMode, 2876).
+-define(wxIdleEvent_RequestMore, 2877).
+-define(wxIdleEvent_MoreRequested, 2878).
+-define(wxIdleEvent_SetMode, 2879).
+-define(wxGridEvent_AltDown, 2880).
+-define(wxGridEvent_ControlDown, 2881).
+-define(wxGridEvent_GetCol, 2882).
+-define(wxGridEvent_GetPosition, 2883).
+-define(wxGridEvent_GetRow, 2884).
+-define(wxGridEvent_MetaDown, 2885).
+-define(wxGridEvent_Selecting, 2886).
+-define(wxGridEvent_ShiftDown, 2887).
+-define(wxNotifyEvent_Allow, 2888).
+-define(wxNotifyEvent_IsAllowed, 2889).
+-define(wxNotifyEvent_Veto, 2890).
+-define(wxSashEvent_GetEdge, 2891).
+-define(wxSashEvent_GetDragRect, 2892).
+-define(wxSashEvent_GetDragStatus, 2893).
+-define(wxListEvent_GetCacheFrom, 2894).
+-define(wxListEvent_GetCacheTo, 2895).
+-define(wxListEvent_GetKeyCode, 2896).
+-define(wxListEvent_GetIndex, 2897).
+-define(wxListEvent_GetColumn, 2898).
+-define(wxListEvent_GetPoint, 2899).
+-define(wxListEvent_GetLabel, 2900).
+-define(wxListEvent_GetText, 2901).
+-define(wxListEvent_GetImage, 2902).
+-define(wxListEvent_GetData, 2903).
+-define(wxListEvent_GetMask, 2904).
+-define(wxListEvent_GetItem, 2905).
+-define(wxListEvent_IsEditCancelled, 2906).
+-define(wxDateEvent_GetDate, 2907).
+-define(wxCalendarEvent_GetWeekDay, 2908).
+-define(wxFileDirPickerEvent_GetPath, 2909).
+-define(wxColourPickerEvent_GetColour, 2910).
+-define(wxFontPickerEvent_GetFont, 2911).
+-define(wxStyledTextEvent_GetPosition, 2912).
+-define(wxStyledTextEvent_GetKey, 2913).
+-define(wxStyledTextEvent_GetModifiers, 2914).
+-define(wxStyledTextEvent_GetModificationType, 2915).
+-define(wxStyledTextEvent_GetText, 2916).
+-define(wxStyledTextEvent_GetLength, 2917).
+-define(wxStyledTextEvent_GetLinesAdded, 2918).
+-define(wxStyledTextEvent_GetLine, 2919).
+-define(wxStyledTextEvent_GetFoldLevelNow, 2920).
+-define(wxStyledTextEvent_GetFoldLevelPrev, 2921).
+-define(wxStyledTextEvent_GetMargin, 2922).
+-define(wxStyledTextEvent_GetMessage, 2923).
+-define(wxStyledTextEvent_GetWParam, 2924).
+-define(wxStyledTextEvent_GetLParam, 2925).
+-define(wxStyledTextEvent_GetListType, 2926).
+-define(wxStyledTextEvent_GetX, 2927).
+-define(wxStyledTextEvent_GetY, 2928).
+-define(wxStyledTextEvent_GetDragText, 2929).
+-define(wxStyledTextEvent_GetDragAllowMove, 2930).
+-define(wxStyledTextEvent_GetDragResult, 2931).
+-define(wxStyledTextEvent_GetShift, 2932).
+-define(wxStyledTextEvent_GetControl, 2933).
+-define(wxStyledTextEvent_GetAlt, 2934).
+-define(utils_wxGetKeyState, 2935).
+-define(utils_wxGetMousePosition, 2936).
+-define(utils_wxGetMouseState, 2937).
+-define(utils_wxSetDetectableAutoRepeat, 2938).
+-define(utils_wxBell, 2939).
+-define(utils_wxFindMenuItemId, 2940).
+-define(utils_wxGenericFindWindowAtPoint, 2941).
+-define(utils_wxFindWindowAtPoint, 2942).
+-define(utils_wxBeginBusyCursor, 2943).
+-define(utils_wxEndBusyCursor, 2944).
+-define(utils_wxIsBusy, 2945).
+-define(utils_wxShutdown, 2946).
+-define(utils_wxShell, 2947).
+-define(utils_wxLaunchDefaultBrowser, 2948).
+-define(utils_wxGetEmailAddress, 2949).
+-define(utils_wxGetUserId, 2950).
+-define(utils_wxGetHomeDir, 2951).
+-define(utils_wxNewId, 2952).
+-define(utils_wxRegisterId, 2953).
+-define(utils_wxGetCurrentId, 2954).
+-define(utils_wxGetOsDescription, 2955).
+-define(utils_wxIsPlatformLittleEndian, 2956).
+-define(utils_wxIsPlatform64Bit, 2957).
+-define(gdicmn_wxDisplaySize, 2958).
+-define(gdicmn_wxSetCursor, 2959).
+-define(wxPrintout_new, 2960).
+-define(wxPrintout_destruct, 2961).
+-define(wxPrintout_GetDC, 2962).
+-define(wxPrintout_GetPageSizeMM, 2963).
+-define(wxPrintout_GetPageSizePixels, 2964).
+-define(wxPrintout_GetPaperRectPixels, 2965).
+-define(wxPrintout_GetPPIPrinter, 2966).
+-define(wxPrintout_GetPPIScreen, 2967).
+-define(wxPrintout_GetTitle, 2968).
+-define(wxPrintout_IsPreview, 2969).
+-define(wxPrintout_FitThisSizeToPaper, 2970).
+-define(wxPrintout_FitThisSizeToPage, 2971).
+-define(wxPrintout_FitThisSizeToPageMargins, 2972).
+-define(wxPrintout_MapScreenSizeToPaper, 2973).
+-define(wxPrintout_MapScreenSizeToPage, 2974).
+-define(wxPrintout_MapScreenSizeToPageMargins, 2975).
+-define(wxPrintout_MapScreenSizeToDevice, 2976).
+-define(wxPrintout_GetLogicalPaperRect, 2977).
+-define(wxPrintout_GetLogicalPageRect, 2978).
+-define(wxPrintout_GetLogicalPageMarginsRect, 2979).
+-define(wxPrintout_SetLogicalOrigin, 2980).
+-define(wxPrintout_OffsetLogicalOrigin, 2981).
+-define(wxStyledTextCtrl_new_2, 2982).
+-define(wxStyledTextCtrl_new_0, 2983).
+-define(wxStyledTextCtrl_destruct, 2984).
+-define(wxStyledTextCtrl_Create, 2985).
+-define(wxStyledTextCtrl_AddText, 2986).
+-define(wxStyledTextCtrl_AddStyledText, 2987).
+-define(wxStyledTextCtrl_InsertText, 2988).
+-define(wxStyledTextCtrl_ClearAll, 2989).
+-define(wxStyledTextCtrl_ClearDocumentStyle, 2990).
+-define(wxStyledTextCtrl_GetLength, 2991).
+-define(wxStyledTextCtrl_GetCharAt, 2992).
+-define(wxStyledTextCtrl_GetCurrentPos, 2993).
+-define(wxStyledTextCtrl_GetAnchor, 2994).
+-define(wxStyledTextCtrl_GetStyleAt, 2995).
+-define(wxStyledTextCtrl_Redo, 2996).
+-define(wxStyledTextCtrl_SetUndoCollection, 2997).
+-define(wxStyledTextCtrl_SelectAll, 2998).
+-define(wxStyledTextCtrl_SetSavePoint, 2999).
+-define(wxStyledTextCtrl_GetStyledText, 3000).
+-define(wxStyledTextCtrl_CanRedo, 3001).
+-define(wxStyledTextCtrl_MarkerLineFromHandle, 3002).
+-define(wxStyledTextCtrl_MarkerDeleteHandle, 3003).
+-define(wxStyledTextCtrl_GetUndoCollection, 3004).
+-define(wxStyledTextCtrl_GetViewWhiteSpace, 3005).
+-define(wxStyledTextCtrl_SetViewWhiteSpace, 3006).
+-define(wxStyledTextCtrl_PositionFromPoint, 3007).
+-define(wxStyledTextCtrl_PositionFromPointClose, 3008).
+-define(wxStyledTextCtrl_GotoLine, 3009).
+-define(wxStyledTextCtrl_GotoPos, 3010).
+-define(wxStyledTextCtrl_SetAnchor, 3011).
+-define(wxStyledTextCtrl_GetCurLine, 3012).
+-define(wxStyledTextCtrl_GetEndStyled, 3013).
+-define(wxStyledTextCtrl_ConvertEOLs, 3014).
+-define(wxStyledTextCtrl_GetEOLMode, 3015).
+-define(wxStyledTextCtrl_SetEOLMode, 3016).
+-define(wxStyledTextCtrl_StartStyling, 3017).
+-define(wxStyledTextCtrl_SetStyling, 3018).
+-define(wxStyledTextCtrl_GetBufferedDraw, 3019).
+-define(wxStyledTextCtrl_SetBufferedDraw, 3020).
+-define(wxStyledTextCtrl_SetTabWidth, 3021).
+-define(wxStyledTextCtrl_GetTabWidth, 3022).
+-define(wxStyledTextCtrl_SetCodePage, 3023).
+-define(wxStyledTextCtrl_MarkerDefine, 3024).
+-define(wxStyledTextCtrl_MarkerSetForeground, 3025).
+-define(wxStyledTextCtrl_MarkerSetBackground, 3026).
+-define(wxStyledTextCtrl_MarkerAdd, 3027).
+-define(wxStyledTextCtrl_MarkerDelete, 3028).
+-define(wxStyledTextCtrl_MarkerDeleteAll, 3029).
+-define(wxStyledTextCtrl_MarkerGet, 3030).
+-define(wxStyledTextCtrl_MarkerNext, 3031).
+-define(wxStyledTextCtrl_MarkerPrevious, 3032).
+-define(wxStyledTextCtrl_MarkerDefineBitmap, 3033).
+-define(wxStyledTextCtrl_MarkerAddSet, 3034).
+-define(wxStyledTextCtrl_MarkerSetAlpha, 3035).
+-define(wxStyledTextCtrl_SetMarginType, 3036).
+-define(wxStyledTextCtrl_GetMarginType, 3037).
+-define(wxStyledTextCtrl_SetMarginWidth, 3038).
+-define(wxStyledTextCtrl_GetMarginWidth, 3039).
+-define(wxStyledTextCtrl_SetMarginMask, 3040).
+-define(wxStyledTextCtrl_GetMarginMask, 3041).
+-define(wxStyledTextCtrl_SetMarginSensitive, 3042).
+-define(wxStyledTextCtrl_GetMarginSensitive, 3043).
+-define(wxStyledTextCtrl_StyleClearAll, 3044).
+-define(wxStyledTextCtrl_StyleSetForeground, 3045).
+-define(wxStyledTextCtrl_StyleSetBackground, 3046).
+-define(wxStyledTextCtrl_StyleSetBold, 3047).
+-define(wxStyledTextCtrl_StyleSetItalic, 3048).
+-define(wxStyledTextCtrl_StyleSetSize, 3049).
+-define(wxStyledTextCtrl_StyleSetFaceName, 3050).
+-define(wxStyledTextCtrl_StyleSetEOLFilled, 3051).
+-define(wxStyledTextCtrl_StyleResetDefault, 3052).
+-define(wxStyledTextCtrl_StyleSetUnderline, 3053).
+-define(wxStyledTextCtrl_StyleSetCase, 3054).
+-define(wxStyledTextCtrl_StyleSetHotSpot, 3055).
+-define(wxStyledTextCtrl_SetSelForeground, 3056).
+-define(wxStyledTextCtrl_SetSelBackground, 3057).
+-define(wxStyledTextCtrl_GetSelAlpha, 3058).
+-define(wxStyledTextCtrl_SetSelAlpha, 3059).
+-define(wxStyledTextCtrl_SetCaretForeground, 3060).
+-define(wxStyledTextCtrl_CmdKeyAssign, 3061).
+-define(wxStyledTextCtrl_CmdKeyClear, 3062).
+-define(wxStyledTextCtrl_CmdKeyClearAll, 3063).
+-define(wxStyledTextCtrl_SetStyleBytes, 3064).
+-define(wxStyledTextCtrl_StyleSetVisible, 3065).
+-define(wxStyledTextCtrl_GetCaretPeriod, 3066).
+-define(wxStyledTextCtrl_SetCaretPeriod, 3067).
+-define(wxStyledTextCtrl_SetWordChars, 3068).
+-define(wxStyledTextCtrl_BeginUndoAction, 3069).
+-define(wxStyledTextCtrl_EndUndoAction, 3070).
+-define(wxStyledTextCtrl_IndicatorSetStyle, 3071).
+-define(wxStyledTextCtrl_IndicatorGetStyle, 3072).
+-define(wxStyledTextCtrl_IndicatorSetForeground, 3073).
+-define(wxStyledTextCtrl_IndicatorGetForeground, 3074).
+-define(wxStyledTextCtrl_SetWhitespaceForeground, 3075).
+-define(wxStyledTextCtrl_SetWhitespaceBackground, 3076).
+-define(wxStyledTextCtrl_GetStyleBits, 3077).
+-define(wxStyledTextCtrl_SetLineState, 3078).
+-define(wxStyledTextCtrl_GetLineState, 3079).
+-define(wxStyledTextCtrl_GetMaxLineState, 3080).
+-define(wxStyledTextCtrl_GetCaretLineVisible, 3081).
+-define(wxStyledTextCtrl_SetCaretLineVisible, 3082).
+-define(wxStyledTextCtrl_GetCaretLineBackground, 3083).
+-define(wxStyledTextCtrl_SetCaretLineBackground, 3084).
+-define(wxStyledTextCtrl_AutoCompShow, 3085).
+-define(wxStyledTextCtrl_AutoCompCancel, 3086).
+-define(wxStyledTextCtrl_AutoCompActive, 3087).
+-define(wxStyledTextCtrl_AutoCompPosStart, 3088).
+-define(wxStyledTextCtrl_AutoCompComplete, 3089).
+-define(wxStyledTextCtrl_AutoCompStops, 3090).
+-define(wxStyledTextCtrl_AutoCompSetSeparator, 3091).
+-define(wxStyledTextCtrl_AutoCompGetSeparator, 3092).
+-define(wxStyledTextCtrl_AutoCompSelect, 3093).
+-define(wxStyledTextCtrl_AutoCompSetCancelAtStart, 3094).
+-define(wxStyledTextCtrl_AutoCompGetCancelAtStart, 3095).
+-define(wxStyledTextCtrl_AutoCompSetFillUps, 3096).
+-define(wxStyledTextCtrl_AutoCompSetChooseSingle, 3097).
+-define(wxStyledTextCtrl_AutoCompGetChooseSingle, 3098).
+-define(wxStyledTextCtrl_AutoCompSetIgnoreCase, 3099).
+-define(wxStyledTextCtrl_AutoCompGetIgnoreCase, 3100).
+-define(wxStyledTextCtrl_UserListShow, 3101).
+-define(wxStyledTextCtrl_AutoCompSetAutoHide, 3102).
+-define(wxStyledTextCtrl_AutoCompGetAutoHide, 3103).
+-define(wxStyledTextCtrl_AutoCompSetDropRestOfWord, 3104).
+-define(wxStyledTextCtrl_AutoCompGetDropRestOfWord, 3105).
+-define(wxStyledTextCtrl_RegisterImage, 3106).
+-define(wxStyledTextCtrl_ClearRegisteredImages, 3107).
+-define(wxStyledTextCtrl_AutoCompGetTypeSeparator, 3108).
+-define(wxStyledTextCtrl_AutoCompSetTypeSeparator, 3109).
+-define(wxStyledTextCtrl_AutoCompSetMaxWidth, 3110).
+-define(wxStyledTextCtrl_AutoCompGetMaxWidth, 3111).
+-define(wxStyledTextCtrl_AutoCompSetMaxHeight, 3112).
+-define(wxStyledTextCtrl_AutoCompGetMaxHeight, 3113).
+-define(wxStyledTextCtrl_SetIndent, 3114).
+-define(wxStyledTextCtrl_GetIndent, 3115).
+-define(wxStyledTextCtrl_SetUseTabs, 3116).
+-define(wxStyledTextCtrl_GetUseTabs, 3117).
+-define(wxStyledTextCtrl_SetLineIndentation, 3118).
+-define(wxStyledTextCtrl_GetLineIndentation, 3119).
+-define(wxStyledTextCtrl_GetLineIndentPosition, 3120).
+-define(wxStyledTextCtrl_GetColumn, 3121).
+-define(wxStyledTextCtrl_SetUseHorizontalScrollBar, 3122).
+-define(wxStyledTextCtrl_GetUseHorizontalScrollBar, 3123).
+-define(wxStyledTextCtrl_SetIndentationGuides, 3124).
+-define(wxStyledTextCtrl_GetIndentationGuides, 3125).
+-define(wxStyledTextCtrl_SetHighlightGuide, 3126).
+-define(wxStyledTextCtrl_GetHighlightGuide, 3127).
+-define(wxStyledTextCtrl_GetLineEndPosition, 3128).
+-define(wxStyledTextCtrl_GetCodePage, 3129).
+-define(wxStyledTextCtrl_GetCaretForeground, 3130).
+-define(wxStyledTextCtrl_GetReadOnly, 3131).
+-define(wxStyledTextCtrl_SetCurrentPos, 3132).
+-define(wxStyledTextCtrl_SetSelectionStart, 3133).
+-define(wxStyledTextCtrl_GetSelectionStart, 3134).
+-define(wxStyledTextCtrl_SetSelectionEnd, 3135).
+-define(wxStyledTextCtrl_GetSelectionEnd, 3136).
+-define(wxStyledTextCtrl_SetPrintMagnification, 3137).
+-define(wxStyledTextCtrl_GetPrintMagnification, 3138).
+-define(wxStyledTextCtrl_SetPrintColourMode, 3139).
+-define(wxStyledTextCtrl_GetPrintColourMode, 3140).
+-define(wxStyledTextCtrl_FindText, 3141).
+-define(wxStyledTextCtrl_FormatRange, 3142).
+-define(wxStyledTextCtrl_GetFirstVisibleLine, 3143).
+-define(wxStyledTextCtrl_GetLine, 3144).
+-define(wxStyledTextCtrl_GetLineCount, 3145).
+-define(wxStyledTextCtrl_SetMarginLeft, 3146).
+-define(wxStyledTextCtrl_GetMarginLeft, 3147).
+-define(wxStyledTextCtrl_SetMarginRight, 3148).
+-define(wxStyledTextCtrl_GetMarginRight, 3149).
+-define(wxStyledTextCtrl_GetModify, 3150).
+-define(wxStyledTextCtrl_SetSelection, 3151).
+-define(wxStyledTextCtrl_GetSelectedText, 3152).
+-define(wxStyledTextCtrl_GetTextRange, 3153).
+-define(wxStyledTextCtrl_HideSelection, 3154).
+-define(wxStyledTextCtrl_LineFromPosition, 3155).
+-define(wxStyledTextCtrl_PositionFromLine, 3156).
+-define(wxStyledTextCtrl_LineScroll, 3157).
+-define(wxStyledTextCtrl_EnsureCaretVisible, 3158).
+-define(wxStyledTextCtrl_ReplaceSelection, 3159).
+-define(wxStyledTextCtrl_SetReadOnly, 3160).
+-define(wxStyledTextCtrl_CanPaste, 3161).
+-define(wxStyledTextCtrl_CanUndo, 3162).
+-define(wxStyledTextCtrl_EmptyUndoBuffer, 3163).
+-define(wxStyledTextCtrl_Undo, 3164).
+-define(wxStyledTextCtrl_Cut, 3165).
+-define(wxStyledTextCtrl_Copy, 3166).
+-define(wxStyledTextCtrl_Paste, 3167).
+-define(wxStyledTextCtrl_Clear, 3168).
+-define(wxStyledTextCtrl_SetText, 3169).
+-define(wxStyledTextCtrl_GetText, 3170).
+-define(wxStyledTextCtrl_GetTextLength, 3171).
+-define(wxStyledTextCtrl_GetOvertype, 3172).
+-define(wxStyledTextCtrl_SetCaretWidth, 3173).
+-define(wxStyledTextCtrl_GetCaretWidth, 3174).
+-define(wxStyledTextCtrl_SetTargetStart, 3175).
+-define(wxStyledTextCtrl_GetTargetStart, 3176).
+-define(wxStyledTextCtrl_SetTargetEnd, 3177).
+-define(wxStyledTextCtrl_GetTargetEnd, 3178).
+-define(wxStyledTextCtrl_ReplaceTarget, 3179).
+-define(wxStyledTextCtrl_SearchInTarget, 3180).
+-define(wxStyledTextCtrl_SetSearchFlags, 3181).
+-define(wxStyledTextCtrl_GetSearchFlags, 3182).
+-define(wxStyledTextCtrl_CallTipShow, 3183).
+-define(wxStyledTextCtrl_CallTipCancel, 3184).
+-define(wxStyledTextCtrl_CallTipActive, 3185).
+-define(wxStyledTextCtrl_CallTipPosAtStart, 3186).
+-define(wxStyledTextCtrl_CallTipSetHighlight, 3187).
+-define(wxStyledTextCtrl_CallTipSetBackground, 3188).
+-define(wxStyledTextCtrl_CallTipSetForeground, 3189).
+-define(wxStyledTextCtrl_CallTipSetForegroundHighlight, 3190).
+-define(wxStyledTextCtrl_CallTipUseStyle, 3191).
+-define(wxStyledTextCtrl_VisibleFromDocLine, 3192).
+-define(wxStyledTextCtrl_DocLineFromVisible, 3193).
+-define(wxStyledTextCtrl_WrapCount, 3194).
+-define(wxStyledTextCtrl_SetFoldLevel, 3195).
+-define(wxStyledTextCtrl_GetFoldLevel, 3196).
+-define(wxStyledTextCtrl_GetLastChild, 3197).
+-define(wxStyledTextCtrl_GetFoldParent, 3198).
+-define(wxStyledTextCtrl_ShowLines, 3199).
+-define(wxStyledTextCtrl_HideLines, 3200).
+-define(wxStyledTextCtrl_GetLineVisible, 3201).
+-define(wxStyledTextCtrl_SetFoldExpanded, 3202).
+-define(wxStyledTextCtrl_GetFoldExpanded, 3203).
+-define(wxStyledTextCtrl_ToggleFold, 3204).
+-define(wxStyledTextCtrl_EnsureVisible, 3205).
+-define(wxStyledTextCtrl_SetFoldFlags, 3206).
+-define(wxStyledTextCtrl_EnsureVisibleEnforcePolicy, 3207).
+-define(wxStyledTextCtrl_SetTabIndents, 3208).
+-define(wxStyledTextCtrl_GetTabIndents, 3209).
+-define(wxStyledTextCtrl_SetBackSpaceUnIndents, 3210).
+-define(wxStyledTextCtrl_GetBackSpaceUnIndents, 3211).
+-define(wxStyledTextCtrl_SetMouseDwellTime, 3212).
+-define(wxStyledTextCtrl_GetMouseDwellTime, 3213).
+-define(wxStyledTextCtrl_WordStartPosition, 3214).
+-define(wxStyledTextCtrl_WordEndPosition, 3215).
+-define(wxStyledTextCtrl_SetWrapMode, 3216).
+-define(wxStyledTextCtrl_GetWrapMode, 3217).
+-define(wxStyledTextCtrl_SetWrapVisualFlags, 3218).
+-define(wxStyledTextCtrl_GetWrapVisualFlags, 3219).
+-define(wxStyledTextCtrl_SetWrapVisualFlagsLocation, 3220).
+-define(wxStyledTextCtrl_GetWrapVisualFlagsLocation, 3221).
+-define(wxStyledTextCtrl_SetWrapStartIndent, 3222).
+-define(wxStyledTextCtrl_GetWrapStartIndent, 3223).
+-define(wxStyledTextCtrl_SetLayoutCache, 3224).
+-define(wxStyledTextCtrl_GetLayoutCache, 3225).
+-define(wxStyledTextCtrl_SetScrollWidth, 3226).
+-define(wxStyledTextCtrl_GetScrollWidth, 3227).
+-define(wxStyledTextCtrl_TextWidth, 3228).
+-define(wxStyledTextCtrl_GetEndAtLastLine, 3229).
+-define(wxStyledTextCtrl_TextHeight, 3230).
+-define(wxStyledTextCtrl_SetUseVerticalScrollBar, 3231).
+-define(wxStyledTextCtrl_GetUseVerticalScrollBar, 3232).
+-define(wxStyledTextCtrl_AppendText, 3233).
+-define(wxStyledTextCtrl_GetTwoPhaseDraw, 3234).
+-define(wxStyledTextCtrl_SetTwoPhaseDraw, 3235).
+-define(wxStyledTextCtrl_TargetFromSelection, 3236).
+-define(wxStyledTextCtrl_LinesJoin, 3237).
+-define(wxStyledTextCtrl_LinesSplit, 3238).
+-define(wxStyledTextCtrl_SetFoldMarginColour, 3239).
+-define(wxStyledTextCtrl_SetFoldMarginHiColour, 3240).
+-define(wxStyledTextCtrl_LineDown, 3241).
+-define(wxStyledTextCtrl_LineDownExtend, 3242).
+-define(wxStyledTextCtrl_LineUp, 3243).
+-define(wxStyledTextCtrl_LineUpExtend, 3244).
+-define(wxStyledTextCtrl_CharLeft, 3245).
+-define(wxStyledTextCtrl_CharLeftExtend, 3246).
+-define(wxStyledTextCtrl_CharRight, 3247).
+-define(wxStyledTextCtrl_CharRightExtend, 3248).
+-define(wxStyledTextCtrl_WordLeft, 3249).
+-define(wxStyledTextCtrl_WordLeftExtend, 3250).
+-define(wxStyledTextCtrl_WordRight, 3251).
+-define(wxStyledTextCtrl_WordRightExtend, 3252).
+-define(wxStyledTextCtrl_Home, 3253).
+-define(wxStyledTextCtrl_HomeExtend, 3254).
+-define(wxStyledTextCtrl_LineEnd, 3255).
+-define(wxStyledTextCtrl_LineEndExtend, 3256).
+-define(wxStyledTextCtrl_DocumentStart, 3257).
+-define(wxStyledTextCtrl_DocumentStartExtend, 3258).
+-define(wxStyledTextCtrl_DocumentEnd, 3259).
+-define(wxStyledTextCtrl_DocumentEndExtend, 3260).
+-define(wxStyledTextCtrl_PageUp, 3261).
+-define(wxStyledTextCtrl_PageUpExtend, 3262).
+-define(wxStyledTextCtrl_PageDown, 3263).
+-define(wxStyledTextCtrl_PageDownExtend, 3264).
+-define(wxStyledTextCtrl_EditToggleOvertype, 3265).
+-define(wxStyledTextCtrl_Cancel, 3266).
+-define(wxStyledTextCtrl_DeleteBack, 3267).
+-define(wxStyledTextCtrl_Tab, 3268).
+-define(wxStyledTextCtrl_BackTab, 3269).
+-define(wxStyledTextCtrl_NewLine, 3270).
+-define(wxStyledTextCtrl_FormFeed, 3271).
+-define(wxStyledTextCtrl_VCHome, 3272).
+-define(wxStyledTextCtrl_VCHomeExtend, 3273).
+-define(wxStyledTextCtrl_ZoomIn, 3274).
+-define(wxStyledTextCtrl_ZoomOut, 3275).
+-define(wxStyledTextCtrl_DelWordLeft, 3276).
+-define(wxStyledTextCtrl_DelWordRight, 3277).
+-define(wxStyledTextCtrl_LineCut, 3278).
+-define(wxStyledTextCtrl_LineDelete, 3279).
+-define(wxStyledTextCtrl_LineTranspose, 3280).
+-define(wxStyledTextCtrl_LineDuplicate, 3281).
+-define(wxStyledTextCtrl_LowerCase, 3282).
+-define(wxStyledTextCtrl_UpperCase, 3283).
+-define(wxStyledTextCtrl_LineScrollDown, 3284).
+-define(wxStyledTextCtrl_LineScrollUp, 3285).
+-define(wxStyledTextCtrl_DeleteBackNotLine, 3286).
+-define(wxStyledTextCtrl_HomeDisplay, 3287).
+-define(wxStyledTextCtrl_HomeDisplayExtend, 3288).
+-define(wxStyledTextCtrl_LineEndDisplay, 3289).
+-define(wxStyledTextCtrl_LineEndDisplayExtend, 3290).
+-define(wxStyledTextCtrl_HomeWrapExtend, 3291).
+-define(wxStyledTextCtrl_LineEndWrap, 3292).
+-define(wxStyledTextCtrl_LineEndWrapExtend, 3293).
+-define(wxStyledTextCtrl_VCHomeWrap, 3294).
+-define(wxStyledTextCtrl_VCHomeWrapExtend, 3295).
+-define(wxStyledTextCtrl_LineCopy, 3296).
+-define(wxStyledTextCtrl_MoveCaretInsideView, 3297).
+-define(wxStyledTextCtrl_LineLength, 3298).
+-define(wxStyledTextCtrl_BraceHighlight, 3299).
+-define(wxStyledTextCtrl_BraceBadLight, 3300).
+-define(wxStyledTextCtrl_BraceMatch, 3301).
+-define(wxStyledTextCtrl_GetViewEOL, 3302).
+-define(wxStyledTextCtrl_SetViewEOL, 3303).
+-define(wxStyledTextCtrl_SetModEventMask, 3304).
+-define(wxStyledTextCtrl_GetEdgeColumn, 3305).
+-define(wxStyledTextCtrl_SetEdgeColumn, 3306).
+-define(wxStyledTextCtrl_SetEdgeMode, 3307).
+-define(wxStyledTextCtrl_GetEdgeMode, 3308).
+-define(wxStyledTextCtrl_GetEdgeColour, 3309).
+-define(wxStyledTextCtrl_SetEdgeColour, 3310).
+-define(wxStyledTextCtrl_SearchAnchor, 3311).
+-define(wxStyledTextCtrl_SearchNext, 3312).
+-define(wxStyledTextCtrl_SearchPrev, 3313).
+-define(wxStyledTextCtrl_LinesOnScreen, 3314).
+-define(wxStyledTextCtrl_UsePopUp, 3315).
+-define(wxStyledTextCtrl_SelectionIsRectangle, 3316).
+-define(wxStyledTextCtrl_SetZoom, 3317).
+-define(wxStyledTextCtrl_GetZoom, 3318).
+-define(wxStyledTextCtrl_GetModEventMask, 3319).
+-define(wxStyledTextCtrl_SetSTCFocus, 3320).
+-define(wxStyledTextCtrl_GetSTCFocus, 3321).
+-define(wxStyledTextCtrl_SetStatus, 3322).
+-define(wxStyledTextCtrl_GetStatus, 3323).
+-define(wxStyledTextCtrl_SetMouseDownCaptures, 3324).
+-define(wxStyledTextCtrl_GetMouseDownCaptures, 3325).
+-define(wxStyledTextCtrl_SetSTCCursor, 3326).
+-define(wxStyledTextCtrl_GetSTCCursor, 3327).
+-define(wxStyledTextCtrl_SetControlCharSymbol, 3328).
+-define(wxStyledTextCtrl_GetControlCharSymbol, 3329).
+-define(wxStyledTextCtrl_WordPartLeft, 3330).
+-define(wxStyledTextCtrl_WordPartLeftExtend, 3331).
+-define(wxStyledTextCtrl_WordPartRight, 3332).
+-define(wxStyledTextCtrl_WordPartRightExtend, 3333).
+-define(wxStyledTextCtrl_SetVisiblePolicy, 3334).
+-define(wxStyledTextCtrl_DelLineLeft, 3335).
+-define(wxStyledTextCtrl_DelLineRight, 3336).
+-define(wxStyledTextCtrl_GetXOffset, 3337).
+-define(wxStyledTextCtrl_ChooseCaretX, 3338).
+-define(wxStyledTextCtrl_SetXCaretPolicy, 3339).
+-define(wxStyledTextCtrl_SetYCaretPolicy, 3340).
+-define(wxStyledTextCtrl_GetPrintWrapMode, 3341).
+-define(wxStyledTextCtrl_SetHotspotActiveForeground, 3342).
+-define(wxStyledTextCtrl_SetHotspotActiveBackground, 3343).
+-define(wxStyledTextCtrl_SetHotspotActiveUnderline, 3344).
+-define(wxStyledTextCtrl_SetHotspotSingleLine, 3345).
+-define(wxStyledTextCtrl_ParaDownExtend, 3346).
+-define(wxStyledTextCtrl_ParaUp, 3347).
+-define(wxStyledTextCtrl_ParaUpExtend, 3348).
+-define(wxStyledTextCtrl_PositionBefore, 3349).
+-define(wxStyledTextCtrl_PositionAfter, 3350).
+-define(wxStyledTextCtrl_CopyRange, 3351).
+-define(wxStyledTextCtrl_CopyText, 3352).
+-define(wxStyledTextCtrl_SetSelectionMode, 3353).
+-define(wxStyledTextCtrl_GetSelectionMode, 3354).
+-define(wxStyledTextCtrl_LineDownRectExtend, 3355).
+-define(wxStyledTextCtrl_LineUpRectExtend, 3356).
+-define(wxStyledTextCtrl_CharLeftRectExtend, 3357).
+-define(wxStyledTextCtrl_CharRightRectExtend, 3358).
+-define(wxStyledTextCtrl_HomeRectExtend, 3359).
+-define(wxStyledTextCtrl_VCHomeRectExtend, 3360).
+-define(wxStyledTextCtrl_LineEndRectExtend, 3361).
+-define(wxStyledTextCtrl_PageUpRectExtend, 3362).
+-define(wxStyledTextCtrl_PageDownRectExtend, 3363).
+-define(wxStyledTextCtrl_StutteredPageUp, 3364).
+-define(wxStyledTextCtrl_StutteredPageUpExtend, 3365).
+-define(wxStyledTextCtrl_StutteredPageDown, 3366).
+-define(wxStyledTextCtrl_StutteredPageDownExtend, 3367).
+-define(wxStyledTextCtrl_WordLeftEnd, 3368).
+-define(wxStyledTextCtrl_WordLeftEndExtend, 3369).
+-define(wxStyledTextCtrl_WordRightEnd, 3370).
+-define(wxStyledTextCtrl_WordRightEndExtend, 3371).
+-define(wxStyledTextCtrl_SetWhitespaceChars, 3372).
+-define(wxStyledTextCtrl_SetCharsDefault, 3373).
+-define(wxStyledTextCtrl_AutoCompGetCurrent, 3374).
+-define(wxStyledTextCtrl_Allocate, 3375).
+-define(wxStyledTextCtrl_FindColumn, 3376).
+-define(wxStyledTextCtrl_GetCaretSticky, 3377).
+-define(wxStyledTextCtrl_SetCaretSticky, 3378).
+-define(wxStyledTextCtrl_ToggleCaretSticky, 3379).
+-define(wxStyledTextCtrl_SetPasteConvertEndings, 3380).
+-define(wxStyledTextCtrl_GetPasteConvertEndings, 3381).
+-define(wxStyledTextCtrl_SelectionDuplicate, 3382).
+-define(wxStyledTextCtrl_SetCaretLineBackAlpha, 3383).
+-define(wxStyledTextCtrl_GetCaretLineBackAlpha, 3384).
+-define(wxStyledTextCtrl_StartRecord, 3385).
+-define(wxStyledTextCtrl_StopRecord, 3386).
+-define(wxStyledTextCtrl_SetLexer, 3387).
+-define(wxStyledTextCtrl_GetLexer, 3388).
+-define(wxStyledTextCtrl_Colourise, 3389).
+-define(wxStyledTextCtrl_SetProperty, 3390).
+-define(wxStyledTextCtrl_SetKeyWords, 3391).
+-define(wxStyledTextCtrl_SetLexerLanguage, 3392).
+-define(wxStyledTextCtrl_GetProperty, 3393).
+-define(wxStyledTextCtrl_GetStyleBitsNeeded, 3394).
+-define(wxStyledTextCtrl_GetCurrentLine, 3395).
+-define(wxStyledTextCtrl_StyleSetSpec, 3396).
+-define(wxStyledTextCtrl_StyleSetFont, 3397).
+-define(wxStyledTextCtrl_StyleSetFontAttr, 3398).
+-define(wxStyledTextCtrl_StyleSetCharacterSet, 3399).
+-define(wxStyledTextCtrl_StyleSetFontEncoding, 3400).
+-define(wxStyledTextCtrl_CmdKeyExecute, 3401).
+-define(wxStyledTextCtrl_SetMargins, 3402).
+-define(wxStyledTextCtrl_GetSelection, 3403).
+-define(wxStyledTextCtrl_PointFromPosition, 3404).
+-define(wxStyledTextCtrl_ScrollToLine, 3405).
+-define(wxStyledTextCtrl_ScrollToColumn, 3406).
+-define(wxStyledTextCtrl_SetVScrollBar, 3407).
+-define(wxStyledTextCtrl_SetHScrollBar, 3408).
+-define(wxStyledTextCtrl_GetLastKeydownProcessed, 3409).
+-define(wxStyledTextCtrl_SetLastKeydownProcessed, 3410).
+-define(wxStyledTextCtrl_SaveFile, 3411).
+-define(wxStyledTextCtrl_LoadFile, 3412).
+-define(wxStyledTextCtrl_DoDragOver, 3413).
+-define(wxStyledTextCtrl_DoDropText, 3414).
+-define(wxStyledTextCtrl_GetUseAntiAliasing, 3415).
+-define(wxStyledTextCtrl_AddTextRaw, 3416).
+-define(wxStyledTextCtrl_InsertTextRaw, 3417).
+-define(wxStyledTextCtrl_GetCurLineRaw, 3418).
+-define(wxStyledTextCtrl_GetLineRaw, 3419).
+-define(wxStyledTextCtrl_GetSelectedTextRaw, 3420).
+-define(wxStyledTextCtrl_GetTextRangeRaw, 3421).
+-define(wxStyledTextCtrl_SetTextRaw, 3422).
+-define(wxStyledTextCtrl_GetTextRaw, 3423).
+-define(wxStyledTextCtrl_AppendTextRaw, 3424).
+-define(wxArtProvider_GetBitmap, 3425).
+-define(wxArtProvider_GetIcon, 3426).
+-define(wxTreeEvent_GetKeyCode, 3427).
+-define(wxTreeEvent_GetItem, 3428).
+-define(wxTreeEvent_GetKeyEvent, 3429).
+-define(wxTreeEvent_GetLabel, 3430).
+-define(wxTreeEvent_GetOldItem, 3431).
+-define(wxTreeEvent_GetPoint, 3432).
+-define(wxTreeEvent_IsEditCancelled, 3433).
+-define(wxTreeEvent_SetToolTip, 3434).
+-define(wxNotebookEvent_GetOldSelection, 3435).
+-define(wxNotebookEvent_GetSelection, 3436).
+-define(wxNotebookEvent_SetOldSelection, 3437).
+-define(wxNotebookEvent_SetSelection, 3438).
+-define(wxFileDataObject_new, 3439).
+-define(wxFileDataObject_AddFile, 3440).
+-define(wxFileDataObject_GetFilenames, 3441).
+-define(wxFileDataObject_destroy, 3442).
+-define(wxTextDataObject_new, 3443).
+-define(wxTextDataObject_GetTextLength, 3444).
+-define(wxTextDataObject_GetText, 3445).
+-define(wxTextDataObject_SetText, 3446).
+-define(wxTextDataObject_destroy, 3447).
+-define(wxBitmapDataObject_new_1_1, 3448).
+-define(wxBitmapDataObject_new_1_0, 3449).
+-define(wxBitmapDataObject_GetBitmap, 3450).
+-define(wxBitmapDataObject_SetBitmap, 3451).
+-define(wxBitmapDataObject_destroy, 3452).
+-define(wxClipboard_new, 3454).
+-define(wxClipboard_destruct, 3455).
+-define(wxClipboard_AddData, 3456).
+-define(wxClipboard_Clear, 3457).
+-define(wxClipboard_Close, 3458).
+-define(wxClipboard_Flush, 3459).
+-define(wxClipboard_GetData, 3460).
+-define(wxClipboard_IsOpened, 3461).
+-define(wxClipboard_Open, 3462).
+-define(wxClipboard_SetData, 3463).
+-define(wxClipboard_UsePrimarySelection, 3465).
+-define(wxClipboard_IsSupported, 3466).
+-define(wxClipboard_Get, 3467).
+-define(wxSpinEvent_GetPosition, 3468).
+-define(wxSpinEvent_SetPosition, 3469).
+-define(wxSplitterWindow_new_0, 3470).
+-define(wxSplitterWindow_new_2, 3471).
+-define(wxSplitterWindow_destruct, 3472).
+-define(wxSplitterWindow_Create, 3473).
+-define(wxSplitterWindow_GetMinimumPaneSize, 3474).
+-define(wxSplitterWindow_GetSashGravity, 3475).
+-define(wxSplitterWindow_GetSashPosition, 3476).
+-define(wxSplitterWindow_GetSplitMode, 3477).
+-define(wxSplitterWindow_GetWindow1, 3478).
+-define(wxSplitterWindow_GetWindow2, 3479).
+-define(wxSplitterWindow_Initialize, 3480).
+-define(wxSplitterWindow_IsSplit, 3481).
+-define(wxSplitterWindow_ReplaceWindow, 3482).
+-define(wxSplitterWindow_SetSashGravity, 3483).
+-define(wxSplitterWindow_SetSashPosition, 3484).
+-define(wxSplitterWindow_SetSashSize, 3485).
+-define(wxSplitterWindow_SetMinimumPaneSize, 3486).
+-define(wxSplitterWindow_SetSplitMode, 3487).
+-define(wxSplitterWindow_SplitHorizontally, 3488).
+-define(wxSplitterWindow_SplitVertically, 3489).
+-define(wxSplitterWindow_Unsplit, 3490).
+-define(wxSplitterWindow_UpdateSize, 3491).
+-define(wxSplitterEvent_GetSashPosition, 3492).
+-define(wxSplitterEvent_GetX, 3493).
+-define(wxSplitterEvent_GetY, 3494).
+-define(wxSplitterEvent_GetWindowBeingRemoved, 3495).
+-define(wxSplitterEvent_SetSashPosition, 3496).
+-define(wxHtmlWindow_new_0, 3497).
+-define(wxHtmlWindow_new_2, 3498).
+-define(wxHtmlWindow_AppendToPage, 3499).
+-define(wxHtmlWindow_GetOpenedAnchor, 3500).
+-define(wxHtmlWindow_GetOpenedPage, 3501).
+-define(wxHtmlWindow_GetOpenedPageTitle, 3502).
+-define(wxHtmlWindow_GetRelatedFrame, 3503).
+-define(wxHtmlWindow_HistoryBack, 3504).
+-define(wxHtmlWindow_HistoryCanBack, 3505).
+-define(wxHtmlWindow_HistoryCanForward, 3506).
+-define(wxHtmlWindow_HistoryClear, 3507).
+-define(wxHtmlWindow_HistoryForward, 3508).
+-define(wxHtmlWindow_LoadFile, 3509).
+-define(wxHtmlWindow_LoadPage, 3510).
+-define(wxHtmlWindow_SelectAll, 3511).
+-define(wxHtmlWindow_SelectionToText, 3512).
+-define(wxHtmlWindow_SelectLine, 3513).
+-define(wxHtmlWindow_SelectWord, 3514).
+-define(wxHtmlWindow_SetBorders, 3515).
+-define(wxHtmlWindow_SetFonts, 3516).
+-define(wxHtmlWindow_SetPage, 3517).
+-define(wxHtmlWindow_SetRelatedFrame, 3518).
+-define(wxHtmlWindow_SetRelatedStatusBar, 3519).
+-define(wxHtmlWindow_ToText, 3520).
+-define(wxHtmlWindow_destroy, 3521).
+-define(wxHtmlLinkEvent_GetLinkInfo, 3522).
+-define(wxSystemSettings_GetColour, 3523).
+-define(wxSystemSettings_GetFont, 3524).
+-define(wxSystemSettings_GetMetric, 3525).
+-define(wxSystemSettings_GetScreenType, 3526).
+-define(wxSystemOptions_GetOption, 3527).
+-define(wxSystemOptions_GetOptionInt, 3528).
+-define(wxSystemOptions_HasOption, 3529).
+-define(wxSystemOptions_IsFalse, 3530).
+-define(wxSystemOptions_SetOption_2_1, 3531).
+-define(wxSystemOptions_SetOption_2_0, 3532).
+-define(wxAuiNotebookEvent_SetSelection, 3533).
+-define(wxAuiNotebookEvent_GetSelection, 3534).
+-define(wxAuiNotebookEvent_SetOldSelection, 3535).
+-define(wxAuiNotebookEvent_GetOldSelection, 3536).
+-define(wxAuiNotebookEvent_SetDragSource, 3537).
+-define(wxAuiNotebookEvent_GetDragSource, 3538).
+-define(wxAuiManagerEvent_SetManager, 3539).
+-define(wxAuiManagerEvent_GetManager, 3540).
+-define(wxAuiManagerEvent_SetPane, 3541).
+-define(wxAuiManagerEvent_GetPane, 3542).
+-define(wxAuiManagerEvent_SetButton, 3543).
+-define(wxAuiManagerEvent_GetButton, 3544).
+-define(wxAuiManagerEvent_SetDC, 3545).
+-define(wxAuiManagerEvent_GetDC, 3546).
+-define(wxAuiManagerEvent_Veto, 3547).
+-define(wxAuiManagerEvent_GetVeto, 3548).
+-define(wxAuiManagerEvent_SetCanVeto, 3549).
+-define(wxAuiManagerEvent_CanVeto, 3550).
+-define(wxLogNull_new, 3551).
+-define(wxLogNull_destroy, 3552).
+-define(wxTaskBarIcon_new, 3553).
+-define(wxTaskBarIcon_destruct, 3554).
+-define(wxTaskBarIcon_PopupMenu, 3555).
+-define(wxTaskBarIcon_RemoveIcon, 3556).
+-define(wxTaskBarIcon_SetIcon, 3557).
+-define(wxLocale_new_0, 3558).
+-define(wxLocale_new_2, 3560).
+-define(wxLocale_destruct, 3561).
+-define(wxLocale_Init, 3563).
+-define(wxLocale_AddCatalog_1, 3564).
+-define(wxLocale_AddCatalog_3, 3565).
+-define(wxLocale_AddCatalogLookupPathPrefix, 3566).
+-define(wxLocale_GetCanonicalName, 3567).
+-define(wxLocale_GetLanguage, 3568).
+-define(wxLocale_GetLanguageName, 3569).
+-define(wxLocale_GetLocale, 3570).
+-define(wxLocale_GetName, 3571).
+-define(wxLocale_GetString_2, 3572).
+-define(wxLocale_GetString_4, 3573).
+-define(wxLocale_GetHeaderValue, 3574).
+-define(wxLocale_GetSysName, 3575).
+-define(wxLocale_GetSystemEncoding, 3576).
+-define(wxLocale_GetSystemEncodingName, 3577).
+-define(wxLocale_GetSystemLanguage, 3578).
+-define(wxLocale_IsLoaded, 3579).
+-define(wxLocale_IsOk, 3580).
+-define(wxActivateEvent_GetActive, 3581).
+-define(wxPopupWindow_new_2, 3583).
+-define(wxPopupWindow_new_0, 3584).
+-define(wxPopupWindow_destruct, 3586).
+-define(wxPopupWindow_Create, 3587).
+-define(wxPopupWindow_Position, 3588).
+-define(wxPopupTransientWindow_new_0, 3589).
+-define(wxPopupTransientWindow_new_2, 3590).
+-define(wxPopupTransientWindow_destruct, 3591).
+-define(wxPopupTransientWindow_Popup, 3592).
+-define(wxPopupTransientWindow_Dismiss, 3593).
+-define(wxOverlay_new, 3594).
+-define(wxOverlay_destruct, 3595).
+-define(wxOverlay_Reset, 3596).
+-define(wxDCOverlay_new_6, 3597).
+-define(wxDCOverlay_new_2, 3598).
+-define(wxDCOverlay_destruct, 3599).
+-define(wxDCOverlay_Clear, 3600).
+-define(wxDropFilesEvent_GetPosition, 3601).
+-define(wxDropFilesEvent_GetNumberOfFiles, 3602).
+-define(wxDropFilesEvent_GetFiles, 3603).
+-define(wxDisplay_new, 3604).
+-define(wxDisplay_destruct, 3605).
+-define(wxDisplay_IsOk, 3606).
+-define(wxDisplay_GetClientArea, 3607).
+-define(wxDisplay_GetGeometry, 3608).
+-define(wxDisplay_GetName, 3609).
+-define(wxDisplay_IsPrimary, 3610).
+-define(wxDisplay_GetCount, 3611).
+-define(wxDisplay_GetFromPoint, 3612).
+-define(wxDisplay_GetFromWindow, 3613).
+-define(wxDisplay_GetPPI, 3614).
+-define(wxGCDC_new_1, 3615).
+-define(wxGCDC_new_0, 3616).
+-define(wxGCDC_destruct, 3617).
+-define(wxGCDC_GetGraphicsContext, 3618).
+-define(wxGCDC_SetGraphicsContext, 3619).